@masterteam/components 0.0.125 → 0.0.127

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 (77) hide show
  1. package/assets/common.css +172 -2
  2. package/fesm2022/masterteam-components-entities.mjs +86 -27
  3. package/fesm2022/masterteam-components-entities.mjs.map +1 -1
  4. package/fesm2022/masterteam-components-table.mjs +27 -15
  5. package/fesm2022/masterteam-components-table.mjs.map +1 -1
  6. package/fesm2022/masterteam-components-tooltip.mjs +100 -2
  7. package/fesm2022/masterteam-components-tooltip.mjs.map +1 -1
  8. package/package.json +1 -1
  9. package/types/masterteam-components-entities.d.ts +26 -13
  10. package/types/masterteam-components-table.d.ts +2 -0
  11. package/types/masterteam-components-tooltip.d.ts +18 -1
  12. package/fesm2022/masterteam-components-dialog.mjs +0 -33
  13. package/fesm2022/masterteam-components-dialog.mjs.map +0 -1
  14. package/fesm2022/masterteam-components-dynamic-drawer.mjs +0 -321
  15. package/fesm2022/masterteam-components-dynamic-drawer.mjs.map +0 -1
  16. package/fesm2022/masterteam-components-formula.mjs +0 -3116
  17. package/fesm2022/masterteam-components-formula.mjs.map +0 -1
  18. package/fesm2022/masterteam-components-icon-field.mjs +0 -63
  19. package/fesm2022/masterteam-components-icon-field.mjs.map +0 -1
  20. package/fesm2022/masterteam-components-list.mjs +0 -31
  21. package/fesm2022/masterteam-components-list.mjs.map +0 -1
  22. package/fesm2022/masterteam-components-menu.mjs +0 -135
  23. package/fesm2022/masterteam-components-menu.mjs.map +0 -1
  24. package/fesm2022/masterteam-components-modal.mjs +0 -50
  25. package/fesm2022/masterteam-components-modal.mjs.map +0 -1
  26. package/fesm2022/masterteam-components-module-summary-card.mjs +0 -32
  27. package/fesm2022/masterteam-components-module-summary-card.mjs.map +0 -1
  28. package/fesm2022/masterteam-components-page-header.mjs +0 -42
  29. package/fesm2022/masterteam-components-page-header.mjs.map +0 -1
  30. package/fesm2022/masterteam-components-page.mjs +0 -35
  31. package/fesm2022/masterteam-components-page.mjs.map +0 -1
  32. package/fesm2022/masterteam-components-pick-list-field.mjs +0 -204
  33. package/fesm2022/masterteam-components-pick-list-field.mjs.map +0 -1
  34. package/fesm2022/masterteam-components-property-filter-builder.mjs +0 -386
  35. package/fesm2022/masterteam-components-property-filter-builder.mjs.map +0 -1
  36. package/fesm2022/masterteam-components-radio-button-field.mjs +0 -85
  37. package/fesm2022/masterteam-components-radio-button-field.mjs.map +0 -1
  38. package/fesm2022/masterteam-components-radio-cards-field.mjs +0 -123
  39. package/fesm2022/masterteam-components-radio-cards-field.mjs.map +0 -1
  40. package/fesm2022/masterteam-components-radio-cards.mjs +0 -74
  41. package/fesm2022/masterteam-components-radio-cards.mjs.map +0 -1
  42. package/fesm2022/masterteam-components-sidebar.mjs +0 -36
  43. package/fesm2022/masterteam-components-sidebar.mjs.map +0 -1
  44. package/fesm2022/masterteam-components-slider-field.mjs +0 -104
  45. package/fesm2022/masterteam-components-slider-field.mjs.map +0 -1
  46. package/fesm2022/masterteam-components-statistic-card.mjs +0 -22
  47. package/fesm2022/masterteam-components-statistic-card.mjs.map +0 -1
  48. package/fesm2022/masterteam-components-textarea-field.mjs +0 -100
  49. package/fesm2022/masterteam-components-textarea-field.mjs.map +0 -1
  50. package/fesm2022/masterteam-components-toast.mjs +0 -75
  51. package/fesm2022/masterteam-components-toast.mjs.map +0 -1
  52. package/fesm2022/masterteam-components-topbar.mjs +0 -28
  53. package/fesm2022/masterteam-components-topbar.mjs.map +0 -1
  54. package/fesm2022/masterteam-components-tree.mjs +0 -219
  55. package/fesm2022/masterteam-components-tree.mjs.map +0 -1
  56. package/types/masterteam-components-dialog.d.ts +0 -12
  57. package/types/masterteam-components-dynamic-drawer.d.ts +0 -93
  58. package/types/masterteam-components-formula.d.ts +0 -654
  59. package/types/masterteam-components-icon-field.d.ts +0 -27
  60. package/types/masterteam-components-list.d.ts +0 -18
  61. package/types/masterteam-components-menu.d.ts +0 -55
  62. package/types/masterteam-components-modal.d.ts +0 -18
  63. package/types/masterteam-components-module-summary-card.d.ts +0 -17
  64. package/types/masterteam-components-page-header.d.ts +0 -30
  65. package/types/masterteam-components-page.d.ts +0 -26
  66. package/types/masterteam-components-pick-list-field.d.ts +0 -60
  67. package/types/masterteam-components-property-filter-builder.d.ts +0 -90
  68. package/types/masterteam-components-radio-button-field.d.ts +0 -41
  69. package/types/masterteam-components-radio-cards-field.d.ts +0 -34
  70. package/types/masterteam-components-radio-cards.d.ts +0 -33
  71. package/types/masterteam-components-sidebar.d.ts +0 -28
  72. package/types/masterteam-components-slider-field.d.ts +0 -45
  73. package/types/masterteam-components-statistic-card.d.ts +0 -18
  74. package/types/masterteam-components-textarea-field.d.ts +0 -38
  75. package/types/masterteam-components-toast.d.ts +0 -26
  76. package/types/masterteam-components-topbar.d.ts +0 -17
  77. package/types/masterteam-components-tree.d.ts +0 -98
