@coreui/data-grid 0.1.0-rc.0 → 0.2.0-rc.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 (137) hide show
  1. package/README.md +5 -4
  2. package/dist/css/data-grid.css +149 -31
  3. package/dist/css/data-grid.css.map +1 -1
  4. package/dist/css/data-grid.min.css +2 -2
  5. package/dist/css/data-grid.min.css.map +1 -1
  6. package/dist/js/clipboard.cjs +56 -0
  7. package/dist/js/clipboard.cjs.map +1 -0
  8. package/dist/js/clipboard.mjs +54 -0
  9. package/dist/js/clipboard.mjs.map +1 -0
  10. package/dist/js/csv.cjs +36 -59
  11. package/dist/js/csv.cjs.map +1 -1
  12. package/dist/js/csv.mjs +35 -55
  13. package/dist/js/csv.mjs.map +1 -1
  14. package/dist/js/data-grid.esm.js +14078 -9332
  15. package/dist/js/data-grid.esm.js.map +1 -1
  16. package/dist/js/data-grid.esm.min.js +6 -6
  17. package/dist/js/data-grid.esm.min.js.map +1 -1
  18. package/dist/js/data-grid.js +14377 -9634
  19. package/dist/js/data-grid.js.map +1 -1
  20. package/dist/js/data-grid.lite.esm.js +10476 -0
  21. package/dist/js/data-grid.lite.esm.js.map +1 -0
  22. package/dist/js/data-grid.lite.esm.min.js +8 -0
  23. package/dist/js/data-grid.lite.esm.min.js.map +1 -0
  24. package/dist/js/data-grid.lite.js +10489 -0
  25. package/dist/js/data-grid.lite.js.map +1 -0
  26. package/dist/js/data-grid.lite.min.js +8 -0
  27. package/dist/js/data-grid.lite.min.js.map +1 -0
  28. package/dist/js/data-grid.lite.mjs +10476 -0
  29. package/dist/js/data-grid.lite.mjs.map +1 -0
  30. package/dist/js/data-grid.min.js +6 -6
  31. package/dist/js/data-grid.min.js.map +1 -1
  32. package/dist/js/data-grid.mjs +14078 -9332
  33. package/dist/js/data-grid.mjs.map +1 -1
  34. package/dist/js/drag.cjs +459 -0
  35. package/dist/js/drag.cjs.map +1 -0
  36. package/dist/js/drag.mjs +456 -0
  37. package/dist/js/drag.mjs.map +1 -0
  38. package/dist/js/export-table-CNAKStzj.mjs +26 -0
  39. package/dist/js/export-table-CNAKStzj.mjs.map +1 -0
  40. package/dist/js/export-table-doIwvE5U.cjs +55 -0
  41. package/dist/js/export-table-doIwvE5U.cjs.map +1 -0
  42. package/dist/js/filters.cjs +89 -132
  43. package/dist/js/filters.cjs.map +1 -1
  44. package/dist/js/filters.mjs +88 -128
  45. package/dist/js/filters.mjs.map +1 -1
  46. package/dist/js/labels.cjs +65 -70
  47. package/dist/js/labels.cjs.map +1 -1
  48. package/dist/js/labels.mjs +64 -66
  49. package/dist/js/labels.mjs.map +1 -1
  50. package/dist/js/print.cjs +66 -0
  51. package/dist/js/print.cjs.map +1 -0
  52. package/dist/js/print.mjs +64 -0
  53. package/dist/js/print.mjs.map +1 -0
  54. package/dist/js/validate.cjs +43 -0
  55. package/dist/js/validate.cjs.map +1 -0
  56. package/dist/js/validate.mjs +42 -0
  57. package/dist/js/validate.mjs.map +1 -0
  58. package/dist/js/xlsx.cjs +240 -0
  59. package/dist/js/xlsx.cjs.map +1 -0
  60. package/dist/js/xlsx.mjs +238 -0
  61. package/dist/js/xlsx.mjs.map +1 -0
  62. package/dist/types/base-component.d.ts +28 -18
  63. package/dist/types/data-grid.d.ts +26 -13
  64. package/dist/types/dom/data.d.ts +15 -0
  65. package/dist/types/dom/event-handler.d.ts +21 -10
  66. package/dist/types/dom/manipulator.d.ts +15 -8
  67. package/dist/types/engine/data-source.d.ts +1 -1
  68. package/dist/types/engine/features-lite.d.ts +25 -0
  69. package/dist/types/engine/features.d.ts +35 -0
  70. package/dist/types/engine/table.d.ts +3 -3
  71. package/dist/types/engine/validate.d.mts +1 -0
  72. package/dist/types/engine/validate.d.ts +20 -0
  73. package/dist/types/engine/virtualizer.d.ts +2 -0
  74. package/dist/types/icons.d.ts +6 -4
  75. package/dist/types/index-lite.d.mts +1 -0
  76. package/dist/types/index-lite.d.ts +19 -0
  77. package/dist/types/index.d.ts +11 -2
  78. package/dist/types/types.d.ts +53 -31
  79. package/dist/types/ui/body.d.ts +6 -3
  80. package/dist/types/ui/header.d.ts +3 -2
  81. package/dist/types/ui/loading.d.ts +1 -1
  82. package/dist/types/ui/pinning.d.ts +1 -1
  83. package/dist/types/ui/toolbar.d.ts +10 -2
  84. package/dist/types/util/clipboard.d.mts +1 -0
  85. package/dist/types/util/clipboard.d.ts +29 -0
  86. package/dist/types/util/config.d.ts +27 -10
  87. package/dist/types/util/csv.d.ts +5 -5
  88. package/dist/types/util/drag.d.mts +1 -0
  89. package/dist/types/util/drag.d.ts +48 -0
  90. package/dist/types/util/export-table.d.ts +47 -0
  91. package/dist/types/util/index.d.ts +66 -10
  92. package/dist/types/util/print.d.mts +1 -0
  93. package/dist/types/util/print.d.ts +32 -0
  94. package/dist/types/util/sanitizer.d.ts +15 -11
  95. package/dist/types/util/xlsx.d.mts +1 -0
  96. package/dist/types/util/xlsx.d.ts +17 -0
  97. package/dist/types/util/zip.d.ts +11 -0
  98. package/package.json +88 -10
  99. package/scss/data-grid.scss +204 -16
  100. package/src/{base-component.js → base-component.ts} +21 -17
  101. package/src/data-grid.ts +507 -200
  102. package/src/dom/{data.js → data.ts} +13 -10
  103. package/src/dom/event-handler.ts +380 -0
  104. package/src/dom/{manipulator.js → manipulator.ts} +11 -11
  105. package/src/engine/data-source.ts +7 -3
  106. package/src/engine/features-lite.ts +47 -0
  107. package/src/engine/features.ts +68 -0
  108. package/src/engine/table.ts +80 -47
  109. package/src/engine/validate.ts +64 -0
  110. package/src/engine/virtualizer.ts +17 -1
  111. package/src/icons.ts +11 -5
  112. package/src/index-lite.ts +85 -0
  113. package/src/index.ts +30 -2
  114. package/src/labels.ts +6 -4
  115. package/src/types.ts +87 -32
  116. package/src/ui/body.ts +73 -17
  117. package/src/ui/header.ts +51 -26
  118. package/src/ui/loading.ts +2 -2
  119. package/src/ui/pinning.ts +16 -16
  120. package/src/ui/toolbar.ts +27 -3
  121. package/src/util/clipboard.ts +112 -0
  122. package/src/util/{config.js → config.ts} +25 -11
  123. package/src/util/csv.ts +11 -30
  124. package/src/util/drag.ts +798 -0
  125. package/src/util/export-table.ts +86 -0
  126. package/src/util/{index.js → index.ts} +55 -35
  127. package/src/util/print.ts +125 -0
  128. package/src/util/{sanitizer.js → sanitizer.ts} +17 -13
  129. package/src/util/xlsx.ts +183 -0
  130. package/src/util/zip.ts +170 -0
  131. package/src/base-component.d.ts +0 -19
  132. package/src/dom/event-handler.d.ts +0 -11
  133. package/src/dom/event-handler.js +0 -331
  134. package/src/dom/manipulator.d.ts +0 -9
  135. package/src/util/config.d.ts +0 -11
  136. package/src/util/index.d.ts +0 -10
  137. package/src/util/sanitizer.d.ts +0 -11
