From 3c13aa897cb2d9fb5c6b397a19666bfb6ec77240 Mon Sep 17 00:00:00 2001 From: efrilm Date: Fri, 30 Jan 2026 17:22:18 +0700 Subject: [PATCH] add filter order --- src/services/queries/orders.ts | 2 + .../ecommerce/orders/list/OrderListTable.tsx | 132 ++++++++++++++---- 2 files changed, 107 insertions(+), 27 deletions(-) diff --git a/src/services/queries/orders.ts b/src/services/queries/orders.ts index ecd5018..4bb0733 100644 --- a/src/services/queries/orders.ts +++ b/src/services/queries/orders.ts @@ -6,6 +6,8 @@ interface OrdersQueryParams { page?: number limit?: number search?: string + date_from?: string + date_to?: string } export function useOrders(params: OrdersQueryParams = {}) { diff --git a/src/views/apps/ecommerce/orders/list/OrderListTable.tsx b/src/views/apps/ecommerce/orders/list/OrderListTable.tsx index 6f8a94c..65cbfc8 100644 --- a/src/views/apps/ecommerce/orders/list/OrderListTable.tsx +++ b/src/views/apps/ecommerce/orders/list/OrderListTable.tsx @@ -13,8 +13,10 @@ import Checkbox from '@mui/material/Checkbox' import Chip from '@mui/material/Chip' import MenuItem from '@mui/material/MenuItem' import TablePagination from '@mui/material/TablePagination' +import TextField from '@mui/material/TextField' import type { TextFieldProps } from '@mui/material/TextField' import Typography from '@mui/material/Typography' +import { Box, CircularProgress, useTheme } from '@mui/material' // Third-party Imports import type { RankingInfo } from '@tanstack/match-sorter-utils' @@ -40,11 +42,10 @@ import { getLocalizedUrl } from '@/utils/i18n' // Style Imports import tableStyles from '@core/styles/table.module.css' -import { Box, CircularProgress } from '@mui/material' import Loading from '../../../../../components/layout/shared/Loading' import { useOrders } from '../../../../../services/queries/orders' import { Order } from '../../../../../types/services/order' -import { formatCurrency } from '../../../../../utils/transform' +import { formatCurrency, formatDateDDMMYYYY, formatForInputDate } from '../../../../../utils/transform' declare module '@tanstack/table-core' { interface FilterFns { @@ -105,15 +106,28 @@ const DebouncedInput = ({ const columnHelper = createColumnHelper() const OrderListTable = () => { + const theme = useTheme() + // States const [rowSelection, setRowSelection] = useState({}) const [currentPage, setCurrentPage] = useState(1) const [pageSize, setPageSize] = useState(10) const [search, setSearch] = useState('') + // Set default date range to current month + const today = new Date() + const firstDayOfMonth = new Date(today.getFullYear(), today.getMonth(), 1) + + const [filter, setFilter] = useState({ + date_from: formatForInputDate(firstDayOfMonth), + date_to: formatForInputDate(today) + }) + const { data, isLoading, error, isFetching } = useOrders({ page: currentPage, limit: pageSize, + date_from: formatDateDDMMYYYY(new Date(filter.date_from)), + date_to: formatDateDDMMYYYY(new Date(filter.date_to)), search }) @@ -203,6 +217,10 @@ const OrderListTable = () => { header: 'Discount', cell: ({ row }) => {formatCurrency(row.original.discount_amount)} }), + columnHelper.accessor('created_at', { + header: 'Created At', + cell: ({ row }) => {formatDateDDMMYYYY(new Date(row.original.created_at))} + }), columnHelper.accessor('action', { header: 'Action', cell: ({ row }) => ( @@ -245,44 +263,104 @@ const OrderListTable = () => { state: { rowSelection, pagination: { - pageIndex: currentPage, // <= penting! + pageIndex: currentPage, pageSize } }, - enableRowSelection: true, //enable row selection for all rows + enableRowSelection: true, onRowSelectionChange: setRowSelection, getCoreRowModel: getCoreRowModel(), - // Disable client-side pagination since we're handling it server-side manualPagination: true, pageCount: Math.ceil(totalCount / pageSize) }) return ( - - setSearch(value as string)} - placeholder='Search Order' - className='sm:is-auto' - /> -
- - 10 - 25 - 50 - 100 - - + + {/* Date Range Filter */} +
+ + Filter by Date: + + { + setFilter({ + ...filter, + date_from: e.target.value + }) + setCurrentPage(1) + }} + size='small' + sx={{ + '& .MuiOutlinedInput-root': { + '&.Mui-focused fieldset': { + borderColor: 'primary.main' + }, + '& fieldset': { + borderColor: theme.palette.mode === 'dark' ? 'rgba(231, 227, 252, 0.22)' : theme.palette.divider + } + } + }} + /> + - + { + setFilter({ + ...filter, + date_to: e.target.value + }) + setCurrentPage(1) + }} + size='small' + sx={{ + '& .MuiOutlinedInput-root': { + '&.Mui-focused fieldset': { + borderColor: 'primary.main' + }, + '& fieldset': { + borderColor: theme.palette.mode === 'dark' ? 'rgba(231, 227, 252, 0.22)' : theme.palette.divider + } + } + }} + /> +
+ + {/* Search and Actions */} +
+ setSearch(value as string)} + placeholder='Search Order' + className='sm:is-auto' + /> +
+ + 10 + 25 + 50 + 100 + + +
+
{isLoading ? (