@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.
- package/LICENSE +201 -0
- package/dist/chunk-3WNAREG6.mjs +29 -0
- package/dist/chunk-63P4ITVP.mjs +263 -0
- package/dist/chunk-7KY2PDNL.mjs +136 -0
- package/dist/chunk-7QP7FRID.mjs +47 -0
- package/dist/chunk-EF4VI36D.mjs +36 -0
- package/dist/chunk-I3Z2T4N2.mjs +14 -0
- package/dist/chunk-PTJ7HZPA.mjs +164 -0
- package/dist/chunk-TBHYZZSX.mjs +139 -0
- package/dist/chunk-URDCG5NI.mjs +111 -0
- package/dist/filter-active.d.mts +13 -0
- package/dist/filter-active.d.ts +13 -0
- package/dist/filter-active.js +538 -0
- package/dist/filter-active.mjs +12 -0
- package/dist/filter-context.d.mts +28 -0
- package/dist/filter-context.d.ts +28 -0
- package/dist/filter-context.js +39 -0
- package/dist/filter-context.mjs +10 -0
- package/dist/filter-i18n.d.mts +20 -0
- package/dist/filter-i18n.d.ts +20 -0
- package/dist/filter-i18n.js +52 -0
- package/dist/filter-i18n.mjs +7 -0
- package/dist/filter-menu.d.mts +65 -0
- package/dist/filter-menu.d.ts +65 -0
- package/dist/filter-menu.js +169 -0
- package/dist/filter-menu.mjs +15 -0
- package/dist/filter-trigger.d.mts +14 -0
- package/dist/filter-trigger.d.ts +14 -0
- package/dist/filter-trigger.js +170 -0
- package/dist/filter-trigger.mjs +10 -0
- package/dist/filter-types.d.mts +60 -0
- package/dist/filter-types.d.ts +60 -0
- package/dist/filter-types.js +72 -0
- package/dist/filter-types.mjs +11 -0
- package/dist/filter-value-editor.d.mts +11 -0
- package/dist/filter-value-editor.d.ts +11 -0
- package/dist/filter-value-editor.js +414 -0
- package/dist/filter-value-editor.mjs +11 -0
- package/dist/filter.d.mts +24 -0
- package/dist/filter.d.ts +24 -0
- package/dist/filter.js +242 -0
- package/dist/filter.mjs +11 -0
- package/dist/index.d.mts +13 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +909 -0
- package/dist/index.mjs +39 -0
- package/dist/messages.d.mts +104 -0
- package/dist/messages.d.ts +104 -0
- package/dist/messages.js +134 -0
- package/dist/messages.mjs +7 -0
- 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
|
+
});
|
package/dist/filter.mjs
ADDED
package/dist/index.d.mts
ADDED
|
@@ -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';
|
package/dist/index.d.ts
ADDED
|
@@ -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';
|