@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.
- package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +2 -0
- package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -0
- package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +140 -0
- package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +2 -0
- package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -0
- package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +126 -0
- package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs +2 -0
- package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs.map +1 -0
- package/dist/components/composed/PlateMapEditor/PlateMapEditor.js +422 -0
- package/dist/components/composed/PlateMapEditor/PlateMapEditor.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +2 -0
- package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -0
- package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +136 -0
- package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs +2 -0
- package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs.map +1 -0
- package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +389 -0
- package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs +2 -0
- package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs.map +1 -0
- package/dist/components/composed/PlateMapEditor/PlateZoomControl.js +54 -0
- package/dist/components/composed/PlateMapEditor/PlateZoomControl.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs +2 -0
- package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs.map +1 -0
- package/dist/components/composed/PlateMapEditor/TemplateIOPanel.js +96 -0
- package/dist/components/composed/PlateMapEditor/TemplateIOPanel.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/WellLegend.cjs +2 -0
- package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -0
- package/dist/components/composed/PlateMapEditor/WellLegend.js +58 -0
- package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +2 -0
- package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -0
- package/dist/components/composed/PlateMapEditor/WellManifestTable.js +408 -0
- package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs +2 -0
- package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs.map +1 -0
- package/dist/components/composed/PlateMapEditor/WellMetadataForm.js +177 -0
- package/dist/components/composed/PlateMapEditor/WellMetadataForm.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/autoFill.cjs +2 -0
- package/dist/components/composed/PlateMapEditor/autoFill.cjs.map +1 -0
- package/dist/components/composed/PlateMapEditor/autoFill.js +41 -0
- package/dist/components/composed/PlateMapEditor/autoFill.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/csvPlateTriage.cjs +4 -0
- package/dist/components/composed/PlateMapEditor/csvPlateTriage.cjs.map +1 -0
- package/dist/components/composed/PlateMapEditor/csvPlateTriage.js +103 -0
- package/dist/components/composed/PlateMapEditor/csvPlateTriage.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/helpers.cjs +2 -0
- package/dist/components/composed/PlateMapEditor/helpers.cjs.map +1 -0
- package/dist/components/composed/PlateMapEditor/helpers.js +11 -0
- package/dist/components/composed/PlateMapEditor/helpers.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/wellGrid.cjs +2 -0
- package/dist/components/composed/PlateMapEditor/wellGrid.cjs.map +1 -0
- package/dist/components/composed/PlateMapEditor/wellGrid.js +56 -0
- package/dist/components/composed/PlateMapEditor/wellGrid.js.map +1 -0
- package/dist/components/ui/data-table/data-table-filter.cjs +1 -1
- package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -1
- package/dist/components/ui/data-table/data-table-filter.js +124 -139
- package/dist/components/ui/data-table/data-table-filter.js.map +1 -1
- package/dist/components/ui/data-table/data-table-group.cjs +2 -0
- package/dist/components/ui/data-table/data-table-group.cjs.map +1 -0
- package/dist/components/ui/data-table/data-table-group.js +118 -0
- package/dist/components/ui/data-table/data-table-group.js.map +1 -0
- package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
- package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
- package/dist/components/ui/data-table/data-table-pagination.js +22 -22
- package/dist/components/ui/data-table/data-table-pagination.js.map +1 -1
- package/dist/components/ui/data-table/data-table.cjs +1 -1
- package/dist/components/ui/data-table/data-table.cjs.map +1 -1
- package/dist/components/ui/data-table/data-table.js +567 -316
- package/dist/components/ui/data-table/data-table.js.map +1 -1
- package/dist/components/ui/popover.cjs +2 -0
- package/dist/components/ui/popover.cjs.map +1 -0
- package/dist/components/ui/popover.js +45 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +580 -1
- package/dist/index.js +637 -593
- package/dist/index.js.map +1 -1
- package/dist/index.tailwind.css +1 -1
- 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
|
|
2
|
-
import { ListFilterIcon as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { Select as y, SelectTrigger as _, SelectValue as
|
|
8
|
-
import { cn as
|
|
9
|
-
const
|
|
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
|
-
},
|
|
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
|
|
27
|
-
return s[
|
|
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
|
|
29
|
+
function G(r, s) {
|
|
30
30
|
const n = s?.[0] ?? "contains";
|
|
31
|
-
return { id: crypto.randomUUID(), columnId:
|
|
31
|
+
return { id: crypto.randomUUID(), columnId: r, operator: n, value: "" };
|
|
32
32
|
}
|
|
33
|
-
function
|
|
34
|
-
const { table: s, columnLabels: n, filters:
|
|
35
|
-
if (!
|
|
36
|
-
const
|
|
37
|
-
function
|
|
38
|
-
m([...
|
|
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
|
|
41
|
-
m(
|
|
40
|
+
function A(e) {
|
|
41
|
+
m(o.filter((d) => d.id !== e));
|
|
42
42
|
}
|
|
43
|
-
function
|
|
44
|
-
m(
|
|
43
|
+
function h(e, d) {
|
|
44
|
+
m(o.map((c) => c.id === e ? { ...c, ...d } : c));
|
|
45
45
|
}
|
|
46
|
-
function
|
|
46
|
+
function L() {
|
|
47
47
|
m([]);
|
|
48
48
|
}
|
|
49
|
-
const
|
|
50
|
-
return /* @__PURE__ */
|
|
51
|
-
/* @__PURE__ */
|
|
52
|
-
|
|
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:
|
|
59
|
-
"aria-label":
|
|
58
|
+
className: B(r),
|
|
59
|
+
"aria-label": u > 0 ? `Filter (${u} active)` : "Filter",
|
|
60
60
|
children: [
|
|
61
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ l(R, { className: "size-3.5" }),
|
|
62
62
|
"Filter",
|
|
63
|
-
|
|
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__ */
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
"
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
159
|
+
H.displayName = "DataTableFilter";
|
|
175
160
|
export {
|
|
176
|
-
|
|
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":"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"}
|
|
@@ -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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"}
|