@cryptlex/web-components 5.1.1 → 5.3.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.
Files changed (168) hide show
  1. package/dist/components/data-table/data-table-filter.d.ts +27 -0
  2. package/dist/components/data-table/data-table-filter.js +112 -0
  3. package/dist/components/data-table/data-table.d.ts +73 -0
  4. package/dist/components/data-table/data-table.js +265 -0
  5. package/dist/components/data-table/table-commons.d.ts +56 -0
  6. package/dist/components/data-table/table-commons.js +137 -0
  7. package/dist/components/inputs/checkbox.d.ts +8 -0
  8. package/dist/components/inputs/checkbox.js +25 -0
  9. package/dist/components/inputs/date-picker.d.ts +11 -0
  10. package/dist/components/inputs/date-picker.js +22 -0
  11. package/dist/components/inputs/datefield.d.ts +14 -0
  12. package/dist/components/inputs/datefield.js +25 -0
  13. package/dist/components/inputs/field.d.ts +21 -0
  14. package/dist/components/inputs/field.js +48 -0
  15. package/dist/components/inputs/id-search.d.ts +20 -0
  16. package/dist/components/inputs/id-search.js +40 -0
  17. package/dist/components/inputs/input-otp.d.ts +8 -0
  18. package/dist/components/inputs/input-otp.js +19 -0
  19. package/dist/components/inputs/multi-select.d.ts +17 -0
  20. package/dist/components/inputs/multi-select.js +18 -0
  21. package/dist/components/inputs/numberfield.d.ts +7 -0
  22. package/dist/components/inputs/numberfield.js +25 -0
  23. package/dist/components/inputs/searchfield.d.ts +5 -0
  24. package/dist/components/inputs/searchfield.js +24 -0
  25. package/dist/components/inputs/select-options.d.ts +8 -0
  26. package/dist/components/inputs/select-options.js +286 -0
  27. package/dist/components/inputs/select.d.ts +17 -0
  28. package/dist/components/inputs/select.js +34 -0
  29. package/dist/components/inputs/textfield.d.ts +7 -0
  30. package/dist/components/inputs/textfield.js +28 -0
  31. package/dist/components/key-value-card/key-value-card.d.ts +17 -0
  32. package/dist/components/key-value-card/key-value-card.js +40 -0
  33. package/dist/components/ui/alert.d.ts +8 -0
  34. package/dist/components/ui/alert.js +18 -0
  35. package/dist/components/ui/avatar.d.ts +8 -0
  36. package/dist/components/ui/avatar.js +5 -0
  37. package/dist/components/ui/badge.d.ts +2 -0
  38. package/dist/components/ui/badge.js +5 -0
  39. package/dist/components/ui/breadcrumbs.d.ts +10 -0
  40. package/dist/components/ui/breadcrumbs.js +28 -0
  41. package/dist/components/ui/button.d.ts +11 -0
  42. package/dist/components/ui/button.js +34 -0
  43. package/dist/components/ui/calendar.d.ts +17 -0
  44. package/dist/components/ui/calendar.js +63 -0
  45. package/dist/components/ui/card.d.ts +7 -0
  46. package/dist/components/ui/card.js +20 -0
  47. package/dist/components/ui/dialog.d.ts +19 -0
  48. package/dist/components/ui/dialog.js +42 -0
  49. package/dist/components/ui/disclosure.d.ts +19 -0
  50. package/dist/components/ui/disclosure.js +20 -0
  51. package/dist/components/ui/list-box.d.ts +5 -0
  52. package/dist/components/ui/list-box.js +24 -0
  53. package/dist/components/ui/loader.d.ts +5 -0
  54. package/dist/components/ui/loader.js +6 -0
  55. package/dist/components/ui/menu.d.ts +25 -0
  56. package/dist/components/ui/menu.js +38 -0
  57. package/dist/components/ui/popover.d.ts +4 -0
  58. package/dist/components/ui/popover.js +14 -0
  59. package/dist/components/ui/sidebar.d.ts +53 -0
  60. package/dist/components/ui/sidebar.js +177 -0
  61. package/dist/components/ui/skeleton.d.ts +1 -0
  62. package/dist/components/ui/skeleton.js +5 -0
  63. package/dist/components/ui/sonner.d.ts +4 -0
  64. package/dist/components/ui/sonner.js +14 -0
  65. package/dist/components/ui/table.d.ts +9 -0
  66. package/dist/components/ui/table.js +26 -0
  67. package/dist/components/ui/tabs.d.ts +5 -0
  68. package/dist/components/ui/tabs.js +25 -0
  69. package/dist/components/ui/timeline.d.ts +15 -0
  70. package/dist/components/ui/timeline.js +31 -0
  71. package/dist/components/ui/tooltip.d.ts +4 -0
  72. package/dist/components/ui/tooltip.js +12 -0
  73. package/dist/utils/form-context.d.ts +4 -0
  74. package/dist/utils/form-context.js +5 -0
  75. package/dist/utils/form-hook.d.ts +25 -0
  76. package/dist/utils/form-hook.js +30 -0
  77. package/dist/utils/primitives.d.ts +30 -0
  78. package/dist/utils/primitives.js +39 -0
  79. package/dist/utils/resource-names.d.ts +23 -0
  80. package/dist/utils/resource-names.js +212 -0
  81. package/dist/utils/use-mobile.d.ts +1 -0
  82. package/dist/utils/use-mobile.js +15 -0
  83. package/package.json +32 -37
  84. package/dist/components/data-table/data-table-filter.es.js +0 -132
  85. package/dist/components/data-table/data-table-filter.es.js.map +0 -1
  86. package/dist/components/data-table/data-table.es.js +0 -412
  87. package/dist/components/data-table/data-table.es.js.map +0 -1
  88. package/dist/components/data-table/table-commons.es.js +0 -136
  89. package/dist/components/data-table/table-commons.es.js.map +0 -1
  90. package/dist/components/inputs/checkbox.es.js +0 -61
  91. package/dist/components/inputs/checkbox.es.js.map +0 -1
  92. package/dist/components/inputs/date-picker.es.js +0 -124
  93. package/dist/components/inputs/date-picker.es.js.map +0 -1
  94. package/dist/components/inputs/datefield.es.js +0 -90
  95. package/dist/components/inputs/datefield.es.js.map +0 -1
  96. package/dist/components/inputs/field.es.js +0 -91
  97. package/dist/components/inputs/field.es.js.map +0 -1
  98. package/dist/components/inputs/id-search.es.js +0 -61
  99. package/dist/components/inputs/id-search.es.js.map +0 -1
  100. package/dist/components/inputs/input-otp.es.js +0 -60
  101. package/dist/components/inputs/input-otp.es.js.map +0 -1
  102. package/dist/components/inputs/multi-select.es.js +0 -47
  103. package/dist/components/inputs/multi-select.es.js.map +0 -1
  104. package/dist/components/inputs/numberfield.es.js +0 -101
  105. package/dist/components/inputs/numberfield.es.js.map +0 -1
  106. package/dist/components/inputs/searchfield.es.js +0 -80
  107. package/dist/components/inputs/searchfield.es.js.map +0 -1
  108. package/dist/components/inputs/select-options.es.js +0 -286
  109. package/dist/components/inputs/select-options.es.js.map +0 -1
  110. package/dist/components/inputs/select.es.js +0 -113
  111. package/dist/components/inputs/select.es.js.map +0 -1
  112. package/dist/components/inputs/textfield.es.js +0 -86
  113. package/dist/components/inputs/textfield.es.js.map +0 -1
  114. package/dist/components/key-value-card/key-value-card.es.js +0 -53
  115. package/dist/components/key-value-card/key-value-card.es.js.map +0 -1
  116. package/dist/components/ui/alert.es.js +0 -29
  117. package/dist/components/ui/alert.es.js.map +0 -1
  118. package/dist/components/ui/avatar.es.js +0 -19
  119. package/dist/components/ui/avatar.es.js.map +0 -1
  120. package/dist/components/ui/badge.es.js +0 -19
  121. package/dist/components/ui/badge.es.js.map +0 -1
  122. package/dist/components/ui/breadcrumbs.es.js +0 -104
  123. package/dist/components/ui/breadcrumbs.es.js.map +0 -1
  124. package/dist/components/ui/button.es.js +0 -58
  125. package/dist/components/ui/button.es.js.map +0 -1
  126. package/dist/components/ui/calendar.es.js +0 -163
  127. package/dist/components/ui/calendar.es.js.map +0 -1
  128. package/dist/components/ui/card.es.js +0 -53
  129. package/dist/components/ui/card.es.js.map +0 -1
  130. package/dist/components/ui/dialog.es.js +0 -156
  131. package/dist/components/ui/dialog.es.js.map +0 -1
  132. package/dist/components/ui/disclosure.es.js +0 -90
  133. package/dist/components/ui/disclosure.es.js.map +0 -1
  134. package/dist/components/ui/list-box.es.js +0 -76
  135. package/dist/components/ui/list-box.es.js.map +0 -1
  136. package/dist/components/ui/loader.es.js +0 -10
  137. package/dist/components/ui/loader.es.js.map +0 -1
  138. package/dist/components/ui/menu.es.js +0 -129
  139. package/dist/components/ui/menu.es.js.map +0 -1
  140. package/dist/components/ui/popover.es.js +0 -32
  141. package/dist/components/ui/popover.es.js.map +0 -1
  142. package/dist/components/ui/sidebar.es.js +0 -456
  143. package/dist/components/ui/sidebar.es.js.map +0 -1
  144. package/dist/components/ui/skeleton.es.js +0 -9
  145. package/dist/components/ui/skeleton.es.js.map +0 -1
  146. package/dist/components/ui/sonner.es.js +0 -24
  147. package/dist/components/ui/sonner.es.js.map +0 -1
  148. package/dist/components/ui/table.es.js +0 -88
  149. package/dist/components/ui/table.es.js.map +0 -1
  150. package/dist/components/ui/tabs.es.js +0 -83
  151. package/dist/components/ui/tabs.es.js.map +0 -1
  152. package/dist/components/ui/timeline.es.js +0 -46
  153. package/dist/components/ui/timeline.es.js.map +0 -1
  154. package/dist/components/ui/tooltip.es.js +0 -28
  155. package/dist/components/ui/tooltip.es.js.map +0 -1
  156. package/dist/index.es.d.ts +0 -861
  157. package/dist/index.es.js +0 -218
  158. package/dist/index.es.js.map +0 -1
  159. package/dist/utils/form-context.es.js +0 -8
  160. package/dist/utils/form-context.es.js.map +0 -1
  161. package/dist/utils/form-hook.es.js +0 -30
  162. package/dist/utils/form-hook.es.js.map +0 -1
  163. package/dist/utils/primitives.es.js +0 -31
  164. package/dist/utils/primitives.es.js.map +0 -1
  165. package/dist/utils/resource-names.es.js +0 -182
  166. package/dist/utils/resource-names.es.js.map +0 -1
  167. package/dist/utils/use-mobile.es.js +0 -17
  168. package/dist/utils/use-mobile.es.js.map +0 -1
