iss-ctrl 0.0.21 → 0.0.23

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 (141) hide show
  1. package/README.md +33 -0
  2. package/fesm2022/iss-ctrl-attachment.viewer-DVUL39xd.mjs +110 -0
  3. package/fesm2022/iss-ctrl-attachment.viewer-DVUL39xd.mjs.map +1 -0
  4. package/fesm2022/iss-ctrl-base.mjs +682 -0
  5. package/fesm2022/iss-ctrl-base.mjs.map +1 -0
  6. package/fesm2022/iss-ctrl-checkbox.field-CILXADas.mjs +88 -0
  7. package/fesm2022/iss-ctrl-checkbox.field-CILXADas.mjs.map +1 -0
  8. package/fesm2022/iss-ctrl-checkbox.mjs +146 -0
  9. package/fesm2022/iss-ctrl-checkbox.mjs.map +1 -0
  10. package/fesm2022/iss-ctrl-checkbox.viewer-C3SEUszR.mjs +31 -0
  11. package/fesm2022/iss-ctrl-checkbox.viewer-C3SEUszR.mjs.map +1 -0
  12. package/fesm2022/iss-ctrl-chips.field-445Ds3V7.mjs +76 -0
  13. package/fesm2022/iss-ctrl-chips.field-445Ds3V7.mjs.map +1 -0
  14. package/fesm2022/iss-ctrl-chips.mjs +168 -0
  15. package/fesm2022/iss-ctrl-chips.mjs.map +1 -0
  16. package/fesm2022/iss-ctrl-chips.viewer-BcKT2hcq.mjs +38 -0
  17. package/fesm2022/iss-ctrl-chips.viewer-BcKT2hcq.mjs.map +1 -0
  18. package/fesm2022/iss-ctrl-date-picker.field-Djhh1FsR.mjs +98 -0
  19. package/fesm2022/iss-ctrl-date-picker.field-Djhh1FsR.mjs.map +1 -0
  20. package/fesm2022/iss-ctrl-date-picker.mjs +200 -0
  21. package/fesm2022/iss-ctrl-date-picker.mjs.map +1 -0
  22. package/fesm2022/iss-ctrl-date-picker.viewer-Dsmsf91t.mjs +40 -0
  23. package/fesm2022/iss-ctrl-date-picker.viewer-Dsmsf91t.mjs.map +1 -0
  24. package/fesm2022/iss-ctrl-date-range-picker.field-Dv636SAm.mjs +97 -0
  25. package/fesm2022/iss-ctrl-date-range-picker.field-Dv636SAm.mjs.map +1 -0
  26. package/fesm2022/iss-ctrl-date-range-picker.mjs +307 -0
  27. package/fesm2022/iss-ctrl-date-range-picker.mjs.map +1 -0
  28. package/fesm2022/iss-ctrl-date-range-picker.viewer-tmTQGPFh.mjs +41 -0
  29. package/fesm2022/iss-ctrl-date-range-picker.viewer-tmTQGPFh.mjs.map +1 -0
  30. package/fesm2022/iss-ctrl-datetime-picker.field-DldY8vke.mjs +98 -0
  31. package/fesm2022/iss-ctrl-datetime-picker.field-DldY8vke.mjs.map +1 -0
  32. package/fesm2022/iss-ctrl-datetime-picker.mjs +226 -0
  33. package/fesm2022/iss-ctrl-datetime-picker.mjs.map +1 -0
  34. package/fesm2022/iss-ctrl-datetime-picker.viewer-BeUyEBKo.mjs +42 -0
  35. package/fesm2022/iss-ctrl-datetime-picker.viewer-BeUyEBKo.mjs.map +1 -0
  36. package/fesm2022/iss-ctrl-dropdownlist.field-DikBAtc_.mjs +87 -0
  37. package/fesm2022/iss-ctrl-dropdownlist.field-DikBAtc_.mjs.map +1 -0
  38. package/fesm2022/iss-ctrl-dropdownlist.mjs +398 -0
  39. package/fesm2022/iss-ctrl-dropdownlist.mjs.map +1 -0
  40. package/fesm2022/iss-ctrl-dropdownlist.viewer-OWJxDpr8.mjs +30 -0
  41. package/fesm2022/iss-ctrl-dropdownlist.viewer-OWJxDpr8.mjs.map +1 -0
  42. package/fesm2022/iss-ctrl-file-picker.field-BMZaJxvj.mjs +210 -0
  43. package/fesm2022/iss-ctrl-file-picker.field-BMZaJxvj.mjs.map +1 -0
  44. package/fesm2022/iss-ctrl-file-picker.mjs +274 -0
  45. package/fesm2022/iss-ctrl-file-picker.mjs.map +1 -0
  46. package/fesm2022/iss-ctrl-input.field-BiwBFYx3.mjs +104 -0
  47. package/fesm2022/iss-ctrl-input.field-BiwBFYx3.mjs.map +1 -0
  48. package/fesm2022/iss-ctrl-input.mjs +204 -0
  49. package/fesm2022/iss-ctrl-input.mjs.map +1 -0
  50. package/fesm2022/iss-ctrl-input.viewer-BOZnW0_e.mjs +22 -0
  51. package/fesm2022/iss-ctrl-input.viewer-BOZnW0_e.mjs.map +1 -0
  52. package/fesm2022/iss-ctrl-iss-ctrl-BG-QWWdq.mjs +1770 -0
  53. package/fesm2022/iss-ctrl-iss-ctrl-BG-QWWdq.mjs.map +1 -0
  54. package/fesm2022/{iss-ctrl-load-event-bOt6IlIo.mjs → iss-ctrl-load-event-T4L3k9XO.mjs} +4 -3
  55. package/fesm2022/iss-ctrl-load-event-T4L3k9XO.mjs.map +1 -0
  56. package/fesm2022/{iss-ctrl-load-options-event-CxyAyNMe.mjs → iss-ctrl-load-options-event-tG258cbP.mjs} +3 -3
  57. package/fesm2022/{iss-ctrl-load-options-event-CxyAyNMe.mjs.map → iss-ctrl-load-options-event-tG258cbP.mjs.map} +1 -1
  58. package/fesm2022/{iss-ctrl-load-value-event-DJKJ5S3h.mjs → iss-ctrl-load-value-event--7zt90Dl.mjs} +3 -3
  59. package/fesm2022/{iss-ctrl-load-value-event-DJKJ5S3h.mjs.map → iss-ctrl-load-value-event--7zt90Dl.mjs.map} +1 -1
  60. package/fesm2022/iss-ctrl-mobile.field-DLccnWKX.mjs +77 -0
  61. package/fesm2022/iss-ctrl-mobile.field-DLccnWKX.mjs.map +1 -0
  62. package/fesm2022/iss-ctrl-mobile.mjs +2465 -0
  63. package/fesm2022/iss-ctrl-mobile.mjs.map +1 -0
  64. package/fesm2022/iss-ctrl-mobile.viewer-DQgxAcR-.mjs +22 -0
  65. package/fesm2022/iss-ctrl-mobile.viewer-DQgxAcR-.mjs.map +1 -0
  66. package/fesm2022/{iss-ctrl-note.field-B_Lbp28X.mjs → iss-ctrl-note.field-CT1wVmfF.mjs} +2 -2
  67. package/fesm2022/{iss-ctrl-note.field-B_Lbp28X.mjs.map → iss-ctrl-note.field-CT1wVmfF.mjs.map} +1 -1
  68. package/fesm2022/iss-ctrl-plate.field-CQQY8rnE.mjs +92 -0
  69. package/fesm2022/iss-ctrl-plate.field-CQQY8rnE.mjs.map +1 -0
  70. package/fesm2022/iss-ctrl-plate.mjs +493 -0
  71. package/fesm2022/iss-ctrl-plate.mjs.map +1 -0
  72. package/fesm2022/iss-ctrl-plate.viewer-B8PUBLH8.mjs +179 -0
  73. package/fesm2022/iss-ctrl-plate.viewer-B8PUBLH8.mjs.map +1 -0
  74. package/fesm2022/iss-ctrl-radio.field-Dp5D-AXQ.mjs +88 -0
  75. package/fesm2022/iss-ctrl-radio.field-Dp5D-AXQ.mjs.map +1 -0
  76. package/fesm2022/iss-ctrl-radio.mjs +104 -0
  77. package/fesm2022/iss-ctrl-radio.mjs.map +1 -0
  78. package/fesm2022/iss-ctrl-radio.viewer-EiDliZro.mjs +30 -0
  79. package/fesm2022/iss-ctrl-radio.viewer-EiDliZro.mjs.map +1 -0
  80. package/fesm2022/{iss-ctrl-replace-api-keys-C0XYQW4i.mjs → iss-ctrl-replace-api-keys-COUv4Kin.mjs} +2 -2
  81. package/fesm2022/{iss-ctrl-replace-api-keys-C0XYQW4i.mjs.map → iss-ctrl-replace-api-keys-COUv4Kin.mjs.map} +1 -1
  82. package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs → iss-ctrl-set-value-event-D0-_qIyS.mjs} +2 -2
  83. package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs.map → iss-ctrl-set-value-event-D0-_qIyS.mjs.map} +1 -1
  84. package/fesm2022/iss-ctrl-slide-toggle.field-vCJHOiSG.mjs +85 -0
  85. package/fesm2022/iss-ctrl-slide-toggle.field-vCJHOiSG.mjs.map +1 -0
  86. package/fesm2022/iss-ctrl-slide-toggle.mjs +66 -0
  87. package/fesm2022/iss-ctrl-slide-toggle.mjs.map +1 -0
  88. package/fesm2022/iss-ctrl-slide-toggle.viewer-hsIHwDj3.mjs +34 -0
  89. package/fesm2022/iss-ctrl-slide-toggle.viewer-hsIHwDj3.mjs.map +1 -0
  90. package/fesm2022/{iss-ctrl-table.field-B5FxF6hn.mjs → iss-ctrl-table.field-DdFjH-D8.mjs} +142 -140
  91. package/fesm2022/iss-ctrl-table.field-DdFjH-D8.mjs.map +1 -0
  92. package/fesm2022/iss-ctrl-textarea.field-Dqhhu2m4.mjs +82 -0
  93. package/fesm2022/iss-ctrl-textarea.field-Dqhhu2m4.mjs.map +1 -0
  94. package/fesm2022/iss-ctrl-textarea.mjs +115 -0
  95. package/fesm2022/iss-ctrl-textarea.mjs.map +1 -0
  96. package/fesm2022/iss-ctrl-textarea.viewer-CpmLauik.mjs +22 -0
  97. package/fesm2022/iss-ctrl-textarea.viewer-CpmLauik.mjs.map +1 -0
  98. package/fesm2022/iss-ctrl-time-picker.field-CdmxRiH8.mjs +77 -0
  99. package/fesm2022/iss-ctrl-time-picker.field-CdmxRiH8.mjs.map +1 -0
  100. package/fesm2022/iss-ctrl-time-picker.mjs +170 -0
  101. package/fesm2022/iss-ctrl-time-picker.mjs.map +1 -0
  102. package/fesm2022/iss-ctrl-time-picker.viewer-CJeFLrdI.mjs +22 -0
  103. package/fesm2022/iss-ctrl-time-picker.viewer-CJeFLrdI.mjs.map +1 -0
  104. package/fesm2022/iss-ctrl-toggle-button.field-rAT7dVFC.mjs +101 -0
  105. package/fesm2022/iss-ctrl-toggle-button.field-rAT7dVFC.mjs.map +1 -0
  106. package/fesm2022/iss-ctrl-toggle-button.mjs +158 -0
  107. package/fesm2022/iss-ctrl-toggle-button.mjs.map +1 -0
  108. package/fesm2022/iss-ctrl-toggle-button.viewer-CC-8_Dy4.mjs +30 -0
  109. package/fesm2022/iss-ctrl-toggle-button.viewer-CC-8_Dy4.mjs.map +1 -0
  110. package/fesm2022/iss-ctrl-tokens.mjs +25 -0
  111. package/fesm2022/iss-ctrl-tokens.mjs.map +1 -0
  112. package/fesm2022/{iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs → iss-ctrl-trigger-based-on-json-value-I92SNsv9.mjs} +2 -2
  113. package/fesm2022/{iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs.map → iss-ctrl-trigger-based-on-json-value-I92SNsv9.mjs.map} +1 -1
  114. package/fesm2022/{iss-ctrl-user-picker.field-BH63sZ-X.mjs → iss-ctrl-user-picker.field-DpmYCfpD.mjs} +154 -153
  115. package/fesm2022/iss-ctrl-user-picker.field-DpmYCfpD.mjs.map +1 -0
  116. package/fesm2022/iss-ctrl.mjs +3 -1
  117. package/fesm2022/iss-ctrl.mjs.map +1 -1
  118. package/package.json +69 -1
  119. package/types/iss-ctrl-base.d.ts +318 -0
  120. package/types/iss-ctrl-checkbox.d.ts +46 -0
  121. package/types/iss-ctrl-chips.d.ts +41 -0
  122. package/types/iss-ctrl-date-picker.d.ts +75 -0
  123. package/types/iss-ctrl-date-range-picker.d.ts +95 -0
  124. package/types/iss-ctrl-datetime-picker.d.ts +77 -0
  125. package/types/iss-ctrl-dropdownlist.d.ts +78 -0
  126. package/types/iss-ctrl-file-picker.d.ts +95 -0
  127. package/types/iss-ctrl-input.d.ts +76 -0
  128. package/types/iss-ctrl-mobile.d.ts +91 -0
  129. package/types/iss-ctrl-plate.d.ts +54 -0
  130. package/types/iss-ctrl-radio.d.ts +34 -0
  131. package/types/iss-ctrl-slide-toggle.d.ts +26 -0
  132. package/types/iss-ctrl-textarea.d.ts +30 -0
  133. package/types/iss-ctrl-time-picker.d.ts +48 -0
  134. package/types/iss-ctrl-toggle-button.d.ts +41 -0
  135. package/types/iss-ctrl-tokens.d.ts +21 -0
  136. package/types/iss-ctrl.d.ts +303 -2005
  137. package/fesm2022/iss-ctrl-iss-ctrl-BKu6a5HF.mjs +0 -9683
  138. package/fesm2022/iss-ctrl-iss-ctrl-BKu6a5HF.mjs.map +0 -1
  139. package/fesm2022/iss-ctrl-load-event-bOt6IlIo.mjs.map +0 -1
  140. package/fesm2022/iss-ctrl-table.field-B5FxF6hn.mjs.map +0 -1
  141. package/fesm2022/iss-ctrl-user-picker.field-BH63sZ-X.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iss-ctrl-time-picker.mjs","sources":["../../../projects/iss/time-picker/src/time-picker.control.ts","../../../projects/iss/time-picker/src/public-api.ts","../../../projects/iss/time-picker/src/iss-ctrl-time-picker.ts"],"sourcesContent":["import { Component, CUSTOM_ELEMENTS_SCHEMA, input, InputSignal } from \"@angular/core\";\nimport { NG_VALIDATORS, NG_VALUE_ACCESSOR, ReactiveFormsModule } from \"@angular/forms\";\nimport { provideNativeDateAdapter } from \"@angular/material/core\";\nimport { MatFormFieldModule } from \"@angular/material/form-field\";\nimport { MatIcon } from \"@angular/material/icon\";\nimport { MatInputModule } from \"@angular/material/input\";\nimport { MatTimepickerModule } from \"@angular/material/timepicker\";\nimport { format } from \"date-fns\";\nimport { ControlBase } from \"iss-ctrl/base\";\n\n/**\n * `<iss-ctrl-time-picker>` — time of day, picked from a list generated at a fixed interval.\n *\n * @example\n * ```html\n * <iss-ctrl-time-picker formControlName=\"startsAt\" interval=\"15min\" minTime=\"08:00\" maxTime=\"17:00\">\n * <label>Starts at</label>\n * </iss-ctrl-time-picker>\n * ```\n *\n * ### Own inputs\n * | Property | Type | Default | Description |\n * | --- | --- | --- | --- |\n * | `interval` | `string` | `\"30min\"` | Step between the offered times. |\n * | `minTime` | `string \\| null` | `null` | Earliest offered time, `HH:mm`. |\n * | `maxTime` | `string \\| null` | `null` | Latest offered time, `HH:mm`. |\n *\n * ### Inherited from {@link ControlBase}\n * `formControlName` · `readonly` · `className` · `(onChange)`\n *\n * Projects `<label>` into the floating label; omit it to render the control without one.\n */\n@Component({\n selector: \"iss-ctrl-time-picker\",\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n imports: [\n MatFormFieldModule, MatInputModule, MatTimepickerModule, ReactiveFormsModule, MatIcon,\n ],\n providers: [\n provideNativeDateAdapter(),\n { provide: NG_VALUE_ACCESSOR, useExisting: TimePickerControl, multi: true },\n { provide: NG_VALIDATORS, useExisting: TimePickerControl, multi: true },\n ],\n template: `\n <mat-form-field floatLabel=\"auto\" class=\"\">\n <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->\n <mat-label class=\"fs-16 fc-dark-gray\">\n <ng-content select=\"label\"></ng-content>\n </mat-label>\n <input\n matInput\n [errorStateMatcher]=\"errorStateMatcher\"\n [formControl]=\"ctrl\"\n [matTimepicker]=\"picker\"\n [matTimepickerMin]=\"minTime()\"\n [matTimepickerMax]=\"maxTime()\"\n [readonly]=\"readonly()\"\n readonly\n />\n @if (ctrl.getRawValue()) {\n <mat-icon matSuffix style=\"cursor: pointer\" (click)=\"clear($event)\">close</mat-icon>\n }\n <mat-timepicker-toggle matIconSuffix [for]=\"picker\" [disabled]=\"readonly()\"/>\n <mat-timepicker (selected)=\"emit($event)\" [interval]=\"interval()\" #picker/>\n\n </mat-form-field>\n `,\n})\nexport class TimePickerControl extends ControlBase {\n /**\n * Step between the offered times, for example `\"15min\"` or `\"30min\"`.\n */\n interval: InputSignal<string> = input(\"30min\");\n /**\n * Earliest offered time of day, as `HH:mm`.\n */\n minTime: InputSignal<string | null> = input<string | null>(null);\n /**\n * Latest offered time of day, as `HH:mm`.\n */\n maxTime: InputSignal<string | null> = input<string | null>(null);\n\n emit(evt: any) {\n if (this.readonly()) {\n return;\n }\n this.propagateValue(this.#stringifyTime(evt.value));\n this.emitOnChangeEvent(this.#stringifyTime(evt.value));\n }\n\n clear(event: MouseEvent) {\n if (this.readonly()) {\n return;\n }\n event.stopImmediatePropagation();\n this.ctrl.setValue(null);\n\n this.propagateValue(null);\n this.emitOnChangeEvent(null);\n }\n\n override writeValue(value: any) {\n if (!value) {\n this.ctrl.setValue(null, { emitEvent: false });\n return;\n }\n\n const parts: string[] = String(value).split(\":\");\n const d = new Date();\n d.setHours(Number(parts[0]));\n d.setMinutes(Number(parts[1]));\n d.setSeconds(Number(parts[2] ?? \"00\"));\n this.ctrl.setValue(d, { emitEvent: false });\n }\n\n #stringifyTime(value: any) {\n let formatedTime;\n try {\n formatedTime = format(new Date(value), \"HH:mm:ss\");\n } catch (e) {\n formatedTime = value;\n }\n\n if (value instanceof Date && !Number.isNaN(value.getTime())) {\n return formatedTime;\n }\n\n return null;\n }\n}\n","// The time-picker control. Its field and viewer stay in the primary entry point and reach it\n// from there, so the control ships only to an app that renders it or imports it directly.\n\nexport * from \"./time-picker.control\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Component } from '@angular/core';
