@asteby/metacore-ui 2.6.2 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,114 @@
1
+ import * as React from 'react';
2
+ import { PopoverContent } from '../primitives/popover';
3
+ export interface FilterOption {
4
+ label: string;
5
+ value: string;
6
+ icon?: string;
7
+ color?: string;
8
+ /**
9
+ * Optional occurrence count for this value across the (server-side) dataset.
10
+ * Set by `facet` filters (see the `/facets` endpoint) and rendered muted +
11
+ * right-aligned in the option row. Absent for inline/relation options.
12
+ */
13
+ count?: number;
14
+ }
15
+ /**
16
+ * Canonical filter-type union shared by every metacore app that renders a
17
+ * DynamicTable or DynamicKanban. Kept open for extension — new niches (BI
18
+ * dashboards, CRM, inventory, catalog) can add variants here instead of each
19
+ * forking the type.
20
+ */
21
+ export type ColumnFilterType = 'select' | 'boolean' | 'text' | 'number_range' | 'date_range'
22
+ /**
23
+ * Like `select` but the options are resolved server-side from a relation
24
+ * (`filterSearchEndpoint = /options/<ref>`) rather than declared inline.
25
+ * Renders the same multi-value checkbox combobox; the host loads + caches
26
+ * the options into `filterOptions` before they arrive.
27
+ */
28
+ | 'dynamic_select'
29
+ /**
30
+ * A free-text column upgraded to a value picker: instead of a bare
31
+ * "Contiene..." box, it lazily loads the distinct values of the column
32
+ * (with occurrence counts) from a `/facets` endpoint via `loadOptions` when
33
+ * the popover opens, and renders them as a multi-select combobox. Always
34
+ * degrades gracefully: if `loadOptions` is missing / fails / returns nothing
35
+ * it falls back to the plain "Contiene..." text input, and even when options
36
+ * exist it keeps a "Contiene texto…" affordance that emits an `ILIKE:` match.
37
+ * Selected values serialize as equality/`IN:` just like `select`.
38
+ */
39
+ | 'facet';
40
+ export interface ColumnFilterMeta {
41
+ filterable?: boolean;
42
+ filterType?: ColumnFilterType;
43
+ filterKey?: string;
44
+ filterOptions?: FilterOption[];
45
+ filterLoading?: boolean;
46
+ /**
47
+ * Async search endpoint for server-driven option lookups. When set, the
48
+ * filter renders a searchable combobox backed by the app's API instead of
49
+ * iterating an in-memory filterOptions array. Apps wire this through the
50
+ * standard `/api/options/:model?field=` shape produced by
51
+ * kernel/dynamic.Service.Options.
52
+ */
53
+ filterSearchEndpoint?: string;
54
+ selectedValues?: string[];
55
+ onFilterChange?: (filterKey: string, values: string[]) => void;
56
+ /**
57
+ * Lazy option loader for `facet` filters. Called with the current search
58
+ * term when the popover opens (and on debounced typing). Resolving to a
59
+ * non-empty array renders the value picker; resolving empty / rejecting
60
+ * degrades the filter to the plain "Contiene..." text input.
61
+ */
62
+ loadOptions?: (q?: string) => Promise<FilterOption[]>;
63
+ }
64
+ export interface ColumnFilterControlProps {
65
+ /** Backend filter key (`f_<filterKey>=…`). */
66
+ filterKey: string;
67
+ filterType?: ColumnFilterType;
68
+ filterOptions?: FilterOption[];
69
+ filterLoading?: boolean;
70
+ filterSearchEndpoint?: string;
71
+ selectedValues?: string[];
72
+ onFilterChange?: (filterKey: string, values: string[]) => void;
73
+ /** Lazy option loader for `facet` filters (see ColumnFilterMeta.loadOptions). */
74
+ loadOptions?: (q?: string) => Promise<FilterOption[]>;
75
+ /**
76
+ * Field label. Rendered inside the trigger in toolbar mode (`showLabel`), so a
77
+ * board/toolbar surface — which has no column headers — still names each
78
+ * filter. Ignored in the icon-only header mode.
79
+ */
80
+ label?: string;
81
+ /**
82
+ * Toolbar mode: render a labeled chip trigger (`<ListFilter/> Label (n)`)
83
+ * instead of the icon-only header button. Use on the kanban filter bar.
84
+ */
85
+ showLabel?: boolean;
86
+ /**
87
+ * Trigger style.
88
+ * - `'chip'` (default): the compact labeled/icon button (`showLabel` picks
89
+ * labeled vs icon-only) used in table headers + the kanban toolbar.
90
+ * - `'row'`: a full-width settings-style row — leading type `icon`, `label`,
91
+ * and a right-aligned value summary — for the redesigned Filtros panel.
92
+ */
93
+ variant?: 'chip' | 'row';
94
+ /** Leading icon node for the `'row'` variant (a per-data-type glyph). */
95
+ icon?: React.ReactNode;
96
+ /**
97
+ * Pre-computed human summary of the active value(s) for the `'row'` variant's
98
+ * right side. Empty → the row shows "Cualquiera" in muted.
99
+ */
100
+ valueSummary?: string;
101
+ align?: React.ComponentProps<typeof PopoverContent>['align'];
102
+ /** Extra classes on the trigger button. */
103
+ className?: string;
104
+ }
105
+ /**
106
+ * The per-column filter popover — extracted from `FilterableColumnHeader` so it
107
+ * can be reused OUTSIDE a TanStack table header (e.g. the DynamicKanban filter
108
+ * bar). Fully driven by plain props; no `Column` dependency. Supports `select`,
109
+ * `boolean`, `dynamic_select`, `text`, `number_range` and `date_range`, emitting
110
+ * the same wire values the backend `f_<key>` filters expect
111
+ * (`ILIKE:`/`GTE:`/`LTE:`/`YYYY-MM-DD_YYYY-MM-DD`/plain).
112
+ */
113
+ export declare function ColumnFilterControl({ filterKey, filterType, filterOptions, filterLoading, filterSearchEndpoint, selectedValues: selectedValuesProp, onFilterChange, loadOptions, label, showLabel, variant, icon, valueSummary, align, className, }: ColumnFilterControlProps): React.JSX.Element | null;
114
+ //# sourceMappingURL=column-filter-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-filter-control.d.ts","sourceRoot":"","sources":["../../src/data-table/column-filter-control.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAU9B,OAAO,EAEL,cAAc,EAEf,MAAM,sBAAsB,CAAA;AAY7B,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GACxB,QAAQ,GACR,SAAS,GACT,MAAM,GACN,cAAc,GACd,YAAY;AACd;;;;;GAKG;GACD,gBAAgB;AAClB;;;;;;;;;GASG;GACD,OAAO,CAAA;AAEX,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,UAAU,CAAC,EAAE,gBAAgB,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC9D;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;CACtD;AAED,MAAM,WAAW,wBAAwB;IACvC,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,gBAAgB,CAAA;IAC7B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC9D,iFAAiF;IACjF,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IACrD;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IACxB,yEAAyE;IACzE,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,CAAC,OAAO,CAAC,CAAA;IAC5D,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,UAAqB,EACrB,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,cAAc,EAAE,kBAAkB,EAClC,cAAc,EACd,WAAW,EACX,KAAK,EACL,SAAiB,EACjB,OAAgB,EAChB,IAAI,EACJ,YAAY,EACZ,KAAe,EACf,SAAS,GACV,EAAE,wBAAwB,4BA+e1B"}
@@ -0,0 +1,329 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { CheckIcon } from '@radix-ui/react-icons';
4
+ import { format } from 'date-fns';
5
+ import { es } from 'date-fns/locale';
6
+ import {} from 'react-day-picker';
7
+ import { ChevronRight, ListFilter } from 'lucide-react';
8
+ import { cn } from '../lib/utils';
9
+ import { resolveColorCss } from '../lib/option-colors';
10
+ import { Button } from '../primitives/button';
11
+ import { Label } from '../primitives/label';
12
+ import { Popover, PopoverContent, PopoverTrigger, } from '../primitives/popover';
13
+ import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from '../primitives/command';
14
+ import { Input } from '../primitives/input';
15
+ import { Calendar } from '../primitives/calendar';
16
+ /**
17
+ * The per-column filter popover — extracted from `FilterableColumnHeader` so it
18
+ * can be reused OUTSIDE a TanStack table header (e.g. the DynamicKanban filter
19
+ * bar). Fully driven by plain props; no `Column` dependency. Supports `select`,
20
+ * `boolean`, `dynamic_select`, `text`, `number_range` and `date_range`, emitting
21
+ * the same wire values the backend `f_<key>` filters expect
22
+ * (`ILIKE:`/`GTE:`/`LTE:`/`YYYY-MM-DD_YYYY-MM-DD`/plain).
23
+ */
24
+ export function ColumnFilterControl({ filterKey, filterType = 'select', filterOptions, filterLoading, filterSearchEndpoint, selectedValues: selectedValuesProp, onFilterChange, loadOptions, label, showLabel = false, variant = 'chip', icon, valueSummary, align = 'start', className, }) {
25
+ // `select`, `boolean` and `dynamic_select` all render the same multi-value
26
+ // checkbox combobox; only the option source differs (inline vs relation
27
+ // endpoint). Treat them uniformly so a relation filter behaves like a static
28
+ // one once its options have loaded.
29
+ const isMultiSelect = filterType === 'select' ||
30
+ filterType === 'boolean' ||
31
+ filterType === 'dynamic_select';
32
+ const isFacet = filterType === 'facet';
33
+ const hasOptions = !!filterOptions && filterOptions.length > 0;
34
+ const selectedValues = new Set(selectedValuesProp || []);
35
+ const activeCount = selectedValues.size;
36
+ const rawTextValue = selectedValuesProp && selectedValuesProp.length > 0
37
+ ? selectedValuesProp[0]
38
+ : '';
39
+ const displayTextValue = rawTextValue.replace(/^(ILIKE|LIKE|GT|LT|GTE|LTE):/, '');
40
+ const parseRangeValues = () => {
41
+ let min = '';
42
+ let max = '';
43
+ for (const v of selectedValuesProp || []) {
44
+ if (v.startsWith('GTE:'))
45
+ min = v.replace('GTE:', '');
46
+ if (v.startsWith('LTE:'))
47
+ max = v.replace('LTE:', '');
48
+ }
49
+ return { min, max };
50
+ };
51
+ const rangeValues = parseRangeValues();
52
+ // Date range is serialized as a single "YYYY-MM-DD_YYYY-MM-DD" value (same
53
+ // wire shape the backend expects from the legacy starter-core picker).
54
+ const parseDateRange = () => {
55
+ const val = selectedValuesProp && selectedValuesProp.length > 0
56
+ ? selectedValuesProp[0]
57
+ : '';
58
+ if (!val || !val.includes('_'))
59
+ return undefined;
60
+ const [from, to] = val.split('_');
61
+ const fromDate = new Date(`${from}T00:00:00`);
62
+ const toDate = new Date(`${to}T00:00:00`);
63
+ if (isNaN(fromDate.getTime()) || isNaN(toDate.getTime()))
64
+ return undefined;
65
+ return { from: fromDate, to: toDate };
66
+ };
67
+ const isActive = (() => {
68
+ if (filterType === 'text')
69
+ return rawTextValue !== '';
70
+ if (filterType === 'number_range')
71
+ return rangeValues.min !== '' || rangeValues.max !== '';
72
+ if (filterType === 'date_range')
73
+ return ((selectedValuesProp || []).length > 0 && selectedValuesProp[0] !== '');
74
+ return activeCount > 0;
75
+ })();
76
+ const [localTextValue, setLocalTextValue] = React.useState(displayTextValue);
77
+ const [localMin, setLocalMin] = React.useState(rangeValues.min);
78
+ const [localMax, setLocalMax] = React.useState(rangeValues.max);
79
+ const [localSelected, setLocalSelected] = React.useState(new Set(selectedValues));
80
+ const [localDateRange, setLocalDateRange] = React.useState(parseDateRange());
81
+ const [filterOpen, setFilterOpen] = React.useState(false);
82
+ const displayOptions = filterOptions || [];
83
+ const selectedKey = (selectedValuesProp || []).join(',');
84
+ React.useEffect(() => {
85
+ setLocalTextValue(displayTextValue);
86
+ }, [displayTextValue]);
87
+ React.useEffect(() => {
88
+ setLocalMin(rangeValues.min);
89
+ setLocalMax(rangeValues.max);
90
+ }, [rangeValues.min, rangeValues.max]);
91
+ React.useEffect(() => {
92
+ setLocalDateRange(parseDateRange());
93
+ // eslint-disable-next-line react-hooks/exhaustive-deps
94
+ }, [selectedKey]);
95
+ React.useEffect(() => {
96
+ if (filterOpen) {
97
+ setLocalSelected(new Set(selectedValuesProp || []));
98
+ }
99
+ // eslint-disable-next-line react-hooks/exhaustive-deps
100
+ }, [filterOpen, selectedKey]);
101
+ const canFilter = hasOptions ||
102
+ filterType === 'text' ||
103
+ filterType === 'number_range' ||
104
+ filterType === 'date_range' ||
105
+ // A facet is always actionable: worst case it degrades to a text "Contiene"
106
+ // box, so it never renders a dead trigger.
107
+ isFacet ||
108
+ // A relation filter is still actionable while its options stream in —
109
+ // surface the trigger (the combobox shows a loading/empty state).
110
+ (filterType === 'dynamic_select' && !!filterSearchEndpoint);
111
+ if (!canFilter)
112
+ return null;
113
+ const handleLocalToggle = (value) => {
114
+ setLocalSelected((prev) => {
115
+ const next = new Set(prev);
116
+ if (next.has(value))
117
+ next.delete(value);
118
+ else
119
+ next.add(value);
120
+ return next;
121
+ });
122
+ };
123
+ const handleApplySelect = () => {
124
+ onFilterChange?.(filterKey, Array.from(localSelected));
125
+ setFilterOpen(false);
126
+ };
127
+ const handleClearFilter = () => {
128
+ onFilterChange?.(filterKey, []);
129
+ setLocalTextValue('');
130
+ setLocalMin('');
131
+ setLocalMax('');
132
+ setLocalSelected(new Set());
133
+ setLocalDateRange(undefined);
134
+ };
135
+ const handleDateRangeApply = () => {
136
+ if (localDateRange?.from) {
137
+ const from = format(localDateRange.from, 'yyyy-MM-dd');
138
+ const to = localDateRange.to
139
+ ? format(localDateRange.to, 'yyyy-MM-dd')
140
+ : from;
141
+ onFilterChange?.(filterKey, [`${from}_${to}`]);
142
+ }
143
+ setFilterOpen(false);
144
+ };
145
+ const handleTextSubmit = () => {
146
+ const trimmed = localTextValue.trim();
147
+ if (trimmed) {
148
+ onFilterChange?.(filterKey, [`ILIKE:${trimmed}`]);
149
+ }
150
+ else {
151
+ onFilterChange?.(filterKey, []);
152
+ }
153
+ };
154
+ const handleNumberRangeSubmit = () => {
155
+ const values = [];
156
+ if (localMin.trim())
157
+ values.push(`GTE:${localMin.trim()}`);
158
+ if (localMax.trim())
159
+ values.push(`LTE:${localMax.trim()}`);
160
+ onFilterChange?.(filterKey, values);
161
+ };
162
+ const localHasChanges = (() => {
163
+ if (isMultiSelect) {
164
+ const current = new Set(selectedValuesProp || []);
165
+ if (localSelected.size !== current.size)
166
+ return true;
167
+ for (const v of localSelected) {
168
+ if (!current.has(v))
169
+ return true;
170
+ }
171
+ return false;
172
+ }
173
+ return false;
174
+ })();
175
+ const trigger = variant === 'row' ? (_jsxs("button", { type: 'button', "data-active": isActive || undefined, className: cn('group/row flex w-full items-center gap-2.5 rounded-lg px-2 py-1.5 text-left transition-colors', 'hover:bg-accent focus-visible:bg-accent focus-visible:outline-none', isActive && 'bg-accent/50', className), children: [_jsx("span", { className: cn('flex size-7 shrink-0 items-center justify-center rounded-md transition-colors', isActive
176
+ ? 'bg-primary/15 text-primary'
177
+ : 'bg-muted text-muted-foreground group-hover/row:text-foreground'), children: icon ?? _jsx(ListFilter, { className: 'h-3.5 w-3.5' }) }), _jsx("span", { className: 'flex-1 truncate text-sm font-medium', children: label || filterKey }), _jsx("span", { className: cn('max-w-[46%] truncate text-xs', isActive ? 'font-medium text-foreground' : 'text-muted-foreground'), children: isActive && valueSummary
178
+ ? valueSummary
179
+ : isActive && (isMultiSelect || isFacet) && activeCount > 0
180
+ ? `${activeCount} seleccionados`
181
+ : 'Cualquiera' }), _jsx(ChevronRight, { className: 'size-3.5 shrink-0 text-muted-foreground/60 transition-transform group-hover/row:translate-x-0.5' })] })) : showLabel ? (_jsxs(Button, { variant: 'outline', size: 'sm', className: cn('h-8 gap-1.5 text-xs', isActive && 'border-primary/60 text-primary', className), children: [_jsx(ListFilter, { className: 'h-3.5 w-3.5' }), label || filterKey, isActive && (isMultiSelect || isFacet) && activeCount > 0 && (_jsx("span", { className: 'ml-0.5 flex h-4 min-w-4 items-center justify-center rounded-full bg-primary px-1 text-[10px] font-bold text-primary-foreground', children: activeCount })), isActive && !isMultiSelect && !isFacet && (_jsx("span", { className: 'ml-0.5 h-1.5 w-1.5 rounded-full bg-primary' }))] })) : (_jsx(Button, { variant: 'ghost', size: 'icon', className: cn('h-7 w-7 shrink-0', isActive
182
+ ? 'text-primary hover:text-primary'
183
+ : 'opacity-70 hover:opacity-100', className), children: _jsxs("div", { className: 'relative', children: [_jsx(ListFilter, { className: 'h-3.5 w-3.5' }), isActive && (isMultiSelect || isFacet) && activeCount > 0 && (_jsx("span", { className: 'absolute -top-1.5 -right-1.5 flex h-3.5 min-w-3.5 items-center justify-center rounded-full bg-primary text-[9px] font-bold text-primary-foreground px-0.5', children: activeCount })), isActive && !isMultiSelect && !isFacet && (_jsx("span", { className: 'absolute -top-1 -right-1 flex h-2 w-2 rounded-full bg-primary' }))] }) }));
184
+ return (_jsxs(Popover, { modal: false, open: filterOpen, onOpenChange: setFilterOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: trigger }), _jsxs(PopoverContent, { className: cn('overflow-hidden rounded-xl p-0 shadow-lg', filterType === 'date_range'
185
+ ? 'w-auto'
186
+ : isFacet
187
+ ? 'w-[256px]'
188
+ : 'w-[228px]'), align: align, onCloseAutoFocus: (e) => e.preventDefault(), children: [label && (_jsxs("div", { className: 'flex items-center gap-2 border-b bg-muted/40 px-3 py-2', children: [icon && (_jsx("span", { className: 'text-muted-foreground [&>svg]:size-3.5', children: icon })), _jsx("span", { className: 'truncate text-xs font-semibold', children: label })] })), isMultiSelect && (hasOptions || filterType === 'dynamic_select') && (_jsxs(Command, { children: [_jsx(CommandInput, { placeholder: 'Buscar...' }), _jsxs(CommandList, { children: [_jsx(CommandEmpty, { children: filterLoading ? 'Cargando…' : 'Sin resultados.' }), _jsx(CommandGroup, { children: displayOptions.map((option) => {
189
+ const isSelected = localSelected.has(option.value);
190
+ return (_jsxs(CommandItem, { onSelect: () => handleLocalToggle(option.value), onPointerDown: (e) => e.preventDefault(), children: [_jsx("div", { className: cn('mr-2 flex size-4 shrink-0 items-center justify-center rounded-sm border transition-colors', isSelected
191
+ ? // Foreground/background is contrast-guaranteed in
192
+ // both themes, so the checkmark stays legible even
193
+ // when a brand's primary/primary-foreground pair
194
+ // collapses to dark-on-dark in dark mode.
195
+ 'border-foreground bg-foreground text-background'
196
+ : 'border-muted-foreground/50 opacity-70 [&_svg]:invisible'), children: _jsx(CheckIcon, { className: 'h-3.5 w-3.5' }) }), option.color && (_jsx("span", { className: 'mr-1 size-2.5 rounded-full shrink-0', style: {
197
+ backgroundColor: resolveColorCss(option.color),
198
+ } })), _jsx("span", { className: 'truncate', children: option.label }), typeof option.count === 'number' && (_jsx("span", { className: 'ml-auto pl-2 text-xs tabular-nums text-muted-foreground', children: option.count }))] }, option.value));
199
+ }) })] }), _jsxs("div", { className: 'border-t p-2 flex gap-1.5', children: [_jsx(Button, { size: 'sm', variant: 'outline', className: 'h-7 flex-1 text-xs', onClick: () => {
200
+ handleClearFilter();
201
+ setFilterOpen(false);
202
+ }, disabled: !isActive && localSelected.size === 0, children: "Limpiar" }), _jsxs(Button, { size: 'sm', className: 'h-7 flex-1 text-xs', onClick: handleApplySelect, disabled: !localHasChanges && localSelected.size === 0, children: ["Aplicar", localSelected.size > 0 ? ` (${localSelected.size})` : ''] })] })] })), isFacet && (_jsx(FacetFilterBody, { filterKey: filterKey, selectedValues: selectedValuesProp || [], loadOptions: loadOptions, staticOptions: filterOptions, onFilterChange: onFilterChange, onClose: () => setFilterOpen(false) })), filterType === 'text' && (_jsxs("div", { className: 'p-2.5 space-y-2', children: [_jsx(Input, { placeholder: 'Contiene...', value: localTextValue, onChange: (e) => setLocalTextValue(e.target.value), onKeyDown: (e) => {
203
+ if (e.key === 'Enter')
204
+ handleTextSubmit();
205
+ }, className: 'h-8 text-sm', autoFocus: true }), _jsxs("div", { className: 'flex gap-1.5', children: [_jsx(Button, { size: 'sm', variant: 'outline', className: 'h-7 flex-1 text-xs', onClick: handleClearFilter, disabled: !isActive, children: "Limpiar" }), _jsx(Button, { size: 'sm', className: 'h-7 flex-1 text-xs', onClick: handleTextSubmit, children: "Aplicar" })] })] })), filterType === 'number_range' && (_jsxs("div", { className: 'p-2.5 space-y-2.5', children: [_jsxs("div", { className: 'grid grid-cols-2 gap-2', children: [_jsxs("div", { className: 'space-y-1', children: [_jsx(Label, { className: 'text-xs text-muted-foreground', children: "Min" }), _jsx(Input, { type: 'number', placeholder: '0', value: localMin, onChange: (e) => setLocalMin(e.target.value), onKeyDown: (e) => {
206
+ if (e.key === 'Enter')
207
+ handleNumberRangeSubmit();
208
+ }, className: 'h-8 text-sm', autoFocus: true })] }), _jsxs("div", { className: 'space-y-1', children: [_jsx(Label, { className: 'text-xs text-muted-foreground', children: "Max" }), _jsx(Input, { type: 'number', placeholder: '999999', value: localMax, onChange: (e) => setLocalMax(e.target.value), onKeyDown: (e) => {
209
+ if (e.key === 'Enter')
210
+ handleNumberRangeSubmit();
211
+ }, className: 'h-8 text-sm' })] })] }), _jsxs("div", { className: 'flex gap-1.5', children: [_jsx(Button, { size: 'sm', variant: 'outline', className: 'h-7 flex-1 text-xs', onClick: handleClearFilter, disabled: !isActive, children: "Limpiar" }), _jsx(Button, { size: 'sm', className: 'h-7 flex-1 text-xs', onClick: handleNumberRangeSubmit, children: "Aplicar" })] })] })), filterType === 'date_range' && (_jsxs("div", { children: [_jsx(Calendar, { mode: 'range', selected: localDateRange, onSelect: setLocalDateRange, locale: es, numberOfMonths: 1, className: 'p-2' }), localDateRange?.from && (_jsxs("div", { className: 'px-2 pb-1 text-center text-[11px] text-muted-foreground', children: [format(localDateRange.from, 'dd MMM yyyy', { locale: es }), localDateRange.to &&
212
+ localDateRange.to.getTime() !== localDateRange.from.getTime()
213
+ ? ` — ${format(localDateRange.to, 'dd MMM yyyy', { locale: es })}`
214
+ : ' (un día)'] })), _jsxs("div", { className: 'border-t p-1.5 flex gap-1.5', children: [_jsx(Button, { size: 'sm', variant: 'outline', className: 'h-7 flex-1 text-xs', onClick: () => {
215
+ handleClearFilter();
216
+ setFilterOpen(false);
217
+ }, disabled: !isActive && !localDateRange, children: "Limpiar" }), _jsx(Button, { size: 'sm', className: 'h-7 flex-1 text-xs', onClick: handleDateRangeApply, disabled: !localDateRange?.from, children: "Aplicar" })] })] }))] })] }));
218
+ }
219
+ // ---------------------------------------------------------------------------
220
+ // Facet filter body — a text column upgraded to a value picker.
221
+ // ---------------------------------------------------------------------------
222
+ const ILIKE_PREFIX = 'ILIKE:';
223
+ /**
224
+ * Lazy value picker for `facet` filters. Loads the column's distinct values +
225
+ * counts when it mounts (the popover just opened), lets the user multi-select
226
+ * them (emitted as equality/`IN:`), and always keeps a free-text "Contiene…"
227
+ * affordance that emits an `ILIKE:` match. Degrades to a bare text input when
228
+ * `loadOptions` is missing, rejects, or returns nothing — so a facet is never a
229
+ * dead end. Its own hooks live here (not in the parent) so they only run while
230
+ * the popover is open.
231
+ */
232
+ function FacetFilterBody({ filterKey, selectedValues, loadOptions, staticOptions, onFilterChange, onClose, }) {
233
+ // A single `ILIKE:` value means the field is in free-text mode; anything else
234
+ // is a set of picked facet values.
235
+ const seededFree = selectedValues.length === 1 && selectedValues[0].startsWith(ILIKE_PREFIX)
236
+ ? selectedValues[0].slice(ILIKE_PREFIX.length)
237
+ : '';
238
+ const [query, setQuery] = React.useState('');
239
+ const [options, setOptions] = React.useState(staticOptions ?? []);
240
+ const [loading, setLoading] = React.useState(false);
241
+ const [loaded, setLoaded] = React.useState(false);
242
+ const [localSelected, setLocalSelected] = React.useState(() => new Set(seededFree ? [] : selectedValues));
243
+ const [freeText, setFreeText] = React.useState(seededFree);
244
+ // Load (and reload on debounced typing). No loader → straight to degraded
245
+ // text mode.
246
+ React.useEffect(() => {
247
+ if (!loadOptions) {
248
+ setLoaded(true);
249
+ return;
250
+ }
251
+ let cancelled = false;
252
+ const handle = setTimeout(() => {
253
+ setLoading(true);
254
+ loadOptions(query.trim() || undefined)
255
+ .then((opts) => {
256
+ if (cancelled)
257
+ return;
258
+ setOptions(Array.isArray(opts) ? opts : []);
259
+ })
260
+ .catch(() => {
261
+ if (!cancelled)
262
+ setOptions([]);
263
+ })
264
+ .finally(() => {
265
+ if (cancelled)
266
+ return;
267
+ setLoading(false);
268
+ setLoaded(true);
269
+ });
270
+ }, query ? 250 : 0);
271
+ return () => {
272
+ cancelled = true;
273
+ clearTimeout(handle);
274
+ };
275
+ // eslint-disable-next-line react-hooks/exhaustive-deps
276
+ }, [query]);
277
+ const hasOptions = options.length > 0;
278
+ // Degraded: the loader settled with nothing (or there is no loader) → the
279
+ // field behaves like the classic "Contiene..." text filter.
280
+ const degraded = loaded && !loading && !hasOptions && query.trim() === '';
281
+ const toggle = (value) => {
282
+ setLocalSelected((prev) => {
283
+ const next = new Set(prev);
284
+ if (next.has(value))
285
+ next.delete(value);
286
+ else
287
+ next.add(value);
288
+ return next;
289
+ });
290
+ // Picking a value and typing free text are mutually exclusive on the wire
291
+ // (a single `f_<key>` can't be both `IN:` and `ILIKE:`), so a pick clears
292
+ // any pending free text.
293
+ setFreeText('');
294
+ };
295
+ const apply = () => {
296
+ const trimmed = freeText.trim();
297
+ if (trimmed) {
298
+ onFilterChange?.(filterKey, [`${ILIKE_PREFIX}${trimmed}`]);
299
+ }
300
+ else {
301
+ onFilterChange?.(filterKey, Array.from(localSelected));
302
+ }
303
+ onClose();
304
+ };
305
+ const clear = () => {
306
+ onFilterChange?.(filterKey, []);
307
+ setLocalSelected(new Set());
308
+ setFreeText('');
309
+ onClose();
310
+ };
311
+ const canApply = localSelected.size > 0 || freeText.trim() !== '';
312
+ // Degraded → just the text box (the original "Contiene..." experience).
313
+ if (degraded) {
314
+ return (_jsxs("div", { className: 'p-2.5 space-y-2', children: [_jsx(Input, { placeholder: 'Contiene...', value: freeText, onChange: (e) => setFreeText(e.target.value), onKeyDown: (e) => {
315
+ if (e.key === 'Enter')
316
+ apply();
317
+ }, className: 'h-8 text-sm', autoFocus: true }), _jsxs("div", { className: 'flex gap-1.5', children: [_jsx(Button, { size: 'sm', variant: 'outline', className: 'h-7 flex-1 text-xs', onClick: clear, disabled: selectedValues.length === 0 && freeText === '', children: "Limpiar" }), _jsx(Button, { size: 'sm', className: 'h-7 flex-1 text-xs', onClick: apply, children: "Aplicar" })] })] }));
318
+ }
319
+ return (_jsxs(Command, { shouldFilter: false, children: [_jsx(CommandInput, { placeholder: 'Buscar valores...', value: query, onValueChange: setQuery }), _jsxs(CommandList, { children: [_jsx(CommandEmpty, { children: loading ? 'Cargando…' : 'Sin resultados.' }), hasOptions && (_jsx(CommandGroup, { children: options.map((option) => {
320
+ const isSelected = localSelected.has(option.value);
321
+ return (_jsxs(CommandItem, { value: option.value, onSelect: () => toggle(option.value), onPointerDown: (e) => e.preventDefault(), children: [_jsx("div", { className: cn('mr-2 flex size-4 shrink-0 items-center justify-center rounded-sm border transition-colors', isSelected
322
+ ? 'border-foreground bg-foreground text-background'
323
+ : 'border-muted-foreground/50 opacity-70 [&_svg]:invisible'), children: _jsx(CheckIcon, { className: 'h-3.5 w-3.5' }) }), option.color && (_jsx("span", { className: 'mr-1 size-2.5 rounded-full shrink-0', style: { backgroundColor: resolveColorCss(option.color) } })), _jsx("span", { className: 'truncate', children: option.label }), typeof option.count === 'number' && (_jsx("span", { className: 'ml-auto pl-2 text-xs tabular-nums text-muted-foreground', children: option.count }))] }, option.value));
324
+ }) }))] }), _jsxs("div", { className: 'border-t p-2 space-y-2', children: [_jsx(Input, { placeholder: 'Contiene texto\u2026', value: freeText, onChange: (e) => setFreeText(e.target.value), onKeyDown: (e) => {
325
+ if (e.key === 'Enter')
326
+ apply();
327
+ }, className: 'h-7 text-xs' }), _jsxs("div", { className: 'flex gap-1.5', children: [_jsx(Button, { size: 'sm', variant: 'outline', className: 'h-7 flex-1 text-xs', onClick: clear, disabled: selectedValues.length === 0 && !canApply, children: "Limpiar" }), _jsxs(Button, { size: 'sm', className: 'h-7 flex-1 text-xs', onClick: apply, disabled: !canApply, children: ["Aplicar", localSelected.size > 0 ? ` (${localSelected.size})` : ''] })] })] })] }));
328
+ }
329
+ //# sourceMappingURL=column-filter-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-filter-control.js","sourceRoot":"","sources":["../../src/data-table/column-filter-control.tsx"],"names":[],"mappings":"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"}
@@ -1,41 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { type Column } from '@tanstack/react-table';
3
- export interface FilterOption {
4
- label: string;
5
- value: string;
6
- icon?: string;
7
- color?: string;
8
- }
9
- /**
10
- * Canonical filter-type union shared by every metacore app that renders a
11
- * DynamicTable. Kept open for extension — new niches (BI dashboards, CRM,
12
- * inventory, catalog) can add variants here instead of each forking the type.
13
- */
14
- export type ColumnFilterType = 'select' | 'boolean' | 'text' | 'number_range' | 'date_range'
15
- /**
16
- * Like `select` but the options are resolved server-side from a relation
17
- * (`filterSearchEndpoint = /options/<ref>`) rather than declared inline.
18
- * Renders the same multi-value checkbox combobox; the host loads + caches
19
- * the options into `filterOptions` before they arrive. See DynamicTable.
20
- */
21
- | 'dynamic_select';
22
- export interface ColumnFilterMeta {
23
- filterable?: boolean;
24
- filterType?: ColumnFilterType;
25
- filterKey?: string;
26
- filterOptions?: FilterOption[];
27
- filterLoading?: boolean;
28
- /**
29
- * Async search endpoint for server-driven option lookups. When set, the
30
- * filter renders a searchable combobox backed by the app's API instead of
31
- * iterating an in-memory filterOptions array. Apps wire this through the
32
- * standard `/api/options/:model?field=` shape produced by
33
- * kernel/dynamic.Service.Options.
34
- */
35
- filterSearchEndpoint?: string;
36
- selectedValues?: string[];
37
- onFilterChange?: (filterKey: string, values: string[]) => void;
38
- }
3
+ import { type FilterOption, type ColumnFilterType, type ColumnFilterMeta } from './column-filter-control';
4
+ export type { FilterOption, ColumnFilterType, ColumnFilterMeta };
39
5
  type FilterableColumnHeaderProps<TData, TValue> = React.HTMLAttributes<HTMLDivElement> & {
40
6
  column: Column<TData, TValue>;
41
7
  title: string;
@@ -43,12 +9,11 @@ type FilterableColumnHeaderProps<TData, TValue> = React.HTMLAttributes<HTMLDivEl
43
9
  /**
44
10
  * Pro column header combining sort + scoped per-column filter UI.
45
11
  *
46
- * Supports `select`, `boolean`, `text`, `number_range`, and `date_range`
47
- * filter types from `columnDef.meta`. The `date_range` variant renders a
48
- * compact range calendar (react-day-picker, already a dep of this package) and
49
- * emits a single `"YYYY-MM-DD_YYYY-MM-DD"` value. The remote
50
- * `filterSearchEndpoint` lookups are wired by the host (DynamicTable).
12
+ * The sort dropdown is owned here (it's TanStack-column specific); the filter
13
+ * popover is delegated to <ColumnFilterControl>, driven by `columnDef.meta`.
14
+ * Supports `select`, `boolean`, `text`, `number_range`, and `date_range` filter
15
+ * types. The remote `filterSearchEndpoint` lookups are wired by the host
16
+ * (DynamicTable).
51
17
  */
52
18
  export declare function FilterableColumnHeader<TData, TValue>({ column, title, className, }: FilterableColumnHeaderProps<TData, TValue>): React.JSX.Element;
53
- export {};
54
19
  //# sourceMappingURL=filterable-column-header.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filterable-column-header.d.ts","sourceRoot":"","sources":["../../src/data-table/filterable-column-header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAsCnD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GACxB,QAAQ,GACR,SAAS,GACT,MAAM,GACN,cAAc,GACd,YAAY;AACd;;;;;GAKG;GACD,gBAAgB,CAAA;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,UAAU,CAAC,EAAE,gBAAgB,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;CAC/D;AAED,KAAK,2BAA2B,CAAC,KAAK,EAAE,MAAM,IAC5C,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG;IACrC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC7B,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAEH;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,EACpD,MAAM,EACN,KAAK,EACL,SAAS,GACV,EAAE,2BAA2B,CAAC,KAAK,EAAE,MAAM,CAAC,qBAwc5C"}
1
+ {"version":3,"file":"filterable-column-header.d.ts","sourceRoot":"","sources":["../../src/data-table/filterable-column-header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAWnD,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAA;AAKhC,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA;AAEhE,KAAK,2BAA2B,CAAC,KAAK,EAAE,MAAM,IAC5C,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG;IACrC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC7B,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAEH;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,EACpD,MAAM,EACN,KAAK,EACL,SAAS,GACV,EAAE,2BAA2B,CAAC,KAAK,EAAE,MAAM,CAAC,qBAuE5C"}
@@ -1,208 +1,23 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import * as React from 'react';
3
- import { CheckIcon } from '@radix-ui/react-icons';
4
3
  import {} from '@tanstack/react-table';
5
- import { format } from 'date-fns';
6
- import { es } from 'date-fns/locale';
7
- import {} from 'react-day-picker';
8
- import { ListFilter, ArrowUpDown, ArrowUp, ArrowDown, EyeOff, } from 'lucide-react';
4
+ import { ArrowUpDown, ArrowUp, ArrowDown, EyeOff } from 'lucide-react';
9
5
  import { cn } from '../lib/utils';
10
- import { resolveColorCss } from '../lib/option-colors';
11
6
  import { Button } from '../primitives/button';
12
- import { Label } from '../primitives/label';
13
7
  import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '../primitives/dropdown-menu';
14
- import { Popover, PopoverContent, PopoverTrigger, } from '../primitives/popover';
15
- import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from '../primitives/command';
16
- import { Input } from '../primitives/input';
17
- import { Calendar } from '../primitives/calendar';
8
+ import { ColumnFilterControl, } from './column-filter-control';
18
9
  /**
19
10
  * Pro column header combining sort + scoped per-column filter UI.
20
11
  *
21
- * Supports `select`, `boolean`, `text`, `number_range`, and `date_range`
22
- * filter types from `columnDef.meta`. The `date_range` variant renders a
23
- * compact range calendar (react-day-picker, already a dep of this package) and
24
- * emits a single `"YYYY-MM-DD_YYYY-MM-DD"` value. The remote
25
- * `filterSearchEndpoint` lookups are wired by the host (DynamicTable).
12
+ * The sort dropdown is owned here (it's TanStack-column specific); the filter
13
+ * popover is delegated to <ColumnFilterControl>, driven by `columnDef.meta`.
14
+ * Supports `select`, `boolean`, `text`, `number_range`, and `date_range` filter
15
+ * types. The remote `filterSearchEndpoint` lookups are wired by the host
16
+ * (DynamicTable).
26
17
  */
27
18
  export function FilterableColumnHeader({ column, title, className, }) {
28
19
  const meta = (column.columnDef.meta || {});
29
20
  const canSort = column.getCanSort();
30
- const filterType = meta.filterType || 'select';
31
- // `select`, `boolean` and `dynamic_select` all render the same multi-value
32
- // checkbox combobox; only the option source differs (inline vs relation
33
- // endpoint). Treat them uniformly so a relation filter behaves like a static
34
- // one once its options have loaded.
35
- const isMultiSelect = filterType === 'select' ||
36
- filterType === 'boolean' ||
37
- filterType === 'dynamic_select';
38
- const hasOptions = meta.filterOptions && meta.filterOptions.length > 0;
39
- const canFilter = meta.filterable &&
40
- (hasOptions ||
41
- filterType === 'text' ||
42
- filterType === 'number_range' ||
43
- filterType === 'date_range' ||
44
- // A relation filter is still actionable while its options stream in —
45
- // surface the trigger (the combobox shows a loading/empty state).
46
- (filterType === 'dynamic_select' && !!meta.filterSearchEndpoint));
47
- const filterKey = meta.filterKey || column.id;
48
- const selectedValues = new Set(meta.selectedValues || []);
49
- const activeCount = selectedValues.size;
50
- const rawTextValue = meta.selectedValues && meta.selectedValues.length > 0
51
- ? meta.selectedValues[0]
52
- : '';
53
- const displayTextValue = rawTextValue.replace(/^(ILIKE|LIKE|GT|LT|GTE|LTE):/, '');
54
- const parseRangeValues = () => {
55
- let min = '';
56
- let max = '';
57
- for (const v of meta.selectedValues || []) {
58
- if (v.startsWith('GTE:'))
59
- min = v.replace('GTE:', '');
60
- if (v.startsWith('LTE:'))
61
- max = v.replace('LTE:', '');
62
- }
63
- return { min, max };
64
- };
65
- const rangeValues = parseRangeValues();
66
- // Date range is serialized as a single "YYYY-MM-DD_YYYY-MM-DD" value (same
67
- // wire shape the backend expects from the legacy starter-core picker).
68
- const parseDateRange = () => {
69
- const val = meta.selectedValues && meta.selectedValues.length > 0
70
- ? meta.selectedValues[0]
71
- : '';
72
- if (!val || !val.includes('_'))
73
- return undefined;
74
- const [from, to] = val.split('_');
75
- const fromDate = new Date(`${from}T00:00:00`);
76
- const toDate = new Date(`${to}T00:00:00`);
77
- if (isNaN(fromDate.getTime()) || isNaN(toDate.getTime()))
78
- return undefined;
79
- return { from: fromDate, to: toDate };
80
- };
81
- const isActive = (() => {
82
- if (filterType === 'text')
83
- return rawTextValue !== '';
84
- if (filterType === 'number_range')
85
- return rangeValues.min !== '' || rangeValues.max !== '';
86
- if (filterType === 'date_range')
87
- return (meta.selectedValues || []).length > 0 && meta.selectedValues[0] !== '';
88
- return activeCount > 0;
89
- })();
90
- const [localTextValue, setLocalTextValue] = React.useState(displayTextValue);
91
- const [localMin, setLocalMin] = React.useState(rangeValues.min);
92
- const [localMax, setLocalMax] = React.useState(rangeValues.max);
93
- const [localSelected, setLocalSelected] = React.useState(new Set(selectedValues));
94
- const [localDateRange, setLocalDateRange] = React.useState(parseDateRange());
95
- const [filterOpen, setFilterOpen] = React.useState(false);
96
- const displayOptions = meta.filterOptions || [];
97
- React.useEffect(() => {
98
- setLocalTextValue(displayTextValue);
99
- }, [displayTextValue]);
100
- React.useEffect(() => {
101
- setLocalMin(rangeValues.min);
102
- setLocalMax(rangeValues.max);
103
- }, [rangeValues.min, rangeValues.max]);
104
- React.useEffect(() => {
105
- setLocalDateRange(parseDateRange());
106
- // eslint-disable-next-line react-hooks/exhaustive-deps
107
- }, [meta.selectedValues?.join(',')]);
108
- React.useEffect(() => {
109
- if (filterOpen) {
110
- setLocalSelected(new Set(meta.selectedValues || []));
111
- }
112
- }, [filterOpen, meta.selectedValues?.join(',')]);
113
- const handleLocalToggle = (value) => {
114
- setLocalSelected((prev) => {
115
- const next = new Set(prev);
116
- if (next.has(value))
117
- next.delete(value);
118
- else
119
- next.add(value);
120
- return next;
121
- });
122
- };
123
- const handleApplySelect = () => {
124
- meta.onFilterChange?.(filterKey, Array.from(localSelected));
125
- setFilterOpen(false);
126
- };
127
- const handleClearFilter = () => {
128
- meta.onFilterChange?.(filterKey, []);
129
- setLocalTextValue('');
130
- setLocalMin('');
131
- setLocalMax('');
132
- setLocalSelected(new Set());
133
- setLocalDateRange(undefined);
134
- };
135
- const handleDateRangeApply = () => {
136
- if (localDateRange?.from) {
137
- const from = format(localDateRange.from, 'yyyy-MM-dd');
138
- const to = localDateRange.to
139
- ? format(localDateRange.to, 'yyyy-MM-dd')
140
- : from;
141
- meta.onFilterChange?.(filterKey, [`${from}_${to}`]);
142
- }
143
- setFilterOpen(false);
144
- };
145
- const handleTextSubmit = () => {
146
- const trimmed = localTextValue.trim();
147
- if (trimmed) {
148
- meta.onFilterChange?.(filterKey, [`ILIKE:${trimmed}`]);
149
- }
150
- else {
151
- meta.onFilterChange?.(filterKey, []);
152
- }
153
- };
154
- const handleNumberRangeSubmit = () => {
155
- const values = [];
156
- if (localMin.trim())
157
- values.push(`GTE:${localMin.trim()}`);
158
- if (localMax.trim())
159
- values.push(`LTE:${localMax.trim()}`);
160
- meta.onFilterChange?.(filterKey, values);
161
- };
162
- const localHasChanges = (() => {
163
- if (isMultiSelect) {
164
- const current = new Set(meta.selectedValues || []);
165
- if (localSelected.size !== current.size)
166
- return true;
167
- for (const v of localSelected) {
168
- if (!current.has(v))
169
- return true;
170
- }
171
- return false;
172
- }
173
- return false;
174
- })();
175
- return (_jsxs("div", { className: cn('flex items-center gap-0.5', className), children: [_jsx("span", { className: 'text-sm font-medium', children: title }), canSort && (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: 'ghost', size: 'icon', className: cn('h-7 w-7 shrink-0 opacity-70 hover:opacity-100', column.getIsSorted() && 'opacity-100'), children: column.getIsSorted() === 'desc' ? (_jsx(ArrowDown, { className: 'h-3.5 w-3.5' })) : column.getIsSorted() === 'asc' ? (_jsx(ArrowUp, { className: 'h-3.5 w-3.5' })) : (_jsx(ArrowUpDown, { className: 'h-3.5 w-3.5' })) }) }), _jsxs(DropdownMenuContent, { align: 'start', children: [_jsxs(DropdownMenuItem, { onClick: () => column.toggleSorting(false), children: [_jsx(ArrowUp, { className: 'text-muted-foreground/70 size-3.5' }), "Ascendente"] }), _jsxs(DropdownMenuItem, { onClick: () => column.toggleSorting(true), children: [_jsx(ArrowDown, { className: 'text-muted-foreground/70 size-3.5' }), "Descendente"] }), column.getIsSorted() && (_jsxs(DropdownMenuItem, { onClick: () => column.clearSorting(), children: [_jsx(ArrowUpDown, { className: 'text-muted-foreground/70 size-3.5' }), "Quitar orden"] })), column.getCanHide() && (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { onClick: () => column.toggleVisibility(false), children: [_jsx(EyeOff, { className: 'text-muted-foreground/70 size-3.5' }), "Ocultar"] })] }))] })] })), canFilter && (_jsxs(Popover, { modal: false, open: filterOpen, onOpenChange: setFilterOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: 'ghost', size: 'icon', className: cn('h-7 w-7 shrink-0', isActive
176
- ? 'text-primary hover:text-primary'
177
- : 'opacity-70 hover:opacity-100'), children: _jsxs("div", { className: 'relative', children: [_jsx(ListFilter, { className: 'h-3.5 w-3.5' }), isActive && isMultiSelect && activeCount > 0 && (_jsx("span", { className: 'absolute -top-1.5 -right-1.5 flex h-3.5 min-w-3.5 items-center justify-center rounded-full bg-primary text-[9px] font-bold text-primary-foreground px-0.5', children: activeCount })), isActive && !isMultiSelect && (_jsx("span", { className: 'absolute -top-1 -right-1 flex h-2 w-2 rounded-full bg-primary' }))] }) }) }), _jsxs(PopoverContent, { className: cn('p-0', filterType === 'date_range' ? 'w-auto' : 'w-[220px]'), align: 'start', onCloseAutoFocus: (e) => e.preventDefault(), children: [isMultiSelect && (hasOptions || filterType === 'dynamic_select') && (_jsxs(Command, { children: [_jsx(CommandInput, { placeholder: 'Buscar...' }), _jsxs(CommandList, { children: [_jsx(CommandEmpty, { children: meta.filterLoading ? 'Cargando…' : 'Sin resultados.' }), _jsx(CommandGroup, { children: displayOptions.map((option) => {
178
- const isSelected = localSelected.has(option.value);
179
- return (_jsxs(CommandItem, { onSelect: () => handleLocalToggle(option.value), onPointerDown: (e) => e.preventDefault(), children: [_jsx("div", { className: cn('mr-2 flex size-4 shrink-0 items-center justify-center rounded-sm border transition-colors', isSelected
180
- ? // Foreground/background is contrast-guaranteed
181
- // in both themes, so the checkmark stays legible
182
- // even when a brand's primary/primary-foreground
183
- // pair collapses to dark-on-dark in dark mode.
184
- 'border-foreground bg-foreground text-background'
185
- : 'border-muted-foreground/50 opacity-70 [&_svg]:invisible'), children: _jsx(CheckIcon, { className: 'h-3.5 w-3.5' }) }), option.color && (_jsx("span", { className: 'mr-1 size-2.5 rounded-full shrink-0', style: {
186
- backgroundColor: resolveColorCss(option.color),
187
- } })), _jsx("span", { className: 'truncate', children: option.label })] }, option.value));
188
- }) })] }), _jsxs("div", { className: 'border-t p-2 flex gap-1.5', children: [_jsx(Button, { size: 'sm', variant: 'outline', className: 'h-7 flex-1 text-xs', onClick: () => {
189
- handleClearFilter();
190
- setFilterOpen(false);
191
- }, disabled: !isActive && localSelected.size === 0, children: "Limpiar" }), _jsxs(Button, { size: 'sm', className: 'h-7 flex-1 text-xs', onClick: handleApplySelect, disabled: !localHasChanges && localSelected.size === 0, children: ["Aplicar", localSelected.size > 0 ? ` (${localSelected.size})` : ''] })] })] })), filterType === 'text' && (_jsxs("div", { className: 'p-2.5 space-y-2', children: [_jsx(Input, { placeholder: 'Contiene...', value: localTextValue, onChange: (e) => setLocalTextValue(e.target.value), onKeyDown: (e) => {
192
- if (e.key === 'Enter')
193
- handleTextSubmit();
194
- }, className: 'h-8 text-sm', autoFocus: true }), _jsxs("div", { className: 'flex gap-1.5', children: [_jsx(Button, { size: 'sm', variant: 'outline', className: 'h-7 flex-1 text-xs', onClick: handleClearFilter, disabled: !isActive, children: "Limpiar" }), _jsx(Button, { size: 'sm', className: 'h-7 flex-1 text-xs', onClick: handleTextSubmit, children: "Aplicar" })] })] })), filterType === 'number_range' && (_jsxs("div", { className: 'p-2.5 space-y-2.5', children: [_jsxs("div", { className: 'grid grid-cols-2 gap-2', children: [_jsxs("div", { className: 'space-y-1', children: [_jsx(Label, { className: 'text-xs text-muted-foreground', children: "Min" }), _jsx(Input, { type: 'number', placeholder: '0', value: localMin, onChange: (e) => setLocalMin(e.target.value), onKeyDown: (e) => {
195
- if (e.key === 'Enter')
196
- handleNumberRangeSubmit();
197
- }, className: 'h-8 text-sm', autoFocus: true })] }), _jsxs("div", { className: 'space-y-1', children: [_jsx(Label, { className: 'text-xs text-muted-foreground', children: "Max" }), _jsx(Input, { type: 'number', placeholder: '999999', value: localMax, onChange: (e) => setLocalMax(e.target.value), onKeyDown: (e) => {
198
- if (e.key === 'Enter')
199
- handleNumberRangeSubmit();
200
- }, className: 'h-8 text-sm' })] })] }), _jsxs("div", { className: 'flex gap-1.5', children: [_jsx(Button, { size: 'sm', variant: 'outline', className: 'h-7 flex-1 text-xs', onClick: handleClearFilter, disabled: !isActive, children: "Limpiar" }), _jsx(Button, { size: 'sm', className: 'h-7 flex-1 text-xs', onClick: handleNumberRangeSubmit, children: "Aplicar" })] })] })), filterType === 'date_range' && (_jsxs("div", { children: [_jsx(Calendar, { mode: 'range', selected: localDateRange, onSelect: setLocalDateRange, locale: es, numberOfMonths: 1, className: 'p-2' }), localDateRange?.from && (_jsxs("div", { className: 'px-2 pb-1 text-center text-[11px] text-muted-foreground', children: [format(localDateRange.from, 'dd MMM yyyy', { locale: es }), localDateRange.to &&
201
- localDateRange.to.getTime() !== localDateRange.from.getTime()
202
- ? ` — ${format(localDateRange.to, 'dd MMM yyyy', { locale: es })}`
203
- : ' (un día)'] })), _jsxs("div", { className: 'border-t p-1.5 flex gap-1.5', children: [_jsx(Button, { size: 'sm', variant: 'outline', className: 'h-7 flex-1 text-xs', onClick: () => {
204
- handleClearFilter();
205
- setFilterOpen(false);
206
- }, disabled: !isActive && !localDateRange, children: "Limpiar" }), _jsx(Button, { size: 'sm', className: 'h-7 flex-1 text-xs', onClick: handleDateRangeApply, disabled: !localDateRange?.from, children: "Aplicar" })] })] }))] })] }))] }));
21
+ return (_jsxs("div", { className: cn('flex items-center gap-0.5', className), children: [_jsx("span", { className: 'text-sm font-medium', children: title }), canSort && (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: 'ghost', size: 'icon', className: cn('h-7 w-7 shrink-0 opacity-70 hover:opacity-100', column.getIsSorted() && 'opacity-100'), children: column.getIsSorted() === 'desc' ? (_jsx(ArrowDown, { className: 'h-3.5 w-3.5' })) : column.getIsSorted() === 'asc' ? (_jsx(ArrowUp, { className: 'h-3.5 w-3.5' })) : (_jsx(ArrowUpDown, { className: 'h-3.5 w-3.5' })) }) }), _jsxs(DropdownMenuContent, { align: 'start', children: [_jsxs(DropdownMenuItem, { onClick: () => column.toggleSorting(false), children: [_jsx(ArrowUp, { className: 'text-muted-foreground/70 size-3.5' }), "Ascendente"] }), _jsxs(DropdownMenuItem, { onClick: () => column.toggleSorting(true), children: [_jsx(ArrowDown, { className: 'text-muted-foreground/70 size-3.5' }), "Descendente"] }), column.getIsSorted() && (_jsxs(DropdownMenuItem, { onClick: () => column.clearSorting(), children: [_jsx(ArrowUpDown, { className: 'text-muted-foreground/70 size-3.5' }), "Quitar orden"] })), column.getCanHide() && (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { onClick: () => column.toggleVisibility(false), children: [_jsx(EyeOff, { className: 'text-muted-foreground/70 size-3.5' }), "Ocultar"] })] }))] })] })), meta.filterable && (_jsx(ColumnFilterControl, { filterKey: meta.filterKey || column.id, filterType: meta.filterType, filterOptions: meta.filterOptions, filterLoading: meta.filterLoading, filterSearchEndpoint: meta.filterSearchEndpoint, selectedValues: meta.selectedValues, onFilterChange: meta.onFilterChange, loadOptions: meta.loadOptions }))] }));
207
22
  }
