@masterteam/components 0.0.124 → 0.0.125

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, booleanAttribute, contentChild, TemplateRef, signal, inject, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { input, booleanAttribute, contentChild, TemplateRef, signal, computed, inject, effect, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { Validators, NgControl, FormsModule } from '@angular/forms';
4
4
  import { RadioCards } from '@masterteam/components/radio-cards';
5
5
  import { FieldValidation } from '@masterteam/components/field-validation';
@@ -7,13 +7,19 @@ import { FieldValidation } from '@masterteam/components/field-validation';
7
7
  class RadioCardsField {
8
8
  circle = input(false, { ...(ngDevMode ? { debugName: "circle" } : {}), transform: booleanAttribute });
9
9
  label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
10
+ readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : []));
10
11
  required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : []));
11
12
  color = input('primary', ...(ngDevMode ? [{ debugName: "color" }] : []));
12
13
  size = input('medium', ...(ngDevMode ? [{ debugName: "size" }] : []));
14
+ optionLabel = input('label', ...(ngDevMode ? [{ debugName: "optionLabel" }] : []));
15
+ optionValue = input('value', ...(ngDevMode ? [{ debugName: "optionValue" }] : []));
13
16
  options = input.required(...(ngDevMode ? [{ debugName: "options" }] : []));
14
17
  itemTemplate = contentChild('option', { ...(ngDevMode ? { debugName: "itemTemplate" } : {}), read: TemplateRef });
15
18
  selectedId = signal(null, ...(ngDevMode ? [{ debugName: "selectedId" }] : []));