3
+ import { ViewerBase } from 'iss-ctrl/base';
4
+
5
+ class TimePickerViewer extends ViewerBase {
6
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TimePickerViewer, deps: null, target: i0.ɵɵFactoryTarget.Component });
7
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: TimePickerViewer, isStandalone: true, selector: "iss-viewer-time-picker", usesInheritance: true, ngImport: i0, template: `
8
+ {{ field().ctrlValue() }}
9
+ `, isInline: true });
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TimePickerViewer, decorators: [{
12
+ type: Component,
13
+ args: [{
14
+ selector: "iss-viewer-time-picker",
15
+ template: `
16
+ {{ field().ctrlValue() }}
17
+ `,
18
+ }]
19
+ }] });
20
+
21
+ export { TimePickerViewer };
22
+ //# sourceMappingURL=iss-ctrl-time-picker.viewer-CJeFLrdI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iss-ctrl-time-picker.viewer-CJeFLrdI.mjs","sources":["../../../projects/iss/src/components/controls/time-picker/time-picker.viewer.ts"],"sourcesContent":["import { Component } from \"@angular/core\";\nimport { ViewerBase } from \"iss-ctrl/base\";\n\n@Component({\n selector: \"iss-viewer-time-picker\",\n template: `\n {{ field().ctrlValue() }}\n `,\n})\nexport class TimePickerViewer extends ViewerBase {}\n"],"names":[],"mappings":";;;;AASM,MAAO,gBAAiB,SAAQ,UAAU,CAAA;uGAAnC,gBAAgB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAJjB;;AAET,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEU,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAN5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,QAAQ,EAAE;;AAET,EAAA,CAAA;AACF,iBAAA;;;;;"}
@@ -0,0 +1,101 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Component } from '@angular/core';
3
+ import * as i1 from '@angular/forms';
4
+ import { ReactiveFormsModule } from '@angular/forms';
5
+ import { F as FieldBase, V as VIEW_PROVIDER, a as ValidationMessage, b as FieldViewer } from './iss-ctrl-iss-ctrl-BG-QWWdq.mjs';
6
+ import { ToggleButtonControl } from 'iss-ctrl/toggle-button';
7
+ import { ToggleButtonViewer } from './iss-ctrl-toggle-button.viewer-CC-8_Dy4.mjs';
8
+
9
+ /**
10
+ * `<iss-field-toggle-button>` — options rendered as a button group.
11
+ *
12
+ * Rendered by the outlet for fields of type `toggle_button`. In `edit` mode it renders
13
+ * {@link ToggleButtonControl} plus the validation message; in `view` mode the matching viewer.
14
+ *
15
+ * ### Supported `config` keys
16
+ * | Key | Type | Description |
17
+ * | --- | --- | --- |
18
+ * | `multiple` | `boolean` | Allows more than one active button. |
19
+ * | `hideLabel` | `boolean` | Hides the field label. |
20
+ * | `readonly` | `boolean` | Shows the value but blocks interaction. |
21
+ *
22
+ * ### Other field members used
23
+ * `label()` · `options()`
24
+ *
25
+ * Every field also honours `visible`, `mode`, `validation`, `asyncValidation` and
26
+ * `events` — see {@link IssField} for the full model and {@link FieldConfig} for all keys.
27
+ *
28
+ * @example
29
+ * ```json
30
+ * { "name": "priority", "type": "toggle_button", "label": "Priority", "options": [{ "value": "high", "label": "High" }] }
31
+ * ```
32
+ */
33
+ class ToggleButtonField extends FieldBase {
34
+ onChange($event) {
35
+ this.field.ctrlJsonValue.set($event);
36
+ }
37
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToggleButtonField, deps: null, target: i0.ɵɵFactoryTarget.Component });
38
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ToggleButtonField, isStandalone: true, selector: "iss-field-toggle-button", usesInheritance: true, ngImport: i0, template: `
39
+ @if (field.visible()) {
40
+ <div style="display: flex; flex-direction: column">
41
+ @if (field.mode() === "edit") {
42
+ <iss-ctrl-toggle-button
43
+ [formControlName]="field.name"
44
+ [options]="field.options()"
45
+ [multiple]="field.config.multiple()"
46
+ [readonly]="field.config.readonly() ?? false"
47
+ (onChange)="onChange($event)"
48
+ >
49
+ <label>{{ field.label() }}</label>
50
+ </iss-ctrl-toggle-button>
51
+ <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
52
+ } @else {
53
+ <iss-field-viewer>
54
+ <label>{{ field.label() }}</label>
55
+ <iss-viewer-toggle-button [field]="field"/>
56
+ </iss-field-viewer>
57
+ }
58
+ </div>
59
+ }
60
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ToggleButtonControl, selector: "iss-ctrl-toggle-button", inputs: ["options"] }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: ToggleButtonViewer, selector: "iss-viewer-toggle-button" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
61
+ }
62
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToggleButtonField, decorators: [{
63
+ type: Component,
64
+ args: [{
65
+ selector: "iss-field-toggle-button",
66
+ viewProviders: [VIEW_PROVIDER],
67
+ imports: [
68
+ ReactiveFormsModule,
69
+ ToggleButtonControl,
70
+ ValidationMessage,
71
+ ToggleButtonViewer,
72
+ FieldViewer
73
+ ],
74
+ template: `
75
+ @if (field.visible()) {
76
+ <div style="display: flex; flex-direction: column">
77
+ @if (field.mode() === "edit") {
78
+ <iss-ctrl-toggle-button
79
+ [formControlName]="field.name"
80
+ [options]="field.options()"
81
+ [multiple]="field.config.multiple()"
82
+ [readonly]="field.config.readonly() ?? false"
83
+ (onChange)="onChange($event)"
84
+ >
85
+ <label>{{ field.label() }}</label>
86
+ </iss-ctrl-toggle-button>
87
+ <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
88
+ } @else {
89
+ <iss-field-viewer>
90
+ <label>{{ field.label() }}</label>
91
+ <iss-viewer-toggle-button [field]="field"/>
92
+ </iss-field-viewer>
93
+ }
94
+ </div>
95
+ }
96
+ `
97
+ }]
98
+ }] });
99
+
100
+ export { ToggleButtonField };
101
+ //# sourceMappingURL=iss-ctrl-toggle-button.field-rAT7dVFC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iss-ctrl-toggle-button.field-rAT7dVFC.mjs","sources":["../../../projects/iss/src/components/controls/toggle-button/toggle-button.field.ts"],"sourcesContent":["import { Component } from \"@angular/core\";\nimport { ReactiveFormsModule } from \"@angular/forms\";\nimport { VIEW_PROVIDER } from \"../../../shared/constants/view-provider.const\";\nimport { FieldViewer } from \"../../shared/field-viewer\";\nimport { ValidationMessage } from \"../../shared/validation-message\";\nimport { FieldBase } from \"../base/field-base\";\nimport { ToggleButtonControl } from \"iss-ctrl/toggle-button\";\nimport { ToggleButtonViewer } from \"./toggle-button.viewer\";\n\n/**\n * `<iss-field-toggle-button>` — options rendered as a button group.\n *\n * Rendered by the outlet for fields of type `toggle_button`. In `edit` mode it renders\n * {@link ToggleButtonControl} plus the validation message; in `view` mode the matching viewer.\n *\n * ### Supported `config` keys\n * | Key | Type | Description |\n * | --- | --- | --- |\n * | `multiple` | `boolean` | Allows more than one active button. |\n * | `hideLabel` | `boolean` | Hides the field label. |\n * | `readonly` | `boolean` | Shows the value but blocks interaction. |\n *\n * ### Other field members used\n * `label()` · `options()`\n *\n * Every field also honours `visible`, `mode`, `validation`, `asyncValidation` and\n * `events` — see {@link IssField} for the full model and {@link FieldConfig} for all keys.\n *\n * @example\n * ```json\n * { \"name\": \"priority\", \"type\": \"toggle_button\", \"label\": \"Priority\", \"options\": [{ \"value\": \"high\", \"label\": \"High\" }] }\n * ```\n */\n@Component({\n selector: \"iss-field-toggle-button\",\n viewProviders: [VIEW_PROVIDER],\n imports: [\n ReactiveFormsModule,\n ToggleButtonControl,\n ValidationMessage,\n ToggleButtonViewer,\n FieldViewer\n ],\n template: `\n @if (field.visible()) {\n <div style=\"display: flex; flex-direction: column\">\n @if (field.mode() === \"edit\") {\n <iss-ctrl-toggle-button\n [formControlName]=\"field.name\"\n [options]=\"field.options()\"\n [multiple]=\"field.config.multiple()\"\n [readonly]=\"field.config.readonly() ?? false\"\n (onChange)=\"onChange($event)\"\n >\n <label>{{ field.label() }}</label>\n </iss-ctrl-toggle-button>\n <iss-validation-message-viewer [errors]=\"ctrl.errors\" [showMessage]=\"!ctrl.untouched\"/>\n } @else {\n <iss-field-viewer>\n <label>{{ field.label() }}</label>\n <iss-viewer-toggle-button [field]=\"field\"/>\n </iss-field-viewer>\n }\n </div>\n }\n `\n})\nexport class ToggleButtonField extends FieldBase {\n onChange($event: any) {\n this.field.ctrlJsonValue.set($event);\n }\n}\n"],"names":[],"mappings":";;;;;;;;AASA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AAmCG,MAAO,iBAAkB,SAAQ,SAAS,CAAA;AAC9C,IAAA,QAAQ,CAAC,MAAW,EAAA;QAClB,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;IACtC;uGAHW,iBAAiB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxBlB;;;;;;;;;;;;;;;;;;;;;;AAsBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA5BC,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,mBAAmB,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,iBAAiB,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,kBAAkB,EAAA,QAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,WAAW,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,aAAA,EANE,CAAC,aAAa,CAAC,EAAA,CAAA;;2FAgCnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAlC7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,yBAAyB;oBACnC,aAAa,EAAE,CAAC,aAAa,CAAC;AAC9B,oBAAA,OAAO,EAAE;wBACP,mBAAmB;wBACnB,mBAAmB;wBACnB,iBAAiB;wBACjB,kBAAkB;wBAClB;AACD,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;AAsBT,EAAA;AACF,iBAAA;;;;;"}
@@ -0,0 +1,158 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, signal, Component } from '@angular/core';
3
+ import * as i2 from '@angular/forms';
4
+ import { ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
5
+ import * as i1 from '@angular/material/button-toggle';
6
+ import { MatButtonToggleModule } from '@angular/material/button-toggle';
7
+ import { ControlBase, TranslatePipe } from 'iss-ctrl/base';
8
+
9
+ /**
10
+ * `<iss-ctrl-toggle-button>` — options rendered as a button group instead of a dropdown.
11
+ *
12
+ * With `multiple` set, several buttons can be active at once.
13
+ *
14
+ * @example
15
+ * ```html
16
+ * <iss-ctrl-toggle-button formControlName="priority" [options]="priorities" [multiple]="false"/>
17
+ * ```
18
+ *
19
+ * ### Own inputs
20
+ * | Property | Type | Default | Description |
21
+ * | --- | --- | --- | --- |
22
+ * | `options` | `Option[]` | **required** | The selectable choices. |
23
+ *
24
+ * ### Inherited from {@link ControlBase}
25
+ * `formControlName` · `readonly` · `className` · `(onChange)` · `multiple`
26
+ *
27
+ * Projects a `<label>` above the control — the wrapping `iss-field-*` passes the field label in that way.
28
+ */
29
+ class ToggleButtonControl extends ControlBase {
30
+ /**
31
+ * Selectable choices, each a `{ value, title }` pair. Required.
32
+ */
33
+ options = input.required(...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
34
+ selectedOptions = signal(new Map(), ...(ngDevMode ? [{ debugName: "selectedOptions" }] : /* istanbul ignore next */ []));
35
+ writeValue(value) {
36
+ this.#reset();
37
+ if (!value) {
38
+ return;
39
+ }
40
+ const values = value.split(",").map((val) => val.trim());
41
+ const selectedOptions = this.options().filter((option) => values.includes(option.value));
42
+ if (!this.multiple()) {
43
+ // single selection mode, only the first matching option is honoured
44
+ const selectedOption = selectedOptions[0];
45
+ this.ctrl.setValue(selectedOption ? selectedOption.value : null, { emitEvent: false });
46
+ this.addToSelectedOptionsMap(this.#selectedOptionsMapFactory(selectedOption ? [selectedOption] : []));
47
+ return;
48
+ }
49
+ this.addToSelectedOptionsMap(this.#selectedOptionsMapFactory(selectedOptions));
50
+ this.ctrl.setValue(selectedOptions.map((option) => option.value), { emitEvent: false });
51
+ }
52
+ addToSelectedOptionsMap(option) {
53
+ if (option) {
54
+ this.selectedOptions.set(option);
55
+ }
56
+ }
57
+ onToggleButtonChange(checked, value) {
58
+ if (this.readonly()) {
59
+ return;
60
+ }
61
+ this.markAsTouched();
62
+ if (!this.multiple()) {
63
+ const selectedOption = this.options().find((o) => o.value === value);
64
+ this.addToSelectedOptionsMap(this.#selectedOptionsMapFactory(selectedOption ? [selectedOption] : []));
65
+ this.propagateValue(value);
66
+ this.emitOnChangeEvent(selectedOption ? [selectedOption] : null);
67
+ }
68
+ else {
69
+ const option = this.options().find((o) => o.value === value);
70
+ if (!option) {
71
+ return;
72
+ }
73
+ const options = new Map(this.selectedOptions());
74
+ if (checked)
75
+ options.set(option.value, option);
76
+ else
77
+ options.delete(option.value);
78
+ this.getEmissionValue(options);
79
+ }
80
+ }
81
+ stringifySelectedOptions() {
82
+ if (!this.selectedOptions()?.size) {
83
+ return null;
84
+ }
85
+ return Array.from(this.selectedOptions(), ([value]) => value).join();
86
+ }
87
+ getEmissionValue(options) {
88
+ this.addToSelectedOptionsMap(options);
89
+ // the form keeps the stringified values, while (onChange) consumers get the resolved options
90
+ this.propagateValue(this.stringifySelectedOptions());
91
+ this.emitOnChangeEvent(this.#convertSelectedMapToArray());
92
+ }
93
+ #convertSelectedMapToArray() {
94
+ const selectedOptions = Array.from(this.selectedOptions().values());
95
+ return selectedOptions.length ? selectedOptions : null;
96
+ }
97
+ #selectedOptionsMapFactory(selectedOptions) {
98
+ const selectedOptionsMap = new Map();
99
+ for (const option of selectedOptions) {
100
+ selectedOptionsMap.set(option.value, option);
101
+ }
102
+ return selectedOptionsMap;
103
+ }
104
+ #reset() {
105
+ this.selectedOptions.set(new Map());
106
+ this.ctrl.setValue(null, { emitEvent: false });
107
+ }
108
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToggleButtonControl, deps: null, target: i0.ɵɵFactoryTarget.Component });
109
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ToggleButtonControl, isStandalone: true, selector: "iss-ctrl-toggle-button", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null } }, providers: [
110
+ { provide: NG_VALUE_ACCESSOR, useExisting: ToggleButtonControl, multi: true }
111
+ ], usesInheritance: true, ngImport: i0, template: `
112
+ <ng-content select="label"></ng-content>
113
+ <mat-button-toggle-group
114
+ [formControl]="ctrl"
115
+ [disabled]="readonly()"
116
+ [multiple]=multiple()
117
+ [hideMultipleSelectionIndicator]="true"
118
+ [hideSingleSelectionIndicator]="true"
119
+ >
120
+ @for (option of options(); track option.value) {
121
+ <mat-button-toggle class="d-block" [value]="option.value" (change)="onToggleButtonChange($event.source.checked,option.value)">
122
+ {{ option?.title | translate }}
123
+ </mat-button-toggle>
124
+ }
125
+ </mat-button-toggle-group>
126
+ `, isInline: true, styles: [".mat-button-toggle-group-appearance-standard{border-radius:unset!important}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
127
+ }
128
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToggleButtonControl, decorators: [{
129
+ type: Component,
130
+ args: [{ selector: "iss-ctrl-toggle-button", imports: [MatButtonToggleModule, ReactiveFormsModule, TranslatePipe], template: `
131
+ <ng-content select="label"></ng-content>
132
+ <mat-button-toggle-group
133
+ [formControl]="ctrl"
134
+ [disabled]="readonly()"
135
+ [multiple]=multiple()
136
+ [hideMultipleSelectionIndicator]="true"
137
+ [hideSingleSelectionIndicator]="true"
138
+ >
139
+ @for (option of options(); track option.value) {
140
+ <mat-button-toggle class="d-block" [value]="option.value" (change)="onToggleButtonChange($event.source.checked,option.value)">
141
+ {{ option?.title | translate }}
142
+ </mat-button-toggle>
143
+ }
144
+ </mat-button-toggle-group>
145
+ `, providers: [
146
+ { provide: NG_VALUE_ACCESSOR, useExisting: ToggleButtonControl, multi: true }
147
+ ], styles: [".mat-button-toggle-group-appearance-standard{border-radius:unset!important}\n"] }]
148
+ }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }] } });
149
+
150
+ // The toggle-button control. Its field and viewer stay in the primary entry point and reach it
151
+ // from there, so the control ships only to an app that renders it or imports it directly.
152
+
153
+ /**
154
+ * Generated bundle index. Do not edit.
155
+ */
156
+
157
+ export { ToggleButtonControl };
158
+ //# sourceMappingURL=iss-ctrl-toggle-button.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iss-ctrl-toggle-button.mjs","sources":["../../../projects/iss/toggle-button/src/toggle-button.control.ts","../../../projects/iss/toggle-button/src/public-api.ts","../../../projects/iss/toggle-button/src/iss-ctrl-toggle-button.ts"],"sourcesContent":["import { Component, input, InputSignal, signal, WritableSignal } from \"@angular/core\";\nimport { NG_VALUE_ACCESSOR, ReactiveFormsModule } from \"@angular/forms\";\nimport { MatButtonToggleModule } from \"@angular/material/button-toggle\";\nimport { ControlBase, Option, TranslatePipe } from \"iss-ctrl/base\";\n\n/**\n * `<iss-ctrl-toggle-button>` — options rendered as a button group instead of a dropdown.\n *\n * With `multiple` set, several buttons can be active at once.\n *\n * @example\n * ```html\n * <iss-ctrl-toggle-button formControlName=\"priority\" [options]=\"priorities\" [multiple]=\"false\"/>\n * ```\n *\n * ### Own inputs\n * | Property | Type | Default | Description |\n * | --- | --- | --- | --- |\n * | `options` | `Option[]` | **required** | The selectable choices. |\n *\n * ### Inherited from {@link ControlBase}\n * `formControlName` · `readonly` · `className` · `(onChange)` · `multiple`\n *\n * Projects a `<label>` above the control — the wrapping `iss-field-*` passes the field label in that way.\n */\n@Component({\n selector: \"iss-ctrl-toggle-button\",\n imports: [MatButtonToggleModule, ReactiveFormsModule, TranslatePipe],\n template: `\n <ng-content select=\"label\"></ng-content>\n <mat-button-toggle-group\n [formControl]=\"ctrl\"\n [disabled]=\"readonly()\"\n [multiple]=multiple()\n [hideMultipleSelectionIndicator]=\"true\"\n [hideSingleSelectionIndicator]=\"true\"\n >\n @for (option of options(); track option.value) {\n <mat-button-toggle class=\"d-block\" [value]=\"option.value\" (change)=\"onToggleButtonChange($event.source.checked,option.value)\">\n {{ option?.title | translate }}\n </mat-button-toggle>\n }\n </mat-button-toggle-group>\n `,\n styles: `\n .mat-button-toggle-group-appearance-standard {\n border-radius: unset !important;\n }\n `,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: ToggleButtonControl, multi: true }\n ]\n})\nexport class ToggleButtonControl extends ControlBase {\n /**\n * Selectable choices, each a `{ value, title }` pair. Required.\n */\n options: InputSignal<Option[]> = input.required();\n selectedOptions: WritableSignal<Map<string, Option>> = signal(new Map<string, Option>());\n\n override writeValue(value: string | null) {\n this.#reset();\n if (!value) {\n return;\n }\n const values: string[] = value.split(\",\").map((val: string) => val.trim());\n const selectedOptions: Option[] = this.options().filter((option: Option) => values.includes(option.value));\n if (!this.multiple()) {\n // single selection mode, only the first matching option is honoured\n const selectedOption: Option | undefined = selectedOptions[0];\n this.ctrl.setValue(selectedOption ? selectedOption.value : null, { emitEvent: false });\n this.addToSelectedOptionsMap(this.#selectedOptionsMapFactory(selectedOption ? [selectedOption] : []));\n return;\n }\n this.addToSelectedOptionsMap(this.#selectedOptionsMapFactory(selectedOptions));\n this.ctrl.setValue(selectedOptions.map((option: Option) => option.value), { emitEvent: false });\n }\n\n addToSelectedOptionsMap(option: Map<string, Option>) {\n if (option) {\n this.selectedOptions.set(option);\n }\n }\n\n onToggleButtonChange(checked: boolean, value: string) {\n if (this.readonly()) {\n return;\n }\n this.markAsTouched();\n if (!this.multiple()) {\n const selectedOption: Option | undefined = this.options().find((o: Option) => o.value === value);\n this.addToSelectedOptionsMap(this.#selectedOptionsMapFactory(selectedOption ? [selectedOption] : []));\n this.propagateValue(value);\n this.emitOnChangeEvent(selectedOption ? [selectedOption] : null);\n } else {\n const option = this.options().find((o: Option) => o.value === value);\n if (!option) {\n return;\n }\n const options: Map<string, Option> = new Map(this.selectedOptions());\n if (checked) options.set(option.value, option);\n else options.delete(option.value);\n this.getEmissionValue(options);\n }\n }\n\n stringifySelectedOptions(): string | null {\n if (!this.selectedOptions()?.size) {\n return null;\n }\n return Array.from(this.selectedOptions(), ([value]) => value).join();\n }\n\n getEmissionValue(options: any) {\n this.addToSelectedOptionsMap(options);\n // the form keeps the stringified values, while (onChange) consumers get the resolved options\n this.propagateValue(this.stringifySelectedOptions());\n this.emitOnChangeEvent(this.#convertSelectedMapToArray());\n }\n\n #convertSelectedMapToArray(): Option[] | null {\n const selectedOptions: Option[] = Array.from(this.selectedOptions().values());\n return selectedOptions.length ? selectedOptions : null;\n }\n\n #selectedOptionsMapFactory(selectedOptions: Option[]) {\n const selectedOptionsMap: Map<string, Option> = new Map();\n for (const option of selectedOptions) {\n selectedOptionsMap.set(option.value, option);\n }\n return selectedOptionsMap;\n }\n\n #reset() {\n this.selectedOptions.set(new Map<string, Option>());\n this.ctrl.setValue(null, { emitEvent: false });\n }\n}\n","// The toggle-button control. Its field and viewer stay in the primary entry point and reach it\n// from there, so the control ships only to an app that renders it or imports it directly.\n\nexport * from \"./toggle-button.control\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Component } from '@angular/core';
3
+ import { ViewerBase } from 'iss-ctrl/base';
4
+
5
+ class ToggleButtonViewer extends ViewerBase {
6
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToggleButtonViewer, deps: null, target: i0.ɵɵFactoryTarget.Component });
7
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ToggleButtonViewer, isStandalone: true, selector: "iss-viewer-toggle-button", usesInheritance: true, ngImport: i0, template: `
8
+ <p>
9
+ @for (item of field().ctrlJsonValue(); track item?.value; let last = $last) {
10
+ <span>{{ item.label }} {{ last ? '' : ', ' }}</span>
11
+ }
12
+ </p>
13
+ `, isInline: true });
14
+ }
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToggleButtonViewer, decorators: [{
16
+ type: Component,
17
+ args: [{
18
+ selector: "iss-viewer-toggle-button",
19
+ template: `
20
+ <p>
21
+ @for (item of field().ctrlJsonValue(); track item?.value; let last = $last) {
22
+ <span>{{ item.label }} {{ last ? '' : ', ' }}</span>
23
+ }
24
+ </p>
25
+ `,
26
+ }]
27
+ }] });
28
+
29
+ export { ToggleButtonViewer };
30
+ //# sourceMappingURL=iss-ctrl-toggle-button.viewer-CC-8_Dy4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iss-ctrl-toggle-button.viewer-CC-8_Dy4.mjs","sources":["../../../projects/iss/src/components/controls/toggle-button/toggle-button.viewer.ts"],"sourcesContent":["import { Component } from \"@angular/core\";\nimport { ViewerBase } from \"iss-ctrl/base\";\n\n@Component({\n selector: \"iss-viewer-toggle-button\",\n template: `\n <p>\n @for (item of field().ctrlJsonValue(); track item?.value; let last = $last) {\n <span>{{ item.label }} {{ last ? '' : ', ' }}</span>\n }\n </p>\n `,\n})\nexport class ToggleButtonViewer extends ViewerBase {}\n"],"names":[],"mappings":";;;;AAaM,MAAO,kBAAmB,SAAQ,UAAU,CAAA;uGAArC,kBAAkB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EARnB;;;;;;AAMT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEU,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAV9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,0BAA0B;AACpC,oBAAA,QAAQ,EAAE;;;;;;AAMT,EAAA,CAAA;AACF,iBAAA;;;;;"}
@@ -0,0 +1,25 @@
1
+ import { InjectionToken } from '@angular/core';
2
+
3
+ const ATTACHMENT_UPLOAD_URL = new InjectionToken("ATTACHMENT UPLOAD URL");
4
+ const ATTACHMENT_UPLOAD_RESPONSE_MAPPER = new InjectionToken("Map backend response to required response interface.");
5
+ const ATTACHMENT_DOWNLOAD_URL = new InjectionToken("Attachment download URL");
6
+
7
+ const HOST = new InjectionToken("Backend Host to call");
8
+
9
+ const UI_LANGUAGE = new InjectionToken("UI SELECTED LANGUAGE");
10
+
11
+ const USER_SEARCH_API = new InjectionToken("USER SEARCH URL");
12
+
13
+ // Configuration the host application provides to the library.
14
+ //
15
+ // This is a secondary entry point so an app can wire these up in its root providers
16
+ // without dragging the control/field/viewer graph — and libphonenumber-js behind it —
17
+ // into its initial bundle. Everything here must stay free of runtime dependencies on
18
+ // the primary entry point.
19
+
20
+ /**
21
+ * Generated bundle index. Do not edit.
22
+ */
23
+
24
+ export { ATTACHMENT_DOWNLOAD_URL, ATTACHMENT_UPLOAD_RESPONSE_MAPPER, ATTACHMENT_UPLOAD_URL, HOST, UI_LANGUAGE, USER_SEARCH_API };
25
+ //# sourceMappingURL=iss-ctrl-tokens.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iss-ctrl-tokens.mjs","sources":["../../../projects/iss/tokens/src/attachment.token.ts","../../../projects/iss/tokens/src/host.token.ts","../../../projects/iss/tokens/src/language.token.ts","../../../projects/iss/tokens/src/user-search-api.token.ts","../../../projects/iss/tokens/src/public-api.ts","../../../projects/iss/tokens/src/iss-ctrl-tokens.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\nimport { IssAttachment } from \"./attachment\";\n\nexport const ATTACHMENT_UPLOAD_URL: InjectionToken<string> = new InjectionToken(\"ATTACHMENT UPLOAD URL\");\nexport const ATTACHMENT_UPLOAD_RESPONSE_MAPPER: InjectionToken<(res: any) => IssAttachment[]> = new InjectionToken(\"Map backend response to required response interface.\");\nexport const ATTACHMENT_DOWNLOAD_URL: InjectionToken<string> = new InjectionToken(\"Attachment download URL\");\n","import {InjectionToken} from \"@angular/core\";\r\n\r\nexport const HOST: InjectionToken<string> = new InjectionToken(\"Backend Host to call\");\r\n","import {InjectionToken} from \"@angular/core\";\r\n\r\nexport const UI_LANGUAGE: InjectionToken<string> = new InjectionToken(\"UI SELECTED LANGUAGE\");\r\n","import { InjectionToken } from \"@angular/core\";\r\n\r\nexport const USER_SEARCH_API: InjectionToken<string> = new InjectionToken(\"USER SEARCH URL\");\r\n","// Configuration the host application provides to the library.\n//\n// This is a secondary entry point so an app can wire these up in its root providers\n// without dragging the control/field/viewer graph — and libphonenumber-js behind it —\n// into its initial bundle. Everything here must stay free of runtime dependencies on\n// the primary entry point.\n\nexport type { IssAttachment } from \"./attachment\";\nexport * from \"./attachment.token\";\nexport * from \"./host.token\";\nexport * from \"./language.token\";\nexport * from \"./user-search-api.token\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;MAGa,qBAAqB,GAA2B,IAAI,cAAc,CAAC,uBAAuB;MAC1F,iCAAiC,GAAkD,IAAI,cAAc,CAAC,sDAAsD;MAC5J,uBAAuB,GAA2B,IAAI,cAAc,CAAC,yBAAyB;;MCH9F,IAAI,GAA2B,IAAI,cAAc,CAAC,sBAAsB;;MCAxE,WAAW,GAA2B,IAAI,cAAc,CAAC,sBAAsB;;MCA/E,eAAe,GAA2B,IAAI,cAAc,CAAC,iBAAiB;;ACF3F;AACA;AACA;AACA;AACA;AACA;;ACLA;;AAEG;;;;"}
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Injectable } from '@angular/core';
3
- import { g as getPropertyByPath } from './iss-ctrl-iss-ctrl-BKu6a5HF.mjs';
3
+ import { g as getPropertyByPath } from './iss-ctrl-iss-ctrl-BG-QWWdq.mjs';
4
4
 
