@ngneers/controls 0.0.1-pre4 → 0.0.1-pre6
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/fesm2022/ngneers-controls-accordion.mjs +32 -32
- package/fesm2022/ngneers-controls-accordion.mjs.map +1 -1
- package/fesm2022/ngneers-controls-api-ng.mjs +19 -19
- package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
- package/fesm2022/ngneers-controls-api-resize.mjs +706 -0
- package/fesm2022/ngneers-controls-api-resize.mjs.map +1 -0
- package/fesm2022/ngneers-controls-avatar.mjs +13 -13
- package/fesm2022/ngneers-controls-avatar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-base.mjs +89 -64
- package/fesm2022/ngneers-controls-base.mjs.map +1 -1
- package/fesm2022/ngneers-controls-breadcrumb.mjs +18 -18
- package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -1
- package/fesm2022/ngneers-controls-button-group.mjs +8 -8
- package/fesm2022/ngneers-controls-button-group.mjs.map +1 -1
- package/fesm2022/ngneers-controls-button.mjs +16 -10
- package/fesm2022/ngneers-controls-button.mjs.map +1 -1
- package/fesm2022/{ngneers-controls-calendar-time-C7UnIFzU.mjs → ngneers-controls-calendar-time-Bzlv9Vkn.mjs} +9 -9
- package/fesm2022/{ngneers-controls-calendar-time-C7UnIFzU.mjs.map → ngneers-controls-calendar-time-Bzlv9Vkn.mjs.map} +1 -1
- package/fesm2022/ngneers-controls-calendar.mjs +54 -54
- package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-checkbox.mjs +9 -9
- package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
- package/fesm2022/ngneers-controls-chip.mjs +6 -6
- package/fesm2022/ngneers-controls-chip.mjs.map +1 -1
- package/fesm2022/ngneers-controls-defer.mjs +10 -10
- package/fesm2022/ngneers-controls-defer.mjs.map +1 -1
- package/fesm2022/ngneers-controls-dialog.mjs +37 -39
- package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
- package/fesm2022/ngneers-controls-directives.mjs +45 -39
- package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
- package/fesm2022/ngneers-controls-drawer.mjs +28 -28
- package/fesm2022/ngneers-controls-drawer.mjs.map +1 -1
- package/fesm2022/ngneers-controls-edit-inplace.mjs +15 -15
- package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-filter.mjs +192 -44
- package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
- package/fesm2022/{ngneers-controls-i18n-de-CdTPeBiR.mjs → ngneers-controls-i18n-de-CF0xTWEX.mjs} +9 -5
- package/fesm2022/ngneers-controls-i18n-de-CF0xTWEX.mjs.map +1 -0
- package/fesm2022/{ngneers-controls-i18n-en-Cfp2pOLY.mjs → ngneers-controls-i18n-en-8B7xAjH2.mjs} +9 -5
- package/fesm2022/ngneers-controls-i18n-en-8B7xAjH2.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n.mjs +5 -5
- package/fesm2022/ngneers-controls-i18n.mjs.map +1 -1
- package/fesm2022/ngneers-controls-icon.mjs +10 -10
- package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
- package/fesm2022/ngneers-controls-inplace.mjs +18 -18
- package/fesm2022/ngneers-controls-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-field.mjs +15 -15
- package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-mask.mjs +8 -8
- package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input.mjs +7 -6
- package/fesm2022/ngneers-controls-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-item-view.mjs +33 -33
- package/fesm2022/ngneers-controls-item-view.mjs.map +1 -1
- package/fesm2022/ngneers-controls-list-box.mjs +31 -31
- package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
- package/fesm2022/ngneers-controls-menu.mjs +32 -32
- package/fesm2022/ngneers-controls-menu.mjs.map +1 -1
- package/fesm2022/ngneers-controls-message.mjs +4 -4
- package/fesm2022/ngneers-controls-message.mjs.map +1 -1
- package/fesm2022/ngneers-controls-paginator.mjs +12 -12
- package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
- package/fesm2022/ngneers-controls-popover.mjs +13 -13
- package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
- package/fesm2022/ngneers-controls-progress.mjs +16 -16
- package/fesm2022/ngneers-controls-progress.mjs.map +1 -1
- package/fesm2022/ngneers-controls-scroller.mjs +74 -39
- package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select-button.mjs +6 -6
- package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select.mjs +46 -46
- package/fesm2022/ngneers-controls-select.mjs.map +1 -1
- package/fesm2022/ngneers-controls-slider.mjs +12 -12
- package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
- package/fesm2022/ngneers-controls-spinner.mjs +7 -7
- package/fesm2022/ngneers-controls-spinner.mjs.map +1 -1
- package/fesm2022/ngneers-controls-splitter.mjs +141 -328
- package/fesm2022/ngneers-controls-splitter.mjs.map +1 -1
- package/fesm2022/ngneers-controls-switch.mjs +3 -3
- package/fesm2022/ngneers-controls-table.mjs +1520 -80
- package/fesm2022/ngneers-controls-table.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tabs.mjs +40 -39
- package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tag.mjs +4 -4
- package/fesm2022/ngneers-controls-tag.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toast.mjs +18 -18
- package/fesm2022/ngneers-controls-toast.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toggle-button.mjs +9 -9
- package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tooltip.mjs +37 -45
- package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
- package/fesm2022/ngneers-controls-utils-ng.mjs +9 -9
- package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -1
- package/package.json +14 -10
- package/types/ngneers-controls-api-ng.d.ts +2 -2
- package/types/ngneers-controls-api-resize.d.ts +318 -0
- package/types/ngneers-controls-base.d.ts +8 -0
- package/types/ngneers-controls-breadcrumb.d.ts +1 -1
- package/types/ngneers-controls-button.d.ts +13 -8
- package/types/ngneers-controls-calendar.d.ts +5 -1
- package/types/ngneers-controls-checkbox.d.ts +1 -1
- package/types/ngneers-controls-directives.d.ts +7 -1
- package/types/ngneers-controls-drawer.d.ts +4 -0
- package/types/ngneers-controls-edit-inplace.d.ts +4 -0
- package/types/ngneers-controls-filter.d.ts +53 -4
- package/types/ngneers-controls-i18n.d.ts +4 -0
- package/types/ngneers-controls-icon.d.ts +1 -1
- package/types/ngneers-controls-input-field.d.ts +4 -0
- package/types/ngneers-controls-input.d.ts +1 -1
- package/types/ngneers-controls-list-box.d.ts +5 -1
- package/types/ngneers-controls-menu.d.ts +1 -1
- package/types/ngneers-controls-paginator.d.ts +4 -0
- package/types/ngneers-controls-popover.d.ts +1 -1
- package/types/ngneers-controls-scroller.d.ts +12 -2
- package/types/ngneers-controls-select.d.ts +6 -2
- package/types/ngneers-controls-spinner.d.ts +1 -1
- package/types/ngneers-controls-splitter.d.ts +29 -59
- package/types/ngneers-controls-table.d.ts +392 -24
- package/types/ngneers-controls-toast.d.ts +1 -1
- package/types/ngneers-controls-tooltip.d.ts +1 -7
- package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs.map +0 -1
- package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs.map +0 -1
|
@@ -17,60 +17,60 @@ import { selectControlTemplate } from '@ngneers/controls-themes/templates/select
|
|
|
17
17
|
class SelectTemplates extends ValueControlBase {
|
|
18
18
|
// Item template
|
|
19
19
|
_defaultItemTemplate = viewChild.required('defaultItemTemplate');
|
|
20
|
-
_userItemTemplate = contentChild('item', ...(ngDevMode ? [{ debugName: "_userItemTemplate" }] : []));
|
|
20
|
+
_userItemTemplate = contentChild('item', ...(ngDevMode ? [{ debugName: "_userItemTemplate" }] : /* istanbul ignore next */ []));
|
|
21
21
|
/**
|
|
22
22
|
* Set a custom template for an item of the select control.
|
|
23
23
|
* Can also be set using an `<ng-template>` element with `#item` template reference variable.
|
|
24
24
|
*/
|
|
25
|
-
templateItem = input(null, ...(ngDevMode ? [{ debugName: "templateItem" }] : []));
|
|
26
|
-
itemTemplate = computed(() => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate(), ...(ngDevMode ? [{ debugName: "itemTemplate" }] : []));
|
|
25
|
+
templateItem = input(null, ...(ngDevMode ? [{ debugName: "templateItem" }] : /* istanbul ignore next */ []));
|
|
26
|
+
itemTemplate = computed(() => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate(), ...(ngDevMode ? [{ debugName: "itemTemplate" }] : /* istanbul ignore next */ []));
|
|
27
27
|
// Selected item template
|
|
28
28
|
_defaultSelectedItemTemplate = viewChild.required('defaultSelectedItemTemplate');
|
|
29
|
-
_userSelectedItemTemplate = contentChild('selectedItem', ...(ngDevMode ? [{ debugName: "_userSelectedItemTemplate" }] : []));
|
|
29
|
+
_userSelectedItemTemplate = contentChild('selectedItem', ...(ngDevMode ? [{ debugName: "_userSelectedItemTemplate" }] : /* istanbul ignore next */ []));
|
|
30
30
|
/**
|
|
31
31
|
* Set a custom template for the selected item of the select control.
|
|
32
32
|
* Can also be set using an `<ng-template>` element with `#selectedItem` template reference variable.
|
|
33
33
|
*/
|
|
34
|
-
templateSelectedItem = input(null, ...(ngDevMode ? [{ debugName: "templateSelectedItem" }] : []));
|
|
34
|
+
templateSelectedItem = input(null, ...(ngDevMode ? [{ debugName: "templateSelectedItem" }] : /* istanbul ignore next */ []));
|
|
35
35
|
selectedItemTemplate = computed(() => this._userSelectedItemTemplate() ??
|
|
36
36
|
this.templateSelectedItem() ??
|
|
37
|
-
this._defaultSelectedItemTemplate(), ...(ngDevMode ? [{ debugName: "selectedItemTemplate" }] : []));
|
|
37
|
+
this._defaultSelectedItemTemplate(), ...(ngDevMode ? [{ debugName: "selectedItemTemplate" }] : /* istanbul ignore next */ []));
|
|
38
38
|
// Selected items template
|
|
39
39
|
_defaultSelectedItemsTemplate = viewChild.required('defaultSelectedItemsTemplate');
|
|
40
|
-
_userSelectedItemsTemplate = contentChild('selectedItems', ...(ngDevMode ? [{ debugName: "_userSelectedItemsTemplate" }] : []));
|
|
40
|
+
_userSelectedItemsTemplate = contentChild('selectedItems', ...(ngDevMode ? [{ debugName: "_userSelectedItemsTemplate" }] : /* istanbul ignore next */ []));
|
|
41
41
|
/**
|
|
42
42
|
* Set a custom template for the selected items of the select control if {@link multiple} is `true`.
|
|
43
43
|
* Can also be set using an `<ng-template>` element with `#selectedItems` template reference variable.
|
|
44
44
|
*/
|
|
45
|
-
templateSelectedItems = input(null, ...(ngDevMode ? [{ debugName: "templateSelectedItems" }] : []));
|
|
45
|
+
templateSelectedItems = input(null, ...(ngDevMode ? [{ debugName: "templateSelectedItems" }] : /* istanbul ignore next */ []));
|
|
46
46
|
selectedItemsTemplate = computed(() => this._userSelectedItemsTemplate() ??
|
|
47
47
|
this.templateSelectedItems() ??
|
|
48
|
-
this._defaultSelectedItemsTemplate(), ...(ngDevMode ? [{ debugName: "selectedItemsTemplate" }] : []));
|
|
48
|
+
this._defaultSelectedItemsTemplate(), ...(ngDevMode ? [{ debugName: "selectedItemsTemplate" }] : /* istanbul ignore next */ []));
|
|
49
49
|
// Group template
|
|
50
50
|
_defaultGroupTemplate = viewChild.required('defaultGroupTemplate');
|
|
51
|
-
_userGroupTemplate = contentChild('group', ...(ngDevMode ? [{ debugName: "_userGroupTemplate" }] : []));
|
|
51
|
+
_userGroupTemplate = contentChild('group', ...(ngDevMode ? [{ debugName: "_userGroupTemplate" }] : /* istanbul ignore next */ []));
|
|
52
52
|
/**
|
|
53
53
|
* Set a custom template for a group in the select control.
|
|
54
54
|
* Can also be set using an `<ng-template>` element with `#group` template reference variable.
|
|
55
55
|
*/
|
|
56
|
-
templateGroup = input(null, ...(ngDevMode ? [{ debugName: "templateGroup" }] : []));
|
|
57
|
-
groupTemplate = computed(() => this._userGroupTemplate() ?? this.templateGroup() ?? this._defaultGroupTemplate(), ...(ngDevMode ? [{ debugName: "groupTemplate" }] : []));
|
|
56
|
+
templateGroup = input(null, ...(ngDevMode ? [{ debugName: "templateGroup" }] : /* istanbul ignore next */ []));
|
|
57
|
+
groupTemplate = computed(() => this._userGroupTemplate() ?? this.templateGroup() ?? this._defaultGroupTemplate(), ...(ngDevMode ? [{ debugName: "groupTemplate" }] : /* istanbul ignore next */ []));
|
|
58
58
|
// No items template
|
|
59
|
-
_userNoItemsTemplate = contentChild('noItems', ...(ngDevMode ? [{ debugName: "_userNoItemsTemplate" }] : []));
|
|
59
|
+
_userNoItemsTemplate = contentChild('noItems', ...(ngDevMode ? [{ debugName: "_userNoItemsTemplate" }] : /* istanbul ignore next */ []));
|
|
60
60
|
/**
|
|
61
61
|
* Set a custom template for the no items state of the select control.
|
|
62
62
|
* Can also be set using an `<ng-template>` element with `#noItems` template reference variable.
|
|
63
63
|
*/
|
|
64
|
-
templateNoItems = input(null, ...(ngDevMode ? [{ debugName: "templateNoItems" }] : []));
|
|
65
|
-
noItemsTemplate = computed(() => this._userNoItemsTemplate() ?? this.templateNoItems(), ...(ngDevMode ? [{ debugName: "noItemsTemplate" }] : []));
|
|
64
|
+
templateNoItems = input(null, ...(ngDevMode ? [{ debugName: "templateNoItems" }] : /* istanbul ignore next */ []));
|
|
65
|
+
noItemsTemplate = computed(() => this._userNoItemsTemplate() ?? this.templateNoItems(), ...(ngDevMode ? [{ debugName: "noItemsTemplate" }] : /* istanbul ignore next */ []));
|
|
66
66
|
/**
|
|
67
67
|
* Types for the dialog templates.
|
|
68
68
|
*/
|
|
69
69
|
templateTypes = templateTypesFn();
|
|
70
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
71
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.
|
|
70
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: SelectTemplates, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
71
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.2", type: SelectTemplates, isStandalone: true, inputs: { templateItem: { classPropertyName: "templateItem", publicName: "templateItem", isSignal: true, isRequired: false, transformFunction: null }, templateSelectedItem: { classPropertyName: "templateSelectedItem", publicName: "templateSelectedItem", isSignal: true, isRequired: false, transformFunction: null }, templateSelectedItems: { classPropertyName: "templateSelectedItems", publicName: "templateSelectedItems", isSignal: true, isRequired: false, transformFunction: null }, templateGroup: { classPropertyName: "templateGroup", publicName: "templateGroup", isSignal: true, isRequired: false, transformFunction: null }, templateNoItems: { classPropertyName: "templateNoItems", publicName: "templateNoItems", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "_userItemTemplate", first: true, predicate: ["item"], descendants: true, isSignal: true }, { propertyName: "_userSelectedItemTemplate", first: true, predicate: ["selectedItem"], descendants: true, isSignal: true }, { propertyName: "_userSelectedItemsTemplate", first: true, predicate: ["selectedItems"], descendants: true, isSignal: true }, { propertyName: "_userGroupTemplate", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "_userNoItemsTemplate", first: true, predicate: ["noItems"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_defaultItemTemplate", first: true, predicate: ["defaultItemTemplate"], descendants: true, isSignal: true }, { propertyName: "_defaultSelectedItemTemplate", first: true, predicate: ["defaultSelectedItemTemplate"], descendants: true, isSignal: true }, { propertyName: "_defaultSelectedItemsTemplate", first: true, predicate: ["defaultSelectedItemsTemplate"], descendants: true, isSignal: true }, { propertyName: "_defaultGroupTemplate", first: true, predicate: ["defaultGroupTemplate"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0 });
|
|
72
72
|
}
|
|
73
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
73
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: SelectTemplates, decorators: [{
|
|
74
74
|
type: Directive
|
|
75
75
|
}], propDecorators: { _defaultItemTemplate: [{ type: i0.ViewChild, args: ['defaultItemTemplate', { isSignal: true }] }], _userItemTemplate: [{ type: i0.ContentChild, args: ['item', { isSignal: true }] }], templateItem: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateItem", required: false }] }], _defaultSelectedItemTemplate: [{ type: i0.ViewChild, args: ['defaultSelectedItemTemplate', { isSignal: true }] }], _userSelectedItemTemplate: [{ type: i0.ContentChild, args: ['selectedItem', { isSignal: true }] }], templateSelectedItem: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateSelectedItem", required: false }] }], _defaultSelectedItemsTemplate: [{ type: i0.ViewChild, args: ['defaultSelectedItemsTemplate', { isSignal: true }] }], _userSelectedItemsTemplate: [{ type: i0.ContentChild, args: ['selectedItems', { isSignal: true }] }], templateSelectedItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateSelectedItems", required: false }] }], _defaultGroupTemplate: [{ type: i0.ViewChild, args: ['defaultGroupTemplate', { isSignal: true }] }], _userGroupTemplate: [{ type: i0.ContentChild, args: ['group', { isSignal: true }] }], templateGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateGroup", required: false }] }], _userNoItemsTemplate: [{ type: i0.ContentChild, args: ['noItems', { isSignal: true }] }], templateNoItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateNoItems", required: false }] }] } });
|
|
76
76
|
|
|
@@ -81,12 +81,12 @@ class NgnSelect extends SelectTemplates {
|
|
|
81
81
|
theme = this.injectThemeTemplate(selectControlTemplate, 'root');
|
|
82
82
|
i18n = inject(I18n).translations;
|
|
83
83
|
_popover = viewChild.required(NgnPopover);
|
|
84
|
-
_customEditableInput = contentChild(NgnInput, ...(ngDevMode ? [{ debugName: "_customEditableInput" }] : []));
|
|
84
|
+
_customEditableInput = contentChild(NgnInput, ...(ngDevMode ? [{ debugName: "_customEditableInput" }] : /* istanbul ignore next */ []));
|
|
85
85
|
_customEditableSub;
|
|
86
86
|
/**
|
|
87
87
|
* Options for the popover.
|
|
88
88
|
*/
|
|
89
|
-
popoverOptions = input({}, ...(ngDevMode ? [{ debugName: "popoverOptions" }] : []));
|
|
89
|
+
popoverOptions = input({}, ...(ngDevMode ? [{ debugName: "popoverOptions" }] : /* istanbul ignore next */ []));
|
|
90
90
|
appliedPopoverOptions = computed(() => deepMerge({
|
|
91
91
|
sizeConstraints: {
|
|
92
92
|
width: 1,
|
|
@@ -94,40 +94,40 @@ class NgnSelect extends SelectTemplates {
|
|
|
94
94
|
minHeight: '250px',
|
|
95
95
|
maxHeight: '700px',
|
|
96
96
|
},
|
|
97
|
-
}, this.popoverOptions()), ...(ngDevMode ? [{ debugName: "appliedPopoverOptions" }] : []));
|
|
97
|
+
}, this.popoverOptions()), ...(ngDevMode ? [{ debugName: "appliedPopoverOptions" }] : /* istanbul ignore next */ []));
|
|
98
98
|
/**
|
|
99
99
|
* The available options to choose from. They can either be
|
|
100
100
|
* * A list of {@link NgnItem} objects
|
|
101
101
|
* * A list of plain objects. You'll have to provide a {@link fields} input to specify how to map the plain objects to {@link NgnItem} objects.
|
|
102
102
|
*/
|
|
103
|
-
options = input([], ...(ngDevMode ? [{ debugName: "options" }] : []));
|
|
103
|
+
options = input([], ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
|
|
104
104
|
/**
|
|
105
105
|
* Accepts a boolean value that determines whether the filter is enabled.
|
|
106
106
|
* Alternatively, you can provide `SelectFilterOptions` to customize the filter behavior.
|
|
107
107
|
* @default `false`
|
|
108
108
|
*/
|
|
109
|
-
filter = input(false, ...(ngDevMode ? [{ debugName: "filter" }] : []));
|
|
109
|
+
filter = input(false, ...(ngDevMode ? [{ debugName: "filter" }] : /* istanbul ignore next */ []));
|
|
110
110
|
/**
|
|
111
111
|
* Manually set the filter text.
|
|
112
112
|
*/
|
|
113
|
-
filterText = input(null, ...(ngDevMode ? [{ debugName: "filterText" }] : []));
|
|
113
|
+
filterText = input(null, ...(ngDevMode ? [{ debugName: "filterText" }] : /* istanbul ignore next */ []));
|
|
114
114
|
/**
|
|
115
115
|
* The icon to display in the filter input.
|
|
116
116
|
*/
|
|
117
|
-
filterIcon = input(...(ngDevMode ? [undefined, { debugName: "filterIcon" }] : []));
|
|
117
|
+
filterIcon = input(...(ngDevMode ? [undefined, { debugName: "filterIcon" }] : /* istanbul ignore next */ []));
|
|
118
118
|
/**
|
|
119
119
|
* The icon to display in the dropdown.
|
|
120
120
|
*/
|
|
121
|
-
dropdownIcon = input(...(ngDevMode ? [undefined, { debugName: "dropdownIcon" }] : []));
|
|
121
|
+
dropdownIcon = input(...(ngDevMode ? [undefined, { debugName: "dropdownIcon" }] : /* istanbul ignore next */ []));
|
|
122
122
|
/**
|
|
123
123
|
* Whether the select is virtualized.
|
|
124
124
|
* @default `false`
|
|
125
125
|
*/
|
|
126
|
-
virtual = input(false, { ...(ngDevMode ? { debugName: "virtual" } : {}), transform: booleanAttribute });
|
|
126
|
+
virtual = input(false, { ...(ngDevMode ? { debugName: "virtual" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
127
127
|
/**
|
|
128
128
|
* When {@link virtual} is enabled, this property defines the height of each item in the list.
|
|
129
129
|
*/
|
|
130
|
-
itemHeight = input(...(ngDevMode ? [undefined, { debugName: "itemHeight" }] : []));
|
|
130
|
+
itemHeight = input(...(ngDevMode ? [undefined, { debugName: "itemHeight" }] : /* istanbul ignore next */ []));
|
|
131
131
|
/**
|
|
132
132
|
* Enable this to allow the user to type in a value that is not in the list.
|
|
133
133
|
* When enabled, the value of the control becomes the label of a selected item or the typed value.
|
|
@@ -138,12 +138,12 @@ class NgnSelect extends SelectTemplates {
|
|
|
138
138
|
*
|
|
139
139
|
* @default `false`
|
|
140
140
|
*/
|
|
141
|
-
editable = input(...(ngDevMode ? [undefined, { debugName: "editable" }] : []));
|
|
141
|
+
editable = input(...(ngDevMode ? [undefined, { debugName: "editable" }] : /* istanbul ignore next */ []));
|
|
142
142
|
/**
|
|
143
143
|
* Whether to automatically filter the options based on the user's input in the {@link editable} input.
|
|
144
144
|
* @default `true`
|
|
145
145
|
*/
|
|
146
|
-
editableAutoFilter = input(true, { ...(ngDevMode ? { debugName: "editableAutoFilter" } : {}), transform: booleanAttribute });
|
|
146
|
+
editableAutoFilter = input(true, { ...(ngDevMode ? { debugName: "editableAutoFilter" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
147
147
|
/**
|
|
148
148
|
* Enable this to allow the user to select multiple values.
|
|
149
149
|
* When enabled, the value of the control becomes an array of selected items.
|
|
@@ -151,39 +151,39 @@ class NgnSelect extends SelectTemplates {
|
|
|
151
151
|
* This is only applicable when {@link editable} is `false`.
|
|
152
152
|
* @default `false`
|
|
153
153
|
*/
|
|
154
|
-
multiple = input(...(ngDevMode ? [undefined, { debugName: "multiple" }] : []));
|
|
154
|
+
multiple = input(...(ngDevMode ? [undefined, { debugName: "multiple" }] : /* istanbul ignore next */ []));
|
|
155
155
|
/**
|
|
156
156
|
* Whether to scroll to the selected item when the dropdown is opened.
|
|
157
157
|
* @default `true`
|
|
158
158
|
*/
|
|
159
|
-
scrollToSelectedItemOnOpen = input(true, ...(ngDevMode ? [{ debugName: "scrollToSelectedItemOnOpen" }] : []));
|
|
159
|
+
scrollToSelectedItemOnOpen = input(true, ...(ngDevMode ? [{ debugName: "scrollToSelectedItemOnOpen" }] : /* istanbul ignore next */ []));
|
|
160
160
|
/**
|
|
161
161
|
* Tabindex for the select control.
|
|
162
162
|
* @default `0`
|
|
163
163
|
*/
|
|
164
|
-
tabindex = input(0, ...(ngDevMode ? [{ debugName: "tabindex" }] : []));
|
|
164
|
+
tabindex = input(0, ...(ngDevMode ? [{ debugName: "tabindex" }] : /* istanbul ignore next */ []));
|
|
165
165
|
/**
|
|
166
166
|
* Whether to use a checkbox to indicate selection state.
|
|
167
167
|
*
|
|
168
168
|
* This option is true per default when {@link multiple} is `true`.
|
|
169
169
|
* @default multiple()
|
|
170
170
|
*/
|
|
171
|
-
checkbox = input(...(ngDevMode ? [undefined, { debugName: "checkbox" }] : []));
|
|
171
|
+
checkbox = input(...(ngDevMode ? [undefined, { debugName: "checkbox" }] : /* istanbul ignore next */ []));
|
|
172
172
|
maybeCallback = maybeCallback;
|
|
173
|
-
_listbox = viewChild(NgnListBox, ...(ngDevMode ? [{ debugName: "_listbox" }] : []));
|
|
173
|
+
_listbox = viewChild(NgnListBox, ...(ngDevMode ? [{ debugName: "_listbox" }] : /* istanbul ignore next */ []));
|
|
174
174
|
_userChangedEditableInput = false;
|
|
175
|
-
filterTextInternal = linkedSignal(this.filterText, ...(ngDevMode ? [{ debugName: "filterTextInternal" }] : []));
|
|
176
|
-
currentHighlightedValue = signal(null, ...(ngDevMode ? [{ debugName: "currentHighlightedValue" }] : []));
|
|
175
|
+
filterTextInternal = linkedSignal(this.filterText, ...(ngDevMode ? [{ debugName: "filterTextInternal" }] : /* istanbul ignore next */ []));
|
|
176
|
+
currentHighlightedValue = signal(null, ...(ngDevMode ? [{ debugName: "currentHighlightedValue" }] : /* istanbul ignore next */ []));
|
|
177
177
|
valueStr = computed(() => {
|
|
178
178
|
const v = this.value();
|
|
179
179
|
return typeof v === 'string' ? v : null;
|
|
180
|
-
}, ...(ngDevMode ? [{ debugName: "valueStr" }] : []));
|
|
180
|
+
}, ...(ngDevMode ? [{ debugName: "valueStr" }] : /* istanbul ignore next */ []));
|
|
181
181
|
valueArray = computed(() => {
|
|
182
182
|
const v = this.value();
|
|
183
183
|
return Array.isArray(v) ? v : v ? [v] : [];
|
|
184
|
-
}, ...(ngDevMode ? [{ debugName: "valueArray" }] : []));
|
|
185
|
-
appliedFilter = computed(() => this.filter() || this.editable() || false, ...(ngDevMode ? [{ debugName: "appliedFilter" }] : []));
|
|
186
|
-
_flatOptions = computed(() => mapToItems(this.options()), ...(ngDevMode ? [{ debugName: "_flatOptions" }] : []));
|
|
184
|
+
}, ...(ngDevMode ? [{ debugName: "valueArray" }] : /* istanbul ignore next */ []));
|
|
185
|
+
appliedFilter = computed(() => this.filter() || this.editable() || false, ...(ngDevMode ? [{ debugName: "appliedFilter" }] : /* istanbul ignore next */ []));
|
|
186
|
+
_flatOptions = computed(() => mapToItems(this.options()), ...(ngDevMode ? [{ debugName: "_flatOptions" }] : /* istanbul ignore next */ []));
|
|
187
187
|
selectedItems = computed(() => {
|
|
188
188
|
if (this.editable()) {
|
|
189
189
|
return [this._flatOptions().find(option => option.label === this.value())];
|
|
@@ -191,8 +191,8 @@ class NgnSelect extends SelectTemplates {
|
|
|
191
191
|
else {
|
|
192
192
|
return this.valueArray().map(value => this._flatOptions().find(option => option.value === value));
|
|
193
193
|
}
|
|
194
|
-
}, ...(ngDevMode ? [{ debugName: "selectedItems" }] : []));
|
|
195
|
-
selectedItemsValues = computed(() => this.selectedItems().map(item => item?.value), ...(ngDevMode ? [{ debugName: "selectedItemsValues" }] : []));
|
|
194
|
+
}, ...(ngDevMode ? [{ debugName: "selectedItems" }] : /* istanbul ignore next */ []));
|
|
195
|
+
selectedItemsValues = computed(() => this.selectedItems().map(item => item?.value), ...(ngDevMode ? [{ debugName: "selectedItemsValues" }] : /* istanbul ignore next */ []));
|
|
196
196
|
constructor() {
|
|
197
197
|
super();
|
|
198
198
|
effect(() => {
|
|
@@ -337,10 +337,10 @@ class NgnSelect extends SelectTemplates {
|
|
|
337
337
|
this.touched.set(true);
|
|
338
338
|
});
|
|
339
339
|
}
|
|
340
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
341
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
340
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnSelect, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
341
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.2", type: NgnSelect, isStandalone: true, selector: "ngn-select", inputs: { popoverOptions: { classPropertyName: "popoverOptions", publicName: "popoverOptions", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, filterText: { classPropertyName: "filterText", publicName: "filterText", isSignal: true, isRequired: false, transformFunction: null }, filterIcon: { classPropertyName: "filterIcon", publicName: "filterIcon", isSignal: true, isRequired: false, transformFunction: null }, dropdownIcon: { classPropertyName: "dropdownIcon", publicName: "dropdownIcon", isSignal: true, isRequired: false, transformFunction: null }, virtual: { classPropertyName: "virtual", publicName: "virtual", isSignal: true, isRequired: false, transformFunction: null }, itemHeight: { classPropertyName: "itemHeight", publicName: "itemHeight", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, editableAutoFilter: { classPropertyName: "editableAutoFilter", publicName: "editableAutoFilter", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, scrollToSelectedItemOnOpen: { classPropertyName: "scrollToSelectedItemOnOpen", publicName: "scrollToSelectedItemOnOpen", isSignal: true, isRequired: false, transformFunction: null }, tabindex: { classPropertyName: "tabindex", publicName: "tabindex", isSignal: true, isRequired: false, transformFunction: null }, checkbox: { classPropertyName: "checkbox", publicName: "checkbox", isSignal: true, isRequired: false, transformFunction: null } }, host: { styleAttribute: "display: block;" }, providers: [provideSelf(NgnSelect)], queries: [{ propertyName: "_customEditableInput", first: true, predicate: NgnInput, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_popover", first: true, predicate: NgnPopover, descendants: true, isSignal: true }, { propertyName: "_listbox", first: true, predicate: NgnListBox, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<ngn-input-field\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n input: true,\r\n 'input-editable': editable(),\r\n }\"\r\n (click)=\"show()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n #field\r\n [label]=\"label()\"\r\n [labelledBy]=\"labelledBy()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n [readonly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n [tabindex]=\"editable() || disabled() ? -1 : tabindex()\"\r\n (focusout)=\"potentiallyBlurred()\"\r\n>\r\n @if (editable()) {\r\n <ng-content select=\"[ngnInput]\">\r\n <input\r\n ngnInput\r\n autocomplete=\"list\"\r\n [aria-expanded]=\"popover.open()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-controls]=\"inputId() + '_listbox'\"\r\n [id]=\"inputId()\"\r\n [value]=\"valueStr() || ''\"\r\n (valueChange)=\"onEditableChange($event)\"\r\n [readOnly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </ng-content>\r\n } @else {\r\n <div\r\n role=\"combobox\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'combobox'\"\r\n [aria-expanded]=\"popover.open()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-controls]=\"inputId() + '_listbox'\"\r\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\r\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\r\n [attr.disabled]=\"disabled() ? '' : null\"\r\n [id]=\"inputId()\"\r\n >\r\n @if (multiple()) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"selectedItemsTemplate()\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: selectedItems(),\r\n }\"\r\n />\r\n } @else {\r\n <ng-container\r\n [ngTemplateOutlet]=\"selectedItemTemplate()\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: selectedItems()[0],\r\n }\"\r\n />\r\n }\r\n </div>\r\n }\r\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'icon'\" [icon]=\"dropdownIcon()\" defaultIcon=\"chevron_down\" />\r\n</ngn-input-field>\r\n<ngn-popover\r\n #popover\r\n [options]=\"appliedPopoverOptions()\"\r\n [anchor]=\"field.element.nativeElement\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (closed)=\"onPopoverClosed()\"\r\n [id]=\"inputId() + '_popover'\"\r\n [hasShrinkableContent]=\"true\"\r\n>\r\n <ng-template #lazy>\r\n <div [ptInt]=\"this\" [ptClass]=\"'popover-content'\">\r\n @if (filter()) {\r\n <ngn-input-field [ptInt]=\"this\" [ptClass]=\"'filter'\">\r\n <input\r\n ngnInput\r\n [value]=\"filterTextInternal()\"\r\n (valueChange)=\"filterTextInternal.set($event)\"\r\n />\r\n <ngn-icon\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'filter-icon'\"\r\n defaultIcon=\"magnifying_glass\"\r\n [icon]=\"filterIcon()\"\r\n />\r\n </ngn-input-field>\r\n }\r\n <ngn-list-box\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n 'list-box': true,\r\n }\"\r\n style=\"height: 100%; min-height: 0\"\r\n [focussable]=\"false\"\r\n [selectable]=\"true\"\r\n [filter]=\"appliedFilter()\"\r\n [filterText]=\"filterTextInternal()\"\r\n [items]=\"options()\"\r\n [itemHeight]=\"itemHeight()\"\r\n [virtual]=\"virtual()\"\r\n [templateItem]=\"itemTemplate()\"\r\n [templateGroup]=\"groupTemplate()\"\r\n [multiple]=\"multiple()\"\r\n [value]=\"multiple() ? selectedItemsValues() : selectedItemsValues()[0]\"\r\n [scrollToSelectedItemOnInit]=\"scrollToSelectedItemOnOpen()\"\r\n (valueChange)=\"onSelect($event)\"\r\n (itemClicked)=\"onItemClicked()\"\r\n [inputId]=\"inputId() + '_listbox'\"\r\n [templateEmpty]=\"noItemsTemplate()\"\r\n [checkbox]=\"checkbox()\"\r\n />\r\n </div>\r\n </ng-template>\r\n</ngn-popover>\r\n\r\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n <span [attr.data-testid]=\"item?.testId\">\r\n @let label = item?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultGroupTemplate [ngnTemplate]=\"templateTypes.item\" let-group>\r\n <span [attr.data-testid]=\"group?.testId\">\r\n @let label = group?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"group?.testId\">{{ maybeCallback(label) }}</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n @let label = item?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\r\n } @else {\r\n <span [attr.data-testid]=\"item?.testId\">​</span>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemsTemplate [ngnTemplate]=\"templateTypes.selectedItems\" let-items>\r\n <ngn-item-view\r\n #itemView\r\n [items]=\"items\"\r\n [idField]=\"'value'\"\r\n [separator]=\"true\"\r\n style=\"margin-right: 8px\"\r\n >\r\n <ng-template #item let-item [ngnTemplate]=\"itemView.templateTypes.item\">\r\n <ng-container\r\n *ngTemplateOutlet=\"selectedItemTemplate(); context: { $implicit: item }\"\r\n ></ng-container>\r\n </ng-template>\r\n </ngn-item-view>\r\n @if (items.length < 1) {\r\n ​\r\n }\r\n</ng-template>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "component", type: NgnInputField, selector: "ngn-input-field", inputs: ["label", "labelledBy", "labelKind", "inputId", "showClearButton", "iconClearButton", "tabindex", "invalid", "readonly", "disabled"] }, { kind: "component", type: NgnListBox, selector: "ngn-list-box", inputs: ["items", "scrollToSelectedItemOnInit", "selectable", "selectOnHover", "focussable", "virtual", "itemHeight", "multiple", "checkbox", "filter", "filterText"], outputs: ["itemClicked"] }, { kind: "component", type: NgnPopover, selector: "ngn-popover", inputs: ["open", "anchor", "options", "hasShrinkableContent", "closeBy"], outputs: ["closed", "closing", "openChange"] }, { kind: "directive", type: NgnInput, selector: "input[ngnInput], textarea[ngnInput]", inputs: ["invalid", "value"], outputs: ["valueChange"], exportAs: ["ngnInput"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgnTemplate, selector: "ng-template[ngnTemplate]", inputs: ["ngnTemplate"] }, { kind: "component", type: NgnItemView, selector: "ngn-item-view", inputs: ["idField", "items", "separator", "iconItemSeparator", "overflowStrategy", "overflowStrategyFreezeCount", "overflowStrategyIndex", "sameWidthItems"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
342
342
|
}
|
|
343
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
343
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnSelect, decorators: [{
|
|
344
344
|
type: Component,
|
|
345
345
|
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-select', imports: [
|
|
346
346
|
NgnPt,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-select.mjs","sources":["../../src/select/select-templates.ts","../../src/select/select.ts","../../src/select/select.html","../../src/select/ngneers-controls-select.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { ValueControlBase } from '@ngneers/controls/base';\r\n\r\nimport type { NgnItem } from '@ngneers/controls/api';\r\nimport type { InputGeneric } from '@ngneers/controls/utils';\r\n\r\n/**\r\n * This type determines the value type for the select control.\r\n * * If `multiple` is true, the value is an array of items: `T[K][]`.\r\n * * If `editable` is true, the value is a `string`.\r\n * * If neither is true, the value is the item's value type `T[K]`.\r\n */\r\nexport type ValueType<V, Editable extends boolean, Multiple extends boolean> =\r\n InputGeneric<Multiple, false> extends true\r\n ? V[]\r\n : InputGeneric<Editable, false> extends true\r\n ? string\r\n : V;\r\n\r\n@Directive()\r\nexport abstract class SelectTemplates<\r\n V,\r\n Editable extends boolean,\r\n Multiple extends boolean,\r\n> extends ValueControlBase<'select', ValueType<V, Editable, Multiple> | null> {\r\n // Item template\r\n private readonly _defaultItemTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultItemTemplate');\r\n private readonly _userItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\r\n /**\r\n * Set a custom template for an item of the select control.\r\n * Can also be set using an `<ng-template>` element with `#item` template reference variable.\r\n */\r\n public readonly templateItem = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n protected readonly itemTemplate = computed(\r\n () => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate()\r\n );\r\n\r\n // Selected item template\r\n private readonly _defaultSelectedItemTemplate = viewChild.required<\r\n TemplateRef<typeof this.templateTypes.item>\r\n >('defaultSelectedItemTemplate');\r\n private readonly _userSelectedItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('selectedItem');\r\n /**\r\n * Set a custom template for the selected item of the select control.\r\n * Can also be set using an `<ng-template>` element with `#selectedItem` template reference variable.\r\n */\r\n public readonly templateSelectedItem = input<TemplateRef<typeof this.templateTypes.item> | null>(\r\n null\r\n );\r\n protected readonly selectedItemTemplate = computed(\r\n () =>\r\n this._userSelectedItemTemplate() ??\r\n this.templateSelectedItem() ??\r\n this._defaultSelectedItemTemplate()\r\n );\r\n\r\n // Selected items template\r\n private readonly _defaultSelectedItemsTemplate = viewChild.required<\r\n TemplateRef<typeof this.templateTypes.selectedItems>\r\n >('defaultSelectedItemsTemplate');\r\n private readonly _userSelectedItemsTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.selectedItems>>('selectedItems');\r\n /**\r\n * Set a custom template for the selected items of the select control if {@link multiple} is `true`.\r\n * Can also be set using an `<ng-template>` element with `#selectedItems` template reference variable.\r\n */\r\n public readonly templateSelectedItems = input<TemplateRef<\r\n typeof this.templateTypes.selectedItems\r\n > | null>(null);\r\n protected readonly selectedItemsTemplate = computed(\r\n () =>\r\n this._userSelectedItemsTemplate() ??\r\n this.templateSelectedItems() ??\r\n this._defaultSelectedItemsTemplate()\r\n );\r\n\r\n // Group template\r\n private readonly _defaultGroupTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultGroupTemplate');\r\n private readonly _userGroupTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('group');\r\n /**\r\n * Set a custom template for a group in the select control.\r\n * Can also be set using an `<ng-template>` element with `#group` template reference variable.\r\n */\r\n public readonly templateGroup = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n protected readonly groupTemplate = computed(\r\n () => this._userGroupTemplate() ?? this.templateGroup() ?? this._defaultGroupTemplate()\r\n );\r\n\r\n // No items template\r\n private readonly _userNoItemsTemplate = contentChild<TemplateRef<unknown>>('noItems');\r\n /**\r\n * Set a custom template for the no items state of the select control.\r\n * Can also be set using an `<ng-template>` element with `#noItems` template reference variable.\r\n */\r\n public readonly templateNoItems = input<TemplateRef<unknown> | null>(null);\r\n protected readonly noItemsTemplate = computed(\r\n () => this._userNoItemsTemplate() ?? this.templateNoItems()\r\n );\r\n\r\n /**\r\n * Types for the dialog templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n item: {\r\n $implicit: NgnItem<unknown, V> | undefined;\r\n };\r\n selectedItems: {\r\n $implicit: NgnItem<unknown, V>[];\r\n };\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n contentChild,\r\n effect,\r\n input,\r\n linkedSignal,\r\n type OutputRefSubscription,\r\n type Signal,\r\n signal,\r\n viewChild,\r\n ChangeDetectionStrategy,\r\n inject,\r\n} from '@angular/core';\r\nimport { type FilterConfig, mapToItems, type NgnItem } from '@ngneers/controls/api';\r\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { I18n } from '@ngneers/controls/i18n';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnInput } from '@ngneers/controls/input';\r\nimport { NgnInputField } from '@ngneers/controls/input-field';\r\nimport { NgnItemView } from '@ngneers/controls/item-view';\r\nimport { NgnListBox } from '@ngneers/controls/list-box';\r\nimport { NgnPopover, type PopoverOptions } from '@ngneers/controls/popover';\r\nimport { deepMerge, maybeCallback, NgnError } from '@ngneers/controls/utils';\r\nimport { selectControlTemplate } from '@ngneers/controls-themes/templates/select';\r\n\r\nimport { SelectTemplates, type ValueType } from './select-templates';\r\n\r\nimport type { SelectFilterOptions } from './types';\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-select',\r\n templateUrl: './select.html',\r\n imports: [\r\n NgnPt,\r\n NgnInputField,\r\n NgnListBox,\r\n NgnPopover,\r\n NgnInput,\r\n NgTemplateOutlet,\r\n NgnTemplate,\r\n NgnItemView,\r\n NgnIcon,\r\n ],\r\n providers: [provideSelf(NgnSelect)],\r\n host: {\r\n style: 'display: block;',\r\n },\r\n})\r\nexport class NgnSelect<\r\n V,\r\n Editable extends boolean = false,\r\n Multiple extends boolean = false,\r\n> extends SelectTemplates<V, Editable, Multiple> {\r\n protected readonly theme = this.injectThemeTemplate(selectControlTemplate, 'root');\r\n protected readonly i18n = inject(I18n).translations;\r\n private readonly _popover = viewChild.required<NgnPopover>(NgnPopover);\r\n private readonly _customEditableInput = contentChild(NgnInput);\r\n private _customEditableSub?: OutputRefSubscription;\r\n\r\n /**\r\n * Options for the popover.\r\n */\r\n public readonly popoverOptions = input<PopoverOptions>({});\r\n protected readonly appliedPopoverOptions = computed(() =>\r\n deepMerge(\r\n {\r\n sizeConstraints: {\r\n width: 1,\r\n maxWidth: 1,\r\n minHeight: '250px',\r\n maxHeight: '700px',\r\n },\r\n },\r\n this.popoverOptions()\r\n )\r\n );\r\n /**\r\n * The available options to choose from. They can either be\r\n * * A list of {@link NgnItem} objects\r\n * * A list of plain objects. You'll have to provide a {@link fields} input to specify how to map the plain objects to {@link NgnItem} objects.\r\n */\r\n public readonly options = input<readonly NgnItem<unknown, V>[]>([]);\r\n /**\r\n * Accepts a boolean value that determines whether the filter is enabled.\r\n * Alternatively, you can provide `SelectFilterOptions` to customize the filter behavior.\r\n * @default `false`\r\n */\r\n public readonly filter = input<SelectFilterOptions<NgnItem<unknown, V>> | boolean>(false);\r\n /**\r\n * Manually set the filter text.\r\n */\r\n public readonly filterText = input<string | null>(null);\r\n /**\r\n * The icon to display in the filter input.\r\n */\r\n public readonly filterIcon = input<IconType>();\r\n /**\r\n * The icon to display in the dropdown.\r\n */\r\n public readonly dropdownIcon = input<IconType>();\r\n /**\r\n * Whether the select is virtualized.\r\n * @default `false`\r\n */\r\n public readonly virtual = input(false, { transform: booleanAttribute });\r\n /**\r\n * When {@link virtual} is enabled, this property defines the height of each item in the list.\r\n */\r\n public readonly itemHeight = input<number>();\r\n /**\r\n * Enable this to allow the user to type in a value that is not in the list.\r\n * When enabled, the value of the control becomes the label of a selected item or the typed value.\r\n *\r\n * Cannot be used with\r\n * * {@link multiple} selection\r\n * * {@link filter} without also setting {@link editableAutoFilter} to `false`\r\n *\r\n * @default `false`\r\n */\r\n public readonly editable = input<Editable>();\r\n /**\r\n * Whether to automatically filter the options based on the user's input in the {@link editable} input.\r\n * @default `true`\r\n */\r\n public readonly editableAutoFilter = input(true, { transform: booleanAttribute });\r\n /**\r\n * Enable this to allow the user to select multiple values.\r\n * When enabled, the value of the control becomes an array of selected items.\r\n *\r\n * This is only applicable when {@link editable} is `false`.\r\n * @default `false`\r\n */\r\n public readonly multiple = input<Multiple>();\r\n /**\r\n * Whether to scroll to the selected item when the dropdown is opened.\r\n * @default `true`\r\n */\r\n public readonly scrollToSelectedItemOnOpen = input<boolean | ScrollLogicalPosition>(true);\r\n /**\r\n * Tabindex for the select control.\r\n * @default `0`\r\n */\r\n public readonly tabindex = input<number>(0);\r\n /**\r\n * Whether to use a checkbox to indicate selection state.\r\n *\r\n * This option is true per default when {@link multiple} is `true`.\r\n * @default multiple()\r\n */\r\n public readonly checkbox = input<boolean>();\r\n\r\n protected readonly maybeCallback = maybeCallback;\r\n\r\n private readonly _listbox = viewChild(NgnListBox);\r\n private _userChangedEditableInput = false;\r\n\r\n protected readonly filterTextInternal = linkedSignal(this.filterText);\r\n protected readonly currentHighlightedValue = signal<V | null>(null);\r\n protected readonly valueStr = computed(() => {\r\n const v = this.value();\r\n return typeof v === 'string' ? v : null;\r\n });\r\n protected readonly valueArray = computed(() => {\r\n const v = this.value();\r\n return Array.isArray(v) ? v : v ? [v] : [];\r\n });\r\n\r\n protected readonly appliedFilter: Signal<FilterConfig<NgnItem> | boolean> = computed(\r\n () => this.filter() || this.editable() || false\r\n );\r\n\r\n private readonly _flatOptions = computed(() => mapToItems(this.options()));\r\n\r\n protected readonly selectedItems = computed(() => {\r\n if (this.editable()) {\r\n return [this._flatOptions().find(option => option.label === this.value())];\r\n } else {\r\n return this.valueArray().map(value =>\r\n this._flatOptions().find(option => option.value === value)\r\n );\r\n }\r\n });\r\n protected readonly selectedItemsValues = computed(() =>\r\n this.selectedItems().map(item => item?.value)\r\n );\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n if (this.editable() && this.multiple()) {\r\n throw new NgnError('select', 'Editable and multiple selection cannot be used together');\r\n }\r\n if (this.editable() && this.filter()) {\r\n throw new NgnError('select', 'Editable and filtering cannot be used together');\r\n }\r\n });\r\n effect(() => {\r\n this._customEditableSub?.unsubscribe();\r\n const editable = this.editable();\r\n const customEditableInput = this._customEditableInput();\r\n if (!editable || !customEditableInput) {\r\n return;\r\n }\r\n\r\n this._customEditableSub = customEditableInput.value.subscribe(value => {\r\n this.onEditableChange(value);\r\n });\r\n // Set ARIA attributes for accessibility\r\n customEditableInput.element.nativeElement.setAttribute('aria-autocomplete', 'list');\r\n customEditableInput.element.nativeElement.setAttribute(\r\n 'aria-expanded',\r\n `${this._popover().open()}`\r\n );\r\n customEditableInput.element.nativeElement.setAttribute('aria-haspopup', 'listbox');\r\n customEditableInput.element.nativeElement.setAttribute(\r\n 'aria-controls',\r\n `${this.inputId()}_listbox`\r\n );\r\n });\r\n effect(() => {\r\n if (!this.editable()) {\r\n return;\r\n }\r\n const valueSig = this._customEditableInput()?.value;\r\n if (valueSig) {\r\n valueSig.set((this.value() as string) || '');\r\n }\r\n });\r\n effect(() => {\r\n if (!this.editable()) {\r\n return;\r\n }\r\n const hasOptions = !!this._listbox()?.displayedItems().length;\r\n if (!this._userChangedEditableInput) {\r\n return;\r\n }\r\n this._userChangedEditableInput = false;\r\n if (hasOptions) {\r\n this.show();\r\n } else {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n protected onKeyDown(event: KeyboardEvent) {\r\n this._listbox()?.onKeyDown(event);\r\n // if event is not handled by the listbox, we can handle it here\r\n if (!event.defaultPrevented) {\r\n if (event.key === 'Enter') {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n this._popover().toggle();\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n const currentIndex = this.options().findIndex(option => option.value === this.value());\r\n let newIndex = event.key === 'ArrowDown' ? currentIndex + 1 : currentIndex - 1;\r\n if (newIndex < 0) {\r\n newIndex = 0;\r\n }\r\n if (newIndex >= this.options().length) {\r\n newIndex = this.options().length - 1;\r\n }\r\n const newValue = this.options()[newIndex]?.value;\r\n if (newValue !== undefined) {\r\n this.onSelect(newValue as ValueType<V, false, Multiple>);\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected onPopoverClosed() {\r\n this.potentiallyBlurred();\r\n this.currentHighlightedValue.set(null);\r\n const filter = this.filter();\r\n if (filter === true || (typeof filter === 'object' && filter.clearFilterOnClose)) {\r\n if (!this.editable()) {\r\n this.filterTextInternal.set('');\r\n }\r\n }\r\n }\r\n\r\n protected onSelect(value: ValueType<V, false, Multiple> | null) {\r\n if (this.editable()) {\r\n const item = this._flatOptions().find(option => option.value === value);\r\n if (item) {\r\n this.value.set(maybeCallback(item.label) as ValueType<V, Editable, Multiple>);\r\n }\r\n } else {\r\n const v = value as ValueType<V, Editable, Multiple>;\r\n if (this.value() !== v) {\r\n this.value.set(v);\r\n }\r\n }\r\n }\r\n\r\n protected onItemClicked() {\r\n if (!this.multiple()) {\r\n this.hide();\r\n }\r\n }\r\n\r\n /**\r\n * Shows the select dropdown.\r\n */\r\n public show() {\r\n if (this.disabled() || this.readonly()) {\r\n return;\r\n }\r\n this._popover().show();\r\n }\r\n\r\n /**\r\n * Hides the select dropdown.\r\n */\r\n public hide() {\r\n this._popover().hide();\r\n }\r\n\r\n protected onEditableChange(value: string | null) {\r\n if (this.editable()) {\r\n this.value.set(maybeCallback(value) as ValueType<V, Editable, Multiple>);\r\n this._userChangedEditableInput = true;\r\n if (this.editableAutoFilter()) {\r\n this.filterTextInternal.set(value);\r\n }\r\n }\r\n }\r\n\r\n protected potentiallyBlurred() {\r\n setTimeout(() => {\r\n if (this.element.nativeElement.contains(document.activeElement) || this._popover().open()) {\r\n return;\r\n }\r\n this.touched.set(true);\r\n });\r\n }\r\n}\r\n","<ngn-input-field\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n input: true,\r\n 'input-editable': editable(),\r\n }\"\r\n (click)=\"show()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n #field\r\n [label]=\"label()\"\r\n [labelledBy]=\"labelledBy()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n [readonly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n [tabindex]=\"editable() || disabled() ? -1 : tabindex()\"\r\n (focusout)=\"potentiallyBlurred()\"\r\n>\r\n @if (editable()) {\r\n <ng-content select=\"[ngnInput]\">\r\n <input\r\n ngnInput\r\n autocomplete=\"list\"\r\n [aria-expanded]=\"popover.open()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-controls]=\"inputId() + '_listbox'\"\r\n [id]=\"inputId()\"\r\n [value]=\"valueStr() || ''\"\r\n (valueChange)=\"onEditableChange($event)\"\r\n [readOnly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </ng-content>\r\n } @else {\r\n <div\r\n role=\"combobox\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'combobox'\"\r\n [aria-expanded]=\"popover.open()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-controls]=\"inputId() + '_listbox'\"\r\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\r\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\r\n [attr.disabled]=\"disabled() ? '' : null\"\r\n [id]=\"inputId()\"\r\n >\r\n @if (multiple()) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"selectedItemsTemplate()\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: selectedItems(),\r\n }\"\r\n />\r\n } @else {\r\n <ng-container\r\n [ngTemplateOutlet]=\"selectedItemTemplate()\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: selectedItems()[0],\r\n }\"\r\n />\r\n }\r\n </div>\r\n }\r\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'icon'\" [icon]=\"dropdownIcon()\" defaultIcon=\"chevron_down\" />\r\n</ngn-input-field>\r\n<ngn-popover\r\n #popover\r\n [options]=\"appliedPopoverOptions()\"\r\n [anchor]=\"field.element.nativeElement\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (closed)=\"onPopoverClosed()\"\r\n [id]=\"inputId() + '_popover'\"\r\n [hasShrinkableContent]=\"true\"\r\n>\r\n <ng-template #lazy>\r\n <div [ptInt]=\"this\" [ptClass]=\"'popover-content'\">\r\n @if (filter()) {\r\n <ngn-input-field [ptInt]=\"this\" [ptClass]=\"'filter'\">\r\n <input\r\n ngnInput\r\n [value]=\"filterTextInternal()\"\r\n (valueChange)=\"filterTextInternal.set($event)\"\r\n />\r\n <ngn-icon\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'filter-icon'\"\r\n defaultIcon=\"magnifying_glass\"\r\n [icon]=\"filterIcon()\"\r\n />\r\n </ngn-input-field>\r\n }\r\n <ngn-list-box\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n 'list-box': true,\r\n }\"\r\n style=\"height: 100%; min-height: 0\"\r\n [focussable]=\"false\"\r\n [selectable]=\"true\"\r\n [filter]=\"appliedFilter()\"\r\n [filterText]=\"filterTextInternal()\"\r\n [items]=\"options()\"\r\n [itemHeight]=\"itemHeight()\"\r\n [virtual]=\"virtual()\"\r\n [templateItem]=\"itemTemplate()\"\r\n [templateGroup]=\"groupTemplate()\"\r\n [multiple]=\"multiple()\"\r\n [value]=\"multiple() ? selectedItemsValues() : selectedItemsValues()[0]\"\r\n [scrollToSelectedItemOnInit]=\"scrollToSelectedItemOnOpen()\"\r\n (valueChange)=\"onSelect($event)\"\r\n (itemClicked)=\"onItemClicked()\"\r\n [inputId]=\"inputId() + '_listbox'\"\r\n [templateEmpty]=\"noItemsTemplate()\"\r\n [checkbox]=\"checkbox()\"\r\n />\r\n </div>\r\n </ng-template>\r\n</ngn-popover>\r\n\r\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n <span [attr.data-testid]=\"item?.testId\">\r\n @let label = item?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultGroupTemplate [ngnTemplate]=\"templateTypes.item\" let-group>\r\n <span [attr.data-testid]=\"group?.testId\">\r\n @let label = group?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"group?.testId\">{{ maybeCallback(label) }}</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n @let label = item?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\r\n } @else {\r\n <span [attr.data-testid]=\"item?.testId\">​</span>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemsTemplate [ngnTemplate]=\"templateTypes.selectedItems\" let-items>\r\n <ngn-item-view\r\n #itemView\r\n [items]=\"items\"\r\n [idField]=\"'value'\"\r\n [separator]=\"true\"\r\n style=\"margin-right: 8px\"\r\n >\r\n <ng-template #item let-item [ngnTemplate]=\"itemView.templateTypes.item\">\r\n <ng-container\r\n *ngTemplateOutlet=\"selectedItemTemplate(); context: { $implicit: item }\"\r\n ></ng-container>\r\n </ng-template>\r\n </ngn-item-view>\r\n @if (items.length < 1) {\r\n ​\r\n }\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngneers-controls-select.mjs","sources":["../../src/select/select-templates.ts","../../src/select/select.ts","../../src/select/select.html","../../src/select/ngneers-controls-select.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { ValueControlBase } from '@ngneers/controls/base';\r\n\r\nimport type { NgnItem } from '@ngneers/controls/api';\r\nimport type { InputGeneric } from '@ngneers/controls/utils';\r\n\r\n/**\r\n * This type determines the value type for the select control.\r\n * * If `multiple` is true, the value is an array of items: `T[K][]`.\r\n * * If `editable` is true, the value is a `string`.\r\n * * If neither is true, the value is the item's value type `T[K]`.\r\n */\r\nexport type ValueType<V, Editable extends boolean, Multiple extends boolean> =\r\n InputGeneric<Multiple, false> extends true\r\n ? V[]\r\n : InputGeneric<Editable, false> extends true\r\n ? string\r\n : V;\r\n\r\n@Directive()\r\nexport abstract class SelectTemplates<\r\n V,\r\n Editable extends boolean,\r\n Multiple extends boolean,\r\n> extends ValueControlBase<'select', ValueType<V, Editable, Multiple> | null> {\r\n // Item template\r\n private readonly _defaultItemTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultItemTemplate');\r\n private readonly _userItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\r\n /**\r\n * Set a custom template for an item of the select control.\r\n * Can also be set using an `<ng-template>` element with `#item` template reference variable.\r\n */\r\n public readonly templateItem = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n protected readonly itemTemplate = computed(\r\n () => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate()\r\n );\r\n\r\n // Selected item template\r\n private readonly _defaultSelectedItemTemplate = viewChild.required<\r\n TemplateRef<typeof this.templateTypes.item>\r\n >('defaultSelectedItemTemplate');\r\n private readonly _userSelectedItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('selectedItem');\r\n /**\r\n * Set a custom template for the selected item of the select control.\r\n * Can also be set using an `<ng-template>` element with `#selectedItem` template reference variable.\r\n */\r\n public readonly templateSelectedItem = input<TemplateRef<typeof this.templateTypes.item> | null>(\r\n null\r\n );\r\n protected readonly selectedItemTemplate = computed(\r\n () =>\r\n this._userSelectedItemTemplate() ??\r\n this.templateSelectedItem() ??\r\n this._defaultSelectedItemTemplate()\r\n );\r\n\r\n // Selected items template\r\n private readonly _defaultSelectedItemsTemplate = viewChild.required<\r\n TemplateRef<typeof this.templateTypes.selectedItems>\r\n >('defaultSelectedItemsTemplate');\r\n private readonly _userSelectedItemsTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.selectedItems>>('selectedItems');\r\n /**\r\n * Set a custom template for the selected items of the select control if {@link multiple} is `true`.\r\n * Can also be set using an `<ng-template>` element with `#selectedItems` template reference variable.\r\n */\r\n public readonly templateSelectedItems = input<TemplateRef<\r\n typeof this.templateTypes.selectedItems\r\n > | null>(null);\r\n protected readonly selectedItemsTemplate = computed(\r\n () =>\r\n this._userSelectedItemsTemplate() ??\r\n this.templateSelectedItems() ??\r\n this._defaultSelectedItemsTemplate()\r\n );\r\n\r\n // Group template\r\n private readonly _defaultGroupTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultGroupTemplate');\r\n private readonly _userGroupTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('group');\r\n /**\r\n * Set a custom template for a group in the select control.\r\n * Can also be set using an `<ng-template>` element with `#group` template reference variable.\r\n */\r\n public readonly templateGroup = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n protected readonly groupTemplate = computed(\r\n () => this._userGroupTemplate() ?? this.templateGroup() ?? this._defaultGroupTemplate()\r\n );\r\n\r\n // No items template\r\n private readonly _userNoItemsTemplate = contentChild<TemplateRef<unknown>>('noItems');\r\n /**\r\n * Set a custom template for the no items state of the select control.\r\n * Can also be set using an `<ng-template>` element with `#noItems` template reference variable.\r\n */\r\n public readonly templateNoItems = input<TemplateRef<unknown> | null>(null);\r\n protected readonly noItemsTemplate = computed(\r\n () => this._userNoItemsTemplate() ?? this.templateNoItems()\r\n );\r\n\r\n /**\r\n * Types for the dialog templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n item: {\r\n $implicit: NgnItem<unknown, V> | undefined;\r\n };\r\n selectedItems: {\r\n $implicit: NgnItem<unknown, V>[];\r\n };\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n contentChild,\r\n effect,\r\n input,\r\n linkedSignal,\r\n type OutputRefSubscription,\r\n type Signal,\r\n signal,\r\n viewChild,\r\n ChangeDetectionStrategy,\r\n inject,\r\n} from '@angular/core';\r\nimport { type FilterConfig, mapToItems, type NgnItem } from '@ngneers/controls/api';\r\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { I18n } from '@ngneers/controls/i18n';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnInput } from '@ngneers/controls/input';\r\nimport { NgnInputField } from '@ngneers/controls/input-field';\r\nimport { NgnItemView } from '@ngneers/controls/item-view';\r\nimport { NgnListBox } from '@ngneers/controls/list-box';\r\nimport { NgnPopover, type PopoverOptions } from '@ngneers/controls/popover';\r\nimport { deepMerge, maybeCallback, NgnError } from '@ngneers/controls/utils';\r\nimport { selectControlTemplate } from '@ngneers/controls-themes/templates/select';\r\n\r\nimport { SelectTemplates, type ValueType } from './select-templates';\r\n\r\nimport type { SelectFilterOptions } from './types';\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-select',\r\n templateUrl: './select.html',\r\n imports: [\r\n NgnPt,\r\n NgnInputField,\r\n NgnListBox,\r\n NgnPopover,\r\n NgnInput,\r\n NgTemplateOutlet,\r\n NgnTemplate,\r\n NgnItemView,\r\n NgnIcon,\r\n ],\r\n providers: [provideSelf(NgnSelect)],\r\n host: {\r\n style: 'display: block;',\r\n },\r\n})\r\nexport class NgnSelect<\r\n V,\r\n Editable extends boolean = false,\r\n Multiple extends boolean = false,\r\n> extends SelectTemplates<V, Editable, Multiple> {\r\n protected readonly theme = this.injectThemeTemplate(selectControlTemplate, 'root');\r\n protected readonly i18n = inject(I18n).translations;\r\n private readonly _popover = viewChild.required<NgnPopover>(NgnPopover);\r\n private readonly _customEditableInput = contentChild(NgnInput);\r\n private _customEditableSub?: OutputRefSubscription;\r\n\r\n /**\r\n * Options for the popover.\r\n */\r\n public readonly popoverOptions = input<PopoverOptions>({});\r\n protected readonly appliedPopoverOptions = computed(() =>\r\n deepMerge(\r\n {\r\n sizeConstraints: {\r\n width: 1,\r\n maxWidth: 1,\r\n minHeight: '250px',\r\n maxHeight: '700px',\r\n },\r\n },\r\n this.popoverOptions()\r\n )\r\n );\r\n /**\r\n * The available options to choose from. They can either be\r\n * * A list of {@link NgnItem} objects\r\n * * A list of plain objects. You'll have to provide a {@link fields} input to specify how to map the plain objects to {@link NgnItem} objects.\r\n */\r\n public readonly options = input<readonly NgnItem<unknown, V>[]>([]);\r\n /**\r\n * Accepts a boolean value that determines whether the filter is enabled.\r\n * Alternatively, you can provide `SelectFilterOptions` to customize the filter behavior.\r\n * @default `false`\r\n */\r\n public readonly filter = input<SelectFilterOptions<NgnItem<unknown, V>> | boolean>(false);\r\n /**\r\n * Manually set the filter text.\r\n */\r\n public readonly filterText = input<string | null>(null);\r\n /**\r\n * The icon to display in the filter input.\r\n */\r\n public readonly filterIcon = input<IconType>();\r\n /**\r\n * The icon to display in the dropdown.\r\n */\r\n public readonly dropdownIcon = input<IconType>();\r\n /**\r\n * Whether the select is virtualized.\r\n * @default `false`\r\n */\r\n public readonly virtual = input(false, { transform: booleanAttribute });\r\n /**\r\n * When {@link virtual} is enabled, this property defines the height of each item in the list.\r\n */\r\n public readonly itemHeight = input<number>();\r\n /**\r\n * Enable this to allow the user to type in a value that is not in the list.\r\n * When enabled, the value of the control becomes the label of a selected item or the typed value.\r\n *\r\n * Cannot be used with\r\n * * {@link multiple} selection\r\n * * {@link filter} without also setting {@link editableAutoFilter} to `false`\r\n *\r\n * @default `false`\r\n */\r\n public readonly editable = input<Editable>();\r\n /**\r\n * Whether to automatically filter the options based on the user's input in the {@link editable} input.\r\n * @default `true`\r\n */\r\n public readonly editableAutoFilter = input(true, { transform: booleanAttribute });\r\n /**\r\n * Enable this to allow the user to select multiple values.\r\n * When enabled, the value of the control becomes an array of selected items.\r\n *\r\n * This is only applicable when {@link editable} is `false`.\r\n * @default `false`\r\n */\r\n public readonly multiple = input<Multiple>();\r\n /**\r\n * Whether to scroll to the selected item when the dropdown is opened.\r\n * @default `true`\r\n */\r\n public readonly scrollToSelectedItemOnOpen = input<boolean | ScrollLogicalPosition>(true);\r\n /**\r\n * Tabindex for the select control.\r\n * @default `0`\r\n */\r\n public readonly tabindex = input<number>(0);\r\n /**\r\n * Whether to use a checkbox to indicate selection state.\r\n *\r\n * This option is true per default when {@link multiple} is `true`.\r\n * @default multiple()\r\n */\r\n public readonly checkbox = input<boolean>();\r\n\r\n protected readonly maybeCallback = maybeCallback;\r\n\r\n private readonly _listbox = viewChild(NgnListBox);\r\n private _userChangedEditableInput = false;\r\n\r\n protected readonly filterTextInternal = linkedSignal(this.filterText);\r\n protected readonly currentHighlightedValue = signal<V | null>(null);\r\n protected readonly valueStr = computed(() => {\r\n const v = this.value();\r\n return typeof v === 'string' ? v : null;\r\n });\r\n protected readonly valueArray = computed(() => {\r\n const v = this.value();\r\n return Array.isArray(v) ? v : v ? [v] : [];\r\n });\r\n\r\n protected readonly appliedFilter: Signal<FilterConfig<NgnItem> | boolean> = computed(\r\n () => this.filter() || this.editable() || false\r\n );\r\n\r\n private readonly _flatOptions = computed(() => mapToItems(this.options()));\r\n\r\n protected readonly selectedItems = computed(() => {\r\n if (this.editable()) {\r\n return [this._flatOptions().find(option => option.label === this.value())];\r\n } else {\r\n return this.valueArray().map(value =>\r\n this._flatOptions().find(option => option.value === value)\r\n );\r\n }\r\n });\r\n protected readonly selectedItemsValues = computed(() =>\r\n this.selectedItems().map(item => item?.value)\r\n );\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n if (this.editable() && this.multiple()) {\r\n throw new NgnError('select', 'Editable and multiple selection cannot be used together');\r\n }\r\n if (this.editable() && this.filter()) {\r\n throw new NgnError('select', 'Editable and filtering cannot be used together');\r\n }\r\n });\r\n effect(() => {\r\n this._customEditableSub?.unsubscribe();\r\n const editable = this.editable();\r\n const customEditableInput = this._customEditableInput();\r\n if (!editable || !customEditableInput) {\r\n return;\r\n }\r\n\r\n this._customEditableSub = customEditableInput.value.subscribe(value => {\r\n this.onEditableChange(value);\r\n });\r\n // Set ARIA attributes for accessibility\r\n customEditableInput.element.nativeElement.setAttribute('aria-autocomplete', 'list');\r\n customEditableInput.element.nativeElement.setAttribute(\r\n 'aria-expanded',\r\n `${this._popover().open()}`\r\n );\r\n customEditableInput.element.nativeElement.setAttribute('aria-haspopup', 'listbox');\r\n customEditableInput.element.nativeElement.setAttribute(\r\n 'aria-controls',\r\n `${this.inputId()}_listbox`\r\n );\r\n });\r\n effect(() => {\r\n if (!this.editable()) {\r\n return;\r\n }\r\n const valueSig = this._customEditableInput()?.value;\r\n if (valueSig) {\r\n valueSig.set((this.value() as string) || '');\r\n }\r\n });\r\n effect(() => {\r\n if (!this.editable()) {\r\n return;\r\n }\r\n const hasOptions = !!this._listbox()?.displayedItems().length;\r\n if (!this._userChangedEditableInput) {\r\n return;\r\n }\r\n this._userChangedEditableInput = false;\r\n if (hasOptions) {\r\n this.show();\r\n } else {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n protected onKeyDown(event: KeyboardEvent) {\r\n this._listbox()?.onKeyDown(event);\r\n // if event is not handled by the listbox, we can handle it here\r\n if (!event.defaultPrevented) {\r\n if (event.key === 'Enter') {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n this._popover().toggle();\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n const currentIndex = this.options().findIndex(option => option.value === this.value());\r\n let newIndex = event.key === 'ArrowDown' ? currentIndex + 1 : currentIndex - 1;\r\n if (newIndex < 0) {\r\n newIndex = 0;\r\n }\r\n if (newIndex >= this.options().length) {\r\n newIndex = this.options().length - 1;\r\n }\r\n const newValue = this.options()[newIndex]?.value;\r\n if (newValue !== undefined) {\r\n this.onSelect(newValue as ValueType<V, false, Multiple>);\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected onPopoverClosed() {\r\n this.potentiallyBlurred();\r\n this.currentHighlightedValue.set(null);\r\n const filter = this.filter();\r\n if (filter === true || (typeof filter === 'object' && filter.clearFilterOnClose)) {\r\n if (!this.editable()) {\r\n this.filterTextInternal.set('');\r\n }\r\n }\r\n }\r\n\r\n protected onSelect(value: ValueType<V, false, Multiple> | null) {\r\n if (this.editable()) {\r\n const item = this._flatOptions().find(option => option.value === value);\r\n if (item) {\r\n this.value.set(maybeCallback(item.label) as ValueType<V, Editable, Multiple>);\r\n }\r\n } else {\r\n const v = value as ValueType<V, Editable, Multiple>;\r\n if (this.value() !== v) {\r\n this.value.set(v);\r\n }\r\n }\r\n }\r\n\r\n protected onItemClicked() {\r\n if (!this.multiple()) {\r\n this.hide();\r\n }\r\n }\r\n\r\n /**\r\n * Shows the select dropdown.\r\n */\r\n public show() {\r\n if (this.disabled() || this.readonly()) {\r\n return;\r\n }\r\n this._popover().show();\r\n }\r\n\r\n /**\r\n * Hides the select dropdown.\r\n */\r\n public hide() {\r\n this._popover().hide();\r\n }\r\n\r\n protected onEditableChange(value: string | null) {\r\n if (this.editable()) {\r\n this.value.set(maybeCallback(value) as ValueType<V, Editable, Multiple>);\r\n this._userChangedEditableInput = true;\r\n if (this.editableAutoFilter()) {\r\n this.filterTextInternal.set(value);\r\n }\r\n }\r\n }\r\n\r\n protected potentiallyBlurred() {\r\n setTimeout(() => {\r\n if (this.element.nativeElement.contains(document.activeElement) || this._popover().open()) {\r\n return;\r\n }\r\n this.touched.set(true);\r\n });\r\n }\r\n}\r\n","<ngn-input-field\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n input: true,\r\n 'input-editable': editable(),\r\n }\"\r\n (click)=\"show()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n #field\r\n [label]=\"label()\"\r\n [labelledBy]=\"labelledBy()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n [readonly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n [tabindex]=\"editable() || disabled() ? -1 : tabindex()\"\r\n (focusout)=\"potentiallyBlurred()\"\r\n>\r\n @if (editable()) {\r\n <ng-content select=\"[ngnInput]\">\r\n <input\r\n ngnInput\r\n autocomplete=\"list\"\r\n [aria-expanded]=\"popover.open()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-controls]=\"inputId() + '_listbox'\"\r\n [id]=\"inputId()\"\r\n [value]=\"valueStr() || ''\"\r\n (valueChange)=\"onEditableChange($event)\"\r\n [readOnly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </ng-content>\r\n } @else {\r\n <div\r\n role=\"combobox\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'combobox'\"\r\n [aria-expanded]=\"popover.open()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-controls]=\"inputId() + '_listbox'\"\r\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\r\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\r\n [attr.disabled]=\"disabled() ? '' : null\"\r\n [id]=\"inputId()\"\r\n >\r\n @if (multiple()) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"selectedItemsTemplate()\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: selectedItems(),\r\n }\"\r\n />\r\n } @else {\r\n <ng-container\r\n [ngTemplateOutlet]=\"selectedItemTemplate()\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: selectedItems()[0],\r\n }\"\r\n />\r\n }\r\n </div>\r\n }\r\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'icon'\" [icon]=\"dropdownIcon()\" defaultIcon=\"chevron_down\" />\r\n</ngn-input-field>\r\n<ngn-popover\r\n #popover\r\n [options]=\"appliedPopoverOptions()\"\r\n [anchor]=\"field.element.nativeElement\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (closed)=\"onPopoverClosed()\"\r\n [id]=\"inputId() + '_popover'\"\r\n [hasShrinkableContent]=\"true\"\r\n>\r\n <ng-template #lazy>\r\n <div [ptInt]=\"this\" [ptClass]=\"'popover-content'\">\r\n @if (filter()) {\r\n <ngn-input-field [ptInt]=\"this\" [ptClass]=\"'filter'\">\r\n <input\r\n ngnInput\r\n [value]=\"filterTextInternal()\"\r\n (valueChange)=\"filterTextInternal.set($event)\"\r\n />\r\n <ngn-icon\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'filter-icon'\"\r\n defaultIcon=\"magnifying_glass\"\r\n [icon]=\"filterIcon()\"\r\n />\r\n </ngn-input-field>\r\n }\r\n <ngn-list-box\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n 'list-box': true,\r\n }\"\r\n style=\"height: 100%; min-height: 0\"\r\n [focussable]=\"false\"\r\n [selectable]=\"true\"\r\n [filter]=\"appliedFilter()\"\r\n [filterText]=\"filterTextInternal()\"\r\n [items]=\"options()\"\r\n [itemHeight]=\"itemHeight()\"\r\n [virtual]=\"virtual()\"\r\n [templateItem]=\"itemTemplate()\"\r\n [templateGroup]=\"groupTemplate()\"\r\n [multiple]=\"multiple()\"\r\n [value]=\"multiple() ? selectedItemsValues() : selectedItemsValues()[0]\"\r\n [scrollToSelectedItemOnInit]=\"scrollToSelectedItemOnOpen()\"\r\n (valueChange)=\"onSelect($event)\"\r\n (itemClicked)=\"onItemClicked()\"\r\n [inputId]=\"inputId() + '_listbox'\"\r\n [templateEmpty]=\"noItemsTemplate()\"\r\n [checkbox]=\"checkbox()\"\r\n />\r\n </div>\r\n </ng-template>\r\n</ngn-popover>\r\n\r\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n <span [attr.data-testid]=\"item?.testId\">\r\n @let label = item?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultGroupTemplate [ngnTemplate]=\"templateTypes.item\" let-group>\r\n <span [attr.data-testid]=\"group?.testId\">\r\n @let label = group?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"group?.testId\">{{ maybeCallback(label) }}</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n @let label = item?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\r\n } @else {\r\n <span [attr.data-testid]=\"item?.testId\">​</span>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemsTemplate [ngnTemplate]=\"templateTypes.selectedItems\" let-items>\r\n <ngn-item-view\r\n #itemView\r\n [items]=\"items\"\r\n [idField]=\"'value'\"\r\n [separator]=\"true\"\r\n style=\"margin-right: 8px\"\r\n >\r\n <ng-template #item let-item [ngnTemplate]=\"itemView.templateTypes.item\">\r\n <ng-container\r\n *ngTemplateOutlet=\"selectedItemTemplate(); context: { $implicit: item }\"\r\n ></ng-container>\r\n </ng-template>\r\n </ngn-item-view>\r\n @if (items.length < 1) {\r\n ​\r\n }\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -18,33 +18,33 @@ class NgnSlider extends ValueControlBase {
|
|
|
18
18
|
/**
|
|
19
19
|
* The minimum value of the slider.
|
|
20
20
|
*/
|
|
21
|
-
min = input(0, ...(ngDevMode ? [{ debugName: "min" }] : []));
|
|
21
|
+
min = input(0, ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
|
|
22
22
|
/**
|
|
23
23
|
* Whether the slider is vertical.
|
|
24
24
|
*/
|
|
25
|
-
vertical = input(false, ...(ngDevMode ? [{ debugName: "vertical" }] : []));
|
|
25
|
+
vertical = input(false, ...(ngDevMode ? [{ debugName: "vertical" }] : /* istanbul ignore next */ []));
|
|
26
26
|
/**
|
|
27
27
|
* The maximum value of the slider.
|
|
28
28
|
*/
|
|
29
|
-
max = input(100, ...(ngDevMode ? [{ debugName: "max" }] : []));
|
|
29
|
+
max = input(100, ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
|
|
30
30
|
/**
|
|
31
31
|
* The step increment value.
|
|
32
32
|
*/
|
|
33
|
-
step = input(1, ...(ngDevMode ? [{ debugName: "step" }] : []));
|
|
33
|
+
step = input(1, ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
|
|
34
34
|
/**
|
|
35
35
|
* The value text representation for accessibility.
|
|
36
36
|
* If both {@link valueText} and {@link valueTextFn} are provided, {@link valueText} takes precedence.
|
|
37
37
|
*/
|
|
38
|
-
valueText = input(...(ngDevMode ? [undefined, { debugName: "valueText" }] : []));
|
|
38
|
+
valueText = input(...(ngDevMode ? [undefined, { debugName: "valueText" }] : /* istanbul ignore next */ []));
|
|
39
39
|
/**
|
|
40
40
|
* A function that generates the value text representation for accessibility.
|
|
41
41
|
* If both {@link valueText} and {@link valueTextFn} are provided, {@link valueText} takes precedence.
|
|
42
42
|
*/
|
|
43
|
-
valueTextFn = input(...(ngDevMode ? [undefined, { debugName: "valueTextFn" }] : []));
|
|
43
|
+
valueTextFn = input(...(ngDevMode ? [undefined, { debugName: "valueTextFn" }] : /* istanbul ignore next */ []));
|
|
44
44
|
left = computed(() => {
|
|
45
45
|
const percent = ((this.value() - this.min()) / (this.max() - this.min())) * 100;
|
|
46
|
-
return percent;
|
|
47
|
-
}, ...(ngDevMode ? [{ debugName: "left" }] : []));
|
|
46
|
+
return Math.min(100, Math.max(0, percent));
|
|
47
|
+
}, ...(ngDevMode ? [{ debugName: "left" }] : /* istanbul ignore next */ []));
|
|
48
48
|
constructor() {
|
|
49
49
|
super();
|
|
50
50
|
}
|
|
@@ -58,7 +58,7 @@ class NgnSlider extends ValueControlBase {
|
|
|
58
58
|
return valueTextFn(this.value());
|
|
59
59
|
}
|
|
60
60
|
return null;
|
|
61
|
-
}, ...(ngDevMode ? [{ debugName: "valueTextValue" }] : []));
|
|
61
|
+
}, ...(ngDevMode ? [{ debugName: "valueTextValue" }] : /* istanbul ignore next */ []));
|
|
62
62
|
onDragged(delta) {
|
|
63
63
|
if (this.readonly() || this.disabled()) {
|
|
64
64
|
return;
|
|
@@ -125,10 +125,10 @@ class NgnSlider extends ValueControlBase {
|
|
|
125
125
|
: event.clientX - trackRect.left;
|
|
126
126
|
this.dragToPosition(this.vertical() ? trackRect.top + clickPosition : trackRect.left + clickPosition);
|
|
127
127
|
}
|
|
128
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
129
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.
|
|
128
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnSlider, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
129
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.2", type: NgnSlider, isStandalone: true, selector: "ngn-slider", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, vertical: { classPropertyName: "vertical", publicName: "vertical", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, valueText: { classPropertyName: "valueText", publicName: "valueText", isSignal: true, isRequired: false, transformFunction: null }, valueTextFn: { classPropertyName: "valueTextFn", publicName: "valueTextFn", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "slider" }, listeners: { "keydown": "onKeyDown($event)", "blur": "touched.set(true)" }, properties: { "attr.aria-valuemin": "min()", "attr.aria-valuemax": "max()", "attr.aria-valuenow": "value()", "attr.aria-readonly": "readonly() ? \"true\" : null", "attr.disabled": "disabled() ? \"\" : null", "attr.aria-labelledby": "labelledBy()", "attr.aria-label": "label()", "attr.aria-orientation": "vertical() ? \"vertical\" : \"horizontal\"", "attr.aria-valuetext": "valueTextValue()", "tabindex": "disabled() ? -1 : 0" } }, providers: [provideSelf(NgnSlider)], viewQueries: [{ propertyName: "_track", first: true, predicate: ["track"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\r\n<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\r\n<div #track [ptInt]=\"this\" [ptClass]=\"'track'\" (click)=\"trackClicked($event)\">\r\n <div [ptInt]=\"this\" [ptClass]=\"'fill'\" [style.--valuePercent.%]=\"left()\"></div>\r\n <div\r\n #thumb\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'thumb'\"\r\n ngnDrag\r\n (dragged)=\"onDragged($event)\"\r\n (dragEnd)=\"onDragEnd()\"\r\n [style.--valuePercent.%]=\"left()\"\r\n (click)=\"thumbClicked($event)\"\r\n ></div>\r\n</div>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "directive", type: NgnDrag, selector: "[ngnDrag]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
130
130
|
}
|
|
131
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
131
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnSlider, decorators: [{
|
|
132
132
|
type: Component,
|
|
133
133
|
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-slider', imports: [NgnPt, NgnDrag], providers: [provideSelf(NgnSlider)], host: {
|
|
134
134
|
role: 'slider',
|