@kopexa/filter 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/LICENSE +201 -0
  2. package/dist/chunk-3WNAREG6.mjs +29 -0
  3. package/dist/chunk-63P4ITVP.mjs +263 -0
  4. package/dist/chunk-7KY2PDNL.mjs +136 -0
  5. package/dist/chunk-7QP7FRID.mjs +47 -0
  6. package/dist/chunk-EF4VI36D.mjs +36 -0
  7. package/dist/chunk-I3Z2T4N2.mjs +14 -0
  8. package/dist/chunk-PTJ7HZPA.mjs +164 -0
  9. package/dist/chunk-TBHYZZSX.mjs +139 -0
  10. package/dist/chunk-URDCG5NI.mjs +111 -0
  11. package/dist/filter-active.d.mts +13 -0
  12. package/dist/filter-active.d.ts +13 -0
  13. package/dist/filter-active.js +538 -0
  14. package/dist/filter-active.mjs +12 -0
  15. package/dist/filter-context.d.mts +28 -0
  16. package/dist/filter-context.d.ts +28 -0
  17. package/dist/filter-context.js +39 -0
  18. package/dist/filter-context.mjs +10 -0
  19. package/dist/filter-i18n.d.mts +20 -0
  20. package/dist/filter-i18n.d.ts +20 -0
  21. package/dist/filter-i18n.js +52 -0
  22. package/dist/filter-i18n.mjs +7 -0
  23. package/dist/filter-menu.d.mts +65 -0
  24. package/dist/filter-menu.d.ts +65 -0
  25. package/dist/filter-menu.js +169 -0
  26. package/dist/filter-menu.mjs +15 -0
  27. package/dist/filter-trigger.d.mts +14 -0
  28. package/dist/filter-trigger.d.ts +14 -0
  29. package/dist/filter-trigger.js +170 -0
  30. package/dist/filter-trigger.mjs +10 -0
  31. package/dist/filter-types.d.mts +60 -0
  32. package/dist/filter-types.d.ts +60 -0
  33. package/dist/filter-types.js +72 -0
  34. package/dist/filter-types.mjs +11 -0
  35. package/dist/filter-value-editor.d.mts +11 -0
  36. package/dist/filter-value-editor.d.ts +11 -0
  37. package/dist/filter-value-editor.js +414 -0
  38. package/dist/filter-value-editor.mjs +11 -0
  39. package/dist/filter.d.mts +24 -0
  40. package/dist/filter.d.ts +24 -0
  41. package/dist/filter.js +242 -0
  42. package/dist/filter.mjs +11 -0
  43. package/dist/index.d.mts +13 -0
  44. package/dist/index.d.ts +13 -0
  45. package/dist/index.js +909 -0
  46. package/dist/index.mjs +39 -0
  47. package/dist/messages.d.mts +104 -0
  48. package/dist/messages.d.ts +104 -0
  49. package/dist/messages.js +134 -0
  50. package/dist/messages.mjs +7 -0
  51. package/package.json +69 -0
