nest-filter 1.0.15 → 1.0.16
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/AdvancedFilter.js +4 -4
- package/dist/components/AdvancedFilter.js.map +1 -1
- package/dist/components/ui/dialog.js +1 -1
- package/dist/components/ui/dialog.js.map +1 -1
- package/package.json +2 -7
- package/src/components/AdvancedFilter.tsx +4 -9
- package/src/components/ui/Dialog.tsx +1 -1
|
@@ -51,7 +51,7 @@ const FilterGroupUI = ({ group, depth, columns, onAddRule, onAddGroup, onUpdateR
|
|
|
51
51
|
? "bg-slate-900 text-slate-50"
|
|
52
52
|
: "text-slate-500 hover:text-slate-900"}`, children: "OR" })] })] }), jsxs("div", { className: "flex items-center gap-2", children: [jsxs(Button, { variant: "outline", size: "sm", onClick: () => onAddRule(group.id), className: "h-7 text-[10px] font-bold uppercase", children: [jsx(Plus, { className: "mr-1 h-3 w-3" }), " Rule"] }), jsxs(Button, { variant: "outline", size: "sm", onClick: () => onAddGroup(group.id), className: "h-7 text-[10px] font-bold uppercase", children: [jsx(Layers, { className: "mr-1 h-3 w-3" }), " Group"] }), depth > 0 && (jsx(Button, { variant: "ghost", size: "sm", onClick: () => onRemoveItem(group.id), className: "text-slate-400", children: jsx(Trash2, { className: "h-5 w-5 text-red-500" }) }))] })] }), jsxs("div", { className: "space-y-3", children: [group.items.map((item) => {
|
|
53
53
|
const column = columns.find((c) => c.id === (item.type === "rule" ? item.columnId : null));
|
|
54
|
-
return item.type === "rule" ? (jsxs("div", { className: "flex flex-col md:flex-row md:items-center gap-3 p-3 bg-white border border-slate-200 rounded-md shadow-sm", children: [jsx("div", { className: "w-
|
|
54
|
+
return item.type === "rule" ? (jsxs("div", { className: "flex flex-col md:flex-row md:items-center gap-3 p-3 bg-white border border-slate-200 rounded-md shadow-sm", children: [jsx("div", { className: "flex-1 min-w-[140px]", children: jsx(Select, { value: item.columnId, options: columns.map((c) => ({
|
|
55
55
|
value: c.id,
|
|
56
56
|
label: c.label,
|
|
57
57
|
})), onValueChange: (val) => {
|
|
@@ -68,10 +68,10 @@ const FilterGroupUI = ({ group, depth, columns, onAddRule, onAddGroup, onUpdateR
|
|
|
68
68
|
: "contains",
|
|
69
69
|
value: "",
|
|
70
70
|
});
|
|
71
|
-
}
|
|
71
|
+
} }) }), jsx("div", { className: "w-full md:w-44", children: jsx(Select, { value: item.operator, options: getOperatorsForType(column?.type || "string"), onValueChange: (val) => onUpdateRule(item.id, { operator: val }) }) }), jsx("div", { className: "flex-[1.5] min-w-[180px]", children: column?.type === "date" ? (jsx(Input, { type: "date", value: item.value || "", onChange: (e) => onUpdateRule(item.id, { value: e.target.value }) })) : column?.type === "boolean" ? (jsxs("div", { className: "h-10 flex items-center px-3 border border-slate-200 rounded-md bg-slate-50 text-[10px] font-black uppercase tracking-tighter text-slate-400 italic", children: [jsx(Binary, { className: "h-3 w-3 mr-2" }), "Binary state"] })) : column?.type === "select" ? (jsx(Select, { value: item.value || "", placeholder: "Choose option...", options: (column.options || []).map((opt) => ({
|
|
72
72
|
value: opt,
|
|
73
73
|
label: opt,
|
|
74
|
-
})), onValueChange: (val) => onUpdateRule(item.id, { value: val })
|
|
74
|
+
})), onValueChange: (val) => onUpdateRule(item.id, { value: val }) })) : (jsx(Input, { placeholder: "Search query...", value: item.value || "", onChange: (e) => onUpdateRule(item.id, { value: e.target.value }) })) }), jsx(Button, { variant: "ghost", size: "icon", onClick: () => onRemoveItem(item.id), className: "h-9 w-9 text-slate-300 hover:text-red-500 hover:bg-red-50", children: jsx(Trash2, { className: "h-5 w-5 text-red-500" }) })] }, item.id)) : (jsx(FilterGroupUI, { group: item, depth: depth + 1, columns: columns, onAddRule: onAddRule, onAddGroup: onAddGroup, onUpdateRule: onUpdateRule, onUpdateGroupLogic: onUpdateGroupLogic, onRemoveItem: onRemoveItem }));
|
|
75
75
|
}), group.items.length === 0 && (jsxs("div", { className: "flex flex-col items-center justify-center py-6 rounded-md border border-dashed border-slate-200 bg-white/50", children: [jsx(ListFilter, { className: "h-5 w-5 text-slate-300 mb-1" }), jsx("p", { className: "text-[10px] text-slate-400 font-bold uppercase tracking-widest", children: "Add a rule to filter" })] }))] })] }));
|
|
76
76
|
};
|
|
77
77
|
const AdvancedFilter = ({ isOpen, onClose, data, columns, setFilteredData, initialFilters, }) => {
|
|
@@ -156,7 +156,7 @@ const AdvancedFilter = ({ isOpen, onClose, data, columns, setFilteredData, initi
|
|
|
156
156
|
setFilteredData(data);
|
|
157
157
|
onClose();
|
|
158
158
|
};
|
|
159
|
-
return (jsxs(Dialog, { open: isOpen, onOpenChange: onClose, title: "Advanced Filters", description: "Refine your dataset using structured logic and multi-type comparisons.", children: [jsx("div", { className: "max-h-[60vh]
|
|
159
|
+
return (jsxs(Dialog, { open: isOpen, onOpenChange: onClose, title: "Advanced Filters", description: "Refine your dataset using structured logic and multi-type comparisons.", children: [jsx("div", { className: "max-h-[60vh] overflow-y-auto px-1 custom-scrollbar pr-3 pb-32", children: jsx(FilterGroupUI, { group: rootGroup, depth: 0, columns: columns, onAddRule: handleAddRule, onAddGroup: handleAddGroup, onUpdateRule: handleUpdateRule, onUpdateGroupLogic: handleUpdateGroupLogic, onRemoveItem: handleRemoveItem }) }), jsxs("div", { className: "flex w-full justify-between items-center gap-4", children: [jsxs(Button, { variant: "ghost", onClick: handleClear, className: "text-slate-400 hover:text-red-500 font-black text-[10px] uppercase tracking-widest gap-2", children: [jsx(FilterX, { className: "h-4 w-4" }), " Reset Filters"] }), jsxs("div", { className: "flex gap-2", children: [jsx(Button, { variant: "outline", onClick: onClose, className: "font-bold h-11 px-6", children: "Cancel" }), jsx(Button, { onClick: handleApply, className: "bg-slate-900 font-bold h-11 px-10 rounded-lg shadow-lg hover:shadow-xl transition-shadow", children: "Apply View" })] })] })] }));
|
|
160
160
|
};
|
|
161
161
|
|
|
162
162
|
export { AdvancedFilter };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdvancedFilter.js","sources":["../../src/components/AdvancedFilter.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { useState, useEffect, useCallback } from \"react\";\r\nimport {\r\n FilterRule,\r\n FilterGroup,\r\n ColumnDefinition,\r\n LogicalOperator,\r\n FilterOperator,\r\n FilterItem,\r\n} from \"../types\";\r\nimport { Button } from \"./ui/Button\";\r\nimport { Input } from \"./ui/Input\";\r\nimport { Select } from \"./ui/Select\";\r\nimport { Dialog } from \"./ui/Dialog\";\r\nimport {\r\n Plus,\r\n Trash2,\r\n Layers,\r\n Binary,\r\n FilterX,\r\n ListFilter,\r\n} from \"lucide-react\";\r\nimport { applyFilters } from \"../utils/filterLogic\";\r\n\r\ninterface AdvancedFilterProps<T> {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n data: T[];\r\n columns: ColumnDefinition<T>[];\r\n setFilteredData: (data: T[]) => void;\r\n initialFilters?: FilterGroup<T>;\r\n}\r\n\r\nconst getOperatorsForType = (\r\n type: string\r\n): { value: FilterOperator; label: string }[] => {\r\n switch (type) {\r\n case \"string\":\r\n return [\r\n { value: \"contains\", label: \"Contains\" },\r\n { value: \"not_contains\", label: \"Does not contain\" },\r\n { value: \"equals\", label: \"Exact match\" },\r\n ];\r\n case \"select\":\r\n return [\r\n { value: \"equals\", label: \"Is\" },\r\n { value: \"not_equals\", label: \"Is not\" },\r\n ];\r\n case \"number\":\r\n return [\r\n { value: \"equals\", label: \"=\" },\r\n { value: \"not_equals\", label: \"!=\" },\r\n { value: \"gt\", label: \">\" },\r\n { value: \"lt\", label: \"<\" },\r\n { value: \"gte\", label: \">=\" },\r\n { value: \"lte\", label: \"<=\" },\r\n ];\r\n case \"date\":\r\n return [\r\n { value: \"is\", label: \"On date\" },\r\n { value: \"before\", label: \"Before\" },\r\n { value: \"after\", label: \"After\" },\r\n ];\r\n case \"boolean\":\r\n return [\r\n { value: \"true\", label: \"True\" },\r\n { value: \"false\", label: \"False\" },\r\n ];\r\n default:\r\n return [];\r\n }\r\n};\r\n\r\nconst FilterGroupUI = <T,>({\r\n group,\r\n depth,\r\n columns,\r\n onAddRule,\r\n onAddGroup,\r\n onUpdateRule,\r\n onUpdateGroupLogic,\r\n onRemoveItem,\r\n}: {\r\n group: FilterGroup<T>;\r\n depth: number;\r\n columns: ColumnDefinition<T>[];\r\n onAddRule: (parentId: string) => void;\r\n onAddGroup: (parentId: string) => void;\r\n onUpdateRule: (ruleId: string, updates: Partial<FilterRule<T>>) => void;\r\n onUpdateGroupLogic: (groupId: string, logic: LogicalOperator) => void;\r\n onRemoveItem: (itemId: string) => void;\r\n}) => {\r\n return (\r\n <div\r\n className={`rounded-lg border border-slate-200 bg-slate-50/50 p-4 mb-4 ${\r\n depth > 0 ? \"ml-6 md:ml-10 relative border-l-2 border-l-slate-300\" : \"\"\r\n }`}\r\n >\r\n <div className=\"flex flex-wrap items-center justify-between gap-4 mb-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-[10px] font-bold uppercase tracking-widest text-slate-500\">\r\n Group Logic\r\n </span>\r\n <div className=\"flex rounded-md border border-slate-200 bg-white p-1 shadow-sm\">\r\n <button\r\n onClick={() => onUpdateGroupLogic(group.id, \"AND\")}\r\n className={`px-3 py-1 text-[10px] font-black rounded-sm transition-all ${\r\n group.logic === \"AND\"\r\n ? \"bg-slate-900 text-slate-50\"\r\n : \"text-slate-500 hover:text-slate-900\"\r\n }`}\r\n >\r\n AND\r\n </button>\r\n <button\r\n onClick={() => onUpdateGroupLogic(group.id, \"OR\")}\r\n className={`px-3 py-1 text-[10px] font-black rounded-sm transition-all ${\r\n group.logic === \"OR\"\r\n ? \"bg-slate-900 text-slate-50\"\r\n : \"text-slate-500 hover:text-slate-900\"\r\n }`}\r\n >\r\n OR\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => onAddRule(group.id)}\r\n className=\"h-7 text-[10px] font-bold uppercase\"\r\n >\r\n <Plus className=\"mr-1 h-3 w-3\" /> Rule\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => onAddGroup(group.id)}\r\n className=\"h-7 text-[10px] font-bold uppercase\"\r\n >\r\n <Layers className=\"mr-1 h-3 w-3\" /> Group\r\n </Button>\r\n {depth > 0 && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => onRemoveItem(group.id)}\r\n className=\"text-slate-400\"\r\n >\r\n <Trash2 className=\"h-5 w-5 text-red-500\" />\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-3\">\r\n {group.items.map((item) => {\r\n const column = columns.find(\r\n (c) => c.id === (item.type === \"rule\" ? item.columnId : null)\r\n );\r\n return item.type === \"rule\" ? (\r\n <div\r\n key={item.id}\r\n className=\"flex flex-col md:flex-row md:items-center gap-3 p-3 bg-white border border-slate-200 rounded-md shadow-sm\"\r\n >\r\n <div className=\"w-1/5\">\r\n <Select\r\n value={item.columnId as string}\r\n options={columns.map((c) => ({\r\n value: c.id as string,\r\n label: c.label,\r\n }))}\r\n onValueChange={(val) => {\r\n const colId = val as keyof T;\r\n const col = columns.find((c) => c.id === colId);\r\n onUpdateRule(item.id, {\r\n columnId: colId,\r\n operator:\r\n col?.type === \"date\"\r\n ? \"is\"\r\n : col?.type === \"number\"\r\n ? \"equals\"\r\n : col?.type === \"select\"\r\n ? \"equals\"\r\n : \"contains\",\r\n value: \"\",\r\n });\r\n }}\r\n className=\"w-full\"\r\n />\r\n </div>\r\n <div className=\"w-1/5\">\r\n <Select\r\n value={item.operator}\r\n options={getOperatorsForType(column?.type || \"string\")}\r\n onValueChange={(val) =>\r\n onUpdateRule(item.id, { operator: val as FilterOperator })\r\n }\r\n className=\"w-full\"\r\n />\r\n </div>\r\n <div className=\"w-2/5\">\r\n {column?.type === \"date\" ? (\r\n <Input\r\n type=\"date\"\r\n value={item.value || \"\"}\r\n onChange={(e) =>\r\n onUpdateRule(item.id, { value: e.target.value })\r\n }\r\n className=\"w-full\"\r\n />\r\n ) : column?.type === \"boolean\" ? (\r\n <div className=\"h-10 flex items-center px-3 border border-slate-200 rounded-md bg-slate-50 text-[10px] font-black uppercase tracking-tighter text-slate-400 italic\">\r\n <Binary className=\"h-3 w-3 mr-2\" />\r\n Binary state\r\n </div>\r\n ) : column?.type === \"select\" ? (\r\n <Select\r\n value={item.value || \"\"}\r\n placeholder=\"Choose option...\"\r\n options={(column.options || []).map((opt) => ({\r\n value: opt,\r\n label: opt,\r\n }))}\r\n onValueChange={(val) =>\r\n onUpdateRule(item.id, { value: val })\r\n }\r\n className=\"w-full\"\r\n />\r\n ) : (\r\n <Input\r\n placeholder=\"Search query...\"\r\n value={item.value || \"\"}\r\n onChange={(e) =>\r\n onUpdateRule(item.id, { value: e.target.value })\r\n }\r\n className=\"w-full\"\r\n />\r\n )}\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={() => onRemoveItem(item.id)}\r\n className=\"h-9 w-9 text-slate-300 hover:text-red-500 hover:bg-red-50\"\r\n >\r\n <Trash2 className=\"h-5 w-5 text-red-500\" />\r\n </Button>\r\n </div>\r\n ) : (\r\n <FilterGroupUI\r\n group={item}\r\n depth={depth + 1}\r\n columns={columns}\r\n onAddRule={onAddRule}\r\n onAddGroup={onAddGroup}\r\n onUpdateRule={onUpdateRule}\r\n onUpdateGroupLogic={onUpdateGroupLogic}\r\n onRemoveItem={onRemoveItem}\r\n />\r\n );\r\n })}\r\n {group.items.length === 0 && (\r\n <div className=\"flex flex-col items-center justify-center py-6 rounded-md border border-dashed border-slate-200 bg-white/50\">\r\n <ListFilter className=\"h-5 w-5 text-slate-300 mb-1\" />\r\n <p className=\"text-[10px] text-slate-400 font-bold uppercase tracking-widest\">\r\n Add a rule to filter\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport const AdvancedFilter = <T,>({\r\n isOpen,\r\n onClose,\r\n data,\r\n columns,\r\n setFilteredData,\r\n initialFilters,\r\n}: AdvancedFilterProps<T>) => {\r\n const [rootGroup, setRootGroup] = useState<FilterGroup<T>>({\r\n type: \"group\",\r\n id: \"root\",\r\n logic: \"AND\",\r\n items: [],\r\n });\r\n\r\n useEffect(() => {\r\n if (initialFilters) setRootGroup(initialFilters);\r\n }, [initialFilters, isOpen]);\r\n\r\n const updateItemRecursively = useCallback(\r\n (\r\n group: FilterGroup<T>,\r\n targetId: string,\r\n updater: (item: FilterItem<T>) => FilterItem<T> | null\r\n ): FilterGroup<T> => {\r\n if (group.id === targetId) return updater(group) as FilterGroup<T>;\r\n return {\r\n ...group,\r\n items: group.items\r\n .map((item) => {\r\n if (item.id === targetId) return updater(item);\r\n if (item.type === \"group\")\r\n return updateItemRecursively(item, targetId, updater);\r\n return item;\r\n })\r\n .filter(Boolean) as FilterItem<T>[],\r\n };\r\n },\r\n []\r\n );\r\n\r\n const handleAddRule = useCallback(\r\n (parentId: string) => {\r\n const firstCol = columns[0];\r\n const newRule: FilterRule<T> = {\r\n type: \"rule\",\r\n id: Math.random().toString(36).substr(2, 9),\r\n columnId: firstCol.id,\r\n operator:\r\n firstCol.type === \"string\"\r\n ? \"contains\"\r\n : firstCol.type === \"select\"\r\n ? \"equals\"\r\n : \"equals\",\r\n value: \"\",\r\n };\r\n setRootGroup((prev) =>\r\n updateItemRecursively(prev, parentId, (group) => ({\r\n ...(group as FilterGroup<T>),\r\n items: [...(group as FilterGroup<T>).items, newRule],\r\n }))\r\n );\r\n },\r\n [columns, updateItemRecursively]\r\n );\r\n\r\n const handleAddGroup = useCallback(\r\n (parentId: string) => {\r\n const newGroup: FilterGroup<T> = {\r\n type: \"group\",\r\n id: Math.random().toString(36).substr(2, 9),\r\n logic: \"AND\",\r\n items: [],\r\n };\r\n setRootGroup((prev) =>\r\n updateItemRecursively(prev, parentId, (group) => ({\r\n ...(group as FilterGroup<T>),\r\n items: [...(group as FilterGroup<T>).items, newGroup],\r\n }))\r\n );\r\n },\r\n [updateItemRecursively]\r\n );\r\n\r\n const handleUpdateRule = useCallback(\r\n (ruleId: string, updates: Partial<FilterRule<T>>) => {\r\n setRootGroup((prev) =>\r\n updateItemRecursively(\r\n prev,\r\n ruleId,\r\n (rule) => ({ ...rule, ...updates } as FilterRule<T>)\r\n )\r\n );\r\n },\r\n [updateItemRecursively]\r\n );\r\n\r\n const handleUpdateGroupLogic = useCallback(\r\n (groupId: string, logic: LogicalOperator) => {\r\n setRootGroup((prev) =>\r\n updateItemRecursively(\r\n prev,\r\n groupId,\r\n (group) => ({ ...group, logic } as FilterGroup<T>)\r\n )\r\n );\r\n },\r\n [updateItemRecursively]\r\n );\r\n\r\n const handleRemoveItem = useCallback(\r\n (itemId: string) => {\r\n setRootGroup((prev) => updateItemRecursively(prev, itemId, () => null));\r\n },\r\n [updateItemRecursively]\r\n );\r\n\r\n const handleApply = () => {\r\n const filtered = applyFilters(data, rootGroup, columns);\r\n setFilteredData(filtered);\r\n onClose();\r\n };\r\n\r\n const handleClear = () => {\r\n const emptyGroup: FilterGroup<T> = {\r\n type: \"group\",\r\n id: \"root\",\r\n logic: \"AND\",\r\n items: [],\r\n };\r\n setRootGroup(emptyGroup);\r\n setFilteredData(data);\r\n onClose();\r\n };\r\n\r\n return (\r\n <Dialog\r\n open={isOpen}\r\n onOpenChange={onClose}\r\n title=\"Advanced Filters\"\r\n description=\"Refine your dataset using structured logic and multi-type comparisons.\"\r\n >\r\n <div className=\"max-h-[60vh] max-w-[70vw] overflow-y-auto px-1 custom-scrollbar pr-3 pb-32\">\r\n <FilterGroupUI\r\n group={rootGroup}\r\n depth={0}\r\n columns={columns}\r\n onAddRule={handleAddRule}\r\n onAddGroup={handleAddGroup}\r\n onUpdateRule={handleUpdateRule}\r\n onUpdateGroupLogic={handleUpdateGroupLogic}\r\n onRemoveItem={handleRemoveItem}\r\n />\r\n </div>\r\n <div className=\"flex w-full justify-between items-center gap-4\">\r\n <Button\r\n variant=\"ghost\"\r\n onClick={handleClear}\r\n className=\"text-slate-400 hover:text-red-500 font-black text-[10px] uppercase tracking-widest gap-2\"\r\n >\r\n <FilterX className=\"h-4 w-4\" /> Reset Filters\r\n </Button>\r\n <div className=\"flex gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n onClick={onClose}\r\n className=\"font-bold h-11 px-6\"\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n onClick={handleApply}\r\n className=\"bg-slate-900 font-bold h-11 px-10 rounded-lg shadow-lg hover:shadow-xl transition-shadow\"\r\n >\r\n Apply View\r\n </Button>\r\n </div>\r\n </div>\r\n </Dialog>\r\n );\r\n};\r\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdvancedFilter.js","sources":["../../src/components/AdvancedFilter.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { useState, useEffect, useCallback } from \"react\";\r\nimport {\r\n FilterRule,\r\n FilterGroup,\r\n ColumnDefinition,\r\n LogicalOperator,\r\n FilterOperator,\r\n FilterItem,\r\n} from \"../types\";\r\nimport { Button } from \"./ui/Button\";\r\nimport { Input } from \"./ui/Input\";\r\nimport { Select } from \"./ui/Select\";\r\nimport { Dialog } from \"./ui/Dialog\";\r\nimport {\r\n Plus,\r\n Trash2,\r\n Layers,\r\n Binary,\r\n FilterX,\r\n ListFilter,\r\n} from \"lucide-react\";\r\nimport { applyFilters } from \"../utils/filterLogic\";\r\n\r\ninterface AdvancedFilterProps<T> {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n data: T[];\r\n columns: ColumnDefinition<T>[];\r\n setFilteredData: (data: T[]) => void;\r\n initialFilters?: FilterGroup<T>;\r\n}\r\n\r\nconst getOperatorsForType = (\r\n type: string\r\n): { value: FilterOperator; label: string }[] => {\r\n switch (type) {\r\n case \"string\":\r\n return [\r\n { value: \"contains\", label: \"Contains\" },\r\n { value: \"not_contains\", label: \"Does not contain\" },\r\n { value: \"equals\", label: \"Exact match\" },\r\n ];\r\n case \"select\":\r\n return [\r\n { value: \"equals\", label: \"Is\" },\r\n { value: \"not_equals\", label: \"Is not\" },\r\n ];\r\n case \"number\":\r\n return [\r\n { value: \"equals\", label: \"=\" },\r\n { value: \"not_equals\", label: \"!=\" },\r\n { value: \"gt\", label: \">\" },\r\n { value: \"lt\", label: \"<\" },\r\n { value: \"gte\", label: \">=\" },\r\n { value: \"lte\", label: \"<=\" },\r\n ];\r\n case \"date\":\r\n return [\r\n { value: \"is\", label: \"On date\" },\r\n { value: \"before\", label: \"Before\" },\r\n { value: \"after\", label: \"After\" },\r\n ];\r\n case \"boolean\":\r\n return [\r\n { value: \"true\", label: \"True\" },\r\n { value: \"false\", label: \"False\" },\r\n ];\r\n default:\r\n return [];\r\n }\r\n};\r\n\r\nconst FilterGroupUI = <T,>({\r\n group,\r\n depth,\r\n columns,\r\n onAddRule,\r\n onAddGroup,\r\n onUpdateRule,\r\n onUpdateGroupLogic,\r\n onRemoveItem,\r\n}: {\r\n group: FilterGroup<T>;\r\n depth: number;\r\n columns: ColumnDefinition<T>[];\r\n onAddRule: (parentId: string) => void;\r\n onAddGroup: (parentId: string) => void;\r\n onUpdateRule: (ruleId: string, updates: Partial<FilterRule<T>>) => void;\r\n onUpdateGroupLogic: (groupId: string, logic: LogicalOperator) => void;\r\n onRemoveItem: (itemId: string) => void;\r\n}) => {\r\n return (\r\n <div\r\n className={`rounded-lg border border-slate-200 bg-slate-50/50 p-4 mb-4 ${\r\n depth > 0 ? \"ml-6 md:ml-10 relative border-l-2 border-l-slate-300\" : \"\"\r\n }`}\r\n >\r\n <div className=\"flex flex-wrap items-center justify-between gap-4 mb-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-[10px] font-bold uppercase tracking-widest text-slate-500\">\r\n Group Logic\r\n </span>\r\n <div className=\"flex rounded-md border border-slate-200 bg-white p-1 shadow-sm\">\r\n <button\r\n onClick={() => onUpdateGroupLogic(group.id, \"AND\")}\r\n className={`px-3 py-1 text-[10px] font-black rounded-sm transition-all ${\r\n group.logic === \"AND\"\r\n ? \"bg-slate-900 text-slate-50\"\r\n : \"text-slate-500 hover:text-slate-900\"\r\n }`}\r\n >\r\n AND\r\n </button>\r\n <button\r\n onClick={() => onUpdateGroupLogic(group.id, \"OR\")}\r\n className={`px-3 py-1 text-[10px] font-black rounded-sm transition-all ${\r\n group.logic === \"OR\"\r\n ? \"bg-slate-900 text-slate-50\"\r\n : \"text-slate-500 hover:text-slate-900\"\r\n }`}\r\n >\r\n OR\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => onAddRule(group.id)}\r\n className=\"h-7 text-[10px] font-bold uppercase\"\r\n >\r\n <Plus className=\"mr-1 h-3 w-3\" /> Rule\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => onAddGroup(group.id)}\r\n className=\"h-7 text-[10px] font-bold uppercase\"\r\n >\r\n <Layers className=\"mr-1 h-3 w-3\" /> Group\r\n </Button>\r\n {depth > 0 && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => onRemoveItem(group.id)}\r\n className=\"text-slate-400\"\r\n >\r\n <Trash2 className=\"h-5 w-5 text-red-500\" />\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-3\">\r\n {group.items.map((item) => {\r\n const column = columns.find(\r\n (c) => c.id === (item.type === \"rule\" ? item.columnId : null)\r\n );\r\n return item.type === \"rule\" ? (\r\n <div\r\n key={item.id}\r\n className=\"flex flex-col md:flex-row md:items-center gap-3 p-3 bg-white border border-slate-200 rounded-md shadow-sm\"\r\n >\r\n <div className=\"flex-1 min-w-[140px]\">\r\n <Select\r\n value={item.columnId as string}\r\n options={columns.map((c) => ({\r\n value: c.id as string,\r\n label: c.label,\r\n }))}\r\n onValueChange={(val) => {\r\n const colId = val as keyof T;\r\n const col = columns.find((c) => c.id === colId);\r\n onUpdateRule(item.id, {\r\n columnId: colId,\r\n operator:\r\n col?.type === \"date\"\r\n ? \"is\"\r\n : col?.type === \"number\"\r\n ? \"equals\"\r\n : col?.type === \"select\"\r\n ? \"equals\"\r\n : \"contains\",\r\n value: \"\",\r\n });\r\n }}\r\n />\r\n </div>\r\n <div className=\"w-full md:w-44\">\r\n <Select\r\n value={item.operator}\r\n options={getOperatorsForType(column?.type || \"string\")}\r\n onValueChange={(val) =>\r\n onUpdateRule(item.id, { operator: val as FilterOperator })\r\n }\r\n />\r\n </div>\r\n <div className=\"flex-[1.5] min-w-[180px]\">\r\n {column?.type === \"date\" ? (\r\n <Input\r\n type=\"date\"\r\n value={item.value || \"\"}\r\n onChange={(e) =>\r\n onUpdateRule(item.id, { value: e.target.value })\r\n }\r\n />\r\n ) : column?.type === \"boolean\" ? (\r\n <div className=\"h-10 flex items-center px-3 border border-slate-200 rounded-md bg-slate-50 text-[10px] font-black uppercase tracking-tighter text-slate-400 italic\">\r\n <Binary className=\"h-3 w-3 mr-2\" />\r\n Binary state\r\n </div>\r\n ) : column?.type === \"select\" ? (\r\n <Select\r\n value={item.value || \"\"}\r\n placeholder=\"Choose option...\"\r\n options={(column.options || []).map((opt) => ({\r\n value: opt,\r\n label: opt,\r\n }))}\r\n onValueChange={(val) =>\r\n onUpdateRule(item.id, { value: val })\r\n }\r\n />\r\n ) : (\r\n <Input\r\n placeholder=\"Search query...\"\r\n value={item.value || \"\"}\r\n onChange={(e) =>\r\n onUpdateRule(item.id, { value: e.target.value })\r\n }\r\n />\r\n )}\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={() => onRemoveItem(item.id)}\r\n className=\"h-9 w-9 text-slate-300 hover:text-red-500 hover:bg-red-50\"\r\n >\r\n <Trash2 className=\"h-5 w-5 text-red-500\" />\r\n </Button>\r\n </div>\r\n ) : (\r\n <FilterGroupUI\r\n group={item}\r\n depth={depth + 1}\r\n columns={columns}\r\n onAddRule={onAddRule}\r\n onAddGroup={onAddGroup}\r\n onUpdateRule={onUpdateRule}\r\n onUpdateGroupLogic={onUpdateGroupLogic}\r\n onRemoveItem={onRemoveItem}\r\n />\r\n );\r\n })}\r\n {group.items.length === 0 && (\r\n <div className=\"flex flex-col items-center justify-center py-6 rounded-md border border-dashed border-slate-200 bg-white/50\">\r\n <ListFilter className=\"h-5 w-5 text-slate-300 mb-1\" />\r\n <p className=\"text-[10px] text-slate-400 font-bold uppercase tracking-widest\">\r\n Add a rule to filter\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport const AdvancedFilter = <T,>({\r\n isOpen,\r\n onClose,\r\n data,\r\n columns,\r\n setFilteredData,\r\n initialFilters,\r\n}: AdvancedFilterProps<T>) => {\r\n const [rootGroup, setRootGroup] = useState<FilterGroup<T>>({\r\n type: \"group\",\r\n id: \"root\",\r\n logic: \"AND\",\r\n items: [],\r\n });\r\n\r\n useEffect(() => {\r\n if (initialFilters) setRootGroup(initialFilters);\r\n }, [initialFilters, isOpen]);\r\n\r\n const updateItemRecursively = useCallback(\r\n (\r\n group: FilterGroup<T>,\r\n targetId: string,\r\n updater: (item: FilterItem<T>) => FilterItem<T> | null\r\n ): FilterGroup<T> => {\r\n if (group.id === targetId) return updater(group) as FilterGroup<T>;\r\n return {\r\n ...group,\r\n items: group.items\r\n .map((item) => {\r\n if (item.id === targetId) return updater(item);\r\n if (item.type === \"group\")\r\n return updateItemRecursively(item, targetId, updater);\r\n return item;\r\n })\r\n .filter(Boolean) as FilterItem<T>[],\r\n };\r\n },\r\n []\r\n );\r\n\r\n const handleAddRule = useCallback(\r\n (parentId: string) => {\r\n const firstCol = columns[0];\r\n const newRule: FilterRule<T> = {\r\n type: \"rule\",\r\n id: Math.random().toString(36).substr(2, 9),\r\n columnId: firstCol.id,\r\n operator:\r\n firstCol.type === \"string\"\r\n ? \"contains\"\r\n : firstCol.type === \"select\"\r\n ? \"equals\"\r\n : \"equals\",\r\n value: \"\",\r\n };\r\n setRootGroup((prev) =>\r\n updateItemRecursively(prev, parentId, (group) => ({\r\n ...(group as FilterGroup<T>),\r\n items: [...(group as FilterGroup<T>).items, newRule],\r\n }))\r\n );\r\n },\r\n [columns, updateItemRecursively]\r\n );\r\n\r\n const handleAddGroup = useCallback(\r\n (parentId: string) => {\r\n const newGroup: FilterGroup<T> = {\r\n type: \"group\",\r\n id: Math.random().toString(36).substr(2, 9),\r\n logic: \"AND\",\r\n items: [],\r\n };\r\n setRootGroup((prev) =>\r\n updateItemRecursively(prev, parentId, (group) => ({\r\n ...(group as FilterGroup<T>),\r\n items: [...(group as FilterGroup<T>).items, newGroup],\r\n }))\r\n );\r\n },\r\n [updateItemRecursively]\r\n );\r\n\r\n const handleUpdateRule = useCallback(\r\n (ruleId: string, updates: Partial<FilterRule<T>>) => {\r\n setRootGroup((prev) =>\r\n updateItemRecursively(\r\n prev,\r\n ruleId,\r\n (rule) => ({ ...rule, ...updates } as FilterRule<T>)\r\n )\r\n );\r\n },\r\n [updateItemRecursively]\r\n );\r\n\r\n const handleUpdateGroupLogic = useCallback(\r\n (groupId: string, logic: LogicalOperator) => {\r\n setRootGroup((prev) =>\r\n updateItemRecursively(\r\n prev,\r\n groupId,\r\n (group) => ({ ...group, logic } as FilterGroup<T>)\r\n )\r\n );\r\n },\r\n [updateItemRecursively]\r\n );\r\n\r\n const handleRemoveItem = useCallback(\r\n (itemId: string) => {\r\n setRootGroup((prev) => updateItemRecursively(prev, itemId, () => null));\r\n },\r\n [updateItemRecursively]\r\n );\r\n\r\n const handleApply = () => {\r\n const filtered = applyFilters(data, rootGroup, columns);\r\n setFilteredData(filtered);\r\n onClose();\r\n };\r\n\r\n const handleClear = () => {\r\n const emptyGroup: FilterGroup<T> = {\r\n type: \"group\",\r\n id: \"root\",\r\n logic: \"AND\",\r\n items: [],\r\n };\r\n setRootGroup(emptyGroup);\r\n setFilteredData(data);\r\n onClose();\r\n };\r\n\r\n return (\r\n <Dialog\r\n open={isOpen}\r\n onOpenChange={onClose}\r\n title=\"Advanced Filters\"\r\n description=\"Refine your dataset using structured logic and multi-type comparisons.\"\r\n >\r\n <div className=\"max-h-[60vh] overflow-y-auto px-1 custom-scrollbar pr-3 pb-32\">\r\n <FilterGroupUI\r\n group={rootGroup}\r\n depth={0}\r\n columns={columns}\r\n onAddRule={handleAddRule}\r\n onAddGroup={handleAddGroup}\r\n onUpdateRule={handleUpdateRule}\r\n onUpdateGroupLogic={handleUpdateGroupLogic}\r\n onRemoveItem={handleRemoveItem}\r\n />\r\n </div>\r\n <div className=\"flex w-full justify-between items-center gap-4\">\r\n <Button\r\n variant=\"ghost\"\r\n onClick={handleClear}\r\n className=\"text-slate-400 hover:text-red-500 font-black text-[10px] uppercase tracking-widest gap-2\"\r\n >\r\n <FilterX className=\"h-4 w-4\" /> Reset Filters\r\n </Button>\r\n <div className=\"flex gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n onClick={onClose}\r\n className=\"font-bold h-11 px-6\"\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n onClick={handleApply}\r\n className=\"bg-slate-900 font-bold h-11 px-10 rounded-lg shadow-lg hover:shadow-xl transition-shadow\"\r\n >\r\n Apply View\r\n </Button>\r\n </div>\r\n </div>\r\n </Dialog>\r\n );\r\n};\r\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { X } from 'lucide-react';
|
|
|
4
4
|
const Dialog = ({ open, onOpenChange, title, description, children, footer }) => {
|
|
5
5
|
if (!open)
|
|
6
6
|
return null;
|
|
7
|
-
return (jsx("div", { className: "fixed inset-0 z-50 flex items-start justify-center overflow-y-auto bg-slate-950/80 p-4 pt-[5vh] backdrop-blur-
|
|
7
|
+
return (jsx("div", { className: "fixed inset-0 z-50 flex items-start justify-center overflow-y-auto bg-slate-950/80 p-4 pt-[5vh] backdrop-blur-sm animate-in fade-in duration-200", children: jsxs("div", { className: "relative w-full max-w-4xl rounded-lg border border-slate-200 bg-white p-6 shadow-lg animate-in zoom-in-95 duration-200", children: [jsxs("div", { className: "flex flex-col space-y-1.5 text-center sm:text-left mb-6", children: [jsx("h2", { className: "text-lg font-semibold leading-none tracking-tight", children: title }), description && jsx("p", { className: "text-sm text-slate-500", children: description }), jsxs("button", { onClick: () => onOpenChange(false), className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-slate-950 focus:ring-offset-2 disabled:pointer-events-none", children: [jsx(X, { className: "h-4 w-4" }), jsx("span", { className: "sr-only", children: "Close" })] })] }), jsx("div", { className: "py-2", children: children }), footer && (jsx("div", { className: "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2 mt-6", children: footer }))] }) }));
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
export { Dialog };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.js","sources":["../../../src/components/ui/Dialog.tsx"],"sourcesContent":["\r\nimport React from 'react';\r\nimport { X } from 'lucide-react';\r\n\r\ninterface DialogProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n title: string;\r\n description?: string;\r\n children: React.ReactNode;\r\n footer?: React.ReactNode;\r\n}\r\n\r\nexport const Dialog: React.FC<DialogProps> = ({ open, onOpenChange, title, description, children, footer }) => {\r\n if (!open) return null;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 flex items-start justify-center overflow-y-auto bg-slate-950/80 p-4 pt-[5vh] backdrop-blur-
|
|
1
|
+
{"version":3,"file":"Dialog.js","sources":["../../../src/components/ui/Dialog.tsx"],"sourcesContent":["\r\nimport React from 'react';\r\nimport { X } from 'lucide-react';\r\n\r\ninterface DialogProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n title: string;\r\n description?: string;\r\n children: React.ReactNode;\r\n footer?: React.ReactNode;\r\n}\r\n\r\nexport const Dialog: React.FC<DialogProps> = ({ open, onOpenChange, title, description, children, footer }) => {\r\n if (!open) return null;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 flex items-start justify-center overflow-y-auto bg-slate-950/80 p-4 pt-[5vh] backdrop-blur-sm animate-in fade-in duration-200\">\r\n <div className=\"relative w-full max-w-4xl rounded-lg border border-slate-200 bg-white p-6 shadow-lg animate-in zoom-in-95 duration-200\">\r\n <div className=\"flex flex-col space-y-1.5 text-center sm:text-left mb-6\">\r\n <h2 className=\"text-lg font-semibold leading-none tracking-tight\">{title}</h2>\r\n {description && <p className=\"text-sm text-slate-500\">{description}</p>}\r\n <button\r\n onClick={() => onOpenChange(false)}\r\n className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-slate-950 focus:ring-offset-2 disabled:pointer-events-none\"\r\n >\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </button>\r\n </div>\r\n <div className=\"py-2\">\r\n {children}\r\n </div>\r\n {footer && (\r\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2 mt-6\">\r\n {footer}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"names":["_jsx","_jsxs"],"mappings":";;;AAaO,MAAM,MAAM,GAA0B,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAI;AAC5G,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;AAEtB,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kJAAkJ,EAAA,QAAA,EAC/JC,cAAK,SAAS,EAAC,wHAAwH,EAAA,QAAA,EAAA,CACrIA,cAAK,SAAS,EAAC,yDAAyD,EAAA,QAAA,EAAA,CACtED,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,mDAAmD,EAAA,QAAA,EAAE,KAAK,GAAM,EAC7E,WAAW,IAAIA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,wBAAwB,EAAA,QAAA,EAAE,WAAW,EAAA,CAAK,EACvEC,iBACE,OAAO,EAAE,MAAM,YAAY,CAAC,KAAK,CAAC,EAClC,SAAS,EAAC,2MAA2M,aAErND,GAAA,CAAC,CAAC,IAAC,SAAS,EAAC,SAAS,EAAA,CAAG,EACzBA,cAAM,SAAS,EAAC,SAAS,EAAA,QAAA,EAAA,OAAA,EAAA,CAAa,CAAA,EAAA,CAC/B,IACL,EACNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,MAAM,EAAA,QAAA,EAClB,QAAQ,GACL,EACL,MAAM,KACLA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oEAAoE,YAChF,MAAM,EAAA,CACH,CACP,CAAA,EAAA,CACG,EAAA,CACF;AAEV;;;;"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nest-filter",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "
|
|
5
|
-
"author": "Arijit Barik",
|
|
6
|
-
"license": "ISC",
|
|
7
|
-
|
|
8
|
-
"type": "module",
|
|
9
|
-
|
|
3
|
+
"version": "1.0.16",
|
|
4
|
+
"description": "",
|
|
10
5
|
"main": "dist/index.js",
|
|
11
6
|
"types": "dist/index.d.ts",
|
|
12
7
|
"exports": {
|
|
@@ -165,7 +165,7 @@ const FilterGroupUI = <T,>({
|
|
|
165
165
|
key={item.id}
|
|
166
166
|
className="flex flex-col md:flex-row md:items-center gap-3 p-3 bg-white border border-slate-200 rounded-md shadow-sm"
|
|
167
167
|
>
|
|
168
|
-
<div className="w-
|
|
168
|
+
<div className="flex-1 min-w-[140px]">
|
|
169
169
|
<Select
|
|
170
170
|
value={item.columnId as string}
|
|
171
171
|
options={columns.map((c) => ({
|
|
@@ -188,20 +188,18 @@ const FilterGroupUI = <T,>({
|
|
|
188
188
|
value: "",
|
|
189
189
|
});
|
|
190
190
|
}}
|
|
191
|
-
className="w-full"
|
|
192
191
|
/>
|
|
193
192
|
</div>
|
|
194
|
-
<div className="w-
|
|
193
|
+
<div className="w-full md:w-44">
|
|
195
194
|
<Select
|
|
196
195
|
value={item.operator}
|
|
197
196
|
options={getOperatorsForType(column?.type || "string")}
|
|
198
197
|
onValueChange={(val) =>
|
|
199
198
|
onUpdateRule(item.id, { operator: val as FilterOperator })
|
|
200
199
|
}
|
|
201
|
-
className="w-full"
|
|
202
200
|
/>
|
|
203
201
|
</div>
|
|
204
|
-
<div className="w-
|
|
202
|
+
<div className="flex-[1.5] min-w-[180px]">
|
|
205
203
|
{column?.type === "date" ? (
|
|
206
204
|
<Input
|
|
207
205
|
type="date"
|
|
@@ -209,7 +207,6 @@ const FilterGroupUI = <T,>({
|
|
|
209
207
|
onChange={(e) =>
|
|
210
208
|
onUpdateRule(item.id, { value: e.target.value })
|
|
211
209
|
}
|
|
212
|
-
className="w-full"
|
|
213
210
|
/>
|
|
214
211
|
) : column?.type === "boolean" ? (
|
|
215
212
|
<div className="h-10 flex items-center px-3 border border-slate-200 rounded-md bg-slate-50 text-[10px] font-black uppercase tracking-tighter text-slate-400 italic">
|
|
@@ -227,7 +224,6 @@ const FilterGroupUI = <T,>({
|
|
|
227
224
|
onValueChange={(val) =>
|
|
228
225
|
onUpdateRule(item.id, { value: val })
|
|
229
226
|
}
|
|
230
|
-
className="w-full"
|
|
231
227
|
/>
|
|
232
228
|
) : (
|
|
233
229
|
<Input
|
|
@@ -236,7 +232,6 @@ const FilterGroupUI = <T,>({
|
|
|
236
232
|
onChange={(e) =>
|
|
237
233
|
onUpdateRule(item.id, { value: e.target.value })
|
|
238
234
|
}
|
|
239
|
-
className="w-full"
|
|
240
235
|
/>
|
|
241
236
|
)}
|
|
242
237
|
</div>
|
|
@@ -417,7 +412,7 @@ export const AdvancedFilter = <T,>({
|
|
|
417
412
|
title="Advanced Filters"
|
|
418
413
|
description="Refine your dataset using structured logic and multi-type comparisons."
|
|
419
414
|
>
|
|
420
|
-
<div className="max-h-[60vh]
|
|
415
|
+
<div className="max-h-[60vh] overflow-y-auto px-1 custom-scrollbar pr-3 pb-32">
|
|
421
416
|
<FilterGroupUI
|
|
422
417
|
group={rootGroup}
|
|
423
418
|
depth={0}
|
|
@@ -15,7 +15,7 @@ export const Dialog: React.FC<DialogProps> = ({ open, onOpenChange, title, descr
|
|
|
15
15
|
if (!open) return null;
|
|
16
16
|
|
|
17
17
|
return (
|
|
18
|
-
<div className="fixed inset-0 z-50 flex items-start justify-center overflow-y-auto bg-slate-950/80 p-4 pt-[5vh] backdrop-blur-
|
|
18
|
+
<div className="fixed inset-0 z-50 flex items-start justify-center overflow-y-auto bg-slate-950/80 p-4 pt-[5vh] backdrop-blur-sm animate-in fade-in duration-200">
|
|
19
19
|
<div className="relative w-full max-w-4xl rounded-lg border border-slate-200 bg-white p-6 shadow-lg animate-in zoom-in-95 duration-200">
|
|
20
20
|
<div className="flex flex-col space-y-1.5 text-center sm:text-left mb-6">
|
|
21
21
|
<h2 className="text-lg font-semibold leading-none tracking-tight">{title}</h2>
|