-
+
+
- {/* 倉庫篩選 */}
-
-
+
+
({ label: w.name, value: String(w.id) }))
]}
placeholder="選擇倉庫"
- className="w-full"
+ className="w-full h-9"
/>
-
- {/* 日期範圍 - 開始 */}
-
-
-
-
- setDateStart(e.target.value)}
- className="pl-9 block w-full"
- />
-
-
-
- {/* 日期範圍 - 結束 */}
-
-
-
-
- setDateEnd(e.target.value)}
- className="pl-9 block w-full text-left"
- />
-
-
-
+ {/* Row 2: Date Filters (Collapsible) */}
+ {showAdvancedFilter && (
+
+
+
+
+ {[
+ { label: "今日", value: "today" },
+ { label: "昨日", value: "yesterday" },
+ { label: "本週", value: "this_week" },
+ { label: "本月", value: "this_month" },
+ { label: "上月", value: "last_month" },
+ ].map((opt) => (
+
+ ))}
+
+
+
+
+
+
+
+
+
+ {
+ setDateStart(e.target.value);
+ setDateRangeType('custom');
+ }}
+ className="pl-9 block w-full h-9 bg-white"
+ />
+
+
+
+
+
+
+ {
+ setDateEnd(e.target.value);
+ setDateRangeType('custom');
+ }}
+ className="pl-9 block w-full h-9 bg-white text-left"
+ />
+
+
+
+
+
+ )}
+
+
+
diff --git a/resources/js/Pages/UtilityFee/Index.tsx b/resources/js/Pages/UtilityFee/Index.tsx
index 8c6d4af..c43dea5 100644
--- a/resources/js/Pages/UtilityFee/Index.tsx
+++ b/resources/js/Pages/UtilityFee/Index.tsx
@@ -10,10 +10,12 @@ import {
Trash2,
FileText,
Calendar,
- Filter,
+ RotateCcw,
ArrowUpDown,
ArrowUp,
- ArrowDown
+ ArrowDown,
+ ChevronDown,
+ ChevronUp
} from 'lucide-react';
import { Label } from "@/Components/ui/label";
import AuthenticatedLayout from "@/Layouts/AuthenticatedLayout";
@@ -41,7 +43,7 @@ import {
AlertDialogTitle,
} from "@/Components/ui/alert-dialog";
import { Can } from "@/Components/Permission/Can";
-import { formatDateWithDayOfWeek, formatInvoiceNumber } from "@/utils/format";
+import { formatDateWithDayOfWeek, formatInvoiceNumber, getDateRange } from "@/utils/format";
interface PageProps {
fees: {
@@ -71,15 +73,30 @@ export default function UtilityFeeIndex({ fees, availableCategories, filters }:
const [categoryFilter, setCategoryFilter] = useState
(filters.category || "all");
const [dateStart, setDateStart] = useState(filters.date_start || "");
const [dateEnd, setDateEnd] = useState(filters.date_end || "");
+ const [dateRangeType, setDateRangeType] = useState("custom");
const [isDialogOpen, setIsDialogOpen] = useState(false);
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
const [editingFee, setEditingFee] = useState(null);
const [deletingFeeId, setDeletingFeeId] = useState(null);
+ // Advanced Filter Toggle
+ const [showAdvancedFilter, setShowAdvancedFilter] = useState(
+ !!(filters.date_start || filters.date_end)
+ );
+
// Sorting
- const [sortField, setSortField] = useState(filters.sort_field || 'transaction_date');
- const [sortDirection, setSortDirection] = useState<"asc" | "desc" | null>(filters.sort_direction as "asc" | "desc" || 'desc');
+ const [sortField, setSortField] = useState(filters.sort_field || null);
+ const [sortDirection, setSortDirection] = useState<"asc" | "desc" | null>(filters.sort_direction as "asc" | "desc" || null);
+
+ const handleDateRangeChange = (type: string) => {
+ setDateRangeType(type);
+ if (type === "custom") return;
+
+ const { start, end } = getDateRange(type);
+ setDateStart(start);
+ setDateEnd(end);
+ };
const handleSearch = () => {
router.get(
@@ -101,6 +118,7 @@ export default function UtilityFeeIndex({ fees, availableCategories, filters }:
setCategoryFilter("all");
setDateStart("");
setDateEnd("");
+ setDateRangeType("custom");
router.get(route("utility-fees.index"));
};
@@ -197,91 +215,150 @@ export default function UtilityFeeIndex({ fees, availableCategories, filters }: