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.
- 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 +682 -0
- package/fesm2022/iss-ctrl-base.mjs.map +1 -0
- package/fesm2022/iss-ctrl-checkbox.field-CILXADas.mjs +88 -0
- package/fesm2022/iss-ctrl-checkbox.field-CILXADas.mjs.map +1 -0
- package/fesm2022/iss-ctrl-checkbox.mjs +146 -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-445Ds3V7.mjs +76 -0
- package/fesm2022/iss-ctrl-chips.field-445Ds3V7.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-Djhh1FsR.mjs +98 -0
- package/fesm2022/iss-ctrl-date-picker.field-Djhh1FsR.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-Dv636SAm.mjs +97 -0
- package/fesm2022/iss-ctrl-date-range-picker.field-Dv636SAm.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-DldY8vke.mjs +98 -0
- package/fesm2022/iss-ctrl-datetime-picker.field-DldY8vke.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-dropdownlist.field-DikBAtc_.mjs +87 -0
- package/fesm2022/iss-ctrl-dropdownlist.field-DikBAtc_.mjs.map +1 -0
- package/fesm2022/iss-ctrl-dropdownlist.mjs +398 -0
- package/fesm2022/iss-ctrl-dropdownlist.mjs.map +1 -0
- package/fesm2022/iss-ctrl-dropdownlist.viewer-OWJxDpr8.mjs +30 -0
- package/fesm2022/iss-ctrl-dropdownlist.viewer-OWJxDpr8.mjs.map +1 -0
- package/fesm2022/iss-ctrl-file-picker.field-BMZaJxvj.mjs +210 -0
- package/fesm2022/iss-ctrl-file-picker.field-BMZaJxvj.mjs.map +1 -0
- package/fesm2022/iss-ctrl-file-picker.mjs +274 -0
- package/fesm2022/iss-ctrl-file-picker.mjs.map +1 -0
- package/fesm2022/iss-ctrl-input.field-BiwBFYx3.mjs +104 -0
- package/fesm2022/iss-ctrl-input.field-BiwBFYx3.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-BG-QWWdq.mjs +1770 -0
- package/fesm2022/iss-ctrl-iss-ctrl-BG-QWWdq.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-load-event-bOt6IlIo.mjs → iss-ctrl-load-event-T4L3k9XO.mjs} +4 -3
- package/fesm2022/iss-ctrl-load-event-T4L3k9XO.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-load-options-event-CxyAyNMe.mjs → iss-ctrl-load-options-event-tG258cbP.mjs} +3 -3
- package/fesm2022/{iss-ctrl-load-options-event-CxyAyNMe.mjs.map → iss-ctrl-load-options-event-tG258cbP.mjs.map} +1 -1
- package/fesm2022/{iss-ctrl-load-value-event-DJKJ5S3h.mjs → iss-ctrl-load-value-event--7zt90Dl.mjs} +3 -3
- package/fesm2022/{iss-ctrl-load-value-event-DJKJ5S3h.mjs.map → iss-ctrl-load-value-event--7zt90Dl.mjs.map} +1 -1
- package/fesm2022/iss-ctrl-mobile.field-DLccnWKX.mjs +77 -0
- package/fesm2022/iss-ctrl-mobile.field-DLccnWKX.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-CT1wVmfF.mjs} +2 -2
- package/fesm2022/{iss-ctrl-note.field-B_Lbp28X.mjs.map → iss-ctrl-note.field-CT1wVmfF.mjs.map} +1 -1
- package/fesm2022/iss-ctrl-plate.field-CQQY8rnE.mjs +92 -0
- package/fesm2022/iss-ctrl-plate.field-CQQY8rnE.mjs.map +1 -0
- package/fesm2022/iss-ctrl-plate.mjs +493 -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-Dp5D-AXQ.mjs +88 -0
- package/fesm2022/iss-ctrl-radio.field-Dp5D-AXQ.mjs.map +1 -0
- package/fesm2022/iss-ctrl-radio.mjs +104 -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-COUv4Kin.mjs} +2 -2
- package/fesm2022/{iss-ctrl-replace-api-keys-C0XYQW4i.mjs.map → iss-ctrl-replace-api-keys-COUv4Kin.mjs.map} +1 -1
- package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs → iss-ctrl-set-value-event-D0-_qIyS.mjs} +2 -2
- package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs.map → iss-ctrl-set-value-event-D0-_qIyS.mjs.map} +1 -1
- package/fesm2022/iss-ctrl-slide-toggle.field-vCJHOiSG.mjs +85 -0
- package/fesm2022/iss-ctrl-slide-toggle.field-vCJHOiSG.mjs.map +1 -0
- package/fesm2022/iss-ctrl-slide-toggle.mjs +66 -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-DdFjH-D8.mjs} +142 -140
- package/fesm2022/iss-ctrl-table.field-DdFjH-D8.mjs.map +1 -0
- package/fesm2022/iss-ctrl-textarea.field-Dqhhu2m4.mjs +82 -0
- package/fesm2022/iss-ctrl-textarea.field-Dqhhu2m4.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-CdmxRiH8.mjs +77 -0
- package/fesm2022/iss-ctrl-time-picker.field-CdmxRiH8.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-rAT7dVFC.mjs +101 -0
- package/fesm2022/iss-ctrl-toggle-button.field-rAT7dVFC.mjs.map +1 -0
- package/fesm2022/iss-ctrl-toggle-button.mjs +158 -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-I92SNsv9.mjs} +2 -2
- package/fesm2022/{iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs.map → iss-ctrl-trigger-based-on-json-value-I92SNsv9.mjs.map} +1 -1
- package/fesm2022/{iss-ctrl-user-picker.field-BH63sZ-X.mjs → iss-ctrl-user-picker.field-DpmYCfpD.mjs} +154 -153
- package/fesm2022/iss-ctrl-user-picker.field-DpmYCfpD.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 +318 -0
- package/types/iss-ctrl-checkbox.d.ts +46 -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-dropdownlist.d.ts +78 -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-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 +303 -2005
- 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,398 @@
|
|
|
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 { inject, 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, TranslatePipe } from 'iss-ctrl/base';
|
|
16
|
+
import { UI_LANGUAGE } from 'iss-ctrl/tokens';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* `<iss-ctrl-dropdownlist>` — dropdown selection, single or multiple, with a search box.
|
|
20
|
+
*
|
|
21
|
+
* Typing in the search box emits `(onQueryChange)`, so options can be loaded remotely; set
|
|
22
|
+
* `loading` while that request is in flight.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```html
|
|
26
|
+
* <iss-ctrl-dropdownlist
|
|
27
|
+
* formControlName="city"
|
|
28
|
+
* [options]="cities()"
|
|
29
|
+
* [multiple]="false"
|
|
30
|
+
* [loading]="loading()"
|
|
31
|
+
* (onQueryChange)="search($event)"
|
|
32
|
+
* >
|
|
33
|
+
* <label>City</label>
|
|
34
|
+
* </iss-ctrl-dropdownlist>
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* ### Own inputs
|
|
38
|
+
* | Property | Type | Default | Description |
|
|
39
|
+
* | --- | --- | --- | --- |
|
|
40
|
+
* | `options` | `Option[]` | **required** | The selectable choices. |
|
|
41
|
+
* | `height` | `string` | `"150px"` | Max height of the open panel. |
|
|
42
|
+
* | `loading` | `boolean` | `false` | Shows the loading state inside the panel. |
|
|
43
|
+
*
|
|
44
|
+
* ### Inherited from {@link ControlBase}
|
|
45
|
+
* `formControlName` · `readonly` · `className` · `(onChange)` · `placeholder` · `multiple`
|
|
46
|
+
*
|
|
47
|
+
* ### Outputs
|
|
48
|
+
* - `(onQueryChange)` — `string`, the current search text.
|
|
49
|
+
*
|
|
50
|
+
* Projects `<label>` into the floating label; omit it to render the control without one.
|
|
51
|
+
*/
|
|
52
|
+
class DropdownlistControl extends ControlBase {
|
|
53
|
+
UI_LANGUAGE = inject(UI_LANGUAGE);
|
|
54
|
+
selectedOptions = signal(new Map(), ...(ngDevMode ? [{ debugName: "selectedOptions" }] : /* istanbul ignore next */ []));
|
|
55
|
+
/**
|
|
56
|
+
* Selectable choices, each a `{ value, title }` pair. Required.
|
|
57
|
+
*/
|
|
58
|
+
options = input.required(...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
|
|
59
|
+
/**
|
|
60
|
+
* Maximum height of the open options panel, as a CSS length.
|
|
61
|
+
*/
|
|
62
|
+
height = input("150px", ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
|
|
63
|
+
query = toSignal(this.ctrl.valueChanges);
|
|
64
|
+
filteredOptions = computed(() => this.#filter(this.query()), ...(ngDevMode ? [{ debugName: "filteredOptions" }] : /* istanbul ignore next */ []));
|
|
65
|
+
/**
|
|
66
|
+
* Shows the loading state inside the panel while options are being fetched.
|
|
67
|
+
*/
|
|
68
|
+
loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
69
|
+
/**
|
|
70
|
+
* Emits the search text so the host can load matching options.
|
|
71
|
+
*/
|
|
72
|
+
onQueryChange = output();
|
|
73
|
+
optionTemplate = contentChild("optionTemplate", ...(ngDevMode ? [{ debugName: "optionTemplate" }] : /* istanbul ignore next */ []));
|
|
74
|
+
cardViewerTemplate = contentChild("cardViewerTemplate", ...(ngDevMode ? [{ debugName: "cardViewerTemplate" }] : /* istanbul ignore next */ []));
|
|
75
|
+
allSelected = signal(false, ...(ngDevMode ? [{ debugName: "allSelected" }] : /* istanbul ignore next */ []));
|
|
76
|
+
#queryEffectRef = effect(() => {
|
|
77
|
+
if (typeof this.query() === "string") {
|
|
78
|
+
this.onQueryChange.emit(this.query());
|
|
79
|
+
}
|
|
80
|
+
}, ...(ngDevMode ? [{ debugName: "#queryEffectRef" }] : /* istanbul ignore next */ []));
|
|
81
|
+
#disabledEffectRef = effect(() => {
|
|
82
|
+
if (this.disabled()) {
|
|
83
|
+
this.ctrl.disable();
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
this.ctrl.enable();
|
|
87
|
+
}
|
|
88
|
+
}, ...(ngDevMode ? [{ debugName: "#disabledEffectRef" }] : /* istanbul ignore next */ []));
|
|
89
|
+
displayFn = (options) => {
|
|
90
|
+
if (Array.isArray(options) && !this.multiple()) {
|
|
91
|
+
return this.titleOf(options[0]);
|
|
92
|
+
}
|
|
93
|
+
return "";
|
|
94
|
+
};
|
|
95
|
+
/** Resolves an option title to plain text for the active UI language. */
|
|
96
|
+
titleOf(option) {
|
|
97
|
+
const title = option?.title;
|
|
98
|
+
if (!title) {
|
|
99
|
+
return "";
|
|
100
|
+
}
|
|
101
|
+
return typeof title === "string" ? title : title[this.UI_LANGUAGE] ?? "";
|
|
102
|
+
}
|
|
103
|
+
/*todo: add pagination for async options*/
|
|
104
|
+
writeValue(value) {
|
|
105
|
+
this.#reset();
|
|
106
|
+
if (value === null || value === undefined) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const values = value.split(",").map(val => val.trim());
|
|
110
|
+
let selectedOptions = this.options().filter((option) => values.includes(option.value));
|
|
111
|
+
if (!this.multiple()) {
|
|
112
|
+
// single selection mode, only the first matching option is honoured
|
|
113
|
+
selectedOptions = selectedOptions.slice(0, 1);
|
|
114
|
+
}
|
|
115
|
+
const next = new Map();
|
|
116
|
+
for (let i = 0; i < selectedOptions.length; i++) {
|
|
117
|
+
const val = selectedOptions[i];
|
|
118
|
+
next.set(val.value, val);
|
|
119
|
+
}
|
|
120
|
+
this.selectedOptions.set(next);
|
|
121
|
+
this.ctrl.setValue(selectedOptions);
|
|
122
|
+
}
|
|
123
|
+
captureValue($event) {
|
|
124
|
+
if (this.readonly()) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if ($event?.option.value === "_SELECT_ALL_OPTIONS_") {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
this.#addToSelectedOptionsMap($event?.option.value);
|
|
131
|
+
this.#emit();
|
|
132
|
+
}
|
|
133
|
+
removeFromSelectedOptionsMap(option) {
|
|
134
|
+
if (this.readonly()) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
this.selectedOptions.update((selected) => {
|
|
138
|
+
const next = new Map(selected);
|
|
139
|
+
next.delete(option.value);
|
|
140
|
+
return next;
|
|
141
|
+
});
|
|
142
|
+
this.allSelected.set(false);
|
|
143
|
+
this.#emit();
|
|
144
|
+
}
|
|
145
|
+
clearSelection() {
|
|
146
|
+
if (this.readonly()) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
this.#reset();
|
|
150
|
+
this.allSelected.set(false);
|
|
151
|
+
this.#emit();
|
|
152
|
+
}
|
|
153
|
+
toggleAllSelection() {
|
|
154
|
+
if (this.readonly()) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (this.selectedOptions().size === this.options().length) {
|
|
158
|
+
this.#reset();
|
|
159
|
+
this.#emit();
|
|
160
|
+
this.allSelected.set(false);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const next = new Map();
|
|
164
|
+
for (let i = 0; i < this.options().length; i++) {
|
|
165
|
+
const option = this.options()[i];
|
|
166
|
+
next.set(option.value, option);
|
|
167
|
+
}
|
|
168
|
+
this.selectedOptions.set(next);
|
|
169
|
+
this.ctrl.setValue(this.#convertSelectedMapToArray());
|
|
170
|
+
this.allSelected.set(true);
|
|
171
|
+
this.#emit();
|
|
172
|
+
}
|
|
173
|
+
ngOnDestroy() {
|
|
174
|
+
this.#queryEffectRef.destroy();
|
|
175
|
+
this.#disabledEffectRef.destroy();
|
|
176
|
+
}
|
|
177
|
+
// the selection is the value here; `ctrl` doubles as the autocomplete's search box, so while
|
|
178
|
+
// the user is typing a query it holds that string rather than the chosen options.
|
|
179
|
+
isEmpty() {
|
|
180
|
+
return this.selectedOptions().size === 0;
|
|
181
|
+
}
|
|
182
|
+
#addToSelectedOptionsMap(option) {
|
|
183
|
+
if (option) {
|
|
184
|
+
const selectedOption = option;
|
|
185
|
+
this.selectedOptions.update((selected) => {
|
|
186
|
+
// single selection replaces the map instead of adding to it
|
|
187
|
+
const next = this.multiple() ? new Map(selected) : new Map();
|
|
188
|
+
next.set(selectedOption.value, selectedOption);
|
|
189
|
+
return next;
|
|
190
|
+
});
|
|
191
|
+
this.ctrl.setValue(this.#convertSelectedMapToArray());
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
#stringifySelectedOptions() {
|
|
195
|
+
const selectedOptionsArr = this.#convertSelectedMapToArray();
|
|
196
|
+
if (selectedOptionsArr) {
|
|
197
|
+
return selectedOptionsArr.map((o) => o.value).join();
|
|
198
|
+
}
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
#filter(queryString) {
|
|
202
|
+
if (queryString === null || queryString === undefined || typeof queryString !== "string") {
|
|
203
|
+
return this.options();
|
|
204
|
+
}
|
|
205
|
+
const query = queryString.toLowerCase();
|
|
206
|
+
return this.options().filter((option) => {
|
|
207
|
+
return (option.value.toLowerCase().includes(query) || this.titleOf(option).toLowerCase().includes(query));
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
#emit() {
|
|
211
|
+
this.propagateValue(this.#stringifySelectedOptions());
|
|
212
|
+
this.emitOnChangeEvent(this.#convertSelectedMapToArray());
|
|
213
|
+
}
|
|
214
|
+
#reset() {
|
|
215
|
+
this.selectedOptions.set(new Map());
|
|
216
|
+
this.ctrl.setValue(null);
|
|
217
|
+
}
|
|
218
|
+
#convertSelectedMapToArray() {
|
|
219
|
+
const selectedOptionsArr = Array.from(this.selectedOptions(), ([_, option]) => option);
|
|
220
|
+
return selectedOptionsArr.length ? selectedOptionsArr : null;
|
|
221
|
+
}
|
|
222
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DropdownlistControl, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
223
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DropdownlistControl, isStandalone: true, selector: "iss-ctrl-dropdownlist", 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: [
|
|
224
|
+
{ provide: NG_VALUE_ACCESSOR, useExisting: DropdownlistControl, multi: true },
|
|
225
|
+
], 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: `
|
|
226
|
+
<mat-form-field floatLabel="auto" class="">
|
|
227
|
+
<!-- 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. -->
|
|
228
|
+
<mat-label class="fs-16 fc-dark-gray">
|
|
229
|
+
<ng-content select="label"></ng-content>
|
|
230
|
+
</mat-label>
|
|
231
|
+
<input
|
|
232
|
+
[formControl]="ctrl"
|
|
233
|
+
[matAutocomplete]="auto"
|
|
234
|
+
[matChipInputFor]="chipGrid"
|
|
235
|
+
[placeholder]="placeholder()"
|
|
236
|
+
[readonly]="readonly()"
|
|
237
|
+
[errorStateMatcher]="errorStateMatcher"
|
|
238
|
+
(blur)="markAsTouched()"
|
|
239
|
+
class="m-0"
|
|
240
|
+
matInput
|
|
241
|
+
/>
|
|
242
|
+
@if (!disabled()) {
|
|
243
|
+
@if (selectedOptions().size) {
|
|
244
|
+
<span matSuffix class="sfi sfi-close fs-18 fc-black cursor-pointer" (click)="clearSelection()"></span>
|
|
245
|
+
} @else {
|
|
246
|
+
<span matSuffix class="sfi sfi-arrow-down fs-18 fc-black cursor-pointer"></span>
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
<mat-autocomplete #auto="matAutocomplete" (optionSelected)="captureValue($event)" [displayWith]="displayFn" autoActiveFirstOption hideSingleSelectionIndicator>
|
|
251
|
+
@if (loading()) {
|
|
252
|
+
<mat-option disabled="true">
|
|
253
|
+
<ds-icon icon="spinner" class="spin fc-coral fs-20"></ds-icon>
|
|
254
|
+
</mat-option>
|
|
255
|
+
} @else {
|
|
256
|
+
@if (filteredOptions().length) {
|
|
257
|
+
@if (multiple()) {
|
|
258
|
+
<mat-option (click)="toggleAllSelection()" value="_SELECT_ALL_OPTIONS_">
|
|
259
|
+
{{ allSelected() ? "deselect all" : "Select All" }}
|
|
260
|
+
</mat-option>
|
|
261
|
+
}
|
|
262
|
+
<cdk-virtual-scroll-viewport itemSize="5" [ngStyle]="{'height': height()}">
|
|
263
|
+
<mat-option *cdkVirtualFor="let option of filteredOptions()" [value]="option" [ngClass]="{'mdc-list-item__selected': option | selectStatus: selectedOptions()}">
|
|
264
|
+
@if (optionTemplate()) {
|
|
265
|
+
<ng-container *ngTemplateOutlet="optionTemplate(); context: { $implicit: option}"/>
|
|
266
|
+
} @else {
|
|
267
|
+
{{ option?.title | translate }}
|
|
268
|
+
}
|
|
269
|
+
</mat-option>
|
|
270
|
+
</cdk-virtual-scroll-viewport>
|
|
271
|
+
} @else {
|
|
272
|
+
<mat-option disabled="true">No Result Found</mat-option>
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
</mat-autocomplete>
|
|
276
|
+
</mat-form-field>
|
|
277
|
+
|
|
278
|
+
<mat-chip-grid #chipGrid>
|
|
279
|
+
@if (multiple()) {
|
|
280
|
+
@for (chip of selectedOptions(); track chip[0]) {
|
|
281
|
+
<mat-chip-row (removed)="removeFromSelectedOptionsMap(chip[1])">
|
|
282
|
+
@if (cardViewerTemplate()) {
|
|
283
|
+
<ng-container
|
|
284
|
+
*ngTemplateOutlet="cardViewerTemplate(); context: { $implicit: chip[1]}"
|
|
285
|
+
/>
|
|
286
|
+
} @else {
|
|
287
|
+
{{ chip[1]?.title | translate }}
|
|
288
|
+
}
|
|
289
|
+
<button matChipRemove [disabled]="readonly()" [attr.aria-label]="'remove ' + titleOf(chip[1])">
|
|
290
|
+
<ds-icon icon="trash" class="fc-red"></ds-icon>
|
|
291
|
+
</button>
|
|
292
|
+
</mat-chip-row>
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
</mat-chip-grid>
|
|
296
|
+
`, 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" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
297
|
+
}
|
|
298
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DropdownlistControl, decorators: [{
|
|
299
|
+
type: Component,
|
|
300
|
+
args: [{ selector: "iss-ctrl-dropdownlist", imports: [
|
|
301
|
+
ReactiveFormsModule,
|
|
302
|
+
MatAutocompleteModule,
|
|
303
|
+
MatInputModule,
|
|
304
|
+
MatChipsModule,
|
|
305
|
+
MatIconModule,
|
|
306
|
+
NgClass,
|
|
307
|
+
SelectStatusPipe,
|
|
308
|
+
TranslatePipe,
|
|
309
|
+
CdkVirtualForOf,
|
|
310
|
+
CdkVirtualScrollViewport,
|
|
311
|
+
CdkFixedSizeVirtualScroll,
|
|
312
|
+
NgStyle,
|
|
313
|
+
NgTemplateOutlet,
|
|
314
|
+
], providers: [
|
|
315
|
+
{ provide: NG_VALUE_ACCESSOR, useExisting: DropdownlistControl, multi: true },
|
|
316
|
+
], template: `
|
|
317
|
+
<mat-form-field floatLabel="auto" class="">
|
|
318
|
+
<!-- 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. -->
|
|
319
|
+
<mat-label class="fs-16 fc-dark-gray">
|
|
320
|
+
<ng-content select="label"></ng-content>
|
|
321
|
+
</mat-label>
|
|
322
|
+
<input
|
|
323
|
+
[formControl]="ctrl"
|
|
324
|
+
[matAutocomplete]="auto"
|
|
325
|
+
[matChipInputFor]="chipGrid"
|
|
326
|
+
[placeholder]="placeholder()"
|
|
327
|
+
[readonly]="readonly()"
|
|
328
|
+
[errorStateMatcher]="errorStateMatcher"
|
|
329
|
+
(blur)="markAsTouched()"
|
|
330
|
+
class="m-0"
|
|
331
|
+
matInput
|
|
332
|
+
/>
|
|
333
|
+
@if (!disabled()) {
|
|
334
|
+
@if (selectedOptions().size) {
|
|
335
|
+
<span matSuffix class="sfi sfi-close fs-18 fc-black cursor-pointer" (click)="clearSelection()"></span>
|
|
336
|
+
} @else {
|
|
337
|
+
<span matSuffix class="sfi sfi-arrow-down fs-18 fc-black cursor-pointer"></span>
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
<mat-autocomplete #auto="matAutocomplete" (optionSelected)="captureValue($event)" [displayWith]="displayFn" autoActiveFirstOption hideSingleSelectionIndicator>
|
|
342
|
+
@if (loading()) {
|
|
343
|
+
<mat-option disabled="true">
|
|
344
|
+
<ds-icon icon="spinner" class="spin fc-coral fs-20"></ds-icon>
|
|
345
|
+
</mat-option>
|
|
346
|
+
} @else {
|
|
347
|
+
@if (filteredOptions().length) {
|
|
348
|
+
@if (multiple()) {
|
|
349
|
+
<mat-option (click)="toggleAllSelection()" value="_SELECT_ALL_OPTIONS_">
|
|
350
|
+
{{ allSelected() ? "deselect all" : "Select All" }}
|
|
351
|
+
</mat-option>
|
|
352
|
+
}
|
|
353
|
+
<cdk-virtual-scroll-viewport itemSize="5" [ngStyle]="{'height': height()}">
|
|
354
|
+
<mat-option *cdkVirtualFor="let option of filteredOptions()" [value]="option" [ngClass]="{'mdc-list-item__selected': option | selectStatus: selectedOptions()}">
|
|
355
|
+
@if (optionTemplate()) {
|
|
356
|
+
<ng-container *ngTemplateOutlet="optionTemplate(); context: { $implicit: option}"/>
|
|
357
|
+
} @else {
|
|
358
|
+
{{ option?.title | translate }}
|
|
359
|
+
}
|
|
360
|
+
</mat-option>
|
|
361
|
+
</cdk-virtual-scroll-viewport>
|
|
362
|
+
} @else {
|
|
363
|
+
<mat-option disabled="true">No Result Found</mat-option>
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
</mat-autocomplete>
|
|
367
|
+
</mat-form-field>
|
|
368
|
+
|
|
369
|
+
<mat-chip-grid #chipGrid>
|
|
370
|
+
@if (multiple()) {
|
|
371
|
+
@for (chip of selectedOptions(); track chip[0]) {
|
|
372
|
+
<mat-chip-row (removed)="removeFromSelectedOptionsMap(chip[1])">
|
|
373
|
+
@if (cardViewerTemplate()) {
|
|
374
|
+
<ng-container
|
|
375
|
+
*ngTemplateOutlet="cardViewerTemplate(); context: { $implicit: chip[1]}"
|
|
376
|
+
/>
|
|
377
|
+
} @else {
|
|
378
|
+
{{ chip[1]?.title | translate }}
|
|
379
|
+
}
|
|
380
|
+
<button matChipRemove [disabled]="readonly()" [attr.aria-label]="'remove ' + titleOf(chip[1])">
|
|
381
|
+
<ds-icon icon="trash" class="fc-red"></ds-icon>
|
|
382
|
+
</button>
|
|
383
|
+
</mat-chip-row>
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
</mat-chip-grid>
|
|
387
|
+
`, schemas: [CUSTOM_ELEMENTS_SCHEMA] }]
|
|
388
|
+
}], 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 }] }] } });
|
|
389
|
+
|
|
390
|
+
// The dropdownlist control. Its field and viewer stay in the primary entry point and reach it
|
|
391
|
+
// from there, so the control ships only to an app that renders it or imports it directly.
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Generated bundle index. Do not edit.
|
|
395
|
+
*/
|
|
396
|
+
|
|
397
|
+
export { DropdownlistControl };
|
|
398
|
+
//# sourceMappingURL=iss-ctrl-dropdownlist.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iss-ctrl-dropdownlist.mjs","sources":["../../../projects/iss/dropdownlist/src/dropdownlist.control.ts","../../../projects/iss/dropdownlist/src/public-api.ts","../../../projects/iss/dropdownlist/src/iss-ctrl-dropdownlist.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, inject, 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 { ControlBase, I18n, Option, SelectStatusPipe, TranslatePipe } from \"iss-ctrl/base\";\nimport { UI_LANGUAGE } from \"iss-ctrl/tokens\";\n\n/**\n * `<iss-ctrl-dropdownlist>` — 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-dropdownlist\n * formControlName=\"city\"\n * [options]=\"cities()\"\n * [multiple]=\"false\"\n * [loading]=\"loading()\"\n * (onQueryChange)=\"search($event)\"\n * >\n * <label>City</label>\n * </iss-ctrl-dropdownlist>\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-dropdownlist\",\n imports: [\n ReactiveFormsModule,\n MatAutocompleteModule,\n MatInputModule,\n MatChipsModule,\n MatIconModule,\n NgClass,\n SelectStatusPipe,\n TranslatePipe,\n CdkVirtualForOf,\n CdkVirtualScrollViewport,\n CdkFixedSizeVirtualScroll,\n NgStyle,\n NgTemplateOutlet,\n ],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: DropdownlistControl, 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?.title | translate }}\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]?.title | translate }}\n }\n <button matChipRemove [disabled]=\"readonly()\" [attr.aria-label]=\"'remove ' + titleOf(chip[1])\">\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 DropdownlistControl extends ControlBase implements OnDestroy {\n UI_LANGUAGE = inject(UI_LANGUAGE);\n selectedOptions: WritableSignal<Map<string, Option>> = signal(new Map<string, Option>());\n /**\n * Selectable choices, each a `{ value, title }` 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 this.titleOf(options[0]);\n }\n return \"\";\n };\n\n /** Resolves an option title to plain text for the active UI language. */\n titleOf(option: Option | undefined): string {\n const title = option?.title;\n if (!title) {\n return \"\";\n }\n return typeof title === \"string\" ? title : title[this.UI_LANGUAGE as keyof I18n] ?? \"\";\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) || this.titleOf(option).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 dropdownlist 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 \"./dropdownlist.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 DropdownlistViewer extends ViewerBase {
|
|
6
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DropdownlistViewer, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
7
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DropdownlistViewer, isStandalone: true, selector: "iss-viewer-dropdownlist", 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: DropdownlistViewer, decorators: [{
|
|
16
|
+
type: Component,
|
|
17
|
+
args: [{
|
|
18
|
+
selector: "iss-viewer-dropdownlist",
|
|
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 { DropdownlistViewer };
|
|
30
|
+
//# sourceMappingURL=iss-ctrl-dropdownlist.viewer-OWJxDpr8.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iss-ctrl-dropdownlist.viewer-OWJxDpr8.mjs","sources":["../../../projects/iss/src/components/controls/dropdownlist/dropdownlist.viewer.ts"],"sourcesContent":["import { Component } from \"@angular/core\";\nimport { ViewerBase } from \"iss-ctrl/base\";\n\n@Component({\n selector: \"iss-viewer-dropdownlist\",\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 DropdownlistViewer 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,yBAAA,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,yBAAyB;AACnC,oBAAA,QAAQ,EAAE;;;;;;AAMT,EAAA,CAAA;AACF,iBAAA;;;;;"}
|