@@ -1,143 +1,100 @@
1
1
  /*!
2
- * CoreUI PRO data-grid v0.1.0-rc.0 (https://coreui.io)
3
- * Copyright 2026 The CoreUI Team (https://github.com/orgs/coreui/people)
4
- * License (https://coreui.io/pro/license/)
5
- */
6
- 'use strict';
7
-
8
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
9
-
10
- /**
11
- * --------------------------------------------------------------------------
12
- * CoreUI PRO data-grid filters.ts
13
- * License (https://coreui.io/pro/license/)
14
- * --------------------------------------------------------------------------
15
- * Pure filter-operator logic, built as the dependency-free
16
- * `@coreui/data-grid/filters` subpath so the framework bindings share one
17
- * implementation without pulling in the vanilla component runtime.
18
- */
2
+ * CoreUI PRO data-grid v0.2.0-rc.0 (https://coreui.io)
3
+ * Copyright 2026 The CoreUI Team (https://github.com/orgs/coreui/people)
4
+ * License (https://coreui.io/pro/license/)
5
+ */
6
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
+ //#region src/filters.ts
19
8
  const FILTER_OPERATORS = {
20
- text: ['contains', 'notContains', 'equals', 'notEquals', 'startsWith', 'endsWith', 'blank', 'notBlank'],
21
- number: [
22
- 'equals',
23
- 'notEquals',
24
- 'greaterThan',
25
- 'greaterThanOrEqual',
26
- 'lessThan',
27
- 'lessThanOrEqual',
28
- 'between',
29
- 'blank',
30
- 'notBlank'
31
- ],
32
- date: [
33
- 'equals',
34
- 'notEquals',
35
- 'greaterThan',
36
- 'greaterThanOrEqual',
37
- 'lessThan',
38
- 'lessThanOrEqual',
39
- 'between',
40
- 'blank',
41
- 'notBlank'
42
- ]
9
+ text: [
10
+ "contains",
11
+ "notContains",
12
+ "equals",
13
+ "notEquals",
14
+ "startsWith",
15
+ "endsWith",
16
+ "blank",
17
+ "notBlank"
18
+ ],
19
+ number: [
20
+ "equals",
21
+ "notEquals",
22
+ "greaterThan",
23
+ "greaterThanOrEqual",
24
+ "lessThan",
25
+ "lessThanOrEqual",
26
+ "between",
27
+ "blank",
28
+ "notBlank"
29
+ ],
30
+ date: [
31
+ "equals",
32
+ "notEquals",
33
+ "greaterThan",
34
+ "greaterThanOrEqual",
35
+ "lessThan",
36
+ "lessThanOrEqual",
37
+ "between",
38
+ "blank",
39
+ "notBlank"
40
+ ]
43
41
  };
44
- const VALUELESS_OPERATORS = new Set(['blank', 'notBlank']);
45
- const isBlank = (value) => value === null || value === undefined || String(value).trim() === '';
42
+ const VALUELESS_OPERATORS = /* @__PURE__ */ new Set(["blank", "notBlank"]);
43
+ const isBlank = (value) => value === null || value === void 0 || String(value).trim() === "";
46
44
  const toComparable = (value, filterType) => {
47
- if (filterType === 'date') {
48
- const time = value instanceof Date ? value.getTime() : new Date(String(value)).getTime();
49
- return Number.isNaN(time) ? null : time;
50
- }
51
- const numeric = typeof value === 'number' ? value : Number(value);
52
- return Number.isFinite(numeric) ? numeric : null;
45
+ if (filterType === "date") {
46
+ const time = value instanceof Date ? value.getTime() : new Date(String(value)).getTime();
47
+ return Number.isNaN(time) ? null : time;
48
+ }
49
+ const numeric = typeof value === "number" ? value : Number(value);
50
+ return Number.isFinite(numeric) ? numeric : null;
53
51
  };
54
52
  const evaluateCondition = (cellValue, condition, filterType) => {
55
- const { operator } = condition;
56
- if (operator === 'blank') {
57
- return isBlank(cellValue);
58
- }
59
- if (operator === 'notBlank') {
60
- return !isBlank(cellValue);
61
- }
62
- // A condition without a value filters nothing (the menu treats it as
63
- // incomplete rather than matching nothing).
64
- if (isBlank(condition.value)) {
65
- return true;
66
- }
67
- if (filterType === 'number' || filterType === 'date') {
68
- const cell = toComparable(cellValue, filterType);
69
- const bound = toComparable(condition.value, filterType);
70
- if (cell === null || bound === null) {
71
- return false;
72
- }
73
- switch (operator) {
74
- case 'equals': {
75
- return cell === bound;
76
- }
77
- case 'notEquals': {
78
- return cell !== bound;
79
- }
80
- case 'greaterThan': {
81
- return cell > bound;
82
- }
83
- case 'greaterThanOrEqual': {
84
- return cell >= bound;
85
- }
86
- case 'lessThan': {
87
- return cell < bound;
88
- }
89
- case 'lessThanOrEqual': {
90
- return cell <= bound;
91
- }
92
- case 'between': {
93
- const upper = toComparable(condition.value2, filterType);
94
- return upper === null ? cell >= bound : cell >= bound && cell <= upper;
95
- }
96
- default: {
97
- return false;
98
- }
99
- }
100
- }
101
- const cell = String(cellValue !== null && cellValue !== void 0 ? cellValue : '').toLowerCase();
102
- const needle = String(condition.value).toLowerCase();
103
- switch (operator) {
104
- case 'contains': {
105
- return cell.includes(needle);
106
- }
107
- case 'notContains': {
108
- return !cell.includes(needle);
109
- }
110
- case 'equals': {
111
- return cell === needle;
112
- }
113
- case 'notEquals': {
114
- return cell !== needle;
115
- }
116
- case 'startsWith': {
117
- return cell.startsWith(needle);
118
- }
119
- case 'endsWith': {
120
- return cell.endsWith(needle);
121
- }
122
- default: {
123
- return false;
124
- }
125
- }
53
+ const { operator } = condition;
54
+ if (operator === "blank") return isBlank(cellValue);
55
+ if (operator === "notBlank") return !isBlank(cellValue);
56
+ if (isBlank(condition.value)) return true;
57
+ if (filterType === "number" || filterType === "date") {
58
+ const cell = toComparable(cellValue, filterType);
59
+ const bound = toComparable(condition.value, filterType);
60
+ if (cell === null || bound === null) return false;
61
+ switch (operator) {
62
+ case "equals": return cell === bound;
63
+ case "notEquals": return cell !== bound;
64
+ case "greaterThan": return cell > bound;
65
+ case "greaterThanOrEqual": return cell >= bound;
66
+ case "lessThan": return cell < bound;
67
+ case "lessThanOrEqual": return cell <= bound;
68
+ case "between": {
69
+ const upper = toComparable(condition.value2, filterType);
70
+ return upper === null ? cell >= bound : cell >= bound && cell <= upper;
71
+ }
72
+ default: return false;
73
+ }
74
+ }
75
+ const cell = String(cellValue ?? "").toLowerCase();
76
+ const needle = String(condition.value).toLowerCase();
77
+ switch (operator) {
78
+ case "contains": return cell.includes(needle);
79
+ case "notContains": return !cell.includes(needle);
80
+ case "equals": return cell === needle;
81
+ case "notEquals": return cell !== needle;
82
+ case "startsWith": return cell.startsWith(needle);
83
+ case "endsWith": return cell.endsWith(needle);
84
+ default: return false;
85
+ }
126
86
  };
127
- const evaluateColumnFilter = (cellValue, filterValue, filterType = 'text') => {
128
- if (typeof filterValue === 'string') {
129
- return String(cellValue !== null && cellValue !== void 0 ? cellValue : '')
130
- .toLowerCase()
131
- .includes(filterValue.toLowerCase());
132
- }
133
- if ('conditions' in filterValue) {
134
- const results = filterValue.conditions.map(condition => evaluateCondition(cellValue, condition, filterType));
135
- return filterValue.join === 'or' ? results.some(Boolean) : results.every(Boolean);
136
- }
137
- return filterValue.value.some(candidate => String(candidate) === String(cellValue));
87
+ const evaluateColumnFilter = (cellValue, filterValue, filterType = "text") => {
88
+ if (typeof filterValue === "string") return String(cellValue ?? "").toLowerCase().includes(filterValue.toLowerCase());
89
+ if ("conditions" in filterValue) {
90
+ const results = filterValue.conditions.map((condition) => evaluateCondition(cellValue, condition, filterType));
91
+ return filterValue.join === "or" ? results.some(Boolean) : results.every(Boolean);
92
+ }
93
+ return filterValue.value.some((candidate) => String(candidate) === String(cellValue));
138
94
  };
139
-
95
+ //#endregion
140
96
  exports.FILTER_OPERATORS = FILTER_OPERATORS;
141
97
  exports.VALUELESS_OPERATORS = VALUELESS_OPERATORS;
142
98
  exports.evaluateColumnFilter = evaluateColumnFilter;
143
- //# sourceMappingURL=filters.cjs.map
99
+
100
+ //# sourceMappingURL=filters.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"filters.cjs","sources":["../../src/filters.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filters.cjs","names":[],"sources":["../../src/filters.ts"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * CoreUI PRO data-grid filters.ts\n * License (https://coreui.io/pro/license/)\n * --------------------------------------------------------------------------\n * Pure filter-operator logic, built as the dependency-free\n * `@coreui/data-grid/filters` subpath so the framework bindings share one\n * implementation without pulling in the vanilla component runtime.\n */\n\nimport type {\n DataGridColumnFilterValue,\n DataGridFilterCondition,\n DataGridFilterOperator,\n DataGridFilterType\n} from './types'\n\nexport const FILTER_OPERATORS: Record<Exclude<DataGridFilterType, 'select'>, DataGridFilterOperator[]> = {\n text: ['contains', 'notContains', 'equals', 'notEquals', 'startsWith', 'endsWith', 'blank', 'notBlank'],\n number: [\n 'equals',\n 'notEquals',\n 'greaterThan',\n 'greaterThanOrEqual',\n 'lessThan',\n 'lessThanOrEqual',\n 'between',\n 'blank',\n 'notBlank'\n ],\n date: [\n 'equals',\n 'notEquals',\n 'greaterThan',\n 'greaterThanOrEqual',\n 'lessThan',\n 'lessThanOrEqual',\n 'between',\n 'blank',\n 'notBlank'\n ]\n}\n\nexport const VALUELESS_OPERATORS: ReadonlySet<DataGridFilterOperator> = new Set(['blank', 'notBlank'])\n\nconst isBlank = (value: unknown): boolean =>\n value === null || value === undefined || String(value).trim() === ''\n\nconst toComparable = (value: unknown, filterType: DataGridFilterType): number | null => {\n if (filterType === 'date') {\n const time = value instanceof Date ? value.getTime() : new Date(String(value)).getTime()\n return Number.isNaN(time) ? null : time\n }\n\n const numeric = typeof value === 'number' ? value : Number(value)\n return Number.isFinite(numeric) ? numeric : null\n}\n\nconst evaluateCondition = (\n cellValue: unknown,\n condition: DataGridFilterCondition,\n filterType: DataGridFilterType\n): boolean => {\n const { operator } = condition\n\n if (operator === 'blank') {\n return isBlank(cellValue)\n }\n\n if (operator === 'notBlank') {\n return !isBlank(cellValue)\n }\n\n // A condition without a value filters nothing (the menu treats it as\n // incomplete rather than matching nothing).\n if (isBlank(condition.value)) {\n return true\n }\n\n if (filterType === 'number' || filterType === 'date') {\n const cell = toComparable(cellValue, filterType)\n const bound = toComparable(condition.value, filterType)\n if (cell === null || bound === null) {\n return false\n }\n\n switch (operator) {\n case 'equals': {\n return cell === bound\n }\n\n case 'notEquals': {\n return cell !== bound\n }\n\n case 'greaterThan': {\n return cell > bound\n }\n\n case 'greaterThanOrEqual': {\n return cell >= bound\n }\n\n case 'lessThan': {\n return cell < bound\n }\n\n case 'lessThanOrEqual': {\n return cell <= bound\n }\n\n case 'between': {\n const upper = toComparable(condition.value2, filterType)\n return upper === null ? cell >= bound : cell >= bound && cell <= upper\n }\n\n default: {\n return false\n }\n }\n }\n\n const cell = String(cellValue ?? '').toLowerCase()\n const needle = String(condition.value).toLowerCase()\n\n switch (operator) {\n case 'contains': {\n return cell.includes(needle)\n }\n\n case 'notContains': {\n return !cell.includes(needle)\n }\n\n case 'equals': {\n return cell === needle\n }\n\n case 'notEquals': {\n return cell !== needle\n }\n\n case 'startsWith': {\n return cell.startsWith(needle)\n }\n\n case 'endsWith': {\n return cell.endsWith(needle)\n }\n\n default: {\n return false\n }\n }\n}\n\nexport const evaluateColumnFilter = (\n cellValue: unknown,\n filterValue: DataGridColumnFilterValue,\n filterType: DataGridFilterType = 'text'\n): boolean => {\n if (typeof filterValue === 'string') {\n return String(cellValue ?? '')\n .toLowerCase()\n .includes(filterValue.toLowerCase())\n }\n\n if ('conditions' in filterValue) {\n const results = filterValue.conditions.map(condition =>\n evaluateCondition(cellValue, condition, filterType)\n )\n return filterValue.join === 'or' ? results.some(Boolean) : results.every(Boolean)\n }\n\n return filterValue.value.some(candidate => String(candidate) === String(cellValue))\n}\n"],"mappings":";;;;;;;AAiBA,MAAa,mBAA4F;CACvG,MAAM;EAAC;EAAY;EAAe;EAAU;EAAa;EAAc;EAAY;EAAS;CAAU;CACtG,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;AAEA,MAAa,sCAA2D,IAAI,IAAI,CAAC,SAAS,UAAU,CAAC;AAErG,MAAM,WAAW,UACf,UAAU,QAAQ,UAAU,KAAA,KAAa,OAAO,KAAK,CAAC,CAAC,KAAK,MAAM;AAEpE,MAAM,gBAAgB,OAAgB,eAAkD;CACtF,IAAI,eAAe,QAAQ;EACzB,MAAM,OAAO,iBAAiB,OAAO,MAAM,QAAQ,IAAI,IAAI,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ;EACvF,OAAO,OAAO,MAAM,IAAI,IAAI,OAAO;CACrC;CAEA,MAAM,UAAU,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;CAChE,OAAO,OAAO,SAAS,OAAO,IAAI,UAAU;AAC9C;AAEA,MAAM,qBACJ,WACA,WACA,eACY;CACZ,MAAM,EAAE,aAAa;CAErB,IAAI,aAAa,SACf,OAAO,QAAQ,SAAS;CAG1B,IAAI,aAAa,YACf,OAAO,CAAC,QAAQ,SAAS;CAK3B,IAAI,QAAQ,UAAU,KAAK,GACzB,OAAO;CAGT,IAAI,eAAe,YAAY,eAAe,QAAQ;EACpD,MAAM,OAAO,aAAa,WAAW,UAAU;EAC/C,MAAM,QAAQ,aAAa,UAAU,OAAO,UAAU;EACtD,IAAI,SAAS,QAAQ,UAAU,MAC7B,OAAO;EAGT,QAAQ,UAAR;GACE,KAAK,UACH,OAAO,SAAS;GAGlB,KAAK,aACH,OAAO,SAAS;GAGlB,KAAK,eACH,OAAO,OAAO;GAGhB,KAAK,sBACH,OAAO,QAAQ;GAGjB,KAAK,YACH,OAAO,OAAO;GAGhB,KAAK,mBACH,OAAO,QAAQ;GAGjB,KAAK,WAAW;IACd,MAAM,QAAQ,aAAa,UAAU,QAAQ,UAAU;IACvD,OAAO,UAAU,OAAO,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;GACnE;GAEA,SACE,OAAO;EAEX;CACF;CAEA,MAAM,OAAO,OAAO,aAAa,EAAE,CAAC,CAAC,YAAY;CACjD,MAAM,SAAS,OAAO,UAAU,KAAK,CAAC,CAAC,YAAY;CAEnD,QAAQ,UAAR;EACE,KAAK,YACH,OAAO,KAAK,SAAS,MAAM;EAG7B,KAAK,eACH,OAAO,CAAC,KAAK,SAAS,MAAM;EAG9B,KAAK,UACH,OAAO,SAAS;EAGlB,KAAK,aACH,OAAO,SAAS;EAGlB,KAAK,cACH,OAAO,KAAK,WAAW,MAAM;EAG/B,KAAK,YACH,OAAO,KAAK,SAAS,MAAM;EAG7B,SACE,OAAO;CAEX;AACF;AAEA,MAAa,wBACX,WACA,aACA,aAAiC,WACrB;CACZ,IAAI,OAAO,gBAAgB,UACzB,OAAO,OAAO,aAAa,EAAE,CAAC,CAC3B,YAAY,CAAC,CACb,SAAS,YAAY,YAAY,CAAC;CAGvC,IAAI,gBAAgB,aAAa;EAC/B,MAAM,UAAU,YAAY,WAAW,KAAI,cACzC,kBAAkB,WAAW,WAAW,UAAU,CACpD;EACA,OAAO,YAAY,SAAS,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,MAAM,OAAO;CAClF;CAEA,OAAO,YAAY,MAAM,MAAK,cAAa,OAAO,SAAS,MAAM,OAAO,SAAS,CAAC;AACpF"}
@@ -1,137 +1,97 @@
1
1
  /*!
2
- * CoreUI PRO data-grid v0.1.0-rc.0 (https://coreui.io)
3
- * Copyright 2026 The CoreUI Team (https://github.com/orgs/coreui/people)
4
- * License (https://coreui.io/pro/license/)
5
- */
6
- /**
7
- * --------------------------------------------------------------------------
8
- * CoreUI PRO data-grid filters.ts
9
- * License (https://coreui.io/pro/license/)
10
- * --------------------------------------------------------------------------
11
- * Pure filter-operator logic, built as the dependency-free
12
- * `@coreui/data-grid/filters` subpath so the framework bindings share one
13
- * implementation without pulling in the vanilla component runtime.
14
- */
2
+ * CoreUI PRO data-grid v0.2.0-rc.0 (https://coreui.io)
3
+ * Copyright 2026 The CoreUI Team (https://github.com/orgs/coreui/people)
4
+ * License (https://coreui.io/pro/license/)
5
+ */
6
+ //#region src/filters.ts
15
7
  const FILTER_OPERATORS = {
16
- text: ['contains', 'notContains', 'equals', 'notEquals', 'startsWith', 'endsWith', 'blank', 'notBlank'],
17
- number: [
18
- 'equals',
19
- 'notEquals',
20
- 'greaterThan',
21
- 'greaterThanOrEqual',
22
- 'lessThan',
23
- 'lessThanOrEqual',
24
- 'between',
25
- 'blank',
26
- 'notBlank'
27
- ],
28
- date: [
29
- 'equals',
30
- 'notEquals',
31
- 'greaterThan',
32
- 'greaterThanOrEqual',
33
- 'lessThan',
34
- 'lessThanOrEqual',
35
- 'between',
36
- 'blank',
37
- 'notBlank'
38
- ]
8
+ text: [
9
+ "contains",
10
+ "notContains",
11
+ "equals",
12
+ "notEquals",
13
+ "startsWith",
14
+ "endsWith",
15
+ "blank",
16
+ "notBlank"
17
+ ],
18
+ number: [
19
+ "equals",
20
+ "notEquals",
21
+ "greaterThan",
22
+ "greaterThanOrEqual",
23
+ "lessThan",
24
+ "lessThanOrEqual",
25
+ "between",
26
+ "blank",
27
+ "notBlank"
28
+ ],
29
+ date: [
30
+ "equals",
31
+ "notEquals",
32
+ "greaterThan",
33
+ "greaterThanOrEqual",
34
+ "lessThan",
35
+ "lessThanOrEqual",
36
+ "between",
37
+ "blank",
38
+ "notBlank"
39
+ ]
39
40
  };
40
- const VALUELESS_OPERATORS = new Set(['blank', 'notBlank']);
41
- const isBlank = (value) => value === null || value === undefined || String(value).trim() === '';
41
+ const VALUELESS_OPERATORS = /* @__PURE__ */ new Set(["blank", "notBlank"]);
42
+ const isBlank = (value) => value === null || value === void 0 || String(value).trim() === "";
42
43
  const toComparable = (value, filterType) => {
43
- if (filterType === 'date') {
44
- const time = value instanceof Date ? value.getTime() : new Date(String(value)).getTime();
45
- return Number.isNaN(time) ? null : time;
46
- }
47
- const numeric = typeof value === 'number' ? value : Number(value);
48
- return Number.isFinite(numeric) ? numeric : null;
44
+ if (filterType === "date") {
45
+ const time = value instanceof Date ? value.getTime() : new Date(String(value)).getTime();
46
+ return Number.isNaN(time) ? null : time;
47
+ }
48
+ const numeric = typeof value === "number" ? value : Number(value);
49
+ return Number.isFinite(numeric) ? numeric : null;
49
50
  };
50
51
  const evaluateCondition = (cellValue, condition, filterType) => {
51
- const { operator } = condition;
52
- if (operator === 'blank') {
53
- return isBlank(cellValue);
54
- }
55
- if (operator === 'notBlank') {
56
- return !isBlank(cellValue);
57
- }
58
- // A condition without a value filters nothing (the menu treats it as
59
- // incomplete rather than matching nothing).
60
- if (isBlank(condition.value)) {
61
- return true;
62
- }
63
- if (filterType === 'number' || filterType === 'date') {
64
- const cell = toComparable(cellValue, filterType);
65
- const bound = toComparable(condition.value, filterType);
66
- if (cell === null || bound === null) {
67
- return false;
68
- }
69
- switch (operator) {
70
- case 'equals': {
71
- return cell === bound;
72
- }
73
- case 'notEquals': {
74
- return cell !== bound;
75
- }
76
- case 'greaterThan': {
77
- return cell > bound;
78
- }
79
- case 'greaterThanOrEqual': {
80
- return cell >= bound;
81
- }
82
- case 'lessThan': {
83
- return cell < bound;
84
- }
85
- case 'lessThanOrEqual': {
86
- return cell <= bound;
87
- }
88
- case 'between': {
89
- const upper = toComparable(condition.value2, filterType);
90
- return upper === null ? cell >= bound : cell >= bound && cell <= upper;
91
- }
92
- default: {
93
- return false;
94
- }
95
- }
96
- }
97
- const cell = String(cellValue !== null && cellValue !== void 0 ? cellValue : '').toLowerCase();
98
- const needle = String(condition.value).toLowerCase();
99
- switch (operator) {
100
- case 'contains': {
101
- return cell.includes(needle);
102
- }
103
- case 'notContains': {
104
- return !cell.includes(needle);
105
- }
106
- case 'equals': {
107
- return cell === needle;
108
- }
109
- case 'notEquals': {
110
- return cell !== needle;
111
- }
112
- case 'startsWith': {
113
- return cell.startsWith(needle);
114
- }
115
- case 'endsWith': {
116
- return cell.endsWith(needle);
117
- }
118
- default: {
119
- return false;
120
- }
121
- }
52
+ const { operator } = condition;
53
+ if (operator === "blank") return isBlank(cellValue);
54
+ if (operator === "notBlank") return !isBlank(cellValue);
55
+ if (isBlank(condition.value)) return true;
56
+ if (filterType === "number" || filterType === "date") {
57
+ const cell = toComparable(cellValue, filterType);
58
+ const bound = toComparable(condition.value, filterType);
59
+ if (cell === null || bound === null) return false;
60
+ switch (operator) {
61
+ case "equals": return cell === bound;
62
+ case "notEquals": return cell !== bound;
63
+ case "greaterThan": return cell > bound;
64
+ case "greaterThanOrEqual": return cell >= bound;
65
+ case "lessThan": return cell < bound;
66
+ case "lessThanOrEqual": return cell <= bound;
67
+ case "between": {
68
+ const upper = toComparable(condition.value2, filterType);
69
+ return upper === null ? cell >= bound : cell >= bound && cell <= upper;
70
+ }
71
+ default: return false;
72
+ }
73
+ }
74
+ const cell = String(cellValue ?? "").toLowerCase();
75
+ const needle = String(condition.value).toLowerCase();
76
+ switch (operator) {
77
+ case "contains": return cell.includes(needle);
78
+ case "notContains": return !cell.includes(needle);
79
+ case "equals": return cell === needle;
80
+ case "notEquals": return cell !== needle;
81
+ case "startsWith": return cell.startsWith(needle);
82
+ case "endsWith": return cell.endsWith(needle);
83
+ default: return false;
84
+ }
122
85
  };
123
- const evaluateColumnFilter = (cellValue, filterValue, filterType = 'text') => {
124
- if (typeof filterValue === 'string') {
125
- return String(cellValue !== null && cellValue !== void 0 ? cellValue : '')
126
- .toLowerCase()
127
- .includes(filterValue.toLowerCase());
128
- }
129
- if ('conditions' in filterValue) {
130
- const results = filterValue.conditions.map(condition => evaluateCondition(cellValue, condition, filterType));
131
- return filterValue.join === 'or' ? results.some(Boolean) : results.every(Boolean);
132
- }
133
- return filterValue.value.some(candidate => String(candidate) === String(cellValue));
86
+ const evaluateColumnFilter = (cellValue, filterValue, filterType = "text") => {
87
+ if (typeof filterValue === "string") return String(cellValue ?? "").toLowerCase().includes(filterValue.toLowerCase());
88
+ if ("conditions" in filterValue) {
89
+ const results = filterValue.conditions.map((condition) => evaluateCondition(cellValue, condition, filterType));
90
+ return filterValue.join === "or" ? results.some(Boolean) : results.every(Boolean);
91
+ }
92
+ return filterValue.value.some((candidate) => String(candidate) === String(cellValue));
134
93
  };
135
-
94
+ //#endregion
136
95
  export { FILTER_OPERATORS, VALUELESS_OPERATORS, evaluateColumnFilter };
137
- //# sourceMappingURL=filters.mjs.map
96
+
97
+ //# sourceMappingURL=filters.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"filters.mjs","sources":["../../src/filters.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filters.mjs","names":[],"sources":["../../src/filters.ts"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * CoreUI PRO data-grid filters.ts\n * License (https://coreui.io/pro/license/)\n * --------------------------------------------------------------------------\n * Pure filter-operator logic, built as the dependency-free\n * `@coreui/data-grid/filters` subpath so the framework bindings share one\n * implementation without pulling in the vanilla component runtime.\n */\n\nimport type {\n DataGridColumnFilterValue,\n DataGridFilterCondition,\n DataGridFilterOperator,\n DataGridFilterType\n} from './types'\n\nexport const FILTER_OPERATORS: Record<Exclude<DataGridFilterType, 'select'>, DataGridFilterOperator[]> = {\n text: ['contains', 'notContains', 'equals', 'notEquals', 'startsWith', 'endsWith', 'blank', 'notBlank'],\n number: [\n 'equals',\n 'notEquals',\n 'greaterThan',\n 'greaterThanOrEqual',\n 'lessThan',\n 'lessThanOrEqual',\n 'between',\n 'blank',\n 'notBlank'\n ],\n date: [\n 'equals',\n 'notEquals',\n 'greaterThan',\n 'greaterThanOrEqual',\n 'lessThan',\n 'lessThanOrEqual',\n 'between',\n 'blank',\n 'notBlank'\n ]\n}\n\nexport const VALUELESS_OPERATORS: ReadonlySet<DataGridFilterOperator> = new Set(['blank', 'notBlank'])\n\nconst isBlank = (value: unknown): boolean =>\n value === null || value === undefined || String(value).trim() === ''\n\nconst toComparable = (value: unknown, filterType: DataGridFilterType): number | null => {\n if (filterType === 'date') {\n const time = value instanceof Date ? value.getTime() : new Date(String(value)).getTime()\n return Number.isNaN(time) ? null : time\n }\n\n const numeric = typeof value === 'number' ? value : Number(value)\n return Number.isFinite(numeric) ? numeric : null\n}\n\nconst evaluateCondition = (\n cellValue: unknown,\n condition: DataGridFilterCondition,\n filterType: DataGridFilterType\n): boolean => {\n const { operator } = condition\n\n if (operator === 'blank') {\n return isBlank(cellValue)\n }\n\n if (operator === 'notBlank') {\n return !isBlank(cellValue)\n }\n\n // A condition without a value filters nothing (the menu treats it as\n // incomplete rather than matching nothing).\n if (isBlank(condition.value)) {\n return true\n }\n\n if (filterType === 'number' || filterType === 'date') {\n const cell = toComparable(cellValue, filterType)\n const bound = toComparable(condition.value, filterType)\n if (cell === null || bound === null) {\n return false\n }\n\n switch (operator) {\n case 'equals': {\n return cell === bound\n }\n\n case 'notEquals': {\n return cell !== bound\n }\n\n case 'greaterThan': {\n return cell > bound\n }\n\n case 'greaterThanOrEqual': {\n return cell >= bound\n }\n\n case 'lessThan': {\n return cell < bound\n }\n\n case 'lessThanOrEqual': {\n return cell <= bound\n }\n\n case 'between': {\n const upper = toComparable(condition.value2, filterType)\n return upper === null ? cell >= bound : cell >= bound && cell <= upper\n }\n\n default: {\n return false\n }\n }\n }\n\n const cell = String(cellValue ?? '').toLowerCase()\n const needle = String(condition.value).toLowerCase()\n\n switch (operator) {\n case 'contains': {\n return cell.includes(needle)\n }\n\n case 'notContains': {\n return !cell.includes(needle)\n }\n\n case 'equals': {\n return cell === needle\n }\n\n case 'notEquals': {\n return cell !== needle\n }\n\n case 'startsWith': {\n return cell.startsWith(needle)\n }\n\n case 'endsWith': {\n return cell.endsWith(needle)\n }\n\n default: {\n return false\n }\n }\n}\n\nexport const evaluateColumnFilter = (\n cellValue: unknown,\n filterValue: DataGridColumnFilterValue,\n filterType: DataGridFilterType = 'text'\n): boolean => {\n if (typeof filterValue === 'string') {\n return String(cellValue ?? '')\n .toLowerCase()\n .includes(filterValue.toLowerCase())\n }\n\n if ('conditions' in filterValue) {\n const results = filterValue.conditions.map(condition =>\n evaluateCondition(cellValue, condition, filterType)\n )\n return filterValue.join === 'or' ? results.some(Boolean) : results.every(Boolean)\n }\n\n return filterValue.value.some(candidate => String(candidate) === String(cellValue))\n}\n"],"mappings":";;;;;;AAiBA,MAAa,mBAA4F;CACvG,MAAM;EAAC;EAAY;EAAe;EAAU;EAAa;EAAc;EAAY;EAAS;CAAU;CACtG,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;AAEA,MAAa,sCAA2D,IAAI,IAAI,CAAC,SAAS,UAAU,CAAC;AAErG,MAAM,WAAW,UACf,UAAU,QAAQ,UAAU,KAAA,KAAa,OAAO,KAAK,CAAC,CAAC,KAAK,MAAM;AAEpE,MAAM,gBAAgB,OAAgB,eAAkD;CACtF,IAAI,eAAe,QAAQ;EACzB,MAAM,OAAO,iBAAiB,OAAO,MAAM,QAAQ,IAAI,IAAI,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ;EACvF,OAAO,OAAO,MAAM,IAAI,IAAI,OAAO;CACrC;CAEA,MAAM,UAAU,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;CAChE,OAAO,OAAO,SAAS,OAAO,IAAI,UAAU;AAC9C;AAEA,MAAM,qBACJ,WACA,WACA,eACY;CACZ,MAAM,EAAE,aAAa;CAErB,IAAI,aAAa,SACf,OAAO,QAAQ,SAAS;CAG1B,IAAI,aAAa,YACf,OAAO,CAAC,QAAQ,SAAS;CAK3B,IAAI,QAAQ,UAAU,KAAK,GACzB,OAAO;CAGT,IAAI,eAAe,YAAY,eAAe,QAAQ;EACpD,MAAM,OAAO,aAAa,WAAW,UAAU;EAC/C,MAAM,QAAQ,aAAa,UAAU,OAAO,UAAU;EACtD,IAAI,SAAS,QAAQ,UAAU,MAC7B,OAAO;EAGT,QAAQ,UAAR;GACE,KAAK,UACH,OAAO,SAAS;GAGlB,KAAK,aACH,OAAO,SAAS;GAGlB,KAAK,eACH,OAAO,OAAO;GAGhB,KAAK,sBACH,OAAO,QAAQ;GAGjB,KAAK,YACH,OAAO,OAAO;GAGhB,KAAK,mBACH,OAAO,QAAQ;GAGjB,KAAK,WAAW;IACd,MAAM,QAAQ,aAAa,UAAU,QAAQ,UAAU;IACvD,OAAO,UAAU,OAAO,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;GACnE;GAEA,SACE,OAAO;EAEX;CACF;CAEA,MAAM,OAAO,OAAO,aAAa,EAAE,CAAC,CAAC,YAAY;CACjD,MAAM,SAAS,OAAO,UAAU,KAAK,CAAC,CAAC,YAAY;CAEnD,QAAQ,UAAR;EACE,KAAK,YACH,OAAO,KAAK,SAAS,MAAM;EAG7B,KAAK,eACH,OAAO,CAAC,KAAK,SAAS,MAAM;EAG9B,KAAK,UACH,OAAO,SAAS;EAGlB,KAAK,aACH,OAAO,SAAS;EAGlB,KAAK,cACH,OAAO,KAAK,WAAW,MAAM;EAG/B,KAAK,YACH,OAAO,KAAK,SAAS,MAAM;EAG7B,SACE,OAAO;CAEX;AACF;AAEA,MAAa,wBACX,WACA,aACA,aAAiC,WACrB;CACZ,IAAI,OAAO,gBAAgB,UACzB,OAAO,OAAO,aAAa,EAAE,CAAC,CAC3B,YAAY,CAAC,CACb,SAAS,YAAY,YAAY,CAAC;CAGvC,IAAI,gBAAgB,aAAa;EAC/B,MAAM,UAAU,YAAY,WAAW,KAAI,cACzC,kBAAkB,WAAW,WAAW,UAAU,CACpD;EACA,OAAO,YAAY,SAAS,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,MAAM,OAAO;CAClF;CAEA,OAAO,YAAY,MAAM,MAAK,cAAa,OAAO,SAAS,MAAM,OAAO,SAAS,CAAC;AACpF"}