@ks-digital/designsystem-angular 0.0.1-alpha.7 → 0.0.1-alpha.71
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 +28 -11
- package/__internals/README.md +3 -0
- package/alert/README.md +3 -0
- package/breadcrumbs/README.md +3 -0
- package/button/README.md +3 -0
- package/card/README.md +3 -0
- package/details/README.md +3 -0
- package/dialog/README.md +3 -0
- package/dropdown/README.md +3 -0
- package/error-summary/README.md +3 -0
- package/fesm2022/ks-digital-designsystem-angular-__internals.mjs +82 -0
- package/fesm2022/ks-digital-designsystem-angular-__internals.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-alert.mjs +34 -0
- package/fesm2022/ks-digital-designsystem-angular-alert.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-breadcrumbs.mjs +51 -0
- package/fesm2022/ks-digital-designsystem-angular-breadcrumbs.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-button.mjs +74 -0
- package/fesm2022/ks-digital-designsystem-angular-button.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-card.mjs +87 -0
- package/fesm2022/ks-digital-designsystem-angular-card.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-chip.mjs +43 -0
- package/fesm2022/ks-digital-designsystem-angular-chip.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-details.mjs +65 -0
- package/fesm2022/ks-digital-designsystem-angular-details.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-dialog.mjs +49 -0
- package/fesm2022/ks-digital-designsystem-angular-dialog.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-dropdown.mjs +46 -0
- package/fesm2022/ks-digital-designsystem-angular-dropdown.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-error-summary.mjs +49 -0
- package/fesm2022/ks-digital-designsystem-angular-error-summary.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-forms.mjs +229 -0
- package/fesm2022/ks-digital-designsystem-angular-forms.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-heading.mjs +40 -0
- package/fesm2022/ks-digital-designsystem-angular-heading.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-link.mjs +31 -0
- package/fesm2022/ks-digital-designsystem-angular-link.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-pagination.mjs +143 -0
- package/fesm2022/ks-digital-designsystem-angular-pagination.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-paragraph.mjs +25 -0
- package/fesm2022/ks-digital-designsystem-angular-paragraph.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-popover.mjs +46 -0
- package/fesm2022/ks-digital-designsystem-angular-popover.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-search.mjs +159 -0
- package/fesm2022/ks-digital-designsystem-angular-search.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-skeleton.mjs +35 -0
- package/fesm2022/ks-digital-designsystem-angular-skeleton.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-spinner.mjs +104 -0
- package/fesm2022/ks-digital-designsystem-angular-spinner.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-suggestion.mjs +375 -0
- package/fesm2022/ks-digital-designsystem-angular-suggestion.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-table.mjs +105 -0
- package/fesm2022/ks-digital-designsystem-angular-table.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-tabs.mjs +148 -0
- package/fesm2022/ks-digital-designsystem-angular-tabs.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-tag.mjs +38 -0
- package/fesm2022/ks-digital-designsystem-angular-tag.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular-validation-message.mjs +25 -0
- package/fesm2022/ks-digital-designsystem-angular-validation-message.mjs.map +1 -0
- package/fesm2022/ks-digital-designsystem-angular.mjs +7 -0
- package/fesm2022/ks-digital-designsystem-angular.mjs.map +1 -0
- package/forms/README.md +3 -0
- package/heading/README.md +3 -0
- package/link/README.md +3 -0
- package/package.json +113 -28
- package/pagination/README.md +3 -0
- package/paragraph/README.md +3 -0
- package/popover/README.md +3 -0
- package/search/README.md +3 -0
- package/skeleton/README.md +3 -0
- package/spinner/README.md +3 -0
- package/suggestion/README.md +3 -0
- package/table/README.md +3 -0
- package/tabs/README.md +3 -0
- package/tag/README.md +3 -0
- package/types/ks-digital-designsystem-angular-__internals.d.ts +50 -0
- package/types/ks-digital-designsystem-angular-alert.d.ts +12 -0
- package/types/ks-digital-designsystem-angular-breadcrumbs.d.ts +13 -0
- package/types/ks-digital-designsystem-angular-button.d.ts +32 -0
- package/types/ks-digital-designsystem-angular-card.d.ts +24 -0
- package/types/ks-digital-designsystem-angular-chip.d.ts +15 -0
- package/types/ks-digital-designsystem-angular-details.d.ts +20 -0
- package/types/ks-digital-designsystem-angular-dialog.d.ts +18 -0
- package/types/ks-digital-designsystem-angular-dropdown.d.ts +13 -0
- package/types/ks-digital-designsystem-angular-error-summary.d.ts +14 -0
- package/types/ks-digital-designsystem-angular-forms.d.ts +81 -0
- package/types/ks-digital-designsystem-angular-heading.d.ts +19 -0
- package/types/ks-digital-designsystem-angular-link.d.ts +9 -0
- package/types/ks-digital-designsystem-angular-pagination.d.ts +58 -0
- package/types/ks-digital-designsystem-angular-paragraph.d.ts +8 -0
- package/types/ks-digital-designsystem-angular-popover.d.ts +13 -0
- package/types/ks-digital-designsystem-angular-search.d.ts +76 -0
- package/types/ks-digital-designsystem-angular-skeleton.d.ts +18 -0
- package/types/ks-digital-designsystem-angular-spinner.d.ts +23 -0
- package/types/ks-digital-designsystem-angular-suggestion.d.ts +132 -0
- package/types/ks-digital-designsystem-angular-table.d.ts +43 -0
- package/types/ks-digital-designsystem-angular-tabs.d.ts +65 -0
- package/types/ks-digital-designsystem-angular-tag.d.ts +15 -0
- package/types/ks-digital-designsystem-angular-validation-message.d.ts +8 -0
- package/types/ks-digital-designsystem-angular.d.ts +2 -0
- package/validation-message/README.md +3 -0
- package/dist/README.md +0 -43
- package/dist/fesm2022/ks-digital-designsystem-angular.mjs +0 -195
- package/dist/fesm2022/ks-digital-designsystem-angular.mjs.map +0 -1
- package/dist/index.d.ts +0 -75
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { viewChild, ChangeDetectionStrategy, Component, input, CUSTOM_ELEMENTS_SCHEMA, contentChildren, contentChild, booleanAttribute, model, output, computed, signal, afterRenderEffect, effect, untracked } from '@angular/core';
|
|
4
|
+
import '@digdir/designsystemet-web';
|
|
5
|
+
import * as i1 from '@ks-digital/designsystem-angular/__internals';
|
|
6
|
+
import { HostSize, HostColor } from '@ks-digital/designsystem-angular/__internals';
|
|
7
|
+
|
|
8
|
+
class SuggestionListEmpty {
|
|
9
|
+
/**
|
|
10
|
+
* Hack to get the content from parent component so that we can
|
|
11
|
+
* keep the dom structure needed without additional host elements
|
|
12
|
+
*/
|
|
13
|
+
templateRef = viewChild('tpl', ...(ngDevMode ? [{ debugName: "templateRef" }] : /* istanbul ignore next */ []));
|
|
14
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SuggestionListEmpty, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
15
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.8", type: SuggestionListEmpty, isStandalone: true, selector: "ksd-suggestion-list-empty", viewQueries: [{ propertyName: "templateRef", first: true, predicate: ["tpl"], descendants: true, isSignal: true }], ngImport: i0, template: ` <ng-template #tpl><ng-content /></ng-template> `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
16
|
+
}
|
|
17
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SuggestionListEmpty, decorators: [{
|
|
18
|
+
type: Component,
|
|
19
|
+
args: [{
|
|
20
|
+
selector: 'ksd-suggestion-list-empty',
|
|
21
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
22
|
+
template: ` <ng-template #tpl><ng-content /></ng-template> `,
|
|
23
|
+
}]
|
|
24
|
+
}], propDecorators: { templateRef: [{ type: i0.ViewChild, args: ['tpl', { isSignal: true }] }] } });
|
|
25
|
+
|
|
26
|
+
class SuggestionListOption {
|
|
27
|
+
/**
|
|
28
|
+
* Hack to get the content from parent component so that we can
|
|
29
|
+
* keep the dom structure needed without additional host elements
|
|
30
|
+
*/
|
|
31
|
+
templateRef = viewChild('tpl', ...(ngDevMode ? [{ debugName: "templateRef" }] : /* istanbul ignore next */ []));
|
|
32
|
+
value = input.required(...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
33
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SuggestionListOption, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
34
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.8", type: SuggestionListOption, isStandalone: true, selector: "ksd-suggestion-list-option", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "templateRef", first: true, predicate: ["tpl"], descendants: true, isSignal: true }], ngImport: i0, template: ` <ng-template #tpl><ng-content /></ng-template> `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
35
|
+
}
|
|
36
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SuggestionListOption, decorators: [{
|
|
37
|
+
type: Component,
|
|
38
|
+
args: [{
|
|
39
|
+
selector: 'ksd-suggestion-list-option',
|
|
40
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
41
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
42
|
+
imports: [],
|
|
43
|
+
template: ` <ng-template #tpl><ng-content /></ng-template> `,
|
|
44
|
+
}]
|
|
45
|
+
}], propDecorators: { templateRef: [{ type: i0.ViewChild, args: ['tpl', { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }] } });
|
|
46
|
+
|
|
47
|
+
class SuggestionList {
|
|
48
|
+
/**
|
|
49
|
+
* Screen reader announcement template for singular result count.
|
|
50
|
+
*
|
|
51
|
+
* @default '%d forslag'
|
|
52
|
+
*/
|
|
53
|
+
singular = input('%d forslag', ...(ngDevMode ? [{ debugName: "singular" }] : /* istanbul ignore next */ []));
|
|
54
|
+
/**
|
|
55
|
+
* Screen reader announcement template for plural result count.
|
|
56
|
+
*
|
|
57
|
+
* @default '%d forslag'
|
|
58
|
+
*/
|
|
59
|
+
plural = input('%d forslag', ...(ngDevMode ? [{ debugName: "plural" }] : /* istanbul ignore next */ []));
|
|
60
|
+
options = contentChildren(SuggestionListOption, { ...(ngDevMode ? { debugName: "options" } : /* istanbul ignore next */ {}), descendants: true });
|
|
61
|
+
empty = contentChild(SuggestionListEmpty, ...(ngDevMode ? [{ debugName: "empty" }] : /* istanbul ignore next */ []));
|
|
62
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SuggestionList, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
63
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.8", type: SuggestionList, isStandalone: true, selector: "ksd-suggestion-list", inputs: { singular: { classPropertyName: "singular", publicName: "singular", isSignal: true, isRequired: false, transformFunction: null }, plural: { classPropertyName: "plural", publicName: "plural", isSignal: true, isRequired: false, transformFunction: null } }, host: { styleAttribute: "display: none;" }, queries: [{ propertyName: "options", predicate: SuggestionListOption, descendants: true, isSignal: true }, { propertyName: "empty", first: true, predicate: SuggestionListEmpty, descendants: true, isSignal: true }], ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
64
|
+
}
|
|
65
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SuggestionList, decorators: [{
|
|
66
|
+
type: Component,
|
|
67
|
+
args: [{
|
|
68
|
+
selector: 'ksd-suggestion-list',
|
|
69
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
70
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
71
|
+
host: {
|
|
72
|
+
style: 'display: none;',
|
|
73
|
+
},
|
|
74
|
+
template: ``,
|
|
75
|
+
}]
|
|
76
|
+
}], propDecorators: { singular: [{ type: i0.Input, args: [{ isSignal: true, alias: "singular", required: false }] }], plural: [{ type: i0.Input, args: [{ isSignal: true, alias: "plural", required: false }] }], options: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SuggestionListOption), { ...{
|
|
77
|
+
descendants: true,
|
|
78
|
+
}, isSignal: true }] }], empty: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SuggestionListEmpty), { isSignal: true }] }] } });
|
|
79
|
+
|
|
80
|
+
const isSuggestionItem = (value) => typeof value === 'object' &&
|
|
81
|
+
value !== null &&
|
|
82
|
+
'label' in value &&
|
|
83
|
+
'value' in value;
|
|
84
|
+
const sanitizeValues = (values) => values == null ? [] : Array.isArray(values) ? values : [values];
|
|
85
|
+
const toValues = (value) => value == null ? [] : Array.isArray(value) ? value : [value];
|
|
86
|
+
/** Extracts the labels carried by any items passed to `[selected]`. */
|
|
87
|
+
const labelEntries = (values) => sanitizeValues(values)
|
|
88
|
+
.filter(isSuggestionItem)
|
|
89
|
+
.map((item) => [item.value, item.label]);
|
|
90
|
+
/** Normalizes anything accepted by `[selected]` into the primitive value model. */
|
|
91
|
+
const toValue = (values) => {
|
|
92
|
+
if (values == null)
|
|
93
|
+
return undefined;
|
|
94
|
+
const primitives = sanitizeValues(values).map((value) => isSuggestionItem(value) ? value.value : value);
|
|
95
|
+
return Array.isArray(values) ? primitives : primitives[0];
|
|
96
|
+
};
|
|
97
|
+
const resolveItems = (value, labels) => toValues(value).map((optionValue) => ({
|
|
98
|
+
label: labels.get(optionValue) ?? optionValue,
|
|
99
|
+
value: optionValue,
|
|
100
|
+
}));
|
|
101
|
+
/** Resolves a primitive value into items, using known labels where available. */
|
|
102
|
+
const toSelected = (value, labels) => {
|
|
103
|
+
if (value == null)
|
|
104
|
+
return undefined;
|
|
105
|
+
const items = resolveItems(value, labels);
|
|
106
|
+
return Array.isArray(value) ? items : items[0];
|
|
107
|
+
};
|
|
108
|
+
const sameValue = (left, right) => {
|
|
109
|
+
if (Array.isArray(left) && Array.isArray(right)) {
|
|
110
|
+
return (left.length === right.length &&
|
|
111
|
+
left.every((value, index) => value === right[index]));
|
|
112
|
+
}
|
|
113
|
+
return left === right;
|
|
114
|
+
};
|
|
115
|
+
const nextSelected = (data, previous, multiple) => {
|
|
116
|
+
const value = data.value;
|
|
117
|
+
if (!multiple)
|
|
118
|
+
return data.isConnected ? undefined : value;
|
|
119
|
+
const previousValues = toValues(previous);
|
|
120
|
+
return data.isConnected
|
|
121
|
+
? previousValues.filter((previousValue) => previousValue !== value)
|
|
122
|
+
: [...previousValues, value];
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
const defaultFilter = ({ label, input }) => label.toLowerCase().includes(input.value.trim().toLowerCase());
|
|
126
|
+
// Distinguishes an unbound `selected` from one explicitly bound to `undefined`.
|
|
127
|
+
const UNSET = Symbol('unset');
|
|
128
|
+
class Suggestion {
|
|
129
|
+
/**
|
|
130
|
+
* Allows the user to select multiple items
|
|
131
|
+
*
|
|
132
|
+
* @default false
|
|
133
|
+
*/
|
|
134
|
+
multiple = input(false, { ...(ngDevMode ? { debugName: "multiple" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
135
|
+
/**
|
|
136
|
+
* Allows the user to create new items
|
|
137
|
+
*
|
|
138
|
+
* @default false
|
|
139
|
+
*/
|
|
140
|
+
creatable = input(false, { ...(ngDevMode ? { debugName: "creatable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
141
|
+
/**
|
|
142
|
+
* Filter options; boolean or a custom callback.
|
|
143
|
+
*
|
|
144
|
+
* @default true
|
|
145
|
+
*/
|
|
146
|
+
filter = input(true, ...(ngDevMode ? [{ debugName: "filter" }] : /* istanbul ignore next */ []));
|
|
147
|
+
/**
|
|
148
|
+
* Current value, as primitive option values. Bound by Angular signal forms.
|
|
149
|
+
*
|
|
150
|
+
* @default undefined
|
|
151
|
+
*/
|
|
152
|
+
value = model(undefined, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
153
|
+
/**
|
|
154
|
+
* Controlled selection. Accepts items or raw option values.
|
|
155
|
+
*
|
|
156
|
+
* @default undefined
|
|
157
|
+
*/
|
|
158
|
+
selected = input(UNSET, ...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
|
|
159
|
+
/**
|
|
160
|
+
* Emits the resolved selection whenever the user changes it.
|
|
161
|
+
*/
|
|
162
|
+
selectedChange = output();
|
|
163
|
+
/**
|
|
164
|
+
* Form-control dirty state.
|
|
165
|
+
*
|
|
166
|
+
* @default false
|
|
167
|
+
*/
|
|
168
|
+
dirty = input(false, { ...(ngDevMode ? { debugName: "dirty" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
169
|
+
/**
|
|
170
|
+
* Whether the control has been touched. Synced with Angular signal forms.
|
|
171
|
+
*
|
|
172
|
+
* @default false
|
|
173
|
+
*/
|
|
174
|
+
touched = model(false, ...(ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []));
|
|
175
|
+
selectedArray = computed(() => resolveItems(this.value(), this.labels()), ...(ngDevMode ? [{ debugName: "selectedArray" }] : /* istanbul ignore next */ []));
|
|
176
|
+
suggestionElement = viewChild('suggestionElement', ...(ngDevMode ? [{ debugName: "suggestionElement" }] : /* istanbul ignore next */ []));
|
|
177
|
+
labels = signal(new Map(), ...(ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []));
|
|
178
|
+
query = signal('', ...(ngDevMode ? [{ debugName: "query" }] : /* istanbul ignore next */ []));
|
|
179
|
+
suggestionList = contentChild(SuggestionList, ...(ngDevMode ? [{ debugName: "suggestionList" }] : /* istanbul ignore next */ []));
|
|
180
|
+
constructor() {
|
|
181
|
+
// Runs after render, so projected options are present in the DOM.
|
|
182
|
+
afterRenderEffect(() => {
|
|
183
|
+
this.query();
|
|
184
|
+
this.filter();
|
|
185
|
+
this.suggestionList()?.options();
|
|
186
|
+
this.syncOptions();
|
|
187
|
+
});
|
|
188
|
+
// Apply the controlled `selected` input, when bound, to the value model.
|
|
189
|
+
effect(() => {
|
|
190
|
+
const selected = this.selected();
|
|
191
|
+
if (selected === UNSET)
|
|
192
|
+
return;
|
|
193
|
+
untracked(() => this.learnLabels(labelEntries(selected)));
|
|
194
|
+
const next = toValue(selected);
|
|
195
|
+
if (sameValue(next, untracked(() => this.value())))
|
|
196
|
+
return;
|
|
197
|
+
untracked(() => this.value.set(next));
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
onSelect(event) {
|
|
201
|
+
const customEvent = event;
|
|
202
|
+
customEvent.preventDefault();
|
|
203
|
+
const data = customEvent.detail;
|
|
204
|
+
if (!data)
|
|
205
|
+
return;
|
|
206
|
+
this.learnLabels([[data.value, data.textContent?.trim() || data.value]]);
|
|
207
|
+
this.setValue(nextSelected(data, this.value(), this.multiple()));
|
|
208
|
+
}
|
|
209
|
+
onFocusOut(event) {
|
|
210
|
+
const suggestionElement = this.suggestionElement()?.nativeElement;
|
|
211
|
+
const nextTarget = event.relatedTarget;
|
|
212
|
+
// Ignore focus changes within the composite widget; only mark touched
|
|
213
|
+
// when focus leaves the suggestion control entirely.
|
|
214
|
+
if (suggestionElement &&
|
|
215
|
+
nextTarget instanceof Node &&
|
|
216
|
+
suggestionElement.contains(nextTarget)) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
this.touched.set(true);
|
|
220
|
+
}
|
|
221
|
+
onInput(event) {
|
|
222
|
+
const inputElement = event.target;
|
|
223
|
+
this.query.set(inputElement?.value ?? '');
|
|
224
|
+
}
|
|
225
|
+
setValue(value) {
|
|
226
|
+
if (sameValue(value, this.value()))
|
|
227
|
+
return;
|
|
228
|
+
this.value.set(value);
|
|
229
|
+
this.selectedChange.emit(toSelected(value, this.labels()));
|
|
230
|
+
}
|
|
231
|
+
learnLabels(entries) {
|
|
232
|
+
this.labels.update((current) => {
|
|
233
|
+
let next = null;
|
|
234
|
+
for (const [value, label] of entries) {
|
|
235
|
+
if (current.get(value) === label)
|
|
236
|
+
continue;
|
|
237
|
+
next ??= new Map(current);
|
|
238
|
+
next.set(value, label);
|
|
239
|
+
}
|
|
240
|
+
return next ?? current;
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
syncOptions() {
|
|
244
|
+
const suggestionElement = this.suggestionElement()?.nativeElement;
|
|
245
|
+
if (!suggestionElement)
|
|
246
|
+
return;
|
|
247
|
+
const input = suggestionElement.querySelector('input');
|
|
248
|
+
const options = Array.from(suggestionElement.querySelectorAll('u-option:not([data-empty])'));
|
|
249
|
+
this.learnLabels(options.map((option) => [
|
|
250
|
+
option.value,
|
|
251
|
+
option.label ||
|
|
252
|
+
option.text ||
|
|
253
|
+
option.textContent?.trim() ||
|
|
254
|
+
option.value,
|
|
255
|
+
]));
|
|
256
|
+
const filter = this.filter();
|
|
257
|
+
const filterFn = filter === true ? defaultFilter : filter;
|
|
258
|
+
if (filterFn && input) {
|
|
259
|
+
let index = 0;
|
|
260
|
+
for (const option of options) {
|
|
261
|
+
option.disabled = !filterFn({
|
|
262
|
+
index,
|
|
263
|
+
input,
|
|
264
|
+
label: option.label,
|
|
265
|
+
optionElement: option,
|
|
266
|
+
text: option.text,
|
|
267
|
+
value: option.value,
|
|
268
|
+
});
|
|
269
|
+
index++;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
for (const option of options) {
|
|
274
|
+
option.disabled = false;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
const visibleOptions = options.filter((option) => !option.disabled && !option.hidden);
|
|
278
|
+
const emptyOption = suggestionElement.querySelector('u-option[data-empty]');
|
|
279
|
+
if (!emptyOption)
|
|
280
|
+
return;
|
|
281
|
+
if (visibleOptions.length === 0) {
|
|
282
|
+
emptyOption.removeAttribute('hidden');
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
emptyOption.setAttribute('hidden', '');
|
|
286
|
+
}
|
|
287
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: Suggestion, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
288
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: Suggestion, isStandalone: true, selector: "ksd-suggestion", inputs: { multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, creatable: { classPropertyName: "creatable", publicName: "creatable", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, dirty: { classPropertyName: "dirty", publicName: "dirty", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", selectedChange: "selectedChange", touched: "touchedChange" }, queries: [{ propertyName: "suggestionList", first: true, predicate: SuggestionList, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "suggestionElement", first: true, predicate: ["suggestionElement"], descendants: true, isSignal: true }], hostDirectives: [{ directive: i1.HostSize, inputs: ["data-size", "data-size"] }, { directive: i1.HostColor, inputs: ["data-color", "data-color"] }], ngImport: i0, template: `
|
|
289
|
+
<ds-suggestion
|
|
290
|
+
#suggestionElement
|
|
291
|
+
class="ds-suggestion"
|
|
292
|
+
[attr.data-multiple]="multiple() || undefined"
|
|
293
|
+
[attr.data-creatable]="creatable() || undefined"
|
|
294
|
+
(comboboxbeforeselect)="onSelect($event)"
|
|
295
|
+
(focusout)="onFocusOut($event)"
|
|
296
|
+
(input)="onInput($event)"
|
|
297
|
+
>
|
|
298
|
+
@for (option of selectedArray(); track option.value) {
|
|
299
|
+
<data [attr.value]="option.value">{{ option.label }}</data>
|
|
300
|
+
}
|
|
301
|
+
<ng-content />
|
|
302
|
+
<u-datalist
|
|
303
|
+
popover="manual"
|
|
304
|
+
data-is-floating="true"
|
|
305
|
+
data-nofilter
|
|
306
|
+
[attr.data-sr-singular]="suggestionList()?.singular()"
|
|
307
|
+
[attr.data-sr-plural]="suggestionList()?.plural()"
|
|
308
|
+
>
|
|
309
|
+
@for (option of suggestionList()?.options() ?? []; track option) {
|
|
310
|
+
<u-option [value]="option.value()">
|
|
311
|
+
<ng-container *ngTemplateOutlet="option.templateRef()" />
|
|
312
|
+
</u-option>
|
|
313
|
+
}
|
|
314
|
+
@if (suggestionList()?.empty()?.templateRef(); as emptyTpl) {
|
|
315
|
+
<u-option data-empty value="" hidden>
|
|
316
|
+
<ng-container *ngTemplateOutlet="emptyTpl" />
|
|
317
|
+
</u-option>
|
|
318
|
+
}
|
|
319
|
+
</u-datalist>
|
|
320
|
+
</ds-suggestion>
|
|
321
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
322
|
+
}
|
|
323
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: Suggestion, decorators: [{
|
|
324
|
+
type: Component,
|
|
325
|
+
args: [{ selector: 'ksd-suggestion', changeDetection: ChangeDetectionStrategy.OnPush, hostDirectives: [
|
|
326
|
+
{
|
|
327
|
+
directive: HostSize,
|
|
328
|
+
inputs: ['data-size'],
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
directive: HostColor,
|
|
332
|
+
inputs: ['data-color'],
|
|
333
|
+
},
|
|
334
|
+
], schemas: [CUSTOM_ELEMENTS_SCHEMA], imports: [NgTemplateOutlet], template: `
|
|
335
|
+
<ds-suggestion
|
|
336
|
+
#suggestionElement
|
|
337
|
+
class="ds-suggestion"
|
|
338
|
+
[attr.data-multiple]="multiple() || undefined"
|
|
339
|
+
[attr.data-creatable]="creatable() || undefined"
|
|
340
|
+
(comboboxbeforeselect)="onSelect($event)"
|
|
341
|
+
(focusout)="onFocusOut($event)"
|
|
342
|
+
(input)="onInput($event)"
|
|
343
|
+
>
|
|
344
|
+
@for (option of selectedArray(); track option.value) {
|
|
345
|
+
<data [attr.value]="option.value">{{ option.label }}</data>
|
|
346
|
+
}
|
|
347
|
+
<ng-content />
|
|
348
|
+
<u-datalist
|
|
349
|
+
popover="manual"
|
|
350
|
+
data-is-floating="true"
|
|
351
|
+
data-nofilter
|
|
352
|
+
[attr.data-sr-singular]="suggestionList()?.singular()"
|
|
353
|
+
[attr.data-sr-plural]="suggestionList()?.plural()"
|
|
354
|
+
>
|
|
355
|
+
@for (option of suggestionList()?.options() ?? []; track option) {
|
|
356
|
+
<u-option [value]="option.value()">
|
|
357
|
+
<ng-container *ngTemplateOutlet="option.templateRef()" />
|
|
358
|
+
</u-option>
|
|
359
|
+
}
|
|
360
|
+
@if (suggestionList()?.empty()?.templateRef(); as emptyTpl) {
|
|
361
|
+
<u-option data-empty value="" hidden>
|
|
362
|
+
<ng-container *ngTemplateOutlet="emptyTpl" />
|
|
363
|
+
</u-option>
|
|
364
|
+
}
|
|
365
|
+
</u-datalist>
|
|
366
|
+
</ds-suggestion>
|
|
367
|
+
`, styles: [":host{display:block}\n"] }]
|
|
368
|
+
}], ctorParameters: () => [], propDecorators: { multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], creatable: [{ type: i0.Input, args: [{ isSignal: true, alias: "creatable", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], selectedChange: [{ type: i0.Output, args: ["selectedChange"] }], dirty: [{ type: i0.Input, args: [{ isSignal: true, alias: "dirty", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], suggestionElement: [{ type: i0.ViewChild, args: ['suggestionElement', { isSignal: true }] }], suggestionList: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SuggestionList), { isSignal: true }] }] } });
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Generated bundle index. Do not edit.
|
|
372
|
+
*/
|
|
373
|
+
|
|
374
|
+
export { Suggestion, SuggestionList, SuggestionListEmpty, SuggestionListOption };
|
|
375
|
+
//# sourceMappingURL=ks-digital-designsystem-angular-suggestion.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ks-digital-designsystem-angular-suggestion.mjs","sources":["../../../../packages/angular/suggestion/src/suggestion-list-empty.ts","../../../../packages/angular/suggestion/src/suggestion-list-option.ts","../../../../packages/angular/suggestion/src/suggestion-list.ts","../../../../packages/angular/suggestion/src/suggestion.utils.ts","../../../../packages/angular/suggestion/src/suggestion.ts","../../../../packages/angular/suggestion/src/ks-digital-designsystem-angular-suggestion.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n TemplateRef,\n viewChild,\n} from '@angular/core'\n\n@Component({\n selector: 'ksd-suggestion-list-empty',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: ` <ng-template #tpl><ng-content /></ng-template> `,\n})\nexport class SuggestionListEmpty {\n /**\n * Hack to get the content from parent component so that we can\n * keep the dom structure needed without additional host elements\n */\n templateRef = viewChild<TemplateRef<unknown>>('tpl')\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n input,\n TemplateRef,\n viewChild,\n} from '@angular/core'\n\n@Component({\n selector: 'ksd-suggestion-list-option',\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n imports: [],\n template: ` <ng-template #tpl><ng-content /></ng-template> `,\n})\nexport class SuggestionListOption {\n /**\n * Hack to get the content from parent component so that we can\n * keep the dom structure needed without additional host elements\n */\n templateRef = viewChild<TemplateRef<unknown>>('tpl')\n\n value = input.required<string>()\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n contentChild,\n contentChildren,\n CUSTOM_ELEMENTS_SCHEMA,\n input,\n} from '@angular/core'\nimport { SuggestionListEmpty } from './suggestion-list-empty'\nimport { SuggestionListOption } from './suggestion-list-option'\n\n@Component({\n selector: 'ksd-suggestion-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n host: {\n style: 'display: none;',\n },\n template: ``,\n})\nexport class SuggestionList {\n /**\n * Screen reader announcement template for singular result count.\n *\n * @default '%d forslag'\n */\n readonly singular = input('%d forslag')\n\n /**\n * Screen reader announcement template for plural result count.\n *\n * @default '%d forslag'\n */\n readonly plural = input('%d forslag')\n\n readonly options = contentChildren(SuggestionListOption, {\n descendants: true,\n })\n\n readonly empty = contentChild(SuggestionListEmpty)\n}\n","import type {\n SuggestionItem,\n SuggestionSelected,\n SuggestionSelectedInput,\n SuggestionValue,\n} from './suggestion.types'\n\nexport const isSuggestionItem = (\n value: SuggestionItem | string | null | undefined,\n): value is SuggestionItem =>\n typeof value === 'object' &&\n value !== null &&\n 'label' in value &&\n 'value' in value\n\nconst sanitizeValues = (\n values: SuggestionSelectedInput,\n): Array<SuggestionItem | string> =>\n values == null ? [] : Array.isArray(values) ? values : [values]\n\nconst toValues = (value: SuggestionValue): string[] =>\n value == null ? [] : Array.isArray(value) ? value : [value]\n\n/** Option labels keyed by option value, learned from options and selections. */\nexport type SuggestionLabels = ReadonlyMap<string, string>\n\n/** Extracts the labels carried by any items passed to `[selected]`. */\nexport const labelEntries = (\n values: SuggestionSelectedInput,\n): Array<[string, string]> =>\n sanitizeValues(values)\n .filter(isSuggestionItem)\n .map((item) => [item.value, item.label])\n\n/** Normalizes anything accepted by `[selected]` into the primitive value model. */\nexport const toValue = (values: SuggestionSelectedInput): SuggestionValue => {\n if (values == null) return undefined\n\n const primitives = sanitizeValues(values).map((value) =>\n isSuggestionItem(value) ? value.value : value,\n )\n\n return Array.isArray(values) ? primitives : primitives[0]\n}\n\nexport const resolveItems = (\n value: SuggestionValue,\n labels: SuggestionLabels,\n): SuggestionItem[] =>\n toValues(value).map((optionValue) => ({\n label: labels.get(optionValue) ?? optionValue,\n value: optionValue,\n }))\n\n/** Resolves a primitive value into items, using known labels where available. */\nexport const toSelected = (\n value: SuggestionValue,\n labels: SuggestionLabels,\n): SuggestionSelected => {\n if (value == null) return undefined\n\n const items = resolveItems(value, labels)\n return Array.isArray(value) ? items : items[0]\n}\n\nexport const sameValue = (left: SuggestionValue, right: SuggestionValue) => {\n if (Array.isArray(left) && Array.isArray(right)) {\n return (\n left.length === right.length &&\n left.every((value, index) => value === right[index])\n )\n }\n\n return left === right\n}\n\nexport const nextSelected = (\n data: HTMLDataElement,\n previous: SuggestionValue,\n multiple: boolean,\n): SuggestionValue => {\n const value = data.value\n\n if (!multiple) return data.isConnected ? undefined : value\n\n const previousValues = toValues(previous)\n\n return data.isConnected\n ? previousValues.filter((previousValue) => previousValue !== value)\n : [...previousValues, value]\n}\n","import { NgTemplateOutlet } from '@angular/common'\nimport {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n CUSTOM_ELEMENTS_SCHEMA,\n effect,\n ElementRef,\n input,\n model,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core'\nimport type { FormValueControl } from '@angular/forms/signals'\n// Main entrypoint on purpose: u-datalist, which ds-suggestion filtering needs, has no subpath export\nimport '@digdir/designsystemet-web'\nimport {\n HostColor,\n HostSize,\n} from '@ks-digital/designsystem-angular/__internals'\nimport { SuggestionList } from './suggestion-list'\nimport type {\n SuggestionFilter,\n SuggestionFilterArgs,\n SuggestionSelected,\n SuggestionSelectedInput,\n SuggestionValue,\n} from './suggestion.types'\nimport type { SuggestionLabels } from './suggestion.utils'\nimport {\n labelEntries,\n nextSelected,\n resolveItems,\n sameValue,\n toSelected,\n toValue,\n} from './suggestion.utils'\n\nconst defaultFilter = ({ label, input }: SuggestionFilterArgs) =>\n label.toLowerCase().includes(input.value.trim().toLowerCase())\n\n// Distinguishes an unbound `selected` from one explicitly bound to `undefined`.\nconst UNSET = Symbol('unset')\n\n@Component({\n selector: 'ksd-suggestion',\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: HostSize,\n inputs: ['data-size'],\n },\n {\n directive: HostColor,\n inputs: ['data-color'],\n },\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n imports: [NgTemplateOutlet],\n styles: `\n :host {\n display: block;\n }\n `,\n template: `\n <ds-suggestion\n #suggestionElement\n class=\"ds-suggestion\"\n [attr.data-multiple]=\"multiple() || undefined\"\n [attr.data-creatable]=\"creatable() || undefined\"\n (comboboxbeforeselect)=\"onSelect($event)\"\n (focusout)=\"onFocusOut($event)\"\n (input)=\"onInput($event)\"\n >\n @for (option of selectedArray(); track option.value) {\n <data [attr.value]=\"option.value\">{{ option.label }}</data>\n }\n <ng-content />\n <u-datalist\n popover=\"manual\"\n data-is-floating=\"true\"\n data-nofilter\n [attr.data-sr-singular]=\"suggestionList()?.singular()\"\n [attr.data-sr-plural]=\"suggestionList()?.plural()\"\n >\n @for (option of suggestionList()?.options() ?? []; track option) {\n <u-option [value]=\"option.value()\">\n <ng-container *ngTemplateOutlet=\"option.templateRef()\" />\n </u-option>\n }\n @if (suggestionList()?.empty()?.templateRef(); as emptyTpl) {\n <u-option data-empty value=\"\" hidden>\n <ng-container *ngTemplateOutlet=\"emptyTpl\" />\n </u-option>\n }\n </u-datalist>\n </ds-suggestion>\n `,\n})\nexport class Suggestion implements FormValueControl<SuggestionValue> {\n /**\n * Allows the user to select multiple items\n *\n * @default false\n */\n multiple = input(false, { transform: booleanAttribute })\n\n /**\n * Allows the user to create new items\n *\n * @default false\n */\n creatable = input(false, { transform: booleanAttribute })\n\n /**\n * Filter options; boolean or a custom callback.\n *\n * @default true\n */\n filter = input<boolean | SuggestionFilter>(true)\n\n /**\n * Current value, as primitive option values. Bound by Angular signal forms.\n *\n * @default undefined\n */\n readonly value = model<SuggestionValue>(undefined)\n\n /**\n * Controlled selection. Accepts items or raw option values.\n *\n * @default undefined\n */\n readonly selected = input<SuggestionSelectedInput | typeof UNSET>(UNSET)\n\n /**\n * Emits the resolved selection whenever the user changes it.\n */\n readonly selectedChange = output<SuggestionSelected>()\n\n /**\n * Form-control dirty state.\n *\n * @default false\n */\n readonly dirty = input(false, { transform: booleanAttribute })\n\n /**\n * Whether the control has been touched. Synced with Angular signal forms.\n *\n * @default false\n */\n readonly touched = model(false)\n\n protected selectedArray = computed(() =>\n resolveItems(this.value(), this.labels()),\n )\n private readonly suggestionElement =\n viewChild<ElementRef<HTMLElement>>('suggestionElement')\n private readonly labels = signal<SuggestionLabels>(new Map())\n private readonly query = signal('')\n protected readonly suggestionList = contentChild(SuggestionList)\n\n constructor() {\n // Runs after render, so projected options are present in the DOM.\n afterRenderEffect(() => {\n this.query()\n this.filter()\n this.suggestionList()?.options()\n this.syncOptions()\n })\n\n // Apply the controlled `selected` input, when bound, to the value model.\n effect(() => {\n const selected = this.selected()\n if (selected === UNSET) return\n\n untracked(() => this.learnLabels(labelEntries(selected)))\n\n const next = toValue(selected)\n if (\n sameValue(\n next,\n untracked(() => this.value()),\n )\n )\n return\n\n untracked(() => this.value.set(next))\n })\n }\n\n protected onSelect(event: Event) {\n const customEvent = event as CustomEvent<HTMLDataElement | undefined>\n customEvent.preventDefault()\n\n const data = customEvent.detail\n if (!data) return\n\n this.learnLabels([[data.value, data.textContent?.trim() || data.value]])\n this.setValue(nextSelected(data, this.value(), this.multiple()))\n }\n\n protected onFocusOut(event: FocusEvent) {\n const suggestionElement = this.suggestionElement()?.nativeElement\n const nextTarget = event.relatedTarget\n\n // Ignore focus changes within the composite widget; only mark touched\n // when focus leaves the suggestion control entirely.\n if (\n suggestionElement &&\n nextTarget instanceof Node &&\n suggestionElement.contains(nextTarget)\n ) {\n return\n }\n\n this.touched.set(true)\n }\n\n protected onInput(event: Event) {\n const inputElement = event.target as HTMLInputElement | null\n this.query.set(inputElement?.value ?? '')\n }\n\n private setValue(value: SuggestionValue) {\n if (sameValue(value, this.value())) return\n\n this.value.set(value)\n this.selectedChange.emit(toSelected(value, this.labels()))\n }\n\n private learnLabels(entries: Iterable<readonly [string, string]>) {\n this.labels.update((current) => {\n let next: Map<string, string> | null = null\n\n for (const [value, label] of entries) {\n if (current.get(value) === label) continue\n\n next ??= new Map(current)\n next.set(value, label)\n }\n\n return next ?? current\n })\n }\n\n private syncOptions() {\n const suggestionElement = this.suggestionElement()?.nativeElement\n if (!suggestionElement) return\n\n const input = suggestionElement.querySelector<HTMLInputElement>('input')\n\n const options = Array.from(\n suggestionElement.querySelectorAll<HTMLOptionElement>(\n 'u-option:not([data-empty])',\n ),\n )\n\n this.learnLabels(\n options.map((option) => [\n option.value,\n option.label ||\n option.text ||\n option.textContent?.trim() ||\n option.value,\n ]),\n )\n\n const filter = this.filter()\n const filterFn = filter === true ? defaultFilter : filter\n\n if (filterFn && input) {\n let index = 0\n for (const option of options) {\n option.disabled = !filterFn({\n index,\n input,\n label: option.label,\n optionElement: option,\n text: option.text,\n value: option.value,\n })\n index++\n }\n } else {\n for (const option of options) {\n option.disabled = false\n }\n }\n\n const visibleOptions = options.filter(\n (option) => !option.disabled && !option.hidden,\n )\n const emptyOption = suggestionElement.querySelector<HTMLOptionElement>(\n 'u-option[data-empty]',\n )\n\n if (!emptyOption) return\n\n if (visibleOptions.length === 0) {\n emptyOption.removeAttribute('hidden')\n return\n }\n\n emptyOption.setAttribute('hidden', '')\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, booleanAttribute, ChangeDetectionStrategy, Component, output } from '@angular/core';
|
|
3
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
4
|
+
|
|
5
|
+
class Table {
|
|
6
|
+
/**
|
|
7
|
+
* Will give the table a hover effect on rows
|
|
8
|
+
* @default false
|
|
9
|
+
*/
|
|
10
|
+
hover = input(false, { ...(ngDevMode ? { debugName: "hover" } : /* istanbul ignore next */ {}), alias: 'data-hover',
|
|
11
|
+
transform: booleanAttribute });
|
|
12
|
+
/**
|
|
13
|
+
* Will give the table a rounded border
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
16
|
+
border = input(false, { ...(ngDevMode ? { debugName: "border" } : /* istanbul ignore next */ {}), alias: 'data-border',
|
|
17
|
+
transform: booleanAttribute });
|
|
18
|
+
/**
|
|
19
|
+
* Will make the table header sticky
|
|
20
|
+
* @default false
|
|
21
|
+
*/
|
|
22
|
+
stickyHeader = input(false, { ...(ngDevMode ? { debugName: "stickyHeader" } : /* istanbul ignore next */ {}), alias: 'data-sticky-header',
|
|
23
|
+
transform: booleanAttribute });
|
|
24
|
+
/**
|
|
25
|
+
* Will give the table zebra striping
|
|
26
|
+
* @default false
|
|
27
|
+
*/
|
|
28
|
+
zebra = input(false, { ...(ngDevMode ? { debugName: "zebra" } : /* istanbul ignore next */ {}), alias: 'data-zebra',
|
|
29
|
+
transform: booleanAttribute });
|
|
30
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: Table, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
31
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.8", type: Table, isStandalone: true, selector: "table[ksd-table]", inputs: { hover: { classPropertyName: "hover", publicName: "data-hover", isSignal: true, isRequired: false, transformFunction: null }, border: { classPropertyName: "border", publicName: "data-border", isSignal: true, isRequired: false, transformFunction: null }, stickyHeader: { classPropertyName: "stickyHeader", publicName: "data-sticky-header", isSignal: true, isRequired: false, transformFunction: null }, zebra: { classPropertyName: "zebra", publicName: "data-zebra", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-hover": "hover() || undefined", "attr.data-border": "border() || undefined", "attr.data-sticky-header": "stickyHeader() || undefined", "attr.data-zebra": "zebra() || undefined" }, classAttribute: "ds-table" }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
32
|
+
}
|
|
33
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: Table, decorators: [{
|
|
34
|
+
type: Component,
|
|
35
|
+
args: [{
|
|
36
|
+
selector: 'table[ksd-table]',
|
|
37
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
38
|
+
template: `<ng-content />`,
|
|
39
|
+
host: {
|
|
40
|
+
class: 'ds-table',
|
|
41
|
+
'[attr.data-hover]': 'hover() || undefined',
|
|
42
|
+
'[attr.data-border]': 'border() || undefined',
|
|
43
|
+
'[attr.data-sticky-header]': 'stickyHeader() || undefined',
|
|
44
|
+
'[attr.data-zebra]': 'zebra() || undefined',
|
|
45
|
+
},
|
|
46
|
+
}]
|
|
47
|
+
}], propDecorators: { hover: [{ type: i0.Input, args: [{ isSignal: true, alias: "data-hover", required: false }] }], border: [{ type: i0.Input, args: [{ isSignal: true, alias: "data-border", required: false }] }], stickyHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "data-sticky-header", required: false }] }], zebra: [{ type: i0.Input, args: [{ isSignal: true, alias: "data-zebra", required: false }] }] } });
|
|
48
|
+
|
|
49
|
+
class TableHeaderCell {
|
|
50
|
+
/**
|
|
51
|
+
* If 'none' | 'ascending' | 'descending' will add a button to the header cell and change aria-sort and icon
|
|
52
|
+
* @default undefined
|
|
53
|
+
*/
|
|
54
|
+
sort = input(undefined, { ...(ngDevMode ? { debugName: "sort" } : /* istanbul ignore next */ {}), alias: 'aria-sort' });
|
|
55
|
+
/**
|
|
56
|
+
* Emitted when the sort button is clicked
|
|
57
|
+
* @emits void
|
|
58
|
+
*/
|
|
59
|
+
sortChange = output();
|
|
60
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: TableHeaderCell, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
61
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: TableHeaderCell, isStandalone: true, selector: "th[ksd-header-cell]", inputs: { sort: { classPropertyName: "sort", publicName: "aria-sort", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sortChange: "sortChange" }, host: { properties: { "attr.aria-sort": "sort()" } }, ngImport: i0, template: `
|
|
62
|
+
@if (sort()) {
|
|
63
|
+
<button
|
|
64
|
+
type="button"
|
|
65
|
+
(click)="sortChange.emit(); $event.stopPropagation()"
|
|
66
|
+
>
|
|
67
|
+
<ng-container *ngTemplateOutlet="headerTitle"></ng-container>
|
|
68
|
+
</button>
|
|
69
|
+
} @else {
|
|
70
|
+
<ng-container *ngTemplateOutlet="headerTitle"></ng-container>
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
<ng-template #headerTitle>
|
|
74
|
+
<ng-content />
|
|
75
|
+
</ng-template>
|
|
76
|
+
`, isInline: true, styles: ["button{padding:var(--dsc-table-padding)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
77
|
+
}
|
|
78
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: TableHeaderCell, decorators: [{
|
|
79
|
+
type: Component,
|
|
80
|
+
args: [{ selector: 'th[ksd-header-cell]', changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
81
|
+
@if (sort()) {
|
|
82
|
+
<button
|
|
83
|
+
type="button"
|
|
84
|
+
(click)="sortChange.emit(); $event.stopPropagation()"
|
|
85
|
+
>
|
|
86
|
+
<ng-container *ngTemplateOutlet="headerTitle"></ng-container>
|
|
87
|
+
</button>
|
|
88
|
+
} @else {
|
|
89
|
+
<ng-container *ngTemplateOutlet="headerTitle"></ng-container>
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
<ng-template #headerTitle>
|
|
93
|
+
<ng-content />
|
|
94
|
+
</ng-template>
|
|
95
|
+
`, imports: [NgTemplateOutlet], host: {
|
|
96
|
+
'[attr.aria-sort]': 'sort()',
|
|
97
|
+
}, styles: ["button{padding:var(--dsc-table-padding)}\n"] }]
|
|
98
|
+
}], propDecorators: { sort: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-sort", required: false }] }], sortChange: [{ type: i0.Output, args: ["sortChange"] }] } });
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Generated bundle index. Do not edit.
|
|
102
|
+
*/
|
|
103
|
+
|
|
104
|
+
export { Table, TableHeaderCell };
|
|
105
|
+
//# sourceMappingURL=ks-digital-designsystem-angular-table.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ks-digital-designsystem-angular-table.mjs","sources":["../../../../packages/angular/table/src/table.ts","../../../../packages/angular/table/src/table-header-cell.ts","../../../../packages/angular/table/src/ks-digital-designsystem-angular-table.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n} from '@angular/core'\n\n@Component({\n selector: 'table[ksd-table]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<ng-content />`,\n host: {\n class: 'ds-table',\n '[attr.data-hover]': 'hover() || undefined',\n '[attr.data-border]': 'border() || undefined',\n '[attr.data-sticky-header]': 'stickyHeader() || undefined',\n '[attr.data-zebra]': 'zebra() || undefined',\n },\n})\nexport class Table {\n /**\n * Will give the table a hover effect on rows\n * @default false\n */\n readonly hover = input(false, {\n alias: 'data-hover',\n transform: booleanAttribute,\n })\n /**\n * Will give the table a rounded border\n * @default false\n */\n readonly border = input(false, {\n alias: 'data-border',\n transform: booleanAttribute,\n })\n /**\n * Will make the table header sticky\n * @default false\n */\n readonly stickyHeader = input(false, {\n alias: 'data-sticky-header',\n transform: booleanAttribute,\n })\n /**\n * Will give the table zebra striping\n * @default false\n */\n readonly zebra = input(false, {\n alias: 'data-zebra',\n transform: booleanAttribute,\n })\n}\n","import { NgTemplateOutlet } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core'\n@Component({\n selector: 'th[ksd-header-cell]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (sort()) {\n <button\n type=\"button\"\n (click)=\"sortChange.emit(); $event.stopPropagation()\"\n >\n <ng-container *ngTemplateOutlet=\"headerTitle\"></ng-container>\n </button>\n } @else {\n <ng-container *ngTemplateOutlet=\"headerTitle\"></ng-container>\n }\n\n <ng-template #headerTitle>\n <ng-content />\n </ng-template>\n `,\n imports: [NgTemplateOutlet],\n host: {\n '[attr.aria-sort]': 'sort()',\n },\n styles: `\n button {\n padding: var(--dsc-table-padding);\n }\n `,\n})\nexport class TableHeaderCell {\n /**\n * If 'none' | 'ascending' | 'descending' will add a button to the header cell and change aria-sort and icon\n * @default undefined\n */\n readonly sort = input<'none' | 'ascending' | 'descending'>(undefined, {\n alias: 'aria-sort',\n })\n /**\n * Emitted when the sort button is clicked\n * @emits void\n */\n readonly sortChange = output()\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|