@tetrascience-npm/tetrascience-react-ui 0.5.0-beta.55.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 (83) 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-group.cjs +2 -0
  62. package/dist/components/ui/data-table/data-table-group.cjs.map +1 -0
  63. package/dist/components/ui/data-table/data-table-group.js +118 -0
  64. package/dist/components/ui/data-table/data-table-group.js.map +1 -0
  65. package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
  66. package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
  67. package/dist/components/ui/data-table/data-table-pagination.js +22 -22
  68. package/dist/components/ui/data-table/data-table-pagination.js.map +1 -1
  69. package/dist/components/ui/data-table/data-table.cjs +1 -1
  70. package/dist/components/ui/data-table/data-table.cjs.map +1 -1
  71. package/dist/components/ui/data-table/data-table.js +567 -316
  72. package/dist/components/ui/data-table/data-table.js.map +1 -1
  73. package/dist/components/ui/popover.cjs +2 -0
  74. package/dist/components/ui/popover.cjs.map +1 -0
  75. package/dist/components/ui/popover.js +45 -0
  76. package/dist/components/ui/popover.js.map +1 -0
  77. package/dist/index.cjs +1 -1
  78. package/dist/index.css +1 -1
  79. package/dist/index.d.ts +580 -1
  80. package/dist/index.js +637 -593
  81. package/dist/index.js.map +1 -1
  82. package/dist/index.tailwind.css +1 -1
  83. 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":"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"}
