@milaboratories/uikit 2.4.29 → 2.5.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 (105) hide show
  1. package/.turbo/turbo-build.log +45 -45
  2. package/.turbo/turbo-type-check.log +1 -1
  3. package/CHANGELOG.md +18 -0
  4. package/dist/assets/images/required.svg.js +7 -0
  5. package/dist/assets/images/required.svg.js.map +1 -0
  6. package/dist/components/DataTable/TableComponent.vue.js +16 -19
  7. package/dist/components/DataTable/TableComponent.vue.js.map +1 -1
  8. package/dist/components/PlAutocomplete/PlAutocomplete.vue.js +67 -60
  9. package/dist/components/PlAutocomplete/PlAutocomplete.vue.js.map +1 -1
  10. package/dist/components/PlAutocompleteMulti/PlAutocompleteMulti.vue.js +76 -72
  11. package/dist/components/PlAutocompleteMulti/PlAutocompleteMulti.vue.js.map +1 -1
  12. package/dist/components/PlDropdown/PlDropdown.vue.js +65 -61
  13. package/dist/components/PlDropdown/PlDropdown.vue.js.map +1 -1
  14. package/dist/components/PlDropdownLegacy/PlDropdownLegacy.vue.js +27 -23
  15. package/dist/components/PlDropdownLegacy/PlDropdownLegacy.vue.js.map +1 -1
  16. package/dist/components/PlDropdownMulti/PlDropdownMulti.vue.js +65 -61
  17. package/dist/components/PlDropdownMulti/PlDropdownMulti.vue.js.map +1 -1
  18. package/dist/components/PlFileInput/PlFileInput.vue.js +47 -43
  19. package/dist/components/PlFileInput/PlFileInput.vue.js.map +1 -1
  20. package/dist/components/PlSlideModal/PlPureSlideModal.vue.js +3 -6
  21. package/dist/components/PlSlideModal/PlPureSlideModal.vue.js.map +1 -1
  22. package/dist/components/PlTextArea/PlTextArea.vue.js +43 -39
  23. package/dist/components/PlTextArea/PlTextArea.vue.js.map +1 -1
  24. package/dist/components/PlTextField/PlTextField.vue.js +41 -37
  25. package/dist/components/PlTextField/PlTextField.vue.js.map +1 -1
  26. package/dist/composition/filters/index.d.ts +2 -0
  27. package/dist/composition/filters/metadata.d.ts +862 -0
  28. package/dist/composition/filters/metadata.js +489 -0
  29. package/dist/composition/filters/metadata.js.map +1 -0
  30. package/dist/composition/filters/types.d.ts +44 -0
  31. package/dist/index.d.ts +2 -1
  32. package/dist/index.js +114 -110
  33. package/dist/index.js.map +1 -1
  34. package/package.json +4 -4
  35. package/src/components/PlAutocomplete/PlAutocomplete.vue +4 -3
  36. package/src/components/PlAutocompleteMulti/PlAutocompleteMulti.vue +14 -11
  37. package/src/components/PlDropdown/PlDropdown.vue +10 -9
  38. package/src/components/PlDropdownLegacy/PlDropdownLegacy.vue +3 -2
  39. package/src/components/PlDropdownMulti/PlDropdownMulti.vue +11 -10
  40. package/src/components/PlFileInput/PlFileInput.vue +6 -3
  41. package/src/components/PlTextArea/PlTextArea.vue +3 -2
  42. package/src/components/PlTextField/PlTextField.vue +7 -6
  43. package/src/composition/filters/index.ts +2 -0
  44. package/src/composition/filters/metadata.ts +476 -0
  45. package/src/composition/filters/types.ts +44 -0
  46. package/src/index.ts +2 -1
  47. package/dist/generated/components/svg/images/SvgRequired.vue.d.ts +0 -2
  48. package/dist/generated/components/svg/images/SvgRequired.vue.js +0 -17
  49. package/dist/generated/components/svg/images/SvgRequired.vue.js.map +0 -1
  50. package/dist/generated/components/svg/images/SvgRequired.vue3.js +0 -6
  51. package/dist/generated/components/svg/images/SvgRequired.vue3.js.map +0 -1
  52. package/scripts/create-svg-components.js +0 -125
  53. package/src/generated/components/svg/images/Svg16Add.vue +0 -13
  54. package/src/generated/components/svg/images/Svg16Attention.vue +0 -13
  55. package/src/generated/components/svg/images/Svg16Checkmark.vue +0 -13
  56. package/src/generated/components/svg/images/Svg16CheckmarkDark.vue +0 -13
  57. package/src/generated/components/svg/images/Svg16ChevronDown.vue +0 -13
  58. package/src/generated/components/svg/images/Svg16ChevronLeft.vue +0 -13
  59. package/src/generated/components/svg/images/Svg16ChevronRight.vue +0 -13
  60. package/src/generated/components/svg/images/Svg16ChevronUp.vue +0 -13
  61. package/src/generated/components/svg/images/Svg16Clear.vue +0 -13
  62. package/src/generated/components/svg/images/Svg16Clipboard.vue +0 -13
  63. package/src/generated/components/svg/images/Svg16Close.vue +0 -13
  64. package/src/generated/components/svg/images/Svg16Compare.vue +0 -13
  65. package/src/generated/components/svg/images/Svg16Down.vue +0 -13
  66. package/src/generated/components/svg/images/Svg16Import.vue +0 -13
  67. package/src/generated/components/svg/images/Svg16Info.vue +0 -13
  68. package/src/generated/components/svg/images/Svg16InfoDark.vue +0 -13
  69. package/src/generated/components/svg/images/Svg16Link.vue +0 -13
  70. package/src/generated/components/svg/images/Svg16Loading.vue +0 -13
  71. package/src/generated/components/svg/images/Svg16Maximise.vue +0 -13
  72. package/src/generated/components/svg/images/Svg16Play.vue +0 -13
  73. package/src/generated/components/svg/images/Svg16Up.vue +0 -13
  74. package/src/generated/components/svg/images/Svg24ArrowRight.vue +0 -13
  75. package/src/generated/components/svg/images/Svg24CheckboxDarkDisabledChecked.vue +0 -13
  76. package/src/generated/components/svg/images/Svg24CheckboxDarkDisabledIndeterminate.vue +0 -13
  77. package/src/generated/components/svg/images/Svg24CheckboxDarkDisabledUnchecked.vue +0 -13
  78. package/src/generated/components/svg/images/Svg24CheckboxDarkEnabledChecked.vue +0 -13
  79. package/src/generated/components/svg/images/Svg24CheckboxDarkEnabledIndeterminate.vue +0 -13
  80. package/src/generated/components/svg/images/Svg24CheckboxDarkEnabledUnchecked.vue +0 -13
  81. package/src/generated/components/svg/images/Svg24CheckboxLightDisabledChecked.vue +0 -13
  82. package/src/generated/components/svg/images/Svg24CheckboxLightDisabledIndeterminate.vue +0 -13
  83. package/src/generated/components/svg/images/Svg24CheckboxLightDisabledUnchecked.vue +0 -13
  84. package/src/generated/components/svg/images/Svg24CheckboxLightEnabledChecked.vue +0 -13
  85. package/src/generated/components/svg/images/Svg24CheckboxLightEnabledIndeterminate.vue +0 -13
  86. package/src/generated/components/svg/images/Svg24CheckboxLightEnabledUnchecked.vue +0 -13
  87. package/src/generated/components/svg/images/Svg24Clips.vue +0 -13
  88. package/src/generated/components/svg/images/Svg24Close.vue +0 -13
  89. package/src/generated/components/svg/images/Svg24Code.vue +0 -13
  90. package/src/generated/components/svg/images/Svg24Columns.vue +0 -13
  91. package/src/generated/components/svg/images/Svg24DarkMode.vue +0 -13
  92. package/src/generated/components/svg/images/Svg24Filters.vue +0 -13
  93. package/src/generated/components/svg/images/Svg24LightMode.vue +0 -13
  94. package/src/generated/components/svg/images/Svg24Local.vue +0 -13
  95. package/src/generated/components/svg/images/Svg24PaperClip.vue +0 -13
  96. package/src/generated/components/svg/images/Svg24Search.vue +0 -13
  97. package/src/generated/components/svg/images/Svg24ServerOn.vue +0 -13
  98. package/src/generated/components/svg/images/Svg24Settings2.vue +0 -13
  99. package/src/generated/components/svg/images/SvgAddGraphBg.vue +0 -13
  100. package/src/generated/components/svg/images/SvgColorSliderThumbBig.vue +0 -13
  101. package/src/generated/components/svg/images/SvgColorSliderThumbSmall.vue +0 -13
  102. package/src/generated/components/svg/images/SvgEmptyCat.vue +0 -13
  103. package/src/generated/components/svg/images/SvgNoDataCat.vue +0 -13
  104. package/src/generated/components/svg/images/SvgRequired.vue +0 -13
  105. package/src/generated/components/svg/svg-styles.css +0 -5
@@ -8,17 +8,18 @@ export default {
8
8
  </script>
9
9
 
10
10
  <script lang="ts" setup generic="M, E = string, C = E">
11
- import './pl-text-field.scss';
11
+ import type { Equal } from '@milaboratories/helpers';
12
12
  import { computed, reactive, ref, useSlots } from 'vue';
13
- import { PlTooltip } from '../PlTooltip';
13
+ import SvgRequired from '../../assets/images/required.svg?raw';
14
+ import { getErrorMessage } from '../../helpers/error.ts';
14
15
  import DoubleContour from '../../utils/DoubleContour.vue';
15
16
  import { useLabelNotch } from '../../utils/useLabelNotch';
16
17
  import { useValidation } from '../../utils/useValidation';
17
18
  import { PlIcon16 } from '../PlIcon16';
18
19
  import { PlMaskIcon24 } from '../PlMaskIcon24';
19
- import type { Equal } from '@milaboratories/helpers';
20
- import SvgRequired from '../../generated/components/svg/images/SvgRequired.vue';
21
- import { getErrorMessage } from '../../helpers/error.ts';
20
+ import { PlSvg } from '../PlSvg';
21
+ import { PlTooltip } from '../PlTooltip';
22
+ import './pl-text-field.scss';
22
23
 
23
24
  const slots = useSlots();
24
25
 
@@ -191,7 +192,7 @@ useLabelNotch(rootRef);
191
192
  }"