package/package.json CHANGED
@@ -1,17 +1,16 @@
1
1
  {
2
2
  "name": "@cryptlex/web-components",
3
- "version": "5.1.1",
3
+ "version": "5.3.0",
4
4
  "description": "React component library for Cryptlex web applications",
5
5
  "author": "Cryptlex",
6
6
  "type": "module",
7
7
  "private": false,
8
- "main": "./dist/index.es.js",
9
- "module": "./dist/index.es.js",
10
- "types": "./dist/index.es.d.ts",
11
8
  "exports": {
12
- ".": {
13
- "types": "./dist/index.es.d.ts",
14
- "import": "./dist/index.es.js"
9
+ "./components/*": {
10
+ "import": "./dist/components/*"
11
+ },
12
+ "./utils/*": {
13
+ "import": "./dist/utils/*"
15
14
  },
16
15
  "./index.css": "./lib/index.css",
17
16
  "./tokens.css": "./lib/tokens.css",
@@ -21,12 +20,11 @@
21
20
  },
22
21
  "files": [
23
22
  "dist",
24
- "lib/index.css",
25
- "lib/theme.css",
26
- "lib/base.css",
27
- "lib/utilities.css",
28
- "lib/tokens.css",
29
- "lib/index.css"
23
+ "./lib/index.css",
24
+ "./lib/tokens.css",
25
+ "./lib/theme.css",
26
+ "./lib/base.css",
27
+ "./lib/utilities.css"
30
28
  ],
31
29
  "repository": {
32
30
  "type": "git",
@@ -39,10 +37,7 @@
39
37
  "design-system",
40
38
  "cryptlex"
41
39
  ],
42
- "sideEffects": [
43
- "**/*.css",
44
- "**/*.tsx"
45
- ],
40
+ "sideEffects": false,
46
41
  "publishConfig": {
47
42
  "access": "public"
48
43
  },
@@ -51,6 +46,7 @@
51
46
  "@dnd-kit/core": "6.3.1",
52
47
  "@dnd-kit/sortable": "10.0.0",
53
48
  "@dnd-kit/utilities": "3.2.2",
49
+ "@internationalized/date": "^3.8.2",
54
50
  "@tanstack/react-form": "1.6.3",
55
51
  "@tanstack/react-query": "5.62.3",
56
52
  "@tanstack/react-table": "8.20.5",
@@ -62,39 +58,38 @@
62
58
  "lucide-react": "0.453.0",
63
59
  "openapi-fetch": "0.14.0",
64
60
  "react": "^19.1.0",
65
- "react-dom": "^19.1.0",
66
61
  "react-aria-components": "1.11.0",
67
- "@internationalized/date": "^3.8.2",
62
+ "react-dom": "^19.1.0",
68
63
  "recharts": "2.15.3",
69
64
  "sonner": "1.7.0",
70
65
  "tailwindcss": "^4.0.6",
71
66
  "tw-animate-css": "1.3.0"
72
67
  },
73
68
  "devDependencies": {
74
- "@storybook/addon-docs": "^9.0.16",
75
- "@storybook/addon-links": "^9.0.16",
76
- "@storybook/addon-onboarding": "^9.0.16",
77
- "@storybook/react-vite": "^9.0.16",
78
- "@tailwindcss/vite": "^4.0.6",
79
- "@types/lodash-es": "^4.17.12",
69
+ "@storybook/addon-docs": "9.0.18",
70
+ "@storybook/addon-links": "9.0.18",
71
+ "@storybook/addon-onboarding": "9.0.18",
72
+ "@storybook/react-vite": "9.0.18",
73
+ "@tailwindcss/vite": "^4.1.11",
74
+ "@types/lodash-es": "4.17.12",
80
75
  "@types/node": "^22.7.8",
81
- "@types/react": "19.1.0",
82
- "@types/react-dom": "19.1.0",
83
- "@vitejs/plugin-react": "^4.3.2",
84
- "rollup-preserve-directives": "1.1.3",
85
- "sass": "^1.80.6",
86
- "storybook": "^9.0.16",
87
- "typescript": "^5.5.3",
88
- "typescript-eslint": "^8.7.0",
89
- "vite": "^5.4.8",
90
- "vite-plugin-dts": "^4.2.4",
76
+ "@types/react": "^19.1.0",
77
+ "@types/react-dom": "^19.1.0",
78
+ "@vitejs/plugin-react": "^4.7.0",
79
+ "sass": "1.80.6",
80
+ "storybook": "9.0.18",
81
+ "typescript": "5.8.3",
82
+ "typescript-eslint": "8.38.0",
83
+ "vite": "7.0.6",
84
+ "vite-tsconfig-paths": "^5.1.4",
91
85
  "zod": "3.25.20"
92
86
  },
93
87
  "scripts": {
94
- "build": "tsc && vite build",
88
+ "build": "tsc --project tsconfig.build.json",
95
89
  "lint": "eslint .",
96
90
  "storybook": "storybook dev -p 6006 --no-open",
97
91
  "build:storybook": "storybook build",
98
- "build:tokens": "sass --no-source-map ./lib/tokens.scss ./lib/tokens.css"
92
+ "build:tokens": "sass --no-source-map ./lib/tokens.scss ./lib/tokens.css",
93
+ "build-storybook": "storybook build"
99
94
  }
100
95
  }
