@magmonium/one 0.4.30 → 0.4.31
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/assets/docs/en/app-release.md +0 -11
- package/assets/i18n/en.json +2 -0
- package/fesm2022/magmonium-one-attribute-value-CLBOZcme.mjs +255 -0
- package/fesm2022/magmonium-one-attribute-value-CLBOZcme.mjs.map +1 -0
- package/fesm2022/magmonium-one-base-checkbox-D7NYJdU3.mjs +77 -0
- package/fesm2022/magmonium-one-base-checkbox-D7NYJdU3.mjs.map +1 -0
- package/fesm2022/magmonium-one-base-dropdown-CEDsqaPz.mjs +604 -0
- package/fesm2022/magmonium-one-base-dropdown-CEDsqaPz.mjs.map +1 -0
- package/fesm2022/magmonium-one-base-input-BOaD-WIi.mjs +183 -0
- package/fesm2022/magmonium-one-base-input-BOaD-WIi.mjs.map +1 -0
- package/fesm2022/magmonium-one-base-text-D6p6_vsb.mjs +94 -0
- package/fesm2022/magmonium-one-base-text-D6p6_vsb.mjs.map +1 -0
- package/fesm2022/magmonium-one-button-rVNnp6G8.mjs +1281 -0
- package/fesm2022/magmonium-one-button-rVNnp6G8.mjs.map +1 -0
- package/fesm2022/magmonium-one-checkbox-rj4XHxb3.mjs +365 -0
- package/fesm2022/magmonium-one-checkbox-rj4XHxb3.mjs.map +1 -0
- package/fesm2022/magmonium-one-color-utl-CirPzUFk.mjs +449 -0
- package/fesm2022/magmonium-one-color-utl-CirPzUFk.mjs.map +1 -0
- package/fesm2022/magmonium-one-directives-DOBENX_K.mjs +1285 -0
- package/fesm2022/magmonium-one-directives-DOBENX_K.mjs.map +1 -0
- package/fesm2022/magmonium-one-file.service-Bo06pU3_.mjs +65 -0
- package/fesm2022/magmonium-one-file.service-Bo06pU3_.mjs.map +1 -0
- package/fesm2022/magmonium-one-group-Cue4x6tD.mjs +428 -0
- package/fesm2022/magmonium-one-group-Cue4x6tD.mjs.map +1 -0
- package/fesm2022/magmonium-one-header-DPVnaEOV.mjs +380 -0
- package/fesm2022/magmonium-one-header-DPVnaEOV.mjs.map +1 -0
- package/fesm2022/magmonium-one-icon-Dso-9RMN.mjs +833 -0
- package/fesm2022/magmonium-one-icon-Dso-9RMN.mjs.map +1 -0
- package/fesm2022/magmonium-one-image-editor-C7AtzEf6.mjs +438 -0
- package/fesm2022/magmonium-one-image-editor-C7AtzEf6.mjs.map +1 -0
- package/fesm2022/magmonium-one-image-frame-BTSaUSAi.mjs +116 -0
- package/fesm2022/magmonium-one-image-frame-BTSaUSAi.mjs.map +1 -0
- package/fesm2022/magmonium-one-input-DqHPorA1.mjs +39 -0
- package/fesm2022/magmonium-one-input-DqHPorA1.mjs.map +1 -0
- package/fesm2022/magmonium-one-label-B30Q4Vut.mjs +574 -0
- package/fesm2022/magmonium-one-label-B30Q4Vut.mjs.map +1 -0
- package/fesm2022/magmonium-one-m-ref-Dt0DCm8X.mjs +147 -0
- package/fesm2022/magmonium-one-m-ref-Dt0DCm8X.mjs.map +1 -0
- package/fesm2022/magmonium-one-menu-BBOnOK4M.mjs +887 -0
- package/fesm2022/magmonium-one-menu-BBOnOK4M.mjs.map +1 -0
- package/fesm2022/magmonium-one-multi-range-DCOwngql.mjs +458 -0
- package/fesm2022/magmonium-one-multi-range-DCOwngql.mjs.map +1 -0
- package/fesm2022/magmonium-one-options-asset-D8Gg1yNl.mjs +97 -0
- package/fesm2022/magmonium-one-options-asset-D8Gg1yNl.mjs.map +1 -0
- package/fesm2022/magmonium-one-otp-DLF7Pq94.mjs +261 -0
- package/fesm2022/magmonium-one-otp-DLF7Pq94.mjs.map +1 -0
- package/fesm2022/magmonium-one-password-BSOU4RI0.mjs +217 -0
- package/fesm2022/magmonium-one-password-BSOU4RI0.mjs.map +1 -0
- package/fesm2022/magmonium-one-radio-CYnWLXPZ.mjs +111 -0
- package/fesm2022/magmonium-one-radio-CYnWLXPZ.mjs.map +1 -0
- package/fesm2022/magmonium-one-range-CmmZAr57.mjs +216 -0
- package/fesm2022/magmonium-one-range-CmmZAr57.mjs.map +1 -0
- package/fesm2022/magmonium-one-rolldown-runtime-DpJrqANO.mjs +11 -0
- package/fesm2022/magmonium-one-selector-DDnBYNLr.mjs +1065 -0
- package/fesm2022/magmonium-one-selector-DDnBYNLr.mjs.map +1 -0
- package/fesm2022/magmonium-one-size-converter-B-UubQQ0.mjs +1057 -0
- package/fesm2022/magmonium-one-size-converter-B-UubQQ0.mjs.map +1 -0
- package/fesm2022/magmonium-one-text-FXb-RyBh.mjs +406 -0
- package/fesm2022/magmonium-one-text-FXb-RyBh.mjs.map +1 -0
- package/fesm2022/magmonium-one-text-output-D2XQWyL0.mjs +296 -0
- package/fesm2022/magmonium-one-text-output-D2XQWyL0.mjs.map +1 -0
- package/fesm2022/magmonium-one-theme-a7GlFbzE.mjs +1 -0
- package/fesm2022/magmonium-one-toggle-C0eTrtkt.mjs +231 -0
- package/fesm2022/magmonium-one-toggle-C0eTrtkt.mjs.map +1 -0
- package/fesm2022/magmonium-one.mjs +49231 -2
- package/fesm2022/magmonium-one.mjs.map +1 -1
- package/package.json +8 -8
- package/types/magmonium-one.d.ts +13801 -9516
- package/fesm2022/magmonium-one-image-editor-QPOy7XQt.mjs +0 -290
- package/fesm2022/magmonium-one-image-editor-QPOy7XQt.mjs.map +0 -1
- package/fesm2022/magmonium-one-magmonium-one-BTi-rHpF.mjs +0 -41583
- package/fesm2022/magmonium-one-magmonium-one-BTi-rHpF.mjs.map +0 -1
- package/fesm2022/magmonium-one-otp-BcNCgGpz.mjs +0 -201
- package/fesm2022/magmonium-one-otp-BcNCgGpz.mjs.map +0 -1
- package/fesm2022/magmonium-one-password-BDcSzmV_.mjs +0 -105
- package/fesm2022/magmonium-one-password-BDcSzmV_.mjs.map +0 -1
- package/fesm2022/magmonium-one-toggle-bLWTwEHE.mjs +0 -62
- package/fesm2022/magmonium-one-toggle-bLWTwEHE.mjs.map +0 -1
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
import { c as TranslatePipe, l as TranslateService } from "./magmonium-one-size-converter-B-UubQQ0.mjs";
|
|
2
|
+
import { t as SelectorDirective } from "./magmonium-one-selector-DDnBYNLr.mjs";
|
|
3
|
+
import { t as LabelComponent } from "./magmonium-one-label-B30Q4Vut.mjs";
|
|
4
|
+
import { t as ButtonComponent } from "./magmonium-one-button-rVNnp6G8.mjs";
|
|
5
|
+
import { t as TextOutputComponent } from "./magmonium-one-text-output-D2XQWyL0.mjs";
|
|
6
|
+
import { t as BaseInputComponent } from "./magmonium-one-base-input-BOaD-WIi.mjs";
|
|
7
|
+
import "./magmonium-one-directives-DOBENX_K.mjs";
|
|
8
|
+
import { t as TextInputComponent } from "./magmonium-one-text-FXb-RyBh.mjs";
|
|
9
|
+
import { t as assetOptions } from "./magmonium-one-options-asset-D8Gg1yNl.mjs";
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import { ChangeDetectionStrategy, Component, Directive, ElementRef, computed, effect, inject, input, inputBinding, linkedSignal, model, output, outputBinding, signal, viewChild } from "@angular/core";
|
|
12
|
+
var DropdownBoxComponent = class DropdownBoxComponent {
|
|
13
|
+
options = input([], ...ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []);
|
|
14
|
+
selected = input([], ...ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []);
|
|
15
|
+
multiple = input(false, ...ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []);
|
|
16
|
+
activeIndex = input(-1, ...ngDevMode ? [{ debugName: "activeIndex" }] : /* istanbul ignore next */ []);
|
|
17
|
+
action = output();
|
|
18
|
+
host = inject(ElementRef);
|
|
19
|
+
constructor() {
|
|
20
|
+
effect(() => {
|
|
21
|
+
const index = this.activeIndex();
|
|
22
|
+
if (index < 0) return;
|
|
23
|
+
this.host.nativeElement.querySelectorAll(".dropdown-box__option")[index]?.scrollIntoView?.({ block: "nearest" });
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
isSelected = (value) => this.selected().includes(value);
|
|
27
|
+
selectOption = (option) => {
|
|
28
|
+
if (option.disabled) return;
|
|
29
|
+
this.action.emit(option);
|
|
30
|
+
};
|
|
31
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
32
|
+
minVersion: "12.0.0",
|
|
33
|
+
version: "22.2.1",
|
|
34
|
+
ngImport: i0,
|
|
35
|
+
type: DropdownBoxComponent,
|
|
36
|
+
deps: [],
|
|
37
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
38
|
+
});
|
|
39
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
40
|
+
minVersion: "17.0.0",
|
|
41
|
+
version: "22.2.1",
|
|
42
|
+
type: DropdownBoxComponent,
|
|
43
|
+
isStandalone: true,
|
|
44
|
+
selector: "m-dropdown-box",
|
|
45
|
+
inputs: {
|
|
46
|
+
options: {
|
|
47
|
+
classPropertyName: "options",
|
|
48
|
+
publicName: "options",
|
|
49
|
+
isSignal: true,
|
|
50
|
+
isRequired: false,
|
|
51
|
+
transformFunction: null
|
|
52
|
+
},
|
|
53
|
+
selected: {
|
|
54
|
+
classPropertyName: "selected",
|
|
55
|
+
publicName: "selected",
|
|
56
|
+
isSignal: true,
|
|
57
|
+
isRequired: false,
|
|
58
|
+
transformFunction: null
|
|
59
|
+
},
|
|
60
|
+
multiple: {
|
|
61
|
+
classPropertyName: "multiple",
|
|
62
|
+
publicName: "multiple",
|
|
63
|
+
isSignal: true,
|
|
64
|
+
isRequired: false,
|
|
65
|
+
transformFunction: null
|
|
66
|
+
},
|
|
67
|
+
activeIndex: {
|
|
68
|
+
classPropertyName: "activeIndex",
|
|
69
|
+
publicName: "activeIndex",
|
|
70
|
+
isSignal: true,
|
|
71
|
+
isRequired: false,
|
|
72
|
+
transformFunction: null
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
outputs: { action: "action" },
|
|
76
|
+
ngImport: i0,
|
|
77
|
+
template: `
|
|
78
|
+
<ul class="dropdown-box" role="listbox">
|
|
79
|
+
@for (option of options(); track option.value; let i = $index) {
|
|
80
|
+
@let selectedState = isSelected(option.value);
|
|
81
|
+
<li
|
|
82
|
+
class="dropdown-box__option"
|
|
83
|
+
[class.dropdown-box__option--selected]="selectedState"
|
|
84
|
+
[class.dropdown-box__option--disabled]="option.disabled"
|
|
85
|
+
[class.dropdown-box__option--active]="i === activeIndex()"
|
|
86
|
+
role="option"
|
|
87
|
+
[attr.aria-selected]="selectedState"
|
|
88
|
+
[attr.data-value]="option.value"
|
|
89
|
+
(click)="selectOption(option)"
|
|
90
|
+
(keydown.enter)="selectOption(option)"
|
|
91
|
+
tabindex="0"
|
|
92
|
+
>
|
|
93
|
+
<!-- A group header is a row, never a choice: no box to tick. -->
|
|
94
|
+
@if (multiple() && !option.disabled) {
|
|
95
|
+
<input
|
|
96
|
+
type="checkbox"
|
|
97
|
+
class="dropdown-box__checkbox"
|
|
98
|
+
[checked]="selectedState"
|
|
99
|
+
tabindex="-1"
|
|
100
|
+
(click)="$event.preventDefault()"
|
|
101
|
+
/>
|
|
102
|
+
}
|
|
103
|
+
@if (option.noTranslate) {
|
|
104
|
+
{{ option.label }}
|
|
105
|
+
} @else {
|
|
106
|
+
{{ option.label | translate }}
|
|
107
|
+
}
|
|
108
|
+
</li>
|
|
109
|
+
} @empty {
|
|
110
|
+
<li class="dropdown-box__empty">
|
|
111
|
+
{{ 'no-results-found' | translate }}
|
|
112
|
+
</li>
|
|
113
|
+
}
|
|
114
|
+
</ul>
|
|
115
|
+
`,
|
|
116
|
+
isInline: true,
|
|
117
|
+
styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.dropdown-box{overflow-y:auto;max-height:15rem;margin:0;padding:.375rem;list-style:none;border:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));border-radius:var(--m-input-radius, .5rem);background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));box-shadow:0 .75rem 2rem color-mix(in srgb,var(--m-text) 12%,transparent);animation:dropdown-in .2s ease-out}.dropdown-box__checkbox{flex-shrink:0;width:14px;height:14px;margin-right:8px;pointer-events:none;accent-color:var(--m-mm);cursor:pointer}.dropdown-box__option{display:flex;align-items:center;padding:.625rem .75rem;border-radius:.375rem;cursor:pointer;font-size:.875rem;color:var(--m-text);transition:background .15s ease}.dropdown-box__option:hover,.dropdown-box__option--active{background:color-mix(in srgb,var(--m-focus) 8%,transparent)}.dropdown-box__option--selected{font-weight:600;color:var(--m-mm)}.dropdown-box__option--disabled{opacity:.4;pointer-events:none}.dropdown-box__empty{padding:.75rem;text-align:center;color:var(--m-text-tertiary);font-size:.875rem}@keyframes dropdown-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host(.open-upward) .dropdown-box{animation:dropdown-in-up .2s ease-out}@keyframes dropdown-in-up{0%{opacity:0;transform:scale(.95) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom) .dropdown-box{max-height:70vh;border:none;border-radius:0;background:transparent;box-shadow:none;animation:none}\n"],
|
|
118
|
+
dependencies: [{
|
|
119
|
+
kind: "pipe",
|
|
120
|
+
type: TranslatePipe,
|
|
121
|
+
name: "translate"
|
|
122
|
+
}],
|
|
123
|
+
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
127
|
+
minVersion: "12.0.0",
|
|
128
|
+
version: "22.2.1",
|
|
129
|
+
ngImport: i0,
|
|
130
|
+
type: DropdownBoxComponent,
|
|
131
|
+
decorators: [{
|
|
132
|
+
type: Component,
|
|
133
|
+
args: [{
|
|
134
|
+
selector: "m-dropdown-box",
|
|
135
|
+
imports: [TranslatePipe],
|
|
136
|
+
template: `
|
|
137
|
+
<ul class="dropdown-box" role="listbox">
|
|
138
|
+
@for (option of options(); track option.value; let i = $index) {
|
|
139
|
+
@let selectedState = isSelected(option.value);
|
|
140
|
+
<li
|
|
141
|
+
class="dropdown-box__option"
|
|
142
|
+
[class.dropdown-box__option--selected]="selectedState"
|
|
143
|
+
[class.dropdown-box__option--disabled]="option.disabled"
|
|
144
|
+
[class.dropdown-box__option--active]="i === activeIndex()"
|
|
145
|
+
role="option"
|
|
146
|
+
[attr.aria-selected]="selectedState"
|
|
147
|
+
[attr.data-value]="option.value"
|
|
148
|
+
(click)="selectOption(option)"
|
|
149
|
+
(keydown.enter)="selectOption(option)"
|
|
150
|
+
tabindex="0"
|
|
151
|
+
>
|
|
152
|
+
<!-- A group header is a row, never a choice: no box to tick. -->
|
|
153
|
+
@if (multiple() && !option.disabled) {
|
|
154
|
+
<input
|
|
155
|
+
type="checkbox"
|
|
156
|
+
class="dropdown-box__checkbox"
|
|
157
|
+
[checked]="selectedState"
|
|
158
|
+
tabindex="-1"
|
|
159
|
+
(click)="$event.preventDefault()"
|
|
160
|
+
/>
|
|
161
|
+
}
|
|
162
|
+
@if (option.noTranslate) {
|
|
163
|
+
{{ option.label }}
|
|
164
|
+
} @else {
|
|
165
|
+
{{ option.label | translate }}
|
|
166
|
+
}
|
|
167
|
+
</li>
|
|
168
|
+
} @empty {
|
|
169
|
+
<li class="dropdown-box__empty">
|
|
170
|
+
{{ 'no-results-found' | translate }}
|
|
171
|
+
</li>
|
|
172
|
+
}
|
|
173
|
+
</ul>
|
|
174
|
+
`,
|
|
175
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
176
|
+
styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.dropdown-box{overflow-y:auto;max-height:15rem;margin:0;padding:.375rem;list-style:none;border:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));border-radius:var(--m-input-radius, .5rem);background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));box-shadow:0 .75rem 2rem color-mix(in srgb,var(--m-text) 12%,transparent);animation:dropdown-in .2s ease-out}.dropdown-box__checkbox{flex-shrink:0;width:14px;height:14px;margin-right:8px;pointer-events:none;accent-color:var(--m-mm);cursor:pointer}.dropdown-box__option{display:flex;align-items:center;padding:.625rem .75rem;border-radius:.375rem;cursor:pointer;font-size:.875rem;color:var(--m-text);transition:background .15s ease}.dropdown-box__option:hover,.dropdown-box__option--active{background:color-mix(in srgb,var(--m-focus) 8%,transparent)}.dropdown-box__option--selected{font-weight:600;color:var(--m-mm)}.dropdown-box__option--disabled{opacity:.4;pointer-events:none}.dropdown-box__empty{padding:.75rem;text-align:center;color:var(--m-text-tertiary);font-size:.875rem}@keyframes dropdown-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host(.open-upward) .dropdown-box{animation:dropdown-in-up .2s ease-out}@keyframes dropdown-in-up{0%{opacity:0;transform:scale(.95) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom) .dropdown-box{max-height:70vh;border:none;border-radius:0;background:transparent;box-shadow:none;animation:none}\n"]
|
|
177
|
+
}]
|
|
178
|
+
}],
|
|
179
|
+
ctorParameters: () => [],
|
|
180
|
+
propDecorators: {
|
|
181
|
+
options: [{
|
|
182
|
+
type: i0.Input,
|
|
183
|
+
args: [{
|
|
184
|
+
isSignal: true,
|
|
185
|
+
alias: "options",
|
|
186
|
+
required: false
|
|
187
|
+
}]
|
|
188
|
+
}],
|
|
189
|
+
selected: [{
|
|
190
|
+
type: i0.Input,
|
|
191
|
+
args: [{
|
|
192
|
+
isSignal: true,
|
|
193
|
+
alias: "selected",
|
|
194
|
+
required: false
|
|
195
|
+
}]
|
|
196
|
+
}],
|
|
197
|
+
multiple: [{
|
|
198
|
+
type: i0.Input,
|
|
199
|
+
args: [{
|
|
200
|
+
isSignal: true,
|
|
201
|
+
alias: "multiple",
|
|
202
|
+
required: false
|
|
203
|
+
}]
|
|
204
|
+
}],
|
|
205
|
+
activeIndex: [{
|
|
206
|
+
type: i0.Input,
|
|
207
|
+
args: [{
|
|
208
|
+
isSignal: true,
|
|
209
|
+
alias: "activeIndex",
|
|
210
|
+
required: false
|
|
211
|
+
}]
|
|
212
|
+
}],
|
|
213
|
+
action: [{
|
|
214
|
+
type: i0.Output,
|
|
215
|
+
args: ["action"]
|
|
216
|
+
}]
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
const DROPDOWN_TEMPLATE = `
|
|
220
|
+
@if (config(); as dropdown) {
|
|
221
|
+
@if (dropdown.label) {
|
|
222
|
+
<m-label
|
|
223
|
+
[for]="dropdown.name ?? ''"
|
|
224
|
+
[placeholder]="dropdown.label"
|
|
225
|
+
[params]="dropdown.params"
|
|
226
|
+
[required]="required()"
|
|
227
|
+
[disabled]="disabled()"
|
|
228
|
+
/>
|
|
229
|
+
}
|
|
230
|
+
<div
|
|
231
|
+
class="trigger-wrap"
|
|
232
|
+
#wrapper
|
|
233
|
+
[mSelector]="selectorConfig()"
|
|
234
|
+
[disabled]="disabled() || readonly() || !!config()?.readonly"
|
|
235
|
+
(opened)="onOpened()"
|
|
236
|
+
(closed)="onClosed()"
|
|
237
|
+
(focusin)="isFocused.set(true)"
|
|
238
|
+
(focusout)="isFocused.set(false)"
|
|
239
|
+
>
|
|
240
|
+
<m-text-input
|
|
241
|
+
[config]="triggerInputConfig()"
|
|
242
|
+
[value]="displayValue()"
|
|
243
|
+
[disabled]="disabled()"
|
|
244
|
+
[invalid]="invalid()"
|
|
245
|
+
[hideErrors]="true"
|
|
246
|
+
[(touched)]="touched"
|
|
247
|
+
[focused]="focused()"
|
|
248
|
+
(valueChange)="onInput($event)"
|
|
249
|
+
(click)="preventToggleWhenOpen($event)"
|
|
250
|
+
(keydown.space)="$event.stopPropagation()"
|
|
251
|
+
(keydown.enter)="onEnter($event)"
|
|
252
|
+
(keydown.arrowdown)="onArrow($event, 1)"
|
|
253
|
+
(keydown.arrowup)="onArrow($event, -1)"
|
|
254
|
+
(keydown.tab)="$event.stopPropagation()"
|
|
255
|
+
/>
|
|
256
|
+
<m-button [disabled]="disabled()" [config]="chevron()" />
|
|
257
|
+
</div>
|
|
258
|
+
@if (showErrors()) {
|
|
259
|
+
@for (error of errors(); track $index) {
|
|
260
|
+
<m-text-output
|
|
261
|
+
variant="footer"
|
|
262
|
+
color="error"
|
|
263
|
+
[label]="error.message"
|
|
264
|
+
/>
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
`;
|
|
269
|
+
const DROPDOWN_IMPORTS = [
|
|
270
|
+
LabelComponent,
|
|
271
|
+
TextOutputComponent,
|
|
272
|
+
TextInputComponent,
|
|
273
|
+
ButtonComponent,
|
|
274
|
+
SelectorDirective
|
|
275
|
+
];
|
|
276
|
+
var BaseDropdownComponent = class BaseDropdownComponent extends BaseInputComponent {
|
|
277
|
+
config = input(...ngDevMode ? [void 0, { debugName: "config" }] : /* istanbul ignore next */ []);
|
|
278
|
+
required = input(false, ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
|
|
279
|
+
disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
|
|
280
|
+
invalid = input(false, ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
|
|
281
|
+
touched = model(false, ...ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []);
|
|
282
|
+
focused = input(false, ...ngDevMode ? [{ debugName: "focused" }] : /* istanbul ignore next */ []);
|
|
283
|
+
errors = input([], ...ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []);
|
|
284
|
+
showErrors = computed(() => this.touched() && this.invalid(), ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
|
|
285
|
+
options = input(...ngDevMode ? [void 0, { debugName: "options" }] : /* istanbul ignore next */ []);
|
|
286
|
+
dir = input(...ngDevMode ? [void 0, { debugName: "dir" }] : /* istanbul ignore next */ []);
|
|
287
|
+
toggle = model(false, ...ngDevMode ? [{ debugName: "toggle" }] : /* istanbul ignore next */ []);
|
|
288
|
+
searchTerm = signal("", ...ngDevMode ? [{ debugName: "searchTerm" }] : /* istanbul ignore next */ []);
|
|
289
|
+
isFocused = signal(false, ...ngDevMode ? [{ debugName: "isFocused" }] : /* istanbul ignore next */ []);
|
|
290
|
+
chevron = computed(() => ({
|
|
291
|
+
icon: this.toggle() ? "chevron-up" : "chevron-down",
|
|
292
|
+
one: true,
|
|
293
|
+
variant: "ghost",
|
|
294
|
+
type: "button",
|
|
295
|
+
color: this.showErrors() ? "error" : this.isFocused() ? "focus" : "border",
|
|
296
|
+
tabindex: -1
|
|
297
|
+
}), ...ngDevMode ? [{ debugName: "chevron" }] : /* istanbul ignore next */ []);
|
|
298
|
+
triggerInputConfig = computed(() => {
|
|
299
|
+
const dropdown = this.config();
|
|
300
|
+
return {
|
|
301
|
+
name: dropdown?.name,
|
|
302
|
+
icon: dropdown?.icon,
|
|
303
|
+
one: dropdown?.one,
|
|
304
|
+
placeholder: this.placeholderText(),
|
|
305
|
+
readonly: this.readonly() || !!dropdown?.readonly
|
|
306
|
+
};
|
|
307
|
+
}, ...ngDevMode ? [{ debugName: "triggerInputConfig" }] : /* istanbul ignore next */ []);
|
|
308
|
+
dropdownOptions = computed(() => {
|
|
309
|
+
const source = this.options() ?? this.config()?.options;
|
|
310
|
+
if (typeof source === "function") return source();
|
|
311
|
+
if (source?.length) return source;
|
|
312
|
+
return this.assetOptions();
|
|
313
|
+
}, ...ngDevMode ? [{ debugName: "dropdownOptions" }] : /* istanbul ignore next */ []);
|
|
314
|
+
translateService = inject(TranslateService);
|
|
315
|
+
assetOptions = assetOptions(() => this.config()?.optionsAsset);
|
|
316
|
+
optionLabel = (option) => {
|
|
317
|
+
if (!option?.label) return "";
|
|
318
|
+
return option.noTranslate ? option.label : this.translateService.translate(option.label);
|
|
319
|
+
};
|
|
320
|
+
filteredOptions = computed(() => {
|
|
321
|
+
const search = this.searchTerm().toLowerCase();
|
|
322
|
+
if (!search) return this.dropdownOptions();
|
|
323
|
+
return this.dropdownOptions().filter((o) => {
|
|
324
|
+
return this.optionLabel(o).toLowerCase().includes(search) || String(o.value).toLowerCase().includes(search);
|
|
325
|
+
});
|
|
326
|
+
}, ...ngDevMode ? [{ debugName: "filteredOptions" }] : /* istanbul ignore next */ []);
|
|
327
|
+
activeIndex = linkedSignal({
|
|
328
|
+
...ngDevMode ? { debugName: "activeIndex" } : /* istanbul ignore next */ {},
|
|
329
|
+
source: this.filteredOptions,
|
|
330
|
+
computation: (options) => this.searchTerm() ? this.nextEnabled(options, -1, 1) : -1
|
|
331
|
+
});
|
|
332
|
+
nextEnabled = (options, from, step) => {
|
|
333
|
+
for (let i = 1; i <= options.length; i++) {
|
|
334
|
+
const index = ((from + step * i) % options.length + options.length) % options.length;
|
|
335
|
+
if (!options[index].disabled) return index;
|
|
336
|
+
}
|
|
337
|
+
return from;
|
|
338
|
+
};
|
|
339
|
+
selectionLabel = computed(() => {
|
|
340
|
+
const values = this.selectedValues();
|
|
341
|
+
if (values.length === 0) return "";
|
|
342
|
+
if (values.length === 1) return this.optionLabel(this.dropdownOptions().find((o) => o.value === values[0]));
|
|
343
|
+
const translation = this.translateService.translate(`selected?count=${values.length}`);
|
|
344
|
+
return translation.includes("selected") ? `${values.length} Selected` : translation;
|
|
345
|
+
}, ...ngDevMode ? [{ debugName: "selectionLabel" }] : /* istanbul ignore next */ []);
|
|
346
|
+
displayValue = computed(() => this.toggle() ? this.searchTerm() : this.selectionLabel(), ...ngDevMode ? [{ debugName: "displayValue" }] : /* istanbul ignore next */ []);
|
|
347
|
+
placeholderText = computed(() => {
|
|
348
|
+
if (this.toggle()) {
|
|
349
|
+
const label = this.selectionLabel();
|
|
350
|
+
if (label) return label;
|
|
351
|
+
}
|
|
352
|
+
const placeholder = this.config()?.placeholder;
|
|
353
|
+
return placeholder ? this.translateService.translate(placeholder) : "";
|
|
354
|
+
}, ...ngDevMode ? [{ debugName: "placeholderText" }] : /* istanbul ignore next */ []);
|
|
355
|
+
wrapperRef = viewChild("wrapper", ...ngDevMode ? [{ debugName: "wrapperRef" }] : /* istanbul ignore next */ []);
|
|
356
|
+
selectorConfig = computed(() => ({
|
|
357
|
+
component: DropdownBoxComponent,
|
|
358
|
+
base: "m-dropdown-input",
|
|
359
|
+
matchTriggerWidth: true,
|
|
360
|
+
toggle: true,
|
|
361
|
+
dir: this.dir(),
|
|
362
|
+
bindings: [
|
|
363
|
+
inputBinding("options", this.filteredOptions),
|
|
364
|
+
inputBinding("selected", this.selectedValues),
|
|
365
|
+
inputBinding("multiple", () => this.multiple),
|
|
366
|
+
inputBinding("activeIndex", this.activeIndex),
|
|
367
|
+
outputBinding("action", (option) => this.selectOption(option))
|
|
368
|
+
]
|
|
369
|
+
}), ...ngDevMode ? [{ debugName: "selectorConfig" }] : /* istanbul ignore next */ []);
|
|
370
|
+
closePanel = () => {
|
|
371
|
+
this.toggle.set(false);
|
|
372
|
+
this.searchTerm.set("");
|
|
373
|
+
setTimeout(() => this.wrapperRef()?.nativeElement.click(), 0);
|
|
374
|
+
};
|
|
375
|
+
onOpened = () => {
|
|
376
|
+
this.toggle.set(true);
|
|
377
|
+
this.searchTerm.set("");
|
|
378
|
+
const current = this.selectedValues()[0];
|
|
379
|
+
this.activeIndex.set(this.filteredOptions().findIndex((o) => o.value === current));
|
|
380
|
+
};
|
|
381
|
+
onArrow = (event, step) => {
|
|
382
|
+
if (!this.toggle()) return;
|
|
383
|
+
event.preventDefault();
|
|
384
|
+
this.activeIndex.update((index) => this.nextEnabled(this.filteredOptions(), index, step));
|
|
385
|
+
};
|
|
386
|
+
onEnter = (event) => {
|
|
387
|
+
event.stopPropagation();
|
|
388
|
+
if (!this.toggle()) return;
|
|
389
|
+
event.preventDefault();
|
|
390
|
+
const option = this.filteredOptions()[this.activeIndex()];
|
|
391
|
+
if (option && !option.disabled) this.selectOption(option);
|
|
392
|
+
};
|
|
393
|
+
onClosed = () => {
|
|
394
|
+
this.toggle.set(false);
|
|
395
|
+
this.searchTerm.set("");
|
|
396
|
+
};
|
|
397
|
+
onInput = (value) => {
|
|
398
|
+
this.searchTerm.set(value);
|
|
399
|
+
};
|
|
400
|
+
preventToggleWhenOpen = (event) => {
|
|
401
|
+
if (this.toggle() || this.readonly() || this.config()?.readonly) event.stopPropagation();
|
|
402
|
+
};
|
|
403
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
404
|
+
minVersion: "12.0.0",
|
|
405
|
+
version: "22.2.1",
|
|
406
|
+
ngImport: i0,
|
|
407
|
+
type: BaseDropdownComponent,
|
|
408
|
+
deps: null,
|
|
409
|
+
target: i0.ɵɵFactoryTarget.Directive
|
|
410
|
+
});
|
|
411
|
+
static ɵdir = i0.ɵɵngDeclareDirective({
|
|
412
|
+
minVersion: "17.2.0",
|
|
413
|
+
version: "22.2.1",
|
|
414
|
+
type: BaseDropdownComponent,
|
|
415
|
+
isStandalone: true,
|
|
416
|
+
inputs: {
|
|
417
|
+
config: {
|
|
418
|
+
classPropertyName: "config",
|
|
419
|
+
publicName: "config",
|
|
420
|
+
isSignal: true,
|
|
421
|
+
isRequired: false,
|
|
422
|
+
transformFunction: null
|
|
423
|
+
},
|
|
424
|
+
required: {
|
|
425
|
+
classPropertyName: "required",
|
|
426
|
+
publicName: "required",
|
|
427
|
+
isSignal: true,
|
|
428
|
+
isRequired: false,
|
|
429
|
+
transformFunction: null
|
|
430
|
+
},
|
|
431
|
+
disabled: {
|
|
432
|
+
classPropertyName: "disabled",
|
|
433
|
+
publicName: "disabled",
|
|
434
|
+
isSignal: true,
|
|
435
|
+
isRequired: false,
|
|
436
|
+
transformFunction: null
|
|
437
|
+
},
|
|
438
|
+
invalid: {
|
|
439
|
+
classPropertyName: "invalid",
|
|
440
|
+
publicName: "invalid",
|
|
441
|
+
isSignal: true,
|
|
442
|
+
isRequired: false,
|
|
443
|
+
transformFunction: null
|
|
444
|
+
},
|
|
445
|
+
touched: {
|
|
446
|
+
classPropertyName: "touched",
|
|
447
|
+
publicName: "touched",
|
|
448
|
+
isSignal: true,
|
|
449
|
+
isRequired: false,
|
|
450
|
+
transformFunction: null
|
|
451
|
+
},
|
|
452
|
+
focused: {
|
|
453
|
+
classPropertyName: "focused",
|
|
454
|
+
publicName: "focused",
|
|
455
|
+
isSignal: true,
|
|
456
|
+
isRequired: false,
|
|
457
|
+
transformFunction: null
|
|
458
|
+
},
|
|
459
|
+
errors: {
|
|
460
|
+
classPropertyName: "errors",
|
|
461
|
+
publicName: "errors",
|
|
462
|
+
isSignal: true,
|
|
463
|
+
isRequired: false,
|
|
464
|
+
transformFunction: null
|
|
465
|
+
},
|
|
466
|
+
options: {
|
|
467
|
+
classPropertyName: "options",
|
|
468
|
+
publicName: "options",
|
|
469
|
+
isSignal: true,
|
|
470
|
+
isRequired: false,
|
|
471
|
+
transformFunction: null
|
|
472
|
+
},
|
|
473
|
+
dir: {
|
|
474
|
+
classPropertyName: "dir",
|
|
475
|
+
publicName: "dir",
|
|
476
|
+
isSignal: true,
|
|
477
|
+
isRequired: false,
|
|
478
|
+
transformFunction: null
|
|
479
|
+
},
|
|
480
|
+
toggle: {
|
|
481
|
+
classPropertyName: "toggle",
|
|
482
|
+
publicName: "toggle",
|
|
483
|
+
isSignal: true,
|
|
484
|
+
isRequired: false,
|
|
485
|
+
transformFunction: null
|
|
486
|
+
}
|
|
487
|
+
},
|
|
488
|
+
outputs: {
|
|
489
|
+
touched: "touchedChange",
|
|
490
|
+
toggle: "toggleChange"
|
|
491
|
+
},
|
|
492
|
+
viewQueries: [{
|
|
493
|
+
propertyName: "wrapperRef",
|
|
494
|
+
first: true,
|
|
495
|
+
predicate: ["wrapper"],
|
|
496
|
+
descendants: true,
|
|
497
|
+
isSignal: true
|
|
498
|
+
}],
|
|
499
|
+
usesInheritance: true,
|
|
500
|
+
ngImport: i0
|
|
501
|
+
});
|
|
502
|
+
};
|
|
503
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
504
|
+
minVersion: "12.0.0",
|
|
505
|
+
version: "22.2.1",
|
|
506
|
+
ngImport: i0,
|
|
507
|
+
type: BaseDropdownComponent,
|
|
508
|
+
decorators: [{ type: Directive }],
|
|
509
|
+
propDecorators: {
|
|
510
|
+
config: [{
|
|
511
|
+
type: i0.Input,
|
|
512
|
+
args: [{
|
|
513
|
+
isSignal: true,
|
|
514
|
+
alias: "config",
|
|
515
|
+
required: false
|
|
516
|
+
}]
|
|
517
|
+
}],
|
|
518
|
+
required: [{
|
|
519
|
+
type: i0.Input,
|
|
520
|
+
args: [{
|
|
521
|
+
isSignal: true,
|
|
522
|
+
alias: "required",
|
|
523
|
+
required: false
|
|
524
|
+
}]
|
|
525
|
+
}],
|
|
526
|
+
disabled: [{
|
|
527
|
+
type: i0.Input,
|
|
528
|
+
args: [{
|
|
529
|
+
isSignal: true,
|
|
530
|
+
alias: "disabled",
|
|
531
|
+
required: false
|
|
532
|
+
}]
|
|
533
|
+
}],
|
|
534
|
+
invalid: [{
|
|
535
|
+
type: i0.Input,
|
|
536
|
+
args: [{
|
|
537
|
+
isSignal: true,
|
|
538
|
+
alias: "invalid",
|
|
539
|
+
required: false
|
|
540
|
+
}]
|
|
541
|
+
}],
|
|
542
|
+
touched: [{
|
|
543
|
+
type: i0.Input,
|
|
544
|
+
args: [{
|
|
545
|
+
isSignal: true,
|
|
546
|
+
alias: "touched",
|
|
547
|
+
required: false
|
|
548
|
+
}]
|
|
549
|
+
}, {
|
|
550
|
+
type: i0.Output,
|
|
551
|
+
args: ["touchedChange"]
|
|
552
|
+
}],
|
|
553
|
+
focused: [{
|
|
554
|
+
type: i0.Input,
|
|
555
|
+
args: [{
|
|
556
|
+
isSignal: true,
|
|
557
|
+
alias: "focused",
|
|
558
|
+
required: false
|
|
559
|
+
}]
|
|
560
|
+
}],
|
|
561
|
+
errors: [{
|
|
562
|
+
type: i0.Input,
|
|
563
|
+
args: [{
|
|
564
|
+
isSignal: true,
|
|
565
|
+
alias: "errors",
|
|
566
|
+
required: false
|
|
567
|
+
}]
|
|
568
|
+
}],
|
|
569
|
+
options: [{
|
|
570
|
+
type: i0.Input,
|
|
571
|
+
args: [{
|
|
572
|
+
isSignal: true,
|
|
573
|
+
alias: "options",
|
|
574
|
+
required: false
|
|
575
|
+
}]
|
|
576
|
+
}],
|
|
577
|
+
dir: [{
|
|
578
|
+
type: i0.Input,
|
|
579
|
+
args: [{
|
|
580
|
+
isSignal: true,
|
|
581
|
+
alias: "dir",
|
|
582
|
+
required: false
|
|
583
|
+
}]
|
|
584
|
+
}],
|
|
585
|
+
toggle: [{
|
|
586
|
+
type: i0.Input,
|
|
587
|
+
args: [{
|
|
588
|
+
isSignal: true,
|
|
589
|
+
alias: "toggle",
|
|
590
|
+
required: false
|
|
591
|
+
}]
|
|
592
|
+
}, {
|
|
593
|
+
type: i0.Output,
|
|
594
|
+
args: ["toggleChange"]
|
|
595
|
+
}],
|
|
596
|
+
wrapperRef: [{
|
|
597
|
+
type: i0.ViewChild,
|
|
598
|
+
args: ["wrapper", { isSignal: true }]
|
|
599
|
+
}]
|
|
600
|
+
}
|
|
601
|
+
});
|
|
602
|
+
export { DROPDOWN_IMPORTS as n, DROPDOWN_TEMPLATE as r, BaseDropdownComponent as t };
|
|
603
|
+
|
|
604
|
+
//# sourceMappingURL=magmonium-one-base-dropdown-CEDsqaPz.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magmonium-one-base-dropdown-CEDsqaPz.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/ui/dropdown/dropdown-box.ts","../../../../libs/one/src/lib/shared/ui/input/ui/dropdown/base-dropdown.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { TranslatePipe } from '../../../../pipe/translate';\nimport { DropdownOption, DropdownValue } from '../../model/input';\n\n@Component({\n selector: 'm-dropdown-box',\n imports: [TranslatePipe],\n template: `\n <ul class=\"dropdown-box\" role=\"listbox\">\n @for (option of options(); track option.value; let i = $index) {\n @let selectedState = isSelected(option.value);\n <li\n class=\"dropdown-box__option\"\n [class.dropdown-box__option--selected]=\"selectedState\"\n [class.dropdown-box__option--disabled]=\"option.disabled\"\n [class.dropdown-box__option--active]=\"i === activeIndex()\"\n role=\"option\"\n [attr.aria-selected]=\"selectedState\"\n [attr.data-value]=\"option.value\"\n (click)=\"selectOption(option)\"\n (keydown.enter)=\"selectOption(option)\"\n tabindex=\"0\"\n >\n <!-- A group header is a row, never a choice: no box to tick. -->\n @if (multiple() && !option.disabled) {\n <input\n type=\"checkbox\"\n class=\"dropdown-box__checkbox\"\n [checked]=\"selectedState\"\n tabindex=\"-1\"\n (click)=\"$event.preventDefault()\"\n />\n }\n @if (option.noTranslate) {\n {{ option.label }}\n } @else {\n {{ option.label | translate }}\n }\n </li>\n } @empty {\n <li class=\"dropdown-box__empty\">\n {{ 'no-results-found' | translate }}\n </li>\n }\n </ul>\n `,\n styleUrl: './dropdown-box.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DropdownBoxComponent {\n readonly options = input<DropdownOption<DropdownValue>[]>([]);\n /** The values ticked, as a list whichever Field drew the panel. */\n readonly selected = input<readonly DropdownValue[]>([]);\n readonly multiple = input<boolean>(false);\n readonly activeIndex = input<number>(-1);\n readonly action = output<DropdownOption<DropdownValue>>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n // Keep the keyboard-active option in view as ↑/↓ walk a scrolled list.\n constructor() {\n effect(() => {\n const index = this.activeIndex();\n if (index < 0) return;\n this.host.nativeElement\n .querySelectorAll('.dropdown-box__option')\n [index]?.scrollIntoView?.({ block: 'nearest' });\n });\n }\n\n protected readonly isSelected = (value: DropdownValue): boolean =>\n this.selected().includes(value);\n\n // Only emit a selection event for enabled options.\n protected readonly selectOption = (\n option: DropdownOption<DropdownValue>\n ): void => {\n if (option.disabled) return;\n this.action.emit(option);\n };\n}\n","import {\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n inputBinding,\n linkedSignal,\n model,\n outputBinding,\n Signal,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { LabelComponent } from '../label';\nimport { TextOutputComponent } from '../../../text-output';\nimport { BaseInputComponent } from '../../lib/base-input';\nimport { Button } from '../../../button/type/button';\nimport { ButtonComponent } from '../../../button/ui/button';\nimport { TranslateService } from '../../../../services';\nimport { SelectorConfig, SelectorDirective } from '../../../../directives';\nimport { Direction } from '../../../../directives/selector/selector-type';\nimport { DropdownBoxComponent } from './dropdown-box';\nimport {\n DropdownInput,\n DropdownOption,\n DropdownValue,\n TextInput,\n} from '../../model/input';\nimport { TextInputComponent } from '../text/text';\nimport { assetOptions } from '../../lib/options-asset';\n\n/** The trigger both option Fields draw: a searchable text input and a chevron. */\nexport const DROPDOWN_TEMPLATE = `\n @if (config(); as dropdown) {\n @if (dropdown.label) {\n <m-label\n [for]=\"dropdown.name ?? ''\"\n [placeholder]=\"dropdown.label\"\n [params]=\"dropdown.params\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n />\n }\n <div\n class=\"trigger-wrap\"\n #wrapper\n [mSelector]=\"selectorConfig()\"\n [disabled]=\"disabled() || readonly() || !!config()?.readonly\"\n (opened)=\"onOpened()\"\n (closed)=\"onClosed()\"\n (focusin)=\"isFocused.set(true)\"\n (focusout)=\"isFocused.set(false)\"\n >\n <m-text-input\n [config]=\"triggerInputConfig()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [invalid]=\"invalid()\"\n [hideErrors]=\"true\"\n [(touched)]=\"touched\"\n [focused]=\"focused()\"\n (valueChange)=\"onInput($event)\"\n (click)=\"preventToggleWhenOpen($event)\"\n (keydown.space)=\"$event.stopPropagation()\"\n (keydown.enter)=\"onEnter($event)\"\n (keydown.arrowdown)=\"onArrow($event, 1)\"\n (keydown.arrowup)=\"onArrow($event, -1)\"\n (keydown.tab)=\"$event.stopPropagation()\"\n />\n <m-button [disabled]=\"disabled()\" [config]=\"chevron()\" />\n </div>\n @if (showErrors()) {\n @for (error of errors(); track $index) {\n <m-text-output\n variant=\"footer\"\n color=\"error\"\n [label]=\"error.message\"\n />\n }\n }\n }\n`;\n\nexport const DROPDOWN_IMPORTS = [\n LabelComponent,\n TextOutputComponent,\n TextInputComponent,\n ButtonComponent,\n SelectorDirective,\n];\n\n/**\n * Everything a Dropdown and a Multiselect share: the options, the search, the\n * keyboard walk and the panel. What differs is only what the Field holds — one\n * value or a list — so a subclass says which values are selected and what a\n * pick does to them.\n */\n@Directive()\nexport abstract class BaseDropdownComponent extends BaseInputComponent<DropdownInput> {\n public override config = input<Partial<DropdownInput> | undefined>();\n public override required = input<boolean>(false);\n public override disabled = input<boolean>(false);\n public override invalid = input<boolean>(false);\n public override touched = model<boolean>(false);\n public override focused = input<boolean>(false);\n public override errors = input<readonly WithOptionalFieldTree<ValidationError>[]>(\n []\n );\n public override showErrors = computed(() => this.touched() && this.invalid());\n\n readonly options = input<\n DropdownOption<DropdownValue>[] | Signal<DropdownOption<DropdownValue>[]>\n >();\n readonly dir = input<Direction>();\n readonly toggle = model(false);\n readonly searchTerm = signal('');\n readonly isFocused = signal(false);\n readonly chevron = computed(\n () =>\n <Button>{\n icon: this.toggle() ? 'chevron-up' : 'chevron-down',\n one: true,\n variant: 'ghost',\n // In-Field control, never the form's submit — without this the Button\n // reads as the submit control and greys out while the form is invalid.\n type: 'button',\n // Chevron tracks the trigger's border like the text input's own icon:\n // red while the Field shows errors, focus tint while focused, border at rest.\n color: this.showErrors()\n ? 'error'\n : this.isFocused()\n ? 'focus'\n : 'border',\n // The trigger input is the Field's tab stop; the chevron only repeats\n // what clicking that input already does, so Tab walks past it.\n tabindex: -1,\n }\n );\n\n /** The values the Field holds now, as a list whichever kind it is. */\n protected abstract readonly selectedValues: Signal<readonly DropdownValue[]>;\n /** Whether the panel ticks rows and stays open across picks. */\n protected abstract readonly multiple: boolean;\n /** What picking `option` does to the Field's value. */\n protected abstract selectOption(option: DropdownOption<DropdownValue>): void;\n\n protected readonly triggerInputConfig = computed(() => {\n const dropdown = this.config() as DropdownInput | undefined;\n return <Partial<TextInput>>{\n name: dropdown?.name,\n icon: dropdown?.icon,\n one: dropdown?.one,\n placeholder: this.placeholderText(),\n readonly: this.readonly() || !!dropdown?.readonly,\n };\n });\n\n protected readonly dropdownOptions = computed(\n (): DropdownOption<DropdownValue>[] => {\n const runtimeOptions = this.options();\n const source =\n runtimeOptions ?? (this.config() as DropdownInput | undefined)?.options;\n if (typeof source === 'function') return source();\n if (source?.length) return source;\n return this.assetOptions();\n }\n );\n\n private readonly translateService = inject(TranslateService);\n\n protected readonly assetOptions = assetOptions(\n () => (this.config() as DropdownInput | undefined)?.optionsAsset\n );\n\n /** An option's text: authored as it stands, a key translated. */\n private readonly optionLabel = (\n option?: DropdownOption<DropdownValue>\n ): string => {\n if (!option?.label) return '';\n return option.noTranslate\n ? option.label\n : this.translateService.translate(option.label);\n };\n\n protected readonly filteredOptions = computed(\n (): DropdownOption<DropdownValue>[] => {\n const search = this.searchTerm().toLowerCase();\n if (!search) return this.dropdownOptions();\n return this.dropdownOptions().filter((o) => {\n const label = this.optionLabel(o).toLowerCase();\n return (\n label.includes(search) ||\n String(o.value).toLowerCase().includes(search)\n );\n });\n }\n );\n\n /** The option ↑/↓ point at while the panel is open; -1 is none. Reset as the search narrows the list. */\n protected readonly activeIndex = linkedSignal<\n DropdownOption<DropdownValue>[],\n number\n >({\n source: this.filteredOptions,\n computation: (options) =>\n this.searchTerm() ? this.nextEnabled(options, -1, 1) : -1,\n });\n\n /** The enabled option `step` rows past `from`, wrapping; `from` itself when none. */\n private readonly nextEnabled = (\n options: DropdownOption<DropdownValue>[],\n from: number,\n step: 1 | -1\n ): number => {\n for (let i = 1; i <= options.length; i++) {\n const index =\n (((from + step * i) % options.length) + options.length) %\n options.length;\n if (!options[index].disabled) return index;\n }\n return from;\n };\n\n /** One pick reads as its option's label, several as a count. */\n private readonly selectionLabel = computed((): string => {\n const values = this.selectedValues();\n if (values.length === 0) return '';\n if (values.length === 1) {\n return this.optionLabel(\n this.dropdownOptions().find((o) => o.value === values[0])\n );\n }\n const translation = this.translateService.translate(\n `selected?count=${values.length}`\n );\n return translation.includes('selected')\n ? `${values.length} Selected`\n : translation;\n });\n\n protected readonly displayValue = computed((): string =>\n this.toggle() ? this.searchTerm() : this.selectionLabel()\n );\n\n protected readonly placeholderText = computed((): string => {\n if (this.toggle()) {\n const label = this.selectionLabel();\n if (label) return label;\n }\n const placeholder = (this.config() as DropdownInput | undefined)\n ?.placeholder;\n return placeholder ? this.translateService.translate(placeholder) : '';\n });\n\n private readonly wrapperRef =\n viewChild<ElementRef<HTMLDivElement>>('wrapper');\n\n protected readonly selectorConfig = computed<\n SelectorConfig<DropdownBoxComponent>\n >(() => ({\n component: DropdownBoxComponent,\n base: 'm-dropdown-input',\n matchTriggerWidth: true,\n toggle: true,\n dir: this.dir(),\n bindings: [\n inputBinding('options', this.filteredOptions),\n inputBinding('selected', this.selectedValues),\n inputBinding('multiple', () => this.multiple),\n inputBinding('activeIndex', this.activeIndex),\n outputBinding<DropdownOption<DropdownValue>>('action', (option) =>\n this.selectOption(option)\n ),\n ],\n }));\n\n /** Shuts the panel after a pick, the way a click on the trigger would. */\n protected readonly closePanel = (): void => {\n this.toggle.set(false);\n this.searchTerm.set('');\n setTimeout(() => this.wrapperRef()?.nativeElement.click(), 0);\n };\n\n protected readonly onOpened = (): void => {\n this.toggle.set(true);\n this.searchTerm.set('');\n const current = this.selectedValues()[0];\n this.activeIndex.set(\n this.filteredOptions().findIndex((o) => o.value === current)\n );\n };\n\n // Focus stays in the trigger input (it is the search box), so ↑/↓ move the\n // active option rather than DOM focus. Closed, ArrowDown bubbles on to\n // SelectorDirective, which opens the panel.\n protected readonly onArrow = (event: Event, step: 1 | -1): void => {\n if (!this.toggle()) return;\n event.preventDefault();\n this.activeIndex.update((index) =>\n this.nextEnabled(this.filteredOptions(), index, step)\n );\n };\n\n // Enter never reaches SelectorDirective (it would toggle the panel); open,\n // it picks the active option.\n protected readonly onEnter = (event: Event): void => {\n event.stopPropagation();\n if (!this.toggle()) return;\n event.preventDefault();\n const option = this.filteredOptions()[this.activeIndex()];\n if (option && !option.disabled) this.selectOption(option);\n };\n\n protected readonly onClosed = (): void => {\n this.toggle.set(false);\n this.searchTerm.set('');\n };\n\n protected readonly onInput = (value: string): void => {\n this.searchTerm.set(value);\n };\n\n protected readonly preventToggleWhenOpen = (event: Event): void => {\n if (this.toggle() || this.readonly() || this.config()?.readonly) {\n event.stopPropagation();\n }\n };\n}\n"],"mappings":"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"}
|