192
193
  >
193
194
  <label v-if="label" ref="label">
194
- <SvgRequired v-if="required" />
195
+ <PlSvg v-if="required" :uri="SvgRequired" />
195
196
  <span>{{ label }}</span>
196
197
  <PlTooltip v-if="slots.tooltip" class="info" position="top">
197
198
  <template #tooltip>
@@ -0,0 +1,2 @@
1
+ export * from './metadata';
2
+ export * from './types';
@@ -0,0 +1,476 @@
1
+ import type { FilterSpecType, SimplifiedPColumnSpec } from '@platforma-sdk/model';
2
+ import type { FilterSpecMetadataRecord } from './types';
3
+
4
+ export const filterUiMetadata = {
5
+ equal: {
6
+ label: 'Col = X (Equal)',
7
+ form: {
8
+ column: {
9
+ label: 'Column',
10
+ fieldType: 'SUniversalPColumnId',
11
+ defaultValue: () => undefined,
12
+ },
13
+ type: {
14
+ label: 'Predicate',
15
+ fieldType: 'FilterType',
16
+ defaultValue: () => 'equal',
17
+ },
18
+ x: {
19
+ label: 'X',
20
+ fieldType: 'number',
21
+ defaultValue: () => 0,
22
+ },
23
+ },
24
+ supportedFor: isNumericValueType,
25
+ },
26
+ lessThan: {
27
+ label: 'Col < X (Less Than)',
28
+ form: {
29
+ column: {
30
+ label: 'Column',
31
+ fieldType: 'SUniversalPColumnId',
32
+ defaultValue: () => undefined,
33
+ },
34
+ type: {
35
+ label: 'Predicate',
36
+ fieldType: 'FilterType',
37
+ defaultValue: () => 'lessThan',
38
+ },
39
+ x: {
40
+ label: 'X',
41
+ fieldType: 'number',
42
+ defaultValue: () => 0,
43
+ },
44
+ },
45
+ supportedFor: isNumericValueType,
46
+ },
47
+ greaterThan: {
48
+ label: 'Col > X (Greater Than)',
49
+ form: {
50
+ column: {
51
+ label: 'Column',
52
+ fieldType: 'SUniversalPColumnId',
53
+ defaultValue: () => undefined,
54
+ },
55
+ type: {
56
+ label: 'Predicate',
57
+ fieldType: 'FilterType',
58
+ defaultValue: () => 'greaterThan',
59
+ },
60
+ x: {
61
+ label: 'X',
62
+ fieldType: 'number',
63
+ defaultValue: () => 0,
64
+ },
65
+ },
66
+ supportedFor: isNumericValueType,
67
+ },
68
+ lessThanOrEqual: {
69
+ label: 'Col ≤ X (Less Than or Equal)',
70
+ form: {
71
+ column: {
72
+ label: 'Column',
73
+ fieldType: 'SUniversalPColumnId',
74
+ defaultValue: () => undefined,
75
+ },
76
+ type: {
77
+ label: 'Predicate',
78
+ fieldType: 'FilterType',
79
+ defaultValue: () => 'lessThanOrEqual',
80
+ },
81
+ x: {
82
+ label: 'X',
83
+ fieldType: 'number',
84
+ defaultValue: () => 0,
85
+ },
86
+ },
87
+ supportedFor: isNumericValueType,
88
+ },
89
+ greaterThanOrEqual: {
90
+ label: 'Col ≥ X (Greater Than or Equal)',
91
+ form: {
92
+ column: {
93
+ label: 'Column',
94
+ fieldType: 'SUniversalPColumnId',
95
+ defaultValue: () => undefined,
96
+ },
97
+ type: {
98
+ label: 'Predicate',
99
+ fieldType: 'FilterType',
100
+ defaultValue: () => 'greaterThanOrEqual',
101
+ },
102
+ x: {
103
+ label: 'X',
104
+ fieldType: 'number',
105
+ defaultValue: () => 0,
106
+ },
107
+ },
108
+ supportedFor: isNumericValueType,
109
+ },
110
+ // Columns comparison
111
+ equalToColumn: {
112
+ label: 'Col₁ = Col₂ (Compare Columns)',
113
+ form: {
114
+ column: {
115
+ label: 'Col₁',
116
+ fieldType: 'SUniversalPColumnId',
117
+ defaultValue: () => undefined,
118
+ },
119
+ type: {
120
+ label: 'Predicate',
121
+ fieldType: 'FilterType',
122
+ defaultValue: () => 'equalToColumn',
123
+ },
124
+ rhs: {
125
+ label: 'Col₂',
126
+ fieldType: 'SUniversalPColumnId',
127
+ defaultValue: () => undefined,
128
+ },
129
+ },
130
+ supportedFor: (spec1: SimplifiedPColumnSpec, spec2?: SimplifiedPColumnSpec): boolean => {
131
+ return isNumericValueType(spec1) && (spec2 === undefined || isNumericValueType(spec2));
132
+ },
133
+ },
134
+ lessThanColumn: {
135
+ label: 'Col₁ < Col₂ (Compare Columns)',
136
+ form: {
137
+ column: {
138
+ label: 'Col₁',
139
+ fieldType: 'SUniversalPColumnId',
140
+ defaultValue: () => undefined,
141
+ },
142
+ type: {
143
+ label: 'Predicate',
144
+ fieldType: 'FilterType',
145
+ defaultValue: () => 'lessThanColumn',
146
+ },
147
+ rhs: {
148
+ label: 'Col₂',
149
+ fieldType: 'SUniversalPColumnId',
150
+ defaultValue: () => undefined,
151
+ },
152
+ minDiff: {
153
+ label: 'Margin (positive)',
154
+ fieldType: 'number?',
155
+ defaultValue: () => undefined,
156
+ },
157
+ },
158
+ supportedFor: (spec1: SimplifiedPColumnSpec, spec2?: SimplifiedPColumnSpec): boolean => {
159
+ return isNumericValueType(spec1) && (spec2 === undefined || isNumericValueType(spec2));
160
+ },
161
+ },
162
+ greaterThanColumn: {
163
+ label: 'Col₁ > Col₂ (Compare Columns)',
164
+ form: {
165
+ column: {
166
+ label: 'Col₁',
167
+ fieldType: 'SUniversalPColumnId',
168
+ defaultValue: () => undefined,
169
+ },
170
+ type: {
171
+ label: 'Predicate',
172
+ fieldType: 'FilterType',
173
+ defaultValue: () => 'greaterThanColumn',
174
+ },
175
+ rhs: {
176
+ label: 'Col₂',
177
+ fieldType: 'SUniversalPColumnId',
178
+ defaultValue: () => undefined,
179
+ },
180
+ minDiff: {
181
+ label: 'Margin (positive)',
182
+ fieldType: 'number?',
183
+ defaultValue: () => undefined,
184
+ },
185
+ },
186
+ supportedFor: (spec1: SimplifiedPColumnSpec, spec2?: SimplifiedPColumnSpec): boolean => {
187
+ return isNumericValueType(spec1) && (spec2 === undefined || isNumericValueType(spec2));
188
+ },
189
+ },
190
+ lessThanColumnOrEqual: {
191
+ label: 'Col₁ ≤ Col₂ (Compare Columns)',
192
+ form: {
193
+ column: {
194
+ label: 'Col₁',
195
+ fieldType: 'SUniversalPColumnId',
196
+ defaultValue: () => undefined,
197
+ },
198
+ type: {
199
+ label: 'Predicate',
200
+ fieldType: 'FilterType',
201
+ defaultValue: () => 'lessThanColumnOrEqual',
202
+ },
203
+ rhs: {
204
+ label: 'Col₂',
205
+ fieldType: 'SUniversalPColumnId',
206
+ defaultValue: () => undefined,
207
+ },
208
+ minDiff: {
209
+ label: 'Margin (positive)',
210
+ fieldType: 'number?',
211
+ defaultValue: () => undefined,
212
+ },
213
+ },
214
+ supportedFor: (spec1: SimplifiedPColumnSpec, spec2?: SimplifiedPColumnSpec): boolean => {
215
+ return isNumericValueType(spec1) && (spec2 === undefined || isNumericValueType(spec2));
216
+ },
217
+ },
218
+ greaterThanColumnOrEqual: {
219
+ label: 'Col₁ ≥ Col₂ (Compare Columns)',
220
+ form: {
221
+ column: {
222
+ label: 'Col₁',
223
+ fieldType: 'SUniversalPColumnId',
224
+ defaultValue: () => undefined,
225
+ },
226
+ type: {
227
+ label: 'Predicate',
228
+ fieldType: 'FilterType',
229
+ defaultValue: () => 'greaterThanColumnOrEqual',
230
+ },
231
+ rhs: {
232
+ label: 'Col₂',
233
+ fieldType: 'SUniversalPColumnId',
234
+ defaultValue: () => undefined,
235
+ },
236
+ minDiff: {
237
+ label: 'Margin (positive)',
238
+ fieldType: 'number?',
239
+ defaultValue: () => undefined,
240
+ },
241
+ },
242
+ supportedFor: (spec1: SimplifiedPColumnSpec, spec2?: SimplifiedPColumnSpec): boolean => {
243
+ return isNumericValueType(spec1) && (spec2 === undefined || isNumericValueType(spec2));
244
+ },
245
+ },
246
+ // Ordering filters
247
+ topN: {
248
+ label: 'Top N',
249
+ form: {
250
+ column: {
251
+ label: 'Rank By Column',
252
+ fieldType: 'SUniversalPColumnId',
253
+ defaultValue: () => undefined,
254
+ },
255
+ type: {
256
+ label: 'Predicate',
257
+ fieldType: 'FilterType',
258
+ defaultValue: () => 'topN',
259
+ },
260
+ n: {
261
+ label: 'N',
262
+ fieldType: 'number',
263
+ defaultValue: () => 10,
264
+ },
265
+ },
266
+ supportedFor: isNumericValueType,
267
+ },
268
+ bottomN: {
269
+ label: 'Bottom N',
270
+ form: {
271
+ column: {
272
+ label: 'Rank By Column',
273
+ fieldType: 'SUniversalPColumnId',
274
+ defaultValue: () => undefined,
275
+ },
276
+ type: {
277
+ label: 'Predicate',
278
+ fieldType: 'FilterType',
279
+ defaultValue: () => 'bottomN',
280
+ },
281
+ n: {
282
+ label: 'N',
283
+ fieldType: 'number',
284
+ defaultValue: () => 10,
285
+ },
286
+ },
287
+ supportedFor: isNumericValueType,
288
+ },
289
+ patternContainSubsequence: {
290
+ label: 'Col ~ Seq (Contain Subsequence)',
291
+ form: {
292
+ column: {
293
+ label: 'Column',
294
+ fieldType: 'SUniversalPColumnId',
295
+ defaultValue: () => undefined,
296
+ },
297
+ type: {
298
+ label: 'Predicate',
299
+ fieldType: 'FilterType',
300
+ defaultValue: () => 'patternContainSubsequence',
301
+ },
302
+ value: {
303
+ label: 'Seq',
304
+ fieldType: 'string',
305
+ defaultValue: () => '',
306
+ },
307
+ },
308
+ supportedFor: isStringValueType,
309
+ },
310
+ patternNotContainSubsequence: {
311
+ label: 'Col ≁ Seq (Not Contain Subsequence)',
312
+ form: {
313
+ column: {
314
+ label: 'Column',
315
+ fieldType: 'SUniversalPColumnId',
316
+ defaultValue: () => undefined,
317
+ },
318
+ type: {
319
+ label: 'Predicate',
320
+ fieldType: 'FilterType',
321
+ defaultValue: () => 'patternNotContainSubsequence',
322
+ },
323
+ value: {
324
+ label: 'Seq',
325
+ fieldType: 'string',
326
+ defaultValue: () => '',
327
+ },
328
+ },
329
+ supportedFor: isStringValueType,
330
+ },
331
+ patternEquals: {
332
+ label: 'Col = Seq (Equals)',
333
+ form: {
334
+ column: {
335
+ label: 'Column',
336
+ fieldType: 'SUniversalPColumnId',
337
+ defaultValue: () => undefined,
338
+ },
339
+ type: {
340
+ label: 'Predicate',
341
+ fieldType: 'FilterType',
342
+ defaultValue: () => 'patternEquals',
343
+ },
344
+ value: {
345
+ label: 'Seq',
346
+ fieldType: 'string',
347
+ defaultValue: () => '',
348
+ },
349
+ },
350
+ supportedFor: isStringValueType,
351
+ },
352
+ patternNotEquals: {
353
+ label: 'Col ≠ Seq (Not Equal)',
354
+ form: {
355
+ column: {
356
+ label: 'Column',
357
+ fieldType: 'SUniversalPColumnId',
358
+ defaultValue: () => undefined,
359
+ },
360
+ type: {
361
+ label: 'Predicate',
362
+ fieldType: 'FilterType',
363
+ defaultValue: () => 'patternNotEquals',
364
+ },
365
+ value: {
366
+ label: 'Seq',
367
+ fieldType: 'string',
368
+ defaultValue: () => '',
369
+ },
370
+ },
371
+ supportedFor: isStringValueType,
372
+ },
373
+ isNA: {
374
+ label: 'Is NA',
375
+ form: {
376
+ column: {
377
+ label: 'Column',
378
+ fieldType: 'SUniversalPColumnId',
379
+ defaultValue: () => undefined,
380
+ },
381
+ type: {
382
+ label: 'Predicate',
383
+ fieldType: 'FilterType',
384
+ defaultValue: () => 'isNA',
385
+ },
386
+ },
387
+ supportedFor: () => true,
388
+ },
389
+ isNotNA: {
390
+ label: 'Is Not NA',
391
+ form: {
392
+ column: {
393
+ label: 'Column',
394
+ fieldType: 'SUniversalPColumnId',
395
+ defaultValue: () => undefined,
396
+ },
397
+ type: {
398
+ label: 'Predicate',
399
+ fieldType: 'FilterType',
400
+ defaultValue: () => 'isNotNA',
401
+ },
402
+ },
403
+ supportedFor: () => true,
404
+ },
405
+ or: {
406
+ label: 'Or',
407
+ form: {
408
+ type: {
409
+ fieldType: 'FilterType',
410
+ label: 'Predicate',
411
+ defaultValue: () => 'or',
412
+ },
413
+ filters: {
414
+ fieldType: 'unknown[]',
415
+ label: 'Filters',
416
+ defaultValue: () => [],
417
+ },
418
+ },
419
+ supportedFor: () => false,
420
+ },
421
+ and: {
422
+ label: 'And',
423
+ form: {
424
+ type: {
425
+ fieldType: 'FilterType',
426
+ label: 'Predicate',
427
+ defaultValue: () => 'and',
428
+ },
429
+ filters: {
430
+ fieldType: 'unknown[]',
431
+ label: 'Filters',
432
+ defaultValue: () => [],
433
+ },
434
+ },
435
+ supportedFor: () => false,
436
+ },
437
+ not: {
438
+ label: 'Not',
439
+ form: {
440
+ type: {
441
+ fieldType: 'FilterType',
442
+ label: 'Predicate',
443
+ defaultValue: () => 'not',
444
+ },
445
+ filter: {
446
+ fieldType: 'form',
447
+ label: 'Filter',
448
+ defaultValue: () => undefined,
449
+ },
450
+ },
451
+ supportedFor: () => false,
452
+ },
453
+ } satisfies FilterSpecMetadataRecord<FilterSpecType>;
454
+
455
+ export function getFilterUiTypeOptions(columnSpec?: SimplifiedPColumnSpec) {
456
+ if (!columnSpec) {
457
+ return [];
458
+ }
459
+
460
+ return Object.entries(filterUiMetadata).filter(([_, metadata]) => metadata.supportedFor(columnSpec)).map(([type, metadata]) => ({
461
+ label: metadata.label,
462
+ value: type,
463
+ }));
464
+ }
465
+
466
+ export function getFilterUiMetadata(type: FilterSpecType) {
467
+ return filterUiMetadata[type];
468
+ }
469
+
470
+ function isNumericValueType(spec: SimplifiedPColumnSpec): boolean {
471
+ return spec.valueType === 'Int' || spec.valueType === 'Long' || spec.valueType === 'Float' || spec.valueType === 'Double';
472
+ }
473
+
474
+ function isStringValueType(spec: SimplifiedPColumnSpec): boolean {
475
+ return spec.valueType === 'String';
476
+ }
@@ -0,0 +1,44 @@
1
+ import type { FilterSpec, FilterSpecOfType, FilterSpecType, SimplifiedPColumnSpec, SUniversalPColumnId } from '@platforma-sdk/model';
2
+
3
+ /** Metadata about a single field in FilterSpec */
4
+ export type FilterSpecTypeField<V> = {
5
+ label: string;
6
+ fieldType: FilterSpecTypeToLiteral<V>;
7
+ defaultValue: () => V | undefined;
8
+ };
9
+
10
+ /** Converts each field in FilterSpec to FilterSpecTypeField */
11
+ export type FilterSpecTypeFieldRecord<T extends FilterSpec> = { [K in keyof T]: FilterSpecTypeField<T[K]>; };
12
+
13
+ /** Extracts FilterSpecOfType from FilterSpecType */
14
+ export type FilterSpecFormField<T extends FilterSpec> = {
15
+ [K in keyof T]: FilterSpecTypeField<T[K]>
16
+ };
17
+
18
+ /** Metadata about all supported filter types */
19
+ export type FilterSpecMetadataRecord<T extends FilterSpecType> = {
20
+ [P in T]: {
21
+ label: string;
22
+ labelNot?: string;
23
+ form: FilterSpecFormField<FilterSpecOfType<P>>;
24
+ supportedFor: (spec1: SimplifiedPColumnSpec, spec2: SimplifiedPColumnSpec | undefined) => boolean;
25
+ }
26
+ };
27
+
28
+ /** Converts FilterSpecType to a literal string representing the type */
29
+ export type FilterSpecTypeToLiteral<T> =
30
+ [T] extends [FilterSpecType] ? 'FilterType' :
31
+ [T] extends [SUniversalPColumnId] ? 'SUniversalPColumnId' :
32
+ [T] extends [number] ? 'number' :
33
+ [T] extends [number | undefined] ? 'number?' :
34
+ [T] extends [string] ? 'string' :
35
+ [T] extends [string | undefined] ? 'string?' :
36
+ [T] extends [boolean] ? 'boolean' :
37
+ [T] extends [boolean | undefined] ? 'boolean?' :
38
+ [T] extends [unknown[]] ? 'unknown[]' :
39
+ // this is special
40
+ T extends number ? 'number' :
41
+ T extends string ? 'string' :
42
+ T extends boolean ? 'boolean' :
43
+ T extends Record<string, unknown> ? 'form' :
44
+ 'unknown';
package/src/index.ts CHANGED
@@ -114,9 +114,10 @@ export { useSortable } from './composition/useSortable';
114
114
  export { useSortable2 } from './composition/useSortable2';
