ngx-dynamic-entity 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +14 -0
  2. package/fesm2022/ngx-dynamic-entity.mjs +255 -157
  3. package/fesm2022/ngx-dynamic-entity.mjs.map +1 -1
  4. package/package.json +6 -7
  5. package/types/ngx-dynamic-entity.d.ts +1730 -0
  6. package/esm2022/lib/field-types/array-field.component.mjs +0 -168
  7. package/esm2022/lib/field-types/boolean-field.component.mjs +0 -101
  8. package/esm2022/lib/field-types/checkbox-field.component.mjs +0 -82
  9. package/esm2022/lib/field-types/currency-field.component.mjs +0 -102
  10. package/esm2022/lib/field-types/date-field.component.mjs +0 -91
  11. package/esm2022/lib/field-types/date-time-field.component.mjs +0 -138
  12. package/esm2022/lib/field-types/dropdown-field.component.mjs +0 -176
  13. package/esm2022/lib/field-types/email-field.component.mjs +0 -102
  14. package/esm2022/lib/field-types/entity-ref-field.component.mjs +0 -195
  15. package/esm2022/lib/field-types/field-component.contract.mjs +0 -2
  16. package/esm2022/lib/field-types/file-field.component.mjs +0 -157
  17. package/esm2022/lib/field-types/group-field.component.mjs +0 -89
  18. package/esm2022/lib/field-types/image-field.component.mjs +0 -169
  19. package/esm2022/lib/field-types/month-year-field.component.mjs +0 -152
  20. package/esm2022/lib/field-types/multi-select-field.component.mjs +0 -146
  21. package/esm2022/lib/field-types/number-field.component.mjs +0 -112
  22. package/esm2022/lib/field-types/password-field.component.mjs +0 -110
  23. package/esm2022/lib/field-types/radio-field.component.mjs +0 -153
  24. package/esm2022/lib/field-types/text-field.component.mjs +0 -121
  25. package/esm2022/lib/field-types/textarea-field.component.mjs +0 -85
  26. package/esm2022/lib/field-types/time-field.component.mjs +0 -96
  27. package/esm2022/lib/form/dynamic-field/dynamic-field.component.mjs +0 -152
  28. package/esm2022/lib/form/dynamic-form.component.mjs +0 -899
  29. package/esm2022/lib/form/dynamic-record-form.component.mjs +0 -531
  30. package/esm2022/lib/providers/provide-field-types.mjs +0 -75
  31. package/esm2022/lib/providers/provide-ngx-dynamic-entity.mjs +0 -27
  32. package/esm2022/lib/services/cascade-data.service.mjs +0 -129
  33. package/esm2022/lib/services/config-source.service.mjs +0 -67
  34. package/esm2022/lib/services/entity-ref-cache.mjs +0 -20
  35. package/esm2022/lib/services/entity-ref-registry.service.mjs +0 -31
  36. package/esm2022/lib/services/entity-ref-selection.service.mjs +0 -27
  37. package/esm2022/lib/services/entity-reference.service.mjs +0 -168
  38. package/esm2022/lib/services/field-registry.service.mjs +0 -55
  39. package/esm2022/lib/services/file-upload.service.mjs +0 -89
  40. package/esm2022/lib/services/hook-registry.service.mjs +0 -26
  41. package/esm2022/lib/services/lookup-registry.service.mjs +0 -246
  42. package/esm2022/lib/services/rbac.service.mjs +0 -46
  43. package/esm2022/lib/services/rules-evaluation.service.mjs +0 -27
  44. package/esm2022/lib/services/validation-messages.service.mjs +0 -56
  45. package/esm2022/lib/services/validator-registry.service.mjs +0 -99
  46. package/esm2022/lib/tokens/injection-tokens.mjs +0 -126
  47. package/esm2022/ngx-dynamic-entity.mjs +0 -5
  48. package/esm2022/public-api.mjs +0 -58
  49. package/index.d.ts +0 -5
  50. package/lib/field-types/array-field.component.d.ts +0 -28
  51. package/lib/field-types/boolean-field.component.d.ts +0 -18
  52. package/lib/field-types/checkbox-field.component.d.ts +0 -13
  53. package/lib/field-types/currency-field.component.d.ts +0 -17
  54. package/lib/field-types/date-field.component.d.ts +0 -15
  55. package/lib/field-types/date-time-field.component.d.ts +0 -30
  56. package/lib/field-types/dropdown-field.component.d.ts +0 -34
  57. package/lib/field-types/email-field.component.d.ts +0 -15
  58. package/lib/field-types/entity-ref-field.component.d.ts +0 -49
  59. package/lib/field-types/field-component.contract.d.ts +0 -49
  60. package/lib/field-types/file-field.component.d.ts +0 -25
  61. package/lib/field-types/group-field.component.d.ts +0 -17
  62. package/lib/field-types/image-field.component.d.ts +0 -30
  63. package/lib/field-types/month-year-field.component.d.ts +0 -28
  64. package/lib/field-types/multi-select-field.component.d.ts +0 -27
  65. package/lib/field-types/number-field.component.d.ts +0 -16
  66. package/lib/field-types/password-field.component.d.ts +0 -17
  67. package/lib/field-types/radio-field.component.d.ts +0 -33
  68. package/lib/field-types/text-field.component.d.ts +0 -23
  69. package/lib/field-types/textarea-field.component.d.ts +0 -14
  70. package/lib/field-types/time-field.component.d.ts +0 -27
  71. package/lib/form/dynamic-field/dynamic-field.component.d.ts +0 -78
  72. package/lib/form/dynamic-form.component.d.ts +0 -293
  73. package/lib/form/dynamic-record-form.component.d.ts +0 -199
  74. package/lib/providers/provide-field-types.d.ts +0 -24
  75. package/lib/providers/provide-ngx-dynamic-entity.d.ts +0 -56
  76. package/lib/services/cascade-data.service.d.ts +0 -45
  77. package/lib/services/config-source.service.d.ts +0 -14
  78. package/lib/services/entity-ref-cache.d.ts +0 -27
  79. package/lib/services/entity-ref-registry.service.d.ts +0 -21
  80. package/lib/services/entity-ref-selection.service.d.ts +0 -24
  81. package/lib/services/entity-reference.service.d.ts +0 -49
  82. package/lib/services/field-registry.service.d.ts +0 -32
  83. package/lib/services/file-upload.service.d.ts +0 -27
  84. package/lib/services/hook-registry.service.d.ts +0 -12
  85. package/lib/services/lookup-registry.service.d.ts +0 -94
  86. package/lib/services/rbac.service.d.ts +0 -27
  87. package/lib/services/rules-evaluation.service.d.ts +0 -17
  88. package/lib/services/validation-messages.service.d.ts +0 -43
  89. package/lib/services/validator-registry.service.d.ts +0 -32
  90. package/lib/tokens/injection-tokens.d.ts +0 -134
  91. package/public-api.d.ts +0 -42