@@ -1,386 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { input, model, booleanAttribute, output, signal, computed, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import * as i1 from '@angular/forms';
4
- import { FormsModule } from '@angular/forms';
5
- import * as i3 from '@jsverse/transloco';
6
- import { TranslocoModule } from '@jsverse/transloco';
7
- import { Button } from '@masterteam/components/button';
8
- import { DateField } from '@masterteam/components/date-field';
9
- import { SelectField } from '@masterteam/components/select-field';
10
- import { TextField } from '@masterteam/components/text-field';
11
- import * as i2 from 'primeng/popover';
12
- import { PopoverModule } from 'primeng/popover';
13
-
14
- const DEFAULT_MAX_FILTERS = 20;
15
- function toLabel(value) {
16
- const normalized = value.split('.').pop() ?? value;
17
- return normalized
18
- .replace(/[_-]/g, ' ')
19
- .replace(/([a-z])([A-Z])/g, '$1 $2')
20
- .trim()
21
- .replace(/\b\w/g, (char) => char.toUpperCase());
22
- }
23
- function normalizeFieldOption(value) {
24
- if (typeof value === 'string') {
25
- return {
26
- key: value,
27
- label: toLabel(value),
28
- };
29
- }
30
- if (!value?.key) {
31
- return null;
32
- }
33
- return {
34
- key: value.key,
35
- label: value.label?.trim() || toLabel(value.key),
36
- viewType: value.viewType,
37
- };
38
- }
39
- function inferValueMode(operator) {
40
- switch (operator) {
41
- case 'In':
42
- return 'multi';
43
- case 'Between':
44
- return 'range';
45
- case 'IsNull':
46
- case 'IsNotNull':
47
- return 'none';
48
- default:
49
- return 'single';
50
- }
51
- }
52
- function normalizeOperatorOption(value) {
53
- if (typeof value === 'string') {
54
- return {
55
- key: value,
56
- label: toLabel(value),
57
- valueMode: inferValueMode(value),
58
- };
59
- }
60
- if (!value?.key) {
61
- return null;
62
- }
63
- return {
64
- key: value.key,
65
- label: value.label?.trim() || toLabel(value.key),
66
- valueMode: value.valueMode ?? inferValueMode(value.key),
67
- };
68
- }
69
- function toStringValue(value) {
70
- if (value === null || value === undefined)
71
- return '';
72
- return String(value);
73
- }
74
- function normalizeFieldType(viewType) {
75
- const normalized = viewType?.toLowerCase().trim() ?? '';
76
- if (normalized === 'number' ||
77
- normalized === 'decimal' ||
78
- normalized === 'integer' ||
79
- normalized === 'percentage' ||
80
- normalized === 'progress') {
81
- return 'number';
82
- }
83
- if (normalized === 'datetime' || normalized === 'datetimeoffset') {
84
- return 'datetime';
85
- }
86
- if (normalized === 'date') {
87
- return 'date';
88
- }
89
- if (normalized === 'boolean' || normalized === 'bool') {
90
- return 'boolean';
91
- }
92
- return 'text';
93
- }
94
- function toInputType(viewType) {
95
- const normalized = normalizeFieldType(viewType);
96
- if (normalized === 'number')
97
- return 'number';
98
- if (normalized === 'date')
99
- return 'date';
100
- if (normalized === 'datetime')
101
- return 'datetime-local';
102
- return 'text';
103
- }
104
- function parseBoolean(value) {
105
- const normalized = value.toLowerCase();
106
- if (normalized === 'true' || normalized === '1' || normalized === 'yes') {
107
- return true;
108
- }
109
- if (normalized === 'false' || normalized === '0' || normalized === 'no') {
110
- return false;
111
- }
112
- return value;
113
- }
114
- function parseValueByViewType(rawValue, viewType) {
115
- if (rawValue === null || rawValue === undefined)
116
- return '';
117
- if (rawValue instanceof Date) {
118
- return rawValue.toISOString();
119
- }
120
- const value = String(rawValue).trim();
121
- if (!value.length)
122
- return '';
123
- switch (normalizeFieldType(viewType)) {
124
- case 'number': {
125
- const parsed = Number(value);
126
- return Number.isFinite(parsed) ? parsed : value;
127
- }
128
- case 'boolean':
129
- return parseBoolean(value);
130
- default:
131
- return value;
132
- }
133
- }
134
- function hasInputValue(rawValue) {
135
- if (rawValue === null || rawValue === undefined)
136
- return false;
137
- if (rawValue instanceof Date)
138
- return true;
139
- return String(rawValue).trim().length > 0;
140
- }
141
- class PropertyFilterBuilder {
142
- schema = input(null, ...(ngDevMode ? [{ debugName: "schema" }] : []));
143
- filters = model([], ...(ngDevMode ? [{ debugName: "filters" }] : []));
144
- title = input(null, ...(ngDevMode ? [{ debugName: "title" }] : []));
145
- buttonLabel = input(null, ...(ngDevMode ? [{ debugName: "buttonLabel" }] : []));
146
- disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : {}), transform: booleanAttribute });
147
- applied = output();
148
- cleared = output();
149
- rowSeed = signal(0, ...(ngDevMode ? [{ debugName: "rowSeed" }] : []));
150
- syncedSignature = signal('', ...(ngDevMode ? [{ debugName: "syncedSignature" }] : []));
151
- drafts = signal([], ...(ngDevMode ? [{ debugName: "drafts" }] : []));
152
- fieldOptions = computed(() => (this.schema()?.allowedFields ?? [])
153
- .map(normalizeFieldOption)
154
- .filter((entry) => entry !== null), ...(ngDevMode ? [{ debugName: "fieldOptions" }] : []));
155
- operatorOptions = computed(() => (this.schema()?.allowedOperators ?? []).map(normalizeOperatorOption).filter((entry) => entry !== null), ...(ngDevMode ? [{ debugName: "operatorOptions" }] : []));
156
- hasSchema = computed(() => this.fieldOptions().length > 0 && this.operatorOptions().length > 0, ...(ngDevMode ? [{ debugName: "hasSchema" }] : []));
157
- maxFilters = computed(() => Math.max(1, this.schema()?.maxFilters ?? DEFAULT_MAX_FILTERS), ...(ngDevMode ? [{ debugName: "maxFilters" }] : []));
158
- canAddFilter = computed(() => {
159
- return this.hasSchema() && this.drafts().length < this.maxFilters();
160
- }, ...(ngDevMode ? [{ debugName: "canAddFilter" }] : []));
161
- activeFilterCount = computed(() => this.filters().length, ...(ngDevMode ? [{ debugName: "activeFilterCount" }] : []));
162
- constructor() {
163
- effect(() => {
164
- const fields = this.fieldOptions();
165
- const operators = this.operatorOptions();
166
- const appliedFilters = this.filters();
167
- const signature = JSON.stringify({
168
- fieldKeys: fields.map((field) => field.key),
169
- operatorKeys: operators.map((operator) => operator.key),
170
- filters: appliedFilters,
171
- });
172
- const hasDrafts = untracked(() => this.drafts().length > 0);
173
- const lastSyncedSignature = untracked(() => this.syncedSignature());
174
- if (!fields.length || !operators.length) {
175
- this.drafts.set([]);
176
- this.syncedSignature.set(signature);
177
- return;
178
- }
179
- if (hasDrafts && lastSyncedSignature === signature) {
180
- return;
181
- }
182
- if (!appliedFilters.length) {
183
- this.drafts.set([this.createDraft(fields[0].key, operators[0].key)]);
184
- this.syncedSignature.set(signature);
185
- return;
186
- }
187
- const nextDrafts = appliedFilters.map((rule) => {
188
- const operatorKey = operators.some((option) => option.key === rule.op)
189
- ? rule.op
190
- : operators[0].key;
191
- const fieldKey = fields.some((option) => option.key === rule.field)
192
- ? rule.field
193
- : fields[0].key;
194
- const mode = this.getValueMode(operatorKey);
195
- return this.createDraft(fieldKey, operatorKey, mode === 'range' ? '' : this.toDraftValue(rule), mode === 'range' ? toStringValue(rule.from) : '', mode === 'range' ? toStringValue(rule.to) : '');
196
- });
197
- this.drafts.set(nextDrafts.length
198
- ? nextDrafts
199
- : [this.createDraft(fields[0].key, operators[0].key)]);
200
- this.syncedSignature.set(signature);
201
- });
202
- }
203
- onPopoverToggle(event, popover) {
204
- if (!this.hasSchema() || this.disabled()) {
205
- return;
206
- }
207
- popover.toggle(event);
208
- }
209
- addFilter() {
210
- const fields = this.fieldOptions();
211
- const operators = this.operatorOptions();
212
- if (!fields.length || !operators.length)
213
- return;
214
- this.drafts.update((current) => {
215
- if (current.length >= this.maxFilters()) {
216
- return current;
217
- }
218
- return [...current, this.createDraft(fields[0].key, operators[0].key)];
219
- });
220
- }
221
- removeFilter(index) {
222
- this.drafts.update((current) => {
223
- if (current.length <= 1) {
224
- return current;
225
- }
226
- return current.filter((_, rowIndex) => rowIndex !== index);
227
- });
228
- }
229
- clearAll(popover) {
230
- const fields = this.fieldOptions();
231
- const operators = this.operatorOptions();
232
- if (fields.length && operators.length) {
233
- this.drafts.set([this.createDraft(fields[0].key, operators[0].key)]);
234
- }
235
- else {
236
- this.drafts.set([]);
237
- }
238
- this.filters.set([]);
239
- this.cleared.emit();
240
- popover.hide();
241
- }
242
- apply(popover) {
243
- const rules = this.buildRulesFromDrafts();
244
- this.filters.set(rules);
245
- this.applied.emit(rules);
246
- popover.hide();
247
- }
248
- onFieldChange(index, field) {
249
- this.patchDraft(index, { field: field || '' });
250
- }
251
- onOperatorChange(index, op) {
252
- const mode = this.getValueMode(op);
253
- this.patchDraft(index, {
254
- op: op || '',
255
- value: mode === 'range' ? '' : (this.drafts()[index]?.value ?? ''),
256
- from: mode === 'range' ? (this.drafts()[index]?.from ?? '') : '',
257
- to: mode === 'range' ? (this.drafts()[index]?.to ?? '') : '',
258
- });
259
- }
260
- onValueChange(index, value) {
261
- this.patchDraft(index, { value: value ?? '' });
262
- }
263
- onFromChange(index, from) {
264
- this.patchDraft(index, { from: from ?? '' });
265
- }
266
- onToChange(index, to) {
267
- this.patchDraft(index, { to: to ?? '' });
268
- }
269
- getValueMode(op) {
270
- return (this.operatorOptions().find((option) => option.key === op)?.valueMode ??
271
- inferValueMode(op));
272
- }
273
- getValueInputType(field, op) {
274
- if (this.getValueMode(op) === 'multi') {
275
- return 'text';
276
- }
277
- return toInputType(this.getFieldViewType(field));
278
- }
279
- isDateField(field) {
280
- const normalized = normalizeFieldType(this.getFieldViewType(field));
281
- return normalized === 'date' || normalized === 'datetime';
282
- }
283
- isDateTimeField(field) {
284
- return normalizeFieldType(this.getFieldViewType(field)) === 'datetime';
285
- }
286
- buildRulesFromDrafts() {
287
- return this.drafts()
288
- .map((draft) => {
289
- if (!draft.field || !draft.op) {
290
- return null;
291
- }
292
- const mode = this.getValueMode(draft.op);
293
- const viewType = this.getFieldViewType(draft.field);
294
- const rule = {
295
- field: draft.field,
296
- op: draft.op,
297
- };
298
- if (mode === 'none') {
299
- return rule;
300
- }
301
- if (mode === 'range') {
302
- if (!hasInputValue(draft.from) && !hasInputValue(draft.to)) {
303
- return null;
304
- }
305
- if (hasInputValue(draft.from)) {
306
- rule.from = parseValueByViewType(draft.from, viewType);
307
- }
308
- if (hasInputValue(draft.to)) {
309
- rule.to = parseValueByViewType(draft.to, viewType);
310
- }
311
- return rule;
312
- }
313
- if (!hasInputValue(draft.value)) {
314
- return null;
315
- }
316
- if (mode === 'multi') {
317
- const values = String(draft.value)
318
- .split(',')
319
- .map((value) => value.trim())
320
- .filter((value) => value.length > 0)
321
- .map((value) => parseValueByViewType(value, viewType));
322
- if (!values.length) {
323
- return null;
324
- }
325
- rule.values = values;
326
- return rule;
327
- }
328
- rule.value = parseValueByViewType(draft.value, viewType);
329
- return rule;
330
- })
331
- .filter((rule) => rule !== null)
332
- .slice(0, this.maxFilters());
333
- }
334
- getFieldViewType(fieldKey) {
335
- return this.fieldOptions().find((option) => option.key === fieldKey)
336
- ?.viewType;
337
- }
338
- patchDraft(index, patch) {
339
- this.drafts.update((current) => current.map((row, rowIndex) => rowIndex === index
340
- ? {
341
- ...row,
342
- ...patch,
343
- }
344
- : row));
345
- }
346
- createDraft(field, op, value = '', from = '', to = '') {
347
- this.rowSeed.update((seed) => seed + 1);
348
- return {
349
- id: `pfb-${this.rowSeed()}`,
350
- field,
351
- op,
352
- value,
353
- from,
354
- to,
355
- };
356
- }
357
- toDraftValue(rule) {
358
- if (Array.isArray(rule.values)) {
359
- return rule.values.map((entry) => toStringValue(entry)).join(', ');
360
- }
361
- return toStringValue(rule.value);
362
- }
363
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PropertyFilterBuilder, deps: [], target: i0.ɵɵFactoryTarget.Component });
364
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: PropertyFilterBuilder, isStandalone: true, selector: "mt-property-filter-builder", inputs: { schema: { classPropertyName: "schema", publicName: "schema", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, buttonLabel: { classPropertyName: "buttonLabel", publicName: "buttonLabel", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filters: "filtersChange", applied: "applied", cleared: "cleared" }, host: { classAttribute: "block" }, ngImport: i0, template: "<mt-button\r\n [label]=\"\r\n buttonLabel() || ('components.propertyFilterBuilder.filter' | transloco)\r\n \"\r\n severity=\"secondary\"\r\n icon=\"general.filter-funnel-01\"\r\n [badge]=\"activeFilterCount() > 0 ? activeFilterCount().toString() : undefined\"\r\n [disabled]=\"disabled() || !hasSchema()\"\r\n (onClick)=\"onPopoverToggle($event, popover)\"\r\n/>\r\n\r\n<p-popover #popover [style]=\"{ width: 'min(980px, 92vw)' }\" appendTo=\"body\">\r\n <div class=\"flex flex-col gap-4\">\r\n <div\r\n class=\"flex items-center justify-between border-b border-surface-200 pb-3 px-3\"\r\n >\r\n <div class=\"flex flex-col\">\r\n <h3 class=\"m-0 text-lg font-semibold\">\r\n {{\r\n title() ||\r\n (\"components.propertyFilterBuilder.advancedFilters\" | transloco)\r\n }}\r\n </h3>\r\n </div>\r\n\r\n <mt-button\r\n variant=\"text\"\r\n severity=\"secondary\"\r\n [label]=\"'components.propertyFilterBuilder.clearAll' | transloco\"\r\n (onClick)=\"clearAll(popover)\"\r\n />\r\n </div>\r\n\r\n <div class=\"flex flex-col gap-3 px-3\">\r\n @for (draft of drafts(); track draft.id; let index = $index) {\r\n <div\r\n class=\"grid grid-cols-[80px_minmax(0,1fr)_auto] items-center gap-2 max-lg:grid-cols-1 max-lg:items-start\"\r\n >\r\n <div class=\"text-sm text-color\" [class.invisible]=\"index > 0\">\r\n {{ \"components.propertyFilterBuilder.where\" | transloco }}\r\n </div>\r\n\r\n <div\r\n class=\"grid grid-cols-[minmax(170px,1fr)_minmax(170px,1fr)_minmax(220px,2fr)] gap-3 max-lg:grid-cols-1\"\r\n >\r\n <mt-select-field\r\n [hasPlaceholderPrefix]=\"false\"\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.property' | transloco\r\n \"\r\n optionLabel=\"label\"\r\n optionValue=\"key\"\r\n [options]=\"fieldOptions()\"\r\n [showClear]=\"false\"\r\n [ngModel]=\"draft.field\"\r\n (ngModelChange)=\"onFieldChange(index, $event)\"\r\n />\r\n\r\n <mt-select-field\r\n [hasPlaceholderPrefix]=\"false\"\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.condition' | transloco\r\n \"\r\n optionLabel=\"label\"\r\n optionValue=\"key\"\r\n [options]=\"operatorOptions()\"\r\n [showClear]=\"false\"\r\n [ngModel]=\"draft.op\"\r\n (ngModelChange)=\"onOperatorChange(index, $event)\"\r\n />\r\n\r\n @switch (getValueMode(draft.op)) {\r\n @case (\"none\") {\r\n <div\r\n class=\"flex min-h-10 items-center rounded-lg border border-dashed border-surface-300 px-3 text-sm text-color-secondary\"\r\n >\r\n {{\r\n \"components.propertyFilterBuilder.noValueRequired\"\r\n | transloco\r\n }}\r\n </div>\r\n }\r\n @case (\"range\") {\r\n <div class=\"grid grid-cols-2 gap-2 max-lg:grid-cols-1\">\r\n @if (isDateField(draft.field)) {\r\n <mt-date-field\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.from' | transloco\r\n \"\r\n [showTime]=\"isDateTimeField(draft.field)\"\r\n [showIcon]=\"false\"\r\n [ngModel]=\"draft.from\"\r\n (ngModelChange)=\"onFromChange(index, $event)\"\r\n />\r\n <mt-date-field\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.to' | transloco\r\n \"\r\n [showTime]=\"isDateTimeField(draft.field)\"\r\n [showIcon]=\"false\"\r\n [ngModel]=\"draft.to\"\r\n (ngModelChange)=\"onToChange(index, $event)\"\r\n />\r\n } @else {\r\n <mt-text-field\r\n [type]=\"getValueInputType(draft.field, draft.op)\"\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.from' | transloco\r\n \"\r\n [ngModel]=\"draft.from\"\r\n (ngModelChange)=\"onFromChange(index, $event)\"\r\n />\r\n <mt-text-field\r\n [type]=\"getValueInputType(draft.field, draft.op)\"\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.to' | transloco\r\n \"\r\n [ngModel]=\"draft.to\"\r\n (ngModelChange)=\"onToChange(index, $event)\"\r\n />\r\n }\r\n </div>\r\n }\r\n @default {\r\n @if (\r\n getValueMode(draft.op) !== \"multi\" && isDateField(draft.field)\r\n ) {\r\n <mt-date-field\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.value' | transloco\r\n \"\r\n [showTime]=\"isDateTimeField(draft.field)\"\r\n [showIcon]=\"false\"\r\n [ngModel]=\"draft.value\"\r\n (ngModelChange)=\"onValueChange(index, $event)\"\r\n />\r\n } @else {\r\n <mt-text-field\r\n [type]=\"getValueInputType(draft.field, draft.op)\"\r\n [placeholder]=\"\r\n getValueMode(draft.op) === 'multi'\r\n ? ('components.propertyFilterBuilder.multiValue'\r\n | transloco)\r\n : ('components.propertyFilterBuilder.value' | transloco)\r\n \"\r\n [ngModel]=\"draft.value\"\r\n (ngModelChange)=\"onValueChange(index, $event)\"\r\n />\r\n }\r\n }\r\n }\r\n </div>\r\n\r\n <mt-button\r\n icon=\"general.x-close\"\r\n severity=\"secondary\"\r\n variant=\"text\"\r\n [disabled]=\"drafts().length <= 1\"\r\n (onClick)=\"removeFilter(index)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex items-center justify-between p-2 max-lg:flex-col max-lg:items-stretch max-lg:gap-3\"\r\n >\r\n <mt-button\r\n [label]=\"'components.propertyFilterBuilder.addFilter' | transloco\"\r\n icon=\"general.plus\"\r\n variant=\"outlined\"\r\n [disabled]=\"!canAddFilter()\"\r\n (onClick)=\"addFilter()\"\r\n />\r\n\r\n <div class=\"flex gap-2 max-lg:w-full\">\r\n <mt-button\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [label]=\"'components.propertyFilterBuilder.cancel' | transloco\"\r\n (onClick)=\"popover.hide()\"\r\n />\r\n <mt-button\r\n [label]=\"'components.propertyFilterBuilder.apply' | transloco\"\r\n (onClick)=\"apply(popover)\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n</p-popover>\r\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: DateField, selector: "mt-date-field", inputs: ["field", "label", "placeholder", "class", "readonly", "showIcon", "showClear", "showTime", "pInputs", "required"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "component", type: i2.Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions", "motionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: SelectField, selector: "mt-select-field", inputs: ["field", "label", "placeholder", "hasPlaceholderPrefix", "class", "readonly", "pInputs", "options", "optionValue", "optionLabel", "filter", "filterBy", "dataKey", "showClear", "clearAfterSelect", "required", "group", "size", "optionGroupLabel", "optionGroupChildren", "loading", "optionIcon", "optionIconColor", "optionIconShape", "optionAvatarShape", "optionGroupIcon", "optionGroupIconColor", "optionGroupIconShape", "optionGroupAvatarShape"], outputs: ["onChange"] }, { kind: "component", type: TextField, selector: "mt-text-field", inputs: ["field", "hint", "label", "placeholder", "class", "type", "readonly", "pInputs", "required", "icon", "iconPosition"] }, { kind: "pipe", type: i3.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
365
- }
366
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PropertyFilterBuilder, decorators: [{
367
- type: Component,
368
- args: [{ selector: 'mt-property-filter-builder', standalone: true, imports: [
369
- FormsModule,
370
- TranslocoModule,
371
- Button,
372
- DateField,
373
- PopoverModule,
374
- SelectField,
375
- TextField,
376
- ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
377
- class: 'block',
378
- }, template: "<mt-button\r\n [label]=\"\r\n buttonLabel() || ('components.propertyFilterBuilder.filter' | transloco)\r\n \"\r\n severity=\"secondary\"\r\n icon=\"general.filter-funnel-01\"\r\n [badge]=\"activeFilterCount() > 0 ? activeFilterCount().toString() : undefined\"\r\n [disabled]=\"disabled() || !hasSchema()\"\r\n (onClick)=\"onPopoverToggle($event, popover)\"\r\n/>\r\n\r\n<p-popover #popover [style]=\"{ width: 'min(980px, 92vw)' }\" appendTo=\"body\">\r\n <div class=\"flex flex-col gap-4\">\r\n <div\r\n class=\"flex items-center justify-between border-b border-surface-200 pb-3 px-3\"\r\n >\r\n <div class=\"flex flex-col\">\r\n <h3 class=\"m-0 text-lg font-semibold\">\r\n {{\r\n title() ||\r\n (\"components.propertyFilterBuilder.advancedFilters\" | transloco)\r\n }}\r\n </h3>\r\n </div>\r\n\r\n <mt-button\r\n variant=\"text\"\r\n severity=\"secondary\"\r\n [label]=\"'components.propertyFilterBuilder.clearAll' | transloco\"\r\n (onClick)=\"clearAll(popover)\"\r\n />\r\n </div>\r\n\r\n <div class=\"flex flex-col gap-3 px-3\">\r\n @for (draft of drafts(); track draft.id; let index = $index) {\r\n <div\r\n class=\"grid grid-cols-[80px_minmax(0,1fr)_auto] items-center gap-2 max-lg:grid-cols-1 max-lg:items-start\"\r\n >\r\n <div class=\"text-sm text-color\" [class.invisible]=\"index > 0\">\r\n {{ \"components.propertyFilterBuilder.where\" | transloco }}\r\n </div>\r\n\r\n <div\r\n class=\"grid grid-cols-[minmax(170px,1fr)_minmax(170px,1fr)_minmax(220px,2fr)] gap-3 max-lg:grid-cols-1\"\r\n >\r\n <mt-select-field\r\n [hasPlaceholderPrefix]=\"false\"\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.property' | transloco\r\n \"\r\n optionLabel=\"label\"\r\n optionValue=\"key\"\r\n [options]=\"fieldOptions()\"\r\n [showClear]=\"false\"\r\n [ngModel]=\"draft.field\"\r\n (ngModelChange)=\"onFieldChange(index, $event)\"\r\n />\r\n\r\n <mt-select-field\r\n [hasPlaceholderPrefix]=\"false\"\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.condition' | transloco\r\n \"\r\n optionLabel=\"label\"\r\n optionValue=\"key\"\r\n [options]=\"operatorOptions()\"\r\n [showClear]=\"false\"\r\n [ngModel]=\"draft.op\"\r\n (ngModelChange)=\"onOperatorChange(index, $event)\"\r\n />\r\n\r\n @switch (getValueMode(draft.op)) {\r\n @case (\"none\") {\r\n <div\r\n class=\"flex min-h-10 items-center rounded-lg border border-dashed border-surface-300 px-3 text-sm text-color-secondary\"\r\n >\r\n {{\r\n \"components.propertyFilterBuilder.noValueRequired\"\r\n | transloco\r\n }}\r\n </div>\r\n }\r\n @case (\"range\") {\r\n <div class=\"grid grid-cols-2 gap-2 max-lg:grid-cols-1\">\r\n @if (isDateField(draft.field)) {\r\n <mt-date-field\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.from' | transloco\r\n \"\r\n [showTime]=\"isDateTimeField(draft.field)\"\r\n [showIcon]=\"false\"\r\n [ngModel]=\"draft.from\"\r\n (ngModelChange)=\"onFromChange(index, $event)\"\r\n />\r\n <mt-date-field\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.to' | transloco\r\n \"\r\n [showTime]=\"isDateTimeField(draft.field)\"\r\n [showIcon]=\"false\"\r\n [ngModel]=\"draft.to\"\r\n (ngModelChange)=\"onToChange(index, $event)\"\r\n />\r\n } @else {\r\n <mt-text-field\r\n [type]=\"getValueInputType(draft.field, draft.op)\"\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.from' | transloco\r\n \"\r\n [ngModel]=\"draft.from\"\r\n (ngModelChange)=\"onFromChange(index, $event)\"\r\n />\r\n <mt-text-field\r\n [type]=\"getValueInputType(draft.field, draft.op)\"\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.to' | transloco\r\n \"\r\n [ngModel]=\"draft.to\"\r\n (ngModelChange)=\"onToChange(index, $event)\"\r\n />\r\n }\r\n </div>\r\n }\r\n @default {\r\n @if (\r\n getValueMode(draft.op) !== \"multi\" && isDateField(draft.field)\r\n ) {\r\n <mt-date-field\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.value' | transloco\r\n \"\r\n [showTime]=\"isDateTimeField(draft.field)\"\r\n [showIcon]=\"false\"\r\n [ngModel]=\"draft.value\"\r\n (ngModelChange)=\"onValueChange(index, $event)\"\r\n />\r\n } @else {\r\n <mt-text-field\r\n [type]=\"getValueInputType(draft.field, draft.op)\"\r\n [placeholder]=\"\r\n getValueMode(draft.op) === 'multi'\r\n ? ('components.propertyFilterBuilder.multiValue'\r\n | transloco)\r\n : ('components.propertyFilterBuilder.value' | transloco)\r\n \"\r\n [ngModel]=\"draft.value\"\r\n (ngModelChange)=\"onValueChange(index, $event)\"\r\n />\r\n }\r\n }\r\n }\r\n </div>\r\n\r\n <mt-button\r\n icon=\"general.x-close\"\r\n severity=\"secondary\"\r\n variant=\"text\"\r\n [disabled]=\"drafts().length <= 1\"\r\n (onClick)=\"removeFilter(index)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex items-center justify-between p-2 max-lg:flex-col max-lg:items-stretch max-lg:gap-3\"\r\n >\r\n <mt-button\r\n [label]=\"'components.propertyFilterBuilder.addFilter' | transloco\"\r\n icon=\"general.plus\"\r\n variant=\"outlined\"\r\n [disabled]=\"!canAddFilter()\"\r\n (onClick)=\"addFilter()\"\r\n />\r\n\r\n <div class=\"flex gap-2 max-lg:w-full\">\r\n <mt-button\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [label]=\"'components.propertyFilterBuilder.cancel' | transloco\"\r\n (onClick)=\"popover.hide()\"\r\n />\r\n <mt-button\r\n [label]=\"'components.propertyFilterBuilder.apply' | transloco\"\r\n (onClick)=\"apply(popover)\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n</p-popover>\r\n" }]
379
- }], ctorParameters: () => [], propDecorators: { schema: [{ type: i0.Input, args: [{ isSignal: true, alias: "schema", required: false }] }], filters: [{ type: i0.Input, args: [{ isSignal: true, alias: "filters", required: false }] }, { type: i0.Output, args: ["filtersChange"] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], buttonLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "buttonLabel", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], applied: [{ type: i0.Output, args: ["applied"] }], cleared: [{ type: i0.Output, args: ["cleared"] }] } });
380
-
381
- /**
382
- * Generated bundle index. Do not edit.
383
- */
384
-
385
- export { PropertyFilterBuilder };
386
- //# sourceMappingURL=masterteam-components-property-filter-builder.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"masterteam-components-property-filter-builder.mjs","sources":["../../../../packages/masterteam/components/property-filter-builder/property-filter-builder.ts","../../../../packages/masterteam/components/property-filter-builder/property-filter-builder.html","../../../../packages/masterteam/components/property-filter-builder/masterteam-components-property-filter-builder.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n booleanAttribute,\r\n computed,\r\n effect,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { DateField } from '@masterteam/components/date-field';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { PopoverModule } from 'primeng/popover';\r\n\r\nexport type PropertyFilterBuilderValueMode =\r\n | 'single'\r\n | 'multi'\r\n | 'range'\r\n | 'none';\r\n\r\nexport interface PropertyFilterBuilderFieldOption {\r\n key: string;\r\n label?: string;\r\n viewType?: string;\r\n}\r\n\r\nexport interface PropertyFilterBuilderOperatorOption {\r\n key: string;\r\n label?: string;\r\n valueMode?: PropertyFilterBuilderValueMode;\r\n}\r\n\r\nexport interface PropertyFilterBuilderSchema {\r\n allowedFields: Array<string | PropertyFilterBuilderFieldOption>;\r\n allowedOperators: Array<string | PropertyFilterBuilderOperatorOption>;\r\n maxFilters?: number;\r\n}\r\n\r\nexport interface PropertyFilterBuilderRule {\r\n field: string;\r\n op: string;\r\n value?: unknown;\r\n values?: unknown[];\r\n from?: unknown;\r\n to?: unknown;\r\n}\r\n\r\ninterface PropertyFilterBuilderDraft {\r\n id: string;\r\n field: string;\r\n op: string;\r\n value: unknown;\r\n from: unknown;\r\n to: unknown;\r\n}\r\n\r\ninterface SelectOption {\r\n key: string;\r\n label: string;\r\n viewType?: string;\r\n}\r\n\r\nconst DEFAULT_MAX_FILTERS = 20;\r\n\r\nfunction toLabel(value: string): string {\r\n const normalized = value.split('.').pop() ?? value;\r\n return normalized\r\n .replace(/[_-]/g, ' ')\r\n .replace(/([a-z])([A-Z])/g, '$1 $2')\r\n .trim()\r\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\r\n}\r\n\r\nfunction normalizeFieldOption(\r\n value: string | PropertyFilterBuilderFieldOption,\r\n): SelectOption | null {\r\n if (typeof value === 'string') {\r\n return {\r\n key: value,\r\n label: toLabel(value),\r\n };\r\n }\r\n\r\n if (!value?.key) {\r\n return null;\r\n }\r\n\r\n return {\r\n key: value.key,\r\n label: value.label?.trim() || toLabel(value.key),\r\n viewType: value.viewType,\r\n };\r\n}\r\n\r\nfunction inferValueMode(operator: string): PropertyFilterBuilderValueMode {\r\n switch (operator) {\r\n case 'In':\r\n return 'multi';\r\n case 'Between':\r\n return 'range';\r\n case 'IsNull':\r\n case 'IsNotNull':\r\n return 'none';\r\n default:\r\n return 'single';\r\n }\r\n}\r\n\r\nfunction normalizeOperatorOption(\r\n value: string | PropertyFilterBuilderOperatorOption,\r\n): (SelectOption & { valueMode: PropertyFilterBuilderValueMode }) | null {\r\n if (typeof value === 'string') {\r\n return {\r\n key: value,\r\n label: toLabel(value),\r\n valueMode: inferValueMode(value),\r\n };\r\n }\r\n\r\n if (!value?.key) {\r\n return null;\r\n }\r\n\r\n return {\r\n key: value.key,\r\n label: value.label?.trim() || toLabel(value.key),\r\n valueMode: value.valueMode ?? inferValueMode(value.key),\r\n };\r\n}\r\n\r\nfunction toStringValue(value: unknown): string {\r\n if (value === null || value === undefined) return '';\r\n return String(value);\r\n}\r\n\r\ntype NormalizedFieldType = 'text' | 'number' | 'date' | 'datetime' | 'boolean';\r\n\r\nfunction normalizeFieldType(viewType: string | undefined): NormalizedFieldType {\r\n const normalized = viewType?.toLowerCase().trim() ?? '';\r\n\r\n if (\r\n normalized === 'number' ||\r\n normalized === 'decimal' ||\r\n normalized === 'integer' ||\r\n normalized === 'percentage' ||\r\n normalized === 'progress'\r\n ) {\r\n return 'number';\r\n }\r\n\r\n if (normalized === 'datetime' || normalized === 'datetimeoffset') {\r\n return 'datetime';\r\n }\r\n\r\n if (normalized === 'date') {\r\n return 'date';\r\n }\r\n\r\n if (normalized === 'boolean' || normalized === 'bool') {\r\n return 'boolean';\r\n }\r\n\r\n return 'text';\r\n}\r\n\r\nfunction toInputType(viewType: string | undefined): string {\r\n const normalized = normalizeFieldType(viewType);\r\n if (normalized === 'number') return 'number';\r\n if (normalized === 'date') return 'date';\r\n if (normalized === 'datetime') return 'datetime-local';\r\n return 'text';\r\n}\r\n\r\nfunction parseBoolean(value: string): boolean | string {\r\n const normalized = value.toLowerCase();\r\n if (normalized === 'true' || normalized === '1' || normalized === 'yes') {\r\n return true;\r\n }\r\n if (normalized === 'false' || normalized === '0' || normalized === 'no') {\r\n return false;\r\n }\r\n return value;\r\n}\r\n\r\nfunction parseValueByViewType(\r\n rawValue: unknown,\r\n viewType: string | undefined,\r\n): unknown {\r\n if (rawValue === null || rawValue === undefined) return '';\r\n if (rawValue instanceof Date) {\r\n return rawValue.toISOString();\r\n }\r\n\r\n const value = String(rawValue).trim();\r\n if (!value.length) return '';\r\n\r\n switch (normalizeFieldType(viewType)) {\r\n case 'number': {\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) ? parsed : value;\r\n }\r\n case 'boolean':\r\n return parseBoolean(value);\r\n default:\r\n return value;\r\n }\r\n}\r\n\r\nfunction hasInputValue(rawValue: unknown): boolean {\r\n if (rawValue === null || rawValue === undefined) return false;\r\n if (rawValue instanceof Date) return true;\r\n return String(rawValue).trim().length > 0;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-property-filter-builder',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n TranslocoModule,\r\n Button,\r\n DateField,\r\n PopoverModule,\r\n SelectField,\r\n TextField,\r\n ],\r\n templateUrl: './property-filter-builder.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'block',\r\n },\r\n})\r\nexport class PropertyFilterBuilder {\r\n readonly schema = input<PropertyFilterBuilderSchema | null>(null);\r\n readonly filters = model<PropertyFilterBuilderRule[]>([]);\r\n readonly title = input<string | null>(null);\r\n readonly buttonLabel = input<string | null>(null);\r\n readonly disabled = input<boolean, unknown>(false, {\r\n transform: booleanAttribute,\r\n });\r\n\r\n readonly applied = output<PropertyFilterBuilderRule[]>();\r\n readonly cleared = output<void>();\r\n\r\n private readonly rowSeed = signal(0);\r\n private readonly syncedSignature = signal('');\r\n protected readonly drafts = signal<PropertyFilterBuilderDraft[]>([]);\r\n\r\n protected readonly fieldOptions = computed(() =>\r\n (this.schema()?.allowedFields ?? [])\r\n .map(normalizeFieldOption)\r\n .filter((entry): entry is SelectOption => entry !== null),\r\n );\r\n\r\n protected readonly operatorOptions = computed(() =>\r\n (this.schema()?.allowedOperators ?? []).map(normalizeOperatorOption).filter(\r\n (\r\n entry,\r\n ): entry is SelectOption & {\r\n valueMode: PropertyFilterBuilderValueMode;\r\n } => entry !== null,\r\n ),\r\n );\r\n\r\n protected readonly hasSchema = computed(\r\n () => this.fieldOptions().length > 0 && this.operatorOptions().length > 0,\r\n );\r\n\r\n protected readonly maxFilters = computed(() =>\r\n Math.max(1, this.schema()?.maxFilters ?? DEFAULT_MAX_FILTERS),\r\n );\r\n\r\n protected readonly canAddFilter = computed(() => {\r\n return this.hasSchema() && this.drafts().length < this.maxFilters();\r\n });\r\n\r\n protected readonly activeFilterCount = computed(() => this.filters().length);\r\n\r\n constructor() {\r\n effect(() => {\r\n const fields = this.fieldOptions();\r\n const operators = this.operatorOptions();\r\n const appliedFilters = this.filters();\r\n const signature = JSON.stringify({\r\n fieldKeys: fields.map((field) => field.key),\r\n operatorKeys: operators.map((operator) => operator.key),\r\n filters: appliedFilters,\r\n });\r\n const hasDrafts = untracked(() => this.drafts().length > 0);\r\n const lastSyncedSignature = untracked(() => this.syncedSignature());\r\n\r\n if (!fields.length || !operators.length) {\r\n this.drafts.set([]);\r\n this.syncedSignature.set(signature);\r\n return;\r\n }\r\n\r\n if (hasDrafts && lastSyncedSignature === signature) {\r\n return;\r\n }\r\n\r\n if (!appliedFilters.length) {\r\n this.drafts.set([this.createDraft(fields[0].key, operators[0].key)]);\r\n this.syncedSignature.set(signature);\r\n return;\r\n }\r\n\r\n const nextDrafts = appliedFilters.map((rule) => {\r\n const operatorKey = operators.some((option) => option.key === rule.op)\r\n ? rule.op\r\n : operators[0].key;\r\n const fieldKey = fields.some((option) => option.key === rule.field)\r\n ? rule.field\r\n : fields[0].key;\r\n const mode = this.getValueMode(operatorKey);\r\n\r\n return this.createDraft(\r\n fieldKey,\r\n operatorKey,\r\n mode === 'range' ? '' : this.toDraftValue(rule),\r\n mode === 'range' ? toStringValue(rule.from) : '',\r\n mode === 'range' ? toStringValue(rule.to) : '',\r\n );\r\n });\r\n\r\n this.drafts.set(\r\n nextDrafts.length\r\n ? nextDrafts\r\n : [this.createDraft(fields[0].key, operators[0].key)],\r\n );\r\n this.syncedSignature.set(signature);\r\n });\r\n }\r\n\r\n onPopoverToggle(\r\n event: Event,\r\n popover: { toggle: (event: Event) => void },\r\n ): void {\r\n if (!this.hasSchema() || this.disabled()) {\r\n return;\r\n }\r\n popover.toggle(event);\r\n }\r\n\r\n addFilter(): void {\r\n const fields = this.fieldOptions();\r\n const operators = this.operatorOptions();\r\n if (!fields.length || !operators.length) return;\r\n\r\n this.drafts.update((current) => {\r\n if (current.length >= this.maxFilters()) {\r\n return current;\r\n }\r\n\r\n return [...current, this.createDraft(fields[0].key, operators[0].key)];\r\n });\r\n }\r\n\r\n removeFilter(index: number): void {\r\n this.drafts.update((current) => {\r\n if (current.length <= 1) {\r\n return current;\r\n }\r\n return current.filter((_, rowIndex) => rowIndex !== index);\r\n });\r\n }\r\n\r\n clearAll(popover: { hide: () => void }): void {\r\n const fields = this.fieldOptions();\r\n const operators = this.operatorOptions();\r\n\r\n if (fields.length && operators.length) {\r\n this.drafts.set([this.createDraft(fields[0].key, operators[0].key)]);\r\n } else {\r\n this.drafts.set([]);\r\n }\r\n\r\n this.filters.set([]);\r\n this.cleared.emit();\r\n popover.hide();\r\n }\r\n\r\n apply(popover: { hide: () => void }): void {\r\n const rules = this.buildRulesFromDrafts();\r\n this.filters.set(rules);\r\n this.applied.emit(rules);\r\n popover.hide();\r\n }\r\n\r\n onFieldChange(index: number, field: string): void {\r\n this.patchDraft(index, { field: field || '' });\r\n }\r\n\r\n onOperatorChange(index: number, op: string): void {\r\n const mode = this.getValueMode(op);\r\n this.patchDraft(index, {\r\n op: op || '',\r\n value: mode === 'range' ? '' : (this.drafts()[index]?.value ?? ''),\r\n from: mode === 'range' ? (this.drafts()[index]?.from ?? '') : '',\r\n to: mode === 'range' ? (this.drafts()[index]?.to ?? '') : '',\r\n });\r\n }\r\n\r\n onValueChange(index: number, value: unknown): void {\r\n this.patchDraft(index, { value: value ?? '' });\r\n }\r\n\r\n onFromChange(index: number, from: unknown): void {\r\n this.patchDraft(index, { from: from ?? '' });\r\n }\r\n\r\n onToChange(index: number, to: unknown): void {\r\n this.patchDraft(index, { to: to ?? '' });\r\n }\r\n\r\n getValueMode(op: string): PropertyFilterBuilderValueMode {\r\n return (\r\n this.operatorOptions().find((option) => option.key === op)?.valueMode ??\r\n inferValueMode(op)\r\n );\r\n }\r\n\r\n getValueInputType(field: string, op: string): string {\r\n if (this.getValueMode(op) === 'multi') {\r\n return 'text';\r\n }\r\n return toInputType(this.getFieldViewType(field));\r\n }\r\n\r\n isDateField(field: string): boolean {\r\n const normalized = normalizeFieldType(this.getFieldViewType(field));\r\n return normalized === 'date' || normalized === 'datetime';\r\n }\r\n\r\n isDateTimeField(field: string): boolean {\r\n return normalizeFieldType(this.getFieldViewType(field)) === 'datetime';\r\n }\r\n\r\n private buildRulesFromDrafts(): PropertyFilterBuilderRule[] {\r\n return this.drafts()\r\n .map((draft) => {\r\n if (!draft.field || !draft.op) {\r\n return null;\r\n }\r\n\r\n const mode = this.getValueMode(draft.op);\r\n const viewType = this.getFieldViewType(draft.field);\r\n const rule: PropertyFilterBuilderRule = {\r\n field: draft.field,\r\n op: draft.op,\r\n };\r\n\r\n if (mode === 'none') {\r\n return rule;\r\n }\r\n\r\n if (mode === 'range') {\r\n if (!hasInputValue(draft.from) && !hasInputValue(draft.to)) {\r\n return null;\r\n }\r\n if (hasInputValue(draft.from)) {\r\n rule.from = parseValueByViewType(draft.from, viewType);\r\n }\r\n if (hasInputValue(draft.to)) {\r\n rule.to = parseValueByViewType(draft.to, viewType);\r\n }\r\n return rule;\r\n }\r\n\r\n if (!hasInputValue(draft.value)) {\r\n return null;\r\n }\r\n\r\n if (mode === 'multi') {\r\n const values = String(draft.value)\r\n .split(',')\r\n .map((value) => value.trim())\r\n .filter((value) => value.length > 0)\r\n .map((value) => parseValueByViewType(value, viewType));\r\n\r\n if (!values.length) {\r\n return null;\r\n }\r\n\r\n rule.values = values;\r\n return rule;\r\n }\r\n\r\n rule.value = parseValueByViewType(draft.value, viewType);\r\n return rule;\r\n })\r\n .filter((rule): rule is PropertyFilterBuilderRule => rule !== null)\r\n .slice(0, this.maxFilters());\r\n }\r\n\r\n private getFieldViewType(fieldKey: string): string | undefined {\r\n return this.fieldOptions().find((option) => option.key === fieldKey)\r\n ?.viewType;\r\n }\r\n\r\n private patchDraft(\r\n index: number,\r\n patch: Partial<PropertyFilterBuilderDraft>,\r\n ): void {\r\n this.drafts.update((current) =>\r\n current.map((row, rowIndex) =>\r\n rowIndex === index\r\n ? {\r\n ...row,\r\n ...patch,\r\n }\r\n : row,\r\n ),\r\n );\r\n }\r\n\r\n private createDraft(\r\n field: string,\r\n op: string,\r\n value: unknown = '',\r\n from: unknown = '',\r\n to: unknown = '',\r\n ): PropertyFilterBuilderDraft {\r\n this.rowSeed.update((seed) => seed + 1);\r\n return {\r\n id: `pfb-${this.rowSeed()}`,\r\n field,\r\n op,\r\n value,\r\n from,\r\n to,\r\n };\r\n }\r\n\r\n private toDraftValue(rule: PropertyFilterBuilderRule): string {\r\n if (Array.isArray(rule.values)) {\r\n return rule.values.map((entry) => toStringValue(entry)).join(', ');\r\n }\r\n\r\n return toStringValue(rule.value);\r\n }\r\n}\r\n","<mt-button\r\n [label]=\"\r\n buttonLabel() || ('components.propertyFilterBuilder.filter' | transloco)\r\n \"\r\n severity=\"secondary\"\r\n icon=\"general.filter-funnel-01\"\r\n [badge]=\"activeFilterCount() > 0 ? activeFilterCount().toString() : undefined\"\r\n [disabled]=\"disabled() || !hasSchema()\"\r\n (onClick)=\"onPopoverToggle($event, popover)\"\r\n/>\r\n\r\n<p-popover #popover [style]=\"{ width: 'min(980px, 92vw)' }\" appendTo=\"body\">\r\n <div class=\"flex flex-col gap-4\">\r\n <div\r\n class=\"flex items-center justify-between border-b border-surface-200 pb-3 px-3\"\r\n >\r\n <div class=\"flex flex-col\">\r\n <h3 class=\"m-0 text-lg font-semibold\">\r\n {{\r\n title() ||\r\n (\"components.propertyFilterBuilder.advancedFilters\" | transloco)\r\n }}\r\n </h3>\r\n </div>\r\n\r\n <mt-button\r\n variant=\"text\"\r\n severity=\"secondary\"\r\n [label]=\"'components.propertyFilterBuilder.clearAll' | transloco\"\r\n (onClick)=\"clearAll(popover)\"\r\n />\r\n </div>\r\n\r\n <div class=\"flex flex-col gap-3 px-3\">\r\n @for (draft of drafts(); track draft.id; let index = $index) {\r\n <div\r\n class=\"grid grid-cols-[80px_minmax(0,1fr)_auto] items-center gap-2 max-lg:grid-cols-1 max-lg:items-start\"\r\n >\r\n <div class=\"text-sm text-color\" [class.invisible]=\"index > 0\">\r\n {{ \"components.propertyFilterBuilder.where\" | transloco }}\r\n </div>\r\n\r\n <div\r\n class=\"grid grid-cols-[minmax(170px,1fr)_minmax(170px,1fr)_minmax(220px,2fr)] gap-3 max-lg:grid-cols-1\"\r\n >\r\n <mt-select-field\r\n [hasPlaceholderPrefix]=\"false\"\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.property' | transloco\r\n \"\r\n optionLabel=\"label\"\r\n optionValue=\"key\"\r\n [options]=\"fieldOptions()\"\r\n [showClear]=\"false\"\r\n [ngModel]=\"draft.field\"\r\n (ngModelChange)=\"onFieldChange(index, $event)\"\r\n />\r\n\r\n <mt-select-field\r\n [hasPlaceholderPrefix]=\"false\"\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.condition' | transloco\r\n \"\r\n optionLabel=\"label\"\r\n optionValue=\"key\"\r\n [options]=\"operatorOptions()\"\r\n [showClear]=\"false\"\r\n [ngModel]=\"draft.op\"\r\n (ngModelChange)=\"onOperatorChange(index, $event)\"\r\n />\r\n\r\n @switch (getValueMode(draft.op)) {\r\n @case (\"none\") {\r\n <div\r\n class=\"flex min-h-10 items-center rounded-lg border border-dashed border-surface-300 px-3 text-sm text-color-secondary\"\r\n >\r\n {{\r\n \"components.propertyFilterBuilder.noValueRequired\"\r\n | transloco\r\n }}\r\n </div>\r\n }\r\n @case (\"range\") {\r\n <div class=\"grid grid-cols-2 gap-2 max-lg:grid-cols-1\">\r\n @if (isDateField(draft.field)) {\r\n <mt-date-field\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.from' | transloco\r\n \"\r\n [showTime]=\"isDateTimeField(draft.field)\"\r\n [showIcon]=\"false\"\r\n [ngModel]=\"draft.from\"\r\n (ngModelChange)=\"onFromChange(index, $event)\"\r\n />\r\n <mt-date-field\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.to' | transloco\r\n \"\r\n [showTime]=\"isDateTimeField(draft.field)\"\r\n [showIcon]=\"false\"\r\n [ngModel]=\"draft.to\"\r\n (ngModelChange)=\"onToChange(index, $event)\"\r\n />\r\n } @else {\r\n <mt-text-field\r\n [type]=\"getValueInputType(draft.field, draft.op)\"\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.from' | transloco\r\n \"\r\n [ngModel]=\"draft.from\"\r\n (ngModelChange)=\"onFromChange(index, $event)\"\r\n />\r\n <mt-text-field\r\n [type]=\"getValueInputType(draft.field, draft.op)\"\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.to' | transloco\r\n \"\r\n [ngModel]=\"draft.to\"\r\n (ngModelChange)=\"onToChange(index, $event)\"\r\n />\r\n }\r\n </div>\r\n }\r\n @default {\r\n @if (\r\n getValueMode(draft.op) !== \"multi\" && isDateField(draft.field)\r\n ) {\r\n <mt-date-field\r\n [placeholder]=\"\r\n 'components.propertyFilterBuilder.value' | transloco\r\n \"\r\n [showTime]=\"isDateTimeField(draft.field)\"\r\n [showIcon]=\"false\"\r\n [ngModel]=\"draft.value\"\r\n (ngModelChange)=\"onValueChange(index, $event)\"\r\n />\r\n } @else {\r\n <mt-text-field\r\n [type]=\"getValueInputType(draft.field, draft.op)\"\r\n [placeholder]=\"\r\n getValueMode(draft.op) === 'multi'\r\n ? ('components.propertyFilterBuilder.multiValue'\r\n | transloco)\r\n : ('components.propertyFilterBuilder.value' | transloco)\r\n \"\r\n [ngModel]=\"draft.value\"\r\n (ngModelChange)=\"onValueChange(index, $event)\"\r\n />\r\n }\r\n }\r\n }\r\n </div>\r\n\r\n <mt-button\r\n icon=\"general.x-close\"\r\n severity=\"secondary\"\r\n variant=\"text\"\r\n [disabled]=\"drafts().length <= 1\"\r\n (onClick)=\"removeFilter(index)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex items-center justify-between p-2 max-lg:flex-col max-lg:items-stretch max-lg:gap-3\"\r\n >\r\n <mt-button\r\n [label]=\"'components.propertyFilterBuilder.addFilter' | transloco\"\r\n icon=\"general.plus\"\r\n variant=\"outlined\"\r\n [disabled]=\"!canAddFilter()\"\r\n (onClick)=\"addFilter()\"\r\n />\r\n\r\n <div class=\"flex gap-2 max-lg:w-full\">\r\n <mt-button\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [label]=\"'components.propertyFilterBuilder.cancel' | transloco\"\r\n (onClick)=\"popover.hide()\"\r\n />\r\n <mt-button\r\n [label]=\"'components.propertyFilterBuilder.apply' | transloco\"\r\n (onClick)=\"apply(popover)\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n</p-popover>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,85 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { input, output, inject, computed, signal, effect, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import * as i1 from '@angular/forms';
4
- import { NgControl, Validators, FormsModule } from '@angular/forms';
5
- import * as i2 from 'primeng/radiobutton';
6
- import { RadioButtonModule } from 'primeng/radiobutton';
7
- import { FieldValidation } from '@masterteam/components/field-validation';
8
- import { isInvalid } from '@masterteam/components';
9
-
10
- class RadioButtonField {
11
- radioButton;
12
- labelPosition = input('end', ...(ngDevMode ? [{ debugName: "labelPosition" }] : []));
13
- orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : []));
14
- readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : []));
15
- pInputs = input(...(ngDevMode ? [undefined, { debugName: "pInputs" }] : []));
16
- required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : []));
17
- options = input([], ...(ngDevMode ? [{ debugName: "options" }] : []));
18
- size = input(...(ngDevMode ? [undefined, { debugName: "size" }] : []));
19
- label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
20
- onChange = output();
21
- ngControl = inject(NgControl, { self: true });
22
- isInvalid = isInvalid;
23
- isVertical = computed(() => this.labelPosition() === 'top' || this.labelPosition() === 'bottom', ...(ngDevMode ? [{ debugName: "isVertical" }] : []));
24
- requiredValidator = Validators.required;
25
- value = signal(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
26
- disabled = signal(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
27
- onTouched = () => { };
28
- onModelChange = () => { };
29
- constructor() {
30
- if (this.ngControl) {
31
- this.ngControl.valueAccessor = this;
32
- }
33
- // Effect to apply pInputs reactively when the pInputs signal changes
34
- effect(() => {
35
- const currentPInputs = this.pInputs();
36
- if (this.radioButton && currentPInputs) {
37
- this.applyInputsToRadioButton();
38
- }
39
- });
40
- // Effect to add required validator if required input is true
41
- effect(() => {
42
- if (this.ngControl?.control && this.required()) {
43
- this.ngControl.control.addValidators(Validators.required);
44
- this.ngControl.control.updateValueAndValidity();
45
- }
46
- });
47
- }
48
- applyInputsToRadioButton() {
49
- const currentPInputs = this.pInputs();
50
- if (currentPInputs) {
51
- Object.assign(this.radioButton, currentPInputs);
52
- }
53
- }
54
- onValueChange(value) {
55
- this.onModelChange(value);
56
- this.value.set(value);
57
- }
58
- writeValue(value) {
59
- this.value.set(value);
60
- }
61
- registerOnChange(fn) {
62
- this.onModelChange = fn;
63
- }
64
- registerOnTouched(fn) {
65
- this.onTouched = fn;
66
- }
67
- setDisabledState(disabled) {
68
- this.disabled.set(disabled);
69
- }
70
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: RadioButtonField, deps: [], target: i0.ɵɵFactoryTarget.Component });
71
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: RadioButtonField, isStandalone: true, selector: "mt-radio-button-field", inputs: { labelPosition: { classPropertyName: "labelPosition", publicName: "labelPosition", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, pInputs: { classPropertyName: "pInputs", publicName: "pInputs", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onChange: "onChange" }, host: { classAttribute: "grid gap-1" }, ngImport: i0, template: "@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n\r\n<div\r\n class=\"flex gap-3\"\r\n [class.flex-col]=\"orientation() === 'vertical'\"\r\n [class.flex-row]=\"orientation() === 'horizontal'\"\r\n [class.flex-wrap]=\"orientation() === 'horizontal'\"\r\n>\r\n @for (option of options(); track option) {\r\n <div\r\n class=\"flex gap-1\"\r\n [class.items-center]=\"!isVertical()\"\r\n [class.gap-2]=\"!isVertical()\"\r\n [class.flex-col]=\"isVertical()\"\r\n [class.flex-col-reverse]=\"labelPosition() === 'top'\"\r\n [class.flex-row-reverse]=\"labelPosition() === 'start'\"\r\n [class.justify-end]=\"labelPosition() === 'start'\"\r\n >\r\n <p-radiobutton\r\n [size]=\"size()\"\r\n #radiobutton\r\n [ngModel]=\"value()\"\r\n [value]=\"option.value\"\r\n [inputId]=\"option?.label\"\r\n (ngModelChange)=\"onValueChange($event)\"\r\n (onClick)=\"onChange.emit($event)\"\r\n (onBlur)=\"onTouched()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n class=\"leading-none\"\r\n ></p-radiobutton>\r\n\r\n @if (option?.label) {\r\n <label [for]=\"option?.label\">{{ option?.label }}</label>\r\n }\r\n </div>\r\n }\r\n</div>\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: RadioButtonModule }, { kind: "component", type: i2.RadioButton, selector: "p-radioButton, p-radiobutton, p-radio-button", inputs: ["value", "tabindex", "inputId", "ariaLabelledBy", "ariaLabel", "styleClass", "autofocus", "binary", "variant", "size"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: FieldValidation, selector: "mt-field-validation", inputs: ["control", "touched"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
72
- }
73
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: RadioButtonField, decorators: [{
74
- type: Component,
75
- args: [{ selector: 'mt-radio-button-field', standalone: true, imports: [FormsModule, RadioButtonModule, FieldValidation], changeDetection: ChangeDetectionStrategy.OnPush, host: {
76
- class: 'grid gap-1',
77
- }, template: "@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n\r\n<div\r\n class=\"flex gap-3\"\r\n [class.flex-col]=\"orientation() === 'vertical'\"\r\n [class.flex-row]=\"orientation() === 'horizontal'\"\r\n [class.flex-wrap]=\"orientation() === 'horizontal'\"\r\n>\r\n @for (option of options(); track option) {\r\n <div\r\n class=\"flex gap-1\"\r\n [class.items-center]=\"!isVertical()\"\r\n [class.gap-2]=\"!isVertical()\"\r\n [class.flex-col]=\"isVertical()\"\r\n [class.flex-col-reverse]=\"labelPosition() === 'top'\"\r\n [class.flex-row-reverse]=\"labelPosition() === 'start'\"\r\n [class.justify-end]=\"labelPosition() === 'start'\"\r\n >\r\n <p-radiobutton\r\n [size]=\"size()\"\r\n #radiobutton\r\n [ngModel]=\"value()\"\r\n [value]=\"option.value\"\r\n [inputId]=\"option?.label\"\r\n (ngModelChange)=\"onValueChange($event)\"\r\n (onClick)=\"onChange.emit($event)\"\r\n (onBlur)=\"onTouched()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n class=\"leading-none\"\r\n ></p-radiobutton>\r\n\r\n @if (option?.label) {\r\n <label [for]=\"option?.label\">{{ option?.label }}</label>\r\n }\r\n </div>\r\n }\r\n</div>\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n" }]
78
- }], ctorParameters: () => [], propDecorators: { labelPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelPosition", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], pInputs: [{ type: i0.Input, args: [{ isSignal: true, alias: "pInputs", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], onChange: [{ type: i0.Output, args: ["onChange"] }] } });
79
-
80
- /**
81
- * Generated bundle index. Do not edit.
82
- */
83
-
84
- export { RadioButtonField };
85
- //# sourceMappingURL=masterteam-components-radio-button-field.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"masterteam-components-radio-button-field.mjs","sources":["../../../../packages/masterteam/components/radio-button-field/radio-button-field.ts","../../../../packages/masterteam/components/radio-button-field/radio-button-field.html","../../../../packages/masterteam/components/radio-button-field/masterteam-components-radio-button-field.ts"],"sourcesContent":["import {\r\n Component,\r\n signal,\r\n input,\r\n output,\r\n inject,\r\n ChangeDetectionStrategy,\r\n computed,\r\n effect,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NgControl,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { RadioButton, RadioButtonModule } from 'primeng/radiobutton';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { isInvalid } from '@masterteam/components';\r\n\r\nexport interface radioOptions {\r\n label: string;\r\n value: string;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-radio-button-field',\r\n standalone: true,\r\n imports: [FormsModule, RadioButtonModule, FieldValidation],\r\n templateUrl: './radio-button-field.html',\r\n styleUrls: ['./radio-button-field.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-1',\r\n },\r\n})\r\nexport class RadioButtonField implements ControlValueAccessor {\r\n radioButton: RadioButton;\r\n labelPosition = input<'top' | 'start' | 'end' | 'bottom'>('end');\r\n orientation = input<'vertical' | 'horizontal'>('vertical');\r\n readonly = input<boolean>(false);\r\n pInputs = input<Partial<RadioButton>>();\r\n required = input<boolean>(false);\r\n options = input<radioOptions[]>([]);\r\n size = input<'small' | 'large' | undefined>();\r\n label = input<string>();\r\n onChange = output<string>();\r\n\r\n public ngControl = inject(NgControl, { self: true });\r\n\r\n isInvalid = isInvalid;\r\n\r\n isVertical = computed(\r\n () => this.labelPosition() === 'top' || this.labelPosition() === 'bottom',\r\n );\r\n\r\n requiredValidator = Validators.required;\r\n value = signal<string | null>(null);\r\n disabled = signal<boolean>(false);\r\n\r\n onTouched: () => void = () => {};\r\n onModelChange: (value: string | null) => void = () => {};\r\n\r\n constructor() {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n // Effect to apply pInputs reactively when the pInputs signal changes\r\n effect(() => {\r\n const currentPInputs = this.pInputs();\r\n\r\n if (this.radioButton && currentPInputs) {\r\n this.applyInputsToRadioButton();\r\n }\r\n });\r\n\r\n // Effect to add required validator if required input is true\r\n effect(() => {\r\n if (this.ngControl?.control && this.required()) {\r\n this.ngControl.control.addValidators(Validators.required);\r\n this.ngControl.control.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n applyInputsToRadioButton() {\r\n const currentPInputs = this.pInputs();\r\n if (currentPInputs) {\r\n Object.assign(this.radioButton, currentPInputs);\r\n }\r\n }\r\n\r\n onValueChange(value: string | null) {\r\n this.onModelChange(value);\r\n this.value.set(value);\r\n }\r\n\r\n writeValue(value: string | null) {\r\n this.value.set(value);\r\n }\r\n\r\n registerOnChange(fn: any) {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any) {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean) {\r\n this.disabled.set(disabled);\r\n }\r\n}\r\n","@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n\r\n<div\r\n class=\"flex gap-3\"\r\n [class.flex-col]=\"orientation() === 'vertical'\"\r\n [class.flex-row]=\"orientation() === 'horizontal'\"\r\n [class.flex-wrap]=\"orientation() === 'horizontal'\"\r\n>\r\n @for (option of options(); track option) {\r\n <div\r\n class=\"flex gap-1\"\r\n [class.items-center]=\"!isVertical()\"\r\n [class.gap-2]=\"!isVertical()\"\r\n [class.flex-col]=\"isVertical()\"\r\n [class.flex-col-reverse]=\"labelPosition() === 'top'\"\r\n [class.flex-row-reverse]=\"labelPosition() === 'start'\"\r\n [class.justify-end]=\"labelPosition() === 'start'\"\r\n >\r\n <p-radiobutton\r\n [size]=\"size()\"\r\n #radiobutton\r\n [ngModel]=\"value()\"\r\n [value]=\"option.value\"\r\n [inputId]=\"option?.label\"\r\n (ngModelChange)=\"onValueChange($event)\"\r\n (onClick)=\"onChange.emit($event)\"\r\n (onBlur)=\"onTouched()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n class=\"leading-none\"\r\n ></p-radiobutton>\r\n\r\n @if (option?.label) {\r\n <label [for]=\"option?.label\">{{ option?.label }}</label>\r\n }\r\n </div>\r\n }\r\n</div>\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}