iss-ctrl 0.0.21 → 0.0.22
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.
- package/README.md +33 -0
- package/fesm2022/iss-ctrl-attachment.viewer-DVUL39xd.mjs +110 -0
- package/fesm2022/iss-ctrl-attachment.viewer-DVUL39xd.mjs.map +1 -0
- package/fesm2022/iss-ctrl-base.mjs +663 -0
- package/fesm2022/iss-ctrl-base.mjs.map +1 -0
- package/fesm2022/iss-ctrl-checkbox.field-Dj5EGLUr.mjs +92 -0
- package/fesm2022/iss-ctrl-checkbox.field-Dj5EGLUr.mjs.map +1 -0
- package/fesm2022/iss-ctrl-checkbox.mjs +143 -0
- package/fesm2022/iss-ctrl-checkbox.mjs.map +1 -0
- package/fesm2022/iss-ctrl-checkbox.viewer-C3SEUszR.mjs +31 -0
- package/fesm2022/iss-ctrl-checkbox.viewer-C3SEUszR.mjs.map +1 -0
- package/fesm2022/iss-ctrl-chips.field-BLLAjBbP.mjs +76 -0
- package/fesm2022/iss-ctrl-chips.field-BLLAjBbP.mjs.map +1 -0
- package/fesm2022/iss-ctrl-chips.mjs +168 -0
- package/fesm2022/iss-ctrl-chips.mjs.map +1 -0
- package/fesm2022/iss-ctrl-chips.viewer-BcKT2hcq.mjs +38 -0
- package/fesm2022/iss-ctrl-chips.viewer-BcKT2hcq.mjs.map +1 -0
- package/fesm2022/iss-ctrl-date-picker.field-BSpXukpO.mjs +98 -0
- package/fesm2022/iss-ctrl-date-picker.field-BSpXukpO.mjs.map +1 -0
- package/fesm2022/iss-ctrl-date-picker.mjs +200 -0
- package/fesm2022/iss-ctrl-date-picker.mjs.map +1 -0
- package/fesm2022/iss-ctrl-date-picker.viewer-Dsmsf91t.mjs +40 -0
- package/fesm2022/iss-ctrl-date-picker.viewer-Dsmsf91t.mjs.map +1 -0
- package/fesm2022/iss-ctrl-date-range-picker.field-CjNHU1RW.mjs +97 -0
- package/fesm2022/iss-ctrl-date-range-picker.field-CjNHU1RW.mjs.map +1 -0
- package/fesm2022/iss-ctrl-date-range-picker.mjs +307 -0
- package/fesm2022/iss-ctrl-date-range-picker.mjs.map +1 -0
- package/fesm2022/iss-ctrl-date-range-picker.viewer-tmTQGPFh.mjs +41 -0
- package/fesm2022/iss-ctrl-date-range-picker.viewer-tmTQGPFh.mjs.map +1 -0
- package/fesm2022/iss-ctrl-datetime-picker.field-DGMY9PaU.mjs +98 -0
- package/fesm2022/iss-ctrl-datetime-picker.field-DGMY9PaU.mjs.map +1 -0
- package/fesm2022/iss-ctrl-datetime-picker.mjs +226 -0
- package/fesm2022/iss-ctrl-datetime-picker.mjs.map +1 -0
- package/fesm2022/iss-ctrl-datetime-picker.viewer-BeUyEBKo.mjs +42 -0
- package/fesm2022/iss-ctrl-datetime-picker.viewer-BeUyEBKo.mjs.map +1 -0
- package/fesm2022/iss-ctrl-file-picker.field-CbepZaX6.mjs +210 -0
- package/fesm2022/iss-ctrl-file-picker.field-CbepZaX6.mjs.map +1 -0
- package/fesm2022/iss-ctrl-file-picker.mjs +272 -0
- package/fesm2022/iss-ctrl-file-picker.mjs.map +1 -0
- package/fesm2022/iss-ctrl-input.field-Ctlf3OCN.mjs +104 -0
- package/fesm2022/iss-ctrl-input.field-Ctlf3OCN.mjs.map +1 -0
- package/fesm2022/iss-ctrl-input.mjs +204 -0
- package/fesm2022/iss-ctrl-input.mjs.map +1 -0
- package/fesm2022/iss-ctrl-input.viewer-BOZnW0_e.mjs +22 -0
- package/fesm2022/iss-ctrl-input.viewer-BOZnW0_e.mjs.map +1 -0
- package/fesm2022/iss-ctrl-iss-ctrl-DvnkwSMG.mjs +1789 -0
- package/fesm2022/iss-ctrl-iss-ctrl-DvnkwSMG.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-load-event-bOt6IlIo.mjs → iss-ctrl-load-event-CuZ7pMjk.mjs} +4 -3
- package/fesm2022/iss-ctrl-load-event-CuZ7pMjk.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-load-options-event-CxyAyNMe.mjs → iss-ctrl-load-options-event-B10rhdqh.mjs} +3 -3
- package/fesm2022/{iss-ctrl-load-options-event-CxyAyNMe.mjs.map → iss-ctrl-load-options-event-B10rhdqh.mjs.map} +1 -1
- package/fesm2022/{iss-ctrl-load-value-event-DJKJ5S3h.mjs → iss-ctrl-load-value-event-C-aRgKLx.mjs} +3 -3
- package/fesm2022/{iss-ctrl-load-value-event-DJKJ5S3h.mjs.map → iss-ctrl-load-value-event-C-aRgKLx.mjs.map} +1 -1
- package/fesm2022/iss-ctrl-mobile.field-DXVYT3q-.mjs +77 -0
- package/fesm2022/iss-ctrl-mobile.field-DXVYT3q-.mjs.map +1 -0
- package/fesm2022/iss-ctrl-mobile.mjs +2465 -0
- package/fesm2022/iss-ctrl-mobile.mjs.map +1 -0
- package/fesm2022/iss-ctrl-mobile.viewer-DQgxAcR-.mjs +22 -0
- package/fesm2022/iss-ctrl-mobile.viewer-DQgxAcR-.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-note.field-B_Lbp28X.mjs → iss-ctrl-note.field-C8X9-mgD.mjs} +2 -2
- package/fesm2022/{iss-ctrl-note.field-B_Lbp28X.mjs.map → iss-ctrl-note.field-C8X9-mgD.mjs.map} +1 -1
- package/fesm2022/iss-ctrl-plate.field-aI81tAOV.mjs +92 -0
- package/fesm2022/iss-ctrl-plate.field-aI81tAOV.mjs.map +1 -0
- package/fesm2022/iss-ctrl-plate.mjs +491 -0
- package/fesm2022/iss-ctrl-plate.mjs.map +1 -0
- package/fesm2022/iss-ctrl-plate.viewer-B8PUBLH8.mjs +179 -0
- package/fesm2022/iss-ctrl-plate.viewer-B8PUBLH8.mjs.map +1 -0
- package/fesm2022/iss-ctrl-radio.field-B_JjPIlb.mjs +96 -0
- package/fesm2022/iss-ctrl-radio.field-B_JjPIlb.mjs.map +1 -0
- package/fesm2022/iss-ctrl-radio.mjs +101 -0
- package/fesm2022/iss-ctrl-radio.mjs.map +1 -0
- package/fesm2022/iss-ctrl-radio.viewer-EiDliZro.mjs +30 -0
- package/fesm2022/iss-ctrl-radio.viewer-EiDliZro.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-replace-api-keys-C0XYQW4i.mjs → iss-ctrl-replace-api-keys-DLnagkOr.mjs} +2 -2
- package/fesm2022/{iss-ctrl-replace-api-keys-C0XYQW4i.mjs.map → iss-ctrl-replace-api-keys-DLnagkOr.mjs.map} +1 -1
- package/fesm2022/iss-ctrl-select.field-DoU4G_8t.mjs +87 -0
- package/fesm2022/iss-ctrl-select.field-DoU4G_8t.mjs.map +1 -0
- package/fesm2022/iss-ctrl-select.mjs +387 -0
- package/fesm2022/iss-ctrl-select.mjs.map +1 -0
- package/fesm2022/iss-ctrl-select.viewer-Dv9M-lG-.mjs +30 -0
- package/fesm2022/iss-ctrl-select.viewer-Dv9M-lG-.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs → iss-ctrl-set-value-event-Dhw0Vj5J.mjs} +2 -2
- package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs.map → iss-ctrl-set-value-event-Dhw0Vj5J.mjs.map} +1 -1
- package/fesm2022/iss-ctrl-slide-toggle.field-TVVbAr6p.mjs +85 -0
- package/fesm2022/iss-ctrl-slide-toggle.field-TVVbAr6p.mjs.map +1 -0
- package/fesm2022/iss-ctrl-slide-toggle.mjs +72 -0
- package/fesm2022/iss-ctrl-slide-toggle.mjs.map +1 -0
- package/fesm2022/iss-ctrl-slide-toggle.viewer-hsIHwDj3.mjs +34 -0
- package/fesm2022/iss-ctrl-slide-toggle.viewer-hsIHwDj3.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-table.field-B5FxF6hn.mjs → iss-ctrl-table.field-E0r9w0os.mjs} +142 -140
- package/fesm2022/iss-ctrl-table.field-E0r9w0os.mjs.map +1 -0
- package/fesm2022/iss-ctrl-textarea.field-CmHPDpk-.mjs +82 -0
- package/fesm2022/iss-ctrl-textarea.field-CmHPDpk-.mjs.map +1 -0
- package/fesm2022/iss-ctrl-textarea.mjs +115 -0
- package/fesm2022/iss-ctrl-textarea.mjs.map +1 -0
- package/fesm2022/iss-ctrl-textarea.viewer-CpmLauik.mjs +22 -0
- package/fesm2022/iss-ctrl-textarea.viewer-CpmLauik.mjs.map +1 -0
- package/fesm2022/iss-ctrl-time-picker.field-Cb0I5Ut1.mjs +77 -0
- package/fesm2022/iss-ctrl-time-picker.field-Cb0I5Ut1.mjs.map +1 -0
- package/fesm2022/iss-ctrl-time-picker.mjs +170 -0
- package/fesm2022/iss-ctrl-time-picker.mjs.map +1 -0
- package/fesm2022/iss-ctrl-time-picker.viewer-CJeFLrdI.mjs +22 -0
- package/fesm2022/iss-ctrl-time-picker.viewer-CJeFLrdI.mjs.map +1 -0
- package/fesm2022/iss-ctrl-toggle-button.field-Bj8WrkB-.mjs +105 -0
- package/fesm2022/iss-ctrl-toggle-button.field-Bj8WrkB-.mjs.map +1 -0
- package/fesm2022/iss-ctrl-toggle-button.mjs +156 -0
- package/fesm2022/iss-ctrl-toggle-button.mjs.map +1 -0
- package/fesm2022/iss-ctrl-toggle-button.viewer-CC-8_Dy4.mjs +30 -0
- package/fesm2022/iss-ctrl-toggle-button.viewer-CC-8_Dy4.mjs.map +1 -0
- package/fesm2022/iss-ctrl-tokens.mjs +25 -0
- package/fesm2022/iss-ctrl-tokens.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs → iss-ctrl-trigger-based-on-json-value-D9rTXVD1.mjs} +2 -2
- package/fesm2022/{iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs.map → iss-ctrl-trigger-based-on-json-value-D9rTXVD1.mjs.map} +1 -1
- package/fesm2022/{iss-ctrl-user-picker.field-BH63sZ-X.mjs → iss-ctrl-user-picker.field-BIzB5ZX6.mjs} +151 -150
- package/fesm2022/iss-ctrl-user-picker.field-BIzB5ZX6.mjs.map +1 -0
- package/fesm2022/iss-ctrl.mjs +3 -1
- package/fesm2022/iss-ctrl.mjs.map +1 -1
- package/package.json +69 -1
- package/types/iss-ctrl-base.d.ts +306 -0
- package/types/iss-ctrl-checkbox.d.ts +45 -0
- package/types/iss-ctrl-chips.d.ts +41 -0
- package/types/iss-ctrl-date-picker.d.ts +75 -0
- package/types/iss-ctrl-date-range-picker.d.ts +95 -0
- package/types/iss-ctrl-datetime-picker.d.ts +77 -0
- package/types/iss-ctrl-file-picker.d.ts +95 -0
- package/types/iss-ctrl-input.d.ts +76 -0
- package/types/iss-ctrl-mobile.d.ts +91 -0
- package/types/iss-ctrl-plate.d.ts +54 -0
- package/types/iss-ctrl-radio.d.ts +34 -0
- package/types/iss-ctrl-select.d.ts +75 -0
- package/types/iss-ctrl-slide-toggle.d.ts +26 -0
- package/types/iss-ctrl-textarea.d.ts +30 -0
- package/types/iss-ctrl-time-picker.d.ts +48 -0
- package/types/iss-ctrl-toggle-button.d.ts +41 -0
- package/types/iss-ctrl-tokens.d.ts +21 -0
- package/types/iss-ctrl.d.ts +120 -1810
- package/fesm2022/iss-ctrl-iss-ctrl-BKu6a5HF.mjs +0 -9683
- package/fesm2022/iss-ctrl-iss-ctrl-BKu6a5HF.mjs.map +0 -1
- package/fesm2022/iss-ctrl-load-event-bOt6IlIo.mjs.map +0 -1
- package/fesm2022/iss-ctrl-table.field-B5FxF6hn.mjs.map +0 -1
- package/fesm2022/iss-ctrl-user-picker.field-BH63sZ-X.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iss-ctrl-select.field-DoU4G_8t.mjs","sources":["../../../projects/iss/src/components/controls/select/select.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 { SelectControl } from \"iss-ctrl/select\";\nimport { SelectViewer } from \"./select.viewer\";\n\n/**\n * `<iss-field-select>` — single or multiple selection from a dropdown.\n *\n * Rendered by the outlet for fields of type `dropdown_list`. In `edit` mode it renders\n * {@link SelectControl} plus the validation message; in `view` mode the matching viewer.\n *\n * ### Supported `config` keys\n * | Key | Type | Description |\n * | --- | --- | --- |\n * | `multiple` | `boolean` | Allows selecting more than one option. |\n * | `readonly` | `boolean` | Shows the value but blocks interaction. |\n *\n * ### Other field members used\n * `label()` · `options()` · `ctrlJsonValue()`\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 * The raw form value holds the selected option values; the resolved options are written\n * back to `field.ctrlJsonValue`.\n *\n * @example\n * ```json\n * { \"name\": \"city\", \"type\": \"dropdown_list\", \"label\": \"City\", \"options\": [{ \"value\": \"1\", \"label\": \"Riyadh\" }] }\n * ```\n */\n@Component({\n selector: \"iss-field-select\",\n viewProviders: [VIEW_PROVIDER],\n imports: [\n ReactiveFormsModule,\n SelectControl,\n ValidationMessage,\n SelectViewer,\n FieldViewer\n ],\n template: `\n @if (field.visible()) {\n @if (field.mode() === \"edit\") {\n <iss-ctrl-select [formControlName]=\"field.name\" [options]=\"field.options()\" [multiple]=\"field.config.multiple()\" [readonly]=\"field.config.readonly() ?? false\" (onChange)=\"onChange($event)\">\n <label>{{ field.label() }}</label>\n </iss-ctrl-select>\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-select [field]=\"field\"/>\n </iss-field-viewer>\n }\n }\n `\n})\nexport class SelectField extends FieldBase {\n onChange($event: string | FormData) {\n this.field.ctrlJsonValue.set($event);\n }\n}\n"],"names":[],"mappings":";;;;;;;;AASA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;AA2BG,MAAO,WAAY,SAAQ,SAAS,CAAA;AACxC,IAAA,QAAQ,CAAC,MAAyB,EAAA;QAChC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;IACtC;uGAHW,WAAW,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhBZ;;;;;;;;;;;;;;AAcT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EApBC,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,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,iBAAiB,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,YAAY,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,WAAW,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,aAAA,EANE,CAAC,aAAa,CAAC,EAAA,CAAA;;2FAwBnB,WAAW,EAAA,UAAA,EAAA,CAAA;kBA1BvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;oBAC5B,aAAa,EAAE,CAAC,aAAa,CAAC;AAC9B,oBAAA,OAAO,EAAE;wBACP,mBAAmB;wBACnB,aAAa;wBACb,iBAAiB;wBACjB,YAAY;wBACZ;AACD,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;AAcT,EAAA;AACF,iBAAA;;;;;"}
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { CdkVirtualForOf, CdkVirtualScrollViewport, CdkFixedSizeVirtualScroll } from '@angular/cdk/scrolling';
|
|
2
|
+
import { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { signal, input, computed, output, contentChild, effect, CUSTOM_ELEMENTS_SCHEMA, Component } from '@angular/core';
|
|
5
|
+
import { toSignal } from '@angular/core/rxjs-interop';
|
|
6
|
+
import * as i1 from '@angular/forms';
|
|
7
|
+
import { ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
8
|
+
import * as i2 from '@angular/material/autocomplete';
|
|
9
|
+
import { MatAutocompleteModule } from '@angular/material/autocomplete';
|
|
10
|
+
import * as i4 from '@angular/material/chips';
|
|
11
|
+
import { MatChipsModule } from '@angular/material/chips';
|
|
12
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
13
|
+
import * as i3 from '@angular/material/input';
|
|
14
|
+
import { MatInputModule } from '@angular/material/input';
|
|
15
|
+
import { ControlBase, SelectStatusPipe } from 'iss-ctrl/base';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* `<iss-ctrl-select>` — dropdown selection, single or multiple, with a search box.
|
|
19
|
+
*
|
|
20
|
+
* Typing in the search box emits `(onQueryChange)`, so options can be loaded remotely; set
|
|
21
|
+
* `loading` while that request is in flight.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```html
|
|
25
|
+
* <iss-ctrl-select
|
|
26
|
+
* formControlName="city"
|
|
27
|
+
* [options]="cities()"
|
|
28
|
+
* [multiple]="false"
|
|
29
|
+
* [loading]="loading()"
|
|
30
|
+
* (onQueryChange)="search($event)"
|
|
31
|
+
* >
|
|
32
|
+
* <label>City</label>
|
|
33
|
+
* </iss-ctrl-select>
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* ### Own inputs
|
|
37
|
+
* | Property | Type | Default | Description |
|
|
38
|
+
* | --- | --- | --- | --- |
|
|
39
|
+
* | `options` | `Option[]` | **required** | The selectable choices. |
|
|
40
|
+
* | `height` | `string` | `"150px"` | Max height of the open panel. |
|
|
41
|
+
* | `loading` | `boolean` | `false` | Shows the loading state inside the panel. |
|
|
42
|
+
*
|
|
43
|
+
* ### Inherited from {@link ControlBase}
|
|
44
|
+
* `formControlName` · `readonly` · `className` · `(onChange)` · `placeholder` · `multiple`
|
|
45
|
+
*
|
|
46
|
+
* ### Outputs
|
|
47
|
+
* - `(onQueryChange)` — `string`, the current search text.
|
|
48
|
+
*
|
|
49
|
+
* Projects `<label>` into the floating label; omit it to render the control without one.
|
|
50
|
+
*/
|
|
51
|
+
class SelectControl extends ControlBase {
|
|
52
|
+
selectedOptions = signal(new Map(), ...(ngDevMode ? [{ debugName: "selectedOptions" }] : /* istanbul ignore next */ []));
|
|
53
|
+
/**
|
|
54
|
+
* Selectable choices, each a `{ value, label }` pair. Required.
|
|
55
|
+
*/
|
|
56
|
+
options = input.required(...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
|
|
57
|
+
/**
|
|
58
|
+
* Maximum height of the open options panel, as a CSS length.
|
|
59
|
+
*/
|
|
60
|
+
height = input("150px", ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
|
|
61
|
+
query = toSignal(this.ctrl.valueChanges);
|
|
62
|
+
filteredOptions = computed(() => this.#filter(this.query()), ...(ngDevMode ? [{ debugName: "filteredOptions" }] : /* istanbul ignore next */ []));
|
|
63
|
+
/**
|
|
64
|
+
* Shows the loading state inside the panel while options are being fetched.
|
|
65
|
+
*/
|
|
66
|
+
loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
67
|
+
/**
|
|
68
|
+
* Emits the search text so the host can load matching options.
|
|
69
|
+
*/
|
|
70
|
+
onQueryChange = output();
|
|
71
|
+
optionTemplate = contentChild("optionTemplate", ...(ngDevMode ? [{ debugName: "optionTemplate" }] : /* istanbul ignore next */ []));
|
|
72
|
+
cardViewerTemplate = contentChild("cardViewerTemplate", ...(ngDevMode ? [{ debugName: "cardViewerTemplate" }] : /* istanbul ignore next */ []));
|
|
73
|
+
allSelected = signal(false, ...(ngDevMode ? [{ debugName: "allSelected" }] : /* istanbul ignore next */ []));
|
|
74
|
+
#queryEffectRef = effect(() => {
|
|
75
|
+
if (typeof this.query() === "string") {
|
|
76
|
+
this.onQueryChange.emit(this.query());
|
|
77
|
+
}
|
|
78
|
+
}, ...(ngDevMode ? [{ debugName: "#queryEffectRef" }] : /* istanbul ignore next */ []));
|
|
79
|
+
#disabledEffectRef = effect(() => {
|
|
80
|
+
if (this.disabled()) {
|
|
81
|
+
this.ctrl.disable();
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
this.ctrl.enable();
|
|
85
|
+
}
|
|
86
|
+
}, ...(ngDevMode ? [{ debugName: "#disabledEffectRef" }] : /* istanbul ignore next */ []));
|
|
87
|
+
displayFn = (options) => {
|
|
88
|
+
if (Array.isArray(options) && !this.multiple()) {
|
|
89
|
+
return options[0]?.label;
|
|
90
|
+
}
|
|
91
|
+
return "";
|
|
92
|
+
};
|
|
93
|
+
/*todo: add pagination for async options*/
|
|
94
|
+
writeValue(value) {
|
|
95
|
+
this.#reset();
|
|
96
|
+
if (value === null || value === undefined) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const values = value.split(",").map(val => val.trim());
|
|
100
|
+
let selectedOptions = this.options().filter((option) => values.includes(option.value));
|
|
101
|
+
if (!this.multiple()) {
|
|
102
|
+
// single selection mode, only the first matching option is honoured
|
|
103
|
+
selectedOptions = selectedOptions.slice(0, 1);
|
|
104
|
+
}
|
|
105
|
+
const next = new Map();
|
|
106
|
+
for (let i = 0; i < selectedOptions.length; i++) {
|
|
107
|
+
const val = selectedOptions[i];
|
|
108
|
+
next.set(val.value, val);
|
|
109
|
+
}
|
|
110
|
+
this.selectedOptions.set(next);
|
|
111
|
+
this.ctrl.setValue(selectedOptions);
|
|
112
|
+
}
|
|
113
|
+
captureValue($event) {
|
|
114
|
+
if (this.readonly()) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if ($event?.option.value === "_SELECT_ALL_OPTIONS_") {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
this.#addToSelectedOptionsMap($event?.option.value);
|
|
121
|
+
this.#emit();
|
|
122
|
+
}
|
|
123
|
+
removeFromSelectedOptionsMap(option) {
|
|
124
|
+
if (this.readonly()) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
this.selectedOptions.update((selected) => {
|
|
128
|
+
const next = new Map(selected);
|
|
129
|
+
next.delete(option.value);
|
|
130
|
+
return next;
|
|
131
|
+
});
|
|
132
|
+
this.allSelected.set(false);
|
|
133
|
+
this.#emit();
|
|
134
|
+
}
|
|
135
|
+
clearSelection() {
|
|
136
|
+
if (this.readonly()) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
this.#reset();
|
|
140
|
+
this.allSelected.set(false);
|
|
141
|
+
this.#emit();
|
|
142
|
+
}
|
|
143
|
+
toggleAllSelection() {
|
|
144
|
+
if (this.readonly()) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (this.selectedOptions().size === this.options().length) {
|
|
148
|
+
this.#reset();
|
|
149
|
+
this.#emit();
|
|
150
|
+
this.allSelected.set(false);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const next = new Map();
|
|
154
|
+
for (let i = 0; i < this.options().length; i++) {
|
|
155
|
+
const option = this.options()[i];
|
|
156
|
+
next.set(option.value, option);
|
|
157
|
+
}
|
|
158
|
+
this.selectedOptions.set(next);
|
|
159
|
+
this.ctrl.setValue(this.#convertSelectedMapToArray());
|
|
160
|
+
this.allSelected.set(true);
|
|
161
|
+
this.#emit();
|
|
162
|
+
}
|
|
163
|
+
ngOnDestroy() {
|
|
164
|
+
this.#queryEffectRef.destroy();
|
|
165
|
+
this.#disabledEffectRef.destroy();
|
|
166
|
+
}
|
|
167
|
+
// the selection is the value here; `ctrl` doubles as the autocomplete's search box, so while
|
|
168
|
+
// the user is typing a query it holds that string rather than the chosen options.
|
|
169
|
+
isEmpty() {
|
|
170
|
+
return this.selectedOptions().size === 0;
|
|
171
|
+
}
|
|
172
|
+
#addToSelectedOptionsMap(option) {
|
|
173
|
+
if (option) {
|
|
174
|
+
const selectedOption = option;
|
|
175
|
+
this.selectedOptions.update((selected) => {
|
|
176
|
+
// single selection replaces the map instead of adding to it
|
|
177
|
+
const next = this.multiple() ? new Map(selected) : new Map();
|
|
178
|
+
next.set(selectedOption.value, selectedOption);
|
|
179
|
+
return next;
|
|
180
|
+
});
|
|
181
|
+
this.ctrl.setValue(this.#convertSelectedMapToArray());
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
#stringifySelectedOptions() {
|
|
185
|
+
const selectedOptionsArr = this.#convertSelectedMapToArray();
|
|
186
|
+
if (selectedOptionsArr) {
|
|
187
|
+
return selectedOptionsArr.map((o) => o.value).join();
|
|
188
|
+
}
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
#filter(queryString) {
|
|
192
|
+
if (queryString === null || queryString === undefined || typeof queryString !== "string") {
|
|
193
|
+
return this.options();
|
|
194
|
+
}
|
|
195
|
+
const query = queryString.toLowerCase();
|
|
196
|
+
return this.options().filter((option) => {
|
|
197
|
+
return (option.value.toLowerCase().includes(query) || option.label.toLowerCase().includes(query));
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
#emit() {
|
|
201
|
+
this.propagateValue(this.#stringifySelectedOptions());
|
|
202
|
+
this.emitOnChangeEvent(this.#convertSelectedMapToArray());
|
|
203
|
+
}
|
|
204
|
+
#reset() {
|
|
205
|
+
this.selectedOptions.set(new Map());
|
|
206
|
+
this.ctrl.setValue(null);
|
|
207
|
+
}
|
|
208
|
+
#convertSelectedMapToArray() {
|
|
209
|
+
const selectedOptionsArr = Array.from(this.selectedOptions(), ([_, option]) => option);
|
|
210
|
+
return selectedOptionsArr.length ? selectedOptionsArr : null;
|
|
211
|
+
}
|
|
212
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SelectControl, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
213
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SelectControl, isStandalone: true, selector: "iss-ctrl-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onQueryChange: "onQueryChange" }, providers: [
|
|
214
|
+
{ provide: NG_VALUE_ACCESSOR, useExisting: SelectControl, multi: true },
|
|
215
|
+
], queries: [{ propertyName: "optionTemplate", first: true, predicate: ["optionTemplate"], descendants: true, isSignal: true }, { propertyName: "cardViewerTemplate", first: true, predicate: ["cardViewerTemplate"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
|
|
216
|
+
<mat-form-field floatLabel="auto" class="">
|
|
217
|
+
<!-- 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. -->
|
|
218
|
+
<mat-label class="fs-16 fc-dark-gray">
|
|
219
|
+
<ng-content select="label"></ng-content>
|
|
220
|
+
</mat-label>
|
|
221
|
+
<input
|
|
222
|
+
[formControl]="ctrl"
|
|
223
|
+
[matAutocomplete]="auto"
|
|
224
|
+
[matChipInputFor]="chipGrid"
|
|
225
|
+
[placeholder]="placeholder()"
|
|
226
|
+
[readonly]="readonly()"
|
|
227
|
+
[errorStateMatcher]="errorStateMatcher"
|
|
228
|
+
(blur)="markAsTouched()"
|
|
229
|
+
class="m-0"
|
|
230
|
+
matInput
|
|
231
|
+
/>
|
|
232
|
+
@if (!disabled()) {
|
|
233
|
+
@if (selectedOptions().size) {
|
|
234
|
+
<span matSuffix class="sfi sfi-close fs-18 fc-black cursor-pointer" (click)="clearSelection()"></span>
|
|
235
|
+
} @else {
|
|
236
|
+
<span matSuffix class="sfi sfi-arrow-down fs-18 fc-black cursor-pointer"></span>
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
<mat-autocomplete #auto="matAutocomplete" (optionSelected)="captureValue($event)" [displayWith]="displayFn" autoActiveFirstOption hideSingleSelectionIndicator>
|
|
241
|
+
@if (loading()) {
|
|
242
|
+
<mat-option disabled="true">
|
|
243
|
+
<ds-icon icon="spinner" class="spin fc-coral fs-20"></ds-icon>
|
|
244
|
+
</mat-option>
|
|
245
|
+
} @else {
|
|
246
|
+
@if (filteredOptions().length) {
|
|
247
|
+
@if (multiple()) {
|
|
248
|
+
<mat-option (click)="toggleAllSelection()" value="_SELECT_ALL_OPTIONS_">
|
|
249
|
+
{{ allSelected() ? "deselect all" : "Select All" }}
|
|
250
|
+
</mat-option>
|
|
251
|
+
}
|
|
252
|
+
<cdk-virtual-scroll-viewport itemSize="5" [ngStyle]="{'height': height()}">
|
|
253
|
+
<mat-option *cdkVirtualFor="let option of filteredOptions()" [value]="option" [ngClass]="{'mdc-list-item__selected': option | selectStatus: selectedOptions()}">
|
|
254
|
+
@if (optionTemplate()) {
|
|
255
|
+
<ng-container *ngTemplateOutlet="optionTemplate(); context: { $implicit: option}"/>
|
|
256
|
+
} @else {
|
|
257
|
+
{{ option.label }}
|
|
258
|
+
}
|
|
259
|
+
</mat-option>
|
|
260
|
+
</cdk-virtual-scroll-viewport>
|
|
261
|
+
} @else {
|
|
262
|
+
<mat-option disabled="true">No Result Found</mat-option>
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
</mat-autocomplete>
|
|
266
|
+
</mat-form-field>
|
|
267
|
+
|
|
268
|
+
<mat-chip-grid #chipGrid>
|
|
269
|
+
@if (multiple()) {
|
|
270
|
+
@for (chip of selectedOptions(); track chip[0]) {
|
|
271
|
+
<mat-chip-row (removed)="removeFromSelectedOptionsMap(chip[1])">
|
|
272
|
+
@if (cardViewerTemplate()) {
|
|
273
|
+
<ng-container
|
|
274
|
+
*ngTemplateOutlet="cardViewerTemplate(); context: { $implicit: chip[1]}"
|
|
275
|
+
/>
|
|
276
|
+
} @else {
|
|
277
|
+
{{ chip[1].label }}
|
|
278
|
+
}
|
|
279
|
+
<button matChipRemove [disabled]="readonly()" [attr.aria-label]="'remove ' + chip[1].label">
|
|
280
|
+
<ds-icon icon="trash" class="fc-red"></ds-icon>
|
|
281
|
+
</button>
|
|
282
|
+
</mat-chip-row>
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
</mat-chip-grid>
|
|
286
|
+
`, isInline: true, styles: [""], 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"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i2.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i2.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i4.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i4.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled", "readonly", "matChipInputDisabledInteractive"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i4.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i4.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: SelectStatusPipe, name: "selectStatus" }] });
|
|
287
|
+
}
|
|
288
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SelectControl, decorators: [{
|
|
289
|
+
type: Component,
|
|
290
|
+
args: [{ selector: "iss-ctrl-select", imports: [
|
|
291
|
+
ReactiveFormsModule,
|
|
292
|
+
MatAutocompleteModule,
|
|
293
|
+
MatInputModule,
|
|
294
|
+
MatChipsModule,
|
|
295
|
+
MatIconModule,
|
|
296
|
+
NgClass,
|
|
297
|
+
SelectStatusPipe,
|
|
298
|
+
CdkVirtualForOf,
|
|
299
|
+
CdkVirtualScrollViewport,
|
|
300
|
+
CdkFixedSizeVirtualScroll,
|
|
301
|
+
NgStyle,
|
|
302
|
+
NgTemplateOutlet,
|
|
303
|
+
], providers: [
|
|
304
|
+
{ provide: NG_VALUE_ACCESSOR, useExisting: SelectControl, multi: true },
|
|
305
|
+
], template: `
|
|
306
|
+
<mat-form-field floatLabel="auto" class="">
|
|
307
|
+
<!-- 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. -->
|
|
308
|
+
<mat-label class="fs-16 fc-dark-gray">
|
|
309
|
+
<ng-content select="label"></ng-content>
|
|
310
|
+
</mat-label>
|
|
311
|
+
<input
|
|
312
|
+
[formControl]="ctrl"
|
|
313
|
+
[matAutocomplete]="auto"
|
|
314
|
+
[matChipInputFor]="chipGrid"
|
|
315
|
+
[placeholder]="placeholder()"
|
|
316
|
+
[readonly]="readonly()"
|
|
317
|
+
[errorStateMatcher]="errorStateMatcher"
|
|
318
|
+
(blur)="markAsTouched()"
|
|
319
|
+
class="m-0"
|
|
320
|
+
matInput
|
|
321
|
+
/>
|
|
322
|
+
@if (!disabled()) {
|
|
323
|
+
@if (selectedOptions().size) {
|
|
324
|
+
<span matSuffix class="sfi sfi-close fs-18 fc-black cursor-pointer" (click)="clearSelection()"></span>
|
|
325
|
+
} @else {
|
|
326
|
+
<span matSuffix class="sfi sfi-arrow-down fs-18 fc-black cursor-pointer"></span>
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
<mat-autocomplete #auto="matAutocomplete" (optionSelected)="captureValue($event)" [displayWith]="displayFn" autoActiveFirstOption hideSingleSelectionIndicator>
|
|
331
|
+
@if (loading()) {
|
|
332
|
+
<mat-option disabled="true">
|
|
333
|
+
<ds-icon icon="spinner" class="spin fc-coral fs-20"></ds-icon>
|
|
334
|
+
</mat-option>
|
|
335
|
+
} @else {
|
|
336
|
+
@if (filteredOptions().length) {
|
|
337
|
+
@if (multiple()) {
|
|
338
|
+
<mat-option (click)="toggleAllSelection()" value="_SELECT_ALL_OPTIONS_">
|
|
339
|
+
{{ allSelected() ? "deselect all" : "Select All" }}
|
|
340
|
+
</mat-option>
|
|
341
|
+
}
|
|
342
|
+
<cdk-virtual-scroll-viewport itemSize="5" [ngStyle]="{'height': height()}">
|
|
343
|
+
<mat-option *cdkVirtualFor="let option of filteredOptions()" [value]="option" [ngClass]="{'mdc-list-item__selected': option | selectStatus: selectedOptions()}">
|
|
344
|
+
@if (optionTemplate()) {
|
|
345
|
+
<ng-container *ngTemplateOutlet="optionTemplate(); context: { $implicit: option}"/>
|
|
346
|
+
} @else {
|
|
347
|
+
{{ option.label }}
|
|
348
|
+
}
|
|
349
|
+
</mat-option>
|
|
350
|
+
</cdk-virtual-scroll-viewport>
|
|
351
|
+
} @else {
|
|
352
|
+
<mat-option disabled="true">No Result Found</mat-option>
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
</mat-autocomplete>
|
|
356
|
+
</mat-form-field>
|
|
357
|
+
|
|
358
|
+
<mat-chip-grid #chipGrid>
|
|
359
|
+
@if (multiple()) {
|
|
360
|
+
@for (chip of selectedOptions(); track chip[0]) {
|
|
361
|
+
<mat-chip-row (removed)="removeFromSelectedOptionsMap(chip[1])">
|
|
362
|
+
@if (cardViewerTemplate()) {
|
|
363
|
+
<ng-container
|
|
364
|
+
*ngTemplateOutlet="cardViewerTemplate(); context: { $implicit: chip[1]}"
|
|
365
|
+
/>
|
|
366
|
+
} @else {
|
|
367
|
+
{{ chip[1].label }}
|
|
368
|
+
}
|
|
369
|
+
<button matChipRemove [disabled]="readonly()" [attr.aria-label]="'remove ' + chip[1].label">
|
|
370
|
+
<ds-icon icon="trash" class="fc-red"></ds-icon>
|
|
371
|
+
</button>
|
|
372
|
+
</mat-chip-row>
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
</mat-chip-grid>
|
|
376
|
+
`, schemas: [CUSTOM_ELEMENTS_SCHEMA] }]
|
|
377
|
+
}], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], onQueryChange: [{ type: i0.Output, args: ["onQueryChange"] }], optionTemplate: [{ type: i0.ContentChild, args: ["optionTemplate", { isSignal: true }] }], cardViewerTemplate: [{ type: i0.ContentChild, args: ["cardViewerTemplate", { isSignal: true }] }] } });
|
|
378
|
+
|
|
379
|
+
// The select control. Its field and viewer stay in the primary entry point and reach it
|
|
380
|
+
// from there, so the control ships only to an app that renders it or imports it directly.
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Generated bundle index. Do not edit.
|
|
384
|
+
*/
|
|
385
|
+
|
|
386
|
+
export { SelectControl };
|
|
387
|
+
//# sourceMappingURL=iss-ctrl-select.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iss-ctrl-select.mjs","sources":["../../../projects/iss/select/src/select.control.ts","../../../projects/iss/select/src/public-api.ts","../../../projects/iss/select/src/iss-ctrl-select.ts"],"sourcesContent":["import { CdkFixedSizeVirtualScroll, CdkVirtualForOf, CdkVirtualScrollViewport } from \"@angular/cdk/scrolling\";\nimport { NgClass, NgStyle, NgTemplateOutlet } from \"@angular/common\";\nimport { Component, computed, contentChild, CUSTOM_ELEMENTS_SCHEMA, effect, input, InputSignal, OnDestroy, output, OutputEmitterRef, signal, Signal, WritableSignal } from \"@angular/core\";\nimport { toSignal } from \"@angular/core/rxjs-interop\";\nimport { NG_VALUE_ACCESSOR, ReactiveFormsModule } from \"@angular/forms\";\nimport { MatAutocompleteModule } from \"@angular/material/autocomplete\";\nimport { MatChipsModule } from \"@angular/material/chips\";\nimport { MatIconModule } from \"@angular/material/icon\";\nimport { MatInputModule } from \"@angular/material/input\";\nimport { Option } from \"iss-ctrl/base\";\nimport { SelectStatusPipe } from \"iss-ctrl/base\";\nimport { ControlBase } from \"iss-ctrl/base\";\n\n/**\n * `<iss-ctrl-select>` — dropdown selection, single or multiple, with a search box.\n *\n * Typing in the search box emits `(onQueryChange)`, so options can be loaded remotely; set\n * `loading` while that request is in flight.\n *\n * @example\n * ```html\n * <iss-ctrl-select\n * formControlName=\"city\"\n * [options]=\"cities()\"\n * [multiple]=\"false\"\n * [loading]=\"loading()\"\n * (onQueryChange)=\"search($event)\"\n * >\n * <label>City</label>\n * </iss-ctrl-select>\n * ```\n *\n * ### Own inputs\n * | Property | Type | Default | Description |\n * | --- | --- | --- | --- |\n * | `options` | `Option[]` | **required** | The selectable choices. |\n * | `height` | `string` | `\"150px\"` | Max height of the open panel. |\n * | `loading` | `boolean` | `false` | Shows the loading state inside the panel. |\n *\n * ### Inherited from {@link ControlBase}\n * `formControlName` · `readonly` · `className` · `(onChange)` · `placeholder` · `multiple`\n *\n * ### Outputs\n * - `(onQueryChange)` — `string`, the current search text.\n *\n * Projects `<label>` into the floating label; omit it to render the control without one.\n */\n@Component({\n selector: \"iss-ctrl-select\",\n imports: [\n ReactiveFormsModule,\n MatAutocompleteModule,\n MatInputModule,\n MatChipsModule,\n MatIconModule,\n NgClass,\n SelectStatusPipe,\n CdkVirtualForOf,\n CdkVirtualScrollViewport,\n CdkFixedSizeVirtualScroll,\n NgStyle,\n NgTemplateOutlet,\n ],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: SelectControl, 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 [formControl]=\"ctrl\"\n [matAutocomplete]=\"auto\"\n [matChipInputFor]=\"chipGrid\"\n [placeholder]=\"placeholder()\"\n [readonly]=\"readonly()\"\n [errorStateMatcher]=\"errorStateMatcher\"\n (blur)=\"markAsTouched()\"\n class=\"m-0\"\n matInput\n />\n @if (!disabled()) {\n @if (selectedOptions().size) {\n <span matSuffix class=\"sfi sfi-close fs-18 fc-black cursor-pointer\" (click)=\"clearSelection()\"></span>\n } @else {\n <span matSuffix class=\"sfi sfi-arrow-down fs-18 fc-black cursor-pointer\"></span>\n }\n }\n\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"captureValue($event)\" [displayWith]=\"displayFn\" autoActiveFirstOption hideSingleSelectionIndicator>\n @if (loading()) {\n <mat-option disabled=\"true\">\n <ds-icon icon=\"spinner\" class=\"spin fc-coral fs-20\"></ds-icon>\n </mat-option>\n } @else {\n @if (filteredOptions().length) {\n @if (multiple()) {\n <mat-option (click)=\"toggleAllSelection()\" value=\"_SELECT_ALL_OPTIONS_\">\n {{ allSelected() ? \"deselect all\" : \"Select All\" }}\n </mat-option>\n }\n <cdk-virtual-scroll-viewport itemSize=\"5\" [ngStyle]=\"{'height': height()}\">\n <mat-option *cdkVirtualFor=\"let option of filteredOptions()\" [value]=\"option\" [ngClass]=\"{'mdc-list-item__selected': option | selectStatus: selectedOptions()}\">\n @if (optionTemplate()) {\n <ng-container *ngTemplateOutlet=\"optionTemplate(); context: { $implicit: option}\"/>\n } @else {\n {{ option.label }}\n }\n </mat-option>\n </cdk-virtual-scroll-viewport>\n } @else {\n <mat-option disabled=\"true\">No Result Found</mat-option>\n }\n }\n </mat-autocomplete>\n </mat-form-field>\n\n <mat-chip-grid #chipGrid>\n @if (multiple()) {\n @for (chip of selectedOptions(); track chip[0]) {\n <mat-chip-row (removed)=\"removeFromSelectedOptionsMap(chip[1])\">\n @if (cardViewerTemplate()) {\n <ng-container\n *ngTemplateOutlet=\"cardViewerTemplate(); context: { $implicit: chip[1]}\"\n />\n } @else {\n {{ chip[1].label }}\n }\n <button matChipRemove [disabled]=\"readonly()\" [attr.aria-label]=\"'remove ' + chip[1].label\">\n <ds-icon icon=\"trash\" class=\"fc-red\"></ds-icon>\n </button>\n </mat-chip-row>\n }\n }\n </mat-chip-grid>\n `,\n styles: `\n ::ng-deep {\n .mat-mdc-option.mdc-list-item__selected:not(.mdc-list-item--disabled) .mdc-list-item__primary-text {\n --mat-option-selected-state-label-text-color: var(--green);\n color: var(--green);\n }\n }\n `,\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class SelectControl extends ControlBase implements OnDestroy {\n selectedOptions: WritableSignal<Map<string, Option>> = signal(new Map<string, Option>());\n /**\n * Selectable choices, each a `{ value, label }` pair. Required.\n */\n options: InputSignal<Option[]> = input.required();\n /**\n * Maximum height of the open options panel, as a CSS length.\n */\n height: InputSignal<string> = input(\"150px\");\n query: Signal<string> = toSignal(this.ctrl.valueChanges);\n readonly filteredOptions: Signal<Option[]> = computed(() => this.#filter(this.query()));\n /**\n * Shows the loading state inside the panel while options are being fetched.\n */\n loading: InputSignal<boolean> = input(false);\n /**\n * Emits the search text so the host can load matching options.\n */\n onQueryChange: OutputEmitterRef<string> = output();\n protected optionTemplate: any = contentChild(\"optionTemplate\");\n protected cardViewerTemplate: any = contentChild(\"cardViewerTemplate\");\n protected allSelected: WritableSignal<boolean> = signal(false);\n #queryEffectRef = effect(() => {\n if (typeof this.query() === \"string\") {\n this.onQueryChange.emit(this.query());\n }\n });\n #disabledEffectRef = effect(() => {\n if (this.disabled()) {\n this.ctrl.disable();\n } else {\n this.ctrl.enable();\n }\n });\n\n displayFn = (options: Option | Option[]): string => {\n if (Array.isArray(options) && !this.multiple()) {\n return options[0]?.label;\n }\n return \"\";\n };\n\n /*todo: add pagination for async options*/\n\n override writeValue(value: string | null) {\n this.#reset();\n if (value === null || value === undefined) {\n return;\n }\n const values: string[] = value.split(\",\").map(val => val.trim());\n let 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 selectedOptions = selectedOptions.slice(0, 1);\n }\n const next: Map<string, Option> = new Map<string, Option>();\n for (let i = 0; i < selectedOptions.length; i++) {\n const val: Option = selectedOptions[i];\n next.set(val.value, val);\n }\n this.selectedOptions.set(next);\n this.ctrl.setValue(selectedOptions);\n }\n\n captureValue($event: any) {\n if (this.readonly()) {\n return;\n }\n if ($event?.option.value === \"_SELECT_ALL_OPTIONS_\") {\n return;\n }\n this.#addToSelectedOptionsMap($event?.option.value);\n this.#emit();\n }\n\n removeFromSelectedOptionsMap(option: Option) {\n if (this.readonly()) {\n return;\n }\n this.selectedOptions.update((selected: Map<string, Option>) => {\n const next: Map<string, Option> = new Map(selected);\n next.delete(option.value);\n return next;\n });\n this.allSelected.set(false);\n this.#emit();\n }\n\n clearSelection() {\n if (this.readonly()) {\n return;\n }\n this.#reset();\n this.allSelected.set(false);\n this.#emit();\n }\n\n toggleAllSelection() {\n if (this.readonly()) {\n return;\n }\n if (this.selectedOptions().size === this.options().length) {\n this.#reset();\n this.#emit();\n this.allSelected.set(false);\n return;\n }\n const next: Map<string, Option> = new Map<string, Option>();\n for (let i = 0; i < this.options().length; i++) {\n const option: Option = this.options()[i];\n next.set(option.value, option);\n }\n this.selectedOptions.set(next);\n this.ctrl.setValue(this.#convertSelectedMapToArray());\n this.allSelected.set(true);\n this.#emit();\n }\n\n ngOnDestroy(): void {\n this.#queryEffectRef.destroy();\n this.#disabledEffectRef.destroy();\n }\n\n // the selection is the value here; `ctrl` doubles as the autocomplete's search box, so while\n // the user is typing a query it holds that string rather than the chosen options.\n protected override isEmpty(): boolean {\n return this.selectedOptions().size === 0;\n }\n\n #addToSelectedOptionsMap(option: any) {\n if (option) {\n const selectedOption = option;\n this.selectedOptions.update((selected: Map<string, Option>) => {\n // single selection replaces the map instead of adding to it\n const next: Map<string, Option> = this.multiple() ? new Map(selected) : new Map<string, Option>();\n next.set(selectedOption.value, selectedOption);\n return next;\n });\n this.ctrl.setValue(this.#convertSelectedMapToArray());\n }\n }\n\n #stringifySelectedOptions(): string | null {\n const selectedOptionsArr: Option[] | null = this.#convertSelectedMapToArray();\n if (selectedOptionsArr) {\n return selectedOptionsArr.map((o) => o.value).join();\n }\n return null;\n }\n\n #filter(queryString: string | Option): Option[] {\n if (queryString === null || queryString === undefined || typeof queryString !== \"string\") {\n return this.options();\n }\n const query: string = queryString.toLowerCase();\n return this.options().filter((option: Option) => {\n return (option.value.toLowerCase().includes(query) || option.label.toLowerCase().includes(query));\n });\n }\n\n #emit() {\n this.propagateValue(this.#stringifySelectedOptions());\n this.emitOnChangeEvent(this.#convertSelectedMapToArray());\n }\n\n #reset() {\n this.selectedOptions.set(new Map<string, Option>());\n this.ctrl.setValue(null);\n }\n\n #convertSelectedMapToArray(): Option[] | null {\n const selectedOptionsArr: Option[] = Array.from(this.selectedOptions(), ([_, option]) => option);\n return selectedOptionsArr.length ? selectedOptionsArr : null;\n }\n}\n","// The select 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 \"./select.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 SelectViewer extends ViewerBase {
|
|
6
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SelectViewer, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
7
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SelectViewer, isStandalone: true, selector: "iss-viewer-select", 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: SelectViewer, decorators: [{
|
|
16
|
+
type: Component,
|
|
17
|
+
args: [{
|
|
18
|
+
selector: "iss-viewer-select",
|
|
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 { SelectViewer };
|
|
30
|
+
//# sourceMappingURL=iss-ctrl-select.viewer-Dv9M-lG-.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iss-ctrl-select.viewer-Dv9M-lG-.mjs","sources":["../../../projects/iss/src/components/controls/select/select.viewer.ts"],"sourcesContent":["import { Component } from \"@angular/core\";\nimport { ViewerBase } from \"iss-ctrl/base\";\n\n@Component({\n selector: \"iss-viewer-select\",\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 SelectViewer extends ViewerBase {}\n"],"names":[],"mappings":";;;;AAaM,MAAO,YAAa,SAAQ,UAAU,CAAA;uGAA/B,YAAY,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EARb;;;;;;AAMT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEU,YAAY,EAAA,UAAA,EAAA,CAAA;kBAVxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,QAAQ,EAAE;;;;;;AAMT,EAAA,CAAA;AACF,iBAAA;;;;;"}
|
package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs → iss-ctrl-set-value-event-Dhw0Vj5J.mjs}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Injectable, inject } from '@angular/core';
|
|
3
3
|
import { of, map } from 'rxjs';
|
|
4
|
-
import { g as getPropertyByPath } from './iss-ctrl-iss-ctrl-
|
|
4
|
+
import { g as getPropertyByPath } from './iss-ctrl-iss-ctrl-DvnkwSMG.mjs';
|
|
5
5
|
|
|
6
6
|
class GetValueToSet {
|
|
7
7
|
execute(args) {
|
|
@@ -58,4 +58,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
58
58
|
}] });
|
|
59
59
|
|
|
60
60
|
export { SetValueEvent };
|
|
61
|
-
//# sourceMappingURL=iss-ctrl-set-value-event-
|
|
61
|
+
//# sourceMappingURL=iss-ctrl-set-value-event-Dhw0Vj5J.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iss-ctrl-set-value-event-
|
|
1
|
+
{"version":3,"file":"iss-ctrl-set-value-event-Dhw0Vj5J.mjs","sources":["../../../projects/iss/src/events/set-value/get-value-to-set.ts","../../../projects/iss/src/events/set-value/set-value-event.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\r\nimport { map, Observable, of } from \"rxjs\";\r\nimport { EventArgument, EventConfigFn } from \"../../shared/interfaces/event-strategy\";\r\nimport { getPropertyByPath } from \"../../shared/utilities/get-property-by-path.util\";\r\n\r\n@Injectable({providedIn: \"root\"})\r\nexport class GetValueToSet implements EventConfigFn {\r\n execute(args: EventArgument): Observable<string> {\r\n if (args.action?.config?.setValueFromJsonValue) {\r\n return of(getPropertyByPath(args.field.ctrlJsonValue(), args.action.config.setValueFromJsonValue));\r\n }\r\n\r\n if (args.action?.config?.setValueFromApiResponse) {\r\n return args.field.apiResponse.pipe(\r\n map((value: any) => getPropertyByPath(value, args.action.config.setValueFromApiResponse))\r\n );\r\n }\r\n\r\n if (args.action?.config?.setValueFromLoggedInUser) {\r\n\r\n }\r\n\r\n if (args.action?.config?.setValueFromRequestDto) {\r\n\r\n }\r\n\r\n return of(args.change.value);\r\n }\r\n}\r\n","import { inject, Injectable } from \"@angular/core\";\r\nimport { EventArgument, EventStrategy } from \"../../shared/interfaces/event-strategy\";\r\nimport { GetValueToSet } from \"./get-value-to-set\";\r\n\r\n@Injectable({providedIn: \"root\"})\r\nexport class SetValueEvent implements EventStrategy {\r\n getValueToSetService = inject(GetValueToSet);\r\n\r\n fire(args: EventArgument) {\r\n console.log(`${args.field.name} listens to ${args.action.trackedFieldName} =>` + \"%c Set Value Event Fired\", \"color: green\");\r\n let valueToSet;\r\n if (args.action.config.fn) {\r\n valueToSet = args.action.config.fn.execute(args);\r\n } else {\r\n valueToSet = this.getValueToSetService.execute(args);\r\n }\r\n\r\n valueToSet.subscribe((value: string) => {\r\n args.control.setValue(value, {emitEvent: false});\r\n });\r\n\r\n if (args.action.config.disableAfterSetValue) {\r\n args.control.disable();\r\n }\r\n args.action.triggered = true;\r\n }\r\n\r\n revert(args: EventArgument) {\r\n console.log(`${args.field.name} listens to ${args.action.trackedFieldName} =>` + \"%c Set Value Event Reverted\", \"color: red\");\r\n args.control.setValue(null);\r\n args.action.triggered = false;\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
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 { MatLabel } from '@angular/material/form-field';
|
|
6
|
+
import { F as FieldBase, V as VIEW_PROVIDER, a as ValidationMessage, b as FieldViewer } from './iss-ctrl-iss-ctrl-DvnkwSMG.mjs';
|
|
7
|
+
import { SlideToggleControl } from 'iss-ctrl/slide-toggle';
|
|
8
|
+
import { SlideToggleViewer } from './iss-ctrl-slide-toggle.viewer-hsIHwDj3.mjs';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* `<iss-field-slide-toggle>` — an on/off switch for a boolean value.
|
|
12
|
+
*
|
|
13
|
+
* Rendered by the outlet for fields of type `switch`. In `edit` mode it renders
|
|
14
|
+
* {@link SlideToggleControl} plus the validation message; in `view` mode the matching viewer.
|
|
15
|
+
*
|
|
16
|
+
* ### Supported `config` keys
|
|
17
|
+
* | Key | Type | Description |
|
|
18
|
+
* | --- | --- | --- |
|
|
19
|
+
* | `hideLabel` | `boolean` | Hides the field label. |
|
|
20
|
+
* | `readonly` | `boolean` | Shows the value but blocks interaction. |
|
|
21
|
+
*
|
|
22
|
+
* ### Other field members used
|
|
23
|
+
* `label()`
|
|
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": "active", "type": "switch", "label": "Active" }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
class SlideToggleField 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: SlideToggleField, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
38
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SlideToggleField, isStandalone: true, selector: "iss-field-slide-toggle", usesInheritance: true, ngImport: i0, template: `
|
|
39
|
+
@if (field.visible()) {
|
|
40
|
+
@if (field.mode() === "edit") {
|
|
41
|
+
@if (!field.config.hideLabel()) {
|
|
42
|
+
<mat-label>{{ field.label() }}</mat-label>
|
|
43
|
+
}
|
|
44
|
+
<iss-ctrl-slide-toggle [formControlName]="field.name" [readonly]="field.config.readonly() ?? false" (onChange)="onChange($event)"/>
|
|
45
|
+
<iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
|
|
46
|
+
} @else {
|
|
47
|
+
<iss-field-viewer>
|
|
48
|
+
@if (!field.config.hideLabel()) {
|
|
49
|
+
<label>{{ field.label() }}</label>
|
|
50
|
+
}
|
|
51
|
+
<iss-viewer-slide-toggle [field]="field"/>
|
|
52
|
+
</iss-field-viewer>
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
`, 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: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: SlideToggleControl, selector: "iss-ctrl-slide-toggle" }, { kind: "component", type: SlideToggleViewer, selector: "iss-viewer-slide-toggle" }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
|
|
56
|
+
}
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SlideToggleField, decorators: [{
|
|
58
|
+
type: Component,
|
|
59
|
+
args: [{
|
|
60
|
+
selector: "iss-field-slide-toggle",
|
|
61
|
+
viewProviders: [VIEW_PROVIDER],
|
|
62
|
+
imports: [ReactiveFormsModule, MatLabel, SlideToggleControl, SlideToggleViewer, ValidationMessage, FieldViewer],
|
|
63
|
+
template: `
|
|
64
|
+
@if (field.visible()) {
|
|
65
|
+
@if (field.mode() === "edit") {
|
|
66
|
+
@if (!field.config.hideLabel()) {
|
|
67
|
+
<mat-label>{{ field.label() }}</mat-label>
|
|
68
|
+
}
|
|
69
|
+
<iss-ctrl-slide-toggle [formControlName]="field.name" [readonly]="field.config.readonly() ?? false" (onChange)="onChange($event)"/>
|
|
70
|
+
<iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
|
|
71
|
+
} @else {
|
|
72
|
+
<iss-field-viewer>
|
|
73
|
+
@if (!field.config.hideLabel()) {
|
|
74
|
+
<label>{{ field.label() }}</label>
|
|
75
|
+
}
|
|
76
|
+
<iss-viewer-slide-toggle [field]="field"/>
|
|
77
|
+
</iss-field-viewer>
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
`
|
|
81
|
+
}]
|
|
82
|
+
}] });
|
|
83
|
+
|
|
84
|
+
export { SlideToggleField };
|
|
85
|
+
//# sourceMappingURL=iss-ctrl-slide-toggle.field-TVVbAr6p.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iss-ctrl-slide-toggle.field-TVVbAr6p.mjs","sources":["../../../projects/iss/src/components/controls/slide-toggle/slide-toggle.field.ts"],"sourcesContent":["import { Component } from \"@angular/core\";\nimport { ReactiveFormsModule } from \"@angular/forms\";\nimport { MatLabel } from \"@angular/material/form-field\";\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 { SlideToggleControl } from \"iss-ctrl/slide-toggle\";\nimport { SlideToggleViewer } from \"./slide-toggle.viewer\";\n\n/**\n * `<iss-field-slide-toggle>` — an on/off switch for a boolean value.\n *\n * Rendered by the outlet for fields of type `switch`. In `edit` mode it renders\n * {@link SlideToggleControl} plus the validation message; in `view` mode the matching viewer.\n *\n * ### Supported `config` keys\n * | Key | Type | Description |\n * | --- | --- | --- |\n * | `hideLabel` | `boolean` | Hides the field label. |\n * | `readonly` | `boolean` | Shows the value but blocks interaction. |\n *\n * ### Other field members used\n * `label()`\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\": \"active\", \"type\": \"switch\", \"label\": \"Active\" }\n * ```\n */\n@Component({\n selector: \"iss-field-slide-toggle\",\n viewProviders: [VIEW_PROVIDER],\n imports: [ReactiveFormsModule, MatLabel, SlideToggleControl, SlideToggleViewer, ValidationMessage, FieldViewer],\n template: `\n @if (field.visible()) {\n @if (field.mode() === \"edit\") {\n @if (!field.config.hideLabel()) {\n <mat-label>{{ field.label() }}</mat-label>\n }\n <iss-ctrl-slide-toggle [formControlName]=\"field.name\" [readonly]=\"field.config.readonly() ?? false\" (onChange)=\"onChange($event)\"/>\n <iss-validation-message-viewer [errors]=\"ctrl.errors\" [showMessage]=\"!ctrl.untouched\"/>\n } @else {\n <iss-field-viewer>\n @if (!field.config.hideLabel()) {\n <label>{{ field.label() }}</label>\n }\n <iss-viewer-slide-toggle [field]=\"field\"/>\n </iss-field-viewer>\n }\n }\n `\n})\nexport class SlideToggleField extends FieldBase {\n onChange($event: any) {\n this.field.ctrlJsonValue.set($event);\n }\n}\n"],"names":[],"mappings":";;;;;;;;;AAUA;;;;;;;;;;;;;;;;;;;;;;AAsBG;AAwBG,MAAO,gBAAiB,SAAQ,SAAS,CAAA;AAC7C,IAAA,QAAQ,CAAC,MAAW,EAAA;QAClB,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;IACtC;uGAHW,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,EAnBjB;;;;;;;;;;;;;;;;;AAiBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAlBS,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,EAAE,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,QAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,yBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,aAAA,EAD/F,CAAC,aAAa,CAAC,EAAA,CAAA;;2FAqBnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAvB5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;oBAClC,aAAa,EAAE,CAAC,aAAa,CAAC;AAC9B,oBAAA,OAAO,EAAE,CAAC,mBAAmB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,CAAC;AAC/G,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;AAiBT,EAAA;AACF,iBAAA;;;;;"}
|