@@ -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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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),b=require("lucide-react"),d=require("radix-ui"),C=require("react"),G=require("./data-table.cjs"),f=require("../button.cjs"),o=require("../select.cjs"),h=require("../../../lib/utils.cjs");function j(l,s,n){const r=n?.columnDef.meta;return s[l]??r?.label??(typeof n?.columnDef.header=="string"?n.columnDef.header:void 0)??l}const m="__none__";function v({className:l}){const s=C.useId(),{table:n,columnLabels:r,grouping:a,setGrouping:p,groupConfig:g,enableGrouping:I}=G.useDataTable();if(!I)return null;const c=n.getAllLeafColumns(),x=g.length>0?g:c.filter(t=>"accessorKey"in t.columnDef||"accessorFn"in t.columnDef).map(t=>({columnId:t.id,label:void 0})),i=a?x.find(t=>t.columnId===a)??{columnId:a}:null,u=i?i.label??j(i.columnId,r,c.find(t=>t.id===i.columnId)):null;return e.jsxs(d.Popover.Root,{children:[e.jsx(d.Popover.Trigger,{asChild:!0,children:e.jsxs(f.Button,{type:"button",variant:"outline",size:"sm","data-slot":"data-table-group",className:h.cn(l),"aria-label":u?`Grouped by ${u}`:"Group by",children:[e.jsx(b.GroupIcon,{className:"size-3.5"}),u?e.jsxs(e.Fragment,{children:["Grouped by",e.jsx("span",{className:"rounded-sm bg-primary px-1.5 text-[10px] font-medium text-primary-foreground",children:u})]}):"Group"]})}),e.jsx(d.Popover.Portal,{children:e.jsx(d.Popover.Content,{"data-slot":"data-table-group-panel",align:"end",sideOffset:4,className:h.cn("z-50 min-w-64 rounded-lg border bg-popover p-3 text-popover-foreground shadow-md outline-none","data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0","data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95","data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2"),children:e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("label",{className:"text-xs font-medium text-muted-foreground",htmlFor:s,children:"Group rows by"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(o.Select,{value:a??m,onValueChange:t=>p(t===m?null:t),children:[e.jsx(o.SelectTrigger,{id:s,size:"sm",className:"w-44",children:e.jsx(o.SelectValue,{placeholder:"Select column"})}),e.jsxs(o.SelectContent,{children:[e.jsx(o.SelectItem,{value:m,children:"None"}),x.map(t=>{const N=c.find(y=>y.id===t.columnId);return e.jsx(o.SelectItem,{value:t.columnId,children:t.label??j(t.columnId,r,N)},t.columnId)})]})]}),a&&e.jsx(f.Button,{type:"button",variant:"ghost",size:"icon",className:"size-8 shrink-0 text-muted-foreground hover:text-foreground",onClick:()=>p(null),"aria-label":"Clear grouping",children:e.jsx(b.XIcon,{className:"size-3.5"})})]})]})})})]})}v.displayName="DataTableGroup";exports.DataTableGroup=v;
2
+ //# sourceMappingURL=data-table-group.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-group.cjs","sources":["../../../../src/components/ui/data-table/data-table-group.tsx"],"sourcesContent":["\"use client\"\n\nimport { GroupIcon, XIcon } from \"lucide-react\"\nimport { Popover } from \"radix-ui\"\nimport { useId } from \"react\"\n\nimport { useDataTable } from \"./data-table\"\n\nimport type { Column } from \"@tanstack/react-table\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getColumnLabel(\n colId: string,\n columnLabels: Record<string, string>,\n col: Column<unknown, unknown> | undefined,\n): string {\n const meta = col?.columnDef.meta as { label?: string } | undefined\n return (\n columnLabels[colId] ??\n meta?.label ??\n (typeof col?.columnDef.header === \"string\" ? col.columnDef.header : undefined) ??\n colId\n )\n}\n\n// ---------------------------------------------------------------------------\n// DataTableGroup\n// ---------------------------------------------------------------------------\n\nconst NO_GROUPING = \"__none__\"\n\ninterface DataTableGroupProps {\n className?: string\n}\n\nfunction DataTableGroup({ className }: DataTableGroupProps) {\n const selectId = useId()\n const {\n table,\n columnLabels,\n grouping,\n setGrouping,\n groupConfig,\n enableGrouping,\n } = useDataTable()\n\n if (!enableGrouping) return null\n\n const allLeafColumns = table.getAllLeafColumns()\n\n const resolvedColumns =\n groupConfig.length > 0\n ? groupConfig\n : allLeafColumns\n .filter((col) => \"accessorKey\" in col.columnDef || \"accessorFn\" in col.columnDef)\n .map((col) => ({ columnId: col.id, label: undefined as string | undefined }))\n\n const activeColumn = grouping\n ? resolvedColumns.find((c) => c.columnId === grouping) ?? { columnId: grouping }\n : null\n\n const activeColumnLabel = activeColumn\n ? activeColumn.label ??\n getColumnLabel(\n activeColumn.columnId,\n columnLabels,\n allLeafColumns.find((lc) => lc.id === activeColumn.columnId),\n )\n : null\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-group\"\n className={cn(className)}\n aria-label={\n activeColumnLabel ? `Grouped by ${activeColumnLabel}` : \"Group by\"\n }\n >\n <GroupIcon className=\"size-3.5\" />\n {activeColumnLabel ? (\n <>\n Grouped by\n <span className=\"rounded-sm bg-primary px-1.5 text-[10px] font-medium text-primary-foreground\">\n {activeColumnLabel}\n </span>\n </>\n ) : (\n \"Group\"\n )}\n </Button>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n data-slot=\"data-table-group-panel\"\n align=\"end\"\n sideOffset={4}\n className={cn(\n \"z-50 min-w-64 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 <label\n className=\"text-xs font-medium text-muted-foreground\"\n htmlFor={selectId}\n >\n Group rows by\n </label>\n <div className=\"flex items-center gap-2\">\n <Select\n value={grouping ?? NO_GROUPING}\n onValueChange={(v) => setGrouping(v === NO_GROUPING ? null : v)}\n >\n <SelectTrigger\n id={selectId}\n size=\"sm\"\n className=\"w-44\"\n >\n <SelectValue placeholder=\"Select column\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NO_GROUPING}>None</SelectItem>\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 {grouping && (\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={() => setGrouping(null)}\n aria-label=\"Clear grouping\"\n >\n <XIcon className=\"size-3.5\" />\n </Button>\n )}\n </div>\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )\n}\n\nDataTableGroup.displayName = \"DataTableGroup\"\n\nexport { DataTableGroup }\nexport type { DataTableGroupProps }\n"],"names":["getColumnLabel","colId","columnLabels","col","meta","NO_GROUPING","DataTableGroup","className","selectId","useId","table","grouping","setGrouping","groupConfig","enableGrouping","useDataTable","allLeafColumns","resolvedColumns","activeColumn","c","activeColumnLabel","lc","jsxs","Popover","jsx","Button","cn","GroupIcon","Fragment","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","XIcon"],"mappings":"gTAwBA,SAASA,EACPC,EACAC,EACAC,EACQ,CACR,MAAMC,EAAOD,GAAK,UAAU,KAC5B,OACED,EAAaD,CAAK,GAClBG,GAAM,QACL,OAAOD,GAAK,UAAU,QAAW,SAAWA,EAAI,UAAU,OAAS,SACpEF,CAEJ,CAMA,MAAMI,EAAc,WAMpB,SAASC,EAAe,CAAE,UAAAC,GAAkC,CAC1D,MAAMC,EAAWC,EAAAA,MAAA,EACX,CACJ,MAAAC,EACA,aAAAR,EACA,SAAAS,EACA,YAAAC,EACA,YAAAC,EACA,eAAAC,CAAA,EACEC,eAAA,EAEJ,GAAI,CAACD,EAAgB,OAAO,KAE5B,MAAME,EAAiBN,EAAM,kBAAA,EAEvBO,EACJJ,EAAY,OAAS,EACjBA,EACAG,EACG,OAAQb,GAAQ,gBAAiBA,EAAI,WAAa,eAAgBA,EAAI,SAAS,EAC/E,IAAKA,IAAS,CAAE,SAAUA,EAAI,GAAI,MAAO,MAAA,EAAkC,EAE9Ee,EAAeP,EACjBM,EAAgB,KAAME,GAAMA,EAAE,WAAaR,CAAQ,GAAK,CAAE,SAAUA,GACpE,KAEES,EAAoBF,EACtBA,EAAa,OACblB,EACEkB,EAAa,SACbhB,EACAc,EAAe,KAAMK,GAAOA,EAAG,KAAOH,EAAa,QAAQ,CAAA,EAE7D,KAEJ,OACEI,OAACC,EAAAA,QAAQ,KAAR,CACC,SAAA,CAAAC,EAAAA,IAACD,EAAAA,QAAQ,QAAR,CAAgB,QAAO,GACtB,SAAAD,EAAAA,KAACG,EAAAA,OAAA,CACC,KAAK,SACL,QAAQ,UACR,KAAK,KACL,YAAU,mBACV,UAAWC,EAAAA,GAAGnB,CAAS,EACvB,aACEa,EAAoB,cAAcA,CAAiB,GAAK,WAG1D,SAAA,CAAAI,EAAAA,IAACG,EAAAA,UAAA,CAAU,UAAU,UAAA,CAAW,EAC/BP,EACCE,EAAAA,KAAAM,WAAA,CAAE,SAAA,CAAA,aAEAJ,EAAAA,IAAC,OAAA,CAAK,UAAU,+EACb,SAAAJ,CAAA,CACH,CAAA,CAAA,CACF,EAEA,OAAA,CAAA,CAAA,EAGN,EAEAI,EAAAA,IAACD,EAAAA,QAAQ,OAAR,CACC,SAAAC,EAAAA,IAACD,EAAAA,QAAQ,QAAR,CACC,YAAU,yBACV,MAAM,MACN,WAAY,EACZ,UAAWG,EAAAA,GACT,gGACA,+DACA,6DACA,+DACA,+EAAA,EAGF,SAAAJ,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAE,EAAAA,IAAC,QAAA,CACC,UAAU,4CACV,QAAShB,EACV,SAAA,eAAA,CAAA,EAGDc,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAACO,EAAAA,OAAA,CACC,MAAOlB,GAAYN,EACnB,cAAgByB,GAAMlB,EAAYkB,IAAMzB,EAAc,KAAOyB,CAAC,EAE9D,SAAA,CAAAN,EAAAA,IAACO,EAAAA,cAAA,CACC,GAAIvB,EACJ,KAAK,KACL,UAAU,OAEV,SAAAgB,EAAAA,IAACQ,EAAAA,YAAA,CAAY,YAAY,eAAA,CAAgB,CAAA,CAAA,SAE1CC,EAAAA,cAAA,CACC,SAAA,CAAAT,EAAAA,IAACU,EAAAA,WAAA,CAAW,MAAO7B,EAAa,SAAA,OAAI,EACnCY,EAAgB,IAAKE,GAAM,CAC1B,MAAMhB,EAAMa,EAAe,KAAMK,GAAOA,EAAG,KAAOF,EAAE,QAAQ,EAC5D,OACEK,EAAAA,IAACU,EAAAA,WAAA,CAA4B,MAAOf,EAAE,SACnC,SAAAA,EAAE,OAASnB,EAAemB,EAAE,SAAUjB,EAAcC,CAAG,CAAA,EADzCgB,EAAE,QAEnB,CAEJ,CAAC,CAAA,CAAA,CACH,CAAA,CAAA,CAAA,EAEDR,GACCa,EAAAA,IAACC,EAAAA,OAAA,CACC,KAAK,SACL,QAAQ,QACR,KAAK,OACL,UAAU,8DACV,QAAS,IAAMb,EAAY,IAAI,EAC/B,aAAW,iBAEX,SAAAY,EAAAA,IAACW,EAAAA,MAAA,CAAM,UAAU,UAAA,CAAW,CAAA,CAAA,CAC9B,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CACF,CAAA,EACF,CAEJ,CAEA7B,EAAe,YAAc"}
@@ -0,0 +1,118 @@
1
+ import { jsxs as t, jsx as o, Fragment as G } from "react/jsx-runtime";
2
+ import { GroupIcon as y, XIcon as z } from "lucide-react";
3
+ import { Popover as m } from "radix-ui";
4
+ import { useId as D } from "react";
5
+ import { useDataTable as S } from "./data-table.js";
6
+ import { Button as b } from "../button.js";
7
+ import { Select as L, SelectTrigger as T, SelectValue as _, SelectContent as w, SelectItem as h } from "../select.js";
8
+ import { cn as x } from "../../../lib/utils.js";
9
+ function v(a, r, n) {
10
+ const i = n?.columnDef.meta;
11
+ return r[a] ?? i?.label ?? (typeof n?.columnDef.header == "string" ? n.columnDef.header : void 0) ?? a;
12
+ }
13
+ const c = "__none__";
14
+ function F({ className: a }) {
15
+ const r = D(), {
16
+ table: n,
17
+ columnLabels: i,
18
+ grouping: l,
19
+ setGrouping: p,
20
+ groupConfig: f,
21
+ enableGrouping: I
22
+ } = S();
23
+ if (!I) return null;
24
+ const u = n.getAllLeafColumns(), g = f.length > 0 ? f : u.filter((e) => "accessorKey" in e.columnDef || "accessorFn" in e.columnDef).map((e) => ({ columnId: e.id, label: void 0 })), d = l ? g.find((e) => e.columnId === l) ?? { columnId: l } : null, s = d ? d.label ?? v(
25
+ d.columnId,
26
+ i,
27
+ u.find((e) => e.id === d.columnId)
28
+ ) : null;
29
+ return /* @__PURE__ */ t(m.Root, { children: [
30
+ /* @__PURE__ */ o(m.Trigger, { asChild: !0, children: /* @__PURE__ */ t(
31
+ b,
32
+ {
33
+ type: "button",
34
+ variant: "outline",
35
+ size: "sm",
36
+ "data-slot": "data-table-group",
37
+ className: x(a),
38
+ "aria-label": s ? `Grouped by ${s}` : "Group by",
39
+ children: [
40
+ /* @__PURE__ */ o(y, { className: "size-3.5" }),
41
+ s ? /* @__PURE__ */ t(G, { children: [
42
+ "Grouped by",
43
+ /* @__PURE__ */ o("span", { className: "rounded-sm bg-primary px-1.5 text-[10px] font-medium text-primary-foreground", children: s })
44
+ ] }) : "Group"
45
+ ]
46
+ }
47
+ ) }),
48
+ /* @__PURE__ */ o(m.Portal, { children: /* @__PURE__ */ o(
49
+ m.Content,
50
+ {
51
+ "data-slot": "data-table-group-panel",
52
+ align: "end",
53
+ sideOffset: 4,
54
+ className: x(
55
+ "z-50 min-w-64 rounded-lg border bg-popover p-3 text-popover-foreground shadow-md outline-none",
56
+ "data-[state=open]:animate-in data-[state=closed]:animate-out",
57
+ "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
58
+ "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
59
+ "data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2"
60
+ ),
61
+ children: /* @__PURE__ */ t("div", { className: "flex flex-col gap-2", children: [
62
+ /* @__PURE__ */ o(
63
+ "label",
64
+ {
65
+ className: "text-xs font-medium text-muted-foreground",
66
+ htmlFor: r,
67
+ children: "Group rows by"
68
+ }
69
+ ),
70
+ /* @__PURE__ */ t("div", { className: "flex items-center gap-2", children: [
71
+ /* @__PURE__ */ t(
72
+ L,
73
+ {
74
+ value: l ?? c,
75
+ onValueChange: (e) => p(e === c ? null : e),
76
+ children: [
77
+ /* @__PURE__ */ o(
78
+ T,
79
+ {
80
+ id: r,
81
+ size: "sm",
82
+ className: "w-44",
83
+ children: /* @__PURE__ */ o(_, { placeholder: "Select column" })
84
+ }
85
+ ),
86
+ /* @__PURE__ */ t(w, { children: [
87
+ /* @__PURE__ */ o(h, { value: c, children: "None" }),
88
+ g.map((e) => {
89
+ const N = u.find((C) => C.id === e.columnId);
90
+ return /* @__PURE__ */ o(h, { value: e.columnId, children: e.label ?? v(e.columnId, i, N) }, e.columnId);
91
+ })
92
+ ] })
93
+ ]
94
+ }
95
+ ),
96
+ l && /* @__PURE__ */ o(
97
+ b,
98
+ {
99
+ type: "button",
100
+ variant: "ghost",
101
+ size: "icon",
102
+ className: "size-8 shrink-0 text-muted-foreground hover:text-foreground",
103
+ onClick: () => p(null),
104
+ "aria-label": "Clear grouping",
105
+ children: /* @__PURE__ */ o(z, { className: "size-3.5" })
106
+ }
107
+ )
108
+ ] })
109
+ ] })
110
+ }
111
+ ) })
112
+ ] });
113
+ }
114
+ F.displayName = "DataTableGroup";
115
+ export {
116
+ F as DataTableGroup
117
+ };
118
+ //# sourceMappingURL=data-table-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-group.js","sources":["../../../../src/components/ui/data-table/data-table-group.tsx"],"sourcesContent":["\"use client\"\n\nimport { GroupIcon, XIcon } from \"lucide-react\"\nimport { Popover } from \"radix-ui\"\nimport { useId } from \"react\"\n\nimport { useDataTable } from \"./data-table\"\n\nimport type { Column } from \"@tanstack/react-table\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getColumnLabel(\n colId: string,\n columnLabels: Record<string, string>,\n col: Column<unknown, unknown> | undefined,\n): string {\n const meta = col?.columnDef.meta as { label?: string } | undefined\n return (\n columnLabels[colId] ??\n meta?.label ??\n (typeof col?.columnDef.header === \"string\" ? col.columnDef.header : undefined) ??\n colId\n )\n}\n\n// ---------------------------------------------------------------------------\n// DataTableGroup\n// ---------------------------------------------------------------------------\n\nconst NO_GROUPING = \"__none__\"\n\ninterface DataTableGroupProps {\n className?: string\n}\n\nfunction DataTableGroup({ className }: DataTableGroupProps) {\n const selectId = useId()\n const {\n table,\n columnLabels,\n grouping,\n setGrouping,\n groupConfig,\n enableGrouping,\n } = useDataTable()\n\n if (!enableGrouping) return null\n\n const allLeafColumns = table.getAllLeafColumns()\n\n const resolvedColumns =\n groupConfig.length > 0\n ? groupConfig\n : allLeafColumns\n .filter((col) => \"accessorKey\" in col.columnDef || \"accessorFn\" in col.columnDef)\n .map((col) => ({ columnId: col.id, label: undefined as string | undefined }))\n\n const activeColumn = grouping\n ? resolvedColumns.find((c) => c.columnId === grouping) ?? { columnId: grouping }\n : null\n\n const activeColumnLabel = activeColumn\n ? activeColumn.label ??\n getColumnLabel(\n activeColumn.columnId,\n columnLabels,\n allLeafColumns.find((lc) => lc.id === activeColumn.columnId),\n )\n : null\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-group\"\n className={cn(className)}\n aria-label={\n activeColumnLabel ? `Grouped by ${activeColumnLabel}` : \"Group by\"\n }\n >\n <GroupIcon className=\"size-3.5\" />\n {activeColumnLabel ? (\n <>\n Grouped by\n <span className=\"rounded-sm bg-primary px-1.5 text-[10px] font-medium text-primary-foreground\">\n {activeColumnLabel}\n </span>\n </>\n ) : (\n \"Group\"\n )}\n </Button>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n data-slot=\"data-table-group-panel\"\n align=\"end\"\n sideOffset={4}\n className={cn(\n \"z-50 min-w-64 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 <label\n className=\"text-xs font-medium text-muted-foreground\"\n htmlFor={selectId}\n >\n Group rows by\n </label>\n <div className=\"flex items-center gap-2\">\n <Select\n value={grouping ?? NO_GROUPING}\n onValueChange={(v) => setGrouping(v === NO_GROUPING ? null : v)}\n >\n <SelectTrigger\n id={selectId}\n size=\"sm\"\n className=\"w-44\"\n >\n <SelectValue placeholder=\"Select column\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NO_GROUPING}>None</SelectItem>\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 {grouping && (\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={() => setGrouping(null)}\n aria-label=\"Clear grouping\"\n >\n <XIcon className=\"size-3.5\" />\n </Button>\n )}\n </div>\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )\n}\n\nDataTableGroup.displayName = \"DataTableGroup\"\n\nexport { DataTableGroup }\nexport type { DataTableGroupProps }\n"],"names":["getColumnLabel","colId","columnLabels","col","meta","NO_GROUPING","DataTableGroup","className","selectId","useId","table","grouping","setGrouping","groupConfig","enableGrouping","useDataTable","allLeafColumns","resolvedColumns","activeColumn","c","activeColumnLabel","lc","jsxs","Popover","jsx","Button","cn","GroupIcon","Fragment","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","XIcon"],"mappings":"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"}