| @@ -67,6 +67,7 @@ export default function ProductionSchedulePage() { | |||
| const [isDailyOutPanelOpen, setIsDailyOutPanelOpen] = useState(false); | |||
| const [settingsTab, setSettingsTab] = useState<"items" | "rules">("items"); | |||
| const [itemDailyOutList, setItemDailyOutList] = useState<ItemDailyOutRow[]>([]); | |||
| const [itemDailyOutFilter, setItemDailyOutFilter] = useState(""); | |||
| const [itemDailyOutLoading, setItemDailyOutLoading] = useState(false); | |||
| const [dailyOutSavingCode, setDailyOutSavingCode] = useState<string | null>(null); | |||
| const [dailyOutClearingCode, setDailyOutClearingCode] = useState<string | null>(null); | |||
| @@ -338,10 +339,21 @@ export default function ProductionSchedulePage() { | |||
| const openSettingsPanel = () => { | |||
| setSettingsTab("items"); | |||
| setItemDailyOutFilter(""); | |||
| setIsDailyOutPanelOpen(true); | |||
| fetchItemDailyOut(); | |||
| }; | |||
| const filteredItemDailyOutList = useMemo(() => { | |||
| const q = itemDailyOutFilter.trim().toLowerCase(); | |||
| if (!q) return itemDailyOutList; | |||
| return itemDailyOutList.filter( | |||
| (row) => | |||
| row.itemCode.toLowerCase().includes(q) || | |||
| row.itemName.toLowerCase().includes(q) | |||
| ); | |||
| }, [itemDailyOutFilter, itemDailyOutList]); | |||
| const handleRefreshInventoryOnHand = async () => { | |||
| if (refreshOnHandInFlightRef.current) return; | |||
| refreshOnHandInFlightRef.current = true; | |||
| @@ -1204,9 +1216,17 @@ export default function ProductionSchedulePage() { | |||
| </button> | |||
| </div> | |||
| {settingsTab === "items" && ( | |||
| <p className="px-4 py-2 text-sm text-slate-600 dark:text-slate-400"> | |||
| {t("itemsHint")} | |||
| </p> | |||
| <div className="flex flex-wrap items-center gap-3 px-4 py-2"> | |||
| <p className="text-sm text-slate-600 dark:text-slate-400"> | |||
| {t("itemsHint")} | |||
| </p> | |||
| <input | |||
| value={itemDailyOutFilter} | |||
| onChange={(e) => setItemDailyOutFilter(e.target.value)} | |||
| placeholder={t("searchItem")} | |||
| className="ml-auto w-56 rounded border border-slate-300 bg-white px-2 py-1 text-sm dark:border-slate-600 dark:bg-slate-700 dark:text-slate-100" | |||
| /> | |||
| </div> | |||
| )} | |||
| {settingsTab === "rules" ? ( | |||
| <div className="min-h-0 flex-1 overflow-auto"> | |||
| @@ -1240,7 +1260,7 @@ export default function ProductionSchedulePage() { | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| {itemDailyOutList.map((row, idx) => ( | |||
| {filteredItemDailyOutList.map((row, idx) => ( | |||
| <DailyOutRow | |||
| key={`${row.itemCode}-${idx}`} | |||
| row={row} | |||