16
19
  isDisabled = signal(false, ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
20
+ normalizedOptions = computed(() => this.options()
21
+ .map((option) => normalizeRadioItem(option, this.optionLabel(), this.optionValue()))
22
+ .filter((option) => option !== null), ...(ngDevMode ? [{ debugName: "normalizedOptions" }] : []));
17
23
  requiredValidator = Validators.required;
18
24
  ngControl = null;
19
25
  constructor() {
@@ -26,12 +32,18 @@ class RadioCardsField {
26
32
  catch (_e) {
27
33
  this.ngControl = null;
28
34
  }
35
+ effect(() => {
36
+ if (this.ngControl?.control && this.required()) {
37
+ this.ngControl.control.addValidators(Validators.required);
38
+ this.ngControl.control.updateValueAndValidity({ emitEvent: false });
39
+ }
40
+ });
29
41
  }
30
42
  // --- CVA Methods ---
31
43
  onChange = () => { };
32
44
  onTouched = () => { };
33
45
  writeValue(value) {
34
- this.selectedId.set(value);
46
+ this.selectedId.set(value ?? null);
35
47
  }
36
48
  registerOnChange(fn) {
37
49
  this.onChange = fn;
@@ -43,22 +55,65 @@ class RadioCardsField {
43
55
  this.isDisabled.set(isDisabled);
44
56
  }
45
57
  onSelectionChange(selectedItem) {
46
- if (!this.isDisabled()) {
47
- const newId = selectedItem.id;
48
- this.selectedId.set(newId);
49
- this.onChange(newId);
50
- this.onTouched();
58
+ if (this.isDisabled() || this.readonly()) {
59
+ return;
60
+ }
61
+ const newId = selectedItem.id;
62
+ this.selectedId.set(newId);
63
+ const control = this.ngControl?.control;
64
+ if (control) {
65
+ control.setValue(newId);
66
+ control.markAsDirty();
67
+ control.markAsTouched();
68
+ control.updateValueAndValidity({ emitEvent: false });
69
+ return;
51
70
  }
71
+ this.onChange(newId);
72
+ this.onTouched();
52
73
  }
53
74
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: RadioCardsField, deps: [], target: i0.ɵɵFactoryTarget.Component });
54
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: RadioCardsField, isStandalone: true, selector: "mt-radio-cards-field", inputs: { circle: { classPropertyName: "circle", publicName: "circle", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "grid gap-1" }, providers: [], queries: [{ propertyName: "itemTemplate", first: true, predicate: ["option"], descendants: true, read: TemplateRef, isSignal: true }], ngImport: i0, template: "@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<div\r\n class=\"relative\"\r\n [class.opacity-50]=\"isDisabled()\"\r\n [class.pointer-events-none]=\"isDisabled()\"\r\n [id]=\"ngControl?.name || label()\"\r\n>\r\n <mt-radio-cards\r\n [options]=\"options()\"\r\n [activeId]=\"selectedId()\"\r\n [color]=\"color()\"\r\n [size]=\"size()\"\r\n [circle]=\"circle()\"\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n [itemTemplate]=\"itemTemplate()\"\r\n ></mt-radio-cards>\r\n</div>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "component", type: RadioCards, selector: "mt-radio-cards", inputs: ["circle", "color", "size", "columns", "options", "activeId", "itemTemplate"], outputs: ["optionsChange", "activeIdChange", "selectionChange"] }, { kind: "component", type: FieldValidation, selector: "mt-field-validation", inputs: ["control", "touched"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
75
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: RadioCardsField, isStandalone: true, selector: "mt-radio-cards-field", inputs: { circle: { classPropertyName: "circle", publicName: "circle", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, optionLabel: { classPropertyName: "optionLabel", publicName: "optionLabel", isSignal: true, isRequired: false, transformFunction: null }, optionValue: { classPropertyName: "optionValue", publicName: "optionValue", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "grid gap-1" }, providers: [], queries: [{ propertyName: "itemTemplate", first: true, predicate: ["option"], descendants: true, read: TemplateRef, isSignal: true }], ngImport: i0, template: "@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<div\r\n class=\"relative\"\r\n [class.opacity-50]=\"isDisabled()\"\r\n [class.pointer-events-none]=\"isDisabled()\"\r\n [id]=\"ngControl?.name || label()\"\r\n>\r\n <mt-radio-cards\r\n [options]=\"normalizedOptions()\"\r\n [activeId]=\"selectedId()\"\r\n [color]=\"color()\"\r\n [size]=\"size()\"\r\n [circle]=\"circle()\"\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n [itemTemplate]=\"itemTemplate()\"\r\n ></mt-radio-cards>\r\n</div>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "component", type: RadioCards, selector: "mt-radio-cards", inputs: ["circle", "color", "size", "columns", "options", "activeId", "itemTemplate"], outputs: ["optionsChange", "activeIdChange", "selectionChange"] }, { kind: "component", type: FieldValidation, selector: "mt-field-validation", inputs: ["control", "touched"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
55
76
  }
56
77
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: RadioCardsField, decorators: [{
57
78
  type: Component,
58
79
  args: [{ selector: 'mt-radio-cards-field', standalone: true, imports: [FormsModule, RadioCards, FieldValidation], changeDetection: ChangeDetectionStrategy.OnPush, host: {
59
80
  class: 'grid gap-1',
60
- }, providers: [], template: "@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<div\r\n class=\"relative\"\r\n [class.opacity-50]=\"isDisabled()\"\r\n [class.pointer-events-none]=\"isDisabled()\"\r\n [id]=\"ngControl?.name || label()\"\r\n>\r\n <mt-radio-cards\r\n [options]=\"options()\"\r\n [activeId]=\"selectedId()\"\r\n [color]=\"color()\"\r\n [size]=\"size()\"\r\n [circle]=\"circle()\"\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n [itemTemplate]=\"itemTemplate()\"\r\n ></mt-radio-cards>\r\n</div>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n" }]
61
- }], ctorParameters: () => [], propDecorators: { circle: [{ type: i0.Input, args: [{ isSignal: true, alias: "circle", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], itemTemplate: [{ type: i0.ContentChild, args: ['option', { ...{ read: TemplateRef }, isSignal: true }] }] } });
81
+ }, providers: [], template: "@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<div\r\n class=\"relative\"\r\n [class.opacity-50]=\"isDisabled()\"\r\n [class.pointer-events-none]=\"isDisabled()\"\r\n [id]=\"ngControl?.name || label()\"\r\n>\r\n <mt-radio-cards\r\n [options]=\"normalizedOptions()\"\r\n [activeId]=\"selectedId()\"\r\n [color]=\"color()\"\r\n [size]=\"size()\"\r\n [circle]=\"circle()\"\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n [itemTemplate]=\"itemTemplate()\"\r\n ></mt-radio-cards>\r\n</div>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n" }]
82
+ }], ctorParameters: () => [], propDecorators: { circle: [{ type: i0.Input, args: [{ isSignal: true, alias: "circle", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: false }] }], optionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValue", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], itemTemplate: [{ type: i0.ContentChild, args: ['option', { ...{ read: TemplateRef }, isSignal: true }] }] } });
83
+ function normalizeRadioItem(option, optionLabel, optionValue) {
84
+ if (option === null || option === undefined) {
85
+ return null;
86
+ }
87
+ if (typeof option === 'string' || typeof option === 'number') {
88
+ return {
89
+ id: option,
90
+ name: String(option),
91
+ };
92
+ }
93
+ if (typeof option !== 'object') {
94
+ return null;
95
+ }
96
+ const source = option;
97
+ const id = readRadioItemValue(source, optionValue, ['id', 'value']);
98
+ if (typeof id !== 'string' && typeof id !== 'number') {
99
+ return null;
100
+ }
101
+ const name = readRadioItemValue(source, optionLabel, ['name', 'label']);
102
+ return {
103
+ ...source,
104
+ id,
105
+ name: typeof name === 'string' ? name : String(name ?? id),
106
+ };
107
+ }
108
+ function readRadioItemValue(source, preferredKey, fallbackKeys) {
109
+ const candidateKeys = [preferredKey, ...fallbackKeys].filter(Boolean);
110
+ for (const key of candidateKeys) {
111
+ if (key in source) {
112
+ return source[key];
113
+ }
114
+ }
115
+ return undefined;
116
+ }
62
117
 
63
118
  /**
64
119
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"masterteam-components-radio-cards-field.mjs","sources":["../../../../packages/masterteam/components/radio-cards-field/radio-cards-field.ts","../../../../packages/masterteam/components/radio-cards-field/radio-cards-field.html","../../../../packages/masterteam/components/radio-cards-field/masterteam-components-radio-cards-field.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n input,\r\n signal,\r\n TemplateRef,\r\n contentChild,\r\n inject,\r\n booleanAttribute,\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 { RadioCards, RadioItem } from '@masterteam/components/radio-cards';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\n\r\n@Component({\r\n selector: 'mt-radio-cards-field',\r\n standalone: true,\r\n imports: [FormsModule, RadioCards, FieldValidation],\r\n templateUrl: './radio-cards-field.html',\r\n styleUrl: './radio-cards-field.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-1',\r\n },\r\n providers: [],\r\n})\r\nexport class RadioCardsField implements ControlValueAccessor {\r\n readonly circle = input<boolean, unknown>(false, {\r\n transform: booleanAttribute,\r\n });\r\n readonly label = input<string>();\r\n readonly required = input<boolean>(false);\r\n readonly color = input<string>('primary');\r\n readonly size = input<'small' | 'medium' | 'large'>('medium');\r\n readonly options = input.required<RadioItem[]>();\r\n readonly itemTemplate = contentChild('option', { read: TemplateRef });\r\n\r\n protected selectedId = signal<string | number | null>(null);\r\n protected isDisabled = signal(false);\r\n\r\n requiredValidator = Validators.required;\r\n\r\n public ngControl: NgControl | null = null;\r\n\r\n constructor() {\r\n try {\r\n this.ngControl = inject(NgControl, { self: true, optional: true });\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n } catch (_e) {\r\n this.ngControl = null;\r\n }\r\n }\r\n\r\n // --- CVA Methods ---\r\n private onChange: (value: string | number) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n writeValue(value: string | number): void {\r\n this.selectedId.set(value);\r\n }\r\n\r\n registerOnChange(fn: (value: string | number) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled.set(isDisabled);\r\n }\r\n\r\n onSelectionChange(selectedItem: RadioItem): void {\r\n if (!this.isDisabled()) {\r\n const newId = selectedItem.id;\r\n this.selectedId.set(newId);\r\n this.onChange(newId);\r\n this.onTouched();\r\n }\r\n }\r\n}\r\n","@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<div\r\n class=\"relative\"\r\n [class.opacity-50]=\"isDisabled()\"\r\n [class.pointer-events-none]=\"isDisabled()\"\r\n [id]=\"ngControl?.name || label()\"\r\n>\r\n <mt-radio-cards\r\n [options]=\"options()\"\r\n [activeId]=\"selectedId()\"\r\n [color]=\"color()\"\r\n [size]=\"size()\"\r\n [circle]=\"circle()\"\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n [itemTemplate]=\"itemTemplate()\"\r\n ></mt-radio-cards>\r\n</div>\r\n\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":";;;;;;MA+Ba,eAAe,CAAA;IACjB,MAAM,GAAG,KAAK,CAAmB,KAAK,mDAC7C,SAAS,EAAE,gBAAgB,EAAA,CAC3B;IACO,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AACvB,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;AAChC,IAAA,KAAK,GAAG,KAAK,CAAS,SAAS,iDAAC;AAChC,IAAA,IAAI,GAAG,KAAK,CAA+B,QAAQ,gDAAC;AACpD,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,kDAAe;IACvC,YAAY,GAAG,YAAY,CAAC,QAAQ,yDAAI,IAAI,EAAE,WAAW,EAAA,CAAG;AAE3D,IAAA,UAAU,GAAG,MAAM,CAAyB,IAAI,sDAAC;AACjD,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;AAEpC,IAAA,iBAAiB,GAAG,UAAU,CAAC,QAAQ;IAEhC,SAAS,GAAqB,IAAI;AAEzC,IAAA,WAAA,GAAA;AACE,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAClE,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,gBAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;YACrC;QACF;QAAE,OAAO,EAAE,EAAE;AACX,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACvB;IACF;;AAGQ,IAAA,QAAQ,GAAqC,MAAK,EAAE,CAAC;AACrD,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAExC,IAAA,UAAU,CAAC,KAAsB,EAAA;AAC/B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAC5B;AAEA,IAAA,gBAAgB,CAAC,EAAoC,EAAA;AACnD,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;IACjC;AAEA,IAAA,iBAAiB,CAAC,YAAuB,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;AACtB,YAAA,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACpB,IAAI,CAAC,SAAS,EAAE;QAClB;IACF;uGAxDW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,YAAA,EAAA,EAAA,SAAA,EAFf,EAAE,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAW0C,WAAW,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxCpE,6uBAyBA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDHY,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,gBAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FASvC,eAAe,EAAA,UAAA,EAAA,CAAA;kBAZ3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,OAAA,EACP,CAAC,WAAW,EAAE,UAAU,EAAE,eAAe,CAAC,EAAA,eAAA,EAGlC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,YAAY;AACpB,qBAAA,EAAA,SAAA,EACU,EAAE,EAAA,QAAA,EAAA,6uBAAA,EAAA;AAWwB,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,QAAQ,EAAA,EAAA,GAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AExCtE;;AAEG;;;;"}
1
+ {"version":3,"file":"masterteam-components-radio-cards-field.mjs","sources":["../../../../packages/masterteam/components/radio-cards-field/radio-cards-field.ts","../../../../packages/masterteam/components/radio-cards-field/radio-cards-field.html","../../../../packages/masterteam/components/radio-cards-field/masterteam-components-radio-cards-field.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n input,\r\n signal,\r\n TemplateRef,\r\n contentChild,\r\n inject,\r\n booleanAttribute,\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 { RadioCards, RadioItem } from '@masterteam/components/radio-cards';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\n\r\n@Component({\r\n selector: 'mt-radio-cards-field',\r\n standalone: true,\r\n imports: [FormsModule, RadioCards, FieldValidation],\r\n templateUrl: './radio-cards-field.html',\r\n styleUrl: './radio-cards-field.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-1',\r\n },\r\n providers: [],\r\n})\r\nexport class RadioCardsField implements ControlValueAccessor {\r\n readonly circle = input<boolean, unknown>(false, {\r\n transform: booleanAttribute,\r\n });\r\n readonly label = input<string>();\r\n readonly readonly = input<boolean>(false);\r\n readonly required = input<boolean>(false);\r\n readonly color = input<string>('primary');\r\n readonly size = input<'small' | 'medium' | 'large'>('medium');\r\n readonly optionLabel = input<string>('label');\r\n readonly optionValue = input<string>('value');\r\n readonly options = input.required<unknown[]>();\r\n readonly itemTemplate = contentChild('option', { read: TemplateRef });\r\n\r\n protected selectedId = signal<string | number | null>(null);\r\n protected isDisabled = signal(false);\r\n protected readonly normalizedOptions = computed<RadioItem[]>(() =>\r\n this.options()\r\n .map((option) =>\r\n normalizeRadioItem(option, this.optionLabel(), this.optionValue()),\r\n )\r\n .filter((option): option is RadioItem => option !== null),\r\n );\r\n\r\n requiredValidator = Validators.required;\r\n\r\n public ngControl: NgControl | null = null;\r\n\r\n constructor() {\r\n try {\r\n this.ngControl = inject(NgControl, { self: true, optional: true });\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n } catch (_e) {\r\n this.ngControl = null;\r\n }\r\n\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({ emitEvent: false });\r\n }\r\n });\r\n }\r\n\r\n // --- CVA Methods ---\r\n private onChange: (value: string | number | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n writeValue(value: string | number | null): void {\r\n this.selectedId.set(value ?? null);\r\n }\r\n\r\n registerOnChange(fn: (value: string | number | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled.set(isDisabled);\r\n }\r\n\r\n onSelectionChange(selectedItem: RadioItem): void {\r\n if (this.isDisabled() || this.readonly()) {\r\n return;\r\n }\r\n\r\n const newId = selectedItem.id;\r\n this.selectedId.set(newId);\r\n\r\n const control = this.ngControl?.control;\r\n if (control) {\r\n control.setValue(newId);\r\n control.markAsDirty();\r\n control.markAsTouched();\r\n control.updateValueAndValidity({ emitEvent: false });\r\n return;\r\n }\r\n\r\n this.onChange(newId);\r\n this.onTouched();\r\n }\r\n}\r\n\r\nfunction normalizeRadioItem(\r\n option: unknown,\r\n optionLabel: string,\r\n optionValue: string,\r\n): RadioItem | null {\r\n if (option === null || option === undefined) {\r\n return null;\r\n }\r\n\r\n if (typeof option === 'string' || typeof option === 'number') {\r\n return {\r\n id: option,\r\n name: String(option),\r\n };\r\n }\r\n\r\n if (typeof option !== 'object') {\r\n return null;\r\n }\r\n\r\n const source = option as Record<string, unknown>;\r\n const id = readRadioItemValue(source, optionValue, ['id', 'value']);\r\n if (typeof id !== 'string' && typeof id !== 'number') {\r\n return null;\r\n }\r\n\r\n const name = readRadioItemValue(source, optionLabel, ['name', 'label']);\r\n\r\n return {\r\n ...source,\r\n id,\r\n name: typeof name === 'string' ? name : String(name ?? id),\r\n };\r\n}\r\n\r\nfunction readRadioItemValue(\r\n source: Record<string, unknown>,\r\n preferredKey: string,\r\n fallbackKeys: string[],\r\n): unknown {\r\n const candidateKeys = [preferredKey, ...fallbackKeys].filter(Boolean);\r\n\r\n for (const key of candidateKeys) {\r\n if (key in source) {\r\n return source[key];\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n","@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<div\r\n class=\"relative\"\r\n [class.opacity-50]=\"isDisabled()\"\r\n [class.pointer-events-none]=\"isDisabled()\"\r\n [id]=\"ngControl?.name || label()\"\r\n>\r\n <mt-radio-cards\r\n [options]=\"normalizedOptions()\"\r\n [activeId]=\"selectedId()\"\r\n [color]=\"color()\"\r\n [size]=\"size()\"\r\n [circle]=\"circle()\"\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n [itemTemplate]=\"itemTemplate()\"\r\n ></mt-radio-cards>\r\n</div>\r\n\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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"}