115
115
  export { useTheme } from './composition/useTheme';
116
116
 
117
+ export * from './composition/computedCached';
118
+ export * from './composition/filters';
117
119
  export * from './composition/useWatchFetch';
118
120
  export * from './composition/watchCached';
119
- export * from './composition/computedCached';
120
121
 
121
122
  /**
122
123
  * Utils/Partials
@@ -1,2 +0,0 @@
1
- declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
- export default _default;
@@ -1,17 +0,0 @@
1
- (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode(".SvgRequired{background-image:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%225%22%20height%3D%2212%22%20viewBox%3D%220%200%205%2012%22%20fill%3D%22none%22%3E%3Cpath%20d%3D%22M1.51685%204.8L2.5%203.34159L3.47612%204.8L4.39607%204.12743L3.31461%202.7469L5%202.25133L4.64888%201.16106L3.00562%201.77699L3.06882%200H1.93118L1.99438%201.77699L0.351124%201.16106L0%202.25133L1.68539%202.7469L0.59691%204.12743L1.51685%204.8Z%22%20fill%3D%22%23F1222F%22%2F%3E%3C%2Fsvg%3E)}")),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}})();
2
- import e from "./SvgRequired.vue3.js";
3
- import { createElementBlock as t, openBlock as o } from "vue";
4
-
5
- import r from "../../../../_virtual/_plugin-vue_export-helper.js";
6
- const c = {
7
- class: "svg-icon SvgRequired",
8
- style: { width: "5px", height: "12px" }
9
- };
10
- function i(s, p, n, _, d, m) {
11
- return o(), t("div", c);
12
- }
13
- const h = /* @__PURE__ */ r(e, [["render", i]]);
14
- export {
15
- h as default
16
- };
17
- //# sourceMappingURL=SvgRequired.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SvgRequired.vue.js","sources":["../../../../../src/generated/components/svg/images/SvgRequired.vue"],"sourcesContent":["<!-- ⚠️ AUTOGENERATED. DO NOT EDIT. -->\n<script lang=\"ts\">\nimport '../svg-styles.css';\nexport default { name: 'SvgRequired' };\n</script>\n\n<template>\n <div class=\"svg-icon SvgRequired\" style=\"width: 5px; height: 12px\" />\n</template>\n\n<style>\n .SvgRequired { background-image: url(\"data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%225%22%20height%3D%2212%22%20viewBox%3D%220%200%205%2012%22%20fill%3D%22none%22%3E%3Cpath%20d%3D%22M1.51685%204.8L2.5%203.34159L3.47612%204.8L4.39607%204.12743L3.31461%202.7469L5%202.25133L4.64888%201.16106L3.00562%201.77699L3.06882%200H1.93118L1.99438%201.77699L0.351124%201.16106L0%202.25133L1.68539%202.7469L0.59691%204.12743L1.51685%204.8Z%22%20fill%3D%22%23F1222F%22%2F%3E%3C%2Fsvg%3E\"); }\n</style>\n"],"names":["_hoisted_1"],"mappings":";;;;AAOoC,MAAAA,IAAA;AAAA,EAAA,OAAA;AAAA;;;;;;"}
@@ -1,6 +0,0 @@
1
-
2
- const a = { name: "SvgRequired" };
3
- export {
4
- a as default
5
- };
6
- //# sourceMappingURL=SvgRequired.vue3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SvgRequired.vue3.js","sources":["../../../../../src/generated/components/svg/images/SvgRequired.vue"],"sourcesContent":["<!-- ⚠️ AUTOGENERATED. DO NOT EDIT. -->\n<script lang=\"ts\">\nimport '../svg-styles.css';\nexport default { name: 'SvgRequired' };\n</script>\n\n<template>\n <div class=\"svg-icon SvgRequired\" style=\"width: 5px; height: 12px\" />\n</template>\n\n<style>\n .SvgRequired { background-image: url(\"data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%225%22%20height%3D%2212%22%20viewBox%3D%220%200%205%2012%22%20fill%3D%22none%22%3E%3Cpath%20d%3D%22M1.51685%204.8L2.5%203.34159L3.47612%204.8L4.39607%204.12743L3.31461%202.7469L5%202.25133L4.64888%201.16106L3.00562%201.77699L3.06882%200H1.93118L1.99438%201.77699L0.351124%201.16106L0%202.25133L1.68539%202.7469L0.59691%204.12743L1.51685%204.8Z%22%20fill%3D%22%23F1222F%22%2F%3E%3C%2Fsvg%3E\"); }\n</style>\n"],"names":["_sfc_main"],"mappings":";AAGA,MAAAA,IAAe,EAAE,MAAM,cAAA;"}