diff --git a/src/components/pages/marketing/MarketingTable.tsx b/src/components/pages/marketing/MarketingTable.tsx index 0247fc75..36d54381 100644 --- a/src/components/pages/marketing/MarketingTable.tsx +++ b/src/components/pages/marketing/MarketingTable.tsx @@ -2,7 +2,10 @@ import Button from '@/components/Button'; import CheckboxInput from '@/components/input/CheckboxInput'; -import SelectInput, { OptionType } from '@/components/input/SelectInput'; +import SelectInput, { + OptionType, + useSelect, +} from '@/components/input/SelectInput'; import Modal, { useModal } from '@/components/Modal'; import ConfirmationModal from '@/components/modal/ConfirmationModal'; import ConfirmationModalWithNotes from '@/components/modal/ConfirmationModalWithNotes'; @@ -28,6 +31,8 @@ import toast from 'react-hot-toast'; import useSWR from 'swr'; import RequirePermission from '@/components/helper/RequirePermission'; import { useAuth } from '@/services/hooks/useAuth'; +import { CustomerApi, ProductApi } from '@/services/api/master-data'; +import { MARKETING_APPROVAL_LINE } from '@/config/approval-line'; const RowsOptionsMenu = ({ type = 'dropdown', @@ -52,7 +57,7 @@ const RowsOptionsMenu = ({ )} >
- {/* + - */} - + {props.row.original.latest_approval.step_number != 1 && ( <> - {/* Deliver - */} - + )} {props.row.original.latest_approval.step_number != 3 && ( <> - {/* + - */} - + )} - {/* + - */} - +
); @@ -175,8 +133,6 @@ const RowsOptionsMenu = ({ const MarketingTable = () => { const [search, setSearch] = useState(''); - const [page, setPage] = useState(1); - const [pageSize, setPageSize] = useState(10); const [approveAction, setApproveAction] = useState<'APPROVED' | 'REJECTED'>( 'APPROVED' @@ -186,18 +142,64 @@ const MarketingTable = () => { const { permissionCheck } = useAuth(); const router = useRouter(); - - const { - data: marketing, - isLoading: isLoadingMarketing, - mutate: refreshMarketing, - } = useSWR(MarketingApi.basePath, MarketingApi.getAllFetcher); - const deleteModal = useModal(); const confirmationModal = useModal(); const productsModal = useModal(); const deliveryModal = useModal(); + const { + state: tableFilterState, + updateFilter, + setPage, + setPageSize, + toQueryString: getTableFilterToQueryString, + } = useTableFilter({ + initial: { + search: '', + product_ids: '', + status: '', + customer_id: '', + page: 1, + limit: 10, + }, + paramMap: { + page: 'page', + pageSize: 'limit', + product_ids: 'product_ids', + status: 'status', + customer_id: 'customer_id', + }, + }); + // ===== FETCH DATA ===== + const { + data: marketing, + isLoading: isLoadingMarketing, + mutate: refreshMarketing, + } = useSWR( + `${MarketingApi.basePath}${getTableFilterToQueryString()}`, + MarketingApi.getAllFetcher + ); + + // ===== OPTIONS ===== + const { + options: productsOptions, + isLoadingOptions: isLoadingProductsOptions, + } = useSelect(ProductApi.basePath, 'id', 'name', '', { + limit: 'limit', + }); + + const { + options: customersOptions, + isLoadingOptions: isLoadingCustomersOptions, + } = useSelect(CustomerApi.basePath, 'id', 'name', '', { + limit: 'limit', + }); + const statusOptions = MARKETING_APPROVAL_LINE.map((item) => ({ + value: item.step_number, + label: item.step_name, + })); + + // ===== HANDLER ===== const searchChangeHandler = useCallback( (e: React.ChangeEvent) => { setSearch(e.target.value); @@ -209,7 +211,8 @@ const MarketingTable = () => { (val: OptionType | OptionType[] | null) => { const newVal = val as OptionType; setPageSize(newVal.value as number); - setPage(1); + updateFilter('page', 1); + updateFilter('limit', newVal.value as number); }, [] ); @@ -314,20 +317,6 @@ const MarketingTable = () => { ); }; - const { - state: tableFilterState, - updateFilter, - toQueryString: getTableFilterToQueryString, - } = useTableFilter({ - initial: { - search: '', - }, - paramMap: { - page: 'page', - pageSize: 'limit', - }, - }); - const getRowCanSelect = (row: Row): boolean => { const approval = row.original.latest_approval; return approval?.step_number === 1 && approval?.action !== 'REJECTED'; @@ -353,7 +342,7 @@ const MarketingTable = () => { }} />
- {/* + - */} - + - {/* + - */} - +
{ label='Product' isClearable placeholder='Pilih product' - options={[]} + options={productsOptions} + isLoading={isLoadingProductsOptions} + value={ + tableFilterState.product_ids + ?.split(',') + .map((id) => + productsOptions.find( + (option) => option.value === Number(id) + ) + ) + .filter( + (option): option is { value: number; label: string } => + option !== undefined + ) ?? null + } + onChange={(value: OptionType | OptionType[] | null) => + updateFilter( + 'product_ids', + (value as OptionType[]) + ?.map((item: OptionType) => item.value.toString()) + .join(',') || '' + ) + } isMulti /> {/* select status */} @@ -414,14 +407,43 @@ const MarketingTable = () => { label='Status' isClearable placeholder='Pilih status' - options={[]} + options={statusOptions} + value={ + tableFilterState.status + ? statusOptions.find( + (option) => + option.value === Number(tableFilterState.status) + ) + : null + } + onChange={(value: OptionType | OptionType[] | null) => + updateFilter( + 'status', + (value as OptionType)?.value.toString() || '' + ) + } /> {/* select customer */} + option.value === Number(tableFilterState.customer_id) + ) + : null + } + onChange={(value: OptionType | OptionType[] | null) => + updateFilter( + 'customer_id', + (value as OptionType)?.value.toString() || '' + ) + } /> @@ -587,8 +609,8 @@ const MarketingTable = () => { }, }, ]} - pageSize={pageSize} - page={page} + pageSize={tableFilterState.pageSize} + page={tableFilterState.page} onPageChange={setPage} className={{ tableWrapperClassName: 'overflow-x-auto min-h-full!', diff --git a/src/config/route-permission.ts b/src/config/route-permission.ts index 7c7ab0ac..101dbb6d 100644 --- a/src/config/route-permission.ts +++ b/src/config/route-permission.ts @@ -3,7 +3,6 @@ export const ROUTE_PERMISSIONS: Record = { // Dashboard '/dashboard/': ['lti.dashboard.list'], - '/dashboard': ['lti.dashboard.list'], // Production // Production - Project Flock @@ -58,27 +57,14 @@ export const ROUTE_PERMISSIONS: Record = { '/purchase/detail/edit/': ['lti.purchase.update'], // Marketing - '/marketing/': ['lti.dashboard.list', 'lti.marketing.delivery_order.list'], - '/marketing/add/delivery-orders/': [ - 'lti.dashboard.list', - 'lti.marketing.delivery_order.create', - ], - '/marketing/add/sales-orders/': [ - 'lti.dashboard.list', - 'lti.marketing.sales_order.create', - ], - '/marketing/detail/': [ - 'lti.dashboard.list', - 'lti.marketing.delivery_order.detail', - ], + '/marketing/': ['lti.marketing.delivery_order.list'], + '/marketing/add/delivery-orders/': ['lti.marketing.delivery_order.create'], + '/marketing/add/sales-orders/': ['lti.marketing.sales_order.create'], + '/marketing/detail/': ['lti.marketing.delivery_order.detail'], '/marketing/detail/delivery-orders/edit/': [ - 'lti.dashboard.list', 'lti.marketing.delivery_order.update', ], - '/marketing/detail/sales-orders/edit/': [ - 'lti.dashboard.list', - 'lti.marketing.sales_order.update', - ], + '/marketing/detail/sales-orders/edit/': ['lti.marketing.sales_order.update'], // Expense '/expense/': ['lti.expense.list'], @@ -89,19 +75,12 @@ export const ROUTE_PERMISSIONS: Record = { '/expense/realization/edit/': ['lti.expense.update.realization'], // Finance - '/finance/': ['lti.dashboard.list', 'lti.finance.transaction.list'], - '/finance/detail/': ['lti.dashboard.list', 'lti.finance.transaction.detail'], - '/finance/add/': ['lti.dashboard.list', 'lti.finance.payments.create'], - '/finance/detail/edit/': [ - 'lti.dashboard.list', - 'lti.finance.payments.update', - ], - '/finance/add/initial-balance/': [ - 'lti.dashboard.list', - 'lti.finance.initial_balances.create', - ], + '/finance/': ['lti.finance.transaction.list'], + '/finance/detail/': ['lti.finance.transaction.detail'], + '/finance/add/': ['lti.finance.payments.create'], + '/finance/detail/edit/': ['lti.finance.payments.update'], + '/finance/add/initial-balance/': ['lti.finance.initial_balances.create'], '/finance/detail/edit/initial-balance/': [ - 'lti.dashboard.list', 'lti.finance.initial_balances.update', ], '/finance/add/injection/': ['lti.finance.injections.create'], @@ -203,20 +182,14 @@ export const ROUTE_PERMISSIONS: Record = { '/master-data/flock/detail/': ['lti.master.flocks.detail'], '/master-data/flock/detail/edit/': ['lti.master.flocks.update'], - '/master-data/production-standard/': [ - 'lti.dashboard.list', - 'lti.master.production_standards.list', - ], + '/master-data/production-standard/': ['lti.master.production_standards.list'], '/master-data/production-standard/add/': [ - 'lti.dashboard.list', 'lti.master.production_standards.create', ], '/master-data/production-standard/detail/': [ - 'lti.dashboard.list', 'lti.master.production_standards.detail', ], '/master-data/production-standard/detail/edit/': [ - 'lti.dashboard.list', 'lti.master.production_standards.update', ], };