@@ -1,110 +0,0 @@
1
- import { Component, Input, signal, ChangeDetectionStrategy } from '@angular/core';
2
- import { ReactiveFormsModule } from '@angular/forms';
3
- import { resolveLabel } from '@dynamic-entity/core';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/forms";
6
- /** Password field: masked input with show/hide eye toggle. */
7
- export class PasswordFieldComponent {
8
- field;
9
- control;
10
- language = 'en';
11
- readonly = false;
12
- masked = false;
13
- visible = signal(false);
14
- get label() {
15
- return resolveLabel(this.field?.label, this.language);
16
- }
17
- get placeholder() {
18
- return resolveLabel(this.field?.placeholder, this.language);
19
- }
20
- toggleVisibility() {
21
- this.visible.update(v => !v);
22
- }
23
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PasswordFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
24
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: PasswordFieldComponent, isStandalone: true, selector: "ngx-password-field", inputs: { field: "field", control: "control", language: "language", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
25
- <div class="ngx-field ngx-field--password"
26
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
27
- <label class="ngx-field__label">{{ label }}</label>
28
- @if (masked) {
29
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
30
- } @else if (readonly) {
31
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">••••••••</span>
32
- } @else {
33
- <div class="ngx-field__password-wrap">
34
- <input
35
- class="ngx-field__input" [attr.data-testid]="'field-' + field.id + '-input'"
36
- [type]="visible() ? 'text' : 'password'"
37
- autocomplete="current-password"
38
- [formControl]="$any(control)"
39
- [placeholder]="placeholder || '••••••••'"
40
- [attr.disabled]="field.disabled ? true : null"
41
- />
42
- <button
43
- type="button"
44
- class="ngx-field__eye-btn"
45
- (click)="toggleVisibility()"
46
- [attr.aria-label]="visible() ? 'Hide password' : 'Show password'"
47
- >
48
- {{ visible() ? '🙈' : '👁' }}
49
- </button>
50
- </div>
51
- @if (control.invalid && control.touched) {
52
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
53
- }
54
- }
55
- </div>
56
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
57
- }
58
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PasswordFieldComponent, decorators: [{
59
- type: Component,
60
- args: [{
61
- changeDetection: ChangeDetectionStrategy.OnPush,
62
- selector: 'ngx-password-field',
63
- standalone: true,
64
- imports: [ReactiveFormsModule],
65
- template: `
66
- <div class="ngx-field ngx-field--password"
67
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
68
- <label class="ngx-field__label">{{ label }}</label>
69
- @if (masked) {
70
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
71
- } @else if (readonly) {
72
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">••••••••</span>
73
- } @else {
74
- <div class="ngx-field__password-wrap">
75
- <input
76
- class="ngx-field__input" [attr.data-testid]="'field-' + field.id + '-input'"
77
- [type]="visible() ? 'text' : 'password'"
78
- autocomplete="current-password"
79
- [formControl]="$any(control)"
80
- [placeholder]="placeholder || '••••••••'"
81
- [attr.disabled]="field.disabled ? true : null"
82
- />
83
- <button
84
- type="button"
85
- class="ngx-field__eye-btn"
86
- (click)="toggleVisibility()"
87
- [attr.aria-label]="visible() ? 'Hide password' : 'Show password'"
88
- >
89
- {{ visible() ? '🙈' : '👁' }}
90
- </button>
91
- </div>
92
- @if (control.invalid && control.touched) {
93
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
94
- }
95
- }
96
- </div>
97
- `,
98
- }]
99
- }], propDecorators: { field: [{
100
- type: Input
101
- }], control: [{
102
- type: Input
103
- }], language: [{
104
- type: Input
105
- }], readonly: [{
106
- type: Input
107
- }], masked: [{
108
- type: Input
109
- }] } });
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9maWVsZC10eXBlcy9wYXNzd29yZC1maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBbUIsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQUVwRCw4REFBOEQ7QUF3QzlELE1BQU0sT0FBTyxzQkFBc0I7SUFDeEIsS0FBSyxDQUFxQjtJQUMxQixPQUFPLENBQW1CO0lBQzFCLFFBQVEsR0FBVyxJQUFJLENBQUM7SUFDeEIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixNQUFNLEdBQVksS0FBSyxDQUFDO0lBRXhCLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFakMsSUFBSSxLQUFLO1FBQ1AsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO3dHQW5CVSxzQkFBc0I7NEZBQXRCLHNCQUFzQiw0TEFsQ3ZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdDVCwyREFqQ1MsbUJBQW1COzs0RkFtQ2xCLHNCQUFzQjtrQkF2Q2xDLFNBQVM7bUJBQUM7b0JBQ1QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztvQkFDOUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdDVDtpQkFDRjs4QkFFVSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBzaWduYWwsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgdHlwZSB7IE5lc3RlZEZpZWxkQ29uZmlnIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgcmVzb2x2ZUxhYmVsIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuXG4vKiogUGFzc3dvcmQgZmllbGQ6IG1hc2tlZCBpbnB1dCB3aXRoIHNob3cvaGlkZSBleWUgdG9nZ2xlLiAqL1xuQENvbXBvbmVudCh7XG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzZWxlY3RvcjogJ25neC1wYXNzd29yZC1maWVsZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibmd4LWZpZWxkIG5neC1maWVsZC0tcGFzc3dvcmRcIlxuICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZFwiIFthdHRyLmRhdGEtZmllbGQtdHlwZV09XCJmaWVsZC50eXBlXCIgW2NsYXNzLm5neC1maWVsZC0tcmVhZG9ubHldPVwicmVhZG9ubHlcIiBbY2xhc3Mubmd4LWZpZWxkLS1tYXNrZWRdPVwibWFza2VkXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJuZ3gtZmllbGRfX2xhYmVsXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICAgICAgQGlmIChtYXNrZWQpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX3ZhbHVlIG5neC1maWVsZF9fdmFsdWUtLW1hc2tlZFwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLW1hc2tlZCdcIj5YWFhYWFhYWFg8L3NwYW4+XG4gICAgICB9IEBlbHNlIGlmIChyZWFkb25seSkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1maWVsZF9fdmFsdWVcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy12YWx1ZSdcIj7igKLigKLigKLigKLigKLigKLigKLigKI8L3NwYW4+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1maWVsZF9fcGFzc3dvcmQtd3JhcFwiPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJuZ3gtZmllbGRfX2lucHV0XCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctaW5wdXQnXCJcbiAgICAgICAgICAgIFt0eXBlXT1cInZpc2libGUoKSA/ICd0ZXh0JyA6ICdwYXNzd29yZCdcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwiY3VycmVudC1wYXNzd29yZFwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiJGFueShjb250cm9sKVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgfHwgJ+KAouKAouKAouKAouKAouKAouKAouKAoidcIlxuICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWQgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibmd4LWZpZWxkX19leWUtYnRuXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVWaXNpYmlsaXR5KClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ2aXNpYmxlKCkgPyAnSGlkZSBwYXNzd29yZCcgOiAnU2hvdyBwYXNzd29yZCdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHZpc2libGUoKSA/ICfwn5mIJyA6ICfwn5GBJyB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChjb250cm9sLmludmFsaWQgJiYgY29udHJvbC50b3VjaGVkKSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX2Vycm9yXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctZXJyb3InXCI+VGhpcyBmaWVsZCBoYXMgYW4gZXJyb3I8L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRGaWVsZENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGZpZWxkITogTmVzdGVkRmllbGRDb25maWc7XG4gIEBJbnB1dCgpIGNvbnRyb2whOiBBYnN0cmFjdENvbnRyb2w7XG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBzdHJpbmcgPSAnZW4nO1xuICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICByZWFkb25seSB2aXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcblxuICBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZUxhYmVsKHRoaXMuZmllbGQ/LmxhYmVsLCB0aGlzLmxhbmd1YWdlKTtcbiAgfVxuXG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlTGFiZWwodGhpcy5maWVsZD8ucGxhY2Vob2xkZXIsIHRoaXMubGFuZ3VhZ2UpO1xuICB9XG5cbiAgdG9nZ2xlVmlzaWJpbGl0eSgpOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGUudXBkYXRlKHYgPT4gIXYpO1xuICB9XG59XG4iXX0=
@@ -1,153 +0,0 @@
1
- import { Component, Input, inject, signal, ChangeDetectionStrategy } from '@angular/core';
2
- import { ReactiveFormsModule } from '@angular/forms';
3
- import { getOptionStoredValue, resolveLabel, resolveOptionLabel, resolveOptionValue, valuesMatch, } from '@dynamic-entity/core';
4
- import { LookupRegistryService, refreshChoiceOptions } from '../services/lookup-registry.service';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/forms";
7
- /** Radio field: a group of radio buttons built from field.options. */
8
- export class RadioFieldComponent {
9
- lookups = inject(LookupRegistryService);
10
- _field;
11
- _language = 'en';
12
- /** Setter-based so options resolve however the input is set — see `refreshChoiceOptions`. */
13
- set field(value) {
14
- this._field = value;
15
- refreshChoiceOptions(this, this.lookups);
16
- }
17
- get field() {
18
- return this._field;
19
- }
20
- set language(value) {
21
- this._language = value || 'en';
22
- refreshChoiceOptions(this, this.lookups);
23
- }
24
- get language() {
25
- return this._language;
26
- }
27
- control;
28
- readonly = false;
29
- masked = false;
30
- /** Inline `options`, or the field's named list resolved through the registry (§6.3). */
31
- options = signal([]);
32
- get label() {
33
- return resolveLabel(this.field?.label, this.language);
34
- }
35
- getOptStoredVal(option) {
36
- return getOptionStoredValue(option);
37
- }
38
- /**
39
- * Stable DOM id for one radio, so the <label for> association works.
40
- * Slugified because the option text is the value now — "On Leave" must not put a space
41
- * into an id attribute.
42
- */
43
- getRadioId(option) {
44
- const text = String(this.getOptVal(option) ?? 'opt');
45
- return `${this.field.id}-${text.trim().replace(/\s+/g, '_').toLowerCase()}`;
46
- }
47
- getOptVal(option) {
48
- return resolveOptionValue(option, this.language);
49
- }
50
- getOptLabel(option) {
51
- return resolveOptionLabel(option, this.language);
52
- }
53
- /** Read-only display — synchronous, per §6.2. See `DropdownFieldComponent.getLabel`. */
54
- getSelectedLabel() {
55
- const value = this.control?.value;
56
- // `typeof null === 'object'`, so without this guard an empty value fell through to
57
- // `resolveLabel(null)` and rendered as blank — dropdown and multiSelect both show an em dash.
58
- if (value === null || value === undefined || value === '')
59
- return '—';
60
- const selected = this.options().find(o => valuesMatch(getOptionStoredValue(o), value, this.language));
61
- if (selected)
62
- return this.getOptLabel(selected);
63
- const cached = this.lookups.labelFor(this.field?.listName, value, this.language);
64
- if (cached)
65
- return cached;
66
- return typeof value === 'object' ? resolveLabel(value, this.language) : (value ?? '—');
67
- }
68
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
69
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: RadioFieldComponent, isStandalone: true, selector: "ngx-radio-field", inputs: { field: "field", language: "language", control: "control", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
70
- <div class="ngx-field ngx-field--radio"
71
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
72
- <fieldset class="ngx-field__fieldset">
73
- <legend class="ngx-field__label">{{ label }}</legend>
74
- @if (masked) {
75
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
76
- } @else if (readonly) {
77
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ getSelectedLabel() }}</span>
78
- } @else {
79
- <div class="ngx-field__radio-group">
80
- @for (option of options(); track getOptLabel(option)) {
81
- <label class="ngx-field__radio-option" [attr.for]="getRadioId(option)">
82
- <input
83
- [id]="getRadioId(option)"
84
- type="radio"
85
- class="ngx-field__radio-input"
86
- [formControl]="$any(control)"
87
- [value]="getOptStoredVal(option)"
88
- [attr.disabled]="field.disabled ? true : null"
89
- />
90
- <span class="ngx-field__radio-label">{{ getOptLabel(option) }}</span>
91
- </label>
92
- }
93
- </div>
94
- @if (control.invalid && control.touched) {
95
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
96
- }
97
- }
98
- </fieldset>
99
- </div>
100
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
101
- }
102
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioFieldComponent, decorators: [{
103
- type: Component,
104
- args: [{
105
- changeDetection: ChangeDetectionStrategy.OnPush,
106
- selector: 'ngx-radio-field',
107
- standalone: true,
108
- imports: [ReactiveFormsModule],
109
- template: `
110
- <div class="ngx-field ngx-field--radio"
111
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
112
- <fieldset class="ngx-field__fieldset">
113
- <legend class="ngx-field__label">{{ label }}</legend>
114
- @if (masked) {
115
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
116
- } @else if (readonly) {
117
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ getSelectedLabel() }}</span>
118
- } @else {
119
- <div class="ngx-field__radio-group">
120
- @for (option of options(); track getOptLabel(option)) {
121
- <label class="ngx-field__radio-option" [attr.for]="getRadioId(option)">
122
- <input
123
- [id]="getRadioId(option)"
124
- type="radio"
125
- class="ngx-field__radio-input"
126
- [formControl]="$any(control)"
127
- [value]="getOptStoredVal(option)"
128
- [attr.disabled]="field.disabled ? true : null"
129
- />
130
- <span class="ngx-field__radio-label">{{ getOptLabel(option) }}</span>
131
- </label>
132
- }
133
- </div>
134
- @if (control.invalid && control.touched) {
135
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
136
- }
137
- }
138
- </fieldset>
139
- </div>
140
- `,
141
- }]
142
- }], propDecorators: { field: [{
143
- type: Input
144
- }], language: [{
145
- type: Input
146
- }], control: [{
147
- type: Input
148
- }], readonly: [{
149
- type: Input
150
- }], masked: [{
151
- type: Input
152
- }] } });
153
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9maWVsZC10eXBlcy9yYWRpby1maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQW1CLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixXQUFXLEdBQ1osTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7O0FBRWxHLHNFQUFzRTtBQXVDdEUsTUFBTSxPQUFPLG1CQUFtQjtJQUNiLE9BQU8sR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUVqRCxNQUFNLENBQXFCO0lBQzNCLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFFekIsNkZBQTZGO0lBQzdGLElBQWEsS0FBSyxDQUFDLEtBQXdCO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLG9CQUFvQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBYSxRQUFRLENBQUMsS0FBYTtRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUM7UUFDL0Isb0JBQW9CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFUSxPQUFPLENBQW1CO0lBQzFCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUVqQyx3RkFBd0Y7SUFDL0UsT0FBTyxHQUFHLE1BQU0sQ0FBbUIsRUFBRSxDQUFDLENBQUM7SUFFaEQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxlQUFlLENBQUMsTUFBVztRQUN6QixPQUFPLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLE1BQVc7UUFDcEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUM7UUFDckQsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7SUFDOUUsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFXO1FBQ25CLE9BQU8sa0JBQWtCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQVc7UUFDckIsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCx3RkFBd0Y7SUFDeEYsZ0JBQWdCO1FBQ2QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7UUFDbEMsbUZBQW1GO1FBQ25GLDhGQUE4RjtRQUM5RixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssRUFBRTtZQUFFLE9BQU8sR0FBRyxDQUFDO1FBQ3RFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3RHLElBQUksUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pGLElBQUksTUFBTTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzFCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLENBQUM7SUFDekYsQ0FBQzt3R0FuRVUsbUJBQW1COzRGQUFuQixtQkFBbUIseUxBakNwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCVCwyREFoQ1MsbUJBQW1COzs0RkFrQ2xCLG1CQUFtQjtrQkF0Qy9CLFNBQVM7bUJBQUM7b0JBQ1QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztvQkFDOUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JUO2lCQUNGOzhCQVFjLEtBQUs7c0JBQWpCLEtBQUs7Z0JBUU8sUUFBUTtzQkFBcEIsS0FBSztnQkFRRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBpbmplY3QsIHNpZ25hbCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB0eXBlIHsgRHJvcGRvd25PcHRpb24sIE5lc3RlZEZpZWxkQ29uZmlnIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHtcbiAgZ2V0T3B0aW9uU3RvcmVkVmFsdWUsXG4gIHJlc29sdmVMYWJlbCxcbiAgcmVzb2x2ZU9wdGlvbkxhYmVsLFxuICByZXNvbHZlT3B0aW9uVmFsdWUsXG4gIHZhbHVlc01hdGNoLFxufSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQgeyBMb29rdXBSZWdpc3RyeVNlcnZpY2UsIHJlZnJlc2hDaG9pY2VPcHRpb25zIH0gZnJvbSAnLi4vc2VydmljZXMvbG9va3VwLXJlZ2lzdHJ5LnNlcnZpY2UnO1xuXG4vKiogUmFkaW8gZmllbGQ6IGEgZ3JvdXAgb2YgcmFkaW8gYnV0dG9ucyBidWlsdCBmcm9tIGZpZWxkLm9wdGlvbnMuICovXG5AQ29tcG9uZW50KHtcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHNlbGVjdG9yOiAnbmd4LXJhZGlvLWZpZWxkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1JlYWN0aXZlRm9ybXNNb2R1bGVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJuZ3gtZmllbGQgbmd4LWZpZWxkLS1yYWRpb1wiXG4gICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkXCIgW2F0dHIuZGF0YS1maWVsZC10eXBlXT1cImZpZWxkLnR5cGVcIiBbY2xhc3Mubmd4LWZpZWxkLS1yZWFkb25seV09XCJyZWFkb25seVwiIFtjbGFzcy5uZ3gtZmllbGQtLW1hc2tlZF09XCJtYXNrZWRcIj5cbiAgICAgIDxmaWVsZHNldCBjbGFzcz1cIm5neC1maWVsZF9fZmllbGRzZXRcIj5cbiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIm5neC1maWVsZF9fbGFiZWxcIj57eyBsYWJlbCB9fTwvbGVnZW5kPlxuICAgICAgICBAaWYgKG1hc2tlZCkge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX192YWx1ZSBuZ3gtZmllbGRfX3ZhbHVlLS1tYXNrZWRcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1tYXNrZWQnXCI+WFhYWFhYWFhYPC9zcGFuPlxuICAgICAgICB9IEBlbHNlIGlmIChyZWFkb25seSkge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX192YWx1ZVwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLXZhbHVlJ1wiPnt7IGdldFNlbGVjdGVkTGFiZWwoKSB9fTwvc3Bhbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1maWVsZF9fcmFkaW8tZ3JvdXBcIj5cbiAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBvcHRpb25zKCk7IHRyYWNrIGdldE9wdExhYmVsKG9wdGlvbikpIHtcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibmd4LWZpZWxkX19yYWRpby1vcHRpb25cIiBbYXR0ci5mb3JdPVwiZ2V0UmFkaW9JZChvcHRpb24pXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0UmFkaW9JZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm5neC1maWVsZF9fcmFkaW8taW5wdXRcIlxuICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIiRhbnkoY29udHJvbClcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldE9wdFN0b3JlZFZhbChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX3JhZGlvLWxhYmVsXCI+e3sgZ2V0T3B0TGFiZWwob3B0aW9uKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKGNvbnRyb2wuaW52YWxpZCAmJiBjb250cm9sLnRvdWNoZWQpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX19lcnJvclwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLWVycm9yJ1wiPlRoaXMgZmllbGQgaGFzIGFuIGVycm9yPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9maWVsZHNldD5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgUmFkaW9GaWVsZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9va3VwcyA9IGluamVjdChMb29rdXBSZWdpc3RyeVNlcnZpY2UpO1xuXG4gIHByaXZhdGUgX2ZpZWxkITogTmVzdGVkRmllbGRDb25maWc7XG4gIHByaXZhdGUgX2xhbmd1YWdlID0gJ2VuJztcblxuICAvKiogU2V0dGVyLWJhc2VkIHNvIG9wdGlvbnMgcmVzb2x2ZSBob3dldmVyIHRoZSBpbnB1dCBpcyBzZXQg4oCUIHNlZSBgcmVmcmVzaENob2ljZU9wdGlvbnNgLiAqL1xuICBASW5wdXQoKSBzZXQgZmllbGQodmFsdWU6IE5lc3RlZEZpZWxkQ29uZmlnKSB7XG4gICAgdGhpcy5fZmllbGQgPSB2YWx1ZTtcbiAgICByZWZyZXNoQ2hvaWNlT3B0aW9ucyh0aGlzLCB0aGlzLmxvb2t1cHMpO1xuICB9XG4gIGdldCBmaWVsZCgpOiBOZXN0ZWRGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGxhbmd1YWdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sYW5ndWFnZSA9IHZhbHVlIHx8ICdlbic7XG4gICAgcmVmcmVzaENob2ljZU9wdGlvbnModGhpcywgdGhpcy5sb29rdXBzKTtcbiAgfVxuICBnZXQgbGFuZ3VhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2U7XG4gIH1cblxuICBASW5wdXQoKSBjb250cm9sITogQWJzdHJhY3RDb250cm9sO1xuICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogSW5saW5lIGBvcHRpb25zYCwgb3IgdGhlIGZpZWxkJ3MgbmFtZWQgbGlzdCByZXNvbHZlZCB0aHJvdWdoIHRoZSByZWdpc3RyeSAowqc2LjMpLiAqL1xuICByZWFkb25seSBvcHRpb25zID0gc2lnbmFsPERyb3Bkb3duT3B0aW9uW10+KFtdKTtcblxuICBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZUxhYmVsKHRoaXMuZmllbGQ/LmxhYmVsLCB0aGlzLmxhbmd1YWdlKTtcbiAgfVxuXG4gIGdldE9wdFN0b3JlZFZhbChvcHRpb246IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIGdldE9wdGlvblN0b3JlZFZhbHVlKG9wdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogU3RhYmxlIERPTSBpZCBmb3Igb25lIHJhZGlvLCBzbyB0aGUgPGxhYmVsIGZvcj4gYXNzb2NpYXRpb24gd29ya3MuXG4gICAqIFNsdWdpZmllZCBiZWNhdXNlIHRoZSBvcHRpb24gdGV4dCBpcyB0aGUgdmFsdWUgbm93IOKAlCBcIk9uIExlYXZlXCIgbXVzdCBub3QgcHV0IGEgc3BhY2VcbiAgICogaW50byBhbiBpZCBhdHRyaWJ1dGUuXG4gICAqL1xuICBnZXRSYWRpb0lkKG9wdGlvbjogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZXh0ID0gU3RyaW5nKHRoaXMuZ2V0T3B0VmFsKG9wdGlvbikgPz8gJ29wdCcpO1xuICAgIHJldHVybiBgJHt0aGlzLmZpZWxkLmlkfS0ke3RleHQudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJ18nKS50b0xvd2VyQ2FzZSgpfWA7XG4gIH1cblxuICBnZXRPcHRWYWwob3B0aW9uOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiByZXNvbHZlT3B0aW9uVmFsdWUob3B0aW9uLCB0aGlzLmxhbmd1YWdlKTtcbiAgfVxuXG4gIGdldE9wdExhYmVsKG9wdGlvbjogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZU9wdGlvbkxhYmVsKG9wdGlvbiwgdGhpcy5sYW5ndWFnZSk7XG4gIH1cblxuICAvKiogUmVhZC1vbmx5IGRpc3BsYXkg4oCUIHN5bmNocm9ub3VzLCBwZXIgwqc2LjIuIFNlZSBgRHJvcGRvd25GaWVsZENvbXBvbmVudC5nZXRMYWJlbGAuICovXG4gIGdldFNlbGVjdGVkTGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29udHJvbD8udmFsdWU7XG4gICAgLy8gYHR5cGVvZiBudWxsID09PSAnb2JqZWN0J2AsIHNvIHdpdGhvdXQgdGhpcyBndWFyZCBhbiBlbXB0eSB2YWx1ZSBmZWxsIHRocm91Z2ggdG9cbiAgICAvLyBgcmVzb2x2ZUxhYmVsKG51bGwpYCBhbmQgcmVuZGVyZWQgYXMgYmxhbmsg4oCUIGRyb3Bkb3duIGFuZCBtdWx0aVNlbGVjdCBib3RoIHNob3cgYW4gZW0gZGFzaC5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJycpIHJldHVybiAn4oCUJztcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMub3B0aW9ucygpLmZpbmQobyA9PiB2YWx1ZXNNYXRjaChnZXRPcHRpb25TdG9yZWRWYWx1ZShvKSwgdmFsdWUsIHRoaXMubGFuZ3VhZ2UpKTtcbiAgICBpZiAoc2VsZWN0ZWQpIHJldHVybiB0aGlzLmdldE9wdExhYmVsKHNlbGVjdGVkKTtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmxvb2t1cHMubGFiZWxGb3IodGhpcy5maWVsZD8ubGlzdE5hbWUsIHZhbHVlLCB0aGlzLmxhbmd1YWdlKTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gcmVzb2x2ZUxhYmVsKHZhbHVlLCB0aGlzLmxhbmd1YWdlKSA6ICh2YWx1ZSA/PyAn4oCUJyk7XG4gIH1cbn1cbiJdfQ==
@@ -1,121 +0,0 @@
1
- import { Component, Input, inject, ChangeDetectionStrategy, signal } from '@angular/core';
2
- import { ReactiveFormsModule } from '@angular/forms';
3
- import { resolveLabel } from '@dynamic-entity/core';
4
- import { ValidationMessagesService } from '../services/validation-messages.service';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/forms";
7
- export class TextFieldComponent {
8
- messages = inject(ValidationMessagesService);
9
- displaySub;
10
- field;
11
- set control(value) {
12
- this._control = value;
13
- this.displaySub?.unsubscribe();
14
- this.displayValue.set(value?.value ?? null);
15
- this.displaySub = value?.valueChanges.subscribe(v => this.displayValue.set(v));
16
- }
17
- get control() {
18
- return this._control;
19
- }
20
- _control;
21
- language = 'en';
22
- readonly = false;
23
- masked = false;
24
- /** Readonly markup reads this signal so an external patch (autoPatch) is visible under OnPush. */
25
- displayValue = signal(null);
26
- ngOnDestroy() {
27
- this.displaySub?.unsubscribe();
28
- }
29
- get label() {
30
- return resolveLabel(this.field?.label, this.language);
31
- }
32
- get placeholder() {
33
- return resolveLabel(this.field?.placeholder, this.language);
34
- }
35
- get errorMessage() {
36
- if (!this.control || !this.control.errors || !this.control.touched)
37
- return '';
38
- return this.messages.resolve(this.control.errors, this.language, ['required', 'email', 'minlength', 'maxlength', 'pattern']);
39
- }
40
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
41
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TextFieldComponent, isStandalone: true, selector: "ngx-text-field", inputs: { field: "field", control: "control", language: "language", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
42
- <div
43
- class="ngx-field ngx-field--text"
44
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type"
45
- [class.ngx-field--readonly]="readonly"
46
- [class.ngx-field--masked]="masked"
47
- [class.ngx-field--invalid]="control && control.invalid && control.touched"
48
- >
49
- <label class="ngx-field__label" [attr.for]="field.id">{{ label }}@if (field.validators?.required) { <span class="ngx-field__req">*</span> }</label>
50
- @if (masked) {
51
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
52
- } @else if (readonly) {
53
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ displayValue() ?? '—' }}</span>
54
- } @else {
55
- <input
56
- [id]="field.id"
57
- type="text"
58
- class="ngx-field__input" [attr.data-testid]="'field-' + field.id + '-input'"
59
- [formControl]="$any(control)"
60
- [placeholder]="placeholder"
61
- [attr.disabled]="field.disabled ? true : null"
62
- [attr.aria-invalid]="control.invalid && control.touched"
63
- [attr.aria-describedby]="errorMessage ? field.id + '-error' : null"
64
- />
65
- @if (errorMessage) {
66
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'" [id]="field.id + '-error'" role="alert">{{ errorMessage }}</span>
67
- }
68
- }
69
- </div>
70
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
71
- }
72
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextFieldComponent, decorators: [{
73
- type: Component,
74
- args: [{
75
- changeDetection: ChangeDetectionStrategy.OnPush,
76
- selector: 'ngx-text-field',
77
- standalone: true,
78
- imports: [ReactiveFormsModule],
79
- template: `
80
- <div
81
- class="ngx-field ngx-field--text"
82
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type"
83
- [class.ngx-field--readonly]="readonly"
84
- [class.ngx-field--masked]="masked"
85
- [class.ngx-field--invalid]="control && control.invalid && control.touched"
86
- >
87
- <label class="ngx-field__label" [attr.for]="field.id">{{ label }}@if (field.validators?.required) { <span class="ngx-field__req">*</span> }</label>
88
- @if (masked) {
89
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
90
- } @else if (readonly) {
91
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ displayValue() ?? '—' }}</span>
92
- } @else {
93
- <input
94
- [id]="field.id"
95
- type="text"
96
- class="ngx-field__input" [attr.data-testid]="'field-' + field.id + '-input'"
97
- [formControl]="$any(control)"
98
- [placeholder]="placeholder"
99
- [attr.disabled]="field.disabled ? true : null"
100
- [attr.aria-invalid]="control.invalid && control.touched"
101
- [attr.aria-describedby]="errorMessage ? field.id + '-error' : null"
102
- />
103
- @if (errorMessage) {
104
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'" [id]="field.id + '-error'" role="alert">{{ errorMessage }}</span>
105
- }
106
- }
107
- </div>
108
- `,
109
- }]
110
- }], propDecorators: { field: [{
111
- type: Input
112
- }], control: [{
113
- type: Input
114
- }], language: [{
115
- type: Input
116
- }], readonly: [{
117
- type: Input
118
- }], masked: [{
119
- type: Input
120
- }] } });
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2ZpZWxkLXR5cGVzL3RleHQtZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckcsT0FBTyxFQUFtQixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7O0FBc0NwRixNQUFNLE9BQU8sa0JBQWtCO0lBQ1osUUFBUSxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3RELFVBQVUsQ0FBZ0I7SUFFekIsS0FBSyxDQUFxQjtJQUNuQyxJQUNJLE9BQU8sQ0FBQyxLQUFzQjtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUNELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBQ08sUUFBUSxDQUFtQjtJQUUxQixRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQ3hCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUVqQyxrR0FBa0c7SUFDekYsWUFBWSxHQUFHLE1BQU0sQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUU5QyxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM5RSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFDbkIsSUFBSSxDQUFDLFFBQVEsRUFDYixDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FDM0QsQ0FBQztJQUNKLENBQUM7d0dBM0NVLGtCQUFrQjs0RkFBbEIsa0JBQWtCLHdMQS9CbkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJULDJEQTlCUyxtQkFBbUI7OzRGQWdDbEIsa0JBQWtCO2tCQXBDOUIsU0FBUzttQkFBQztvQkFDVCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLG1CQUFtQixDQUFDO29CQUM5QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJUO2lCQUNGOzhCQUtVLEtBQUs7c0JBQWIsS0FBSztnQkFFRixPQUFPO3NCQURWLEtBQUs7Z0JBWUcsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgaW5qZWN0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB0eXBlIHsgTmVzdGVkRmllbGRDb25maWcgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQgeyByZXNvbHZlTGFiZWwgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uTWVzc2FnZXNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdmFsaWRhdGlvbi1tZXNzYWdlcy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzZWxlY3RvcjogJ25neC10ZXh0LWZpZWxkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1JlYWN0aXZlRm9ybXNNb2R1bGVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibmd4LWZpZWxkIG5neC1maWVsZC0tdGV4dFwiXG4gICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkXCIgW2F0dHIuZGF0YS1maWVsZC10eXBlXT1cImZpZWxkLnR5cGVcIlxuICAgICAgW2NsYXNzLm5neC1maWVsZC0tcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgW2NsYXNzLm5neC1maWVsZC0tbWFza2VkXT1cIm1hc2tlZFwiXG4gICAgICBbY2xhc3Mubmd4LWZpZWxkLS1pbnZhbGlkXT1cImNvbnRyb2wgJiYgY29udHJvbC5pbnZhbGlkICYmIGNvbnRyb2wudG91Y2hlZFwiXG4gICAgPlxuICAgICAgPGxhYmVsIGNsYXNzPVwibmd4LWZpZWxkX19sYWJlbFwiIFthdHRyLmZvcl09XCJmaWVsZC5pZFwiPnt7IGxhYmVsIH19QGlmIChmaWVsZC52YWxpZGF0b3JzPy5yZXF1aXJlZCkgeyA8c3BhbiBjbGFzcz1cIm5neC1maWVsZF9fcmVxXCI+Kjwvc3Bhbj4gfTwvbGFiZWw+XG4gICAgICBAaWYgKG1hc2tlZCkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1maWVsZF9fdmFsdWUgbmd4LWZpZWxkX192YWx1ZS0tbWFza2VkXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctbWFza2VkJ1wiPlhYWFhYWFhYWDwvc3Bhbj5cbiAgICAgIH0gQGVsc2UgaWYgKHJlYWRvbmx5KSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX192YWx1ZVwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLXZhbHVlJ1wiPnt7IGRpc3BsYXlWYWx1ZSgpID8/ICfigJQnIH19PC9zcGFuPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIFtpZF09XCJmaWVsZC5pZFwiXG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIGNsYXNzPVwibmd4LWZpZWxkX19pbnB1dFwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLWlucHV0J1wiXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cIiRhbnkoY29udHJvbClcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWQgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImNvbnRyb2wuaW52YWxpZCAmJiBjb250cm9sLnRvdWNoZWRcIlxuICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiZXJyb3JNZXNzYWdlID8gZmllbGQuaWQgKyAnLWVycm9yJyA6IG51bGxcIlxuICAgICAgICAvPlxuICAgICAgICBAaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX19lcnJvclwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLWVycm9yJ1wiIFtpZF09XCJmaWVsZC5pZCArICctZXJyb3InXCIgcm9sZT1cImFsZXJ0XCI+e3sgZXJyb3JNZXNzYWdlIH19PC9zcGFuPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFRleHRGaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZXMgPSBpbmplY3QoVmFsaWRhdGlvbk1lc3NhZ2VzU2VydmljZSk7XG4gIHByaXZhdGUgZGlzcGxheVN1Yj86IFN1YnNjcmlwdGlvbjtcblxuICBASW5wdXQoKSBmaWVsZCE6IE5lc3RlZEZpZWxkQ29uZmlnO1xuICBASW5wdXQoKVxuICBzZXQgY29udHJvbCh2YWx1ZTogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgdGhpcy5fY29udHJvbCA9IHZhbHVlO1xuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlWYWx1ZS5zZXQodmFsdWU/LnZhbHVlID8/IG51bGwpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IHZhbHVlPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHYgPT4gdGhpcy5kaXNwbGF5VmFsdWUuc2V0KHYpKTtcbiAgfVxuICBnZXQgY29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLl9jb250cm9sO1xuICB9XG4gIHByaXZhdGUgX2NvbnRyb2whOiBBYnN0cmFjdENvbnRyb2w7XG5cbiAgQElucHV0KCkgbGFuZ3VhZ2U6IHN0cmluZyA9ICdlbic7XG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBSZWFkb25seSBtYXJrdXAgcmVhZHMgdGhpcyBzaWduYWwgc28gYW4gZXh0ZXJuYWwgcGF0Y2ggKGF1dG9QYXRjaCkgaXMgdmlzaWJsZSB1bmRlciBPblB1c2guICovXG4gIHJlYWRvbmx5IGRpc3BsYXlWYWx1ZSA9IHNpZ25hbDx1bmtub3duPihudWxsKTtcblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZUxhYmVsKHRoaXMuZmllbGQ/LmxhYmVsLCB0aGlzLmxhbmd1YWdlKTtcbiAgfVxuXG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlTGFiZWwodGhpcy5maWVsZD8ucGxhY2Vob2xkZXIsIHRoaXMubGFuZ3VhZ2UpO1xuICB9XG5cbiAgZ2V0IGVycm9yTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jb250cm9sIHx8ICF0aGlzLmNvbnRyb2wuZXJyb3JzIHx8ICF0aGlzLmNvbnRyb2wudG91Y2hlZCkgcmV0dXJuICcnO1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VzLnJlc29sdmUoXG4gICAgICB0aGlzLmNvbnRyb2wuZXJyb3JzLFxuICAgICAgdGhpcy5sYW5ndWFnZSxcbiAgICAgIFsncmVxdWlyZWQnLCAnZW1haWwnLCAnbWlubGVuZ3RoJywgJ21heGxlbmd0aCcsICdwYXR0ZXJuJ10sXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -1,85 +0,0 @@
1
- import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
2
- import { ReactiveFormsModule } from '@angular/forms';
3
- import { resolveLabel } from '@dynamic-entity/core';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/forms";
6
- export class TextareaFieldComponent {
7
- field;
8
- control;
9
- language = 'en';
10
- readonly = false;
11
- masked = false;
12
- get label() {
13
- return resolveLabel(this.field?.label, this.language);
14
- }
15
- get placeholder() {
16
- return resolveLabel(this.field?.placeholder, this.language);
17
- }
18
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextareaFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
19
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TextareaFieldComponent, isStandalone: true, selector: "ngx-textarea-field", inputs: { field: "field", control: "control", language: "language", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
20
- <div class="ngx-field ngx-field--textarea"
21
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
22
- <label class="ngx-field__label" [attr.for]="field.id">{{ label }}</label>
23
- @if (masked) {
24
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
25
- } @else if (readonly) {
26
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ control.value }}</span>
27
- } @else {
28
- <textarea
29
- [id]="field.id"
30
- class="ngx-field__input" [attr.data-testid]="'field-' + field.id + '-input'"
31
- [formControl]="$any(control)"
32
- [placeholder]="placeholder"
33
- [attr.disabled]="field.disabled ? true : null"
34
- rows="3"
35
- ></textarea>
36
- @if (control.invalid && control.touched) {
37
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
38
- }
39
- }
40
- </div>
41
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
42
- }
43
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextareaFieldComponent, decorators: [{
44
- type: Component,
45
- args: [{
46
- changeDetection: ChangeDetectionStrategy.OnPush,
47
- selector: 'ngx-textarea-field',
48
- standalone: true,
49
- imports: [ReactiveFormsModule],
50
- template: `
51
- <div class="ngx-field ngx-field--textarea"
52
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
53
- <label class="ngx-field__label" [attr.for]="field.id">{{ label }}</label>
54
- @if (masked) {
55
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
56
- } @else if (readonly) {
57
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ control.value }}</span>
58
- } @else {
59
- <textarea
60
- [id]="field.id"
61
- class="ngx-field__input" [attr.data-testid]="'field-' + field.id + '-input'"
62
- [formControl]="$any(control)"
63
- [placeholder]="placeholder"
64
- [attr.disabled]="field.disabled ? true : null"
65
- rows="3"
66
- ></textarea>
67
- @if (control.invalid && control.touched) {
68
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
69
- }
70
- }
71
- </div>
72
- `,
73
- }]
74
- }], propDecorators: { field: [{
75
- type: Input
76
- }], control: [{
77
- type: Input
78
- }], language: [{
79
- type: Input
80
- }], readonly: [{
81
- type: Input
82
- }], masked: [{
83
- type: Input
84
- }] } });
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9maWVsZC10eXBlcy90ZXh0YXJlYS1maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUFtQixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBK0JwRCxNQUFNLE9BQU8sc0JBQXNCO0lBQ3hCLEtBQUssQ0FBcUI7SUFDMUIsT0FBTyxDQUFtQjtJQUMxQixRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQ3hCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUVqQyxJQUFJLEtBQUs7UUFDUCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5RCxDQUFDO3dHQWJVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLDRMQXhCdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQlQsMkRBdkJTLG1CQUFtQjs7NEZBeUJsQixzQkFBc0I7a0JBN0JsQyxTQUFTO21CQUFDO29CQUNULGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsbUJBQW1CLENBQUM7b0JBQzlCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCVDtpQkFDRjs4QkFFVSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHR5cGUgeyBOZXN0ZWRGaWVsZENvbmZpZyB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcbmltcG9ydCB7IHJlc29sdmVMYWJlbCB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzZWxlY3RvcjogJ25neC10ZXh0YXJlYS1maWVsZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibmd4LWZpZWxkIG5neC1maWVsZC0tdGV4dGFyZWFcIlxuICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZFwiIFthdHRyLmRhdGEtZmllbGQtdHlwZV09XCJmaWVsZC50eXBlXCIgW2NsYXNzLm5neC1maWVsZC0tcmVhZG9ubHldPVwicmVhZG9ubHlcIiBbY2xhc3Mubmd4LWZpZWxkLS1tYXNrZWRdPVwibWFza2VkXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJuZ3gtZmllbGRfX2xhYmVsXCIgW2F0dHIuZm9yXT1cImZpZWxkLmlkXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICAgICAgQGlmIChtYXNrZWQpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX3ZhbHVlIG5neC1maWVsZF9fdmFsdWUtLW1hc2tlZFwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLW1hc2tlZCdcIj5YWFhYWFhYWFg8L3NwYW4+XG4gICAgICB9IEBlbHNlIGlmIChyZWFkb25seSkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1maWVsZF9fdmFsdWVcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy12YWx1ZSdcIj57eyBjb250cm9sLnZhbHVlIH19PC9zcGFuPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgIFtpZF09XCJmaWVsZC5pZFwiXG4gICAgICAgICAgY2xhc3M9XCJuZ3gtZmllbGRfX2lucHV0XCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctaW5wdXQnXCJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiJGFueShjb250cm9sKVwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZCA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICByb3dzPVwiM1wiXG4gICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICBAaWYgKGNvbnRyb2wuaW52YWxpZCAmJiBjb250cm9sLnRvdWNoZWQpIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1maWVsZF9fZXJyb3JcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1lcnJvcidcIj5UaGlzIGZpZWxkIGhhcyBhbiBlcnJvcjwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBUZXh0YXJlYUZpZWxkQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZmllbGQhOiBOZXN0ZWRGaWVsZENvbmZpZztcbiAgQElucHV0KCkgY29udHJvbCE6IEFic3RyYWN0Q29udHJvbDtcbiAgQElucHV0KCkgbGFuZ3VhZ2U6IHN0cmluZyA9ICdlbic7XG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCBsYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlTGFiZWwodGhpcy5maWVsZD8ubGFiZWwsIHRoaXMubGFuZ3VhZ2UpO1xuICB9XG5cbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVMYWJlbCh0aGlzLmZpZWxkPy5wbGFjZWhvbGRlciwgdGhpcy5sYW5ndWFnZSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,96 +0,0 @@
1
- import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
2
- import { ReactiveFormsModule } from '@angular/forms';
3
- import { formatDisplayValue, resolveLabel } from '@dynamic-entity/core';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/forms";
6
- /**
7
- * Time field: a bare time of day, with no date and no zone attached.
8
- *
9
- * Stored as `HH:mm` — exactly the value `<input type="time">` reads and writes, so the
10
- * control binds straight through with no conversion. That is the whole reason this is a
11
- * separate type from `datetime`: a recurring 09:00 opening time is not a moment in time,
12
- * and converting it to UTC would move it whenever the offset changed.
13
- */
14
- export class TimeFieldComponent {
15
- field;
16
- control;
17
- language = 'en';
18
- readonly = false;
19
- masked = false;
20
- get label() {
21
- return resolveLabel(this.field?.label, this.language);
22
- }
23
- /**
24
- * Defers to core rather than parsing `HH:mm` locally. The other date-ish components each
25
- * grew their own formatter, and `datetime` ended up showing one thing in the field and
26
- * another in the record summary because the two drifted apart.
27
- */
28
- formatTime(value) {
29
- return formatDisplayValue('time', undefined, value, this.language);
30
- }
31
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimeFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
32
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TimeFieldComponent, isStandalone: true, selector: "ngx-time-field", inputs: { field: "field", control: "control", language: "language", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
33
- <div class="ngx-field ngx-field--time"
34
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
35
- <label class="ngx-field__label" [attr.for]="field.id">{{ label }}</label>
36
- @if (masked) {
37
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
38
- } @else if (readonly) {
39
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ formatTime(control.value) }}</span>
40
- } @else {
41
- <input
42
- [id]="field.id"
43
- class="ngx-field__input" [attr.data-testid]="'field-' + field.id + '-input'"
44
- type="time"
45
- [formControl]="$any(control)"
46
- [attr.disabled]="field.disabled ? true : null"
47
- />
48
- @if (control.invalid && control.touched) {
49
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
50
- }
51
- }
52
- </div>
53
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
54
- }
55
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimeFieldComponent, decorators: [{
56
- type: Component,
57
- args: [{
58
- changeDetection: ChangeDetectionStrategy.OnPush,
59
- selector: 'ngx-time-field',
60
- standalone: true,
61
- imports: [ReactiveFormsModule],
62
- template: `
63
- <div class="ngx-field ngx-field--time"
64
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
65
- <label class="ngx-field__label" [attr.for]="field.id">{{ label }}</label>
66
- @if (masked) {
67
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
68
- } @else if (readonly) {
69
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ formatTime(control.value) }}</span>
70
- } @else {
71
- <input
72
- [id]="field.id"
73
- class="ngx-field__input" [attr.data-testid]="'field-' + field.id + '-input'"
74
- type="time"
75
- [formControl]="$any(control)"
76
- [attr.disabled]="field.disabled ? true : null"
77
- />
78
- @if (control.invalid && control.touched) {
79
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
80
- }
81
- }
82
- </div>
83
- `,
84
- }]
85
- }], propDecorators: { field: [{
86
- type: Input
87
- }], control: [{
88
- type: Input
89
- }], language: [{
90
- type: Input
91
- }], readonly: [{
92
- type: Input
93
- }], masked: [{
94
- type: Input
95
- }] } });
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2ZpZWxkLXR5cGVzL3RpbWUtZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBbUIsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQUV4RTs7Ozs7OztHQU9HO0FBNkJILE1BQU0sT0FBTyxrQkFBa0I7SUFDcEIsS0FBSyxDQUFxQjtJQUMxQixPQUFPLENBQW1CO0lBQzFCLFFBQVEsR0FBVyxJQUFJLENBQUM7SUFDeEIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixNQUFNLEdBQVksS0FBSyxDQUFDO0lBRWpDLElBQUksS0FBSztRQUNQLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxLQUFjO1FBQ3ZCLE9BQU8sa0JBQWtCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7d0dBbEJVLGtCQUFrQjs0RkFBbEIsa0JBQWtCLHdMQXZCbkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVCwyREF0QlMsbUJBQW1COzs0RkF3QmxCLGtCQUFrQjtrQkE1QjlCLFNBQVM7bUJBQUM7b0JBQ1QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztvQkFDOUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQlQ7aUJBQ0Y7OEJBRVUsS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB0eXBlIHsgTmVzdGVkRmllbGRDb25maWcgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQgeyBmb3JtYXREaXNwbGF5VmFsdWUsIHJlc29sdmVMYWJlbCB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcblxuLyoqXG4gKiBUaW1lIGZpZWxkOiBhIGJhcmUgdGltZSBvZiBkYXksIHdpdGggbm8gZGF0ZSBhbmQgbm8gem9uZSBhdHRhY2hlZC5cbiAqXG4gKiBTdG9yZWQgYXMgYEhIOm1tYCDigJQgZXhhY3RseSB0aGUgdmFsdWUgYDxpbnB1dCB0eXBlPVwidGltZVwiPmAgcmVhZHMgYW5kIHdyaXRlcywgc28gdGhlXG4gKiBjb250cm9sIGJpbmRzIHN0cmFpZ2h0IHRocm91Z2ggd2l0aCBubyBjb252ZXJzaW9uLiBUaGF0IGlzIHRoZSB3aG9sZSByZWFzb24gdGhpcyBpcyBhXG4gKiBzZXBhcmF0ZSB0eXBlIGZyb20gYGRhdGV0aW1lYDogYSByZWN1cnJpbmcgMDk6MDAgb3BlbmluZyB0aW1lIGlzIG5vdCBhIG1vbWVudCBpbiB0aW1lLFxuICogYW5kIGNvbnZlcnRpbmcgaXQgdG8gVVRDIHdvdWxkIG1vdmUgaXQgd2hlbmV2ZXIgdGhlIG9mZnNldCBjaGFuZ2VkLlxuICovXG5AQ29tcG9uZW50KHtcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHNlbGVjdG9yOiAnbmd4LXRpbWUtZmllbGQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cIm5neC1maWVsZCBuZ3gtZmllbGQtLXRpbWVcIlxuICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZFwiIFthdHRyLmRhdGEtZmllbGQtdHlwZV09XCJmaWVsZC50eXBlXCIgW2NsYXNzLm5neC1maWVsZC0tcmVhZG9ubHldPVwicmVhZG9ubHlcIiBbY2xhc3Mubmd4LWZpZWxkLS1tYXNrZWRdPVwibWFza2VkXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJuZ3gtZmllbGRfX2xhYmVsXCIgW2F0dHIuZm9yXT1cImZpZWxkLmlkXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICAgICAgQGlmIChtYXNrZWQpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX3ZhbHVlIG5neC1maWVsZF9fdmFsdWUtLW1hc2tlZFwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLW1hc2tlZCdcIj5YWFhYWFhYWFg8L3NwYW4+XG4gICAgICB9IEBlbHNlIGlmIChyZWFkb25seSkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1maWVsZF9fdmFsdWVcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy12YWx1ZSdcIj57eyBmb3JtYXRUaW1lKGNvbnRyb2wudmFsdWUpIH19PC9zcGFuPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIFtpZF09XCJmaWVsZC5pZFwiXG4gICAgICAgICAgY2xhc3M9XCJuZ3gtZmllbGRfX2lucHV0XCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctaW5wdXQnXCJcbiAgICAgICAgICB0eXBlPVwidGltZVwiXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cIiRhbnkoY29udHJvbClcIlxuICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICAvPlxuICAgICAgICBAaWYgKGNvbnRyb2wuaW52YWxpZCAmJiBjb250cm9sLnRvdWNoZWQpIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1maWVsZF9fZXJyb3JcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1lcnJvcidcIj5UaGlzIGZpZWxkIGhhcyBhbiBlcnJvcjwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBUaW1lRmllbGRDb21wb25lbnQge1xuICBASW5wdXQoKSBmaWVsZCE6IE5lc3RlZEZpZWxkQ29uZmlnO1xuICBASW5wdXQoKSBjb250cm9sITogQWJzdHJhY3RDb250cm9sO1xuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nID0gJ2VuJztcbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbWFza2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVMYWJlbCh0aGlzLmZpZWxkPy5sYWJlbCwgdGhpcy5sYW5ndWFnZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVmZXJzIHRvIGNvcmUgcmF0aGVyIHRoYW4gcGFyc2luZyBgSEg6bW1gIGxvY2FsbHkuIFRoZSBvdGhlciBkYXRlLWlzaCBjb21wb25lbnRzIGVhY2hcbiAgICogZ3JldyB0aGVpciBvd24gZm9ybWF0dGVyLCBhbmQgYGRhdGV0aW1lYCBlbmRlZCB1cCBzaG93aW5nIG9uZSB0aGluZyBpbiB0aGUgZmllbGQgYW5kXG4gICAqIGFub3RoZXIgaW4gdGhlIHJlY29yZCBzdW1tYXJ5IGJlY2F1c2UgdGhlIHR3byBkcmlmdGVkIGFwYXJ0LlxuICAgKi9cbiAgZm9ybWF0VGltZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZvcm1hdERpc3BsYXlWYWx1ZSgndGltZScsIHVuZGVmaW5lZCwgdmFsdWUsIHRoaXMubGFuZ3VhZ2UpO1xuICB9XG59XG4iXX0=