208
23
  //# sourceMappingURL=filterable-column-header.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filterable-column-header.js","sourceRoot":"","sources":["../../src/data-table/filterable-column-header.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filterable-column-header.js","sourceRoot":"","sources":["../../src/data-table/filterable-column-header.tsx"],"names":[],"mappings":"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"}
@@ -5,4 +5,5 @@ export { DataTableViewOptions } from './view-options';
5
5
  export { DataTableToolbar } from './toolbar';
6
6
  export { DataTableBulkActions } from './bulk-actions';
7
7
  export { FilterableColumnHeader, type FilterOption, type ColumnFilterMeta, type ColumnFilterType, } from './filterable-column-header';
8
+ export { ColumnFilterControl, type ColumnFilterControlProps, } from './column-filter-control';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data-table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EACL,sBAAsB,EACtB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,4BAA4B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data-table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EACL,sBAAsB,EACtB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,GAC9B,MAAM,yBAAyB,CAAA"}
@@ -5,4 +5,5 @@ export { DataTableViewOptions } from './view-options';
5
5
  export { DataTableToolbar } from './toolbar';
6
6
  export { DataTableBulkActions } from './bulk-actions';
7
7
  export { FilterableColumnHeader, } from './filterable-column-header';
8
+ export { ColumnFilterControl, } from './column-filter-control';
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data-table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EACL,sBAAsB,GAIvB,MAAM,4BAA4B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data-table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EACL,sBAAsB,GAIvB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,mBAAmB,GAEpB,MAAM,yBAAyB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asteby/metacore-ui",
3
- "version": "2.6.2",
3
+ "version": "2.8.0",
4
4
  "description": "Metacore UI kit — data-table, layout shell, command-menu, hooks y primitives shadcn reutilizables",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {