@pulog/component 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data-table/lib/filter-utils.ts","../src/data-table/contexts/FilterContext.tsx","../src/data-table/contexts/PaginationContext.tsx","../src/data-table/contexts/SortContext.tsx","../src/data-table/contexts/ColumnVisibilityContext.tsx","../src/data-table/contexts/ColumnPinningContext.tsx","../src/data-table/contexts/DataTableProvider.tsx","../src/data-table/selection/RowCheckbox.tsx","../src/data-table/selection/SelectAllCheckbox.tsx","../src/data-table/selection/ExpandableRow.tsx","../src/data-table/pagination/TraditionalPagination.tsx","../src/data-table/pagination/InfiniteScrollPagination.tsx","../src/data-table/filters/SearchFilter.tsx","../src/data-table/filters/DateFilter.tsx","../src/data-table/filters/DateRangeFilter.tsx","../src/data-table/filters/SelectFilter.tsx","../src/data-table/filters/MultiSelectFilter.tsx","../src/data-table/filters/CheckboxFilter.tsx","../src/data-table/filters/RangeFilter.tsx","../src/data-table/filters/DateTreeFilter.tsx","../src/data-table/filters/FilterPanel.tsx","../src/data-table/filters/ColumnHeaderFilter.tsx","../src/data-table/ColumnVisibilityPanel.tsx","../src/data-table/ColumnPinMenu.tsx","../src/data-table/DataTable.tsx","../src/data-table/lib/query-builder.ts","../src/data-table/i18n/en.json","../src/data-table/i18n/index.ts"],"names":["parsed","item","value","createContext","useState","useCallback","jsx","useContext","Checkbox","React","jsxs","Button","removeFilter","Input","useEffect","cn","format","enUS","useTranslation","Calendar","dayPickerEnUS","useMemo","LIMIT_RENDER","useRef","Loader2","Search","ChevronRight","hasActiveFilters","X","Popover","PopoverTrigger","PopoverContent","SelectionSummary","Check","Filter"],"mappings":"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","file":"index.js","sourcesContent":["import { FilterValue, FilterType } from './types';\r\n\r\nexport function parseDateValue(value: unknown): Date | null {\r\n if (value instanceof Date) {\r\n return isNaN(value.getTime()) ? null : new Date(value.getTime());\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim();\r\n if (!trimmed) return null;\r\n\r\n const dateOnlyMatch = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(trimmed);\r\n if (dateOnlyMatch) {\r\n const year = Number(dateOnlyMatch[1]);\r\n const month = Number(dateOnlyMatch[2]) - 1;\r\n const day = Number(dateOnlyMatch[3]);\r\n const parsed = new Date(year, month, day);\r\n return isNaN(parsed.getTime()) ? null : parsed;\r\n }\r\n\r\n const parsed = new Date(trimmed);\r\n return isNaN(parsed.getTime()) ? null : parsed;\r\n }\r\n\r\n if (typeof value === 'number') {\r\n const parsed = new Date(value);\r\n return isNaN(parsed.getTime()) ? null : parsed;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function formatDateKey(value: unknown): string | null {\r\n const parsed = parseDateValue(value);\r\n if (!parsed) return null;\r\n\r\n const year = parsed.getFullYear();\r\n const month = String(parsed.getMonth() + 1).padStart(2, '0');\r\n const day = String(parsed.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n}\r\n\r\n/**\r\n * Validate if a filter value is valid\r\n */\r\nexport function isValidFilterValue(filter: FilterValue): boolean {\r\n if (!filter.field) {\r\n return false;\r\n }\r\n\r\n switch (filter.type) {\r\n case 'dateRange':\r\n return (\r\n Array.isArray(filter.value) &&\r\n filter.value.length === 2 &&\r\n parseDateValue(filter.value[0]) !== null &&\r\n parseDateValue(filter.value[1]) !== null\r\n );\r\n\r\n case 'range':\r\n return (\r\n Array.isArray(filter.value) &&\r\n filter.value.length === 2 &&\r\n typeof filter.value[0] === 'number' &&\r\n typeof filter.value[1] === 'number'\r\n );\r\n\r\n case 'multiSelect':\r\n case 'dateTree':\r\n return Array.isArray(filter.value) && filter.value.length > 0;\r\n\r\n case 'checkbox':\r\n return typeof filter.value === 'boolean';\r\n\r\n case 'date':\r\n case 'select':\r\n case 'search':\r\n if (Array.isArray(filter.value)) {\r\n return filter.value.length > 0;\r\n }\r\n return filter.value !== null && filter.value !== undefined && filter.value !== '';\r\n\r\n default:\r\n return filter.value !== null && filter.value !== undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Apply filters to data (client-side filtering)\r\n */\r\nexport function applyFilters<T extends Record<string, any>>(\r\n data: T[],\r\n filters: FilterValue[]\r\n): T[] {\r\n return data.filter((item) => {\r\n return filters.every((filter) => matchesFilter(item, filter));\r\n });\r\n}\r\n\r\n/**\r\n * Check if item matches filter criteria\r\n */\r\nfunction matchesFilter(\r\n item: Record<string, any>,\r\n filter: FilterValue\r\n): boolean {\r\n const value = item[filter.field];\r\n\r\n switch (filter.type) {\r\n case 'search': {\r\n const cellStr = value == null ? '' : String(value);\r\n const lower = cellStr.toLowerCase();\r\n const searchValue = filter.value;\r\n if (Array.isArray(searchValue)) {\r\n return searchValue.some((item) => lower.includes(String(item).toLowerCase()));\r\n }\r\n return lower.includes(String(searchValue).toLowerCase());\r\n }\r\n\r\n case 'date':\r\n return formatDateKey(value) === formatDateKey(filter.value);\r\n\r\n case 'dateRange': {\r\n const itemDateKey = formatDateKey(value);\r\n const [fromValue, toValue] = Array.isArray(filter.value)\r\n ? filter.value\r\n : [filter.value?.from, filter.value?.to];\r\n const fromDateKey = formatDateKey(fromValue);\r\n const toDateKey = formatDateKey(toValue);\r\n\r\n if (!itemDateKey || !fromDateKey || !toDateKey) return false;\r\n\r\n return itemDateKey >= fromDateKey && itemDateKey <= toDateKey;\r\n }\r\n\r\n case 'select':\r\n return String(value ?? '') === String(filter.value);\r\n\r\n case 'multiSelect':\r\n if (!Array.isArray(filter.value) || filter.value.length === 0) return false;\r\n return filter.value.includes(String(value ?? ''));\r\n\r\n case 'dateTree': {\r\n if (!Array.isArray(filter.value) || filter.value.length === 0) return false;\r\n const itemKey = formatDateKey(value);\r\n return itemKey !== null && filter.value.includes(itemKey);\r\n }\r\n\r\n case 'checkbox':\r\n return Boolean(value) === Boolean(filter.value);\r\n\r\n case 'range': {\r\n const numValue = Number(value);\r\n const [min, max] = filter.value;\r\n return numValue >= min && numValue <= max;\r\n }\r\n\r\n default:\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Group filters by field for display purposes\r\n */\r\nexport function groupFiltersByField(\r\n filters: FilterValue[]\r\n): Record<string, FilterValue[]> {\r\n return filters.reduce(\r\n (acc, filter) => {\r\n if (!acc[filter.field]) {\r\n acc[filter.field] = [];\r\n }\r\n acc[filter.field].push(filter);\r\n return acc;\r\n },\r\n {} as Record<string, FilterValue[]>\r\n );\r\n}\r\n\r\n/**\r\n * Remove filter by field and optionally by specific value\r\n */\r\nexport function removeFilter(\r\n filters: FilterValue[],\r\n fieldToRemove: string,\r\n valueToRemove?: any\r\n): FilterValue[] {\r\n return filters.filter((filter) => {\r\n if (filter.field !== fieldToRemove) {\r\n return true;\r\n }\r\n if (valueToRemove === undefined) {\r\n return false;\r\n }\r\n return filter.value !== valueToRemove;\r\n });\r\n}\r\n\r\n/**\r\n * Clear all filters for specific field\r\n */\r\nexport function clearFieldFilters(\r\n filters: FilterValue[],\r\n fieldsToClear: string[]\r\n): FilterValue[] {\r\n return filters.filter((filter) => !fieldsToClear.includes(filter.field));\r\n}\r\n\r\n/**\r\n * Check if any filters are active\r\n */\r\nexport function hasActiveFilters(filters: FilterValue[]): boolean {\r\n return filters.length > 0 && filters.some(isValidFilterValue);\r\n}\r\n","'use client';\r\n\r\nimport React, { createContext, useContext, useState, useCallback } from 'react';\r\nimport { FilterValue, FilterType } from '../lib/types';\r\nimport { removeFilter, clearFieldFilters, hasActiveFilters } from '../lib/filter-utils';\r\n\r\ninterface FilterContextType {\r\n filters: FilterValue[];\r\n addFilter: (filter: FilterValue) => void;\r\n updateFilter: (fieldId: string, newFilter: Partial<FilterValue>) => void;\r\n removeFilter: (fieldId: string, value?: any) => void;\r\n clearFilters: () => void;\r\n clearFieldFilters: (fields: string[]) => void;\r\n hasActiveFilters: boolean;\r\n getFieldFilters: (field: string) => FilterValue[];\r\n}\r\n\r\nconst FilterContext = createContext<FilterContextType | undefined>(undefined);\r\n\r\nexport function FilterProvider({ children }: { children: React.ReactNode }) {\r\n const [filters, setFilters] = useState<FilterValue[]>([]);\r\n\r\n const addFilter = useCallback((filter: FilterValue) => {\r\n setFilters((prev) => [...prev, filter]);\r\n }, []);\r\n\r\n const updateFilter = useCallback(\r\n (fieldId: string, newFilter: Partial<FilterValue>) => {\r\n setFilters((prev) =>\r\n prev.map((f) =>\r\n f.field === fieldId ? { ...f, ...newFilter } : f\r\n )\r\n );\r\n },\r\n []\r\n );\r\n\r\n const removeFilterFn = useCallback((fieldId: string, value?: any) => {\r\n setFilters((prev) => removeFilter(prev, fieldId, value));\r\n }, []);\r\n\r\n const clearFiltersFn = useCallback(() => {\r\n setFilters([]);\r\n }, []);\r\n\r\n const clearFieldFiltersFn = useCallback((fields: string[]) => {\r\n setFilters((prev) => clearFieldFilters(prev, fields));\r\n }, []);\r\n\r\n const getFieldFilters = useCallback(\r\n (field: string) => filters.filter((f) => f.field === field),\r\n [filters]\r\n );\r\n\r\n const value: FilterContextType = {\r\n filters,\r\n addFilter,\r\n updateFilter,\r\n removeFilter: removeFilterFn,\r\n clearFilters: clearFiltersFn,\r\n clearFieldFilters: clearFieldFiltersFn,\r\n hasActiveFilters: hasActiveFilters(filters),\r\n getFieldFilters,\r\n };\r\n\r\n return (\r\n <FilterContext.Provider value={value}>{children}</FilterContext.Provider>\r\n );\r\n}\r\n\r\nexport function useFilters(): FilterContextType {\r\n const context = useContext(FilterContext);\r\n if (!context) {\r\n throw new Error('useFilters must be used within a FilterProvider');\r\n }\r\n return context;\r\n}\r\n","'use client';\r\n\r\nimport React, { createContext, useContext, useState, useCallback } from 'react';\r\nimport { PaginationMeta } from '../lib/types';\r\n\r\ninterface PaginationContextType {\r\n pageIndex: number;\r\n pageSize: number;\r\n pageCount: number;\r\n totalData: number;\r\n paginationMode: 'traditional' | 'infinite';\r\n goToPage: (pageIndex: number) => void;\r\n nextPage: () => void;\r\n previousPage: () => void;\r\n setPageSize: (size: number) => void;\r\n updatePaginationMeta: (meta: PaginationMeta) => void;\r\n updatePaginationCount: (meta: Omit<PaginationMeta, 'pageSize'>) => void;\r\n setPaginationMode: (mode: 'traditional' | 'infinite') => void;\r\n canGoNext: boolean;\r\n canGoPrevious: boolean;\r\n}\r\n\r\n// Exported (not just the hook) so `<DataTable>` can probe — via plain\r\n// `useContext`, which doesn't throw when absent — whether it's already\r\n// inside an externally-rendered `DataTableProvider` and should reuse that\r\n// instead of creating its own nested one. See DataTable.tsx.\r\nexport const PaginationContext = createContext<PaginationContextType | undefined>(\r\n undefined\r\n);\r\n\r\nexport function PaginationProvider({\r\n children,\r\n defaultPageSize = 10,\r\n}: {\r\n children: React.ReactNode;\r\n defaultPageSize?: number;\r\n}) {\r\n const [pageIndex, setPageIndex] = useState(1);\r\n // Lazy initializer: must be correct on the very first render — a\r\n // post-mount effect correcting this later causes a visible double\r\n // fetch (first request goes out with the wrong default pageSize\r\n // before the correction round-trips through onStateChange).\r\n const [pageSize, setPageSizeState] = useState(defaultPageSize);\r\n const [pageCount, setPageCount] = useState(1);\r\n const [totalData, setTotalData] = useState(0);\r\n const [paginationMode, setPaginationModeState] = useState<'traditional' | 'infinite'>(\r\n 'traditional'\r\n );\r\n\r\n const goToPage = useCallback((newPageIndex: number) => {\r\n setPageIndex(Math.max(1, newPageIndex));\r\n }, []);\r\n\r\n const nextPage = useCallback(() => {\r\n setPageIndex((prev) => Math.min(prev + 1, pageCount));\r\n }, [pageCount]);\r\n\r\n const previousPage = useCallback(() => {\r\n setPageIndex((prev) => Math.max(prev - 1, 1));\r\n }, []);\r\n\r\n const setPageSizeFn = useCallback((size: number) => {\r\n setPageSizeState(size);\r\n setPageIndex(1);\r\n }, []);\r\n\r\n const updatePaginationMeta = useCallback((meta: PaginationMeta) => {\r\n setPageIndex(meta.pageIndex);\r\n setPageSizeState(meta.pageSize);\r\n setPageCount(meta.pageCount);\r\n setTotalData(meta.totalData);\r\n }, []);\r\n\r\n // Like `updatePaginationMeta` but leaves `pageSize` untouched — used by\r\n // DataTable's own pageIndex/pageCount/totalData sync effect, which would\r\n // otherwise echo back a stale `pageSize` and clobber a value just set via\r\n // `setPageSize` (e.g. seeding the `pageSize` prop) in the same commit.\r\n const updatePaginationCount = useCallback((meta: Omit<PaginationMeta, 'pageSize'>) => {\r\n setPageIndex(meta.pageIndex);\r\n setPageCount(meta.pageCount);\r\n setTotalData(meta.totalData);\r\n }, []);\r\n\r\n const setPaginationMode = useCallback(\r\n (mode: 'traditional' | 'infinite') => {\r\n setPaginationModeState(mode);\r\n },\r\n []\r\n );\r\n\r\n const canGoNext = pageIndex < pageCount;\r\n const canGoPrevious = pageIndex > 1;\r\n\r\n const value: PaginationContextType = {\r\n pageIndex,\r\n pageSize,\r\n pageCount,\r\n totalData,\r\n paginationMode,\r\n goToPage,\r\n nextPage,\r\n previousPage,\r\n setPageSize: setPageSizeFn,\r\n updatePaginationMeta,\r\n updatePaginationCount,\r\n setPaginationMode,\r\n canGoNext,\r\n canGoPrevious,\r\n };\r\n\r\n return (\r\n <PaginationContext.Provider value={value}>\r\n {children}\r\n </PaginationContext.Provider>\r\n );\r\n}\r\n\r\nexport function usePagination(): PaginationContextType {\r\n const context = useContext(PaginationContext);\r\n if (!context) {\r\n throw new Error(\r\n 'usePagination must be used within a PaginationProvider'\r\n );\r\n }\r\n return context;\r\n}\r\n","'use client';\r\n\r\nimport React, { createContext, useContext, useState, useCallback } from 'react';\r\nimport { SortState, SortOrder } from '../lib/types';\r\n\r\ninterface SortContextType {\r\n sort: SortState;\r\n setSort: (column: string | null, order?: SortOrder) => void;\r\n toggleSort: (column: string) => void;\r\n clearSort: () => void;\r\n isSorted: (column: string) => boolean;\r\n getSortOrder: (column: string) => SortOrder;\r\n}\r\n\r\nconst SortContext = createContext<SortContextType | undefined>(undefined);\r\n\r\nexport function SortProvider({ children }: { children: React.ReactNode }) {\r\n const [sort, setSort] = useState<SortState>({\r\n column: null,\r\n order: null,\r\n });\r\n\r\n const setSortFn = useCallback((column: string | null, order: SortOrder = 'asc') => {\r\n setSort({\r\n column,\r\n order: column ? order : null,\r\n });\r\n }, []);\r\n\r\n const toggleSort = useCallback((column: string) => {\r\n setSort((prev) => {\r\n if (prev.column === column) {\r\n // Cycle: asc -> desc -> null\r\n if (prev.order === 'asc') {\r\n return { column, order: 'desc' };\r\n } else if (prev.order === 'desc') {\r\n return { column: null, order: null };\r\n } else {\r\n return { column, order: 'asc' };\r\n }\r\n } else {\r\n return { column, order: 'asc' };\r\n }\r\n });\r\n }, []);\r\n\r\n const clearSort = useCallback(() => {\r\n setSort({ column: null, order: null });\r\n }, []);\r\n\r\n const isSorted = useCallback(\r\n (column: string) => sort.column === column && sort.order !== null,\r\n [sort]\r\n );\r\n\r\n const getSortOrder = useCallback(\r\n (column: string) => (sort.column === column ? sort.order : null),\r\n [sort]\r\n );\r\n\r\n const value: SortContextType = {\r\n sort,\r\n setSort: setSortFn,\r\n toggleSort,\r\n clearSort,\r\n isSorted,\r\n getSortOrder,\r\n };\r\n\r\n return (\r\n <SortContext.Provider value={value}>{children}</SortContext.Provider>\r\n );\r\n}\r\n\r\nexport function useSort(): SortContextType {\r\n const context = useContext(SortContext);\r\n if (!context) {\r\n throw new Error('useSort must be used within a SortProvider');\r\n }\r\n return context;\r\n}\r\n","'use client';\r\n\r\nimport React, { createContext, useContext, useState, useCallback } from 'react';\r\nimport { ColumnVisibilityState } from '../lib/types';\r\n\r\ninterface ColumnVisibilityContextType {\r\n visibility: ColumnVisibilityState;\r\n toggleColumn: (columnId: string) => void;\r\n showColumn: (columnId: string) => void;\r\n hideColumn: (columnId: string) => void;\r\n isColumnVisible: (columnId: string) => boolean;\r\n showAllColumns: () => void;\r\n hideAllColumns: () => void;\r\n setVisibility: (visibility: ColumnVisibilityState) => void;\r\n}\r\n\r\nconst ColumnVisibilityContext = createContext<ColumnVisibilityContextType | undefined>(\r\n undefined\r\n);\r\n\r\nfunction isVisibilityEqual(a: ColumnVisibilityState, b: ColumnVisibilityState) {\r\n const aKeys = Object.keys(a)\r\n const bKeys = Object.keys(b)\r\n\r\n if (aKeys.length !== bKeys.length) return false\r\n\r\n return aKeys.every((key) => a[key] === b[key])\r\n}\r\n\r\nexport function ColumnVisibilityProvider({\r\n children,\r\n defaultVisibility = {},\r\n}: {\r\n children: React.ReactNode;\r\n defaultVisibility?: ColumnVisibilityState;\r\n}) {\r\n const [visibility, setVisibilityState] = useState<ColumnVisibilityState>(\r\n defaultVisibility\r\n );\r\n\r\n const toggleColumn = useCallback((columnId: string) => {\r\n setVisibilityState((prev) => ({\r\n ...prev,\r\n [columnId]: !prev[columnId],\r\n }));\r\n }, []);\r\n\r\n const showColumn = useCallback((columnId: string) => {\r\n setVisibilityState((prev) => ({\r\n ...prev,\r\n [columnId]: true,\r\n }));\r\n }, []);\r\n\r\n const hideColumn = useCallback((columnId: string) => {\r\n setVisibilityState((prev) => ({\r\n ...prev,\r\n [columnId]: false,\r\n }));\r\n }, []);\r\n\r\n const isColumnVisible = useCallback(\r\n (columnId: string) => visibility[columnId] !== false,\r\n [visibility]\r\n );\r\n\r\n const showAllColumns = useCallback(() => {\r\n setVisibilityState((prev) => {\r\n const newVisibility: ColumnVisibilityState = {};\r\n Object.keys(prev).forEach((key) => {\r\n newVisibility[key] = true;\r\n });\r\n return newVisibility;\r\n });\r\n }, []);\r\n\r\n const hideAllColumns = useCallback(() => {\r\n setVisibilityState((prev) => {\r\n const newVisibility: ColumnVisibilityState = {};\r\n Object.keys(prev).forEach((key) => {\r\n newVisibility[key] = false;\r\n });\r\n return newVisibility;\r\n });\r\n }, []);\r\n\r\n const setVisibility = useCallback((newVisibility: ColumnVisibilityState) => {\r\n setVisibilityState((prev) =>\r\n isVisibilityEqual(prev, newVisibility) ? prev : newVisibility\r\n );\r\n }, []);\r\n\r\n const value: ColumnVisibilityContextType = {\r\n visibility,\r\n toggleColumn,\r\n showColumn,\r\n hideColumn,\r\n isColumnVisible,\r\n showAllColumns,\r\n hideAllColumns,\r\n setVisibility,\r\n };\r\n\r\n return (\r\n <ColumnVisibilityContext.Provider value={value}>\r\n {children}\r\n </ColumnVisibilityContext.Provider>\r\n );\r\n}\r\n\r\nexport function useColumnVisibility(): ColumnVisibilityContextType {\r\n const context = useContext(ColumnVisibilityContext);\r\n if (!context) {\r\n throw new Error(\r\n 'useColumnVisibility must be used within a ColumnVisibilityProvider'\r\n );\r\n }\r\n return context;\r\n}\r\n","'use client';\r\n\r\nimport React, { createContext, useContext, useState, useCallback } from 'react';\r\nimport { ColumnPinningState, ColumnPinPosition } from '../lib/types';\r\n\r\ninterface ColumnPinningContextType {\r\n pinning: ColumnPinningState;\r\n pinColumn: (columnId: string, side: 'left' | 'right') => void;\r\n unpinColumn: (columnId: string) => void;\r\n getColumnPin: (columnId: string) => ColumnPinPosition | undefined;\r\n setPinning: (pinning: ColumnPinningState) => void;\r\n}\r\n\r\nconst ColumnPinningContext = createContext<ColumnPinningContextType | undefined>(\r\n undefined\r\n);\r\n\r\nfunction isPinningEqual(a: ColumnPinningState, b: ColumnPinningState) {\r\n const aKeys = Object.keys(a)\r\n const bKeys = Object.keys(b)\r\n\r\n if (aKeys.length !== bKeys.length) return false\r\n\r\n return aKeys.every((key) => a[key] === b[key])\r\n}\r\n\r\nexport function ColumnPinningProvider({\r\n children,\r\n defaultPinning = {},\r\n}: {\r\n children: React.ReactNode;\r\n defaultPinning?: ColumnPinningState;\r\n}) {\r\n const [pinning, setPinningState] = useState<ColumnPinningState>(defaultPinning);\r\n\r\n const pinColumn = useCallback((columnId: string, side: 'left' | 'right') => {\r\n setPinningState((prev) => ({\r\n ...prev,\r\n [columnId]: side,\r\n }));\r\n }, []);\r\n\r\n const unpinColumn = useCallback((columnId: string) => {\r\n setPinningState((prev) => ({\r\n ...prev,\r\n [columnId]: false,\r\n }));\r\n }, []);\r\n\r\n // Returns undefined (not `false`) when the column has never been touched,\r\n // so callers can fall back to that column's own static `sticky` config.\r\n const getColumnPin = useCallback(\r\n (columnId: string) => pinning[columnId],\r\n [pinning]\r\n );\r\n\r\n const setPinning = useCallback((newPinning: ColumnPinningState) => {\r\n setPinningState((prev) =>\r\n isPinningEqual(prev, newPinning) ? prev : newPinning\r\n );\r\n }, []);\r\n\r\n const value: ColumnPinningContextType = {\r\n pinning,\r\n pinColumn,\r\n unpinColumn,\r\n getColumnPin,\r\n setPinning,\r\n };\r\n\r\n return (\r\n <ColumnPinningContext.Provider value={value}>\r\n {children}\r\n </ColumnPinningContext.Provider>\r\n );\r\n}\r\n\r\nexport function useColumnPinning(): ColumnPinningContextType {\r\n const context = useContext(ColumnPinningContext);\r\n if (!context) {\r\n throw new Error(\r\n 'useColumnPinning must be used within a ColumnPinningProvider'\r\n );\r\n }\r\n return context;\r\n}\r\n","'use client';\r\n\r\nimport React from 'react';\r\nimport { FilterProvider } from './FilterContext';\r\nimport { PaginationProvider } from './PaginationContext';\r\nimport { SelectionProvider } from './SelectionContext';\r\nimport { SortProvider } from './SortContext';\r\nimport { ColumnVisibilityProvider } from './ColumnVisibilityContext';\r\nimport { ColumnPinningProvider } from './ColumnPinningContext';\r\nimport { ColumnVisibilityState, ColumnPinningState } from '../lib/types';\r\n\r\n/**\r\n * Internal to `<DataTable>` — it renders this itself, seeded from its own\r\n * props, so page code should never need to render `DataTableProvider`\r\n * directly. Kept as a separate component only because `DataTable`'s\r\n * generic type parameter needs a plain (non-generic) child to wrap.\r\n */\r\ninterface DataTableProviderProps {\r\n children: React.ReactNode;\r\n defaultColumnVisibility?: ColumnVisibilityState;\r\n defaultColumnPinning?: ColumnPinningState;\r\n selectionMode?: 'checkbox' | 'radio';\r\n defaultPageSize?: number;\r\n}\r\n\r\nexport function DataTableProvider({\r\n children,\r\n defaultColumnVisibility = {},\r\n defaultColumnPinning = {},\r\n selectionMode,\r\n defaultPageSize,\r\n}: DataTableProviderProps) {\r\n return (\r\n <FilterProvider>\r\n <PaginationProvider defaultPageSize={defaultPageSize}>\r\n <SelectionProvider selectionMode={selectionMode}>\r\n <SortProvider>\r\n <ColumnVisibilityProvider defaultVisibility={defaultColumnVisibility}>\r\n <ColumnPinningProvider defaultPinning={defaultColumnPinning}>\r\n {children}\r\n </ColumnPinningProvider>\r\n </ColumnVisibilityProvider>\r\n </SortProvider>\r\n </SelectionProvider>\r\n </PaginationProvider>\r\n </FilterProvider>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React from 'react';\r\nimport { Checkbox } from '@pulog/ui';\r\nimport { useSelection } from '../contexts/SelectionContext';\r\n\r\ninterface RowCheckboxProps {\r\n rowId: string;\r\n currentPageRowIds?: string[];\r\n}\r\n\r\nexport function RowCheckbox({ rowId, currentPageRowIds }: RowCheckboxProps) {\r\n const { isRowSelected, toggleRow } = useSelection();\r\n\r\n return (\r\n <Checkbox\r\n checked={isRowSelected(rowId)}\r\n onCheckedChange={() => toggleRow(rowId, currentPageRowIds)}\r\n />\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React, { useMemo } from 'react';\r\nimport { Checkbox } from '@pulog/ui';\r\nimport { useSelection } from '../contexts/SelectionContext';\r\n\r\ninterface SelectAllCheckboxProps {\r\n rowIds: string[];\r\n totalCount?: number;\r\n onSelectAllAttempt?: (count: number, confirm: () => void) => void;\r\n}\r\n\r\nexport function SelectAllCheckbox({ rowIds, totalCount, onSelectAllAttempt }: SelectAllCheckboxProps) {\r\n const { rowSelection, isSelectAll, toggleAll } = useSelection();\r\n\r\n const currentPageSelectedCount = useMemo(\r\n () => isSelectAll ? rowIds.length : rowIds.filter((id) => rowSelection[id]).length,\r\n [rowIds, rowSelection, isSelectAll]\r\n );\r\n\r\n const isAllSelected = isSelectAll || (rowIds.length > 0 && currentPageSelectedCount === rowIds.length);\r\n const isIndeterminate = !isSelectAll && currentPageSelectedCount > 0 && currentPageSelectedCount < rowIds.length;\r\n\r\n const handleChange = () => {\r\n if (isAllSelected) {\r\n toggleAll(rowIds, false);\r\n } else {\r\n const confirm = () => toggleAll(rowIds, true, totalCount);\r\n if (onSelectAllAttempt) {\r\n onSelectAllAttempt(totalCount ?? rowIds.length, confirm);\r\n } else {\r\n confirm();\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <Checkbox\r\n checked={isAllSelected}\r\n ref={(element) => {\r\n if (element) {\r\n (element as unknown as HTMLInputElement).indeterminate = isIndeterminate;\r\n }\r\n }}\r\n onCheckedChange={handleChange}\r\n />\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React from 'react';\r\nimport { Button } from '@pulog/ui';\r\nimport { Minus, Plus } from 'lucide-react';\r\nimport { useSelection } from '../contexts/SelectionContext';\r\n\r\ninterface ExpandableRowProps {\r\n rowId: string;\r\n}\r\n\r\nexport function ExpandableRow({ rowId }: ExpandableRowProps) {\r\n const { toggleExpanded, isRowExpanded } = useSelection();\r\n const isExpanded = isRowExpanded(rowId);\r\n\r\n return (\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => toggleExpanded(rowId)}\r\n className=\"relative h-5 w-5 overflow-hidden p-0\"\r\n >\r\n {/* Plus — visible when collapsed */}\r\n <span className={`absolute inset-0 flex items-center justify-center transition-all duration-200 ease-in-out ${\r\n isExpanded ? 'scale-50 opacity-0 rotate-90' : 'scale-100 opacity-100 rotate-0'\r\n }`}>\r\n <Plus className=\"h-3 w-3\" />\r\n </span>\r\n {/* Minus — visible when expanded */}\r\n <span className={`absolute inset-0 flex items-center justify-center transition-all duration-200 ease-in-out ${\r\n isExpanded ? 'scale-100 opacity-100 rotate-0' : 'scale-50 opacity-0 -rotate-90'\r\n }`}>\r\n <Minus className=\"h-3 w-3\" />\r\n </span>\r\n </Button>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React from 'react';\r\nimport { Button } from '@pulog/ui';\r\nimport { Input } from '@pulog/ui';\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from '@pulog/ui';\r\nimport { usePagination } from '../contexts/PaginationContext';\r\nimport { cn } from '@pulog/utils';\r\nimport {\r\n ChevronLeft,\r\n ChevronRight,\r\n ChevronsLeft,\r\n ChevronsRight,\r\n} from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\ninterface TraditionalPaginationProps {\r\n pageSizeOptions?: number[];\r\n}\r\n\r\nexport function TraditionalPagination({\r\n pageSizeOptions = [10, 25, 50, 100],\r\n}: TraditionalPaginationProps) {\r\n const { t } = useTranslation('datatable');\r\n const {\r\n pageIndex,\r\n pageSize,\r\n pageCount,\r\n totalData,\r\n goToPage,\r\n nextPage,\r\n previousPage,\r\n setPageSize,\r\n canGoNext,\r\n canGoPrevious,\r\n } = usePagination();\r\n\r\n const [pageInput, setPageInput] = React.useState(String(pageIndex));\r\n\r\n React.useEffect(() => {\r\n setPageInput(String(pageIndex));\r\n }, [pageIndex]);\r\n\r\n const submitPageInput = () => {\r\n const parsedPage = Number.parseInt(pageInput, 10);\r\n if (!Number.isFinite(parsedPage)) {\r\n setPageInput(String(pageIndex));\r\n return;\r\n }\r\n\r\n const targetPage = Math.min(Math.max(parsedPage, 1), Math.max(pageCount, 1));\r\n setPageInput(String(targetPage));\r\n if (targetPage !== pageIndex) goToPage(targetPage);\r\n };\r\n\r\n const navButtonClass =\r\n \"rounded-none border-0 transition-colors hover:bg-primary hover:text-primary-foreground disabled:hover:bg-background disabled:hover:text-foreground\";\r\n\r\n return (\r\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\r\n {/* Info */}\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"inline-flex items-center rounded-full bg-primary/10 px-2.5 py-1 text-xs font-semibold text-primary\">\r\n {totalData.toLocaleString(\"id-ID\")}\r\n </span>\r\n <span className=\"text-sm text-muted-foreground\">{t('pagination.rows')}</span>\r\n </div>\r\n\r\n {/* Controls */}\r\n <div className=\"flex items-center gap-3\">\r\n {/* Page size selector: kept plain (no border/background wrapper),\r\n just a label and the Select on its own. */}\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-sm text-muted-foreground\">{t('pagination.rowsPerPage')}</span>\r\n <Select value={String(pageSize)} onValueChange={(v) => setPageSize(Number(v))}>\r\n <SelectTrigger className=\"h-8 w-16 font-semibold\" size=\"sm\">\r\n <SelectValue />\r\n </SelectTrigger>\r\n <SelectContent className=\"z-130\" position=\"popper\">\r\n {pageSizeOptions.map((size) => (\r\n <SelectItem key={size} value={String(size)}>\r\n {size}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n\r\n {/* Page indicator: its own connected segment, separate from the nav buttons below.\r\n Borders are declared explicitly on each piece (not via divide-x) — divide-x's\r\n border and this element's own border-0 reset were fighting over the same\r\n edge, so the line between the input and \"dari X\" wasn't reliably showing. */}\r\n <div className=\"inline-flex items-stretch overflow-hidden rounded-md border border-border\">\r\n <span className=\"flex items-center border-r border-border bg-muted px-2.5 text-sm text-muted-foreground\">\r\n {t('pagination.page')}\r\n </span>\r\n <Input\r\n value={pageInput}\r\n onChange={(event) => setPageInput(event.target.value.replace(/\\D/g, ''))}\r\n onFocus={(event) => event.currentTarget.select()}\r\n onBlur={submitPageInput}\r\n onKeyDown={(event) => {\r\n if (event.key === 'Enter') {\r\n event.preventDefault();\r\n submitPageInput();\r\n event.currentTarget.blur();\r\n }\r\n }}\r\n inputMode=\"numeric\"\r\n aria-label=\"Nomor halaman\"\r\n className=\"h-8 w-16 rounded-none border-0 text-center font-semibold shadow-none focus-visible:ring-1 focus-visible:ring-inset\"\r\n />\r\n <span className=\"flex items-center border-l border-border bg-muted px-2.5 text-sm text-muted-foreground\">\r\n {t('pagination.of')} {pageCount.toLocaleString(\"id-ID\")}\r\n </span>\r\n </div>\r\n\r\n {/* Nav buttons: a separate connected group of their own. */}\r\n <div className=\"inline-flex items-stretch overflow-hidden rounded-md border border-border\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon-sm\"\r\n onClick={() => goToPage(1)}\r\n disabled={!canGoPrevious}\r\n title=\"Halaman pertama\"\r\n className={cn(navButtonClass, \"border-r\")}\r\n >\r\n <ChevronsLeft className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon-sm\"\r\n onClick={previousPage}\r\n disabled={!canGoPrevious}\r\n title=\"Halaman sebelumnya\"\r\n className={cn(navButtonClass, \"border-r\")}\r\n >\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon-sm\"\r\n onClick={nextPage}\r\n disabled={!canGoNext}\r\n title=\"Halaman berikutnya\"\r\n className={cn(navButtonClass, \"border-r\")}\r\n >\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon-sm\"\r\n onClick={() => goToPage(pageCount)}\r\n disabled={!canGoNext}\r\n title=\"Halaman terakhir\"\r\n className={navButtonClass}\r\n >\r\n <ChevronsRight className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React from 'react';\r\nimport { Button } from '@pulog/ui';\r\nimport { usePagination } from '../contexts/PaginationContext';\r\nimport { Loader2 } from 'lucide-react';\r\n\r\ninterface InfiniteScrollPaginationProps {\r\n isLoading?: boolean;\r\n onLoadMore?: () => void;\r\n}\r\n\r\nexport function InfiniteScrollPagination({\r\n isLoading = false,\r\n onLoadMore,\r\n}: InfiniteScrollPaginationProps) {\r\n const { pageIndex, totalData, pageSize, pageCount, nextPage } =\r\n usePagination();\r\n\r\n const currentItemsLoaded = pageIndex * pageSize;\r\n const hasMore = currentItemsLoaded < totalData;\r\n\r\n const handleLoadMore = () => {\r\n nextPage();\r\n onLoadMore?.();\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col items-center justify-center gap-4 p-4\">\r\n <div className=\"text-sm text-muted-foreground\">\r\n Loaded {Math.min(currentItemsLoaded, totalData)} of {totalData} items\r\n </div>\r\n\r\n {hasMore ? (\r\n <Button\r\n onClick={handleLoadMore}\r\n disabled={isLoading}\r\n className=\"gap-2\"\r\n >\r\n {isLoading && <Loader2 className=\"h-4 w-4 animate-spin\" />}\r\n {isLoading ? 'Loading...' : 'Load More'}\r\n </Button>\r\n ) : (\r\n <div className=\"text-sm text-muted-foreground\">\r\n All items loaded\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React, { useState, useCallback, useEffect, useRef } from 'react';\r\nimport { Input } from '@pulog/ui';\r\nimport { X, Search } from 'lucide-react';\r\nimport { Button } from '@pulog/ui';\r\nimport { useFilters } from '../contexts/FilterContext';\r\nimport { FilterValue } from '../lib/types';\r\n\r\ninterface SearchFilterProps {\r\n field: string;\r\n label: string;\r\n placeholder?: string;\r\n minSearchLength?: number;\r\n autoApply?: boolean;\r\n allowCommaSeparated?: boolean;\r\n onClose?: () => void;\r\n}\r\n\r\n/**\r\n * Parse comma-separated input into a list of trimmed values.\r\n * Contoh: \"SHIPMENT1, SHIPMENT2\" -> [\"SHIPMENT1\", \"SHIPMENT2\"]\r\n */\r\nfunction parseSearchValue(raw: string): string[] {\r\n return raw\r\n .split(',')\r\n .map((item) => item.trim())\r\n .filter(Boolean);\r\n}\r\n\r\nfunction formatSearchValue(value: any): string {\r\n if (Array.isArray(value)) return value.join(', ');\r\n return String(value ?? '');\r\n}\r\n\r\nexport function SearchFilter({\r\n field,\r\n label,\r\n placeholder = 'Search...',\r\n minSearchLength = 1,\r\n autoApply = false,\r\n allowCommaSeparated = false,\r\n onClose,\r\n}: SearchFilterProps) {\r\n const { filters, addFilter, updateFilter, removeFilter } = useFilters();\r\n const localRemovalRef = useRef(false);\r\n\r\n const existingFilter = filters.find(\r\n (f) => f.field === field && f.type === 'search'\r\n );\r\n\r\n // Initialize from context so value persists when popover is closed & reopened\r\n const [value, setValue] = useState<string>(\r\n existingFilter ? formatSearchValue(existingFilter.value) : ''\r\n );\r\n\r\n // Sync local state if filter is cleared externally (e.g. \"Reset All\")\r\n useEffect(() => {\r\n if (!existingFilter) {\r\n if (localRemovalRef.current) {\r\n localRemovalRef.current = false;\r\n return;\r\n }\r\n setValue('');\r\n } else {\r\n setValue(formatSearchValue(existingFilter.value));\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [existingFilter?.value]);\r\n\r\n const applyFilter = useCallback((raw: string) => {\r\n const trimmed = raw.trim();\r\n if (trimmed.length >= minSearchLength) {\r\n const values = parseSearchValue(trimmed);\r\n const nextValue = allowCommaSeparated && values.length > 1 ? values : trimmed;\r\n const currentValue = formatSearchValue(existingFilter?.value);\r\n\r\n if (existingFilter) {\r\n if (currentValue !== trimmed) {\r\n updateFilter(field, { operator: 'contains', value: nextValue, type: 'search' });\r\n }\r\n } else {\r\n addFilter({\r\n field,\r\n operator: 'contains',\r\n value: nextValue,\r\n type: 'search',\r\n });\r\n }\r\n return;\r\n }\r\n\r\n if (existingFilter) {\r\n localRemovalRef.current = true;\r\n removeFilter(field);\r\n }\r\n }, [existingFilter, field, minSearchLength, allowCommaSeparated, addFilter, updateFilter, removeFilter]);\r\n\r\n useEffect(() => {\r\n if (!autoApply) return;\r\n\r\n const timer = window.setTimeout(() => {\r\n applyFilter(value.trim());\r\n }, 500);\r\n\r\n return () => window.clearTimeout(timer);\r\n }, [value, autoApply, applyFilter]);\r\n\r\n const handleSubmit = useCallback(() => {\r\n applyFilter(value.trim());\r\n onClose?.();\r\n }, [value, applyFilter, onClose]);\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n handleSubmit();\r\n }\r\n },\r\n [handleSubmit]\r\n );\r\n\r\n const handleClear = useCallback(() => {\r\n setValue('');\r\n removeFilter(field);\r\n onClose?.();\r\n }, [field, removeFilter, onClose]);\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n {/* <label className=\"text-sm font-medium\">{label}</label> */}\r\n <div className=\"flex gap-1.5\">\r\n <div className=\"relative flex-1\">\r\n <Input\r\n placeholder={placeholder}\r\n value={value}\r\n onChange={(e) => setValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n className=\"pr-8\"\r\n />\r\n {value && (\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon-xs\"\r\n onClick={handleClear}\r\n aria-label={`Hapus pencarian ${label}`}\r\n className=\"absolute inset-y-0 right-1 my-auto size-7 p-0 transition-colors active:translate-y-0\"\r\n >\r\n <X className=\"size-4\" />\r\n </Button>\r\n )}\r\n </div>\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={handleSubmit}\r\n disabled={value.trim().length < minSearchLength}\r\n className=\"h-9 w-9 shrink-0 rounded-md p-0 transition-colors active:translate-y-0\"\r\n >\r\n <Search className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport {\r\n useEffect,\r\n useState,\r\n} from 'react';\r\n\r\nimport { format } from 'date-fns';\r\n\r\nimport { Button } from '@pulog/ui';\r\nimport { Calendar } from '@pulog/ui';\r\n\r\nimport { useFilters } from '../contexts/FilterContext';\r\n\r\nimport { cn } from '@pulog/utils';\r\n\r\nimport {\r\n formatDateKey,\r\n parseDateValue,\r\n} from '../lib/filter-utils';\r\n\r\n\r\ninterface DateFilterProps {\r\n field: string;\r\n label: string;\r\n onClose?: () => void;\r\n minDate?: string;\r\n maxDate?: string;\r\n}\r\n\r\n\r\nexport function DateFilter({\r\n field,\r\n onClose,\r\n minDate,\r\n maxDate,\r\n}: DateFilterProps) {\r\n\r\n const {\r\n filters,\r\n addFilter,\r\n removeFilter,\r\n } = useFilters();\r\n\r\n\r\n const existingFilter =\r\n filters.find(\r\n (item) =>\r\n item.field === field &&\r\n item.type === 'date'\r\n );\r\n\r\n\r\n const [selectedDate, setSelectedDate] =\r\n useState<Date | undefined>();\r\n\r\n\r\n const [tempSelectedDate, setTempSelectedDate] =\r\n useState<Date | undefined>();\r\n\r\n\r\n const existingValueKey =\r\n existingFilter\r\n ? String(existingFilter.value)\r\n : null;\r\n\r\n\r\n\r\n useEffect(() => {\r\n\r\n const value =\r\n existingFilter?.value as string | undefined;\r\n\r\n\r\n const date =\r\n value\r\n ? parseDateValue(value) ?? undefined\r\n : undefined;\r\n\r\n\r\n setSelectedDate(date);\r\n setTempSelectedDate(date);\r\n\r\n\r\n }, [existingValueKey]);\r\n\r\n\r\n\r\n const handleApply = () => {\r\n\r\n setSelectedDate(\r\n tempSelectedDate\r\n );\r\n\r\n\r\n removeFilter(field);\r\n\r\n\r\n if (tempSelectedDate) {\r\n\r\n const normalizedDate =\r\n formatDateKey(\r\n tempSelectedDate\r\n );\r\n\r\n\r\n if (normalizedDate) {\r\n\r\n addFilter({\r\n field,\r\n operator: 'equals',\r\n value: normalizedDate,\r\n type: 'date',\r\n });\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n onClose?.();\r\n\r\n };\r\n\r\n\r\n\r\n const handleReset = () => {\r\n\r\n setSelectedDate(undefined);\r\n setTempSelectedDate(undefined);\r\n\r\n\r\n removeFilter(field);\r\n\r\n\r\n onClose?.();\r\n\r\n };\r\n\r\n\r\n\r\n return (\r\n\r\n <div\r\n className={cn(\r\n 'w-full',\r\n 'space-y-3'\r\n )}\r\n >\r\n\r\n\r\n {\r\n tempSelectedDate && (\r\n\r\n <div\r\n className={cn(\r\n 'rounded-md',\r\n 'border',\r\n 'px-3',\r\n 'py-2',\r\n 'text-center',\r\n 'text-xs',\r\n 'font-medium'\r\n )}\r\n >\r\n\r\n {\r\n format(\r\n tempSelectedDate,\r\n 'dd MMM yyyy'\r\n )\r\n }\r\n\r\n </div>\r\n\r\n )\r\n }\r\n\r\n\r\n\r\n <Calendar\r\n mode=\"single\"\r\n defaultMonth={parseDateValue(minDate) ?? undefined}\r\n startMonth={parseDateValue(minDate) ?? undefined}\r\n endMonth={parseDateValue(maxDate) ?? undefined}\r\n disabled={[\r\n ...(parseDateValue(minDate) ? [{ before: parseDateValue(minDate)! }] : []),\r\n ...(parseDateValue(maxDate) ? [{ after: parseDateValue(maxDate)! }] : []),\r\n ]}\r\n selected={tempSelectedDate}\r\n onSelect={\r\n setTempSelectedDate\r\n }\r\n captionLayout=\"dropdown\"\r\n />\r\n\r\n\r\n\r\n <div\r\n className={cn(\r\n 'flex',\r\n 'items-center',\r\n 'justify-end',\r\n 'gap-2',\r\n 'border-t',\r\n 'bg-muted/40',\r\n 'px-2',\r\n 'pt-2'\r\n )}\r\n >\r\n\r\n <Button\r\n size=\"sm\"\r\n onClick={handleReset}\r\n className={cn(\r\n 'h-7',\r\n 'rounded-md',\r\n 'bg-destructive',\r\n 'px-3',\r\n 'text-xs',\r\n 'text-destructive-foreground',\r\n 'hover:bg-destructive/90'\r\n )}\r\n >\r\n\r\n Reset\r\n\r\n </Button>\r\n\r\n\r\n <Button\r\n size=\"sm\"\r\n onClick={handleApply}\r\n className={cn(\r\n 'h-7',\r\n 'rounded-md',\r\n 'px-3',\r\n 'text-xs'\r\n )}\r\n >\r\n\r\n Apply\r\n\r\n </Button>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n );\r\n\r\n}","'use client';\r\n\r\nimport {\r\n useEffect,\r\n useState,\r\n} from 'react';\r\n\r\nimport { format } from 'date-fns';\r\nimport { enUS } from 'date-fns/locale';\r\nimport { DateRange } from 'react-day-picker';\r\nimport { enUS as dayPickerEnUS } from 'react-day-picker/locale';\r\n\r\nimport { Button } from '@pulog/ui';\r\nimport { Calendar } from '@pulog/ui';\r\n\r\nimport { cn } from '@pulog/utils';\r\n\r\nimport {\r\n formatDateKey,\r\n parseDateValue,\r\n} from '../lib/filter-utils';\r\n\r\nimport { useFilters } from '../contexts/FilterContext';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n\r\ninterface DateRangeFilterProps {\r\n field: string;\r\n label: string;\r\n onClose?: () => void;\r\n showReset?: boolean;\r\n minDate?: string;\r\n maxDate?: string;\r\n}\r\n\r\n\r\nfunction getRangeLabel(\r\n range?: DateRange,\r\n defaultLabel?: string\r\n) {\r\n\r\n if (!range?.from) {\r\n return defaultLabel;\r\n }\r\n\r\n\r\n if (!range.to) {\r\n\r\n return format(\r\n range.from,\r\n 'dd MMM yyyy',\r\n { locale: enUS }\r\n );\r\n\r\n }\r\n\r\n\r\n return `\r\n ${format(range.from, 'dd MMM yyyy', { locale: enUS })}\r\n -\r\n ${format(range.to, 'dd MMM yyyy', { locale: enUS })}\r\n `;\r\n\r\n}\r\n\r\n\r\n\r\nexport function DateRangeFilter({\r\n field,\r\n onClose,\r\n showReset = true,\r\n minDate,\r\n maxDate,\r\n}: DateRangeFilterProps) {\r\n\r\n\r\n const {\r\n filters,\r\n addFilter,\r\n removeFilter,\r\n } = useFilters();\r\n\r\n const { t } = useTranslation('datatable');\r\n\r\n\r\n\r\n const existingFilter =\r\n filters.find(\r\n (item) =>\r\n item.field === field &&\r\n item.type === 'dateRange'\r\n );\r\n\r\n\r\n\r\n const [selectedRange, setSelectedRange] =\r\n useState<DateRange | undefined>();\r\n\r\n\r\n const [tempSelectedRange, setTempSelectedRange] =\r\n useState<DateRange | undefined>();\r\n\r\n\r\n\r\n const existingValueKey =\r\n existingFilter\r\n ? JSON.stringify(existingFilter.value)\r\n : null;\r\n\r\n\r\n\r\n useEffect(() => {\r\n\r\n const value =\r\n existingFilter?.value as\r\n | [string, string]\r\n | undefined;\r\n\r\n\r\n if (!value?.[0] || !value?.[1]) {\r\n\r\n setSelectedRange(undefined);\r\n setTempSelectedRange(undefined);\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n const range = {\r\n from:\r\n parseDateValue(value[0]) ??\r\n undefined,\r\n\r\n to:\r\n parseDateValue(value[1]) ??\r\n undefined,\r\n };\r\n\r\n\r\n setSelectedRange(range);\r\n setTempSelectedRange(range);\r\n\r\n\r\n }, [existingValueKey]);\r\n\r\n\r\n\r\n const handleApply = () => {\r\n\r\n setSelectedRange(\r\n tempSelectedRange\r\n );\r\n\r\n\r\n removeFilter(field);\r\n\r\n\r\n if (\r\n tempSelectedRange?.from &&\r\n tempSelectedRange?.to\r\n ) {\r\n\r\n const fromValue =\r\n formatDateKey(\r\n tempSelectedRange.from\r\n );\r\n\r\n\r\n const toValue =\r\n formatDateKey(\r\n tempSelectedRange.to\r\n );\r\n\r\n\r\n if (\r\n fromValue &&\r\n toValue\r\n ) {\r\n\r\n addFilter({\r\n field,\r\n operator: 'dateRange',\r\n value: [\r\n fromValue,\r\n toValue,\r\n ],\r\n type: 'dateRange',\r\n });\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n onClose?.();\r\n\r\n };\r\n\r\n\r\n\r\n const handleReset = () => {\r\n\r\n setSelectedRange(undefined);\r\n setTempSelectedRange(undefined);\r\n\r\n\r\n removeFilter(field);\r\n\r\n\r\n onClose?.();\r\n\r\n };\r\n\r\n\r\n\r\n return (\r\n\r\n <div\r\n className={cn(\r\n 'w-full',\r\n 'space-y-3'\r\n )}\r\n >\r\n\r\n\r\n <div\r\n className={cn(\r\n 'rounded-md',\r\n 'border',\r\n 'px-3',\r\n 'py-2',\r\n 'text-center',\r\n 'text-xs',\r\n 'font-medium'\r\n )}\r\n >\r\n\r\n {\r\n getRangeLabel(\r\n tempSelectedRange,\r\n t('selectDateRange')\r\n )\r\n }\r\n\r\n </div>\r\n\r\n\r\n\r\n <Calendar\r\n mode=\"range\"\r\n defaultMonth={parseDateValue(minDate) ?? undefined}\r\n startMonth={parseDateValue(minDate) ?? undefined}\r\n endMonth={parseDateValue(maxDate) ?? undefined}\r\n disabled={[\r\n ...(parseDateValue(minDate) ? [{ before: parseDateValue(minDate)! }] : []),\r\n ...(parseDateValue(maxDate) ? [{ after: parseDateValue(maxDate)! }] : []),\r\n ]}\r\n selected={\r\n tempSelectedRange\r\n }\r\n onSelect={\r\n setTempSelectedRange\r\n }\r\n numberOfMonths={2}\r\n captionLayout=\"dropdown\"\r\n locale={dayPickerEnUS}\r\n />\r\n\r\n\r\n\r\n <div\r\n className={cn(\r\n 'flex',\r\n 'items-center',\r\n 'justify-end',\r\n 'gap-2',\r\n 'border-t',\r\n 'bg-muted/40',\r\n 'px-2',\r\n 'pt-2'\r\n )}\r\n >\r\n\r\n {showReset && (\r\n <Button\r\n size=\"sm\"\r\n onClick={handleReset}\r\n className={cn(\r\n 'h-7',\r\n 'rounded-md',\r\n 'bg-destructive',\r\n 'px-3',\r\n 'text-xs',\r\n 'text-destructive-foreground',\r\n 'hover:bg-destructive/90'\r\n )}\r\n >\r\n\r\n Reset\r\n\r\n </Button>\r\n )}\r\n\r\n\r\n\r\n <Button\r\n size=\"sm\"\r\n onClick={handleApply}\r\n disabled={\r\n !tempSelectedRange?.from ||\r\n !tempSelectedRange?.to\r\n }\r\n className={cn(\r\n 'h-7',\r\n 'rounded-md',\r\n 'px-3',\r\n 'text-xs'\r\n )}\r\n >\r\n\r\n Apply\r\n\r\n </Button>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n );\r\n\r\n}","'use client';\r\n\r\nimport React, {\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from 'react';\r\n\r\nimport { Check } from 'lucide-react';\r\n\r\nimport { Button } from '@pulog/ui';\r\nimport { Input } from '@pulog/ui';\r\n\r\nimport { useFilters } from '../contexts/FilterContext';\r\nimport { FilterOption } from '../lib/types';\r\nimport { cn } from '@pulog/utils';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n\r\ninterface SelectFilterProps {\r\n field: string;\r\n label: string;\r\n options: FilterOption[];\r\n placeholder?: string;\r\n onClose?: () => void;\r\n}\r\n\r\n\r\nconst LIMIT_RENDER = 50;\r\n\r\n\r\nexport function SelectFilter({\r\n field,\r\n options,\r\n placeholder = 'Search...',\r\n onClose,\r\n}: SelectFilterProps) {\r\n\r\n const {\r\n addFilter,\r\n removeFilter,\r\n getFieldFilters,\r\n } = useFilters();\r\n\r\n const { t } = useTranslation('datatable');\r\n\r\n const [search, setSearch] =\r\n useState('');\r\n\r\n\r\n const existingFilter =\r\n getFieldFilters(field)\r\n .find(\r\n (item) =>\r\n item.type === 'select'\r\n );\r\n\r\n\r\n const [selectedValue, setSelectedValue] =\r\n useState('');\r\n\r\n\r\n const [tempSelectedValue, setTempSelectedValue] =\r\n useState('');\r\n\r\n\r\n const existingValueKey =\r\n existingFilter\r\n ? JSON.stringify(existingFilter.value)\r\n : null;\r\n\r\n\r\n useEffect(() => {\r\n\r\n const value =\r\n existingFilter\r\n ? String(existingFilter.value)\r\n : '';\r\n\r\n\r\n setSelectedValue(value);\r\n setTempSelectedValue(value);\r\n\r\n\r\n }, [existingValueKey]);\r\n\r\n\r\n\r\n const filteredOptions = useMemo(() => {\r\n\r\n if (!search) {\r\n return options;\r\n }\r\n\r\n\r\n return options.filter((item) =>\r\n item.label\r\n .toLowerCase()\r\n .includes(\r\n search.toLowerCase()\r\n )\r\n );\r\n\r\n\r\n }, [\r\n options,\r\n search,\r\n ]);\r\n\r\n\r\n\r\n const visibleOptions = useMemo(() => {\r\n\r\n return filteredOptions.slice(\r\n 0,\r\n LIMIT_RENDER\r\n );\r\n\r\n\r\n }, [filteredOptions]);\r\n\r\n\r\n\r\n const handleSelect = (\r\n value: string\r\n ) => {\r\n\r\n setTempSelectedValue(value);\r\n\r\n };\r\n\r\n\r\n\r\n const handleApply = () => {\r\n\r\n setSelectedValue(\r\n tempSelectedValue\r\n );\r\n\r\n\r\n removeFilter(field);\r\n\r\n\r\n if (tempSelectedValue) {\r\n\r\n addFilter({\r\n field,\r\n operator: 'equals',\r\n value: tempSelectedValue,\r\n type: 'select',\r\n });\r\n\r\n }\r\n\r\n\r\n onClose?.();\r\n\r\n };\r\n\r\n\r\n\r\n const handleReset = () => {\r\n\r\n setSelectedValue('');\r\n setTempSelectedValue('');\r\n setSearch('');\r\n\r\n\r\n removeFilter(field);\r\n\r\n\r\n onClose?.();\r\n\r\n };\r\n\r\n\r\n\r\n return (\r\n\r\n <div\r\n className={cn(\r\n 'w-full',\r\n 'space-y-2'\r\n )}\r\n >\r\n\r\n\r\n {/* SEARCH */}\r\n <Input\r\n value={search}\r\n placeholder={placeholder}\r\n onChange={(event) =>\r\n setSearch(\r\n event.target.value\r\n )\r\n }\r\n className={cn(\r\n 'h-9',\r\n 'rounded-lg',\r\n 'text-xs'\r\n )}\r\n />\r\n\r\n\r\n\r\n {/* TOTAL INFO */}\r\n <div\r\n className={cn(\r\n 'flex',\r\n 'items-center',\r\n 'justify-between',\r\n 'px-1',\r\n 'text-[11px]',\r\n 'text-muted-foreground'\r\n )}\r\n >\r\n\r\n <span>\r\n\r\n Showing {visibleOptions.length}\r\n {' '}of{' '}\r\n {filteredOptions.length}\r\n {' '}data\r\n\r\n </span>\r\n\r\n\r\n {\r\n filteredOptions.length !==\r\n options.length && (\r\n\r\n <span>\r\n Total {options.length}\r\n </span>\r\n\r\n )\r\n }\r\n\r\n </div>\r\n\r\n\r\n\r\n {/* LIST */}\r\n <div\r\n className={cn(\r\n 'max-h-45',\r\n 'overflow-y-auto',\r\n 'space-y-1',\r\n 'pr-1'\r\n )}\r\n >\r\n\r\n {\r\n visibleOptions.length === 0 && (\r\n\r\n <div\r\n className={cn(\r\n 'py-6',\r\n 'text-center',\r\n 'text-xs',\r\n 'text-muted-foreground'\r\n )}\r\n >\r\n\r\n {t('filters.select.dataNotFound')}\r\n\r\n </div>\r\n\r\n )\r\n }\r\n\r\n\r\n {\r\n visibleOptions.map(\r\n (option) => {\r\n\r\n const value =\r\n String(\r\n option.value\r\n );\r\n\r\n\r\n const active =\r\n tempSelectedValue ===\r\n value;\r\n\r\n\r\n return (\r\n\r\n <button\r\n key={value}\r\n type=\"button\"\r\n onClick={() =>\r\n handleSelect(\r\n value\r\n )\r\n }\r\n className={cn(\r\n 'flex',\r\n 'w-full',\r\n 'items-center',\r\n 'justify-between',\r\n 'rounded-md',\r\n 'px-2',\r\n 'py-1.5',\r\n 'text-left',\r\n 'text-xs',\r\n 'hover:bg-muted',\r\n\r\n active &&\r\n 'bg-muted'\r\n )}\r\n >\r\n\r\n <span\r\n className={cn(\r\n 'truncate'\r\n )}\r\n >\r\n\r\n {option.label}\r\n\r\n </span>\r\n\r\n\r\n {\r\n active && (\r\n\r\n <Check\r\n className={cn(\r\n 'size-4',\r\n 'text-primary'\r\n )}\r\n />\r\n\r\n )\r\n }\r\n\r\n </button>\r\n\r\n );\r\n\r\n }\r\n )\r\n }\r\n\r\n\r\n </div>\r\n\r\n\r\n\r\n {/* FOOTER */}\r\n <div\r\n className={cn(\r\n 'flex',\r\n 'items-center',\r\n 'justify-end',\r\n 'gap-2',\r\n 'border-t',\r\n 'bg-muted/40',\r\n 'px-2',\r\n 'pt-2'\r\n )}\r\n >\r\n\r\n <Button\r\n size=\"sm\"\r\n onClick={handleReset}\r\n className={cn(\r\n 'h-7',\r\n 'rounded-md',\r\n 'bg-destructive',\r\n 'px-3',\r\n 'text-xs',\r\n 'text-destructive-foreground',\r\n 'hover:bg-destructive/90'\r\n )}\r\n >\r\n\r\n Reset\r\n\r\n </Button>\r\n\r\n\r\n <Button\r\n size=\"sm\"\r\n onClick={handleApply}\r\n className={cn(\r\n 'h-7',\r\n 'rounded-md',\r\n 'px-3',\r\n 'text-xs'\r\n )}\r\n >\r\n\r\n Apply\r\n\r\n </Button>\r\n\r\n </div>\r\n </div>\r\n );\r\n}","'use client';\r\n\r\nimport React, {\r\n useEffect,\r\n useMemo,\r\n useState,\r\n useRef,\r\n useCallback,\r\n} from 'react';\r\n\r\nimport { Button } from '@pulog/ui';\r\nimport { Checkbox } from '@pulog/ui';\r\nimport { Input } from '@pulog/ui';\r\nimport { Loader2 } from 'lucide-react';\r\n\r\nimport { useFilters } from '../contexts/FilterContext';\r\nimport { FilterOption } from '../lib/types';\r\nimport { cn } from '@pulog/utils';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n\r\ninterface MultiSelectFilterProps {\r\n field: string;\r\n label: string;\r\n options: FilterOption[];\r\n placeholder?: string;\r\n searchPlaceholder?: string;\r\n minSearchLength?: number;\r\n onClose?: () => void;\r\n onSearch?: (query: string) => Promise<FilterOption[]>;\r\n /** Teks pencarian terakhir (dipulihkan oleh parent yang tidak ikut unmount saat popover ditutup) */\r\n initialSearch?: string;\r\n /** Dipanggil setiap kali teks pencarian berubah, supaya parent bisa mempertahankannya antar buka/tutup popover */\r\n onSearchChange?: (value: string) => void;\r\n}\r\n\r\n\r\nconst LIMIT_RENDER = 50;\r\nconst DEBOUNCE_MS = 500;\r\n\r\n\r\nexport function MultiSelectFilter({\r\n field,\r\n options,\r\n placeholder = 'Search...',\r\n searchPlaceholder,\r\n minSearchLength = 0,\r\n onClose,\r\n onSearch,\r\n initialSearch = '',\r\n onSearchChange,\r\n}: MultiSelectFilterProps) {\r\n\r\n const {\r\n filters,\r\n addFilter,\r\n removeFilter,\r\n } = useFilters();\r\n\r\n const { t } = useTranslation('datatable');\r\n\r\n const [search, setSearch] = useState(initialSearch);\r\n const [items, setItems] = useState<FilterOption[]>(options);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const isServer = !!onSearch;\r\n const debounceRef = useRef<ReturnType<typeof setTimeout>>();\r\n const searchRequestRef = useRef(0);\r\n\r\n\r\n const existingFilter =\r\n filters.find(\r\n (item) =>\r\n item.field === field &&\r\n item.type === 'multiSelect'\r\n );\r\n\r\n\r\n const [selectedValues, setSelectedValues] =\r\n useState<string[]>([]);\r\n\r\n\r\n const [tempSelectedValues, setTempSelectedValues] =\r\n useState<string[]>([]);\r\n\r\n\r\n const existingValueKey =\r\n existingFilter\r\n ? JSON.stringify(existingFilter.value)\r\n : null;\r\n\r\n\r\n useEffect(() => {\r\n\r\n const values =\r\n existingFilter\r\n ? existingFilter.value as string[]\r\n : [];\r\n\r\n\r\n setSelectedValues(values);\r\n setTempSelectedValues(values);\r\n\r\n\r\n }, [existingValueKey]);\r\n\r\n // Server-side: initial load + debounced search\r\n const runSearch = useCallback(async (query: string) => {\r\n if (!onSearch) return;\r\n\r\n const requestId = ++searchRequestRef.current;\r\n setLoading(true);\r\n try {\r\n const result = await onSearch(query);\r\n if (requestId === searchRequestRef.current) {\r\n setItems(result);\r\n }\r\n } catch {\r\n if (requestId === searchRequestRef.current) {\r\n setItems([]);\r\n }\r\n } finally {\r\n if (requestId === searchRequestRef.current) {\r\n setLoading(false);\r\n }\r\n }\r\n }, [onSearch]);\r\n\r\n useEffect(() => {\r\n if (!isServer) return;\r\n runSearch(initialSearch.trim());\r\n // Hanya perlu dijalankan sekali saat mount, dengan nilai search yang sudah dipulihkan.\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isServer, runSearch]);\r\n\r\n useEffect(() => () => {\r\n if (debounceRef.current) clearTimeout(debounceRef.current);\r\n searchRequestRef.current += 1;\r\n }, []);\r\n\r\n const handleSearchChange = (value: string) => {\r\n setSearch(value);\r\n onSearchChange?.(value);\r\n\r\n if (!isServer) return;\r\n\r\n if (debounceRef.current) clearTimeout(debounceRef.current);\r\n const trimmedValue = value.trim();\r\n if (trimmedValue.length > 0 && trimmedValue.length < minSearchLength) {\r\n searchRequestRef.current += 1;\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n debounceRef.current = setTimeout(() => {\r\n runSearch(trimmedValue);\r\n }, trimmedValue ? DEBOUNCE_MS : 0);\r\n };\r\n\r\n // Client-side filtering\r\n const filteredOptions = useMemo(() => {\r\n if (isServer) return items;\r\n\r\n if (!search) {\r\n return options;\r\n }\r\n\r\n\r\n const keyword =\r\n search.toLowerCase();\r\n\r\n\r\n return options.filter((item) =>\r\n item.label\r\n .toLowerCase()\r\n .includes(keyword)\r\n );\r\n\r\n\r\n }, [\r\n isServer,\r\n items,\r\n options,\r\n search,\r\n ]);\r\n\r\n\r\n const visibleOptions = useMemo(() => {\r\n\r\n return filteredOptions.slice(\r\n 0,\r\n LIMIT_RENDER\r\n );\r\n\r\n\r\n }, [filteredOptions]);\r\n\r\n const allBaseValues = useMemo(\r\n () => Array.from(new Set((isServer ? items : options).map((item) => String(item.value)))),\r\n [isServer, items, options]\r\n );\r\n\r\n const isAllBaseValuesSelected = useMemo(() => {\r\n if (allBaseValues.length === 0) return false;\r\n if (tempSelectedValues.length !== allBaseValues.length) return false;\r\n\r\n const selectedSet = new Set(tempSelectedValues);\r\n return allBaseValues.every((value) => selectedSet.has(value));\r\n }, [allBaseValues, tempSelectedValues]);\r\n\r\n const toggleOption = (\r\n value: string\r\n ) => {\r\n\r\n setTempSelectedValues(\r\n (prev) =>\r\n prev.includes(value)\r\n ? prev.filter(\r\n (item) =>\r\n item !== value\r\n )\r\n : [\r\n ...prev,\r\n value,\r\n ]\r\n );\r\n\r\n\r\n };\r\n\r\n\r\n const handleSelectAll = () => {\r\n\r\n if (isAllBaseValuesSelected) {\r\n\r\n setTempSelectedValues([]);\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n setTempSelectedValues(allBaseValues);\r\n\r\n };\r\n\r\n\r\n const handleApply = () => {\r\n setSelectedValues(tempSelectedValues);\r\n\r\n removeFilter(field);\r\n\r\n if (tempSelectedValues.length > 0) {\r\n addFilter({\r\n field,\r\n operator: 'in',\r\n value: tempSelectedValues,\r\n type: 'multiSelect',\r\n });\r\n }\r\n\r\n onClose?.();\r\n };\r\n\r\n\r\n const handleReset = () => {\r\n setSelectedValues([]);\r\n setTempSelectedValues([]);\r\n setSearch('');\r\n onSearchChange?.('');\r\n\r\n removeFilter(field);\r\n\r\n onClose?.();\r\n };\r\n\r\n // Keep selected values that are not in current items (from previous searches)\r\n const allKnownOptions = useMemo(() => {\r\n const map = new Map<string, FilterOption>();\r\n items.forEach((o) => map.set(String(o.value), o));\r\n tempSelectedValues.forEach((v) => {\r\n if (!map.has(v)) map.set(v, { value: v, label: v });\r\n });\r\n return map;\r\n }, [items, tempSelectedValues]);\r\n\r\n const allOptionCount = isServer ? filteredOptions.length : options.length;\r\n\r\n return (\r\n\r\n <div\r\n className={cn(\r\n 'w-full',\r\n 'space-y-2'\r\n )}\r\n >\r\n\r\n\r\n {/* HEADER */}\r\n <div\r\n className={cn(\r\n 'flex',\r\n 'items-center',\r\n 'justify-between',\r\n 'border-b',\r\n 'px-2',\r\n 'pb-2',\r\n 'text-xs'\r\n )}\r\n >\r\n\r\n <button\r\n type=\"button\"\r\n onClick={handleSelectAll}\r\n className={cn(\r\n 'flex',\r\n 'items-center',\r\n 'gap-2'\r\n )}\r\n >\r\n\r\n <Checkbox\r\n checked={isAllBaseValuesSelected}\r\n className={cn(\r\n 'size-4'\r\n )}\r\n />\r\n\r\n\r\n <span>\r\n {t('filters.multiSelect.selectAll')}\r\n </span>\r\n\r\n </button>\r\n\r\n\r\n <span>\r\n {\r\n tempSelectedValues.length\r\n } {t('filters.multiSelect.selected')}\r\n </span>\r\n\r\n </div>\r\n\r\n\r\n\r\n {/* SEARCH */}\r\n <div className=\"relative\">\r\n <Input\r\n value={search}\r\n placeholder={searchPlaceholder ?? placeholder}\r\n onChange={(event) =>\r\n handleSearchChange(\r\n event.target.value\r\n )\r\n }\r\n className={cn(\r\n 'h-9',\r\n 'rounded-lg',\r\n 'text-xs',\r\n isServer && 'pr-8'\r\n )}\r\n />\r\n {isServer && loading && (\r\n <Loader2 className=\"absolute right-2.5 top-1/2 -translate-y-1/2 size-4 animate-spin text-muted-foreground\" />\r\n )}\r\n </div>\r\n\r\n {/* INFO TOTAL DATA */}\r\n <div\r\n className={cn(\r\n 'flex',\r\n 'items-center',\r\n 'justify-between',\r\n 'px-1',\r\n 'text-[11px]',\r\n 'text-muted-foreground'\r\n )}\r\n >\r\n\r\n <span>\r\n {isServer ? t('filters.multiSelect.result') : t('filters.multiSelect.showing')} {(visibleOptions.length || 0).toLocaleString('id-ID')}\r\n {' '}from{' '}\r\n {(filteredOptions.length || 0).toLocaleString('id-ID')}\r\n {' '}data\r\n </span>\r\n\r\n\r\n {\r\n !isServer && filteredOptions.length !== options.length && (\r\n\r\n <span>\r\n Total {options.length}\r\n </span>\r\n\r\n )\r\n }\r\n\r\n </div>\r\n\r\n\r\n {/* LIST */}\r\n <div\r\n className={cn(\r\n 'max-h-45',\r\n 'overflow-y-auto',\r\n 'space-y-1',\r\n 'pr-1'\r\n )}\r\n >\r\n\r\n {\r\n visibleOptions.length === 0 && !loading && (\r\n\r\n <div\r\n className={cn(\r\n 'py-6',\r\n 'text-center',\r\n 'text-xs',\r\n 'text-muted-foreground'\r\n )}\r\n >\r\n\r\n {t('filters.multiSelect.dataNotFound')}\r\n\r\n </div>\r\n\r\n )\r\n }\r\n\r\n {\r\n visibleOptions.map(\r\n (option) => {\r\n\r\n const value =\r\n String(\r\n option.value\r\n );\r\n\r\n\r\n const checked =\r\n tempSelectedValues\r\n .includes(\r\n value\r\n );\r\n\r\n\r\n return (\r\n\r\n <button\r\n key={value}\r\n type=\"button\"\r\n onClick={() =>\r\n toggleOption(\r\n value\r\n )\r\n }\r\n className={cn(\r\n 'flex',\r\n 'w-full',\r\n 'items-start',\r\n 'gap-2',\r\n 'rounded-md',\r\n 'px-2',\r\n 'py-1.5',\r\n 'text-left',\r\n 'text-xs',\r\n 'hover:bg-muted'\r\n )}\r\n >\r\n\r\n <Checkbox\r\n checked={checked}\r\n className={cn(\r\n 'mt-0.5',\r\n 'size-4',\r\n 'pointer-events-none'\r\n )}\r\n />\r\n\r\n\r\n <span\r\n className={cn(\r\n 'leading-snug'\r\n )}\r\n >\r\n {\r\n option.label\r\n }\r\n </span>\r\n\r\n\r\n </button>\r\n\r\n );\r\n\r\n }\r\n )\r\n }\r\n\r\n </div>\r\n\r\n\r\n\r\n {/* FOOTER */}\r\n <div\r\n className={cn(\r\n 'flex',\r\n 'items-center',\r\n 'justify-end',\r\n 'gap-2',\r\n 'border-t',\r\n 'bg-muted/40',\r\n 'px-2',\r\n 'pt-2'\r\n )}\r\n >\r\n\r\n <Button\r\n size=\"sm\"\r\n onClick={handleReset}\r\n className={cn(\r\n 'h-7',\r\n 'rounded-md',\r\n 'bg-destructive',\r\n 'px-3',\r\n 'text-xs',\r\n 'text-destructive-foreground',\r\n 'hover:bg-destructive/90'\r\n )}\r\n >\r\n\r\n Reset\r\n\r\n </Button>\r\n\r\n\r\n <Button\r\n size=\"sm\"\r\n onClick={handleApply}\r\n className={cn(\r\n 'h-7',\r\n 'rounded-md',\r\n 'px-3',\r\n 'text-xs'\r\n )}\r\n >\r\n\r\n Apply\r\n\r\n </Button>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n );\r\n\r\n}\r\n","'use client';\r\n\r\nimport React from 'react';\r\nimport { Checkbox } from '@pulog/ui';\r\nimport { useFilters } from '../contexts/FilterContext';\r\n\r\ninterface CheckboxFilterProps {\r\n field: string;\r\n label: string;\r\n}\r\n\r\nexport function CheckboxFilter({ field, label }: CheckboxFilterProps) {\r\n const { filters, addFilter, removeFilter } = useFilters();\r\n\r\n const existingFilter = filters.find(\r\n (f) => f.field === field && f.type === 'checkbox'\r\n );\r\n const isChecked = !!existingFilter;\r\n\r\n const handleChange = (checked: boolean) => {\r\n removeFilter(field);\r\n if (checked) {\r\n addFilter({\r\n field,\r\n operator: 'equals',\r\n value: true,\r\n type: 'checkbox',\r\n });\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center space-x-2\">\r\n <Checkbox\r\n id={field}\r\n checked={isChecked}\r\n onCheckedChange={(checked) => handleChange(checked as boolean)}\r\n />\r\n <label\r\n htmlFor={field}\r\n className=\"text-sm font-medium cursor-pointer\"\r\n >\r\n {label}\r\n </label>\r\n </div>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { Input } from '@pulog/ui';\r\nimport { Button } from '@pulog/ui';\r\nimport { useFilters } from '../contexts/FilterContext';\r\n\r\ninterface RangeFilterProps {\r\n field: string;\r\n label: string;\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n}\r\n\r\nexport function RangeFilter({\r\n field,\r\n label,\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n}: RangeFilterProps) {\r\n const { filters, addFilter, removeFilter } = useFilters();\r\n\r\n const existingFilter = filters.find(\r\n (f) => f.field === field && f.type === 'range'\r\n );\r\n\r\n const existingRange = existingFilter?.value as [number, number] | undefined;\r\n\r\n const [minValue, setMinValue] = useState<number>(existingRange ? existingRange[0] : min);\r\n const [maxValue, setMaxValue] = useState<number>(existingRange ? existingRange[1] : max);\r\n\r\n // Use a stable string key to avoid firing on every re-render\r\n const existingValueKey = existingFilter ? JSON.stringify(existingFilter.value) : null;\r\n\r\n // Sync local state only when the actual filter value changes (not every render)\r\n useEffect(() => {\r\n if (!existingFilter) {\r\n setMinValue(min);\r\n setMaxValue(max);\r\n } else if (existingFilter.value) {\r\n const [eMin, eMax] = existingFilter.value as [number, number];\r\n setMinValue(eMin);\r\n setMaxValue(eMax);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [existingValueKey, min, max]);\r\n\r\n const handleApply = () => {\r\n removeFilter(field);\r\n if (minValue < maxValue) {\r\n addFilter({\r\n field,\r\n operator: 'between',\r\n value: [minValue, maxValue],\r\n type: 'range',\r\n });\r\n }\r\n };\r\n\r\n const handleClear = () => {\r\n setMinValue(min);\r\n setMaxValue(max);\r\n removeFilter(field);\r\n };\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n <label className=\"text-sm font-medium\">{label}</label>\r\n <div className=\"space-y-2\">\r\n <div className=\"flex gap-2\">\r\n <div className=\"flex-1\">\r\n <label className=\"text-xs text-muted-foreground\">Min</label>\r\n <Input\r\n type=\"number\"\r\n min={min}\r\n max={maxValue - step}\r\n step={step}\r\n value={minValue}\r\n onChange={(e) => setMinValue(Number(e.target.value))}\r\n className=\"h-8\"\r\n />\r\n </div>\r\n <div className=\"flex-1\">\r\n <label className=\"text-xs text-muted-foreground\">Max</label>\r\n <Input\r\n type=\"number\"\r\n min={minValue + step}\r\n max={max}\r\n step={step}\r\n value={maxValue}\r\n onChange={(e) => setMaxValue(Number(e.target.value))}\r\n className=\"h-8\"\r\n />\r\n </div>\r\n </div>\r\n <div className=\"text-xs text-muted-foreground\">\r\n Range: {minValue} - {maxValue}\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <Button size=\"sm\" variant=\"default\" onClick={handleApply}>\r\n Apply\r\n </Button>\r\n {existingFilter && (\r\n <Button size=\"sm\" variant=\"outline\" onClick={handleClear}>\r\n Clear\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\nimport { ChevronDown, ChevronRight, Search } from 'lucide-react';\r\nimport { Button } from '@pulog/ui';\r\nimport { Checkbox } from '@pulog/ui';\r\nimport { Input } from '@pulog/ui';\r\nimport { useFilters } from '../contexts/FilterContext';\r\nimport { FilterOption } from '../lib/types';\r\nimport { cn } from '@pulog/utils';\r\n\r\nconst BULAN = [\r\n 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',\r\n 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember',\r\n];\r\n\r\ntype TreeDay = { date: string; label: string }\r\ntype TreeMonth = { year: number; month: number; label: string; days: TreeDay[] }\r\ntype TreeYear = { year: number; label: string; months: TreeMonth[] }\r\n\r\nfunction buildTree(options: FilterOption[]): TreeYear[] {\r\n const map = new Map<number, Map<number, TreeDay[]>>();\r\n\r\n for (const opt of options) {\r\n const str = String(opt.value);\r\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(str);\r\n if (!match) continue;\r\n const year = Number(match[1]);\r\n const month = Number(match[2]);\r\n const day = Number(match[3]);\r\n\r\n if (!map.has(year)) map.set(year, new Map());\r\n const monthMap = map.get(year)!;\r\n if (!monthMap.has(month)) monthMap.set(month, []);\r\n monthMap.get(month)!.push({ date: str, label: String(day) });\r\n }\r\n\r\n const years: TreeYear[] = [];\r\n for (const [year, monthMap] of [...map.entries()].sort((a, b) => a[0] - b[0])) {\r\n const months: TreeMonth[] = [];\r\n for (const [month, days] of [...monthMap.entries()].sort((a, b) => a[0] - b[0])) {\r\n months.push({\r\n year, month,\r\n label: BULAN[month - 1],\r\n days: [...days].sort((a, b) => Number(a.label) - Number(b.label)),\r\n });\r\n }\r\n years.push({ year, label: String(year), months });\r\n }\r\n return years;\r\n}\r\n\r\nfunction filterTree(tree: TreeYear[], q: string): TreeYear[] {\r\n const lq = q.toLowerCase();\r\n const result: TreeYear[] = [];\r\n\r\n for (const year of tree) {\r\n // Year string matches → include whole year\r\n if (year.label.includes(lq)) {\r\n result.push(year);\r\n continue;\r\n }\r\n\r\n const filteredMonths: TreeMonth[] = [];\r\n for (const month of year.months) {\r\n // Month name matches → include whole month\r\n if (month.label.toLowerCase().includes(lq)) {\r\n filteredMonths.push(month);\r\n continue;\r\n }\r\n\r\n // Day number or full date matches\r\n const filteredDays = month.days.filter(\r\n d => d.label === lq || d.label.padStart(2, '0') === lq || d.date.includes(lq)\r\n );\r\n if (filteredDays.length > 0) {\r\n filteredMonths.push({ ...month, days: filteredDays });\r\n }\r\n }\r\n\r\n if (filteredMonths.length > 0) {\r\n result.push({ ...year, months: filteredMonths });\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction checkedState(selected: Set<string>, dates: string[]): boolean | 'indeterminate' {\r\n if (dates.length === 0) return false;\r\n const count = dates.filter(d => selected.has(d)).length;\r\n if (count === 0) return false;\r\n if (count === dates.length) return true;\r\n return 'indeterminate';\r\n}\r\n\r\ninterface DateTreeFilterProps {\r\n field: string;\r\n label: string;\r\n options: FilterOption[];\r\n onClose?: () => void;\r\n}\r\n\r\nexport function DateTreeFilter({ field, options, onClose }: DateTreeFilterProps) {\r\n const { filters, addFilter, removeFilter } = useFilters();\r\n\r\n const existingFilter = filters.find(f => f.field === field && f.type === 'dateTree');\r\n const existingValueKey = existingFilter ? JSON.stringify(existingFilter.value) : null;\r\n\r\n const [tempSelected, setTempSelected] = useState<Set<string>>(new Set());\r\n const [expandedYears, setExpandedYears] = useState<Set<number>>(new Set());\r\n const [expandedMonths, setExpandedMonths] = useState<Set<string>>(new Set());\r\n const [search, setSearch] = useState('');\r\n\r\n useEffect(() => {\r\n const values = existingFilter ? (existingFilter.value as string[]) : [];\r\n setTempSelected(new Set(values));\r\n }, [existingValueKey]);\r\n\r\n const tree = useMemo(() => buildTree(options), [options]);\r\n const allDates = useMemo(\r\n () => tree.flatMap(y => y.months.flatMap(m => m.days.map(d => d.date))),\r\n [tree],\r\n );\r\n\r\n const isSearching = search.trim().length > 0;\r\n\r\n const visibleTree = useMemo(\r\n () => isSearching ? filterTree(tree, search.trim()) : tree,\r\n [tree, search, isSearching],\r\n );\r\n\r\n const selectAllState = checkedState(tempSelected, allDates);\r\n\r\n const handleSelectAll = () => {\r\n setTempSelected(selectAllState === true ? new Set() : new Set(allDates));\r\n };\r\n\r\n const toggleYear = (year: TreeYear) => {\r\n const dates = year.months.flatMap(m => m.days.map(d => d.date));\r\n const state = checkedState(tempSelected, dates);\r\n setTempSelected(prev => {\r\n const next = new Set(prev);\r\n if (state === true) dates.forEach(d => next.delete(d));\r\n else dates.forEach(d => next.add(d));\r\n return next;\r\n });\r\n };\r\n\r\n const toggleMonth = (month: TreeMonth) => {\r\n const dates = month.days.map(d => d.date);\r\n const state = checkedState(tempSelected, dates);\r\n setTempSelected(prev => {\r\n const next = new Set(prev);\r\n if (state === true) dates.forEach(d => next.delete(d));\r\n else dates.forEach(d => next.add(d));\r\n return next;\r\n });\r\n };\r\n\r\n const toggleDay = (date: string) => {\r\n setTempSelected(prev => {\r\n const next = new Set(prev);\r\n if (next.has(date)) next.delete(date);\r\n else next.add(date);\r\n return next;\r\n });\r\n };\r\n\r\n const toggleExpandYear = (year: number) => {\r\n setExpandedYears(prev => {\r\n const next = new Set(prev);\r\n if (next.has(year)) next.delete(year);\r\n else next.add(year);\r\n return next;\r\n });\r\n };\r\n\r\n const toggleExpandMonth = (key: string) => {\r\n setExpandedMonths(prev => {\r\n const next = new Set(prev);\r\n if (next.has(key)) next.delete(key);\r\n else next.add(key);\r\n return next;\r\n });\r\n };\r\n\r\n const handleApply = () => {\r\n removeFilter(field);\r\n const selected = [...tempSelected];\r\n if (selected.length > 0) {\r\n addFilter({ field, operator: 'in', value: selected, type: 'dateTree' });\r\n }\r\n onClose?.();\r\n };\r\n\r\n const handleReset = () => {\r\n setTempSelected(new Set());\r\n setSearch('');\r\n removeFilter(field);\r\n onClose?.();\r\n };\r\n\r\n return (\r\n <div className=\"w-full space-y-2\">\r\n {/* HEADER — Select All */}\r\n <div className=\"flex items-center justify-between border-b px-2 pb-2 text-xs\">\r\n <button type=\"button\" onClick={handleSelectAll} className=\"flex items-center gap-2\">\r\n <Checkbox checked={selectAllState} className=\"size-4\" />\r\n <span>Pilih Semua</span>\r\n </button>\r\n <span>{tempSelected.size} Dipilih</span>\r\n </div>\r\n\r\n {/* SEARCH */}\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-2.5 top-1/2 h-3 w-3 -translate-y-1/2 text-muted-foreground pointer-events-none\" />\r\n <Input\r\n value={search}\r\n onChange={e => setSearch(e.target.value)}\r\n placeholder=\"Cari tahun, bulan, tanggal…\"\r\n className=\"h-8 pl-7 text-xs rounded-md\"\r\n />\r\n </div>\r\n\r\n {/* TREE — fixed height */}\r\n <div className=\"h-52 overflow-y-auto space-y-0.5 pr-1\">\r\n {visibleTree.length === 0 && (\r\n <div className=\"flex h-full items-center justify-center text-xs text-muted-foreground\">\r\n {isSearching ? `\"${search.trim()}\" tidak ditemukan` : 'Data tidak ditemukan'}\r\n </div>\r\n )}\r\n\r\n {visibleTree.map(year => {\r\n const yearDates = year.months.flatMap(m => m.days.map(d => d.date));\r\n const yearState = checkedState(tempSelected, yearDates);\r\n // Saat search aktif, selalu expand\r\n const yearExpanded = isSearching || expandedYears.has(year.year);\r\n\r\n return (\r\n <div key={year.year}>\r\n {/* Year row */}\r\n <div className=\"flex items-center gap-1 rounded-md px-1 py-1 hover:bg-muted\">\r\n <button\r\n type=\"button\"\r\n onClick={() => !isSearching && toggleExpandYear(year.year)}\r\n className={cn(\r\n 'flex shrink-0 items-center justify-center text-muted-foreground',\r\n isSearching && 'opacity-30 cursor-default',\r\n )}\r\n >\r\n {yearExpanded\r\n ? <ChevronDown className=\"h-3.5 w-3.5\" />\r\n : <ChevronRight className=\"h-3.5 w-3.5\" />}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => toggleYear(year)}\r\n className=\"flex flex-1 items-center gap-2 text-xs font-semibold\"\r\n >\r\n <Checkbox checked={yearState} className=\"size-4\" />\r\n <span>{year.label}</span>\r\n </button>\r\n </div>\r\n\r\n {yearExpanded && year.months.map(month => {\r\n const monthDates = month.days.map(d => d.date);\r\n const monthState = checkedState(tempSelected, monthDates);\r\n const monthKey = `${year.year}-${String(month.month).padStart(2, '0')}`;\r\n // Saat search aktif, selalu expand\r\n const monthExpanded = isSearching || expandedMonths.has(monthKey);\r\n const selectedInMonth = monthDates.filter(d => tempSelected.has(d)).length;\r\n\r\n return (\r\n <div key={monthKey} className=\"ml-4\">\r\n {/* Month row */}\r\n <div className=\"flex items-center gap-1 rounded-md px-1 py-1 hover:bg-muted\">\r\n <button\r\n type=\"button\"\r\n onClick={() => !isSearching && toggleExpandMonth(monthKey)}\r\n className={cn(\r\n 'flex shrink-0 items-center justify-center text-muted-foreground',\r\n isSearching && 'opacity-30 cursor-default',\r\n )}\r\n >\r\n {monthExpanded\r\n ? <ChevronDown className=\"h-3.5 w-3.5\" />\r\n : <ChevronRight className=\"h-3.5 w-3.5\" />}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => toggleMonth(month)}\r\n className=\"flex flex-1 items-center gap-2 text-xs font-medium\"\r\n >\r\n <Checkbox checked={monthState} className=\"size-4\" />\r\n <span>{month.label}</span>\r\n <span className={cn(\r\n 'ml-auto font-normal tabular-nums',\r\n selectedInMonth > 0 ? 'text-primary' : 'text-muted-foreground',\r\n )}>\r\n {selectedInMonth}/{monthDates.length}\r\n </span>\r\n </button>\r\n </div>\r\n\r\n {/* Day grid — 7 kolom, checkbox atas + angka bawah */}\r\n {monthExpanded && (\r\n <div className=\"ml-4 grid grid-cols-7 gap-0.5 py-1\">\r\n {month.days.map(day => (\r\n <button\r\n key={day.date}\r\n type=\"button\"\r\n onClick={() => toggleDay(day.date)}\r\n className=\"flex flex-col items-center gap-0.5 rounded py-1 text-xs hover:bg-muted\"\r\n >\r\n <Checkbox\r\n checked={tempSelected.has(day.date)}\r\n className=\"size-3.5 pointer-events-none\"\r\n />\r\n <span className=\"tabular-nums text-[10px] leading-none\">\r\n {day.label}\r\n </span>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* FOOTER */}\r\n <div className=\"flex items-center justify-end gap-2 border-t bg-muted/40 px-2 pt-2\">\r\n <Button\r\n size=\"sm\"\r\n onClick={handleReset}\r\n className=\"h-7 rounded-md bg-destructive px-3 text-xs text-destructive-foreground hover:bg-destructive/90\"\r\n >\r\n Reset\r\n </Button>\r\n <Button\r\n size=\"sm\"\r\n onClick={handleApply}\r\n className=\"h-7 rounded-md px-3 text-xs\"\r\n >\r\n Apply\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React from 'react';\r\nimport { Button } from '@pulog/ui';\r\nimport { Card } from '@pulog/ui';\r\nimport { Badge } from '@pulog/ui';\r\nimport { useFilters } from '../contexts/FilterContext';\r\nimport { ColumnFilter } from '../lib/types';\r\nimport { SearchFilter } from './SearchFilter';\r\nimport { DateFilter } from './DateFilter';\r\nimport { DateRangeFilter } from './DateRangeFilter';\r\nimport { SelectFilter } from './SelectFilter';\r\nimport { MultiSelectFilter } from './MultiSelectFilter';\r\nimport { CheckboxFilter } from './CheckboxFilter';\r\nimport { RangeFilter } from './RangeFilter';\r\nimport { DateTreeFilter } from './DateTreeFilter';\r\nimport { X } from 'lucide-react';\r\n\r\ninterface FilterPanelProps {\r\n columns: ColumnFilter[];\r\n onClose?: () => void;\r\n}\r\n\r\nexport function FilterPanel({ columns, onClose }: FilterPanelProps) {\r\n const { filters, clearFilters, hasActiveFilters } = useFilters();\r\n\r\n const renderFilter = (column: ColumnFilter) => {\r\n switch (column.type) {\r\n case 'search':\r\n return (\r\n <SearchFilter\r\n key={column.id}\r\n field={column.id}\r\n label={column.label}\r\n placeholder={column.placeholder}\r\n minSearchLength={column.minSearchLength}\r\n autoApply={column.autoApply}\r\n allowCommaSeparated={column.allowCommaSeparated}\r\n />\r\n );\r\n\r\n case 'date':\r\n return (\r\n <DateFilter\r\n key={column.id}\r\n field={column.id}\r\n label={column.label}\r\n />\r\n );\r\n\r\n case 'dateRange':\r\n return (\r\n <DateRangeFilter\r\n key={column.id}\r\n field={column.id}\r\n label={column.label}\r\n />\r\n );\r\n\r\n case 'select':\r\n return (\r\n <SelectFilter\r\n key={column.id}\r\n field={column.id}\r\n label={column.label}\r\n options={column.options || []}\r\n placeholder={column.placeholder}\r\n />\r\n );\r\n\r\n case 'multiSelect':\r\n return (\r\n <MultiSelectFilter\r\n key={column.id}\r\n field={column.id}\r\n label={column.label}\r\n options={column.options || []}\r\n onSearch={column.onSearch}\r\n minSearchLength={column.minSearchLength}\r\n placeholder={column.placeholder}\r\n searchPlaceholder={column.searchPlaceholder}\r\n />\r\n );\r\n\r\n case 'checkbox':\r\n return (\r\n <CheckboxFilter\r\n key={column.id}\r\n field={column.id}\r\n label={column.label}\r\n />\r\n );\r\n\r\n case 'range':\r\n return (\r\n <RangeFilter\r\n key={column.id}\r\n field={column.id}\r\n label={column.label}\r\n min={column.minValue}\r\n max={column.maxValue}\r\n />\r\n );\r\n\r\n case 'dateTree':\r\n return (\r\n <DateTreeFilter\r\n key={column.id}\r\n field={column.id}\r\n label={column.label}\r\n options={column.options || []}\r\n />\r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return (\r\n <Card className=\"p-4 space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"font-semibold\">Filters</h3>\r\n {onClose && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={onClose}\r\n className=\"h-6 w-6 p-0\"\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </Button>\r\n )}\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 gap-4\">\r\n {columns.map((column) => renderFilter(column))}\r\n </div>\r\n\r\n {hasActiveFilters && (\r\n <div className=\"flex items-center justify-between pt-2 border-t\">\r\n <div className=\"flex flex-wrap gap-1\">\r\n {filters.slice(0, 3).map((filter, idx) => (\r\n <Badge key={idx} variant=\"secondary\" className=\"text-xs\">\r\n {filter.field}\r\n </Badge>\r\n ))}\r\n {filters.length > 3 && (\r\n <Badge variant=\"secondary\" className=\"text-xs\">\r\n +{filters.length - 3} more\r\n </Badge>\r\n )}\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={clearFilters}\r\n className=\"text-xs h-7\"\r\n >\r\n Reset All\r\n </Button>\r\n </div>\r\n )}\r\n </Card>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React from 'react';\r\nimport {\r\n Filter,\r\n Search,\r\n CalendarSearch,\r\n} from 'lucide-react';\r\n\r\nimport { ColumnFilter } from '../lib/types';\r\nimport { useFilters } from '../contexts/FilterContext';\r\n\r\nimport { SearchFilter } from './SearchFilter';\r\nimport { DateFilter } from './DateFilter';\r\nimport { DateRangeFilter } from './DateRangeFilter';\r\nimport { SelectFilter } from './SelectFilter';\r\nimport { MultiSelectFilter } from './MultiSelectFilter';\r\nimport { CheckboxFilter } from './CheckboxFilter';\r\nimport { RangeFilter } from './RangeFilter';\r\nimport { DateTreeFilter } from './DateTreeFilter';\r\n\r\nimport { Button } from '@pulog/ui';\r\nimport { cn } from '@pulog/utils';\r\n\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from '@pulog/ui';\r\n\r\n\r\ninterface ColumnHeaderFilterProps {\r\n filterConfig: ColumnFilter | ColumnFilter[];\r\n}\r\n\r\n\r\nfunction getFilterPopoverWidthClass(type: ColumnFilter['type']) {\r\n switch (type) {\r\n case 'dateTree':\r\n return 'w-64 shadow-xl';\r\n case 'checkbox':\r\n return 'w-56';\r\n case 'range':\r\n return 'w-64';\r\n // 2-month calendar needs its own intrinsic width — not data-dependent, so it stays predictable.\r\n case 'dateRange':\r\n return 'w-auto';\r\n default:\r\n return 'w-72';\r\n }\r\n}\r\n\r\n\r\nfunction isFilterActive(\r\n config: ColumnFilter,\r\n getFieldFilters: (field: string) => { length: number }\r\n) {\r\n return getFieldFilters(config.id).length > 0;\r\n}\r\n\r\n\r\nfunction renderSingleFilter(\r\n config: ColumnFilter,\r\n onClose: () => void,\r\n extra: {\r\n multiSelectSearch: string;\r\n onMultiSelectSearchChange: (value: string) => void;\r\n }\r\n) {\r\n\r\n switch (config.type) {\r\n\r\n case 'search':\r\n return (\r\n <SearchFilter\r\n field={config.id}\r\n label={config.label}\r\n placeholder={config.placeholder}\r\n minSearchLength={config.minSearchLength}\r\n autoApply={config.autoApply}\r\n allowCommaSeparated={config.allowCommaSeparated}\r\n onClose={onClose}\r\n />\r\n );\r\n\r\n\r\n case 'date':\r\n\r\n return (\r\n <DateFilter\r\n field={config.id}\r\n label={config.label}\r\n minDate={config.minDate}\r\n maxDate={config.maxDate}\r\n onClose={onClose}\r\n />\r\n );\r\n\r\n\r\n case 'dateRange':\r\n\r\n return (\r\n <DateRangeFilter\r\n field={config.id}\r\n label={config.label}\r\n minDate={config.minDate}\r\n maxDate={config.maxDate}\r\n onClose={onClose}\r\n />\r\n );\r\n\r\n\r\n case 'select':\r\n\r\n return (\r\n <SelectFilter\r\n field={config.id}\r\n label={config.label}\r\n options={config.options ?? []}\r\n placeholder={config.placeholder}\r\n onClose={onClose}\r\n />\r\n );\r\n\r\n\r\n case 'multiSelect':\r\n\r\n return (\r\n <MultiSelectFilter\r\n field={config.id}\r\n label={config.label}\r\n options={config.options ?? []}\r\n onSearch={config.onSearch}\r\n minSearchLength={config.minSearchLength}\r\n placeholder={config.placeholder}\r\n searchPlaceholder={config.searchPlaceholder}\r\n onClose={onClose}\r\n initialSearch={extra.multiSelectSearch}\r\n onSearchChange={extra.onMultiSelectSearchChange}\r\n />\r\n );\r\n\r\n\r\n case 'checkbox':\r\n\r\n return (\r\n <CheckboxFilter\r\n field={config.id}\r\n label={config.label}\r\n />\r\n );\r\n\r\n\r\n case 'range':\r\n\r\n return (\r\n <RangeFilter\r\n field={config.id}\r\n label={config.label}\r\n min={config.minValue}\r\n max={config.maxValue}\r\n />\r\n );\r\n\r\n\r\n case 'dateTree':\r\n\r\n return (\r\n <DateTreeFilter\r\n field={config.id}\r\n label={config.label}\r\n options={config.options ?? []}\r\n onClose={onClose}\r\n />\r\n );\r\n\r\n\r\n default:\r\n return null;\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n\r\nconst FilterTrigger = React.forwardRef<\r\n HTMLButtonElement,\r\n {\r\n config: ColumnFilter;\r\n anyActive: boolean;\r\n } & React.ComponentPropsWithoutRef<typeof Button>\r\n>(\r\n (\r\n {\r\n config,\r\n anyActive,\r\n onClick,\r\n ...rest\r\n },\r\n ref\r\n ) => (\r\n\r\n <Button\r\n ref={ref}\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n {...rest}\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n onClick?.(event);\r\n }}\r\n className={cn(\r\n 'flex',\r\n 'h-5',\r\n 'w-5',\r\n 'items-center',\r\n 'justify-center',\r\n 'rounded',\r\n\r\n anyActive\r\n ? [\r\n 'text-destructive',\r\n ]\r\n : [\r\n 'text-muted-foreground',\r\n 'hover:bg-muted',\r\n ]\r\n )}\r\n >\r\n\r\n {\r\n config.type === 'search'\r\n ? <Search className=\"size-3\" />\r\n : config.type === 'dateRange' || config.type === 'dateTree'\r\n ? <CalendarSearch className=\"size-3\" />\r\n : <Filter className=\"size-3\" />\r\n }\r\n\r\n </Button>\r\n\r\n )\r\n);\r\n\r\n\r\nFilterTrigger.displayName = 'FilterTrigger';\r\n\r\n\r\n\r\nfunction FilterPopover({\r\n config,\r\n}: {\r\n config: ColumnFilter;\r\n}) {\r\n\r\n const {\r\n getFieldFilters,\r\n } = useFilters();\r\n\r\n\r\n const [open, setOpen] =\r\n React.useState(false);\r\n\r\n // Hidup di sini (bukan di dalam MultiSelectFilter) supaya tetap ada saat\r\n // PopoverContent unmount ketika popover ditutup — teks search terakhir\r\n // dipulihkan saat popover dibuka lagi.\r\n const [multiSelectSearch, setMultiSelectSearch] =\r\n React.useState('');\r\n\r\n\r\n return (\r\n\r\n <Popover\r\n open={open}\r\n onOpenChange={setOpen}\r\n >\r\n\r\n <PopoverTrigger asChild>\r\n\r\n <FilterTrigger\r\n config={config}\r\n anyActive={\r\n isFilterActive(\r\n config,\r\n getFieldFilters\r\n )\r\n }\r\n />\r\n\r\n </PopoverTrigger>\r\n\r\n\r\n <PopoverContent\r\n align=\"end\"\r\n onClick={(e) =>\r\n e.stopPropagation()\r\n }\r\n onOpenAutoFocus={(event) => {\r\n // Radix focuses the first tabbable element in DOM order by default, which in\r\n // filters like MultiSelectFilter is the \"Pilih Semua\" button, not the search\r\n // input. Focus the first real text input instead so typing works immediately.\r\n const container = event.target as HTMLElement;\r\n const input = container?.querySelector<HTMLInputElement>(\r\n 'input:not([type=\"hidden\"]):not([disabled])'\r\n );\r\n if (input) {\r\n event.preventDefault();\r\n input.focus();\r\n }\r\n }}\r\n className={cn(\r\n 'z-200',\r\n 'border',\r\n 'border-border',\r\n 'p-3',\r\n getFilterPopoverWidthClass(config.type),\r\n )}\r\n >\r\n\r\n {\r\n renderSingleFilter(\r\n config,\r\n () => setOpen(false),\r\n {\r\n multiSelectSearch,\r\n onMultiSelectSearchChange: setMultiSelectSearch,\r\n }\r\n )\r\n }\r\n\r\n </PopoverContent>\r\n\r\n </Popover>\r\n\r\n );\r\n\r\n}\r\n\r\n\r\n\r\nexport function ColumnHeaderFilter({\r\n filterConfig,\r\n}: ColumnHeaderFilterProps) {\r\n\r\n const configs =\r\n Array.isArray(filterConfig)\r\n ? filterConfig\r\n : [filterConfig];\r\n\r\n\r\n return (\r\n\r\n <div\r\n className={cn(\r\n 'flex',\r\n 'items-center',\r\n 'gap-0.5'\r\n )}\r\n >\r\n\r\n {\r\n configs.map((config) => (\r\n\r\n <FilterPopover\r\n key={config.id}\r\n config={config}\r\n />\r\n\r\n ))\r\n }\r\n\r\n </div>\r\n\r\n );\r\n\r\n}","'use client';\r\n\r\nimport React from 'react';\r\nimport { Columns3, Eye, EyeOff } from 'lucide-react';\r\nimport { Button } from '@pulog/ui';\r\nimport { Checkbox } from '@pulog/ui';\r\nimport { Popover, PopoverContent, PopoverTrigger } from '@pulog/ui';\r\nimport { useColumnVisibility } from './contexts/ColumnVisibilityContext';\r\nimport { DataTableColumn } from './types';\r\nimport { cn } from '@pulog/utils';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\ninterface ColumnVisibilityPanelProps {\r\n columns: DataTableColumn<any>[];\r\n}\r\n\r\nfunction columnLabel(col: DataTableColumn<any>): string {\r\n return typeof col.header === 'string' ? col.header : col.id;\r\n}\r\n\r\nexport function ColumnVisibilityPanel({ columns }: ColumnVisibilityPanelProps) {\r\n const { t } = useTranslation('datatable');\r\n const { isColumnVisible, toggleColumn, showAllColumns, hideAllColumns } = useColumnVisibility();\r\n\r\n const hiddenCount = columns.filter(col => !isColumnVisible(col.id)).length;\r\n const allVisible = hiddenCount === 0;\r\n const allHidden = hiddenCount === columns.length;\r\n\r\n return (\r\n <Popover>\r\n <PopoverTrigger asChild>\r\n <Button\r\n variant={hiddenCount > 0 ? 'default' : 'outline'}\r\n size=\"sm\"\r\n className=\"gap-2\"\r\n >\r\n <Columns3 className=\"h-4 w-4\" />\r\n {t('column')}\r\n {hiddenCount > 0 && (\r\n <span className=\"rounded-full bg-white/20 px-1.5 py-0.5 text-[10px] font-semibold leading-none tabular-nums\">\r\n -{hiddenCount}\r\n </span>\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n\r\n <PopoverContent\r\n align=\"end\"\r\n className=\"z-[200] w-52 p-0 shadow-xl border border-border\"\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between border-b px-3 py-2\">\r\n <span className=\"text-xs font-semibold\">{t('showColumns')}</span>\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n type=\"button\"\r\n onClick={showAllColumns}\r\n disabled={allVisible}\r\n title=\"Tampilkan semua\"\r\n className={cn(\r\n 'rounded p-1 transition-colors',\r\n allVisible\r\n ? 'text-muted-foreground/40 cursor-default'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-muted',\r\n )}\r\n >\r\n <Eye className=\"h-3.5 w-3.5\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={hideAllColumns}\r\n disabled={allHidden}\r\n title=\"Sembunyikan semua\"\r\n className={cn(\r\n 'rounded p-1 transition-colors',\r\n allHidden\r\n ? 'text-muted-foreground/40 cursor-default'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-muted',\r\n )}\r\n >\r\n <EyeOff className=\"h-3.5 w-3.5\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Column list */}\r\n <div className=\"max-h-72 overflow-y-auto py-1\">\r\n {columns.map(col => {\r\n const visible = isColumnVisible(col.id);\r\n return (\r\n <button\r\n key={col.id}\r\n type=\"button\"\r\n onClick={() => toggleColumn(col.id)}\r\n className=\"flex w-full items-center gap-2.5 px-3 py-1.5 text-left text-xs hover:bg-muted transition-colors\"\r\n >\r\n <Checkbox\r\n checked={visible}\r\n className=\"size-4 pointer-events-none\"\r\n />\r\n <span className={cn(!visible && 'text-muted-foreground line-through')}>\r\n {columnLabel(col)}\r\n </span>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Footer info */}\r\n {hiddenCount > 0 && (\r\n <div className=\"border-t px-3 py-2 text-[11px] text-muted-foreground\">\r\n {columns.length - hiddenCount} {t('of')} {columns.length} {t('column_plural')}\r\n </div>\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React from 'react';\r\nimport { ArrowLeftToLine, ArrowRightToLine, Pin, PinOff } from 'lucide-react';\r\nimport { Button } from '@pulog/ui';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n} from '@pulog/ui';\r\nimport { ColumnPinPosition } from './lib/types';\r\nimport { cn } from '@pulog/utils';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\ninterface ColumnPinMenuProps {\r\n pin: ColumnPinPosition;\r\n onPin: (side: 'left' | 'right') => void;\r\n onUnpin: () => void;\r\n}\r\n\r\nexport function ColumnPinMenu({ pin, onPin, onUnpin }: ColumnPinMenuProps) {\r\n const { t } = useTranslation('datatable');\r\n const isPinned = pin === 'left' || pin === 'right';\r\n\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={(event) => event.stopPropagation()}\r\n title={isPinned ? t('columnPin.pinned') : t('columnPin.pinning')}\r\n className={cn(\r\n 'flex h-5 w-5 items-center justify-center rounded',\r\n isPinned ? 'text-destructive' : 'text-muted-foreground hover:bg-muted'\r\n )}\r\n >\r\n <Pin className=\"size-3\" />\r\n </Button>\r\n </DropdownMenuTrigger>\r\n\r\n <DropdownMenuContent align=\"start\" className=\"z-200 w-44\" onClick={(event) => event.stopPropagation()}>\r\n <DropdownMenuItem disabled={pin === 'left'} onClick={() => onPin('left')}>\r\n <ArrowLeftToLine className=\"size-3.5\" />\r\n {t('columnPin.pinLeft')}\r\n </DropdownMenuItem>\r\n <DropdownMenuItem disabled={pin === 'right'} onClick={() => onPin('right')}>\r\n <ArrowRightToLine className=\"size-3.5\" />\r\n {t('columnPin.pinRight')}\r\n </DropdownMenuItem>\r\n <DropdownMenuItem disabled={!isPinned} onClick={onUnpin}>\r\n <PinOff className=\"size-3.5\" />\r\n {t('columnPin.unpin')}\r\n </DropdownMenuItem>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n","import React, { useContext, useEffect } from 'react';\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@pulog/ui';\nimport { Skeleton } from '@pulog/ui';\nimport { AlertCircle, ArrowDownNarrowWide, ArrowUpNarrowWide } from 'lucide-react';\nimport { useFilters } from './contexts/FilterContext';\nimport { PaginationContext, usePagination } from './contexts/PaginationContext';\nimport { useSelection } from './contexts/SelectionContext';\nimport { useSort } from './contexts/SortContext';\nimport { SortState, ColumnFilter } from './lib/types';\nimport { useColumnVisibility } from './contexts/ColumnVisibilityContext';\nimport { useColumnPinning } from './contexts/ColumnPinningContext';\nimport { DataTableProvider } from './contexts/DataTableProvider';\nimport { RowCheckbox } from './selection/RowCheckbox';\nimport { SelectAllCheckbox } from './selection/SelectAllCheckbox';\nimport { ExpandableRow } from './selection/ExpandableRow';\n\nimport { TraditionalPagination } from './pagination/TraditionalPagination';\nimport { InfiniteScrollPagination } from './pagination/InfiniteScrollPagination';\nimport { FilterPanel } from './filters/FilterPanel';\nimport { ColumnHeaderFilter } from './filters/ColumnHeaderFilter';\nimport { ColumnVisibilityPanel } from './ColumnVisibilityPanel';\nimport { ColumnPinMenu } from './ColumnPinMenu';\nimport { DataTableColumn, DataTableProps } from './types';\nimport { Button } from '@pulog/ui';\nimport { Filter, ArrowUpDown, X, Search, Copy, Check } from 'lucide-react';\nimport { Input } from '@pulog/ui';\nimport { cn } from '@pulog/utils';\nimport { applyFilters as libApplyFilters } from './lib/filter-utils';\nimport { EmptyStateIllustration } from '@pulog/ui';\nimport { useTranslation } from 'react-i18next';\n\nconst SelectionSummary = React.lazy(() =>\n import('./selection/SelectionSummary').then((module) => ({ default: module.SelectionSummary }))\n);\n\nfunction CopyCell({ text, children }: { text: string; children: React.ReactNode }) {\n const { t } = useTranslation('datatable')\n const [copied, setCopied] = React.useState(false)\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation()\n navigator.clipboard.writeText(text).then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n })\n }\n\n return (\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate flex-1\">{children}</span>\n <button\n type=\"button\"\n onClick={handleCopy}\n title={copied ? t('copied') : t('copyTooltip')}\n className=\"shrink-0 rounded p-0.5 text-muted-foreground/50 transition-colors hover:text-foreground\"\n >\n {copied\n ? <Check className=\"h-3 w-3 text-emerald-500\" />\n : <Copy className=\"h-3 w-3\" />\n }\n </button>\n </div>\n )\n}\n\n// Mounts when a row expands → fetches → renders via expandLoadContent.\n// Unmounting (row collapsed) cancels the in-flight request via the `cancelled` flag.\nfunction ExpandedRowLoader<T>({\n row,\n onLoad,\n renderContent,\n}: {\n row: T\n onLoad: (row: T) => Promise<any>\n renderContent: (row: T, data: any, state: { isLoading: boolean; error: string | null }) => React.ReactNode\n}) {\n const [state, setState] = React.useState<{ data: any; isLoading: boolean; error: string | null }>({\n data: null,\n isLoading: true,\n error: null,\n })\n\n React.useEffect(() => {\n let cancelled = false\n setState({ data: null, isLoading: true, error: null })\n onLoad(row)\n .then((data) => { if (!cancelled) setState({ data, isLoading: false, error: null }) })\n .catch((err) => { if (!cancelled) setState({ data: null, isLoading: false, error: String(err) }) })\n return () => { cancelled = true }\n }, []) // intentionally empty — run once on mount (= when row expands)\n\n return <>{renderContent(row, state.data, { isLoading: state.isLoading, error: state.error })}</>\n}\n\nconst STICKY_SELECTION_KEY = '__datatable_selection__';\nconst STICKY_EXPAND_KEY = '__datatable_expand__';\nconst STICKY_ROW_NUMBER_KEY = '__datatable_rownumber__';\nconst TOOL_COLUMN_WIDTH = 48;\nconst DEFAULT_STICKY_DATA_COLUMN_WIDTH = 160;\nconst MIN_COLUMN_WIDTH = 130;\nconst SKELETON_CELL_WIDTHS = ['90%', '65%', '80%', '50%', '75%'];\n\nfunction areNumberRecordsEqual(a: Record<string, number>, b: Record<string, number>) {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n\n if (aKeys.length !== bKeys.length) return false\n\n return aKeys.every((key) => a[key] === b[key])\n}\n\nfunction deriveRowSurfaceClasses(rowClassName?: string) {\n const tokens = (rowClassName ?? '').split(/\\s+/).filter(Boolean)\n\n const base = tokens.filter((token) => /^(dark:)?bg-/.test(token))\n const hover = tokens\n .filter((token) => /(^|:)hover:bg-/.test(token))\n .map((token) => {\n if (token.startsWith('dark:hover:')) return token.replace('dark:hover:', 'dark:group-hover:')\n if (token.startsWith('hover:')) return token.replace('hover:', 'group-hover:')\n return token\n })\n\n return {\n base,\n hover,\n hasCustomSurface: base.length > 0 || hover.length > 0,\n }\n}\n\nfunction DataTableInner<T extends Record<string, any>>({\n columns,\n data,\n isLoading = false,\n error = null,\n rowKey,\n onRowClick,\n showSelection = true,\n showExpand = false,\n stickySelection = true,\n stickyExpand = true,\n showRowNumber = false,\n stickyRowNumber = true,\n expandContent,\n onExpandLoad,\n expandLoadContent,\n paginationMode = 'traditional',\n showFilters = true,\n showSearch = false,\n placeholder = \"Search data...\",\n searchFields,\n searchPlaceholder,\n tableHeight,\n infiniteScrollHeight,\n pageSizeOptions = [10, 25, 50, 100],\n manualPagination = false,\n manualSorting = false,\n manualFiltering = false,\n totalCount,\n onStateChange,\n emptyStateMessage = 'No Data Available',\n labelSelection = 'Action',\n toolbarLeft,\n toolbarRight,\n renderSelectionCell,\n selectableTotalCount,\n rowClassName,\n showColumnVisibility = false,\n enableColumnResizing = true,\n enableColumnPinning = true,\n onSelectAllAttempt,\n}: DataTableProps<T>) {\n const { isColumnVisible, setVisibility } = useColumnVisibility();\n const { pinning, pinColumn, unpinColumn } = useColumnPinning();\n const { t } = useTranslation('datatable');\n // `pageSize` (initial value) and `selectionMode`/`defaultColumnVisibility` are\n // consumed by the outer `DataTable` wrapper to seed the pagination/selection/\n // column-visibility contexts — this component only ever reads their current\n // value back from context, so there's a single source of truth for each.\n const { pageIndex, pageSize: contextPageSize, updatePaginationCount, goToPage } = usePagination();\n const skeletonRowCount = Math.min(Math.max(contextPageSize, 5), 10);\n const { sort, toggleSort } = useSort();\n const { isRowExpanded, clearSelectAll, selectionMode: effectiveSelectionMode } = useSelection();\n const { filters } = useFilters();\n const filterableColumns = React.useMemo<ColumnFilter[]>(\n () => columns\n .filter((col) => col.filterable && col.filterConfig)\n .flatMap((col) => {\n const cfg = col.filterConfig!;\n return Array.isArray(cfg) ? cfg : [cfg];\n }),\n [columns]\n );\n\n const sanitizedFilters = React.useMemo(() => {\n return filters.filter((filter) => {\n if (filter.type !== 'multiSelect' || !Array.isArray(filter.value)) return true;\n\n const config = filterableColumns.find((item) => item.id === filter.field && item.type === 'multiSelect');\n const optionValues = Array.from(new Set((config?.options ?? []).map((option) => String(option.value))));\n\n if (optionValues.length === 0) return true;\n if (filter.value.length !== optionValues.length) return true;\n\n const selectedSet = new Set(filter.value.map(String));\n return !optionValues.every((value) => selectedSet.has(value));\n });\n }, [filters, filterableColumns]);\n const [showFilterPanel, setShowFilterPanel] = React.useState(false);\n const [searchInput, setSearchInput] = React.useState('');\n const [searchQuery, setSearchQuery] = React.useState('');\n const stickyCellRefs = React.useRef<Record<string, HTMLTableCellElement | null>>({});\n const headerCellRefs = React.useRef<Record<string, HTMLTableCellElement | null>>({});\n const [stickyOffsets, setStickyOffsets] = React.useState<Record<string, number>>({});\n const [stickyWidths, setStickyWidths] = React.useState<Record<string, number>>({});\n const [columnWidths, setColumnWidths] = React.useState<Record<string, number>>({});\n const [resizingColumnId, setResizingColumnId] = React.useState<string | null>(null);\n const resizeStateRef = React.useRef<{ columnId: string; startX: number; startWidth: number } | null>(null);\n const tableScrollContainerRef = React.useRef<HTMLDivElement | null>(null);\n const rowElementsRef = React.useRef<Record<string, HTMLTableRowElement | null>>({})\n const rowSurfaceColorsRef = React.useRef<Record<string, { base?: string; hover?: string }>>({})\n const [hoveredRowId, setHoveredRowId] = React.useState<string | null>(null)\n const [, bumpRowSurfaceVersion] = React.useReducer((value) => value + 1, 0)\n const rowSurface = React.useMemo(() => deriveRowSurfaceClasses(rowClassName), [rowClassName]);\n const stickyFallbackSurface = React.useMemo(\n () => (!rowSurface.hasCustomSurface ? ['bg-card', 'group-hover:bg-muted'] : []),\n [rowSurface.hasCustomSurface]\n );\n // Runtime pin state (via the header's pin menu) wins over a column's static\n // `sticky` config; columns never touched at runtime fall back to `sticky`.\n const getEffectivePin = React.useCallback(\n (column: DataTableColumn<T>): 'left' | 'right' | false => {\n const runtimePin = pinning[column.id];\n if (runtimePin !== undefined) return runtimePin;\n if (column.sticky === 'right') return 'right';\n if (column.sticky) return 'left';\n return false;\n },\n [pinning]\n );\n\n const canPinColumn = React.useCallback(\n (column: DataTableColumn<T>) => enableColumnPinning && column.pinnable !== false,\n [enableColumnPinning]\n );\n\n const isStickyLeftColumn = React.useCallback(\n (column: DataTableColumn<T>) => getEffectivePin(column) === 'left',\n [getEffectivePin]\n );\n const isStickyRightColumn = React.useCallback(\n (column: DataTableColumn<T>) => getEffectivePin(column) === 'right',\n [getEffectivePin]\n );\n\n // tableHeight=\"auto\" → fill the available height (flex) instead of a fixed px.\n const isAutoHeight = tableHeight === 'auto';\n\n const resolvedTableHeight = React.useMemo(() => {\n if (isAutoHeight) return undefined;\n const heightValue = tableHeight ?? infiniteScrollHeight;\n if (heightValue !== undefined && heightValue !== null) {\n return typeof heightValue === 'number' ? `${heightValue}px` : heightValue;\n }\n\n return paginationMode === 'infinite' ? '600px' : undefined;\n }, [tableHeight, isAutoHeight, infiniteScrollHeight, paginationMode]);\n\n // The body scrolls internally when it has a bounded height: fixed px, infinite\n // mode, or auto (fills the available flex height).\n const isScrollable = isAutoHeight || Boolean(resolvedTableHeight);\n\n // `tableHeight` is a cap, not a fixed size: the table shrinks to fit its\n // rows (fewer rows = no empty gap below them) and only scrolls once row\n // content would actually exceed it.\n const tableBodyStyle = React.useMemo(\n () => (resolvedTableHeight ? { maxHeight: resolvedTableHeight } : undefined),\n [resolvedTableHeight]\n );\n\n const searchableColumns = React.useMemo(() => {\n const targetFields = searchFields?.length ? searchFields.map(String) : columns.map((column) => column.id);\n return columns.filter((column) => targetFields.includes(column.id));\n }, [columns, searchFields]);\n\n const resolvedSearchPlaceholder = React.useMemo(() => {\n if (searchPlaceholder) return searchPlaceholder;\n if (!showSearch) return '';\n if (!searchableColumns.length) return 'Search...';\n\n const labels = searchableColumns.map((column) =>\n typeof column.header === 'string' ? column.header : column.id\n );\n\n if (searchFields?.length) {\n if (placeholder) return placeholder;\n return labels.length ? `Search ${labels.join(', ')}...` : 'Search...';\n }\n\n return 'Search all columns...';\n }, [searchPlaceholder, showSearch, searchableColumns, searchFields]);\n\n const applySearch = React.useCallback(\n (rows: T[], query: string): T[] => {\n const normalizedQuery = query.trim().toLowerCase();\n if (!normalizedQuery) return rows;\n if (!searchableColumns.length) return rows;\n\n return rows.filter((row) =>\n searchableColumns.some((column) => {\n let value: unknown = null;\n\n if (column.accessor) {\n if (typeof column.accessor === 'function') {\n value = column.accessor(row);\n } else {\n value = row[column.accessor as keyof T];\n }\n } else {\n value = row[column.id as keyof T];\n }\n\n if (value === null || value === undefined) return false;\n return String(value).toLowerCase().includes(normalizedQuery);\n })\n );\n },\n [searchableColumns]\n );\n\n const handleSearchSubmit = () => {\n const nextQuery = searchInput.trim();\n setSearchInput(nextQuery);\n setSearchQuery(nextQuery);\n goToPage(1);\n };\n\n const handleSearchClear = () => {\n setSearchInput('');\n setSearchQuery('');\n goToPage(1);\n };\n\n const applySort = React.useCallback(\n (rows: T[], sortState: SortState): T[] => {\n if (!sortState.column || !sortState.order) return rows;\n\n return [...rows].sort((a, b) => {\n const column = columns.find((c) => c.id === sortState.column);\n if (!column) return 0;\n\n let valA: any;\n let valB: any;\n\n if (column.accessor) {\n if (typeof column.accessor === 'function') {\n valA = column.accessor(a);\n valB = column.accessor(b);\n } else {\n valA = a[column.accessor as keyof T];\n valB = b[column.accessor as keyof T];\n }\n }\n\n if (valA === valB) return 0;\n if (valA == null) return 1;\n if (valB == null) return -1;\n\n const multiplier = sortState.order === 'desc' ? -1 : 1;\n\n if (typeof valA === 'string' && typeof valB === 'string') {\n return valA.localeCompare(valB) * multiplier;\n }\n\n return (valA < valB ? -1 : 1) * multiplier;\n });\n },\n [columns]\n );\n\n const processedData = React.useMemo(() => {\n let result = data;\n if (!manualFiltering) {\n result = applySearch(result, searchQuery);\n }\n if (!manualFiltering) {\n result = libApplyFilters(result, sanitizedFilters);\n }\n if (!manualSorting) {\n result = applySort(result, sort);\n }\n return result;\n }, [data, sanitizedFilters, sort, searchQuery, applySearch, applySort, manualFiltering, manualSorting]);\n\n const paginatedData = React.useMemo(() => {\n if (manualPagination) return processedData;\n if (paginationMode === 'infinite') {\n return processedData.slice(0, pageIndex * contextPageSize);\n }\n const start = (pageIndex - 1) * contextPageSize;\n return processedData.slice(start, start + contextPageSize);\n }, [processedData, pageIndex, contextPageSize, paginationMode, manualPagination]);\n\n // Pinned columns render at their table edge regardless of where they sit in\n // `columns` — left-pinned first, then unpinned, then right-pinned — each\n // group keeping its own relative order, matching tanstack/shadcn pinning.\n const visibleColumns = React.useMemo(() => {\n const shown = columns.filter((col) => isColumnVisible(col.id));\n const left = shown.filter((col) => isStickyLeftColumn(col));\n const right = shown.filter((col) => isStickyRightColumn(col));\n const center = shown.filter((col) => !isStickyLeftColumn(col) && !isStickyRightColumn(col));\n return [...left, ...center, ...right];\n }, [columns, isColumnVisible, isStickyLeftColumn, isStickyRightColumn]);\n\n const [isScrolled, setIsScrolled] = React.useState(false);\n const [isScrolledEnd, setIsScrolledEnd] = React.useState(false);\n const [containerClientWidth, setContainerClientWidth] = React.useState(0);\n\n React.useEffect(() => {\n const outer = tableScrollContainerRef.current;\n if (!outer) return;\n // The element that scrolls horizontally depends on the mode: with a fixed\n // height the outer div scrolls; otherwise ui/table's inner container\n // (overflow-x-auto) does. Observe the correct one so the sticky-column\n // scroll shadows work in both cases.\n const inner = outer.querySelector('[data-slot=\"table-container\"]') as HTMLElement | null;\n const scroller = (isScrollable ? outer : inner) ?? outer;\n\n const handleScroll = () => {\n setIsScrolled(scroller.scrollLeft > 0);\n setIsScrolledEnd(\n scroller.scrollLeft + scroller.clientWidth < scroller.scrollWidth - 2\n );\n };\n\n scroller.addEventListener('scroll', handleScroll, { passive: true });\n handleScroll();\n\n return () => scroller.removeEventListener('scroll', handleScroll);\n }, [paginatedData, isScrollable]);\n const rowIds = processedData.map((row) => String(row[rowKey]));\n const stickyColumns = React.useMemo(\n () => visibleColumns.filter((column) => isStickyLeftColumn(column)),\n [visibleColumns, isStickyLeftColumn]\n );\n const stickyRightColumns = React.useMemo(\n () => visibleColumns.filter((column) => isStickyRightColumn(column)),\n [visibleColumns, isStickyRightColumn]\n );\n\n const stickyColumnKeys = React.useMemo(() => {\n const keys: string[] = [];\n\n if (showSelection && stickySelection) keys.push(STICKY_SELECTION_KEY);\n if (showExpand && stickyExpand) keys.push(STICKY_EXPAND_KEY);\n if (showRowNumber && stickyRowNumber) keys.push(STICKY_ROW_NUMBER_KEY);\n\n stickyColumns.forEach((column) => {\n keys.push(column.id);\n });\n\n return keys;\n }, [showSelection, stickySelection, showExpand, stickyExpand, showRowNumber, stickyRowNumber, stickyColumns]);\n\n const stickyRightColumnKeys = React.useMemo(\n () => [...stickyRightColumns].reverse().map((column) => column.id),\n [stickyRightColumns]\n );\n\n const lastStickyLeftKey = React.useMemo(() => {\n return stickyColumnKeys[stickyColumnKeys.length - 1];\n }, [stickyColumnKeys]);\n\n const lastStickyRightKey = React.useMemo(() => {\n return stickyRightColumnKeys[stickyRightColumnKeys.length - 1];\n }, [stickyRightColumnKeys]);\n\n const measureStickyOffsets = React.useCallback(() => {\n const nextOffsets: Record<string, number> = {};\n const nextWidths: Record<string, number> = {};\n\n let left = 0;\n\n stickyColumnKeys.forEach((key) => {\n const isToolCol = key === STICKY_SELECTION_KEY || key === STICKY_EXPAND_KEY || key === STICKY_ROW_NUMBER_KEY;\n // Tool columns always use the fixed constant — avoids capturing stretched width\n // when they are the only column (table-layout:auto gives them 100%).\n const measuredWidth = isToolCol\n ? TOOL_COLUMN_WIDTH\n : stickyCellRefs.current[key]?.getBoundingClientRect().width ?? 0;\n nextOffsets[key] = left;\n nextWidths[key] = measuredWidth;\n left += measuredWidth;\n });\n\n let right = 0;\n stickyRightColumnKeys.forEach((key) => {\n const measuredWidth = stickyCellRefs.current[key]?.getBoundingClientRect().width ?? 0;\n nextOffsets[key] = right;\n nextWidths[key] = measuredWidth;\n right += measuredWidth;\n });\n\n setStickyOffsets((prev) => (areNumberRecordsEqual(prev, nextOffsets) ? prev : nextOffsets));\n setStickyWidths((prev) => (areNumberRecordsEqual(prev, nextWidths) ? prev : nextWidths));\n }, [stickyColumnKeys, stickyRightColumnKeys]);\n\n const buildStickySizeStyle = React.useCallback(\n (width?: string | number | null, fallbackKey?: string) => {\n const measuredWidth = fallbackKey ? stickyWidths[fallbackKey] : undefined;\n const resolvedWidth =\n typeof width === 'number'\n ? `${width}px`\n : width ??\n (measuredWidth !== undefined && measuredWidth > 0\n ? `${measuredWidth}px`\n : (fallbackKey === STICKY_SELECTION_KEY || fallbackKey === STICKY_EXPAND_KEY || fallbackKey === STICKY_ROW_NUMBER_KEY)\n ? `${TOOL_COLUMN_WIDTH}px`\n : undefined);\n\n return resolvedWidth\n ? {\n width: resolvedWidth,\n minWidth: resolvedWidth,\n maxWidth: resolvedWidth,\n }\n : undefined;\n },\n [stickyWidths]\n );\n\n const readResolvedBackgroundColor = React.useCallback((element: HTMLElement | null) => {\n if (!element || typeof window === 'undefined') return undefined\n\n const backgroundColor = window.getComputedStyle(element).backgroundColor\n if (!backgroundColor || backgroundColor === 'transparent' || backgroundColor === 'rgba(0, 0, 0, 0)') {\n return undefined\n }\n\n return backgroundColor\n }, [])\n\n const syncRowBaseSurface = React.useCallback((rowId: string, element: HTMLTableRowElement | null) => {\n if (!rowSurface.hasCustomSurface || !element) return\n\n const nextBase = readResolvedBackgroundColor(element)\n const current = rowSurfaceColorsRef.current[rowId]\n\n if (current?.base !== nextBase) {\n rowSurfaceColorsRef.current[rowId] = { ...current, base: nextBase }\n bumpRowSurfaceVersion()\n }\n }, [readResolvedBackgroundColor, rowSurface.hasCustomSurface])\n\n const registerRowElement = React.useCallback((rowId: string, element: HTMLTableRowElement | null) => {\n rowElementsRef.current[rowId] = element\n syncRowBaseSurface(rowId, element)\n }, [syncRowBaseSurface])\n\n const cacheHoveredRowSurface = React.useCallback((rowId: string) => {\n if (!rowSurface.hasCustomSurface) return\n\n const element = rowElementsRef.current[rowId]\n if (!element) return\n\n const nextHover = readResolvedBackgroundColor(element)\n const current = rowSurfaceColorsRef.current[rowId]\n\n if (current?.hover !== nextHover) {\n rowSurfaceColorsRef.current[rowId] = { ...current, hover: nextHover }\n bumpRowSurfaceVersion()\n }\n }, [readResolvedBackgroundColor, rowSurface.hasCustomSurface])\n\n const getStickySurfaceStyle = React.useCallback((rowId: string) => {\n if (!rowSurface.hasCustomSurface) return undefined\n\n const colors = rowSurfaceColorsRef.current[rowId]\n const backgroundColor = hoveredRowId === rowId ? (colors?.hover ?? colors?.base) : colors?.base\n\n return backgroundColor ? { backgroundColor } : undefined\n }, [hoveredRowId, rowSurface.hasCustomSurface])\n\n const getColumnStyle = React.useCallback(\n (column: DataTableColumn<T>) => {\n const resizedWidth = columnWidths[column.id];\n\n if (!isStickyLeftColumn(column) && !isStickyRightColumn(column)) {\n if (resizedWidth !== undefined) {\n const w = `${resizedWidth}px`;\n return { width: w, minWidth: w, maxWidth: w };\n }\n if (column.width !== undefined) {\n const w = typeof column.width === 'number' ? `${column.width}px` : column.width;\n return { width: w, minWidth: w, maxWidth: w };\n }\n return undefined;\n }\n\n const fallbackWidth =\n resizedWidth !== undefined\n ? `${resizedWidth}px`\n : typeof column.width === 'number'\n ? `${column.width}px`\n : column.width ??\n (stickyWidths[column.id] != null\n ? `${stickyWidths[column.id]}px`\n : `${DEFAULT_STICKY_DATA_COLUMN_WIDTH}px`);\n\n return {\n width: fallbackWidth,\n minWidth: fallbackWidth,\n maxWidth: fallbackWidth,\n };\n },\n [isStickyLeftColumn, isStickyRightColumn, stickyWidths, columnWidths]\n );\n\n const canResizeColumn = React.useCallback(\n (column: DataTableColumn<T>) => enableColumnResizing && column.resizable !== false,\n [enableColumnResizing]\n );\n\n const handleResizePointerDown = React.useCallback(\n (event: React.PointerEvent<HTMLDivElement>, column: DataTableColumn<T>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const startWidth =\n columnWidths[column.id] ??\n headerCellRefs.current[column.id]?.getBoundingClientRect().width ??\n DEFAULT_STICKY_DATA_COLUMN_WIDTH;\n\n resizeStateRef.current = { columnId: column.id, startX: event.clientX, startWidth };\n setResizingColumnId(column.id);\n event.currentTarget.setPointerCapture(event.pointerId);\n },\n [columnWidths]\n );\n\n const handleResizePointerMove = React.useCallback((event: React.PointerEvent<HTMLDivElement>) => {\n const state = resizeStateRef.current;\n if (!state) return;\n\n const nextWidth = Math.max(MIN_COLUMN_WIDTH, Math.round(state.startWidth + (event.clientX - state.startX)));\n setColumnWidths((prev) => (prev[state.columnId] === nextWidth ? prev : { ...prev, [state.columnId]: nextWidth }));\n }, []);\n\n const handleResizePointerUp = React.useCallback((event: React.PointerEvent<HTMLDivElement>) => {\n resizeStateRef.current = null;\n setResizingColumnId(null);\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n }, []);\n\n const handleResizeDoubleClick = React.useCallback((event: React.MouseEvent, column: DataTableColumn<T>) => {\n event.stopPropagation();\n setColumnWidths((prev) => {\n if (!(column.id in prev)) return prev;\n const next = { ...prev };\n delete next[column.id];\n return next;\n });\n }, []);\n\n const lastDataLengthRef = React.useRef(processedData.length);\n\n useEffect(() => {\n // Server-side: parent controls pageIndex, only update page count/total —\n // EXCEPT when the current pageIndex is no longer valid for the latest\n // totalCount (e.g. a filter/date-range change shrank the result set while\n // sitting on page 3 of a larger one). Left unclamped, the table keeps\n // requesting an out-of-bounds page forever and just renders empty.\n // Clamping to page 1 here flows back through the onStateChange effect\n // below, which re-fetches with the corrected page — self-healing without\n // every caller having to reset pagination itself on every filter change.\n if (manualPagination) {\n if (totalCount !== undefined) {\n const pageCount = Math.max(1, Math.ceil(totalCount / contextPageSize));\n const safePageIndex = pageIndex > pageCount ? 1 : pageIndex;\n updatePaginationCount({\n pageIndex: safePageIndex,\n pageCount,\n totalData: totalCount,\n });\n }\n return;\n }\n\n // Client-side: reset to page 1 when data changes, but keep the current\n // page on plain page navigation (otherwise pagination is unusable).\n const dataChanged = lastDataLengthRef.current !== processedData.length;\n lastDataLengthRef.current = processedData.length;\n updatePaginationCount({\n pageIndex: dataChanged ? 1 : pageIndex,\n pageCount: Math.ceil(processedData.length / contextPageSize),\n totalData: processedData.length,\n });\n }, [processedData.length, contextPageSize, updatePaginationCount, manualPagination, totalCount, pageIndex]);\n\n // Track when filters trigger a page reset so onStateChange sends page 1 immediately\n const filterResetRef = React.useRef(false);\n\n // Reset to page 1 when server-side filters/search/sort change\n useEffect(() => {\n if (manualPagination && (manualFiltering || manualSorting)) {\n filterResetRef.current = true;\n goToPage(1);\n }\n }, [filters, searchQuery, sort, manualPagination, manualFiltering, manualSorting]);\n\n // Notify parent of state changes (useful for server-side fetching)\n useEffect(() => {\n onStateChange?.({\n pageIndex: filterResetRef.current ? 1 : pageIndex,\n pageSize: contextPageSize,\n sort,\n filters: sanitizedFilters,\n search: showSearch\n ? {\n query: searchQuery,\n fields: searchFields?.length ? searchFields.map(String) : columns.map((column) => column.id),\n }\n : undefined,\n });\n filterResetRef.current = false;\n }, [pageIndex, contextPageSize, sort, sanitizedFilters, searchQuery, showSearch, onStateChange]);\n\n useEffect(() => {\n // Initialize column visibility on mount, preserving existing visibility state\n const initialVisibility = columns.reduce(\n (acc, col) => ({\n ...acc,\n [col.id]: isColumnVisible(col.id),\n }),\n {}\n );\n setVisibility(initialVisibility);\n }, [columns, setVisibility]);\n\n React.useLayoutEffect(() => {\n measureStickyOffsets();\n setContainerClientWidth(tableScrollContainerRef.current?.clientWidth ?? 0);\n }, [measureStickyOffsets, paginatedData, visibleColumns, showSelection, showExpand, columnWidths]);\n\n useEffect(() => {\n if (typeof ResizeObserver === 'undefined') return;\n\n const container = tableScrollContainerRef.current;\n if (!container) return;\n\n const observer = new ResizeObserver(() => {\n measureStickyOffsets();\n setContainerClientWidth(container.clientWidth);\n });\n\n observer.observe(container);\n\n return () => {\n observer.disconnect();\n };\n }, [measureStickyOffsets]);\n\n const getColumnValue = (row: T, column: DataTableColumn<T>): React.ReactNode => {\n if (column.cell) {\n return column.cell(row);\n }\n if (column.accessor) {\n if (typeof column.accessor === 'function') {\n return column.accessor(row);\n }\n return row[column.accessor as keyof T];\n }\n return null;\n };\n\n const getCopyText = (row: T, column: DataTableColumn<T>): string => {\n if (column.copyValue) return column.copyValue(row)\n if (column.accessor && typeof column.accessor !== 'function') {\n return String(row[column.accessor as keyof T] ?? '')\n }\n return String(row[column.id as keyof T] ?? '')\n };\n\n const renderSortIcon = (columnId: string) => {\n if (sort.column !== columnId) {\n return <ArrowUpDown className=\"h-4 w-4 text-muted-foreground\" />;\n }\n\n return sort.order === \"asc\" ? (\n <ArrowUpNarrowWide className=\"h-4 w-4\" />\n ) : (\n <ArrowDownNarrowWide className=\"h-4 w-4\" />\n );\n };\n\n if (error) {\n return (\n <div\n className=\"flex h-full min-h-60 w-full flex-1 flex-col items-center justify-center gap-3 rounded-xl border border-dashed border-destructive/30 bg-destructive/5 px-6 py-10 text-center animate-in fade-in zoom-in-95 duration-300 ease-out\"\n style={resolvedTableHeight ? { minHeight: resolvedTableHeight } : undefined}\n >\n <div className=\"flex size-12 shrink-0 items-center justify-center rounded-full bg-destructive/10\">\n <AlertCircle className=\"size-6 text-destructive\" />\n </div>\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-foreground\">{t('loadFailed')}</p>\n <p className=\"max-w-md text-sm text-muted-foreground\">{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={cn(isAutoHeight ? 'flex h-full min-h-0 flex-col gap-4' : 'space-y-4')}>\n {/* Filter Panel */}\n {(showSearch || toolbarLeft || (showFilters && filterableColumns.length > 0) || showColumnVisibility || toolbarRight) && (\n <div className=\"flex flex-col gap-3 md:flex-row md:items-center md:justify-between\">\n {showSearch ? (\n <div className=\"w-full md:max-w-md\">\n <label className=\"sr-only\" htmlFor=\"datatable-search\">\n Search\n </label>\n <div className=\"group relative w-fit\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground transition-colors group-focus-within:text-foreground\" />\n <Input\n id=\"datatable-search\"\n value={searchInput}\n onChange={(event) => setSearchInput(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n handleSearchSubmit();\n }\n }}\n placeholder={resolvedSearchPlaceholder}\n className=\"h-9 w-80 rounded-lg border-border/70 bg-muted/40 pl-9 pr-9 shadow-sm transition-colors focus-visible:bg-background\"\n />\n <button\n type=\"button\"\n onMouseDown={(event) => {\n if (!searchInput) return;\n event.preventDefault();\n }}\n onClick={(event) => {\n if (!searchInput) return;\n event.preventDefault();\n event.stopPropagation();\n handleSearchClear();\n }}\n className={cn(\n \"absolute right-1.5 top-1/2 inline-flex h-6 w-6 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground focus-visible:outline-none\",\n searchInput\n ? \"pointer-events-auto opacity-100 transition-colors hover:bg-muted hover:text-foreground\"\n : \"pointer-events-none opacity-0\"\n )}\n aria-label=\"Clear search\"\n tabIndex={searchInput ? 0 : -1}\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n ) : (\n toolbarLeft && <div className=\"flex items-center gap-2\">{toolbarLeft}</div>\n )}\n\n <div className=\"flex items-center gap-3 flex-1 justify-end\">\n {showFilters && filterableColumns.length > 0 && (\n <Button\n variant={showFilterPanel ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setShowFilterPanel(!showFilterPanel)}\n className=\"gap-2\"\n >\n <Filter className=\"h-4 w-4\" />\n Filters\n </Button>\n )}\n\n {showColumnVisibility && (\n <ColumnVisibilityPanel columns={columns} />\n )}\n\n {toolbarRight}\n </div>\n </div>\n )}\n\n {showFilterPanel && filterableColumns.length > 0 && (\n <FilterPanel\n columns={filterableColumns}\n onClose={() => setShowFilterPanel(false)}\n />\n )}\n\n {/* Selection Summary */}\n {showSelection && (\n <React.Suspense fallback={null}>\n <SelectionSummary actionLabel={labelSelection} />\n </React.Suspense>\n )}\n\n {/* Main Table */}\n <div\n ref={tableScrollContainerRef}\n className={cn(\n 'relative rounded-xl border border-border bg-card shadow-sm tms-scroll',\n isAutoHeight\n ? 'min-h-0 flex-1 overflow-auto'\n : resolvedTableHeight ? 'overflow-auto' : 'overflow-hidden'\n )}\n style={tableBodyStyle}\n >\n {/* {isLoading && (\n <div className=\"pointer-events-none sticky inset-x-0 top-0 z-80 h-0.5 w-full overflow-hidden bg-primary/15\">\n <div className=\"h-full w-full origin-left animate-pulse bg-primary\" />\n </div>\n )} */}\n <Table containerClassName={isScrollable ? 'overflow-visible' : undefined}>\n <TableHeader>\n <TableRow>\n {showSelection && (\n <TableHead\n ref={(node) => {\n if (stickySelection) {\n stickyCellRefs.current[STICKY_SELECTION_KEY] = node;\n }\n }}\n className={cn(\n \"h-11 text-center bg-muted sticky top-0\",\n stickySelection ? \"z-70\" : \"z-60\",\n stickySelection && isScrolled && STICKY_SELECTION_KEY === lastStickyLeftKey &&\n \"shadow-[10px_0_15px_-5px_rgba(0,0,0,0.15),inset_-8px_0_8px_-8px_rgba(0,0,0,0.12)]\"\n )}\n style={{\n left: stickySelection ? stickyOffsets[STICKY_SELECTION_KEY] ?? 0 : undefined,\n ...buildStickySizeStyle(undefined, STICKY_SELECTION_KEY),\n }}\n >\n <div className=\"flex items-center justify-center\">\n {effectiveSelectionMode === 'radio' ? (\n <span className=\"text-xs font-semibold text-muted-foreground\">Pilih</span>\n ) : (\n <SelectAllCheckbox\n rowIds={rowIds}\n totalCount={selectableTotalCount ?? totalCount}\n onSelectAllAttempt={onSelectAllAttempt}\n />\n )}\n </div>\n </TableHead>\n )}\n {showExpand && (\n <TableHead\n ref={(node) => {\n if (stickyExpand) {\n stickyCellRefs.current[STICKY_EXPAND_KEY] = node;\n }\n }}\n className={cn(\n \"h-11 text-center bg-muted sticky top-0\",\n stickyExpand ? \"z-70\" : \"z-60\",\n stickyExpand && isScrolled && STICKY_EXPAND_KEY === lastStickyLeftKey &&\n \"shadow-[10px_0_15px_-5px_rgba(0,0,0,0.15),inset_-8px_0_8px_-8px_rgba(0,0,0,0.12)]\"\n )}\n style={{\n left: stickyExpand ? stickyOffsets[STICKY_EXPAND_KEY] ?? 0 : undefined,\n ...buildStickySizeStyle(undefined, STICKY_EXPAND_KEY),\n }}\n >\n <div className=\"flex items-center justify-center\" aria-hidden=\"true\">\n <span className=\"block h-4 w-4\" />\n </div>\n </TableHead>\n )}\n {showRowNumber && (\n <TableHead\n ref={(node) => {\n if (stickyRowNumber) {\n stickyCellRefs.current[STICKY_ROW_NUMBER_KEY] = node;\n }\n }}\n className={cn(\n \"h-11 text-center bg-muted sticky top-0\",\n stickyRowNumber ? \"z-70\" : \"z-60\",\n stickyRowNumber && isScrolled && STICKY_ROW_NUMBER_KEY === lastStickyLeftKey &&\n \"shadow-[10px_0_15px_-5px_rgba(0,0,0,0.15),inset_-8px_0_8px_-8px_rgba(0,0,0,0.12)]\"\n )}\n style={{\n left: stickyRowNumber ? stickyOffsets[STICKY_ROW_NUMBER_KEY] ?? 0 : undefined,\n ...buildStickySizeStyle(TOOL_COLUMN_WIDTH, STICKY_ROW_NUMBER_KEY),\n }}\n >\n <div className=\"flex items-center justify-center text-xs font-semibold text-muted-foreground\">\n No\n </div>\n </TableHead>\n )}\n {visibleColumns.map((column) => (\n <TableHead\n key={column.id}\n ref={(node) => {\n headerCellRefs.current[column.id] = node;\n if (isStickyLeftColumn(column) || isStickyRightColumn(column)) {\n stickyCellRefs.current[column.id] = node;\n }\n }}\n className={cn(\n \"h-11 relative group/th\",\n isStickyLeftColumn(column)\n ? cn(\n 'sticky top-0 text-left bg-muted transition-[background-color,box-shadow] duration-200 z-70',\n isScrolled && column.id === lastStickyLeftKey &&\n \"shadow-[8px_0_16px_rgba(0,0,0,0.14),inset_-8px_0_8px_-8px_rgba(0,0,0,0.12)]\"\n )\n : isStickyRightColumn(column)\n ? cn(\n 'sticky top-0 text-left bg-muted transition-[background-color,box-shadow] duration-200 z-70',\n isScrolledEnd && column.id === lastStickyRightKey &&\n \"shadow-[-8px_0_16px_rgba(0,0,0,0.14),inset_8px_0_8px_-8px_rgba(0,0,0,0.12)]\"\n )\n : 'sticky top-0 z-60 text-left bg-muted',\n \"text-xs font-semibold text-muted-foreground\",\n column.headerClassName\n )}\n style={{\n ...getColumnStyle(column),\n left: isStickyLeftColumn(column) ? stickyOffsets[column.id] ?? 0 : undefined,\n right: isStickyRightColumn(column) ? stickyOffsets[column.id] ?? 0 : undefined,\n }}\n >\n <div className=\"flex justify-between items-center gap-1\">\n {column.sortable ? (\n <button\n onClick={() => toggleSort(column.id)}\n className=\"flex items-center gap-1.5 hover:text-foreground transition-colors\"\n >\n {column.header}\n {renderSortIcon(column.id)}\n </button>\n ) : (\n <span>{column.header}</span>\n )}\n <div className=\"flex shrink-0 items-center gap-1\">\n {column.filterable && column.filterConfig && (\n <ColumnHeaderFilter filterConfig={column.filterConfig} />\n )}\n {canPinColumn(column) && (\n <ColumnPinMenu\n pin={getEffectivePin(column)}\n onPin={(side) => pinColumn(column.id, side)}\n onUnpin={() => unpinColumn(column.id)}\n />\n )}\n </div>\n </div>\n {canResizeColumn(column) && (\n <div\n onPointerDown={(event) => handleResizePointerDown(event, column)}\n onPointerMove={handleResizePointerMove}\n onPointerUp={handleResizePointerUp}\n onClick={(event) => event.stopPropagation()}\n onDoubleClick={(event) => handleResizeDoubleClick(event, column)}\n className=\"absolute right-0 top-0 z-20 flex h-full w-2 cursor-col-resize touch-none select-none items-center justify-center\"\n >\n <div\n className={cn(\n \"h-4/6 w-px bg-border transition-colors group-hover/th:bg-muted-foreground/50\",\n resizingColumnId === column.id && \"w-0.5 bg-primary\"\n )}\n />\n </div>\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {isLoading ? (\n // Loading skeletons\n Array.from({ length: skeletonRowCount }).map((_, idx) => (\n <TableRow key={idx} className=\"border-b border-border/60\">\n {showSelection && (\n <TableCell className=\"py-3\">\n <Skeleton className=\"h-4 w-4 rounded\" />\n </TableCell>\n )}\n {showExpand && (\n <TableCell className=\"py-3\">\n <Skeleton className=\"h-4 w-4 rounded\" />\n </TableCell>\n )}\n {showRowNumber && (\n <TableCell className=\"py-3\">\n <Skeleton className=\"mx-auto h-4 w-5 rounded\" />\n </TableCell>\n )}\n {visibleColumns.map((column, colIdx) => (\n <TableCell key={column.id} className=\"py-3\">\n <Skeleton\n className=\"h-4 rounded\"\n style={{ width: SKELETON_CELL_WIDTHS[(idx + colIdx) % SKELETON_CELL_WIDTHS.length] }}\n />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : processedData.length === 0 ? (\n // Empty state\n <TableRow>\n <TableCell\n colSpan={\n visibleColumns.length +\n (showSelection ? 1 : 0) +\n (showExpand ? 1 : 0) +\n (showRowNumber ? 1 : 0)\n }\n className=\"p-0\"\n >\n <div\n className={cn(\n \"flex w-full flex-col items-center justify-center px-6 py-10 text-center animate-in fade-in zoom-in-95 duration-300 ease-out\",\n isScrollable ? \"min-h-[320px]\" : \"min-h-[240px]\"\n )}\n style={resolvedTableHeight\n ? { minHeight: `calc(${resolvedTableHeight} - 45px)` }\n : undefined}\n >\n <EmptyStateIllustration />\n <div className=\"text-center text-muted-foreground\">\n {emptyStateMessage}\n </div>\n </div>\n </TableCell>\n </TableRow>\n ) : (\n // Data rows\n paginatedData.map((row, index) => {\n const rowId = String(row[rowKey]);\n const isExpanded = isRowExpanded(rowId);\n\n return (\n <React.Fragment key={rowId}>\n <TableRow\n ref={(node) => registerRowElement(rowId, node)}\n onClick={() => onRowClick?.(row)}\n onMouseEnter={() => {\n cacheHoveredRowSurface(rowId)\n setHoveredRowId(rowId)\n }}\n onMouseLeave={() => {\n setHoveredRowId((current) => (current === rowId ? null : current))\n }}\n className={cn('group border-b border-border transition-colors duration-150 hover:bg-muted/60', rowClassName, {\n 'cursor-pointer': onRowClick,\n })}\n >\n {showSelection && (\n <TableCell\n onClick={(e) => e.stopPropagation()}\n className={cn(\n \"py-3 text-center transition-[background-color,box-shadow] duration-200\",\n !rowSurface.hasCustomSurface && 'group-hover:bg-muted',\n stickySelection && \"sticky z-45\",\n stickySelection && stickyFallbackSurface,\n stickySelection && isScrolled && STICKY_SELECTION_KEY === lastStickyLeftKey &&\n \"shadow-[8px_0_16px_rgba(0,0,0,0.14),inset_-8px_0_8px_-8px_rgba(0,0,0,0.12)]\"\n )}\n style={{\n ...getStickySurfaceStyle(rowId),\n left: stickySelection ? stickyOffsets[STICKY_SELECTION_KEY] ?? 0 : undefined,\n ...buildStickySizeStyle(undefined, STICKY_SELECTION_KEY),\n }}\n >\n <div className=\"flex items-center justify-center text-foreground/90\">\n {renderSelectionCell\n ? renderSelectionCell(row, rowId, <RowCheckbox rowId={rowId} currentPageRowIds={rowIds} />)\n : <RowCheckbox rowId={rowId} currentPageRowIds={rowIds} />\n }\n </div>\n </TableCell>\n )}\n {showExpand && (\n <TableCell\n onClick={(e) => e.stopPropagation()}\n className={cn(\n \"py-3 text-center transition-[background-color,box-shadow] duration-200\",\n !rowSurface.hasCustomSurface && 'group-hover:bg-muted',\n stickyExpand && \"sticky z-45\",\n stickyExpand && stickyFallbackSurface,\n stickyExpand && isScrolled && STICKY_EXPAND_KEY === lastStickyLeftKey &&\n \"shadow-[8px_0_16px_rgba(0,0,0,0.14),inset_-8px_0_8px_-8px_rgba(0,0,0,0.12)]\"\n )}\n style={{\n ...getStickySurfaceStyle(rowId),\n left: stickyExpand ? stickyOffsets[STICKY_EXPAND_KEY] ?? 0 : undefined,\n ...buildStickySizeStyle(undefined, STICKY_EXPAND_KEY),\n }}\n >\n <div className=\"flex items-center justify-center text-foreground/90\">\n <ExpandableRow rowId={rowId} />\n </div>\n </TableCell>\n )}\n {showRowNumber && (\n <TableCell\n className={cn(\n \"py-3 text-center font-medium text-muted-foreground text-xs transition-[background-color,box-shadow] duration-200\",\n !rowSurface.hasCustomSurface && 'group-hover:bg-muted',\n stickyRowNumber && \"sticky z-45\",\n stickyRowNumber && stickyFallbackSurface,\n stickyRowNumber && isScrolled && STICKY_ROW_NUMBER_KEY === lastStickyLeftKey &&\n \"shadow-[8px_0_16px_rgba(0,0,0,0.14),inset_-8px_0_8px_-8px_rgba(0,0,0,0.12)]\"\n )}\n style={{\n ...getStickySurfaceStyle(rowId),\n left: stickyRowNumber ? stickyOffsets[STICKY_ROW_NUMBER_KEY] ?? 0 : undefined,\n ...buildStickySizeStyle(TOOL_COLUMN_WIDTH, STICKY_ROW_NUMBER_KEY),\n }}\n >\n <div className=\"flex items-center justify-center text-foreground/90\">\n {manualPagination && paginationMode === 'infinite' ? index + 1 : ((pageIndex - 1) * contextPageSize) + index + 1}\n </div>\n </TableCell>\n )}\n {visibleColumns.map((column) => (\n <TableCell\n key={column.id}\n className={cn(\n \"py-3\",\n !column.copyable && 'truncate',\n isStickyLeftColumn(column) &&\n cn(\n 'sticky z-45 transition-[background-color,box-shadow] duration-200',\n !rowSurface.hasCustomSurface && stickyFallbackSurface,\n isScrolled && column.id === lastStickyLeftKey &&\n \"shadow-[8px_0_16px_rgba(0,0,0,0.14),inset_-8px_0_8px_-8px_rgba(0,0,0,0.12)]\"\n ),\n isStickyRightColumn(column) &&\n cn(\n 'sticky z-45 transition-[background-color,box-shadow] duration-200',\n !rowSurface.hasCustomSurface && stickyFallbackSurface,\n isScrolledEnd && column.id === lastStickyRightKey &&\n \"shadow-[-8px_0_16px_rgba(0,0,0,0.14),inset_8px_0_8px_-8px_rgba(0,0,0,0.12)]\"\n ),\n 'text-foreground/90',\n typeof column.className === 'function' ? column.className(row) : column.className\n )}\n style={{\n ...(isStickyLeftColumn(column) || isStickyRightColumn(column) ? getStickySurfaceStyle(rowId) : undefined),\n ...getColumnStyle(column),\n left: isStickyLeftColumn(column) ? stickyOffsets[column.id] ?? 0 : undefined,\n right: isStickyRightColumn(column) ? stickyOffsets[column.id] ?? 0 : undefined,\n }}\n >\n {column.copyable\n ? <CopyCell text={getCopyText(row, column)}>{getColumnValue(row, column)}</CopyCell>\n : getColumnValue(row, column)\n }\n </TableCell>\n ))}\n </TableRow>\n {showExpand && isExpanded && (expandContent || (onExpandLoad && expandLoadContent)) && (\n <TableRow className=\"hover:bg-transparent\">\n <TableCell\n colSpan={\n visibleColumns.length +\n (showSelection ? 1 : 0) +\n (showExpand ? 1 : 0) +\n (showRowNumber ? 1 : 0)\n }\n className=\"p-0 border-t border-border/40\"\n >\n {/* sticky div: always visible at left=0, width = visible container width.\n This prevents the expanded content from scrolling with the main table. */}\n <div\n style={{\n position: 'sticky',\n left: 0,\n width: containerClientWidth > 0 ? containerClientWidth : undefined,\n boxSizing: 'border-box',\n zIndex: 1,\n ...getStickySurfaceStyle(rowId),\n }}\n className={cn(\n \"animate-in fade-in slide-in-from-top-1 duration-200 ease-out\",\n !rowSurface.hasCustomSurface && 'bg-card'\n )}\n >\n <div className=\"p-4\">\n {onExpandLoad && expandLoadContent\n ? <ExpandedRowLoader row={row} onLoad={onExpandLoad} renderContent={expandLoadContent} />\n : expandContent?.(row)\n }\n </div>\n </div>\n </TableCell>\n </TableRow>\n )}\n </React.Fragment>\n );\n })\n )}\n </TableBody>\n </Table>\n </div>\n\n {/* Pagination */}\n {paginationMode === 'traditional' && (\n <TraditionalPagination pageSizeOptions={pageSizeOptions} />\n )}\n {paginationMode === 'infinite' && (\n <InfiniteScrollPagination isLoading={isLoading} />\n )}\n </div>\n );\n}\n\n/**\n * Self-contained data table: owns its filter/pagination/selection/sort/\n * column-visibility state internally, so callers never render a separate\n * provider. `pageSize`, `selectionMode` and `defaultColumnVisibility` seed\n * that internal state on mount and are the single source of truth for it —\n * there is no separate provider-level prop to keep in sync.\n *\n * Escape hatch: if a sibling component (e.g. a custom toolbar button above\n * the table) needs to read the same selection/filter state via\n * `useSelection()` / `useFilters()` etc., wrap both in an explicit\n * `<DataTableProvider>` yourself — `<DataTable>` detects that ambient\n * provider and reuses it instead of creating a disconnected nested one.\n */\nfunction DataTable<T extends Record<string, any>>(props: DataTableProps<T>) {\n const ambientPagination = useContext(PaginationContext);\n if (ambientPagination) {\n return <DataTableInner<T> {...props} />;\n }\n\n return (\n <DataTableProvider\n defaultPageSize={props.pageSize}\n selectionMode={props.selectionMode}\n defaultColumnVisibility={props.defaultColumnVisibility}\n defaultColumnPinning={props.defaultColumnPinning}\n >\n <DataTableInner<T> {...props} />\n </DataTableProvider>\n );\n}\n\nexport { DataTable }\n","import { FilterValue, SortState } from './types';\r\n\r\nexport interface QueryParams {\r\n pageIndex: number;\r\n pageSize: number;\r\n sortBy?: string;\r\n sortOrder?: 'asc' | 'desc';\r\n search?: string;\r\n searchFields?: string[];\r\n [key: string]: any;\r\n}\r\n\r\nexport interface SearchQuery {\r\n query: string;\r\n fields: string[];\r\n}\r\n\r\n/**\r\n * Build query parameters untuk API request\r\n */\r\nexport function buildQueryParams(\r\n pageIndex: number,\r\n pageSize: number,\r\n filters: FilterValue[],\r\n sort: SortState,\r\n additionalParams?: Record<string, any>,\r\n search?: SearchQuery\r\n): QueryParams {\r\n const params: QueryParams = {\r\n pageIndex,\r\n pageSize,\r\n };\r\n\r\n // Add sort parameters\r\n if (sort.column) {\r\n params.sortBy = sort.column;\r\n params.sortOrder = sort.order || 'asc';\r\n }\r\n\r\n // Add filters\r\n filters.forEach((filter) => {\r\n const filterKey = `filters[${filter.field}]`;\r\n \r\n if (filter.type === 'dateRange' && Array.isArray(filter.value)) {\r\n params[`${filterKey}[from]`] = filter.value[0];\r\n params[`${filterKey}[to]`] = filter.value[1];\r\n } else if (filter.type === 'range' && Array.isArray(filter.value)) {\r\n params[`${filterKey}[min]`] = filter.value[0];\r\n params[`${filterKey}[max]`] = filter.value[1];\r\n } else if (filter.type === 'multiSelect' && Array.isArray(filter.value)) {\r\n params[`${filterKey}[]`] = filter.value;\r\n } else {\r\n params[filterKey] = filter.value;\r\n }\r\n });\r\n\r\n if (search?.query?.trim()) {\r\n params.search = search.query.trim();\r\n if (search.fields?.length) {\r\n params.searchFields = search.fields;\r\n }\r\n }\r\n\r\n // Add additional parameters\r\n if (additionalParams) {\r\n Object.assign(params, additionalParams);\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * Convert query params to URL search params\r\n */\r\nexport function paramsToURLSearchParams(params: QueryParams): URLSearchParams {\r\n const searchParams = new URLSearchParams();\r\n\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value === null || value === undefined) {\r\n return;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n value.forEach((item) => {\r\n searchParams.append(key, String(item));\r\n });\r\n } else {\r\n searchParams.set(key, String(value));\r\n }\r\n });\r\n\r\n return searchParams;\r\n}\r\n\r\n/**\r\n * Build URL dengan query parameters\r\n */\r\nexport function buildURL(baseURL: string, params: QueryParams): string {\r\n const url = new URL(baseURL);\r\n const searchParams = paramsToURLSearchParams(params);\r\n \r\n url.search = searchParams.toString();\r\n return url.toString();\r\n}\r\n","{\r\n \"copy\": \"Copy\",\r\n \"copied\": \"Copied\",\r\n \"copyFailed\": \"Copy failed\",\r\n \"copyTooltip\": \"Copy to clipboard\",\r\n \"search\": \"Search...\",\r\n \"loadFailed\": \"Failed to load data\",\r\n \"pagination\": {\r\n \"previous\": \"Previous\",\r\n \"next\": \"Next\",\r\n \"page\": \"Page\",\r\n \"of\": \"of\",\r\n \"showing\": \"Showing\",\r\n \"to\": \"to\",\r\n \"from\": \"from\",\r\n \"results\": \"results\",\r\n \"rows\": \"rows\",\r\n \"rowsPerPage\": \"Rows per page\"\r\n },\r\n \"filters\": {\r\n \"dateTree\": {\r\n \"inputPlaceholder\": \"Search year, month, day...\",\r\n \"dataNotFound\": \"No data found\",\r\n \"notFound\": \"Not found\"\r\n },\r\n \"multiSelect\": {\r\n \"selectAll\": \"Select all\",\r\n \"unselectAll\": \"Unselect all\",\r\n \"searchPlaceholder\": \"Search...\",\r\n \"result\": \"result\",\r\n \"showing\": \"Showing\",\r\n \"dataNotFound\": \"No data found\",\r\n \"selected\": \"selected\"\r\n },\r\n \"select\": {\r\n \"selectAll\": \"Select all\",\r\n \"unselectAll\": \"Unselect all\",\r\n \"searchPlaceholder\": \"Search...\",\r\n \"dataNotFound\": \"No data found\"\r\n }\r\n },\r\n \"columnPin\": {\r\n \"pinLeft\": \"Pin left\",\r\n \"pinRight\": \"Pin right\",\r\n \"unpin\": \"Unpin\",\r\n \"pinned\": \"Pinned\",\r\n \"pinning\": \"Pin column\",\r\n \"unpinning\": \"Unpinning\"\r\n },\r\n \"column\": \"Column\",\r\n \"showColumns\": \"Show columns\",\r\n \"of\": \"of\",\r\n \"column_plural\": \"columns shown\",\r\n \"totalSelected\": \"Total selected\",\r\n \"clearSelections\": \"Clear selections\",\r\n \"selectDateRange\": \"Select date range\"\r\n}\r\n","import en from './en.json'\n\n/** i18next namespace used by every `useTranslation` call in this package. */\nexport const DATATABLE_NS = 'datatable'\n\n/** Default English strings for the `datatable` namespace. */\nexport const datatableEn = en\n"]}