From ead79d212e4a9ab7be1f3ebbea7306e54985b176 Mon Sep 17 00:00:00 2001 From: meninjar Date: Thu, 6 Aug 2026 06:14:47 +0000 Subject: [PATCH] update --- docker-compose.yml | 2 +- src/App.tsx | 2 +- src/components/FilterToolbar.tsx | 68 ++++++++++++++++++-------------- 3 files changed, 41 insertions(+), 31 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index aeaf1fe..04b9fda 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,7 +36,7 @@ services: volumes: - .:/app - /app/node_modules - - /mnt/simrs/logs:/app/logs + - /mnt/simrs-dev/logs:/app/logs # ─── Production ──────────────────────────── prod: diff --git a/src/App.tsx b/src/App.tsx index 19236bf..8f10ef7 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -307,7 +307,7 @@ export function App() { setFilters((prev) => ({ ...prev, ...updated }))} + onApply={(applied) => setFilters(applied)} onReset={() => setFilters({ source: 'auto', diff --git a/src/components/FilterToolbar.tsx b/src/components/FilterToolbar.tsx index f5a867b..5bfebbb 100644 --- a/src/components/FilterToolbar.tsx +++ b/src/components/FilterToolbar.tsx @@ -1,33 +1,43 @@ -import React from 'react'; +import React, { useState, useEffect } from 'react'; import { Database, Calendar, Clock, Layers, AlertCircle, Search, Filter, RotateCcw } from 'lucide-react'; import { FilterState, BackupFile } from '../types'; interface FilterToolbarProps { filters: FilterState; backups: BackupFile[]; - onChange: (updated: Partial) => void; + onApply: (applied: FilterState) => void; onReset: () => void; } -export const FilterToolbar: React.FC = ({ filters, backups, onChange, onReset }) => { +export const FilterToolbar: React.FC = ({ filters, backups, onApply, onReset }) => { + const [localFilters, setLocalFilters] = useState(filters); + + // Sync local filters if parent filters change externally (e.g., Reset or selecting backup ZIP file) + useEffect(() => { + setLocalFilters(filters); + }, [filters]); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + onApply({ ...localFilters, page: 1 }); + }; + + const handleLocalChange = (updated: Partial) => { + setLocalFilters((prev) => ({ ...prev, ...updated })); + }; + return (
-
{ - e.preventDefault(); - onChange({ page: 1 }); - }} - className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-7 gap-3 items-end" - > + {/* Sumber Log */}
onChange({ date: e.target.value, page: 1 })} - className="w-full bg-slate-950 border border-slate-800 rounded-lg px-2.5 py-1.5 text-xs text-white focus:border-cyan-500 outline-none" + value={localFilters.date} + onChange={(e) => handleLocalChange({ date: e.target.value })} + className="w-full bg-slate-950 border border-slate-800 rounded-lg px-2.5 py-1.5 text-xs text-white focus:border-cyan-500 outline-none cursor-pointer" />
@@ -65,15 +75,15 @@ export const FilterToolbar: React.FC = ({ filters, backups,
onChange({ time_start: e.target.value, page: 1 })} + value={localFilters.time_start} + onChange={(e) => handleLocalChange({ time_start: e.target.value })} className="w-full bg-slate-950 border border-slate-800 rounded-lg px-1.5 py-1.5 text-[11px] text-white focus:border-cyan-500 outline-none" /> - onChange({ time_end: e.target.value, page: 1 })} + value={localFilters.time_end} + onChange={(e) => handleLocalChange({ time_end: e.target.value })} className="w-full bg-slate-950 border border-slate-800 rounded-lg px-1.5 py-1.5 text-[11px] text-white focus:border-cyan-500 outline-none" />
@@ -85,9 +95,9 @@ export const FilterToolbar: React.FC = ({ filters, backups, Channel onChange({ level: e.target.value, page: 1 })} - className="w-full bg-slate-950 border border-slate-800 rounded-lg px-2 py-1.5 text-xs text-white focus:border-cyan-500 outline-none" + value={localFilters.level} + onChange={(e) => handleLocalChange({ level: e.target.value })} + className="w-full bg-slate-950 border border-slate-800 rounded-lg px-2 py-1.5 text-xs text-white focus:border-cyan-500 outline-none cursor-pointer" > @@ -128,8 +138,8 @@ export const FilterToolbar: React.FC = ({ filters, backups, onChange({ search: e.target.value })} + value={localFilters.search} + onChange={(e) => handleLocalChange({ search: e.target.value })} className="w-full bg-slate-950 border border-slate-800 rounded-lg px-2.5 py-1.5 text-xs text-white focus:border-cyan-500 outline-none" />
@@ -138,7 +148,7 @@ export const FilterToolbar: React.FC = ({ filters, backups,