package/dist/filter.js ADDED
@@ -0,0 +1,242 @@
1
+ "use client";
2
+ "use strict";
3
+ "use client";
4
+ var __create = Object.create;
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __export = (target, all) => {
11
+ for (var name in all)
12
+ __defProp(target, name, { get: all[name], enumerable: true });
13
+ };
14
+ var __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from))
17
+ if (!__hasOwnProp.call(to, key) && key !== except)
18
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
+ // If the importer is in node compatibility mode or this is not an ESM
24
+ // file that has been converted to a CommonJS file using a Babel-
25
+ // compatible transform (i.e. "__esModule" has not been set), then set
26
+ // "default" to the CommonJS "module.exports" for node compatibility.
27
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
+ mod
29
+ ));
30
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
31
+
32
+ // src/filter.tsx
33
+ var filter_exports = {};
34
+ __export(filter_exports, {
35
+ Filter: () => Filter
36
+ });
37
+ module.exports = __toCommonJS(filter_exports);
38
+ var import_dropdown_menu = require("@kopexa/dropdown-menu");
39
+ var import_shared_utils = require("@kopexa/shared-utils");
40
+ var import_theme = require("@kopexa/theme");
41
+ var React = __toESM(require("react"));
42
+
43
+ // src/filter-context.tsx
44
+ var import_react_utils = require("@kopexa/react-utils");
45
+ var [FilterProvider, useFilterContext] = (0, import_react_utils.createContext)({
46
+ name: "FilterContext",
47
+ strict: true,
48
+ errorMessage: "useFilterContext must be used within a Filter component. Make sure to wrap your FilterMenu, FilterTrigger, etc. inside a <Filter> component."
49
+ });
50
+
51
+ // src/filter-i18n.ts
52
+ var DEFAULT_I18N = {
53
+ addFilter: "Add Filter",
54
+ clearAll: "Clear all",
55
+ noFields: "No filter options available",
56
+ selectValue: "Select value...",
57
+ enterValue: "Enter value...",
58
+ operators: {
59
+ equals: "is",
60
+ not_equals: "is not",
61
+ contains: "contains",
62
+ not_contains: "does not contain",
63
+ starts_with: "starts with",
64
+ ends_with: "ends with",
65
+ gt: "greater than",
66
+ lt: "less than",
67
+ gte: "greater or equal",
68
+ lte: "less or equal",
69
+ between: "between",
70
+ is_empty: "is empty",
71
+ is_not_empty: "is not empty"
72
+ }
73
+ };
74
+
75
+ // src/filter-types.ts
76
+ function getDefaultOperator(type) {
77
+ switch (type) {
78
+ case "text":
79
+ return "contains";
80
+ case "number":
81
+ case "date":
82
+ case "select":
83
+ case "multiselect":
84
+ return "equals";
85
+ case "daterange":
86
+ return "between";
87
+ case "boolean":
88
+ return "equals";
89
+ default:
90
+ return "equals";
91
+ }
92
+ }
93
+
94
+ // src/filter.tsx
95
+ var import_jsx_runtime = require("react/jsx-runtime");
96
+ function Filter(props) {
97
+ const {
98
+ value = [],
99
+ onChange,
100
+ allowMultiple = true,
101
+ size = "md",
102
+ variant = "outline",
103
+ i18n,
104
+ className,
105
+ children,
106
+ ...rest
107
+ } = props;
108
+ const mergedI18n = React.useMemo(
109
+ () => ({
110
+ ...DEFAULT_I18N,
111
+ ...i18n,
112
+ operators: {
113
+ ...DEFAULT_I18N.operators,
114
+ ...i18n == null ? void 0 : i18n.operators
115
+ }
116
+ }),
117
+ [i18n]
118
+ );
119
+ const styles = React.useMemo(
120
+ () => (0, import_theme.filter)({ size, variant }),
121
+ [size, variant]
122
+ );
123
+ const [fields, setFields] = React.useState(
124
+ /* @__PURE__ */ new Map()
125
+ );
126
+ const [menuOpen, setMenuOpen] = React.useState(false);
127
+ const [editingFilterId, setEditingFilterId] = React.useState(
128
+ null
129
+ );
130
+ const registerField = React.useCallback((field) => {
131
+ setFields((prev) => {
132
+ const next = new Map(prev);
133
+ next.set(field.id, field);
134
+ return next;
135
+ });
136
+ }, []);
137
+ const unregisterField = React.useCallback((fieldId) => {
138
+ setFields((prev) => {
139
+ const next = new Map(prev);
140
+ next.delete(fieldId);
141
+ return next;
142
+ });
143
+ }, []);
144
+ const updateFilter = React.useCallback(
145
+ (filterId, updates) => {
146
+ const newFilters = value.map((filter) => {
147
+ if (filter.id === filterId) {
148
+ const updated = { ...filter, ...updates };
149
+ if (updates.operator === "is_empty" || updates.operator === "is_not_empty") {
150
+ updated.value = void 0;
151
+ }
152
+ return updated;
153
+ }
154
+ return filter;
155
+ });
156
+ onChange == null ? void 0 : onChange(newFilters);
157
+ },
158
+ [value, onChange]
159
+ );
160
+ const removeFilter = React.useCallback(
161
+ (filterId) => {
162
+ onChange == null ? void 0 : onChange(value.filter((f) => f.id !== filterId));
163
+ },
164
+ [value, onChange]
165
+ );
166
+ const clearFilters = React.useCallback(() => {
167
+ onChange == null ? void 0 : onChange([]);
168
+ }, [onChange]);
169
+ const addFilter = React.useCallback(
170
+ (fieldKey) => {
171
+ const field = fields.get(fieldKey);
172
+ if (!field) return;
173
+ const defaultOperator = getDefaultOperator(field.type);
174
+ const newFilter = {
175
+ id: `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`,
176
+ fieldId: fieldKey,
177
+ operator: defaultOperator,
178
+ value: void 0
179
+ };
180
+ onChange == null ? void 0 : onChange([...value, newFilter]);
181
+ },
182
+ [fields, value, onChange]
183
+ );
184
+ const contextValue = React.useMemo(
185
+ () => ({
186
+ // State
187
+ value,
188
+ fields,
189
+ allowMultiple,
190
+ // Style
191
+ styles,
192
+ size: size != null ? size : "md",
193
+ variant: variant != null ? variant : "outline",
194
+ i18n: mergedI18n,
195
+ // Actions
196
+ addFilter,
197
+ updateFilter,
198
+ removeFilter,
199
+ clearFilters,
200
+ // Field registration
201
+ registerField,
202
+ unregisterField,
203
+ // Menu state
204
+ menuOpen,
205
+ setMenuOpen,
206
+ // Editor state
207
+ editingFilterId,
208
+ setEditingFilterId
209
+ }),
210
+ [
211
+ value,
212
+ fields,
213
+ allowMultiple,
214
+ styles,
215
+ size,
216
+ variant,
217
+ mergedI18n,
218
+ addFilter,
219
+ updateFilter,
220
+ removeFilter,
221
+ clearFilters,
222
+ registerField,
223
+ unregisterField,
224
+ menuOpen,
225
+ editingFilterId
226
+ ]
227
+ );
228
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FilterProvider, { value: contextValue, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dropdown_menu.DropdownMenu.Root, { open: menuOpen, onOpenChange: setMenuOpen, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
229
+ "div",
230
+ {
231
+ "data-slot": "filter",
232
+ className: (0, import_shared_utils.cn)(styles.root(), className),
233
+ ...rest,
234
+ children
235
+ }
236
+ ) }) });
237
+ }
238
+ Filter.displayName = "Filter";
239
+ // Annotate the CommonJS export names for ESM import in node:
240
+ 0 && (module.exports = {
241
+ Filter
242
+ });
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ "use client";
3
+ import {
4
+ Filter
5
+ } from "./chunk-PTJ7HZPA.mjs";
6
+ import "./chunk-3WNAREG6.mjs";
7
+ import "./chunk-I3Z2T4N2.mjs";
8
+ import "./chunk-7QP7FRID.mjs";
9
+ export {
10
+ Filter
11
+ };
@@ -0,0 +1,13 @@
1
+ export { Filter, FilterProps } from './filter.mjs';
2
+ export { FilterActive, FilterActiveProps } from './filter-active.mjs';
3
+ export { FilterContextValue, useFilterContext } from './filter-context.mjs';
4
+ export { FilterGroup, FilterGroupProps, FilterItem, FilterItemProps, FilterMenu, FilterMenuProps, FilterMenuSeparator } from './filter-menu.mjs';
5
+ export { FilterTrigger, FilterTriggerProps } from './filter-trigger.mjs';
6
+ export { FilterFieldConfig, FilterFieldType, FilterOperator, FilterOption, FilterValue } from './filter-types.mjs';
7
+ export { FilterValueEditor } from './filter-value-editor.mjs';
8
+ export { messages as filterMessages } from './messages.mjs';
9
+ import 'react/jsx-runtime';
10
+ import '@kopexa/theme';
11
+ import 'react';
12
+ import './filter-i18n.mjs';
13
+ import '@kopexa/dropdown-menu';
@@ -0,0 +1,13 @@
1
+ export { Filter, FilterProps } from './filter.js';
2
+ export { FilterActive, FilterActiveProps } from './filter-active.js';
3
+ export { FilterContextValue, useFilterContext } from './filter-context.js';
4
+ export { FilterGroup, FilterGroupProps, FilterItem, FilterItemProps, FilterMenu, FilterMenuProps, FilterMenuSeparator } from './filter-menu.js';
5
+ export { FilterTrigger, FilterTriggerProps } from './filter-trigger.js';
6
+ export { FilterFieldConfig, FilterFieldType, FilterOperator, FilterOption, FilterValue } from './filter-types.js';
7
+ export { FilterValueEditor } from './filter-value-editor.js';
8
+ export { messages as filterMessages } from './messages.js';
9
+ import 'react/jsx-runtime';
10
+ import '@kopexa/theme';
11
+ import 'react';
12
+ import './filter-i18n.js';
13
+ import '@kopexa/dropdown-menu';