5
5
  class TriggerBasedOnJsonValue {
6
6
  isTriggered(field, change, action, masterField) {
@@ -21,4 +21,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
21
21
  }] });
22
22
 
23
23
  export { TriggerBasedOnJsonValue };
24
- //# sourceMappingURL=iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs.map
24
+ //# sourceMappingURL=iss-ctrl-trigger-based-on-json-value-I92SNsv9.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs","sources":["../../../projects/iss/src/events/triggers/trigger-based-on-json-value.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\r\nimport { FieldEvent } from \"../../shared/classes/field-event\";\r\nimport { IssField } from \"../../shared/classes/iss-field\";\r\nimport { FieldChange } from \"../../shared/interfaces/event-strategy\";\r\nimport { ActionTriggerFn } from \"../../shared/interfaces/event-trigger-fn\";\r\nimport { getPropertyByPath } from \"../../shared/utilities/get-property-by-path.util\";\r\n\r\n@Injectable({providedIn: \"root\"})\r\nexport class TriggerBasedOnJsonValue implements ActionTriggerFn {\r\n isTriggered(field: IssField, change: FieldChange, action: FieldEvent, masterField: IssField): boolean {\r\n if (masterField) {\r\n const actionTriggersOnAnyValue: boolean = action.value === \"*\" && (change.value !== null && change.value !== undefined);\r\n const triggerValue = getPropertyByPath(masterField.ctrlJsonValue(), action.config?.triggerFromJsonValue);\r\n const actionTriggersOnSpecificValue: boolean = triggerValue === action.value;\r\n return actionTriggersOnAnyValue || actionTriggersOnSpecificValue;\r\n }\r\n return false;\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;MAQa,uBAAuB,CAAA;AAClC,IAAA,WAAW,CAAC,KAAe,EAAE,MAAmB,EAAE,MAAkB,EAAE,WAAqB,EAAA;QACzF,IAAI,WAAW,EAAE;YACf,MAAM,wBAAwB,GAAY,MAAM,CAAC,KAAK,KAAK,GAAG,KAAK,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC;AACvH,YAAA,MAAM,YAAY,GAAG,iBAAiB,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC;AACxG,YAAA,MAAM,6BAA6B,GAAY,YAAY,KAAK,MAAM,CAAC,KAAK;YAC5E,OAAO,wBAAwB,IAAI,6BAA6B;QAClE;AACA,QAAA,OAAO,KAAK;IACd;uGATW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cADX,MAAM,EAAA,CAAA;;2FAClB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,UAAU;mBAAC,EAAC,UAAU,EAAE,MAAM,EAAC;;;;;"}
1
+ {"version":3,"file":"iss-ctrl-trigger-based-on-json-value-I92SNsv9.mjs","sources":["../../../projects/iss/src/events/triggers/trigger-based-on-json-value.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\r\nimport { FieldEvent } from \"../../shared/classes/field-event\";\r\nimport { IssField } from \"../../shared/classes/iss-field\";\r\nimport { FieldChange } from \"../../shared/interfaces/event-strategy\";\r\nimport { ActionTriggerFn } from \"../../shared/interfaces/event-trigger-fn\";\r\nimport { getPropertyByPath } from \"../../shared/utilities/get-property-by-path.util\";\r\n\r\n@Injectable({providedIn: \"root\"})\r\nexport class TriggerBasedOnJsonValue implements ActionTriggerFn {\r\n isTriggered(field: IssField, change: FieldChange, action: FieldEvent, masterField: IssField): boolean {\r\n if (masterField) {\r\n const actionTriggersOnAnyValue: boolean = action.value === \"*\" && (change.value !== null && change.value !== undefined);\r\n const triggerValue = getPropertyByPath(masterField.ctrlJsonValue(), action.config?.triggerFromJsonValue);\r\n const actionTriggersOnSpecificValue: boolean = triggerValue === action.value;\r\n return actionTriggersOnAnyValue || actionTriggersOnSpecificValue;\r\n }\r\n return false;\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;MAQa,uBAAuB,CAAA;AAClC,IAAA,WAAW,CAAC,KAAe,EAAE,MAAmB,EAAE,MAAkB,EAAE,WAAqB,EAAA;QACzF,IAAI,WAAW,EAAE;YACf,MAAM,wBAAwB,GAAY,MAAM,CAAC,KAAK,KAAK,GAAG,KAAK,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC;AACvH,YAAA,MAAM,YAAY,GAAG,iBAAiB,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC;AACxG,YAAA,MAAM,6BAA6B,GAAY,YAAY,KAAK,MAAM,CAAC,KAAK;YAC5E,OAAO,wBAAwB,IAAI,6BAA6B;QAClE;AACA,QAAA,OAAO,KAAK;IACd;uGATW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cADX,MAAM,EAAA,CAAA;;2FAClB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,UAAU;mBAAC,EAAC,UAAU,EAAE,MAAM,EAAC;;;;;"}