@tetrascience-npm/tetrascience-react-ui 0.5.0-beta.57.1 → 0.5.0-beta.58.1

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.
Files changed (75) hide show
  1. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +2 -0
  2. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -0
  3. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +140 -0
  4. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js.map +1 -0
  5. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +2 -0
  6. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -0
  7. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +126 -0
  8. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js.map +1 -0
  9. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs +2 -0
  10. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs.map +1 -0
  11. package/dist/components/composed/PlateMapEditor/PlateMapEditor.js +422 -0
  12. package/dist/components/composed/PlateMapEditor/PlateMapEditor.js.map +1 -0
  13. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +2 -0
  14. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -0
  15. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +136 -0
  16. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js.map +1 -0
  17. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs +2 -0
  18. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs.map +1 -0
  19. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +389 -0
  20. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -0
  21. package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs +2 -0
  22. package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs.map +1 -0
  23. package/dist/components/composed/PlateMapEditor/PlateZoomControl.js +54 -0
  24. package/dist/components/composed/PlateMapEditor/PlateZoomControl.js.map +1 -0
  25. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs +2 -0
  26. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs.map +1 -0
  27. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.js +96 -0
  28. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.js.map +1 -0
  29. package/dist/components/composed/PlateMapEditor/WellLegend.cjs +2 -0
  30. package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -0
  31. package/dist/components/composed/PlateMapEditor/WellLegend.js +58 -0
  32. package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -0
  33. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +2 -0
  34. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -0
  35. package/dist/components/composed/PlateMapEditor/WellManifestTable.js +408 -0
  36. package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -0
  37. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs +2 -0
  38. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs.map +1 -0
  39. package/dist/components/composed/PlateMapEditor/WellMetadataForm.js +177 -0
  40. package/dist/components/composed/PlateMapEditor/WellMetadataForm.js.map +1 -0
  41. package/dist/components/composed/PlateMapEditor/autoFill.cjs +2 -0
  42. package/dist/components/composed/PlateMapEditor/autoFill.cjs.map +1 -0
  43. package/dist/components/composed/PlateMapEditor/autoFill.js +41 -0
  44. package/dist/components/composed/PlateMapEditor/autoFill.js.map +1 -0
  45. package/dist/components/composed/PlateMapEditor/csvPlateTriage.cjs +4 -0
  46. package/dist/components/composed/PlateMapEditor/csvPlateTriage.cjs.map +1 -0
  47. package/dist/components/composed/PlateMapEditor/csvPlateTriage.js +103 -0
  48. package/dist/components/composed/PlateMapEditor/csvPlateTriage.js.map +1 -0
  49. package/dist/components/composed/PlateMapEditor/helpers.cjs +2 -0
  50. package/dist/components/composed/PlateMapEditor/helpers.cjs.map +1 -0
  51. package/dist/components/composed/PlateMapEditor/helpers.js +11 -0
  52. package/dist/components/composed/PlateMapEditor/helpers.js.map +1 -0
  53. package/dist/components/composed/PlateMapEditor/wellGrid.cjs +2 -0
  54. package/dist/components/composed/PlateMapEditor/wellGrid.cjs.map +1 -0
  55. package/dist/components/composed/PlateMapEditor/wellGrid.js +56 -0
  56. package/dist/components/composed/PlateMapEditor/wellGrid.js.map +1 -0
  57. package/dist/components/ui/data-table/data-table-filter.cjs +1 -1
  58. package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -1
  59. package/dist/components/ui/data-table/data-table-filter.js +124 -139
  60. package/dist/components/ui/data-table/data-table-filter.js.map +1 -1
  61. package/dist/components/ui/data-table/data-table.cjs +1 -1
  62. package/dist/components/ui/data-table/data-table.cjs.map +1 -1
  63. package/dist/components/ui/data-table/data-table.js +1 -0
  64. package/dist/components/ui/data-table/data-table.js.map +1 -1
  65. package/dist/components/ui/popover.cjs +2 -0
  66. package/dist/components/ui/popover.cjs.map +1 -0
  67. package/dist/components/ui/popover.js +45 -0
  68. package/dist/components/ui/popover.js.map +1 -0
  69. package/dist/index.cjs +1 -1
  70. package/dist/index.css +1 -1
  71. package/dist/index.d.ts +555 -0
  72. package/dist/index.js +637 -595
  73. package/dist/index.js.map +1 -1
  74. package/dist/index.tailwind.css +1 -1
  75. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"data-table-filter.cjs","sources":["../../../../src/components/ui/data-table/data-table-filter.tsx"],"sourcesContent":["\"use client\"\n\nimport { ListFilterIcon, PlusIcon, XIcon } from \"lucide-react\"\nimport { Popover } from \"radix-ui\"\n\nimport { useDataTable } from \"./data-table\"\n\nimport type { FilterColumnConfig, FilterCondition, FilterOperator } from \"./data-table\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Operator metadata\n// ---------------------------------------------------------------------------\n\nconst OPERATOR_LABELS: Record<FilterOperator, string> = {\n contains: \"contains\",\n equals: \"equals\",\n not_equals: \"not equals\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n is_empty: \"is empty\",\n is_not_empty: \"is not empty\",\n}\n\nconst VALUE_FREE_OPERATORS: FilterOperator[] = [\"is_empty\", \"is_not_empty\"]\n\nconst DEFAULT_OPERATORS: FilterOperator[] = [\n \"contains\",\n \"equals\",\n \"not_equals\",\n \"starts_with\",\n \"ends_with\",\n \"is_empty\",\n \"is_not_empty\",\n]\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getColumnLabel(\n colId: string,\n columnLabels: Record<string, string>,\n\n col: any,\n): string {\n return (\n columnLabels[colId] ??\n (col?.columnDef?.meta as { label?: string } | undefined)?.label ??\n (typeof col?.columnDef?.header === \"string\" ? col.columnDef.header : undefined) ??\n colId\n )\n}\n\nfunction makeCondition(\n columnId: string,\n allowedOperators?: FilterOperator[],\n): FilterCondition {\n const operator = allowedOperators?.[0] ?? \"contains\"\n return { id: crypto.randomUUID(), columnId, operator, value: \"\" }\n}\n\n// ---------------------------------------------------------------------------\n// DataTableFilter\n// ---------------------------------------------------------------------------\n\ninterface DataTableFilterProps {\n className?: string\n}\n\nfunction DataTableFilter({ className }: DataTableFilterProps) {\n const { table, columnLabels, filters, setFilters, filterConfig, enableFiltering } =\n useDataTable()\n\n if (!enableFiltering) return null\n\n const allLeafColumns = table.getAllLeafColumns()\n\n const resolvedColumns: FilterColumnConfig[] =\n filterConfig.length > 0\n ? filterConfig\n : allLeafColumns\n .filter((col) => \"accessorKey\" in col.columnDef || \"accessorFn\" in col.columnDef)\n .map((col) => ({ columnId: col.id }))\n\n const firstColumn = resolvedColumns[0]\n const firstColumnId = firstColumn?.columnId ?? \"\"\n\n function addFilter() {\n setFilters([...filters, makeCondition(firstColumnId, firstColumn?.operators)])\n }\n\n function removeFilter(id: string) {\n setFilters(filters.filter((f) => f.id !== id))\n }\n\n function updateFilter(id: string, patch: Partial<FilterCondition>) {\n setFilters(filters.map((f) => (f.id === id ? { ...f, ...patch } : f)))\n }\n\n function clearAll() {\n setFilters([])\n }\n\n const activeCount = filters.length\n\n return (\n <Popover.Root>\n <Popover.Trigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n data-slot=\"data-table-filter\"\n className={cn(className)}\n aria-label={activeCount > 0 ? `Filter (${activeCount} active)` : \"Filter\"}\n >\n <ListFilterIcon className=\"size-3.5\" />\n Filter\n {activeCount > 0 && (\n <span className=\"flex size-4 items-center justify-center rounded-full bg-primary text-[10px] font-medium text-primary-foreground\">\n {activeCount}\n </span>\n )}\n </Button>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n data-slot=\"data-table-filter-panel\"\n align=\"end\"\n sideOffset={4}\n className={cn(\n \"z-50 min-w-80 rounded-lg border bg-popover p-3 text-popover-foreground shadow-md outline-none\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2\",\n )}\n >\n <div className=\"flex flex-col gap-2\">\n {filters.map((condition) => {\n const colConfig = resolvedColumns.find((c) => c.columnId === condition.columnId)\n const operators = colConfig?.operators ?? DEFAULT_OPERATORS\n const isValueFree = VALUE_FREE_OPERATORS.includes(condition.operator)\n\n return (\n <div key={condition.id} className=\"flex items-center gap-2\">\n {/* Column selector */}\n <Select\n value={condition.columnId}\n onValueChange={(v) => {\n const nextConfig = resolvedColumns.find((c) => c.columnId === v)\n const nextOperators = nextConfig?.operators ?? DEFAULT_OPERATORS\n const nextOperator = nextOperators.includes(condition.operator)\n ? condition.operator\n : (nextOperators[0] ?? \"contains\")\n updateFilter(condition.id, {\n columnId: v,\n operator: nextOperator,\n value: \"\",\n })\n }}\n >\n <SelectTrigger size=\"sm\" className=\"w-36\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {resolvedColumns.map((c) => {\n const col = allLeafColumns.find((lc) => lc.id === c.columnId)\n return (\n <SelectItem key={c.columnId} value={c.columnId}>\n {c.label ?? getColumnLabel(c.columnId, columnLabels, col)}\n </SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n\n {/* Operator selector */}\n <Select\n value={condition.operator}\n onValueChange={(v) =>\n updateFilter(condition.id, {\n operator: v as FilterOperator,\n value: \"\",\n })\n }\n >\n <SelectTrigger size=\"sm\" className=\"w-32\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {operators.map((op) => (\n <SelectItem key={op} value={op}>\n {OPERATOR_LABELS[op]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Value input — hidden for value-free operators */}\n {isValueFree ? (\n <div className=\"h-8 w-40\" aria-hidden />\n ) : (\n <Input\n className=\"w-40\"\n placeholder=\"Value…\"\n value={condition.value}\n onChange={(e) => updateFilter(condition.id, { value: e.target.value })}\n />\n )}\n\n {/* Remove button */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={() => removeFilter(condition.id)}\n aria-label=\"Remove filter\"\n >\n <XIcon className=\"size-3.5\" />\n </Button>\n </div>\n )\n })}\n\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addFilter}\n disabled={resolvedColumns.length === 0}\n >\n <PlusIcon className=\"size-3.5\" />\n Add filter\n </Button>\n {filters.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-muted-foreground\"\n onClick={clearAll}\n >\n Clear all\n </Button>\n )}\n </div>\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )\n}\n\nDataTableFilter.displayName = \"DataTableFilter\"\n\nexport { DataTableFilter }\nexport type { DataTableFilterProps }\n"],"names":["OPERATOR_LABELS","VALUE_FREE_OPERATORS","DEFAULT_OPERATORS","getColumnLabel","colId","columnLabels","col","makeCondition","columnId","allowedOperators","operator","DataTableFilter","className","table","filters","setFilters","filterConfig","enableFiltering","useDataTable","allLeafColumns","resolvedColumns","firstColumn","firstColumnId","addFilter","removeFilter","id","f","updateFilter","patch","clearAll","activeCount","jsxs","Popover","jsx","Button","cn","ListFilterIcon","condition","operators","c","isValueFree","Select","v","nextOperators","nextOperator","SelectTrigger","SelectValue","SelectContent","lc","SelectItem","op","Input","e","XIcon","PlusIcon"],"mappings":"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"}