@@ -1,132 +0,0 @@
1
- import { jsx as e, jsxs as s, Fragment as m } from "react/jsx-runtime";
2
- import { useDataTable as T } from "./data-table.es.js";
3
- import { SelectItem as w } from "../inputs/select.es.js";
4
- import { EasyMenu as S, MenuItem as x } from "../ui/menu.es.js";
5
- import { useResourceFormatter as O } from "../../utils/resource-names.es.js";
6
- import { Filter as R, Trash as P } from "lucide-react";
7
- import { useRef as d } from "react";
8
- import { useAppForm as q } from "../../utils/form-hook.es.js";
9
- import { TfDatePicker as D } from "../inputs/date-picker.es.js";
10
- import { TfIdSearchInput as E } from "../inputs/id-search.es.js";
11
- import { cn as N } from "../../utils/primitives.es.js";
12
- import { PopoverTrigger as $, Popover as I } from "../ui/popover.es.js";
13
- import { Button as c } from "../ui/button.es.js";
14
- const X = [
15
- "eq",
16
- "ne",
17
- "cn",
18
- "nc",
19
- "sw",
20
- "ew",
21
- "in",
22
- "nin",
23
- "gt",
24
- "gte",
25
- "lt",
26
- "lte"
27
- ], _ = {
28
- eq: "equal to",
29
- ne: "not equal to",
30
- cn: "contains",
31
- nc: "does not contain",
32
- sw: "starts with",
33
- ew: "ends with",
34
- in: "includes",
35
- nin: "does not include",
36
- gt: "greater than",
37
- gte: "greater than or equal to",
38
- lt: "less than",
39
- lte: "less than or equal to"
40
- }, h = {
41
- bool: ["eq"],
42
- enum: ["in", "nin"],
43
- id: ["in", "nin"],
44
- "id-search": ["in", "nin"],
45
- string: ["eq", "ne", "cn", "nc", "sw", "ew", "in", "nin"],
46
- date: ["lt", "gt"]
47
- };
48
- function Y({ className: f, ...g }) {
49
- const { filters: F, query: y, setFilters: v, filterConfig: o } = T();
50
- d([]);
51
- const A = d(null), p = O(), a = q({
52
- defaultValues: {
53
- // TODO, initialize with filters from tableState
54
- filters: []
55
- },
56
- onSubmit: ({ value: i }) => {
57
- v(i.filters.map((t) => ({ [t.property]: { [t.operator]: [t.value] } })));
58
- }
59
- }), u = Object.keys(o).sort();
60
- return /* @__PURE__ */ e("section", { ...g, className: N("flex gap-icon items-center", f), children: /* @__PURE__ */ s($, { onOpenChange: (i) => {
61
- var t;
62
- i ? (t = A.current) == null || t.focus() : a.handleSubmit();
63
- }, children: [
64
- /* @__PURE__ */ e(c, { active: F.length > 0, isDisabled: y.isPending || u.length === 0, type: "button", size: "icon", variant: "neutral", children: /* @__PURE__ */ e(R, {}) }),
65
- /* @__PURE__ */ e(I, { className: "w-full p-icon", children: /* @__PURE__ */ e("form", { onSubmit: (i) => {
66
- i.preventDefault();
67
- }, className: "flex flex-col gap-icon max-h-table overflow-auto ", children: /* @__PURE__ */ e(a.Field, { mode: "array", name: "filters", children: (i) => /* @__PURE__ */ s(m, { children: [
68
- i.state.value.map((t, n) => /* @__PURE__ */ s("div", { className: "flex gap-icon items-center justify-normal", children: [
69
- /* @__PURE__ */ e("span", { className: "text-sm", children: p(t.property) }),
70
- /* @__PURE__ */ e(
71
- a.AppField,
72
- {
73
- name: `filters[${n}].operator`,
74
- children: (r) => /* @__PURE__ */ e(r.TfSingleSelect, { items: h[t.type].map((l) => ({ id: l, label: /* @__PURE__ */ e(m, { children: _[l] }) })), children: (l) => /* @__PURE__ */ e(w, { id: l.id, children: l.label }) })
75
- },
76
- t.id
77
- ),
78
- t.type === "bool" && /* @__PURE__ */ e(a.AppField, { name: `filters[${n}].value`, children: (r) => /* @__PURE__ */ e(r.TfCheckbox, {}) }),
79
- t.type === "date" && /* @__PURE__ */ e(a.AppField, { name: `filters[${n}].value`, children: (r) => /* @__PURE__ */ e(D, {}) }),
80
- t.type === "id" && /* @__PURE__ */ e(a.AppField, { name: `filters[${n}].value`, children: (r) => /* @__PURE__ */ e(r.TfTextField, {}) }),
81
- t.type === "string" && /* @__PURE__ */ e(a.AppField, { name: `filters[${n}].value`, children: (r) => /* @__PURE__ */ e(r.TfTextField, {}) }),
82
- t.type === "enum" && /* @__PURE__ */ e(a.AppField, { name: `filters[${n}].value`, children: (r) => /* @__PURE__ */ e(r.TfMultiSelect, { items: o[t.property].options }) }),
83
- t.type === "id-search" && /* @__PURE__ */ e(a.AppField, { name: `filters[${n}].value`, children: (r) => /* @__PURE__ */ e(E, { multiple: !0, accessor: "id", searchFn: o[t.property].search }) }),
84
- /* @__PURE__ */ e(c, { type: "button", variant: "destructive", size: "icon", onPress: () => i.removeValue(n), children: /* @__PURE__ */ e(P, {}) })
85
- ] }, t.id)),
86
- /* @__PURE__ */ s("div", { className: "flex w-full items-center justify-end gap-2 not-first:mt-icon", children: [
87
- /* @__PURE__ */ e(S, { label: "Add Filter", children: u.map((t) => /* @__PURE__ */ e(x, { onAction: () => {
88
- const n = o[t].type, r = (b) => {
89
- switch (b) {
90
- case "bool":
91
- return !0;
92
- case "string":
93
- return "";
94
- case "date":
95
- return (/* @__PURE__ */ new Date()).toISOString();
96
- case "id":
97
- return "";
98
- case "id-search":
99
- return [];
100
- case "enum":
101
- return [];
102
- }
103
- }, l = {
104
- id: `${t}-${Date.now()}`,
105
- operator: h[n][0],
106
- value: r(n),
107
- type: n,
108
- property: t
109
- };
110
- i.pushValue(l);
111
- }, className: "dropdown-item", children: p(t) }, t)) }),
112
- i.state.value.length > 0 ? /* @__PURE__ */ e(
113
- c,
114
- {
115
- type: "button",
116
- variant: "neutral",
117
- onPress: () => {
118
- i.setValue([]);
119
- },
120
- children: "Reset filters"
121
- }
122
- ) : null
123
- ] })
124
- ] }) }) }) })
125
- ] }) });
126
- }
127
- export {
128
- _ as COMPARISON_OPERATOR_LABELS,
129
- Y as DataTableFilter,
130
- X as FILTER_COMPARISON_OPERATORS
131
- };
132
- //# sourceMappingURL=data-table-filter.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-table-filter.es.js","sources":["../../../lib/components/data-table/data-table-filter.tsx"],"sourcesContent":["import { useDataTable, type OperationKeys } from \"@/components/data-table/data-table\";\nimport { type ApiFilters } from \"@/components/data-table/table-commons\";\nimport { TfDatePicker, TfIdSearchInput, type MultiSelectProps } from \"@/components/inputs\";\nimport { SelectItem } from \"@/components/inputs/select\";\nimport { Button, Popover, PopoverTrigger, } from \"@/components/ui\";\nimport { EasyMenu, MenuItem } from \"@/components/ui/menu\";\nimport { cn, useAppForm } from \"@/utils\";\nimport { useResourceFormatter } from \"@/utils/resource-names\";\nimport type { CalendarDateTime } from \"@internationalized/date\";\nimport { Filter, Trash } from \"lucide-react\";\nimport { useRef } from \"react\";\n\nexport const FILTER_COMPARISON_OPERATORS = [\n 'eq',\n 'ne',\n 'cn',\n 'nc',\n 'sw',\n 'ew',\n 'in',\n 'nin',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n] as const;\nexport type FilterComparisonOperator =\n (typeof FILTER_COMPARISON_OPERATORS)[number];\n\nexport const COMPARISON_OPERATOR_LABELS: Record<\n FilterComparisonOperator,\n string\n> = {\n eq: 'equal to',\n ne: 'not equal to',\n cn: 'contains',\n nc: 'does not contain',\n sw: 'starts with',\n ew: 'ends with',\n in: 'includes',\n nin: 'does not include',\n gt: 'greater than',\n gte: 'greater than or equal to',\n lt: 'less than',\n lte: 'less than or equal to',\n};\n\ntype BaseLocalFilter<T extends FilterType, V> = {\n id: string;\n type: T;\n property: string;\n operator: FilterComparisonOperator;\n value: V | undefined;\n displayValue?: string;\n};\ntype EnumLocalFilter = BaseLocalFilter<'enum', Set<string | number>>;\ntype IdLocalFilter = BaseLocalFilter<'id', string>;\ntype BoolLocalFilter = BaseLocalFilter<'bool', boolean>;\ntype StringLocalFilter = BaseLocalFilter<'string', string>;\ntype DateLocalFilter = BaseLocalFilter<'date', CalendarDateTime>;\ntype IdSearchLocalFilter = BaseLocalFilter<'id-search', Set<string | number>>;\n\ntype LocalFilter = EnumLocalFilter\n | IdLocalFilter\n | BoolLocalFilter\n | StringLocalFilter\n | DateLocalFilter\n | IdSearchLocalFilter;\n\nexport type FilterConfig =\n | { type: 'enum'; options: MultiSelectProps['items'] }\n | { type: 'id-search'; search: () => Promise<{ id: string; name: string }[]> }\n | { type: 'id' }\n | { type: 'bool' }\n | { type: 'string' }\n | { type: 'date' }\n\nexport type FilterType = FilterConfig['type'];\n\nconst FilterOperations: Record<FilterType, FilterComparisonOperator[]> = {\n 'bool': ['eq'],\n 'enum': ['in', 'nin'],\n 'id': ['in', 'nin'],\n 'id-search': ['in', 'nin'],\n 'string': ['eq', 'ne', 'cn', 'nc', 'sw', 'ew', 'in', 'nin'],\n 'date': ['lt', 'gt'],\n}\n\nexport type FiltersConfig<TOperation extends OperationKeys> = Required<Record<keyof ApiFilters<TOperation>, FilterConfig>>\n\nexport function DataTableFilter({ className, ...props }: React.ComponentProps<'section'>) {\n const { filters, query, setFilters, filterConfig } = useDataTable();\n const localFilterRefs = useRef([]);\n const addFilterButtonRef = useRef<HTMLButtonElement>(null);\n\n const resourceFormatter = useResourceFormatter();\n\n const DEFAULT_VALUES: { filters: LocalFilter[] } = {\n // TODO, initialize with filters from tableState\n filters: []\n };\n const form = useAppForm({\n defaultValues: DEFAULT_VALUES,\n onSubmit: ({ value }) => {\n // TODO, instead of generic transformation, use type based tranform()\n setFilters(value.filters.map(lf => { return { [lf.property]: { [lf.operator]: [lf.value] } } }))\n }\n })\n\n // More reason to hate TS https://github.com/Microsoft/TypeScript/issues/12870\n const filterKeys = Object.keys(filterConfig).sort();\n\n return (\n <section {...props} className={cn(\"flex gap-icon items-center\", className)}>\n <PopoverTrigger onOpenChange={(o) => {\n // Set filters when the popover closes\n if (!o) {\n form.handleSubmit();\n } else {\n addFilterButtonRef.current?.focus();\n }\n }}>\n <Button active={filters.length > 0} isDisabled={query.isPending || filterKeys.length === 0} type=\"button\" size={'icon'} variant={'neutral'}><Filter /></Button>\n {/* TODO, icon maps with dynamic imports? */}\n {/* TODO open popover with form for property specific filter */}\n {/* TODO, icons here??? */}\n <Popover className=\"w-full p-icon\">\n {/* const h3Styles = \"body mb-icon text-muted-foreground\"; */}\n {/* <h3 className={h3Styles}>{isFiltersActive ? \"Active filters\" : \"Add filters\"}</h3> */}\n <form onSubmit={(e) => { e.preventDefault(); }} className=\"flex flex-col gap-icon max-h-table overflow-auto \">\n <form.Field mode=\"array\" name={\"filters\"}>\n {\n (field) => {\n return <>\n {field.state.value.map((lf, i) => {\n return (\n <div key={lf.id} className=\"flex gap-icon items-center justify-normal\">\n <span className=\"text-sm\">{resourceFormatter(lf.property)}</span>\n <form.AppField\n key={lf.id}\n name={`filters[${i}].operator`}\n >\n {(sf) => (<sf.TfSingleSelect items={FilterOperations[lf.type].map(op => ({ id: op, label: <>{COMPARISON_OPERATOR_LABELS[op]}</> }))}>{(operator) => <SelectItem id={operator.id}>{operator.label}</SelectItem>}</sf.TfSingleSelect>)}\n </form.AppField>\n\n {lf.type === 'bool' && <form.AppField name={`filters[${i}].value`}>{(sf) => (<sf.TfCheckbox />)}</form.AppField>}\n {lf.type === 'date' && <form.AppField name={`filters[${i}].value`}>{(_) => (<TfDatePicker />)}</form.AppField>}\n {lf.type === 'id' && <form.AppField name={`filters[${i}].value`}>{(sf) => (<sf.TfTextField />)}</form.AppField>}\n {lf.type === 'string' && <form.AppField name={`filters[${i}].value`}>{(sf) => (<sf.TfTextField />)}</form.AppField>}\n {lf.type === 'enum' && <form.AppField name={`filters[${i}].value`}>{(sf) => (<sf.TfMultiSelect items={filterConfig[lf.property].options} />)}</form.AppField>}\n {lf.type === 'id-search' && <form.AppField name={`filters[${i}].value`}>{(_) => (<TfIdSearchInput multiple accessor=\"id\" searchFn={filterConfig[lf.property].search} />)}</form.AppField>}\n\n <Button type=\"button\" variant=\"destructive\" size=\"icon\" onPress={() => field.removeValue(i)}><Trash /></Button>\n </div>\n )\n })}\n <div className=\"flex w-full items-center justify-end gap-2 not-first:mt-icon\">\n <EasyMenu label=\"Add Filter\">\n {filterKeys.map(k => <MenuItem key={k} onAction={() => {\n const type = filterConfig[k].type as FilterType;\n\n const defaultValue = (t: FilterType) => {\n // TODO, ensure exhaustive???\n switch (t) {\n case 'bool':\n return true;\n case 'string':\n return '';\n case 'date':\n return new Date().toISOString();\n case 'id':\n return '';\n case 'id-search':\n return [] as string[];\n case 'enum':\n return [] as string[];\n }\n }\n\n const newFilter: LocalFilter = {\n id: `${k}-${Date.now()}`,\n operator: FilterOperations[type][0],\n value: defaultValue(type),\n type: type,\n property: k,\n };\n\n field.pushValue(newFilter);\n // TODO Focus to ref\n\n }} className=\"dropdown-item\">{resourceFormatter(k)}</MenuItem>)}\n </EasyMenu>\n {field.state.value.length > 0 ? (\n <Button\n type=\"button\"\n variant=\"neutral\"\n onPress={() => { field.setValue([]) }}\n >\n Reset filters\n </Button>\n ) : null}\n </div>\n </>\n }\n }\n </form.Field >\n </form>\n </Popover>\n </PopoverTrigger>\n </section>\n );\n};"],"names":["FILTER_COMPARISON_OPERATORS","COMPARISON_OPERATOR_LABELS","FilterOperations","DataTableFilter","className","props","filters","query","setFilters","filterConfig","useDataTable","useRef","addFilterButtonRef","resourceFormatter","useResourceFormatter","form","useAppForm","value","lf","filterKeys","jsx","cn","jsxs","PopoverTrigger","o","_a","Button","Filter","Popover","e","field","Fragment","i","sf","op","operator","SelectItem","_","TfDatePicker","TfIdSearchInput","Trash","EasyMenu","k","MenuItem","type","defaultValue","t","newFilter"],"mappings":"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"}