1
+ {"version":3,"file":"data-table-filter.cjs","sources":["../../../../src/components/ui/data-table/data-table-filter.tsx"],"sourcesContent":["\"use client\"\n\nimport { ListFilterIcon, PlusIcon, XIcon } from \"lucide-react\"\n\nimport { useDataTable } from \"./data-table\"\n\nimport type { FilterColumnConfig, FilterCondition, FilterOperator } from \"./data-table\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Operator metadata\n// ---------------------------------------------------------------------------\n\nconst OPERATOR_LABELS: Record<FilterOperator, string> = {\n contains: \"contains\",\n equals: \"equals\",\n not_equals: \"not equals\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n is_empty: \"is empty\",\n is_not_empty: \"is not empty\",\n}\n\nconst VALUE_FREE_OPERATORS: FilterOperator[] = [\"is_empty\", \"is_not_empty\"]\n\nconst DEFAULT_OPERATORS: FilterOperator[] = [\n \"contains\",\n \"equals\",\n \"not_equals\",\n \"starts_with\",\n \"ends_with\",\n \"is_empty\",\n \"is_not_empty\",\n]\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getColumnLabel(\n colId: string,\n columnLabels: Record<string, string>,\n\n col: any,\n): string {\n return (\n columnLabels[colId] ??\n (col?.columnDef?.meta as { label?: string } | undefined)?.label ??\n (typeof col?.columnDef?.header === \"string\" ? col.columnDef.header : undefined) ??\n colId\n )\n}\n\nfunction makeCondition(\n columnId: string,\n allowedOperators?: FilterOperator[],\n): FilterCondition {\n const operator = allowedOperators?.[0] ?? \"contains\"\n return { id: crypto.randomUUID(), columnId, operator, value: \"\" }\n}\n\n// ---------------------------------------------------------------------------\n// DataTableFilter\n// ---------------------------------------------------------------------------\n\ninterface DataTableFilterProps {\n className?: string\n}\n\nfunction DataTableFilter({ className }: DataTableFilterProps) {\n const { table, columnLabels, filters, setFilters, filterConfig, enableFiltering } =\n useDataTable()\n\n if (!enableFiltering) return null\n\n const allLeafColumns = table.getAllLeafColumns()\n\n const resolvedColumns: FilterColumnConfig[] =\n filterConfig.length > 0\n ? filterConfig\n : allLeafColumns\n .filter((col) => \"accessorKey\" in col.columnDef || \"accessorFn\" in col.columnDef)\n .map((col) => ({ columnId: col.id }))\n\n const firstColumn = resolvedColumns[0]\n const firstColumnId = firstColumn?.columnId ?? \"\"\n\n function addFilter() {\n setFilters([...filters, makeCondition(firstColumnId, firstColumn?.operators)])\n }\n\n function removeFilter(id: string) {\n setFilters(filters.filter((f) => f.id !== id))\n }\n\n function updateFilter(id: string, patch: Partial<FilterCondition>) {\n setFilters(filters.map((f) => (f.id === id ? { ...f, ...patch } : f)))\n }\n\n function clearAll() {\n setFilters([])\n }\n\n const activeCount = filters.length\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n data-slot=\"data-table-filter\"\n className={cn(className)}\n aria-label={activeCount > 0 ? `Filter (${activeCount} active)` : \"Filter\"}\n >\n <ListFilterIcon className=\"size-3.5\" />\n Filter\n {activeCount > 0 && (\n <span className=\"flex size-4 items-center justify-center rounded-full bg-primary text-[10px] font-medium text-primary-foreground\">\n {activeCount}\n </span>\n )}\n </Button>\n </PopoverTrigger>\n\n <PopoverContent data-slot=\"data-table-filter-panel\" align=\"end\" className=\"min-w-80\">\n <div className=\"flex flex-col gap-2\">\n {filters.map((condition) => {\n const colConfig = resolvedColumns.find((c) => c.columnId === condition.columnId)\n const operators = colConfig?.operators ?? DEFAULT_OPERATORS\n const isValueFree = VALUE_FREE_OPERATORS.includes(condition.operator)\n\n return (\n <div key={condition.id} className=\"flex items-center gap-2\">\n {/* Column selector */}\n <Select\n value={condition.columnId}\n onValueChange={(v) => {\n const nextConfig = resolvedColumns.find((c) => c.columnId === v)\n const nextOperators = nextConfig?.operators ?? DEFAULT_OPERATORS\n const nextOperator = nextOperators.includes(condition.operator)\n ? condition.operator\n : (nextOperators[0] ?? \"contains\")\n updateFilter(condition.id, {\n columnId: v,\n operator: nextOperator,\n value: \"\",\n })\n }}\n >\n <SelectTrigger size=\"sm\" className=\"w-36\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {resolvedColumns.map((c) => {\n const col = allLeafColumns.find((lc) => lc.id === c.columnId)\n return (\n <SelectItem key={c.columnId} value={c.columnId}>\n {c.label ?? getColumnLabel(c.columnId, columnLabels, col)}\n </SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n\n {/* Operator selector */}\n <Select\n value={condition.operator}\n onValueChange={(v) =>\n updateFilter(condition.id, {\n operator: v as FilterOperator,\n value: \"\",\n })\n }\n >\n <SelectTrigger size=\"sm\" className=\"w-32\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {operators.map((op) => (\n <SelectItem key={op} value={op}>\n {OPERATOR_LABELS[op]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Value input — hidden for value-free operators */}\n {isValueFree ? (\n <div className=\"h-8 w-40\" aria-hidden />\n ) : (\n <Input\n className=\"w-40\"\n placeholder=\"Value…\"\n value={condition.value}\n onChange={(e) => updateFilter(condition.id, { value: e.target.value })}\n />\n )}\n\n {/* Remove button */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={() => removeFilter(condition.id)}\n aria-label=\"Remove filter\"\n >\n <XIcon className=\"size-3.5\" />\n </Button>\n </div>\n )\n })}\n\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addFilter}\n disabled={resolvedColumns.length === 0}\n >\n <PlusIcon className=\"size-3.5\" />\n Add filter\n </Button>\n {filters.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-muted-foreground\"\n onClick={clearAll}\n >\n Clear all\n </Button>\n )}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nDataTableFilter.displayName = \"DataTableFilter\"\n\nexport { DataTableFilter }\nexport type { DataTableFilterProps }\n"],"names":["OPERATOR_LABELS","VALUE_FREE_OPERATORS","DEFAULT_OPERATORS","getColumnLabel","colId","columnLabels","col","makeCondition","columnId","allowedOperators","operator","DataTableFilter","className","table","filters","setFilters","filterConfig","enableFiltering","useDataTable","allLeafColumns","resolvedColumns","firstColumn","firstColumnId","addFilter","removeFilter","id","f","updateFilter","patch","clearAll","activeCount","Popover","jsx","PopoverTrigger","jsxs","Button","cn","ListFilterIcon","PopoverContent","condition","operators","c","isValueFree","Select","v","nextOperators","nextOperator","SelectTrigger","SelectValue","SelectContent","lc","SelectItem","op","Input","e","XIcon","PlusIcon"],"mappings":"6TAwBMA,EAAkD,CACtD,SAAc,WACd,OAAc,SACd,WAAc,aACd,YAAc,cACd,UAAc,YACd,SAAc,WACd,aAAc,cAChB,EAEMC,EAAyC,CAAC,WAAY,cAAc,EAEpEC,EAAsC,CAC1C,WACA,SACA,aACA,cACA,YACA,WACA,cACF,EAMA,SAASC,EACPC,EACAC,EAEAC,EACQ,CACR,OACED,EAAaD,CAAK,GACjBE,GAAK,WAAW,MAAyC,QACzD,OAAOA,GAAK,WAAW,QAAW,SAAWA,EAAI,UAAU,OAAS,SACrEF,CAEJ,CAEA,SAASG,EACPC,EACAC,EACiB,CACjB,MAAMC,EAAWD,IAAmB,CAAC,GAAK,WAC1C,MAAO,CAAE,GAAI,OAAO,WAAA,EAAc,SAAAD,EAAU,SAAAE,EAAU,MAAO,EAAA,CAC/D,CAUA,SAASC,EAAgB,CAAE,UAAAC,GAAmC,CAC5D,KAAM,CAAE,MAAAC,EAAO,aAAAR,EAAc,QAAAS,EAAS,WAAAC,EAAY,aAAAC,EAAc,gBAAAC,CAAA,EAC9DC,eAAA,EAEF,GAAI,CAACD,EAAiB,OAAO,KAE7B,MAAME,EAAiBN,EAAM,kBAAA,EAEvBO,EACJJ,EAAa,OAAS,EAClBA,EACAG,EACG,OAAQb,GAAQ,gBAAiBA,EAAI,WAAa,eAAgBA,EAAI,SAAS,EAC/E,IAAKA,IAAS,CAAE,SAAUA,EAAI,EAAA,EAAK,EAEtCe,EAAcD,EAAgB,CAAC,EAC/BE,EAAgBD,GAAa,UAAY,GAE/C,SAASE,GAAY,CACnBR,EAAW,CAAC,GAAGD,EAASP,EAAce,EAAeD,GAAa,SAAS,CAAC,CAAC,CAC/E,CAEA,SAASG,EAAaC,EAAY,CAChCV,EAAWD,EAAQ,OAAQY,GAAMA,EAAE,KAAOD,CAAE,CAAC,CAC/C,CAEA,SAASE,EAAaF,EAAYG,EAAiC,CACjEb,EAAWD,EAAQ,IAAKY,GAAOA,EAAE,KAAOD,EAAK,CAAE,GAAGC,EAAG,GAAGE,CAAA,EAAUF,CAAE,CAAC,CACvE,CAEA,SAASG,GAAW,CAClBd,EAAW,CAAA,CAAE,CACf,CAEA,MAAMe,EAAchB,EAAQ,OAE5B,cACGiB,UAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAAA,eAAA,CAAe,QAAO,GACrB,SAAAC,EAAAA,KAACC,EAAAA,OAAA,CACC,KAAK,SACL,QAAQ,UACR,KAAK,KACL,YAAU,oBACV,UAAWC,EAAAA,GAAGxB,CAAS,EACvB,aAAYkB,EAAc,EAAI,WAAWA,CAAW,WAAa,SAEjE,SAAA,CAAAE,EAAAA,IAACK,EAAAA,eAAA,CAAe,UAAU,UAAA,CAAW,EAAE,SAEtCP,EAAc,GACbE,EAAAA,IAAC,OAAA,CAAK,UAAU,kHACb,SAAAF,CAAA,CACH,CAAA,CAAA,CAAA,EAGN,EAEAE,EAAAA,IAACM,EAAAA,eAAA,CAAe,YAAU,0BAA0B,MAAM,MAAM,UAAU,WACtE,SAAAJ,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACZ,SAAA,CAAApB,EAAQ,IAAKyB,GAAc,CAE1B,MAAMC,EADYpB,EAAgB,KAAMqB,GAAMA,EAAE,WAAaF,EAAU,QAAQ,GAClD,WAAarC,EACpCwC,EAAczC,EAAqB,SAASsC,EAAU,QAAQ,EAEpE,OACEL,EAAAA,KAAC,MAAA,CAAuB,UAAU,0BAEhC,SAAA,CAAAA,EAAAA,KAACS,EAAAA,OAAA,CACC,MAAOJ,EAAU,SACjB,cAAgBK,GAAM,CAEpB,MAAMC,EADazB,EAAgB,KAAMqB,GAAMA,EAAE,WAAaG,CAAC,GAC7B,WAAa1C,EACzC4C,EAAeD,EAAc,SAASN,EAAU,QAAQ,EAC1DA,EAAU,SACTM,EAAc,CAAC,GAAK,WACzBlB,EAAaY,EAAU,GAAI,CACzB,SAAUK,EACV,SAAUE,EACV,MAAO,EAAA,CACR,CACH,EAEA,SAAA,CAAAd,EAAAA,IAACe,EAAAA,eAAc,KAAK,KAAK,UAAU,OACjC,SAAAf,EAAAA,IAACgB,gBAAY,CAAA,CACf,EACAhB,EAAAA,IAACiB,EAAAA,cAAA,CACE,SAAA7B,EAAgB,IAAKqB,GAAM,CAC1B,MAAMnC,EAAMa,EAAe,KAAM+B,GAAOA,EAAG,KAAOT,EAAE,QAAQ,EAC5D,OACET,EAAAA,IAACmB,EAAAA,WAAA,CAA4B,MAAOV,EAAE,SACnC,SAAAA,EAAE,OAAStC,EAAesC,EAAE,SAAUpC,EAAcC,CAAG,CAAA,EADzCmC,EAAE,QAEnB,CAEJ,CAAC,CAAA,CACH,CAAA,CAAA,CAAA,EAIFP,EAAAA,KAACS,EAAAA,OAAA,CACC,MAAOJ,EAAU,SACjB,cAAgBK,GACdjB,EAAaY,EAAU,GAAI,CACzB,SAAUK,EACV,MAAO,EAAA,CACR,EAGH,SAAA,CAAAZ,EAAAA,IAACe,EAAAA,eAAc,KAAK,KAAK,UAAU,OACjC,SAAAf,EAAAA,IAACgB,gBAAY,CAAA,CACf,EACAhB,EAAAA,IAACiB,EAAAA,cAAA,CACE,SAAAT,EAAU,IAAKY,GACdpB,MAACmB,EAAAA,WAAA,CAAoB,MAAOC,EACzB,SAAApD,EAAgBoD,CAAE,CAAA,EADJA,CAEjB,CACD,CAAA,CACH,CAAA,CAAA,CAAA,EAIDV,EACCV,EAAAA,IAAC,MAAA,CAAI,UAAU,WAAW,cAAW,GAAC,EAEtCA,EAAAA,IAACqB,EAAAA,MAAA,CACC,UAAU,OACV,YAAY,SACZ,MAAOd,EAAU,MACjB,SAAWe,GAAM3B,EAAaY,EAAU,GAAI,CAAE,MAAOe,EAAE,OAAO,KAAA,CAAO,CAAA,CAAA,EAKzEtB,EAAAA,IAACG,EAAAA,OAAA,CACC,KAAK,SACL,QAAQ,QACR,KAAK,OACL,UAAU,8DACV,QAAS,IAAMX,EAAae,EAAU,EAAE,EACxC,aAAW,gBAEX,SAAAP,EAAAA,IAACuB,EAAAA,MAAA,CAAM,UAAU,UAAA,CAAW,CAAA,CAAA,CAC9B,CAAA,EA5EQhB,EAAU,EA6EpB,CAEJ,CAAC,EAEDL,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAACC,EAAAA,OAAA,CACC,KAAK,SACL,QAAQ,UACR,KAAK,KACL,QAASZ,EACT,SAAUH,EAAgB,SAAW,EAErC,SAAA,CAAAY,EAAAA,IAACwB,EAAAA,SAAA,CAAS,UAAU,UAAA,CAAW,EAAE,YAAA,CAAA,CAAA,EAGlC1C,EAAQ,OAAS,GAChBkB,EAAAA,IAACG,EAAAA,OAAA,CACC,KAAK,SACL,QAAQ,QACR,KAAK,KACL,UAAU,wBACV,QAASN,EACV,SAAA,WAAA,CAAA,CAED,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CACJ,CAAA,EACF,CAEJ,CAEAlB,EAAgB,YAAc"}
@@ -1,12 +1,12 @@
1
- import { jsxs as l, jsx as t } from "react/jsx-runtime";
2
- import { ListFilterIcon as q, XIcon as P, PlusIcon as V } from "lucide-react";
3
- import { Popover as f } from "radix-ui";
4
- import { useDataTable as k } from "./data-table.js";
5
- import { Button as h } from "../button.js";
6
- import { Input as U } from "../input.js";
7
- import { Select as y, SelectTrigger as _, SelectValue as I, SelectContent as N, SelectItem as F } from "../select.js";
8
- import { cn as z } from "../../../lib/utils.js";
9
- const j = {
1
+ import { jsxs as a, jsx as l } from "react/jsx-runtime";
2
+ import { ListFilterIcon as R, XIcon as S, PlusIcon as P } from "lucide-react";
3
+ import { useDataTable as q } from "./data-table.js";
4
+ import { Button as f } from "../button.js";
5
+ import { Input as V } from "../input.js";
6
+ import { Popover as k, PopoverTrigger as U, PopoverContent as j } from "../popover.js";
7
+ import { Select as y, SelectTrigger as _, SelectValue as x, SelectContent as I, SelectItem as N } from "../select.js";
8
+ import { cn as B } from "../../../lib/utils.js";
9
+ const K = {
10
10
  contains: "contains",
11
11
  equals: "equals",
12
12
  not_equals: "not equals",
@@ -14,7 +14,7 @@ const j = {
14
14
  ends_with: "ends with",
15
15
  is_empty: "is empty",
16
16
  is_not_empty: "is not empty"
17
- }, B = ["is_empty", "is_not_empty"], w = [
17
+ }, X = ["is_empty", "is_not_empty"], F = [
18
18
  "contains",
19
19
  "equals",
20
20
  "not_equals",
@@ -23,156 +23,141 @@ const j = {
23
23
  "is_empty",
24
24
  "is_not_empty"
25
25
  ];
26
- function K(o, s, n) {
27
- return s[o] ?? n?.columnDef?.meta?.label ?? (typeof n?.columnDef?.header == "string" ? n.columnDef.header : void 0) ?? o;
26
+ function $(r, s, n) {
27
+ return s[r] ?? n?.columnDef?.meta?.label ?? (typeof n?.columnDef?.header == "string" ? n.columnDef.header : void 0) ?? r;
28
28
  }
29
- function X(o, s) {
29
+ function G(r, s) {
30
30
  const n = s?.[0] ?? "contains";
31
- return { id: crypto.randomUUID(), columnId: o, operator: n, value: "" };
31
+ return { id: crypto.randomUUID(), columnId: r, operator: n, value: "" };
32
32
  }
33
- function $({ className: o }) {
34
- const { table: s, columnLabels: n, filters: r, setFilters: m, filterConfig: v, enableFiltering: D } = k();
35
- if (!D) return null;
36
- const b = s.getAllLeafColumns(), i = v.length > 0 ? v : b.filter((e) => "accessorKey" in e.columnDef || "accessorFn" in e.columnDef).map((e) => ({ columnId: e.id })), C = i[0], A = C?.columnId ?? "";
37
- function L() {
38
- m([...r, X(A, C?.operators)]);
33
+ function H({ className: r }) {
34
+ const { table: s, columnLabels: n, filters: o, setFilters: m, filterConfig: g, enableFiltering: w } = q();
35
+ if (!w) return null;
36
+ const v = s.getAllLeafColumns(), i = g.length > 0 ? g : v.filter((e) => "accessorKey" in e.columnDef || "accessorFn" in e.columnDef).map((e) => ({ columnId: e.id })), C = i[0], z = C?.columnId ?? "";
37
+ function D() {
38
+ m([...o, G(z, C?.operators)]);
39
39
  }
40
- function O(e) {
41
- m(r.filter((u) => u.id !== e));
40
+ function A(e) {
41
+ m(o.filter((d) => d.id !== e));
42
42
  }
43
- function g(e, u) {
44
- m(r.map((d) => d.id === e ? { ...d, ...u } : d));
43
+ function h(e, d) {
44
+ m(o.map((c) => c.id === e ? { ...c, ...d } : c));
45
45
  }
46
- function R() {
46
+ function L() {
47
47
  m([]);
48
48
  }
49
- const c = r.length;
50
- return /* @__PURE__ */ l(f.Root, { children: [
51
- /* @__PURE__ */ t(f.Trigger, { asChild: !0, children: /* @__PURE__ */ l(
52
- h,
49
+ const u = o.length;
50
+ return /* @__PURE__ */ a(k, { children: [
51
+ /* @__PURE__ */ l(U, { asChild: !0, children: /* @__PURE__ */ a(
52
+ f,
53
53
  {
54
54
  type: "button",
55
55
  variant: "outline",
56
56
  size: "sm",
57
57
  "data-slot": "data-table-filter",
58
- className: z(o),
59
- "aria-label": c > 0 ? `Filter (${c} active)` : "Filter",
58
+ className: B(r),
59
+ "aria-label": u > 0 ? `Filter (${u} active)` : "Filter",
60
60
  children: [
61
- /* @__PURE__ */ t(q, { className: "size-3.5" }),
61
+ /* @__PURE__ */ l(R, { className: "size-3.5" }),
62
62
  "Filter",
63
- c > 0 && /* @__PURE__ */ t("span", { className: "flex size-4 items-center justify-center rounded-full bg-primary text-[10px] font-medium text-primary-foreground", children: c })
63
+ u > 0 && /* @__PURE__ */ l("span", { className: "flex size-4 items-center justify-center rounded-full bg-primary text-[10px] font-medium text-primary-foreground", children: u })
64
64
  ]
65
65
  }
66
66
  ) }),
67
- /* @__PURE__ */ t(f.Portal, { children: /* @__PURE__ */ t(
68
- f.Content,
69
- {
70
- "data-slot": "data-table-filter-panel",
71
- align: "end",
72
- sideOffset: 4,
73
- className: z(
74
- "z-50 min-w-80 rounded-lg border bg-popover p-3 text-popover-foreground shadow-md outline-none",
75
- "data-[state=open]:animate-in data-[state=closed]:animate-out",
76
- "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
77
- "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
78
- "data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2"
67
+ /* @__PURE__ */ l(j, { "data-slot": "data-table-filter-panel", align: "end", className: "min-w-80", children: /* @__PURE__ */ a("div", { className: "flex flex-col gap-2", children: [
68
+ o.map((e) => {
69
+ const c = i.find((t) => t.columnId === e.columnId)?.operators ?? F, T = X.includes(e.operator);
70
+ return /* @__PURE__ */ a("div", { className: "flex items-center gap-2", children: [
71
+ /* @__PURE__ */ a(
72
+ y,
73
+ {
74
+ value: e.columnId,
75
+ onValueChange: (t) => {
76
+ const p = i.find((O) => O.columnId === t)?.operators ?? F, E = p.includes(e.operator) ? e.operator : p[0] ?? "contains";
77
+ h(e.id, {
78
+ columnId: t,
79
+ operator: E,
80
+ value: ""
81
+ });
82
+ },
83
+ children: [
84
+ /* @__PURE__ */ l(_, { size: "sm", className: "w-36", children: /* @__PURE__ */ l(x, {}) }),
85
+ /* @__PURE__ */ l(I, { children: i.map((t) => {
86
+ const b = v.find((p) => p.id === t.columnId);
87
+ return /* @__PURE__ */ l(N, { value: t.columnId, children: t.label ?? $(t.columnId, n, b) }, t.columnId);
88
+ }) })
89
+ ]
90
+ }
91
+ ),
92
+ /* @__PURE__ */ a(
93
+ y,
94
+ {
95
+ value: e.operator,
96
+ onValueChange: (t) => h(e.id, {
97
+ operator: t,
98
+ value: ""
99
+ }),
100
+ children: [
101
+ /* @__PURE__ */ l(_, { size: "sm", className: "w-32", children: /* @__PURE__ */ l(x, {}) }),
102
+ /* @__PURE__ */ l(I, { children: c.map((t) => /* @__PURE__ */ l(N, { value: t, children: K[t] }, t)) })
103
+ ]
104
+ }
105
+ ),
106
+ T ? /* @__PURE__ */ l("div", { className: "h-8 w-40", "aria-hidden": !0 }) : /* @__PURE__ */ l(
107
+ V,
108
+ {
109
+ className: "w-40",
110
+ placeholder: "Value…",
111
+ value: e.value,
112
+ onChange: (t) => h(e.id, { value: t.target.value })
113
+ }
114
+ ),
115
+ /* @__PURE__ */ l(
116
+ f,
117
+ {
118
+ type: "button",
119
+ variant: "ghost",
120
+ size: "icon",
121
+ className: "size-8 shrink-0 text-muted-foreground hover:text-foreground",
122
+ onClick: () => A(e.id),
123
+ "aria-label": "Remove filter",
124
+ children: /* @__PURE__ */ l(S, { className: "size-3.5" })
125
+ }
126
+ )
127
+ ] }, e.id);
128
+ }),
129
+ /* @__PURE__ */ a("div", { className: "flex items-center gap-2", children: [
130
+ /* @__PURE__ */ a(
131
+ f,
132
+ {
133
+ type: "button",
134
+ variant: "outline",
135
+ size: "sm",
136
+ onClick: D,
137
+ disabled: i.length === 0,
138
+ children: [
139
+ /* @__PURE__ */ l(P, { className: "size-3.5" }),
140
+ "Add filter"
141
+ ]
142
+ }
79
143
  ),
80
- children: /* @__PURE__ */ l("div", { className: "flex flex-col gap-2", children: [
81
- r.map((e) => {
82
- const d = i.find((a) => a.columnId === e.columnId)?.operators ?? w, T = B.includes(e.operator);
83
- return /* @__PURE__ */ l("div", { className: "flex items-center gap-2", children: [
84
- /* @__PURE__ */ l(
85
- y,
86
- {
87
- value: e.columnId,
88
- onValueChange: (a) => {
89
- const p = i.find((S) => S.columnId === a)?.operators ?? w, E = p.includes(e.operator) ? e.operator : p[0] ?? "contains";
90
- g(e.id, {
91
- columnId: a,
92
- operator: E,
93
- value: ""
94
- });
95
- },
96
- children: [
97
- /* @__PURE__ */ t(_, { size: "sm", className: "w-36", children: /* @__PURE__ */ t(I, {}) }),
98
- /* @__PURE__ */ t(N, { children: i.map((a) => {
99
- const x = b.find((p) => p.id === a.columnId);
100
- return /* @__PURE__ */ t(F, { value: a.columnId, children: a.label ?? K(a.columnId, n, x) }, a.columnId);
101
- }) })
102
- ]
103
- }
104
- ),
105
- /* @__PURE__ */ l(
106
- y,
107
- {
108
- value: e.operator,
109
- onValueChange: (a) => g(e.id, {
110
- operator: a,
111
- value: ""
112
- }),
113
- children: [
114
- /* @__PURE__ */ t(_, { size: "sm", className: "w-32", children: /* @__PURE__ */ t(I, {}) }),
115
- /* @__PURE__ */ t(N, { children: d.map((a) => /* @__PURE__ */ t(F, { value: a, children: j[a] }, a)) })
116
- ]
117
- }
118
- ),
119
- T ? /* @__PURE__ */ t("div", { className: "h-8 w-40", "aria-hidden": !0 }) : /* @__PURE__ */ t(
120
- U,
121
- {
122
- className: "w-40",
123
- placeholder: "Value…",
124
- value: e.value,
125
- onChange: (a) => g(e.id, { value: a.target.value })
126
- }
127
- ),
128
- /* @__PURE__ */ t(
129
- h,
130
- {
131
- type: "button",
132
- variant: "ghost",
133
- size: "icon",
134
- className: "size-8 shrink-0 text-muted-foreground hover:text-foreground",
135
- onClick: () => O(e.id),
136
- "aria-label": "Remove filter",
137
- children: /* @__PURE__ */ t(P, { className: "size-3.5" })
138
- }
139
- )
140
- ] }, e.id);
141
- }),
142
- /* @__PURE__ */ l("div", { className: "flex items-center gap-2", children: [
143
- /* @__PURE__ */ l(
144
- h,
145
- {
146
- type: "button",
147
- variant: "outline",
148
- size: "sm",
149
- onClick: L,
150
- disabled: i.length === 0,
151
- children: [
152
- /* @__PURE__ */ t(V, { className: "size-3.5" }),
153
- "Add filter"
154
- ]
155
- }
156
- ),
157
- r.length > 0 && /* @__PURE__ */ t(
158
- h,
159
- {
160
- type: "button",
161
- variant: "ghost",
162
- size: "sm",
163
- className: "text-muted-foreground",
164
- onClick: R,
165
- children: "Clear all"
166
- }
167
- )
168
- ] })
169
- ] })
170
- }
171
- ) })
144
+ o.length > 0 && /* @__PURE__ */ l(
145
+ f,
146
+ {
147
+ type: "button",
148
+ variant: "ghost",
149
+ size: "sm",
150
+ className: "text-muted-foreground",
151
+ onClick: L,
152
+ children: "Clear all"
153
+ }
154
+ )
155
+ ] })
156
+ ] }) })
172
157
  ] });
173
158
  }
174
- $.displayName = "DataTableFilter";
159
+ H.displayName = "DataTableFilter";
175
160
  export {
176
- $ as DataTableFilter
161
+ H as DataTableFilter
177
162
  };
178
163
  //# sourceMappingURL=data-table-filter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-table-filter.js","sources":["../../../../src/components/ui/data-table/data-table-filter.tsx"],"sourcesContent":["\"use client\"\n\nimport { ListFilterIcon, PlusIcon, XIcon } from \"lucide-react\"\nimport { Popover } from \"radix-ui\"\n\nimport { useDataTable } from \"./data-table\"\n\nimport type { FilterColumnConfig, FilterCondition, FilterOperator } from \"./data-table\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Operator metadata\n// ---------------------------------------------------------------------------\n\nconst OPERATOR_LABELS: Record<FilterOperator, string> = {\n contains: \"contains\",\n equals: \"equals\",\n not_equals: \"not equals\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n is_empty: \"is empty\",\n is_not_empty: \"is not empty\",\n}\n\nconst VALUE_FREE_OPERATORS: FilterOperator[] = [\"is_empty\", \"is_not_empty\"]\n\nconst DEFAULT_OPERATORS: FilterOperator[] = [\n \"contains\",\n \"equals\",\n \"not_equals\",\n \"starts_with\",\n \"ends_with\",\n \"is_empty\",\n \"is_not_empty\",\n]\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getColumnLabel(\n colId: string,\n columnLabels: Record<string, string>,\n\n col: any,\n): string {\n return (\n columnLabels[colId] ??\n (col?.columnDef?.meta as { label?: string } | undefined)?.label ??\n (typeof col?.columnDef?.header === \"string\" ? col.columnDef.header : undefined) ??\n colId\n )\n}\n\nfunction makeCondition(\n columnId: string,\n allowedOperators?: FilterOperator[],\n): FilterCondition {\n const operator = allowedOperators?.[0] ?? \"contains\"\n return { id: crypto.randomUUID(), columnId, operator, value: \"\" }\n}\n\n// ---------------------------------------------------------------------------\n// DataTableFilter\n// ---------------------------------------------------------------------------\n\ninterface DataTableFilterProps {\n className?: string\n}\n\nfunction DataTableFilter({ className }: DataTableFilterProps) {\n const { table, columnLabels, filters, setFilters, filterConfig, enableFiltering } =\n useDataTable()\n\n if (!enableFiltering) return null\n\n const allLeafColumns = table.getAllLeafColumns()\n\n const resolvedColumns: FilterColumnConfig[] =\n filterConfig.length > 0\n ? filterConfig\n : allLeafColumns\n .filter((col) => \"accessorKey\" in col.columnDef || \"accessorFn\" in col.columnDef)\n .map((col) => ({ columnId: col.id }))\n\n const firstColumn = resolvedColumns[0]\n const firstColumnId = firstColumn?.columnId ?? \"\"\n\n function addFilter() {\n setFilters([...filters, makeCondition(firstColumnId, firstColumn?.operators)])\n }\n\n function removeFilter(id: string) {\n setFilters(filters.filter((f) => f.id !== id))\n }\n\n function updateFilter(id: string, patch: Partial<FilterCondition>) {\n setFilters(filters.map((f) => (f.id === id ? { ...f, ...patch } : f)))\n }\n\n function clearAll() {\n setFilters([])\n }\n\n const activeCount = filters.length\n\n return (\n <Popover.Root>\n <Popover.Trigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n data-slot=\"data-table-filter\"\n className={cn(className)}\n aria-label={activeCount > 0 ? `Filter (${activeCount} active)` : \"Filter\"}\n >\n <ListFilterIcon className=\"size-3.5\" />\n Filter\n {activeCount > 0 && (\n <span className=\"flex size-4 items-center justify-center rounded-full bg-primary text-[10px] font-medium text-primary-foreground\">\n {activeCount}\n </span>\n )}\n </Button>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n data-slot=\"data-table-filter-panel\"\n align=\"end\"\n sideOffset={4}\n className={cn(\n \"z-50 min-w-80 rounded-lg border bg-popover p-3 text-popover-foreground shadow-md outline-none\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2\",\n )}\n >\n <div className=\"flex flex-col gap-2\">\n {filters.map((condition) => {\n const colConfig = resolvedColumns.find((c) => c.columnId === condition.columnId)\n const operators = colConfig?.operators ?? DEFAULT_OPERATORS\n const isValueFree = VALUE_FREE_OPERATORS.includes(condition.operator)\n\n return (\n <div key={condition.id} className=\"flex items-center gap-2\">\n {/* Column selector */}\n <Select\n value={condition.columnId}\n onValueChange={(v) => {\n const nextConfig = resolvedColumns.find((c) => c.columnId === v)\n const nextOperators = nextConfig?.operators ?? DEFAULT_OPERATORS\n const nextOperator = nextOperators.includes(condition.operator)\n ? condition.operator\n : (nextOperators[0] ?? \"contains\")\n updateFilter(condition.id, {\n columnId: v,\n operator: nextOperator,\n value: \"\",\n })\n }}\n >\n <SelectTrigger size=\"sm\" className=\"w-36\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {resolvedColumns.map((c) => {\n const col = allLeafColumns.find((lc) => lc.id === c.columnId)\n return (\n <SelectItem key={c.columnId} value={c.columnId}>\n {c.label ?? getColumnLabel(c.columnId, columnLabels, col)}\n </SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n\n {/* Operator selector */}\n <Select\n value={condition.operator}\n onValueChange={(v) =>\n updateFilter(condition.id, {\n operator: v as FilterOperator,\n value: \"\",\n })\n }\n >\n <SelectTrigger size=\"sm\" className=\"w-32\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {operators.map((op) => (\n <SelectItem key={op} value={op}>\n {OPERATOR_LABELS[op]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Value input — hidden for value-free operators */}\n {isValueFree ? (\n <div className=\"h-8 w-40\" aria-hidden />\n ) : (\n <Input\n className=\"w-40\"\n placeholder=\"Value…\"\n value={condition.value}\n onChange={(e) => updateFilter(condition.id, { value: e.target.value })}\n />\n )}\n\n {/* Remove button */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={() => removeFilter(condition.id)}\n aria-label=\"Remove filter\"\n >\n <XIcon className=\"size-3.5\" />\n </Button>\n </div>\n )\n })}\n\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addFilter}\n disabled={resolvedColumns.length === 0}\n >\n <PlusIcon className=\"size-3.5\" />\n Add filter\n </Button>\n {filters.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-muted-foreground\"\n onClick={clearAll}\n >\n Clear all\n </Button>\n )}\n </div>\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )\n}\n\nDataTableFilter.displayName = \"DataTableFilter\"\n\nexport { DataTableFilter }\nexport type { DataTableFilterProps }\n"],"names":["OPERATOR_LABELS","VALUE_FREE_OPERATORS","DEFAULT_OPERATORS","getColumnLabel","colId","columnLabels","col","makeCondition","columnId","allowedOperators","operator","DataTableFilter","className","table","filters","setFilters","filterConfig","enableFiltering","useDataTable","allLeafColumns","resolvedColumns","firstColumn","firstColumnId","addFilter","removeFilter","id","f","updateFilter","patch","clearAll","activeCount","jsxs","Popover","jsx","Button","cn","ListFilterIcon","condition","operators","c","isValueFree","Select","v","nextOperators","nextOperator","SelectTrigger","SelectValue","SelectContent","lc","SelectItem","op","Input","e","XIcon","PlusIcon"],"mappings":"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"}
1
+ {"version":3,"file":"data-table-filter.js","sources":["../../../../src/components/ui/data-table/data-table-filter.tsx"],"sourcesContent":["\"use client\"\n\nimport { ListFilterIcon, PlusIcon, XIcon } from \"lucide-react\"\n\nimport { useDataTable } from \"./data-table\"\n\nimport type { FilterColumnConfig, FilterCondition, FilterOperator } from \"./data-table\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Operator metadata\n// ---------------------------------------------------------------------------\n\nconst OPERATOR_LABELS: Record<FilterOperator, string> = {\n contains: \"contains\",\n equals: \"equals\",\n not_equals: \"not equals\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n is_empty: \"is empty\",\n is_not_empty: \"is not empty\",\n}\n\nconst VALUE_FREE_OPERATORS: FilterOperator[] = [\"is_empty\", \"is_not_empty\"]\n\nconst DEFAULT_OPERATORS: FilterOperator[] = [\n \"contains\",\n \"equals\",\n \"not_equals\",\n \"starts_with\",\n \"ends_with\",\n \"is_empty\",\n \"is_not_empty\",\n]\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getColumnLabel(\n colId: string,\n columnLabels: Record<string, string>,\n\n col: any,\n): string {\n return (\n columnLabels[colId] ??\n (col?.columnDef?.meta as { label?: string } | undefined)?.label ??\n (typeof col?.columnDef?.header === \"string\" ? col.columnDef.header : undefined) ??\n colId\n )\n}\n\nfunction makeCondition(\n columnId: string,\n allowedOperators?: FilterOperator[],\n): FilterCondition {\n const operator = allowedOperators?.[0] ?? \"contains\"\n return { id: crypto.randomUUID(), columnId, operator, value: \"\" }\n}\n\n// ---------------------------------------------------------------------------\n// DataTableFilter\n// ---------------------------------------------------------------------------\n\ninterface DataTableFilterProps {\n className?: string\n}\n\nfunction DataTableFilter({ className }: DataTableFilterProps) {\n const { table, columnLabels, filters, setFilters, filterConfig, enableFiltering } =\n useDataTable()\n\n if (!enableFiltering) return null\n\n const allLeafColumns = table.getAllLeafColumns()\n\n const resolvedColumns: FilterColumnConfig[] =\n filterConfig.length > 0\n ? filterConfig\n : allLeafColumns\n .filter((col) => \"accessorKey\" in col.columnDef || \"accessorFn\" in col.columnDef)\n .map((col) => ({ columnId: col.id }))\n\n const firstColumn = resolvedColumns[0]\n const firstColumnId = firstColumn?.columnId ?? \"\"\n\n function addFilter() {\n setFilters([...filters, makeCondition(firstColumnId, firstColumn?.operators)])\n }\n\n function removeFilter(id: string) {\n setFilters(filters.filter((f) => f.id !== id))\n }\n\n function updateFilter(id: string, patch: Partial<FilterCondition>) {\n setFilters(filters.map((f) => (f.id === id ? { ...f, ...patch } : f)))\n }\n\n function clearAll() {\n setFilters([])\n }\n\n const activeCount = filters.length\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n data-slot=\"data-table-filter\"\n className={cn(className)}\n aria-label={activeCount > 0 ? `Filter (${activeCount} active)` : \"Filter\"}\n >\n <ListFilterIcon className=\"size-3.5\" />\n Filter\n {activeCount > 0 && (\n <span className=\"flex size-4 items-center justify-center rounded-full bg-primary text-[10px] font-medium text-primary-foreground\">\n {activeCount}\n </span>\n )}\n </Button>\n </PopoverTrigger>\n\n <PopoverContent data-slot=\"data-table-filter-panel\" align=\"end\" className=\"min-w-80\">\n <div className=\"flex flex-col gap-2\">\n {filters.map((condition) => {\n const colConfig = resolvedColumns.find((c) => c.columnId === condition.columnId)\n const operators = colConfig?.operators ?? DEFAULT_OPERATORS\n const isValueFree = VALUE_FREE_OPERATORS.includes(condition.operator)\n\n return (\n <div key={condition.id} className=\"flex items-center gap-2\">\n {/* Column selector */}\n <Select\n value={condition.columnId}\n onValueChange={(v) => {\n const nextConfig = resolvedColumns.find((c) => c.columnId === v)\n const nextOperators = nextConfig?.operators ?? DEFAULT_OPERATORS\n const nextOperator = nextOperators.includes(condition.operator)\n ? condition.operator\n : (nextOperators[0] ?? \"contains\")\n updateFilter(condition.id, {\n columnId: v,\n operator: nextOperator,\n value: \"\",\n })\n }}\n >\n <SelectTrigger size=\"sm\" className=\"w-36\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {resolvedColumns.map((c) => {\n const col = allLeafColumns.find((lc) => lc.id === c.columnId)\n return (\n <SelectItem key={c.columnId} value={c.columnId}>\n {c.label ?? getColumnLabel(c.columnId, columnLabels, col)}\n </SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n\n {/* Operator selector */}\n <Select\n value={condition.operator}\n onValueChange={(v) =>\n updateFilter(condition.id, {\n operator: v as FilterOperator,\n value: \"\",\n })\n }\n >\n <SelectTrigger size=\"sm\" className=\"w-32\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {operators.map((op) => (\n <SelectItem key={op} value={op}>\n {OPERATOR_LABELS[op]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Value input — hidden for value-free operators */}\n {isValueFree ? (\n <div className=\"h-8 w-40\" aria-hidden />\n ) : (\n <Input\n className=\"w-40\"\n placeholder=\"Value…\"\n value={condition.value}\n onChange={(e) => updateFilter(condition.id, { value: e.target.value })}\n />\n )}\n\n {/* Remove button */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={() => removeFilter(condition.id)}\n aria-label=\"Remove filter\"\n >\n <XIcon className=\"size-3.5\" />\n </Button>\n </div>\n )\n })}\n\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addFilter}\n disabled={resolvedColumns.length === 0}\n >\n <PlusIcon className=\"size-3.5\" />\n Add filter\n </Button>\n {filters.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-muted-foreground\"\n onClick={clearAll}\n >\n Clear all\n </Button>\n )}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nDataTableFilter.displayName = \"DataTableFilter\"\n\nexport { DataTableFilter }\nexport type { DataTableFilterProps }\n"],"names":["OPERATOR_LABELS","VALUE_FREE_OPERATORS","DEFAULT_OPERATORS","getColumnLabel","colId","columnLabels","col","makeCondition","columnId","allowedOperators","operator","DataTableFilter","className","table","filters","setFilters","filterConfig","enableFiltering","useDataTable","allLeafColumns","resolvedColumns","firstColumn","firstColumnId","addFilter","removeFilter","id","f","updateFilter","patch","clearAll","activeCount","Popover","jsx","PopoverTrigger","jsxs","Button","cn","ListFilterIcon","PopoverContent","condition","operators","c","isValueFree","Select","v","nextOperators","nextOperator","SelectTrigger","SelectValue","SelectContent","lc","SelectItem","op","Input","e","XIcon","PlusIcon"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),C=require("@dnd-kit/core"),Ve=require("@dnd-kit/modifiers"),G=require("@dnd-kit/sortable"),qe=require("@dnd-kit/utilities"),w=require("@tanstack/react-table"),T=require("lucide-react"),Fe=require("react"),Le=require("./data-table-pagination.cjs"),g=require("../table.cjs"),D=require("../../../lib/utils.cjs");function Ke(e){const o=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const t=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(o,r,t.get?t:{enumerable:!0,get:()=>e[r]})}}return o.default=e,Object.freeze(o)}const i=Ke(Fe);function Pe(e,o,r){const t=e.toLowerCase().trim(),a=r.toLowerCase().trim();switch(o){case"contains":return t.includes(a);case"equals":return t===a;case"not_equals":return t!==a;case"starts_with":return t.startsWith(a);case"ends_with":return t.endsWith(a);case"is_empty":return t==="";case"is_not_empty":return t!=="";default:return!0}}const A=i.createContext(null);function Ae(){const e=i.useContext(A);if(!e)throw new Error("useDataTable must be used within a <DataTable>");return e}function Be({header:e,children:o,position:r,numeric:t,truncate:a}){const{attributes:l,listeners:s,setNodeRef:c,transform:u,transition:d,isDragging:m}=G.useSortable({id:e.column.id}),f={transform:qe.CSS.Transform.toString(u?{...u,scaleX:1,scaleY:1}:null),transition:d,position:"relative"};return n.jsx(g.TableHead,{ref:c,style:f,variant:t?"numeric":void 0,truncate:a,className:D.cn("group/header transition-shadow duration-150",!m&&r==="first"&&"hover:shadow-[inset_-1px_0_0_0_var(--color-border)]",!m&&r==="last"&&"hover:shadow-[inset_1px_0_0_0_var(--color-border)]",!m&&r==="middle"&&"hover:shadow-[inset_1px_0_0_0_var(--color-border),inset_-1px_0_0_0_var(--color-border)]",m&&"opacity-40"),children:n.jsxs("div",{className:D.cn("flex items-center gap-1 min-w-0",t&&"flex-row-reverse"),children:[n.jsx("div",{className:"flex-1 min-w-0",children:o}),n.jsx("button",{type:"button","data-drag-handle":"",className:"cursor-grab touch-none text-muted-foreground hover:text-foreground active:cursor-grabbing opacity-0 group-hover/header:opacity-100 transition-opacity",...l,...s,children:n.jsx(T.GripVerticalIcon,{className:"size-3.5"})})]})})}function B({header:e,enableSorting:o,numericColumns:r,columnLabels:t,truncate:a}){if(e.isPlaceholder)return null;const l=o&&e.column.getCanSort(),s=e.column.getIsSorted(),c=r.has(e.column.id);return n.jsxs("div",{className:D.cn("flex items-center gap-1 min-w-0",l&&"group/sort cursor-pointer select-none",c&&"flex-row-reverse"),onClick:l?e.column.getToggleSortingHandler():void 0,onKeyDown:u=>{(u.key==="Enter"||u.key===" ")&&l&&e.column.getToggleSortingHandler()},children:[n.jsx("span",{className:D.cn("min-w-0",a&&"truncate"),children:t[e.column.id]??w.flexRender(e.column.columnDef.header,e.getContext())}),l&&n.jsx("span",{className:D.cn(!s&&"opacity-0 group-hover/sort:opacity-100 transition-opacity"),children:s==="asc"?n.jsx(T.ArrowUpIcon,{className:"size-3.5 text-foreground"}):s==="desc"?n.jsx(T.ArrowDownIcon,{className:"size-3.5 text-foreground"}):n.jsx(T.ArrowUpDownIcon,{className:"size-3.5 text-muted-foreground"})})]})}const z="—";function Ue(e,o){const r=new Map,t=new Map;for(const s of e){const c=s.getValue(o),u=c==null||c==="",d=u?z:String(c),m=r.get(d);m?m.push(s):(r.set(d,[s]),t.set(d,u?null:c))}const a=[...r.keys()],l=a.every(s=>s===z||typeof t.get(s)=="number");return a.sort((s,c)=>s===z?1:c===z?-1:l?t.get(s)-t.get(c):s.localeCompare(c,void 0,{sensitivity:"base",numeric:!0})),{order:a,buckets:r}}function Ye(e,o,r,t){const a=e.getColumn(o);return r.find(l=>l.columnId===o)?.label??t[o]??(typeof a?.columnDef.header=="string"?a.columnDef.header:o)}function We({row:e,numericColumns:o,truncate:r}){return n.jsx(g.TableRow,{"data-state":e.getIsSelected()?"selected":void 0,children:e.getVisibleCells().map(t=>n.jsx(g.TableCell,{variant:o.has(t.column.id)?"numeric":void 0,truncate:r&&(t.column.columnDef.meta?.truncate??!0),children:w.flexRender(t.column.columnDef.cell,t.getContext())},t.id))})}function Xe({groupKey:e,groupLabel:o,isExpanded:r,colSpan:t,onToggle:a}){return n.jsx(g.TableRow,{"data-slot":"data-table-group-header",children:n.jsx(g.TableCell,{colSpan:t,className:"p-0 font-medium",children:n.jsxs("button",{type:"button",onClick:a,"aria-expanded":r,"aria-label":`${r?"Collapse":"Expand"} group ${e}`,className:"flex w-full items-center gap-2 text-left p-4 in-data-[density=compact]:py-2 in-data-[density=relaxed]:py-5 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset",children:[r?n.jsx(T.ChevronDownIcon,{className:"size-3.5 shrink-0 text-muted-foreground"}):n.jsx(T.ChevronRightIcon,{className:"size-3.5 shrink-0 text-muted-foreground"}),n.jsx("span",{className:"text-xs uppercase tracking-wide text-muted-foreground",children:o}),n.jsx("span",{className:"truncate",children:e})]})})})}function Je({table:e,numericColumns:o,truncate:r,grouping:t,groupConfig:a,columnLabels:l,collapsedGroups:s,onToggleGroup:c}){const u=e.getVisibleLeafColumns().length,d=e.getSortedRowModel().rows;if(d.length===0)return n.jsx(g.TableRow,{children:n.jsx(g.TableCell,{colSpan:u,className:"h-24 text-center text-muted-foreground",children:"No results."})});const{order:m,buckets:f}=Ue(d,t),h=Ye(e,t,a,l);return n.jsx(n.Fragment,{children:m.map(b=>{const S=f.get(b)??[],x=!s.has(b);return n.jsxs(i.Fragment,{children:[n.jsx(Xe,{groupKey:b,groupLabel:h,isExpanded:x,colSpan:u,onToggle:()=>c(b)}),x&&S.map(y=>n.jsx(We,{row:y,numericColumns:o,truncate:r},y.id))]},`group-${b}`)})})}function Qe(e,o){if(e.length===0)return new Set;const r=e[0],t=new Set;for(const a of o){const l="accessorKey"in a?String(a.accessorKey):"";l&&typeof r[l]=="number"&&t.add(l)}return t}function K(e){return e.filter(o=>"accessorKey"in o).map(o=>({columnId:String(o.accessorKey)}))}function Ze(e,o){const r=o.filter(t=>t.columnId&&t.operator&&(t.value.trim()!==""||t.operator==="is_empty"||t.operator==="is_not_empty"));return r.length===0?e:e.filter(t=>r.every(a=>{const l=String(t[a.columnId]??"");return Pe(l,a.operator,a.value)}))}function $e(e,o){const r=C.useSensors(C.useSensor(C.PointerSensor,{activationConstraint:{distance:5}}),C.useSensor(C.KeyboardSensor,{coordinateGetter:G.sortableKeyboardCoordinates})),[t,a]=i.useState(null),l=i.useCallback(u=>{a(String(u.active.id))},[]),s=i.useCallback(u=>{a(null);const{active:d,over:m}=u;if(!m||d.id===m.id)return;const f=o.length>0?o:e.getAllLeafColumns().map(x=>x.id),h=f.indexOf(String(d.id)),b=f.indexOf(String(m.id));if(h===-1||b===-1)return;const S=G.arrayMove(f,h,b);e.setColumnOrder(S)},[o,e]),c=t?e.getFlatHeaders().find(u=>u.column.id===t):null;return{sensors:r,draggingHeader:c,handleDragStart:l,handleDragEnd:s}}function et(e,o){const[r,t]=i.useState(null),[a,l]=i.useState(()=>new Set),s=e===void 0?r:e,c=i.useCallback(d=>{l(new Set),(o??t)(d)},[o]),u=i.useCallback(d=>{l(m=>{const f=new Set(m);return f.has(d)?f.delete(d):f.add(d),f})},[]);return{grouping:s,collapsedGroups:a,handleGroupingChange:c,toggleGroup:u}}function tt({table:e,enableSorting:o,numericColumns:r,columnLabels:t,truncate:a}){return n.jsx(n.Fragment,{children:e.getHeaderGroups().map(l=>n.jsx(g.TableRow,{children:l.headers.map(s=>n.jsx(g.TableHead,{variant:r.has(s.column.id)?"numeric":void 0,truncate:a&&(s.column.columnDef.meta?.truncate??!0),children:n.jsx(B,{header:s,enableSorting:o,numericColumns:r,columnLabels:t,truncate:a&&(s.column.columnDef.meta?.truncate??!0)})},s.id))},l.id))})}function nt({table:e,enableSorting:o,numericColumns:r,columnLabels:t,truncate:a}){return n.jsx(n.Fragment,{children:e.getHeaderGroups().map(l=>n.jsx(g.TableRow,{children:l.headers.map((s,c)=>{const u=c===0?"first":c===l.headers.length-1?"last":"middle";return n.jsx(Be,{header:s,position:u,numeric:r.has(s.column.id),truncate:a&&(s.column.columnDef.meta?.truncate??!0),children:n.jsx(B,{header:s,enableSorting:o,numericColumns:r,columnLabels:t,truncate:a&&(s.column.columnDef.meta?.truncate??!0)})},s.id)})},l.id))})}function P({table:e,useFlexSize:o}){return n.jsx("colgroup",{children:e.getHeaderGroups()[0]?.headers.map(r=>o?n.jsx("col",{style:{width:r.column.getSize()}},r.id):n.jsx("col",{style:r.column.columnDef.size==null?void 0:{width:r.column.columnDef.size}},r.id))})}function ot(e){const{table:o,columns:r,variant:t,containerClassName:a,density:l,hasExplicitSize:s,enableSorting:c,enableColumnReorder:u,enableGrouping:d,grouping:m,groupConfig:f,collapsedGroups:h,onToggleGroup:b,numericColumns:S,columnLabels:x,truncate:y,reorderSensors:R,draggingHeader:v,onDragStart:M,onDragEnd:H}=e,_=n.jsx(rt,{table:o,columns:r,numericColumns:S,truncate:y,grouping:d?m:null,groupConfig:f,columnLabels:x,collapsedGroups:h,onToggleGroup:b});return u?n.jsxs(C.DndContext,{sensors:R,collisionDetection:C.closestCenter,modifiers:[Ve.restrictToHorizontalAxis],onDragStart:M,onDragEnd:H,children:[n.jsx(G.SortableContext,{items:o.getFlatHeaders().map(N=>N.column.id),strategy:G.horizontalListSortingStrategy,children:n.jsxs(g.Table,{"data-density":l,variant:t,containerClassName:a,layout:s?"fixed":void 0,children:[s&&n.jsx(P,{table:o,useFlexSize:!0}),n.jsx(g.TableHeader,{children:n.jsx(nt,{table:o,enableSorting:c,numericColumns:S,columnLabels:x,truncate:y})}),n.jsx(g.TableBody,{children:_})]})}),n.jsx(C.DragOverlay,{dropAnimation:null,children:v&&n.jsx("div",{className:"rounded-md border bg-background px-4 py-3 text-sm font-medium shadow-lg",children:x[v.column.id]??(typeof v.column.columnDef.header=="string"?v.column.columnDef.header:v.column.id)})})]}):n.jsxs(g.Table,{"data-density":l,variant:t,containerClassName:a,layout:s?"fixed":void 0,children:[s&&n.jsx(P,{table:o,useFlexSize:!1}),n.jsx(g.TableHeader,{children:n.jsx(tt,{table:o,enableSorting:c,numericColumns:S,columnLabels:x,truncate:y})}),n.jsx(g.TableBody,{children:_})]})}function rt({table:e,columns:o,numericColumns:r,truncate:t,grouping:a,groupConfig:l,columnLabels:s,collapsedGroups:c,onToggleGroup:u}){return a?n.jsx(Je,{table:e,numericColumns:r,truncate:t,grouping:a,groupConfig:l,columnLabels:s,collapsedGroups:c,onToggleGroup:u}):e.getRowModel().rows.length===0?n.jsx(g.TableRow,{children:n.jsx(g.TableCell,{colSpan:o.length,className:"h-24 text-center text-muted-foreground",children:"No results."})}):e.getRowModel().rows.map(d=>n.jsx(g.TableRow,{"data-state":d.getIsSelected()?"selected":void 0,children:d.getVisibleCells().map(m=>n.jsx(g.TableCell,{variant:r.has(m.column.id)?"numeric":void 0,truncate:t&&(m.column.columnDef.meta?.truncate??!0),children:w.flexRender(m.column.columnDef.cell,m.getContext())},m.id))},d.id))}function st(e){const o=[],r=[],t=[],a=[],l=[];return i.Children.forEach(e,s=>{i.isValidElement(s)&&s.type===U?o.push(s):i.isValidElement(s)&&s.type.displayName==="DataTableFilter"?r.push(s):i.isValidElement(s)&&s.type.displayName==="DataTableGroup"?t.push(s):i.isValidElement(s)&&s.type===Le.DataTablePagination?a.push(s):l.push(s)}),{toolbarSlots:o,filterSlots:r,groupSlots:t,paginationSlots:a,restSlots:l}}function at({columns:e,data:o,toolbar:r,enableSorting:t=!1,enableColumnVisibility:a=!1,children:l,columnOrder:s,onColumnOrderChange:c,columnVisibility:u,onColumnVisibilityChange:d,columnLabels:m,onColumnLabelChange:f,enablePagination:h=!1,defaultPageSize:b=10,pagination:S,onPaginationChange:x,enableColumnReorder:y=!1,enableFiltering:R=!1,filters:v,onFiltersChange:M,filterConfig:H,manualFiltering:_=!1,enableGrouping:N=!1,grouping:Y,onGroupingChange:W,groupConfig:V,density:X="default",className:J,variant:Q="card",containerClassName:Z,truncate:$=!0}){const[ee,te]=i.useState([]),[ne,oe]=i.useState({}),[re,se]=i.useState([]),[ae,le]=i.useState({}),[ie,ce]=i.useState({pageIndex:0,pageSize:b}),[ue,de]=i.useState([]),{grouping:q,collapsedGroups:me,handleGroupingChange:ge,toggleGroup:fe}=et(Y,W),pe=S??ie,k=v??ue,E=u??ne,I=s??re,F=m??ae,xe=i.useMemo(()=>{if(h)return x?p=>{const j=typeof p=="function"?p(S):p;x(j)}:ce},[h,x,S]),be=i.useMemo(()=>{if(a)return p=>{const j=typeof p=="function"?p(E):p;(d??oe)(j)}},[a,E,d]),he=i.useCallback(p=>{(M??de)(p)},[M]),Se=i.useMemo(()=>H??K(e),[H,e]),L=i.useMemo(()=>V??K(e),[V,e]),ye=i.useMemo(()=>!R||_?o:Ze(o,k),[o,k,R,_]),Ce=i.useCallback(p=>{const j=typeof p=="function"?p(I):p;(c??se)(j)},[I,c]),O=w.useReactTable({data:ye,columns:e,state:{sorting:t?ee:void 0,columnVisibility:a?E:void 0,columnOrder:I.length>0?I:void 0,...h?{pagination:pe}:{}},onSortingChange:t?te:void 0,onPaginationChange:xe,onColumnVisibilityChange:be,onColumnOrderChange:Ce,getCoreRowModel:w.getCoreRowModel(),getSortedRowModel:t||N?w.getSortedRowModel():void 0,getPaginationRowModel:h?w.getPaginationRowModel():void 0}),ve=i.useCallback((p,j)=>{(f??((ke,Ee)=>le(Oe=>({...Oe,[ke]:Ee}))))(p,j)},[f]),{sensors:je,draggingHeader:we,handleDragStart:De,handleDragEnd:Te}=$e(O,I),Re=i.useMemo(()=>Qe(o,e),[o,e]),_e=e.some(p=>p.size!=null),Ne={table:O,columnLabels:F,setColumnLabel:ve,filters:k,setFilters:he,filterConfig:Se,enableFiltering:R,grouping:q,setGrouping:ge,groupConfig:L,enableGrouping:N},{toolbarSlots:Ie,filterSlots:Ge,groupSlots:Me,paginationSlots:He,restSlots:ze}=st(l);return n.jsx(A.Provider,{value:Ne,children:n.jsxs("div",{"data-slot":"data-table",className:D.cn("w-full space-y-2",J),children:[r,Ie,Ge,Me,n.jsx(ot,{table:O,columns:e,variant:Q,containerClassName:Z,density:X,hasExplicitSize:_e,enableSorting:t,enableColumnReorder:y,enableGrouping:N,grouping:q,groupConfig:L,collapsedGroups:me,onToggleGroup:fe,numericColumns:Re,columnLabels:F,truncate:$,reorderSensors:je,draggingHeader:we,onDragStart:De,onDragEnd:Te}),He,ze]})})}function U({className:e,children:o,...r}){return n.jsx("div",{"data-slot":"table-toolbar",className:D.cn("flex items-center justify-end gap-2",e),...r,children:o})}exports.DataTable=at;exports.TableToolbar=U;exports.useDataTable=Ae;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),C=require("@dnd-kit/core"),qe=require("@dnd-kit/modifiers"),G=require("@dnd-kit/sortable"),Fe=require("@dnd-kit/utilities"),w=require("@tanstack/react-table"),T=require("lucide-react"),Le=require("react"),Ke=require("./data-table-pagination.cjs"),g=require("../table.cjs"),D=require("../../../lib/utils.cjs");function Pe(e){const o=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const t=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(o,r,t.get?t:{enumerable:!0,get:()=>e[r]})}}return o.default=e,Object.freeze(o)}const i=Pe(Le);function A(e,o,r){const t=e.toLowerCase().trim(),a=r.toLowerCase().trim();switch(o){case"contains":return t.includes(a);case"equals":return t===a;case"not_equals":return t!==a;case"starts_with":return t.startsWith(a);case"ends_with":return t.endsWith(a);case"is_empty":return t==="";case"is_not_empty":return t!=="";default:return!0}}const B=i.createContext(null);function Ae(){const e=i.useContext(B);if(!e)throw new Error("useDataTable must be used within a <DataTable>");return e}function Be({header:e,children:o,position:r,numeric:t,truncate:a}){const{attributes:l,listeners:s,setNodeRef:c,transform:u,transition:d,isDragging:m}=G.useSortable({id:e.column.id}),f={transform:Fe.CSS.Transform.toString(u?{...u,scaleX:1,scaleY:1}:null),transition:d,position:"relative"};return n.jsx(g.TableHead,{ref:c,style:f,variant:t?"numeric":void 0,truncate:a,className:D.cn("group/header transition-shadow duration-150",!m&&r==="first"&&"hover:shadow-[inset_-1px_0_0_0_var(--color-border)]",!m&&r==="last"&&"hover:shadow-[inset_1px_0_0_0_var(--color-border)]",!m&&r==="middle"&&"hover:shadow-[inset_1px_0_0_0_var(--color-border),inset_-1px_0_0_0_var(--color-border)]",m&&"opacity-40"),children:n.jsxs("div",{className:D.cn("flex items-center gap-1 min-w-0",t&&"flex-row-reverse"),children:[n.jsx("div",{className:"flex-1 min-w-0",children:o}),n.jsx("button",{type:"button","data-drag-handle":"",className:"cursor-grab touch-none text-muted-foreground hover:text-foreground active:cursor-grabbing opacity-0 group-hover/header:opacity-100 transition-opacity",...l,...s,children:n.jsx(T.GripVerticalIcon,{className:"size-3.5"})})]})})}function U({header:e,enableSorting:o,numericColumns:r,columnLabels:t,truncate:a}){if(e.isPlaceholder)return null;const l=o&&e.column.getCanSort(),s=e.column.getIsSorted(),c=r.has(e.column.id);return n.jsxs("div",{className:D.cn("flex items-center gap-1 min-w-0",l&&"group/sort cursor-pointer select-none",c&&"flex-row-reverse"),onClick:l?e.column.getToggleSortingHandler():void 0,onKeyDown:u=>{(u.key==="Enter"||u.key===" ")&&l&&e.column.getToggleSortingHandler()},children:[n.jsx("span",{className:D.cn("min-w-0",a&&"truncate"),children:t[e.column.id]??w.flexRender(e.column.columnDef.header,e.getContext())}),l&&n.jsx("span",{className:D.cn(!s&&"opacity-0 group-hover/sort:opacity-100 transition-opacity"),children:s==="asc"?n.jsx(T.ArrowUpIcon,{className:"size-3.5 text-foreground"}):s==="desc"?n.jsx(T.ArrowDownIcon,{className:"size-3.5 text-foreground"}):n.jsx(T.ArrowUpDownIcon,{className:"size-3.5 text-muted-foreground"})})]})}const z="—";function Ue(e,o){const r=new Map,t=new Map;for(const s of e){const c=s.getValue(o),u=c==null||c==="",d=u?z:String(c),m=r.get(d);m?m.push(s):(r.set(d,[s]),t.set(d,u?null:c))}const a=[...r.keys()],l=a.every(s=>s===z||typeof t.get(s)=="number");return a.sort((s,c)=>s===z?1:c===z?-1:l?t.get(s)-t.get(c):s.localeCompare(c,void 0,{sensitivity:"base",numeric:!0})),{order:a,buckets:r}}function Ye(e,o,r,t){const a=e.getColumn(o);return r.find(l=>l.columnId===o)?.label??t[o]??(typeof a?.columnDef.header=="string"?a.columnDef.header:o)}function We({row:e,numericColumns:o,truncate:r}){return n.jsx(g.TableRow,{"data-state":e.getIsSelected()?"selected":void 0,children:e.getVisibleCells().map(t=>n.jsx(g.TableCell,{variant:o.has(t.column.id)?"numeric":void 0,truncate:r&&(t.column.columnDef.meta?.truncate??!0),children:w.flexRender(t.column.columnDef.cell,t.getContext())},t.id))})}function Xe({groupKey:e,groupLabel:o,isExpanded:r,colSpan:t,onToggle:a}){return n.jsx(g.TableRow,{"data-slot":"data-table-group-header",children:n.jsx(g.TableCell,{colSpan:t,className:"p-0 font-medium",children:n.jsxs("button",{type:"button",onClick:a,"aria-expanded":r,"aria-label":`${r?"Collapse":"Expand"} group ${e}`,className:"flex w-full items-center gap-2 text-left p-4 in-data-[density=compact]:py-2 in-data-[density=relaxed]:py-5 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset",children:[r?n.jsx(T.ChevronDownIcon,{className:"size-3.5 shrink-0 text-muted-foreground"}):n.jsx(T.ChevronRightIcon,{className:"size-3.5 shrink-0 text-muted-foreground"}),n.jsx("span",{className:"text-xs uppercase tracking-wide text-muted-foreground",children:o}),n.jsx("span",{className:"truncate",children:e})]})})})}function Je({table:e,numericColumns:o,truncate:r,grouping:t,groupConfig:a,columnLabels:l,collapsedGroups:s,onToggleGroup:c}){const u=e.getVisibleLeafColumns().length,d=e.getSortedRowModel().rows;if(d.length===0)return n.jsx(g.TableRow,{children:n.jsx(g.TableCell,{colSpan:u,className:"h-24 text-center text-muted-foreground",children:"No results."})});const{order:m,buckets:f}=Ue(d,t),h=Ye(e,t,a,l);return n.jsx(n.Fragment,{children:m.map(b=>{const S=f.get(b)??[],x=!s.has(b);return n.jsxs(i.Fragment,{children:[n.jsx(Xe,{groupKey:b,groupLabel:h,isExpanded:x,colSpan:u,onToggle:()=>c(b)}),x&&S.map(y=>n.jsx(We,{row:y,numericColumns:o,truncate:r},y.id))]},`group-${b}`)})})}function Qe(e,o){if(e.length===0)return new Set;const r=e[0],t=new Set;for(const a of o){const l="accessorKey"in a?String(a.accessorKey):"";l&&typeof r[l]=="number"&&t.add(l)}return t}function K(e){return e.filter(o=>"accessorKey"in o).map(o=>({columnId:String(o.accessorKey)}))}function Ze(e,o){const r=o.filter(t=>t.columnId&&t.operator&&(t.value.trim()!==""||t.operator==="is_empty"||t.operator==="is_not_empty"));return r.length===0?e:e.filter(t=>r.every(a=>{const l=String(t[a.columnId]??"");return A(l,a.operator,a.value)}))}function $e(e,o){const r=C.useSensors(C.useSensor(C.PointerSensor,{activationConstraint:{distance:5}}),C.useSensor(C.KeyboardSensor,{coordinateGetter:G.sortableKeyboardCoordinates})),[t,a]=i.useState(null),l=i.useCallback(u=>{a(String(u.active.id))},[]),s=i.useCallback(u=>{a(null);const{active:d,over:m}=u;if(!m||d.id===m.id)return;const f=o.length>0?o:e.getAllLeafColumns().map(x=>x.id),h=f.indexOf(String(d.id)),b=f.indexOf(String(m.id));if(h===-1||b===-1)return;const S=G.arrayMove(f,h,b);e.setColumnOrder(S)},[o,e]),c=t?e.getFlatHeaders().find(u=>u.column.id===t):null;return{sensors:r,draggingHeader:c,handleDragStart:l,handleDragEnd:s}}function et(e,o){const[r,t]=i.useState(null),[a,l]=i.useState(()=>new Set),s=e===void 0?r:e,c=i.useCallback(d=>{l(new Set),(o??t)(d)},[o]),u=i.useCallback(d=>{l(m=>{const f=new Set(m);return f.has(d)?f.delete(d):f.add(d),f})},[]);return{grouping:s,collapsedGroups:a,handleGroupingChange:c,toggleGroup:u}}function tt({table:e,enableSorting:o,numericColumns:r,columnLabels:t,truncate:a}){return n.jsx(n.Fragment,{children:e.getHeaderGroups().map(l=>n.jsx(g.TableRow,{children:l.headers.map(s=>n.jsx(g.TableHead,{variant:r.has(s.column.id)?"numeric":void 0,truncate:a&&(s.column.columnDef.meta?.truncate??!0),children:n.jsx(U,{header:s,enableSorting:o,numericColumns:r,columnLabels:t,truncate:a&&(s.column.columnDef.meta?.truncate??!0)})},s.id))},l.id))})}function nt({table:e,enableSorting:o,numericColumns:r,columnLabels:t,truncate:a}){return n.jsx(n.Fragment,{children:e.getHeaderGroups().map(l=>n.jsx(g.TableRow,{children:l.headers.map((s,c)=>{const u=c===0?"first":c===l.headers.length-1?"last":"middle";return n.jsx(Be,{header:s,position:u,numeric:r.has(s.column.id),truncate:a&&(s.column.columnDef.meta?.truncate??!0),children:n.jsx(U,{header:s,enableSorting:o,numericColumns:r,columnLabels:t,truncate:a&&(s.column.columnDef.meta?.truncate??!0)})},s.id)})},l.id))})}function P({table:e,useFlexSize:o}){return n.jsx("colgroup",{children:e.getHeaderGroups()[0]?.headers.map(r=>o?n.jsx("col",{style:{width:r.column.getSize()}},r.id):n.jsx("col",{style:r.column.columnDef.size==null?void 0:{width:r.column.columnDef.size}},r.id))})}function ot(e){const{table:o,columns:r,variant:t,containerClassName:a,density:l,hasExplicitSize:s,enableSorting:c,enableColumnReorder:u,enableGrouping:d,grouping:m,groupConfig:f,collapsedGroups:h,onToggleGroup:b,numericColumns:S,columnLabels:x,truncate:y,reorderSensors:R,draggingHeader:v,onDragStart:M,onDragEnd:H}=e,_=n.jsx(rt,{table:o,columns:r,numericColumns:S,truncate:y,grouping:d?m:null,groupConfig:f,columnLabels:x,collapsedGroups:h,onToggleGroup:b});return u?n.jsxs(C.DndContext,{sensors:R,collisionDetection:C.closestCenter,modifiers:[qe.restrictToHorizontalAxis],onDragStart:M,onDragEnd:H,children:[n.jsx(G.SortableContext,{items:o.getFlatHeaders().map(N=>N.column.id),strategy:G.horizontalListSortingStrategy,children:n.jsxs(g.Table,{"data-density":l,variant:t,containerClassName:a,layout:s?"fixed":void 0,children:[s&&n.jsx(P,{table:o,useFlexSize:!0}),n.jsx(g.TableHeader,{children:n.jsx(nt,{table:o,enableSorting:c,numericColumns:S,columnLabels:x,truncate:y})}),n.jsx(g.TableBody,{children:_})]})}),n.jsx(C.DragOverlay,{dropAnimation:null,children:v&&n.jsx("div",{className:"rounded-md border bg-background px-4 py-3 text-sm font-medium shadow-lg",children:x[v.column.id]??(typeof v.column.columnDef.header=="string"?v.column.columnDef.header:v.column.id)})})]}):n.jsxs(g.Table,{"data-density":l,variant:t,containerClassName:a,layout:s?"fixed":void 0,children:[s&&n.jsx(P,{table:o,useFlexSize:!1}),n.jsx(g.TableHeader,{children:n.jsx(tt,{table:o,enableSorting:c,numericColumns:S,columnLabels:x,truncate:y})}),n.jsx(g.TableBody,{children:_})]})}function rt({table:e,columns:o,numericColumns:r,truncate:t,grouping:a,groupConfig:l,columnLabels:s,collapsedGroups:c,onToggleGroup:u}){return a?n.jsx(Je,{table:e,numericColumns:r,truncate:t,grouping:a,groupConfig:l,columnLabels:s,collapsedGroups:c,onToggleGroup:u}):e.getRowModel().rows.length===0?n.jsx(g.TableRow,{children:n.jsx(g.TableCell,{colSpan:o.length,className:"h-24 text-center text-muted-foreground",children:"No results."})}):e.getRowModel().rows.map(d=>n.jsx(g.TableRow,{"data-state":d.getIsSelected()?"selected":void 0,children:d.getVisibleCells().map(m=>n.jsx(g.TableCell,{variant:r.has(m.column.id)?"numeric":void 0,truncate:t&&(m.column.columnDef.meta?.truncate??!0),children:w.flexRender(m.column.columnDef.cell,m.getContext())},m.id))},d.id))}function st(e){const o=[],r=[],t=[],a=[],l=[];return i.Children.forEach(e,s=>{i.isValidElement(s)&&s.type===Y?o.push(s):i.isValidElement(s)&&s.type.displayName==="DataTableFilter"?r.push(s):i.isValidElement(s)&&s.type.displayName==="DataTableGroup"?t.push(s):i.isValidElement(s)&&s.type===Ke.DataTablePagination?a.push(s):l.push(s)}),{toolbarSlots:o,filterSlots:r,groupSlots:t,paginationSlots:a,restSlots:l}}function at({columns:e,data:o,toolbar:r,enableSorting:t=!1,enableColumnVisibility:a=!1,children:l,columnOrder:s,onColumnOrderChange:c,columnVisibility:u,onColumnVisibilityChange:d,columnLabels:m,onColumnLabelChange:f,enablePagination:h=!1,defaultPageSize:b=10,pagination:S,onPaginationChange:x,enableColumnReorder:y=!1,enableFiltering:R=!1,filters:v,onFiltersChange:M,filterConfig:H,manualFiltering:_=!1,enableGrouping:N=!1,grouping:W,onGroupingChange:X,groupConfig:V,density:J="default",className:Q,variant:Z="card",containerClassName:$,truncate:ee=!0}){const[te,ne]=i.useState([]),[oe,re]=i.useState({}),[se,ae]=i.useState([]),[le,ie]=i.useState({}),[ce,ue]=i.useState({pageIndex:0,pageSize:b}),[de,me]=i.useState([]),{grouping:q,collapsedGroups:ge,handleGroupingChange:fe,toggleGroup:pe}=et(W,X),xe=S??ce,k=v??de,E=u??oe,I=s??se,F=m??le,be=i.useMemo(()=>{if(h)return x?p=>{const j=typeof p=="function"?p(S):p;x(j)}:ue},[h,x,S]),he=i.useMemo(()=>{if(a)return p=>{const j=typeof p=="function"?p(E):p;(d??re)(j)}},[a,E,d]),Se=i.useCallback(p=>{(M??me)(p)},[M]),ye=i.useMemo(()=>H??K(e),[H,e]),L=i.useMemo(()=>V??K(e),[V,e]),Ce=i.useMemo(()=>!R||_?o:Ze(o,k),[o,k,R,_]),ve=i.useCallback(p=>{const j=typeof p=="function"?p(I):p;(c??ae)(j)},[I,c]),O=w.useReactTable({data:Ce,columns:e,state:{sorting:t?te:void 0,columnVisibility:a?E:void 0,columnOrder:I.length>0?I:void 0,...h?{pagination:xe}:{}},onSortingChange:t?ne:void 0,onPaginationChange:be,onColumnVisibilityChange:he,onColumnOrderChange:ve,getCoreRowModel:w.getCoreRowModel(),getSortedRowModel:t||N?w.getSortedRowModel():void 0,getPaginationRowModel:h?w.getPaginationRowModel():void 0}),je=i.useCallback((p,j)=>{(f??((Ee,Oe)=>ie(Ve=>({...Ve,[Ee]:Oe}))))(p,j)},[f]),{sensors:we,draggingHeader:De,handleDragStart:Te,handleDragEnd:Re}=$e(O,I),_e=i.useMemo(()=>Qe(o,e),[o,e]),Ne=e.some(p=>p.size!=null),Ie={table:O,columnLabels:F,setColumnLabel:je,filters:k,setFilters:Se,filterConfig:ye,enableFiltering:R,grouping:q,setGrouping:fe,groupConfig:L,enableGrouping:N},{toolbarSlots:Ge,filterSlots:Me,groupSlots:He,paginationSlots:ze,restSlots:ke}=st(l);return n.jsx(B.Provider,{value:Ie,children:n.jsxs("div",{"data-slot":"data-table",className:D.cn("w-full space-y-2",Q),children:[r,Ge,Me,He,n.jsx(ot,{table:O,columns:e,variant:Z,containerClassName:$,density:J,hasExplicitSize:Ne,enableSorting:t,enableColumnReorder:y,enableGrouping:N,grouping:q,groupConfig:L,collapsedGroups:ge,onToggleGroup:pe,numericColumns:_e,columnLabels:F,truncate:ee,reorderSensors:we,draggingHeader:De,onDragStart:Te,onDragEnd:Re}),ze,ke]})})}function Y({className:e,children:o,...r}){return n.jsx("div",{"data-slot":"table-toolbar",className:D.cn("flex items-center justify-end gap-2",e),...r,children:o})}exports.DataTable=at;exports.TableToolbar=Y;exports.applyFilterCondition=A;exports.useDataTable=Ae;
2
2
  //# sourceMappingURL=data-table.cjs.map