@koobiq/components 20.4.1 → 21.0.0
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/accordion/accordion-trigger.scss +3 -10
- package/accordion/accordion.scss +4 -6
- package/actions-panel/actions-panel-container.scss +45 -1
- package/alert/alert.component.scss +3 -2
- package/app-switcher/_app-switcher-theme.scss +0 -4
- package/app-switcher/app-switcher-dropdown-app.scss +3 -2
- package/app-switcher/app-switcher-dropdown-site.scss +2 -1
- package/app-switcher/{kbq-app-switcher-list-item.scss → app-switcher-list-item.scss} +18 -4
- package/app-switcher/app-switcher-tokens.scss +15 -0
- package/app-switcher/app-switcher.scss +14 -4
- package/autocomplete/autocomplete.scss +7 -6
- package/badge/badge.component.scss +5 -8
- package/breadcrumbs/breadcrumbs.scss +25 -10
- package/button/_button-base.scss +30 -7
- package/button/_button-theme.scss +16 -0
- package/button/button-group.scss +7 -0
- package/button/button-tokens.scss +0 -2
- package/button/button.scss +34 -2
- package/button-toggle/_button-toggle-theme.scss +7 -2
- package/button-toggle/button-toggle.scss +65 -15
- package/checkbox/_checkbox-theme.scss +4 -3
- package/checkbox/checkbox.scss +3 -6
- package/clamped-text/clamped-text.scss +6 -2
- package/code-block/code-block-tokens.scss +0 -224
- package/code-block/code-block.scss +20 -9
- package/content-panel/content-panel-aside.scss +3 -2
- package/content-panel/content-panel-container.scss +37 -0
- package/content-panel/content-panel.scss +4 -3
- package/core/highlight/_highlight-theme.scss +3 -1
- package/core/option/action-container.scss +2 -2
- package/core/option/action.scss +2 -1
- package/core/option/option.scss +2 -1
- package/core/pop-up/_pop-up.scss +0 -37
- package/core/selection/pseudo-checkbox/pseudo-checkbox.scss +5 -10
- package/core/styles/_core.scss +3 -0
- package/core/styles/_koobiq-theme.scss +5 -6
- package/core/styles/common/_animation.scss +44 -16
- package/core/styles/common/_groups-mixins.scss +21 -19
- package/core/styles/common/_groups.scss +4 -32
- package/core/styles/common/_index.scss +0 -2
- package/core/styles/common/_link.scss +117 -0
- package/core/styles/common/_list.scss +0 -26
- package/core/styles/common/_overlay.scss +8 -10
- package/core/styles/common/_rtl.scss +0 -14
- package/core/styles/common/_select.scss +33 -15
- package/core/styles/common/_squircle.scss +63 -0
- package/core/styles/common/_tokens.scss +0 -11
- package/core/styles/common/_vendor-prefixes.scss +0 -20
- package/core/styles/functions/_timing.scss +0 -22
- package/core/styles/theming/_scrollbar-theme.scss +6 -1
- package/core/styles/theming/_theming.scss +13 -65
- package/core/styles/typography/_index.scss +0 -1
- package/core/styles/typography/_typography.scss +0 -143
- package/core/styles/visual/_body.scss +1 -6
- package/core/styles/visual/_layout.scss +0 -12
- package/datepicker/calendar-body.scss +3 -1
- package/datepicker/calendar-header.scss +0 -1
- package/datepicker/datepicker-content.scss +33 -1
- package/datepicker/datepicker-toggle.scss +0 -38
- package/dl/dl-tokens.scss +10 -0
- package/dl/dl.scss +113 -13
- package/dropdown/_dropdown-theme.scss +4 -16
- package/dropdown/dropdown-item.scss +4 -10
- package/dropdown/dropdown.scss +2 -1
- package/empty-state/_empty-state-theme.scss +10 -4
- package/empty-state/empty-state-tokens.scss +4 -4
- package/empty-state/empty-state.scss +4 -0
- package/fesm2022/koobiq-components-accordion.mjs +347 -229
- package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
- package/fesm2022/koobiq-components-actions-panel.mjs +302 -187
- package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
- package/fesm2022/koobiq-components-alert.mjs +39 -39
- package/fesm2022/koobiq-components-alert.mjs.map +1 -1
- package/fesm2022/koobiq-components-app-switcher.mjs +677 -367
- package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
- package/fesm2022/koobiq-components-autocomplete.mjs +620 -253
- package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
- package/fesm2022/koobiq-components-badge.mjs +46 -48
- package/fesm2022/koobiq-components-badge.mjs.map +1 -1
- package/fesm2022/koobiq-components-breadcrumbs.mjs +221 -169
- package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
- package/fesm2022/koobiq-components-button-toggle.mjs +565 -196
- package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
- package/fesm2022/koobiq-components-button.mjs +332 -116
- package/fesm2022/koobiq-components-button.mjs.map +1 -1
- package/fesm2022/koobiq-components-checkbox.mjs +172 -132
- package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
- package/fesm2022/koobiq-components-clamped-text.mjs +165 -158
- package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
- package/fesm2022/koobiq-components-code-block.mjs +755 -601
- package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
- package/fesm2022/koobiq-components-content-panel.mjs +260 -143
- package/fesm2022/koobiq-components-content-panel.mjs.map +1 -1
- package/fesm2022/koobiq-components-core.mjs +4342 -1595
- package/fesm2022/koobiq-components-core.mjs.map +1 -1
- package/fesm2022/koobiq-components-datepicker.mjs +1713 -1606
- package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-divider.mjs +73 -36
- package/fesm2022/koobiq-components-divider.mjs.map +1 -1
- package/fesm2022/koobiq-components-dl.mjs +447 -89
- package/fesm2022/koobiq-components-dl.mjs.map +1 -1
- package/fesm2022/koobiq-components-dropdown.mjs +703 -599
- package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
- package/fesm2022/koobiq-components-dynamic-translation.mjs +20 -20
- package/fesm2022/koobiq-components-dynamic-translation.mjs.map +1 -1
- package/fesm2022/koobiq-components-ellipsis-center.mjs +46 -31
- package/fesm2022/koobiq-components-ellipsis-center.mjs.map +1 -1
- package/fesm2022/koobiq-components-empty-state.mjs +116 -60
- package/fesm2022/koobiq-components-empty-state.mjs.map +1 -1
- package/fesm2022/koobiq-components-file-upload.mjs +550 -290
- package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
- package/fesm2022/koobiq-components-filter-bar.mjs +2810 -2538
- package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
- package/fesm2022/koobiq-components-flag.mjs +79 -24
- package/fesm2022/koobiq-components-flag.mjs.map +1 -1
- package/fesm2022/koobiq-components-form-field.mjs +389 -525
- package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
- package/fesm2022/koobiq-components-icon.mjs +366 -136
- package/fesm2022/koobiq-components-icon.mjs.map +1 -1
- package/fesm2022/koobiq-components-inline-edit.mjs +429 -212
- package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
- package/fesm2022/koobiq-components-input.mjs +601 -459
- package/fesm2022/koobiq-components-input.mjs.map +1 -1
- package/fesm2022/koobiq-components-link-deprecated.mjs +196 -0
- package/fesm2022/koobiq-components-link-deprecated.mjs.map +1 -0
- package/fesm2022/koobiq-components-link.mjs +328 -125
- package/fesm2022/koobiq-components-link.mjs.map +1 -1
- package/fesm2022/koobiq-components-list.mjs +583 -433
- package/fesm2022/koobiq-components-list.mjs.map +1 -1
- package/fesm2022/koobiq-components-loader-overlay.mjs +167 -68
- package/fesm2022/koobiq-components-loader-overlay.mjs.map +1 -1
- package/fesm2022/koobiq-components-markdown.mjs +55 -78
- package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
- package/fesm2022/koobiq-components-modal.mjs +853 -475
- package/fesm2022/koobiq-components-modal.mjs.map +1 -1
- package/fesm2022/koobiq-components-navbar.mjs +895 -556
- package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
- package/fesm2022/koobiq-components-notification-center.mjs +680 -310
- package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
- package/fesm2022/koobiq-components-overflow-items.mjs +46 -64
- package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
- package/fesm2022/koobiq-components-popover.mjs +684 -285
- package/fesm2022/koobiq-components-popover.mjs.map +1 -1
- package/fesm2022/koobiq-components-progress-bar.mjs +87 -33
- package/fesm2022/koobiq-components-progress-bar.mjs.map +1 -1
- package/fesm2022/koobiq-components-progress-spinner.mjs +52 -43
- package/fesm2022/koobiq-components-progress-spinner.mjs.map +1 -1
- package/fesm2022/koobiq-components-radio.mjs +450 -231
- package/fesm2022/koobiq-components-radio.mjs.map +1 -1
- package/fesm2022/koobiq-components-resizer.mjs +127 -21
- package/fesm2022/koobiq-components-resizer.mjs.map +1 -1
- package/fesm2022/koobiq-components-scrollbar-deprecated.mjs +299 -0
- package/fesm2022/koobiq-components-scrollbar-deprecated.mjs.map +1 -0
- package/fesm2022/koobiq-components-scrollbar.mjs +745 -222
- package/fesm2022/koobiq-components-scrollbar.mjs.map +1 -1
- package/fesm2022/koobiq-components-search-expandable.mjs +288 -126
- package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -1
- package/fesm2022/koobiq-components-select.mjs +883 -693
- package/fesm2022/koobiq-components-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-sidebar.mjs +207 -88
- package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
- package/fesm2022/koobiq-components-sidepanel.mjs +689 -296
- package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
- package/fesm2022/koobiq-components-skeleton.mjs +815 -41
- package/fesm2022/koobiq-components-skeleton.mjs.map +1 -1
- package/fesm2022/koobiq-components-split-button.mjs +109 -88
- package/fesm2022/koobiq-components-split-button.mjs.map +1 -1
- package/fesm2022/koobiq-components-splitter-deprecated.mjs +591 -0
- package/fesm2022/koobiq-components-splitter-deprecated.mjs.map +1 -0
- package/fesm2022/koobiq-components-splitter.mjs +890 -501
- package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
- package/fesm2022/koobiq-components-table.mjs +63 -49
- package/fesm2022/koobiq-components-table.mjs.map +1 -1
- package/fesm2022/koobiq-components-tabs.mjs +1062 -603
- package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
- package/fesm2022/koobiq-components-tags.mjs +886 -733
- package/fesm2022/koobiq-components-tags.mjs.map +1 -1
- package/fesm2022/koobiq-components-textarea.mjs +213 -185
- package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
- package/fesm2022/koobiq-components-time-range.mjs +299 -147
- package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
- package/fesm2022/koobiq-components-timepicker.mjs +233 -245
- package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-timezone.mjs +344 -142
- package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
- package/fesm2022/koobiq-components-title.mjs +229 -145
- package/fesm2022/koobiq-components-title.mjs.map +1 -1
- package/fesm2022/koobiq-components-toast.mjs +486 -165
- package/fesm2022/koobiq-components-toast.mjs.map +1 -1
- package/fesm2022/koobiq-components-toggle.mjs +177 -130
- package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
- package/fesm2022/koobiq-components-tooltip.mjs +657 -214
- package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
- package/fesm2022/koobiq-components-top-bar.mjs +61 -32
- package/fesm2022/koobiq-components-top-bar.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree-select.mjs +719 -488
- package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree.mjs +1506 -558
- package/fesm2022/koobiq-components-tree.mjs.map +1 -1
- package/fesm2022/koobiq-components-username.mjs +290 -135
- package/fesm2022/koobiq-components-username.mjs.map +1 -1
- package/file-upload/dropzone.scss +31 -3
- package/file-upload/file-upload-tokens.scss +2 -22
- package/file-upload/file-upload.scss +6 -0
- package/file-upload/multiple-file-upload.component.scss +14 -12
- package/file-upload/single-file-upload.component.scss +3 -2
- package/filter-bar/filters.scss +7 -0
- package/filter-bar/pipes/base-pipe.scss +3 -3
- package/filter-bar/pipes/pipe-date.scss +8 -1
- package/flag/flag-tokens.scss +22 -0
- package/flag/flag.scss +34 -21
- package/form-field/{_fiedset-theme.scss → _fieldset-theme.scss} +1 -5
- package/form-field/_form-field-theme.scss +4 -9
- package/form-field/cleaner.scss +3 -1
- package/form-field/fieldset.scss +3 -4
- package/form-field/form-field.scss +26 -21
- package/form-field/password-toggle.scss +3 -1
- package/icon/_icon-button-theme.scss +7 -0
- package/icon/_icon-theme.scss +10 -7
- package/icon/icon-button.scss +0 -2
- package/icon/icon-tokens.scss +12 -9
- package/inline-edit/inline-edit.scss +40 -54
- package/input/input.scss +4 -0
- package/link/{_link-theme.scss → deprecated/_link-theme.scss} +11 -6
- package/link/deprecated/link-tokens.scss +27 -0
- package/link/link-tokens.scss +6 -25
- package/link/link.scss +137 -0
- package/list/list.scss +3 -2
- package/loader-overlay/_loader-overlay-theme.scss +19 -10
- package/loader-overlay/loader-overlay-tokens.scss +0 -2
- package/loader-overlay/loader-overlay.scss +7 -1
- package/markdown/_markdown-theme.scss +16 -0
- package/markdown/markdown-tokens.scss +5 -0
- package/markdown/markdown.scss +2 -1
- package/modal/_modal-animation.scss +23 -14
- package/modal/modal-tokens.scss +2 -1
- package/modal/modal.scss +35 -31
- package/navbar/_navbar-item_horizontal.scss +8 -6
- package/navbar/_navbar-item_vertical.scss +18 -6
- package/navbar/_navbar-theme.scss +9 -1
- package/navbar/navbar-brand.scss +8 -6
- package/navbar/navbar-divider.scss +1 -1
- package/navbar/navbar-item.scss +8 -9
- package/navbar/navbar-toggle.scss +3 -3
- package/navbar/navbar-tokens.scss +14 -0
- package/navbar/navbar.scss +1 -2
- package/navbar/vertical-navbar.scss +2 -2
- package/notification-center/_notification-center-theme.scss +11 -6
- package/notification-center/notification-center-tokens.scss +33 -0
- package/notification-center/notification-center.scss +58 -20
- package/notification-center/notification-item.scss +15 -6
- package/package.json +112 -81
- package/popover/popover-tokens.scss +0 -2
- package/popover/popover.scss +41 -19
- package/prebuilt-themes/theme.css +1 -1
- package/progress-bar/_progress-bar-theme.scss +20 -3
- package/progress-bar/progress-bar-tokens.scss +3 -0
- package/progress-bar/progress-bar.scss +36 -8
- package/progress-spinner/progress-spinner.scss +4 -3
- package/radio/_radio-theme.scss +21 -4
- package/radio/radio-tokens.scss +7 -3
- package/radio/radio.scss +55 -8
- package/schematics/collection.json +399 -7
- package/schematics/migrations/accordion-state-saving-default/README.md +60 -0
- package/schematics/migrations/accordion-state-saving-default/data.js +75 -0
- package/schematics/migrations/accordion-state-saving-default/index.js +60 -0
- package/schematics/migrations/accordion-state-saving-default/schema.json +15 -0
- package/schematics/migrations/actions-panel-overlay-container/README.md +35 -0
- package/schematics/migrations/actions-panel-overlay-container/data.js +47 -0
- package/schematics/migrations/actions-panel-overlay-container/index.js +54 -0
- package/schematics/migrations/actions-panel-overlay-container/schema.json +15 -0
- package/schematics/migrations/alert-signals/README.md +13 -7
- package/schematics/migrations/alert-signals/data.js +3 -0
- package/schematics/migrations/alert-signals/index.js +70 -203
- package/schematics/migrations/angular-animations-removal/README.md +46 -0
- package/schematics/migrations/angular-animations-removal/data.js +150 -0
- package/schematics/migrations/angular-animations-removal/index.js +20 -0
- package/schematics/migrations/angular-animations-removal/schema.json +15 -0
- package/schematics/migrations/app-switcher-signals/README.md +88 -0
- package/schematics/migrations/app-switcher-signals/data.js +136 -0
- package/schematics/migrations/app-switcher-signals/index.js +365 -0
- package/schematics/migrations/app-switcher-signals/schema.json +20 -0
- package/schematics/migrations/autocomplete-panel-width-auto/README.md +2 -2
- package/schematics/migrations/autocomplete-panel-width-auto/index.js +1 -1
- package/schematics/migrations/autocomplete-signals/README.md +92 -0
- package/schematics/migrations/autocomplete-signals/data.js +149 -0
- package/schematics/migrations/autocomplete-signals/index.js +706 -0
- package/schematics/migrations/autocomplete-signals/schema.json +20 -0
- package/schematics/migrations/badge-signals/README.md +77 -0
- package/schematics/migrations/badge-signals/data.js +109 -0
- package/schematics/migrations/badge-signals/index.js +693 -0
- package/schematics/migrations/badge-signals/schema.json +20 -0
- package/schematics/migrations/button-state-and-styles/README.md +129 -0
- package/schematics/migrations/button-state-and-styles/data.js +136 -0
- package/schematics/migrations/button-state-and-styles/index.js +220 -0
- package/schematics/migrations/button-state-and-styles/schema.json +20 -0
- package/schematics/migrations/button-supported-colors/README.md +73 -0
- package/schematics/migrations/button-supported-colors/data.js +106 -0
- package/schematics/migrations/button-supported-colors/index.js +260 -0
- package/schematics/migrations/button-supported-colors/schema.json +20 -0
- package/schematics/migrations/button-toggle-signals-and-aria/README.md +137 -0
- package/schematics/migrations/button-toggle-signals-and-aria/data.js +200 -0
- package/schematics/migrations/button-toggle-signals-and-aria/index.js +496 -0
- package/schematics/migrations/button-toggle-signals-and-aria/schema.json +20 -0
- package/schematics/migrations/button-truncation/README.md +110 -0
- package/schematics/migrations/button-truncation/data.js +88 -0
- package/schematics/migrations/button-truncation/index.js +269 -0
- package/schematics/migrations/button-truncation/schema.json +20 -0
- package/schematics/migrations/checkbox-signals/README.md +76 -0
- package/schematics/migrations/checkbox-signals/data.js +114 -0
- package/schematics/migrations/checkbox-signals/index.js +634 -0
- package/schematics/migrations/checkbox-signals/schema.json +20 -0
- package/schematics/migrations/clamped-text-disclosure/README.md +62 -0
- package/schematics/migrations/clamped-text-disclosure/data.js +101 -0
- package/schematics/migrations/clamped-text-disclosure/index.js +59 -0
- package/schematics/migrations/clamped-text-disclosure/schema.json +15 -0
- package/schematics/migrations/code-block-signals/README.md +84 -0
- package/schematics/migrations/code-block-signals/data.js +121 -0
- package/schematics/migrations/code-block-signals/index.js +700 -0
- package/schematics/migrations/code-block-signals/schema.json +20 -0
- package/schematics/migrations/color-signals/README.md +46 -0
- package/schematics/migrations/color-signals/data.js +131 -0
- package/schematics/migrations/color-signals/index.js +19 -0
- package/schematics/migrations/color-signals/schema.json +20 -0
- package/schematics/migrations/core-mixins-removal/README.md +20 -0
- package/schematics/migrations/core-mixins-removal/data.js +27 -0
- package/schematics/migrations/core-mixins-removal/index.js +17 -0
- package/schematics/migrations/core-mixins-removal/schema.json +15 -0
- package/schematics/migrations/css-selectors/README.md +2 -2
- package/schematics/migrations/css-selectors/index.js +1 -1
- package/schematics/migrations/datepicker-signals/README.md +24 -0
- package/schematics/migrations/datepicker-signals/data.js +49 -0
- package/schematics/migrations/datepicker-signals/index.js +17 -0
- package/schematics/migrations/datepicker-signals/schema.json +15 -0
- package/schematics/migrations/deprecated-icons/README.md +2 -2
- package/schematics/migrations/deprecated-icons/index.js +1 -1
- package/schematics/migrations/design-tokens-v4/README.md +75 -0
- package/schematics/migrations/design-tokens-v4/index.js +59 -0
- package/schematics/migrations/design-tokens-v4/schema.json +15 -0
- package/schematics/migrations/divider-signals-and-aria/README.md +47 -0
- package/schematics/migrations/divider-signals-and-aria/data.js +62 -0
- package/schematics/migrations/divider-signals-and-aria/index.js +211 -0
- package/schematics/migrations/divider-signals-and-aria/schema.json +15 -0
- package/schematics/migrations/dl-attribute-coercion/README.md +59 -0
- package/schematics/migrations/dl-attribute-coercion/data.js +85 -0
- package/schematics/migrations/dl-attribute-coercion/index.js +161 -0
- package/schematics/migrations/dl-attribute-coercion/schema.json +15 -0
- package/schematics/migrations/dl-standalone-names/README.md +49 -0
- package/schematics/migrations/dl-standalone-names/data.js +44 -0
- package/schematics/migrations/dl-standalone-names/index.js +321 -0
- package/schematics/migrations/dl-standalone-names/schema.json +20 -0
- package/schematics/migrations/dropdown-demote-overlay/README.md +137 -0
- package/schematics/migrations/dropdown-demote-overlay/data.js +84 -0
- package/schematics/migrations/dropdown-demote-overlay/index.js +288 -0
- package/schematics/migrations/dropdown-demote-overlay/schema.json +20 -0
- package/schematics/migrations/dropdown-signals/README.md +83 -0
- package/schematics/migrations/dropdown-signals/data.js +152 -0
- package/schematics/migrations/dropdown-signals/index.js +19 -0
- package/schematics/migrations/dropdown-signals/schema.json +20 -0
- package/schematics/migrations/empty-state-error-color/README.md +84 -0
- package/schematics/migrations/empty-state-error-color/data.js +85 -0
- package/schematics/migrations/empty-state-error-color/index.js +71 -0
- package/schematics/migrations/empty-state-error-color/schema.json +15 -0
- package/schematics/migrations/empty-state-size-attr/README.md +2 -2
- package/schematics/migrations/empty-state-size-attr/index.js +1 -1
- package/schematics/migrations/file-upload-cva-and-primitives/README.md +70 -0
- package/schematics/migrations/file-upload-cva-and-primitives/data.js +97 -0
- package/schematics/migrations/file-upload-cva-and-primitives/index.js +60 -0
- package/schematics/migrations/file-upload-cva-and-primitives/schema.json +15 -0
- package/schematics/migrations/file-upload-deprecated-outputs/README.md +90 -0
- package/schematics/migrations/file-upload-deprecated-outputs/data.js +20 -0
- package/schematics/migrations/file-upload-deprecated-outputs/index.js +70 -0
- package/schematics/migrations/file-upload-deprecated-outputs/schema.json +20 -0
- package/schematics/migrations/filter-bar-rename-action/README.md +183 -0
- package/schematics/migrations/filter-bar-rename-action/data.js +151 -0
- package/schematics/migrations/filter-bar-rename-action/index.js +177 -0
- package/schematics/migrations/filter-bar-rename-action/schema.json +20 -0
- package/schematics/migrations/filter-bar-signals/README.md +27 -16
- package/schematics/migrations/filter-bar-signals/data.js +1 -2
- package/schematics/migrations/filter-bar-signals/index.js +100 -195
- package/schematics/migrations/filter-bar-state-saving-default/README.md +53 -0
- package/schematics/migrations/filter-bar-state-saving-default/data.js +87 -0
- package/schematics/migrations/filter-bar-state-saving-default/index.js +61 -0
- package/schematics/migrations/filter-bar-state-saving-default/schema.json +15 -0
- package/schematics/migrations/flag-inner-html/README.md +67 -0
- package/schematics/migrations/flag-inner-html/data.js +58 -0
- package/schematics/migrations/flag-inner-html/index.js +61 -0
- package/schematics/migrations/flag-inner-html/schema.json +15 -0
- package/schematics/migrations/form-field-signals/README.md +125 -0
- package/schematics/migrations/form-field-signals/data.js +288 -0
- package/schematics/migrations/form-field-signals/index.js +382 -0
- package/schematics/migrations/form-field-signals/schema.json +20 -0
- package/schematics/migrations/icon-semantics-and-api/README.md +65 -0
- package/schematics/migrations/icon-semantics-and-api/data.js +97 -0
- package/schematics/migrations/icon-semantics-and-api/index.js +64 -0
- package/schematics/migrations/icon-semantics-and-api/schema.json +15 -0
- package/schematics/migrations/icons-replacement/README.md +5 -5
- package/schematics/migrations/icons-replacement/index.js +1 -1
- package/schematics/migrations/inline-edit-a11y-and-types/README.md +82 -0
- package/schematics/migrations/inline-edit-a11y-and-types/data.js +117 -0
- package/schematics/migrations/inline-edit-a11y-and-types/index.js +97 -0
- package/schematics/migrations/inline-edit-a11y-and-types/schema.json +20 -0
- package/schematics/migrations/input-number-surface/README.md +140 -0
- package/schematics/migrations/input-number-surface/data.js +135 -0
- package/schematics/migrations/input-number-surface/index.js +292 -0
- package/schematics/migrations/input-number-surface/schema.json +20 -0
- package/schematics/migrations/input-signals/README.md +20 -0
- package/schematics/migrations/input-signals/data.js +30 -0
- package/schematics/migrations/input-signals/index.js +17 -0
- package/schematics/migrations/input-signals/schema.json +15 -0
- package/schematics/migrations/link-deprecated-path/README.md +144 -0
- package/schematics/migrations/link-deprecated-path/index.js +19 -0
- package/schematics/migrations/link-deprecated-path/schema.json +20 -0
- package/schematics/migrations/link-signals/README.md +71 -0
- package/schematics/migrations/link-signals/data.js +116 -0
- package/schematics/migrations/link-signals/index.js +415 -0
- package/schematics/migrations/link-signals/schema.json +20 -0
- package/schematics/migrations/list-signals/README.md +22 -0
- package/schematics/migrations/list-signals/data.js +35 -0
- package/schematics/migrations/list-signals/index.js +17 -0
- package/schematics/migrations/list-signals/schema.json +15 -0
- package/schematics/migrations/list-tree-multiple-input/README.md +105 -0
- package/schematics/migrations/list-tree-multiple-input/data.js +74 -0
- package/schematics/migrations/list-tree-multiple-input/index.js +221 -0
- package/schematics/migrations/list-tree-multiple-input/schema.json +20 -0
- package/schematics/migrations/loader-overlay-signals/README.md +62 -0
- package/schematics/migrations/loader-overlay-signals/data.js +101 -0
- package/schematics/migrations/loader-overlay-signals/index.js +697 -0
- package/schematics/migrations/loader-overlay-signals/schema.json +20 -0
- package/schematics/migrations/loader-overlay-size-attr/README.md +2 -2
- package/schematics/migrations/loader-overlay-size-attr/index.js +1 -1
- package/schematics/migrations/locale-configuration-providers/README.md +163 -0
- package/schematics/migrations/locale-configuration-providers/data.js +257 -0
- package/schematics/migrations/locale-configuration-providers/index.js +294 -0
- package/schematics/migrations/locale-configuration-providers/schema.json +20 -0
- package/schematics/migrations/mandatory-peer-dependencies/README.md +70 -0
- package/schematics/migrations/mandatory-peer-dependencies/index.js +42 -0
- package/schematics/migrations/mandatory-peer-dependencies/schema.json +15 -0
- package/schematics/migrations/markdown-signals/README.md +58 -0
- package/schematics/migrations/markdown-signals/data.js +79 -0
- package/schematics/migrations/markdown-signals/index.js +639 -0
- package/schematics/migrations/markdown-signals/schema.json +20 -0
- package/schematics/migrations/modal-dialog-semantics/README.md +106 -0
- package/schematics/migrations/modal-dialog-semantics/data.js +110 -0
- package/schematics/migrations/modal-dialog-semantics/index.js +58 -0
- package/schematics/migrations/modal-dialog-semantics/schema.json +15 -0
- package/schematics/migrations/modal-signals/README.md +88 -0
- package/schematics/migrations/modal-signals/data.js +132 -0
- package/schematics/migrations/modal-signals/index.js +19 -0
- package/schematics/migrations/modal-signals/schema.json +20 -0
- package/schematics/migrations/navbar-signals-and-aria/README.md +111 -0
- package/schematics/migrations/navbar-signals-and-aria/data.js +198 -0
- package/schematics/migrations/navbar-signals-and-aria/index.js +568 -0
- package/schematics/migrations/navbar-signals-and-aria/schema.json +20 -0
- package/schematics/migrations/new-icons-pack/README.md +10 -10
- package/schematics/migrations/new-icons-pack/index.js +1 -1
- package/schematics/migrations/notification-center-signals/README.md +67 -0
- package/schematics/migrations/notification-center-signals/data.js +66 -0
- package/schematics/migrations/notification-center-signals/index.js +61 -0
- package/schematics/migrations/notification-center-signals/schema.json +15 -0
- package/schematics/migrations/option-signals/README.md +37 -0
- package/schematics/migrations/option-signals/data.js +86 -0
- package/schematics/migrations/option-signals/index.js +19 -0
- package/schematics/migrations/option-signals/schema.json +20 -0
- package/schematics/migrations/popover-leave-delay/README.md +51 -0
- package/schematics/migrations/popover-leave-delay/data.js +61 -0
- package/schematics/migrations/popover-leave-delay/index.js +54 -0
- package/schematics/migrations/popover-leave-delay/schema.json +15 -0
- package/schematics/migrations/progress-bar-percentage-and-aria/README.md +54 -0
- package/schematics/migrations/progress-bar-percentage-and-aria/data.js +76 -0
- package/schematics/migrations/progress-bar-percentage-and-aria/index.js +58 -0
- package/schematics/migrations/progress-bar-percentage-and-aria/schema.json +15 -0
- package/schematics/migrations/progress-spinner-signals/README.md +72 -0
- package/schematics/migrations/progress-spinner-signals/data.js +83 -0
- package/schematics/migrations/progress-spinner-signals/index.js +694 -0
- package/schematics/migrations/progress-spinner-signals/schema.json +20 -0
- package/schematics/migrations/query-list-signals/README.md +32 -0
- package/schematics/migrations/query-list-signals/data.js +70 -0
- package/schematics/migrations/query-list-signals/index.js +17 -0
- package/schematics/migrations/query-list-signals/schema.json +15 -0
- package/schematics/migrations/radio-signals-and-aria/README.md +82 -0
- package/schematics/migrations/radio-signals-and-aria/data.js +163 -0
- package/schematics/migrations/radio-signals-and-aria/index.js +39 -0
- package/schematics/migrations/radio-signals-and-aria/schema.json +20 -0
- package/schematics/migrations/read-state-dwell-handlers/README.md +125 -0
- package/schematics/migrations/read-state-dwell-handlers/data.js +45 -0
- package/schematics/migrations/read-state-dwell-handlers/index.js +215 -0
- package/schematics/migrations/read-state-dwell-handlers/schema.json +20 -0
- package/schematics/migrations/scrollbar-deprecated-path/README.md +128 -0
- package/schematics/migrations/scrollbar-deprecated-path/index.js +20 -0
- package/schematics/migrations/scrollbar-deprecated-path/schema.json +20 -0
- package/schematics/migrations/select-signal-inputs/README.md +61 -0
- package/schematics/migrations/select-signal-inputs/data.js +99 -0
- package/schematics/migrations/select-signal-inputs/index.js +57 -0
- package/schematics/migrations/select-signal-inputs/schema.json +15 -0
- package/schematics/migrations/sidepanel-non-modal-behavior/README.md +57 -0
- package/schematics/migrations/sidepanel-non-modal-behavior/data.js +111 -0
- package/schematics/migrations/sidepanel-non-modal-behavior/index.js +57 -0
- package/schematics/migrations/sidepanel-non-modal-behavior/schema.json +15 -0
- package/schematics/migrations/signal-inputs-subclasses/README.md +28 -0
- package/schematics/migrations/signal-inputs-subclasses/data.js +69 -0
- package/schematics/migrations/signal-inputs-subclasses/index.js +17 -0
- package/schematics/migrations/signal-inputs-subclasses/schema.json +15 -0
- package/schematics/migrations/split-button-optional-disabled/README.md +47 -0
- package/schematics/migrations/split-button-optional-disabled/data.js +53 -0
- package/schematics/migrations/split-button-optional-disabled/index.js +57 -0
- package/schematics/migrations/split-button-optional-disabled/schema.json +15 -0
- package/schematics/migrations/splitter-deprecated-path/README.md +136 -0
- package/schematics/migrations/splitter-deprecated-path/index.js +20 -0
- package/schematics/migrations/splitter-deprecated-path/schema.json +20 -0
- package/schematics/migrations/state-saving-default/README.md +67 -0
- package/schematics/migrations/state-saving-default/data.js +88 -0
- package/schematics/migrations/state-saving-default/index.js +62 -0
- package/schematics/migrations/state-saving-default/schema.json +15 -0
- package/schematics/migrations/table-cell-content/README.md +55 -0
- package/schematics/migrations/table-cell-content/data.js +66 -0
- package/schematics/migrations/table-cell-content/index.js +66 -0
- package/schematics/migrations/table-cell-content/schema.json +15 -0
- package/schematics/migrations/tabs-signals-and-aria/README.md +93 -0
- package/schematics/migrations/tabs-signals-and-aria/data.js +139 -0
- package/schematics/migrations/tabs-signals-and-aria/index.js +65 -0
- package/schematics/migrations/tabs-signals-and-aria/schema.json +15 -0
- package/schematics/migrations/tag-list-cleaner/README.md +58 -0
- package/schematics/migrations/tag-list-cleaner/data.js +42 -0
- package/schematics/migrations/tag-list-cleaner/index.js +196 -0
- package/schematics/migrations/tag-list-cleaner/schema.json +20 -0
- package/schematics/migrations/tag-slots/README.md +41 -0
- package/schematics/migrations/tag-slots/index.js +190 -0
- package/schematics/migrations/tag-slots/schema.json +20 -0
- package/schematics/migrations/tags-signals/README.md +85 -0
- package/schematics/migrations/tags-signals/data.js +103 -0
- package/schematics/migrations/tags-signals/index.js +673 -0
- package/schematics/migrations/tags-signals/schema.json +20 -0
- package/schematics/migrations/textarea-signals/README.md +72 -0
- package/schematics/migrations/textarea-signals/data.js +121 -0
- package/schematics/migrations/textarea-signals/index.js +379 -0
- package/schematics/migrations/textarea-signals/schema.json +20 -0
- package/schematics/migrations/time-range-title-for/README.md +164 -0
- package/schematics/migrations/time-range-title-for/data.js +139 -0
- package/schematics/migrations/time-range-title-for/index.js +163 -0
- package/schematics/migrations/time-range-title-for/schema.json +20 -0
- package/schematics/migrations/timepicker-signals/README.md +78 -0
- package/schematics/migrations/timepicker-signals/data.js +82 -0
- package/schematics/migrations/timepicker-signals/index.js +709 -0
- package/schematics/migrations/timepicker-signals/schema.json +20 -0
- package/schematics/migrations/timezone-grouping-utils/README.md +73 -0
- package/schematics/migrations/timezone-grouping-utils/data.js +101 -0
- package/schematics/migrations/timezone-grouping-utils/index.js +64 -0
- package/schematics/migrations/timezone-grouping-utils/schema.json +15 -0
- package/schematics/migrations/title-encapsulation/README.md +49 -0
- package/schematics/migrations/title-encapsulation/data.js +69 -0
- package/schematics/migrations/title-encapsulation/index.js +57 -0
- package/schematics/migrations/title-encapsulation/schema.json +15 -0
- package/schematics/migrations/toast-stack-and-defaults/README.md +102 -0
- package/schematics/migrations/toast-stack-and-defaults/data.js +79 -0
- package/schematics/migrations/toast-stack-and-defaults/index.js +53 -0
- package/schematics/migrations/toast-stack-and-defaults/schema.json +15 -0
- package/schematics/migrations/tooltip-pointer-events-and-types/README.md +53 -0
- package/schematics/migrations/tooltip-pointer-events-and-types/data.js +89 -0
- package/schematics/migrations/tooltip-pointer-events-and-types/index.js +60 -0
- package/schematics/migrations/tooltip-pointer-events-and-types/schema.json +15 -0
- package/schematics/migrations/top-bar-container-selectors/README.md +111 -0
- package/schematics/migrations/top-bar-container-selectors/data.js +56 -0
- package/schematics/migrations/top-bar-container-selectors/index.js +84 -0
- package/schematics/migrations/top-bar-container-selectors/schema.json +20 -0
- package/schematics/migrations/tree-select-signals/README.md +61 -0
- package/schematics/migrations/tree-select-signals/data.js +106 -0
- package/schematics/migrations/tree-select-signals/index.js +58 -0
- package/schematics/migrations/tree-select-signals/schema.json +15 -0
- package/schematics/migrations/tree-signals/README.md +82 -0
- package/schematics/migrations/tree-signals/data.js +123 -0
- package/schematics/migrations/tree-signals/index.js +54 -0
- package/schematics/migrations/tree-signals/schema.json +15 -0
- package/schematics/migrations/tree-state-saving-default/README.md +66 -0
- package/schematics/migrations/tree-state-saving-default/data.js +78 -0
- package/schematics/migrations/tree-state-saving-default/index.js +60 -0
- package/schematics/migrations/tree-state-saving-default/schema.json +15 -0
- package/schematics/migrations/username-pipe-injection/README.md +59 -0
- package/schematics/migrations/username-pipe-injection/data.js +78 -0
- package/schematics/migrations/username-pipe-injection/index.js +58 -0
- package/schematics/migrations/username-pipe-injection/schema.json +15 -0
- package/schematics/migrations/v20-upgrade/README.md +36 -16
- package/schematics/migrations/v20-upgrade/data.js +124 -77
- package/schematics/migrations/v20-upgrade/index.js +6 -213
- package/schematics/migrations/v21-upgrade/README.md +271 -0
- package/schematics/migrations/v21-upgrade/data.js +1371 -0
- package/schematics/migrations/v21-upgrade/index.js +94 -0
- package/schematics/migrations/v21-upgrade/schema.json +20 -0
- package/schematics/migrations/zoneless-change-detection/README.md +30 -0
- package/schematics/migrations/zoneless-change-detection/data.js +29 -0
- package/schematics/migrations/zoneless-change-detection/index.js +20 -0
- package/schematics/migrations/zoneless-change-detection/schema.json +15 -0
- package/schematics/migrations.json +392 -2
- package/schematics/ng-add/index.js +515 -14
- package/schematics/ng-add/schema.json +15 -0
- package/schematics/utils/deprecated-path-migration.js +61 -0
- package/schematics/utils/package-config.js +9 -105
- package/scrollbar/{_scrollbar-component-theme.scss → deprecated/_scrollbar-component-theme.scss} +1 -1
- package/scrollbar/{scrollbar.component.scss → deprecated/scrollbar.component.scss} +1 -1
- package/scrollbar/native-scrollbar.scss +68 -0
- package/scrollbar/scrollbar-tokens.scss +13 -22
- package/scrollbar/scrollbar-track.scss +94 -0
- package/scrollbar/scrollbar-viewport.scss +33 -0
- package/scrollbar/scrollbar.scss +24 -0
- package/search-expandable/search-expandable-tokens.scss +4 -0
- package/search-expandable/search-expandable.scss +4 -2
- package/select/_select-theme.scss +3 -16
- package/select/select.scss +0 -6
- package/sidebar/sidebar.scss +20 -0
- package/sidepanel/_sidepanel-theme.scss +1 -1
- package/sidepanel/sidepanel-tokens.scss +7 -1
- package/sidepanel/sidepanel.scss +41 -5
- package/skeleton/skeleton-presets.scss +350 -0
- package/skeleton/skeleton-tokens.scss +127 -0
- package/skeleton/skeleton.scss +53 -45
- package/split-button/_split-button-theme.scss +4 -4
- package/split-button/split-button.scss +2 -6
- package/splitter/{_splitter-theme.scss → deprecated/_splitter-theme.scss} +1 -1
- package/splitter/deprecated/splitter.scss +51 -0
- package/splitter/splitter-tokens.scss +19 -0
- package/splitter/splitter.scss +148 -28
- package/table/_table-theme.scss +13 -12
- package/table/table-tokens.scss +8 -0
- package/table/table.scss +47 -22
- package/tabs/_tabs-common.scss +14 -14
- package/tabs/_tabs-theme.scss +4 -5
- package/tabs/tab-body.scss +49 -1
- package/tabs/tab-header.scss +2 -1
- package/tags/tag-list.scss +4 -0
- package/tags/tag.scss +19 -1
- package/time-range/time-range.scss +9 -0
- package/timezone/timezone-option.component.scss +4 -7
- package/timezone/timezone-select.component.scss +3 -0
- package/toast/_toast-theme.scss +1 -4
- package/toast/toast-container.component.scss +19 -13
- package/toast/toast-tokens.scss +12 -6
- package/toast/toast.component.scss +42 -19
- package/toggle/_toggle-theme.scss +4 -10
- package/toggle/toggle.scss +67 -26
- package/tooltip/_tooltip-theme.scss +7 -1
- package/tooltip/tooltip-tokens.scss +1 -2
- package/tooltip/tooltip.scss +55 -9
- package/top-bar/top-bar-tokens.scss +13 -2
- package/top-bar/top-bar.scss +24 -19
- package/tree/_tree-theme.scss +0 -1
- package/tree/toggle.scss +5 -9
- package/tree/tree-option.scss +2 -4
- package/tree/tree-tokens.scss +2 -1
- package/tree/tree.scss +3 -5
- package/tree-select/_tree-select-theme.scss +4 -15
- package/tree-select/tree-select-tokens.scss +16 -0
- package/tree-select/tree-select.scss +0 -6
- package/{accordion/index.d.ts → types/koobiq-components-accordion.d.ts} +102 -84
- package/{actions-panel/index.d.ts → types/koobiq-components-actions-panel.d.ts} +44 -59
- package/{alert/index.d.ts → types/koobiq-components-alert.d.ts} +8 -3
- package/types/koobiq-components-app-switcher.d.ts +406 -0
- package/types/koobiq-components-autocomplete.d.ts +443 -0
- package/{badge/index.d.ts → types/koobiq-components-badge.d.ts} +25 -20
- package/{breadcrumbs/index.d.ts → types/koobiq-components-breadcrumbs.d.ts} +97 -46
- package/types/koobiq-components-button-toggle.d.ts +340 -0
- package/types/koobiq-components-button.d.ts +296 -0
- package/types/koobiq-components-checkbox.d.ts +172 -0
- package/types/koobiq-components-clamped-text.d.ts +184 -0
- package/{code-block/index.d.ts → types/koobiq-components-code-block.d.ts} +114 -79
- package/{content-panel/index.d.ts → types/koobiq-components-content-panel.d.ts} +81 -25
- package/{core/index.d.ts → types/koobiq-components-core.d.ts} +2827 -865
- package/{datepicker/index.d.ts → types/koobiq-components-datepicker.d.ts} +161 -116
- package/types/koobiq-components-divider.d.ts +43 -0
- package/types/koobiq-components-dl.d.ts +235 -0
- package/{dropdown/index.d.ts → types/koobiq-components-dropdown.d.ts} +245 -239
- package/types/koobiq-components-ellipsis-center.d.ts +85 -0
- package/types/koobiq-components-empty-state.d.ts +106 -0
- package/{file-upload/index.d.ts → types/koobiq-components-file-upload.d.ts} +214 -107
- package/{filter-bar/index.d.ts → types/koobiq-components-filter-bar.d.ts} +410 -495
- package/types/koobiq-components-flag.d.ts +68 -0
- package/{form-field/index.d.ts → types/koobiq-components-form-field.d.ts} +167 -191
- package/types/koobiq-components-icon.d.ts +333 -0
- package/{inline-edit/index.d.ts → types/koobiq-components-inline-edit.d.ts} +109 -46
- package/types/koobiq-components-input.d.ts +477 -0
- package/types/koobiq-components-link-deprecated.d.ts +101 -0
- package/types/koobiq-components-link.d.ts +176 -0
- package/{list/index.d.ts → types/koobiq-components-list.d.ts} +162 -99
- package/types/koobiq-components-loader-overlay.d.ts +101 -0
- package/{markdown/index.d.ts → types/koobiq-components-markdown.d.ts} +16 -24
- package/types/koobiq-components-modal.d.ts +666 -0
- package/types/koobiq-components-navbar.d.ts +569 -0
- package/types/koobiq-components-notification-center.d.ts +500 -0
- package/{overflow-items/index.d.ts → types/koobiq-components-overflow-items.d.ts} +8 -22
- package/types/koobiq-components-popover.d.ts +468 -0
- package/types/koobiq-components-progress-bar.d.ts +67 -0
- package/{progress-spinner/index.d.ts → types/koobiq-components-progress-spinner.d.ts} +33 -10
- package/types/koobiq-components-radio.d.ts +294 -0
- package/{resizer/index.d.ts → types/koobiq-components-resizer.d.ts} +37 -2
- package/{scrollbar/index.d.ts → types/koobiq-components-scrollbar-deprecated.d.ts} +18 -1
- package/types/koobiq-components-scrollbar.d.ts +154 -0
- package/types/koobiq-components-search-expandable.d.ts +164 -0
- package/{select/index.d.ts → types/koobiq-components-select.d.ts} +360 -167
- package/types/koobiq-components-sidebar.d.ts +152 -0
- package/types/koobiq-components-sidepanel.d.ts +436 -0
- package/types/koobiq-components-skeleton.d.ts +234 -0
- package/types/koobiq-components-split-button.d.ts +65 -0
- package/{splitter/index.d.ts → types/koobiq-components-splitter-deprecated.d.ts} +44 -1
- package/types/koobiq-components-splitter.d.ts +406 -0
- package/types/koobiq-components-table.d.ts +44 -0
- package/types/koobiq-components-tabs.d.ts +888 -0
- package/{tags/index.d.ts → types/koobiq-components-tags.d.ts} +249 -133
- package/types/koobiq-components-textarea.d.ts +178 -0
- package/{time-range/index.d.ts → types/koobiq-components-time-range.d.ts} +135 -62
- package/types/koobiq-components-timepicker.d.ts +223 -0
- package/types/koobiq-components-timezone.d.ts +266 -0
- package/types/koobiq-components-title.d.ts +184 -0
- package/types/koobiq-components-toast.d.ts +289 -0
- package/types/koobiq-components-toggle.d.ts +121 -0
- package/types/koobiq-components-tooltip.d.ts +610 -0
- package/types/koobiq-components-top-bar.d.ts +61 -0
- package/types/koobiq-components-tree-select.d.ts +667 -0
- package/types/koobiq-components-tree.d.ts +1290 -0
- package/types/koobiq-components-username.d.ts +340 -0
- package/username/_username-theme.scss +35 -0
- package/username/username.scss +10 -34
- package/app-switcher/index.d.ts +0 -276
- package/autocomplete/index.d.ts +0 -286
- package/button/index.d.ts +0 -153
- package/button-toggle/index.d.ts +0 -162
- package/checkbox/index.d.ts +0 -163
- package/clamped-text/index.d.ts +0 -146
- package/core/styles/_tokens.scss +0 -7
- package/core/styles/common/_clearfix.scss +0 -13
- package/core/styles/common/_popup.scss +0 -6
- package/core/styles/functions/_index.scss +0 -3
- package/core/styles/functions/_number.scss +0 -60
- package/core/styles/functions/_string.scss +0 -18
- package/core/styles/theming/scrollbar-tokens.scss +0 -25
- package/core/styles/typography/_typography-utils.scss +0 -84
- package/divider/index.d.ts +0 -20
- package/dl/index.d.ts +0 -45
- package/ellipsis-center/index.d.ts +0 -71
- package/empty-state/index.d.ts +0 -45
- package/flag/index.d.ts +0 -44
- package/icon/index.d.ts +0 -200
- package/input/index.d.ts +0 -354
- package/link/index.d.ts +0 -56
- package/loader-overlay/index.d.ts +0 -57
- package/modal/index.d.ts +0 -339
- package/navbar/index.d.ts +0 -372
- package/notification-center/index.d.ts +0 -323
- package/popover/index.d.ts +0 -182
- package/prebuilt-themes/dark-theme.css +0 -1
- package/prebuilt-themes/light-theme.css +0 -1
- package/progress-bar/index.d.ts +0 -31
- package/radio/index.d.ts +0 -203
- package/search-expandable/index.d.ts +0 -101
- package/sidebar/index.d.ts +0 -94
- package/sidepanel/index.d.ts +0 -272
- package/skeleton/index.d.ts +0 -26
- package/split-button/index.d.ts +0 -46
- package/table/index.d.ts +0 -25
- package/tabs/index.d.ts +0 -677
- package/textarea/index.d.ts +0 -138
- package/timepicker/index.d.ts +0 -197
- package/timezone/index.d.ts +0 -125
- package/title/index.d.ts +0 -139
- package/toast/index.d.ts +0 -187
- package/toggle/index.d.ts +0 -104
- package/tooltip/index.d.ts +0 -335
- package/top-bar/index.d.ts +0 -33
- package/tree/index.d.ts +0 -802
- package/tree-select/index.d.ts +0 -475
- package/username/index.d.ts +0 -194
- /package/{dynamic-translation/index.d.ts → types/koobiq-components-dynamic-translation.d.ts} +0 -0
- /package/{index.d.ts → types/koobiq-components.d.ts} +0 -0
|
@@ -1,23 +1,24 @@
|
|
|
1
|
-
import { CdkMonitorFocus
|
|
2
|
-
import { Directionality } from '@angular/cdk/bidi';
|
|
3
|
-
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
1
|
+
import { CdkMonitorFocus } from '@angular/cdk/a11y';
|
|
4
2
|
import { SelectionModel } from '@angular/cdk/collections';
|
|
5
|
-
import {
|
|
3
|
+
import { CdkConnectedOverlay, CdkOverlayOrigin, OverlayModule } from '@angular/cdk/overlay';
|
|
6
4
|
import { Platform, _getEventTarget } from '@angular/cdk/platform';
|
|
7
5
|
import { NgTemplateOutlet } from '@angular/common';
|
|
8
6
|
import * as i0 from '@angular/core';
|
|
9
|
-
import { InjectionToken, inject, ElementRef, ChangeDetectorRef,
|
|
10
|
-
import { outputToObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
7
|
+
import { InjectionToken, inject, ElementRef, ChangeDetectorRef, Injector, Renderer2, signal, viewChild, viewChildren, contentChild, TemplateRef, input, EventEmitter, output, computed, booleanAttribute, linkedSignal, numberAttribute, DestroyRef, effect, afterNextRender, untracked, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
|
|
8
|
+
import { outputFromObservable, outputToObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
11
9
|
import { NgForm, FormGroupDirective, NgControl } from '@angular/forms';
|
|
12
|
-
import
|
|
10
|
+
import * as i1 from '@koobiq/components/core';
|
|
11
|
+
import { KbqAbstractSelect, isInput, shouldSelectSearchText, runClearPredicate, ErrorStateMatcher, KBQ_SELECT_SCROLL_STRATEGY, KBQ_OVERLAY_LAYERS, KbqErrorStateTracker, defaultOffsetY, KBQ_CONNECTED_OVERLAY_BELOW_CLASS, KBQ_CONNECTED_OVERLAY_ABOVE_CLASS, kbqQueryListFrom, KbqSelectTrigger, KbqSelectMatcher, KbqSelectSearch, KbqLocaleOverridesDirective, KBQ_SELECT_LOCALE_CONFIGURATION, kbqSelectAllHandlerTransform, KBQ_PANEL_DEFAULT_MIN_WIDTH, kbqResolvePanelMaxHeightToken, KbqComponentColors, getKbqSelectDynamicMultipleError, KbqSelectAllEvent, MultipleMode, DOWN_ARROW, UP_ARROW, LEFT_ARROW, RIGHT_ARROW, ENTER, SPACE, ESCAPE, TAB, HOME, END, PAGE_UP, PAGE_DOWN, isSelectAll, hasModifierKey, isUndefined, getKbqSelectNonArrayValueError, KBQ_PARENT_POPUP, kbqSiblingPopupProvider, KbqSelectFooter, KbqSelectSearchEmptyResult } from '@koobiq/components/core';
|
|
13
12
|
import { KBQ_FORM_FIELD, KbqCleaner, KbqFormFieldControl, kbqCleanerFactoryProvider, KbqFormFieldModule } from '@koobiq/components/form-field';
|
|
14
|
-
import * as
|
|
13
|
+
import * as i2 from '@koobiq/components/icon';
|
|
15
14
|
import { KbqIconModule } from '@koobiq/components/icon';
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
15
|
+
import { KbqScrollbarViewport } from '@koobiq/components/scrollbar';
|
|
16
|
+
import { KbqSelectNoOptions } from '@koobiq/components/select';
|
|
17
|
+
import { KbqTag, KbqTagRemove, KbqTagsModule } from '@koobiq/components/tags';
|
|
18
|
+
import { KbqTreeSelection, KbqTreeModule } from '@koobiq/components/tree';
|
|
18
19
|
import { SizeXxs } from '@koobiq/design-tokens';
|
|
19
|
-
import { Subject, defer, merge, Subscription, fromEvent, audit } from 'rxjs';
|
|
20
|
-
import { filter, map, startWith, switchMap,
|
|
20
|
+
import { Subject, defer, merge, Subscription, fromEvent, audit, timer } from 'rxjs';
|
|
21
|
+
import { filter, map, startWith, switchMap, delay, debounceTime, distinctUntilChanged, take } from 'rxjs/operators';
|
|
21
22
|
|
|
22
23
|
let nextUniqueId = 0;
|
|
23
24
|
/** Injection token that can be used to provide the default options for the `kbq-tree-select`. */
|
|
@@ -31,7 +32,19 @@ const kbqTreeSelectOptionsProvider = (options) => {
|
|
|
31
32
|
};
|
|
32
33
|
/** Change event object that is emitted when the select value has changed. */
|
|
33
34
|
class KbqTreeSelectChange {
|
|
34
|
-
constructor(
|
|
35
|
+
constructor(
|
|
36
|
+
/** Select the change comes from. */
|
|
37
|
+
source,
|
|
38
|
+
/**
|
|
39
|
+
* Option the change is about — a `KbqTreeOption` whenever the changed node is rendered, and the
|
|
40
|
+
* raw value of the node when it is not. `null` when the change is not about a single option,
|
|
41
|
+
* which today means the cleaner was activated; `values` then carries the nodes it removed.
|
|
42
|
+
*/
|
|
43
|
+
value,
|
|
44
|
+
/** Whether the change was made by the user rather than written to the model. */
|
|
45
|
+
isUserInput = false,
|
|
46
|
+
/** Every option the change is about, when it covers more than one. */
|
|
47
|
+
values) {
|
|
35
48
|
this.source = source;
|
|
36
49
|
this.value = value;
|
|
37
50
|
this.isUserInput = isUserInput;
|
|
@@ -39,114 +52,33 @@ class KbqTreeSelectChange {
|
|
|
39
52
|
}
|
|
40
53
|
}
|
|
41
54
|
class KbqTreeSelect extends KbqAbstractSelect {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return this._placeholder;
|
|
46
|
-
}
|
|
47
|
-
set placeholder(value) {
|
|
48
|
-
this._placeholder = value;
|
|
49
|
-
this.stateChanges.next();
|
|
50
|
-
}
|
|
51
|
-
// TODO: Skipped for migration because:
|
|
52
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
53
|
-
get required() {
|
|
54
|
-
return this._required;
|
|
55
|
-
}
|
|
56
|
-
set required(value) {
|
|
57
|
-
this._required = coerceBooleanProperty(value);
|
|
58
|
-
this.stateChanges.next();
|
|
59
|
-
}
|
|
60
|
-
// TODO: Skipped for migration because:
|
|
61
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
62
|
-
get multiple() {
|
|
63
|
-
return this._multiple;
|
|
64
|
-
}
|
|
65
|
-
set multiple(value) {
|
|
66
|
-
if (this.selectionModel) {
|
|
67
|
-
throw getKbqSelectDynamicMultipleError();
|
|
68
|
-
}
|
|
69
|
-
this._multiple = coerceBooleanProperty(value);
|
|
70
|
-
}
|
|
71
|
-
// TODO: Skipped for migration because:
|
|
72
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
73
|
-
get autoSelect() {
|
|
74
|
-
if (this.multiSelection) {
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
return this._autoSelect;
|
|
78
|
-
}
|
|
79
|
-
set autoSelect(value) {
|
|
80
|
-
this._autoSelect = coerceBooleanProperty(value);
|
|
81
|
-
}
|
|
82
|
-
get value() {
|
|
83
|
-
return this.tree().getSelectedValues();
|
|
55
|
+
/** Reference to the CDK connected overlay directive. */
|
|
56
|
+
get overlayDir() {
|
|
57
|
+
return this.overlayDirQuery();
|
|
84
58
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
get id() {
|
|
88
|
-
return this._id;
|
|
59
|
+
get tags() {
|
|
60
|
+
return this.tagsList();
|
|
89
61
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
this.
|
|
93
|
-
}
|
|
94
|
-
// TODO: Skipped for migration because:
|
|
95
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
96
|
-
get hasBackdrop() {
|
|
97
|
-
return this._hasBackdrop;
|
|
62
|
+
/** Whether multiple nodes can be selected. Cannot be changed once the selection model exists. */
|
|
63
|
+
get multiple() {
|
|
64
|
+
return this.multipleValue ?? this.multipleInput();
|
|
98
65
|
}
|
|
99
|
-
|
|
100
|
-
|
|
66
|
+
/** Whether moving the active node selects it. Always off in multiple selection. */
|
|
67
|
+
get autoSelect() {
|
|
68
|
+
return !this.multiSelection && this.autoSelectInput();
|
|
101
69
|
}
|
|
102
|
-
|
|
103
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
70
|
+
/** Tab index of the select, `-1` while it is disabled. A value that is not an integer keeps the last valid one. */
|
|
104
71
|
get tabIndex() {
|
|
105
|
-
return this.
|
|
106
|
-
}
|
|
107
|
-
set tabIndex(value) {
|
|
108
|
-
if (Number.isInteger(value) || value === null) {
|
|
109
|
-
this._tabIndex = value;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
// TODO: Skipped for migration because:
|
|
113
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
114
|
-
get disabled() {
|
|
115
|
-
return this._disabled;
|
|
116
|
-
}
|
|
117
|
-
set disabled(value) {
|
|
118
|
-
if (value !== this.disabled) {
|
|
119
|
-
this._disabled = value;
|
|
120
|
-
if (this.parentFormField) {
|
|
121
|
-
Promise.resolve().then(() => {
|
|
122
|
-
if (this._disabled) {
|
|
123
|
-
this.parentFormField.stopFocusMonitor();
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
this.parentFormField.runFocusMonitor();
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
// Let the parent form field know to run change detection when the disabled state changes.
|
|
131
|
-
this.stateChanges.next();
|
|
132
|
-
}
|
|
72
|
+
return this.resolvedTabIndex();
|
|
133
73
|
}
|
|
134
74
|
/**
|
|
135
75
|
* Function for handling the combination Ctrl + A (select all). By default, the internal handler is used.
|
|
136
76
|
*/
|
|
137
|
-
// TODO: Skipped for migration because:
|
|
138
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
139
77
|
get selectAllHandler() {
|
|
140
|
-
return this.
|
|
141
|
-
}
|
|
142
|
-
set selectAllHandler(fn) {
|
|
143
|
-
if (typeof fn !== 'function') {
|
|
144
|
-
throw Error('`selectAllHandler` must be a function.');
|
|
145
|
-
}
|
|
146
|
-
this._selectAllHandler = fn;
|
|
78
|
+
return this.selectAllHandlerInput() ?? this.defaultSelectAllHandler;
|
|
147
79
|
}
|
|
148
80
|
/** Function for handling the combination Ctrl + A (select all). By default, the internal handler is used. */
|
|
149
|
-
|
|
81
|
+
defaultSelectAllHandler(event, select) {
|
|
150
82
|
const searchInput = isInput(event) ? event.target : null;
|
|
151
83
|
if (shouldSelectSearchText(searchInput)) {
|
|
152
84
|
searchInput.select();
|
|
@@ -159,97 +91,93 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
159
91
|
// `onSelectAll` is emitted by the tree subscription set up in `ngAfterContentInit`.
|
|
160
92
|
select.tree().selectAllOptions(select.selectAll() || select.selectAllToggle());
|
|
161
93
|
}
|
|
162
|
-
/** Whether the select is focused. */
|
|
163
|
-
get focused() {
|
|
164
|
-
return this._focused || this._panelOpen;
|
|
165
|
-
}
|
|
166
|
-
set focused(value) {
|
|
167
|
-
this._focused = value;
|
|
168
|
-
}
|
|
169
94
|
/** Whether multiple choice is enabled or not. True if multiple or multiline */
|
|
170
95
|
get multiSelection() {
|
|
171
96
|
return this.multiple || this.multiline();
|
|
172
97
|
}
|
|
173
|
-
/**
|
|
174
|
-
* Controls when the search functionality is displayed based on the number of available options.
|
|
175
|
-
*
|
|
176
|
-
* Automatically enables search hiding if value provided, even if `defaultOptions.searchMinOptionsThreshold` is provided.
|
|
177
|
-
* @default undefined
|
|
178
|
-
*/
|
|
179
|
-
// TODO: Skipped for migration because:
|
|
180
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
181
|
-
set searchMinOptionsThreshold(value) {
|
|
182
|
-
this._searchMinOptionsThreshold =
|
|
183
|
-
this.resolveSearchMinOptionsThreshold(value) ??
|
|
184
|
-
this.resolveSearchMinOptionsThreshold(this.defaultOptions?.searchMinOptionsThreshold);
|
|
185
|
-
}
|
|
186
|
-
get searchMinOptionsThreshold() {
|
|
187
|
-
return this._searchMinOptionsThreshold;
|
|
188
|
-
}
|
|
189
98
|
get panelOpen() {
|
|
190
|
-
return this.
|
|
99
|
+
return this.panelOpenValue();
|
|
191
100
|
}
|
|
192
101
|
/** Whether the overlay panel is currently on screen. Part of the `KbqSiblingPopup` contract. */
|
|
193
102
|
get isAttached() {
|
|
194
|
-
return this.
|
|
103
|
+
return this.panelOpenValue();
|
|
195
104
|
}
|
|
196
105
|
/**
|
|
197
106
|
* Whether the cleaner (clear button) should be shown.
|
|
107
|
+
*
|
|
198
108
|
* @docs-private
|
|
199
109
|
*/
|
|
200
110
|
get canShowCleaner() {
|
|
201
111
|
return !!this.cleaner()?.canShow;
|
|
202
112
|
}
|
|
203
|
-
/**
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
113
|
+
/**
|
|
114
|
+
* Whether the cleaner still has a node to remove.
|
|
115
|
+
*
|
|
116
|
+
* @docs-private
|
|
117
|
+
*/
|
|
118
|
+
get canClear() {
|
|
119
|
+
return !!this.selectionModel?.selected.some((node) => runClearPredicate(this.clearPredicate(), node));
|
|
120
|
+
}
|
|
121
|
+
/** Selected nodes the cleaner removes, in selection order. */
|
|
122
|
+
get clearTargets() {
|
|
123
|
+
return this.selectionModel?.selected.filter((node) => runClearPredicate(this.clearPredicate(), node)) ?? [];
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The tree answers for any node; the option is asked only for its own `[disabled]` input, and a
|
|
127
|
+
* node inside a collapsed branch has no option to ask.
|
|
128
|
+
*/
|
|
129
|
+
isNodeDisabled(node) {
|
|
130
|
+
const tree = this.tree();
|
|
131
|
+
if (!tree)
|
|
132
|
+
return false;
|
|
133
|
+
if (tree.disabled || tree.treeControl.isDisabled(node))
|
|
134
|
+
return true;
|
|
135
|
+
return tree.renderedOptions.find((option) => option.data === node)?.disabled ?? false;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Accessible name of the combobox.
|
|
139
|
+
*
|
|
140
|
+
* A combobox takes its name from the author only, so the placeholder rendered inside the trigger does
|
|
141
|
+
* not name it. Falling back to the placeholder text keeps a control that was given neither an
|
|
142
|
+
* `aria-label` nor an `aria-labelledby` from being announced blank — the shape every consumer in the
|
|
143
|
+
* repository is in. Left off while `aria-labelledby` is set, which outranks `aria-label` anyway.
|
|
144
|
+
*/
|
|
145
|
+
get ariaLabelText() {
|
|
146
|
+
return this.resolvedAriaLabel();
|
|
209
147
|
}
|
|
210
148
|
constructor() {
|
|
211
149
|
super();
|
|
212
150
|
this.elementRef = inject(ElementRef);
|
|
213
151
|
this.changeDetectorRef = inject(ChangeDetectorRef);
|
|
214
|
-
this.
|
|
152
|
+
this.injector = inject(Injector);
|
|
215
153
|
this.renderer = inject(Renderer2);
|
|
216
154
|
this.defaultErrorStateMatcher = inject(ErrorStateMatcher);
|
|
217
155
|
this.scrollStrategyFactory = inject(KBQ_SELECT_SCROLL_STRATEGY);
|
|
218
|
-
this.
|
|
156
|
+
this.overlayLayers = inject(KBQ_OVERLAY_LAYERS);
|
|
219
157
|
this.parentForm = inject(NgForm, { optional: true });
|
|
220
158
|
this.parentFormGroup = inject(FormGroupDirective, { optional: true });
|
|
221
159
|
this.parentFormField = inject(KBQ_FORM_FIELD, { host: true, optional: true });
|
|
222
160
|
this.ngControl = inject(NgControl, { optional: true, self: true });
|
|
223
|
-
this.localeService = inject(KBQ_LOCALE_SERVICE, { optional: true });
|
|
224
161
|
this.isBrowser = inject(Platform).isBrowser;
|
|
225
162
|
this.defaultOptions = inject(KBQ_TREE_SELECT_OPTIONS, { optional: true });
|
|
163
|
+
this.errorStateTracker = new KbqErrorStateTracker(this.defaultErrorStateMatcher, this.ngControl, this.parentFormGroup, this.parentForm);
|
|
226
164
|
/** Whether the component is in an error state. */
|
|
227
|
-
this.errorState =
|
|
228
|
-
/**
|
|
229
|
-
* Emits whenever the component state changes and should cause the parent
|
|
230
|
-
* form-field to update. Implemented as part of `KbqFormFieldControl`.
|
|
231
|
-
* @docs-private
|
|
232
|
-
*/
|
|
233
|
-
this.stateChanges = new Subject();
|
|
165
|
+
this.errorState = this.errorStateTracker.errorState;
|
|
234
166
|
/** A name for this control that can be used by `kbq-form-field`. */
|
|
235
167
|
this.controlType = 'select';
|
|
236
|
-
|
|
168
|
+
/**
|
|
169
|
+
* A `kbq-tree-select` is not a native labelable element, so the form-field's `<label for>` cannot
|
|
170
|
+
* associate with it. The control is named through `aria-labelledby` instead.
|
|
171
|
+
*/
|
|
172
|
+
this.isNativeLabelSupported = false;
|
|
173
|
+
/** Number of the selected items that do not fit into the trigger. */
|
|
174
|
+
this.hiddenItems = signal(0, ...(ngDevMode ? [{ debugName: "hiddenItems" }] : /* istanbul ignore next */ []));
|
|
237
175
|
/** The cached font-size of the trigger element. */
|
|
238
176
|
this.triggerFontSize = 0;
|
|
239
|
-
/**
|
|
240
|
-
this.transformOrigin = 'top';
|
|
241
|
-
/** Emits when the panel element is finished transforming in. */
|
|
177
|
+
/** Emits once the panel has rendered (`'showing'`) or has been removed (`'void'`). */
|
|
242
178
|
this.panelDoneAnimatingStream = new Subject();
|
|
243
179
|
/** Strategy that will be used to handle scrolling while the select panel is open. */
|
|
244
180
|
this.scrollStrategy = this.scrollStrategyFactory();
|
|
245
|
-
/**
|
|
246
|
-
* The y-offset of the overlay panel in relation to the trigger.
|
|
247
|
-
*
|
|
248
|
-
* @deprecated noop. The trigger↔panel gap is now controlled by the `--kbq-connected-overlay-gap` CSS
|
|
249
|
-
* variable (transparent padding inside the pane via the `kbq-connected-overlay_below/_above` panel
|
|
250
|
-
* classes), not by a physical overlay offset — so setting this has no effect. Will be removed in 21.0.0.
|
|
251
|
-
*/
|
|
252
|
-
this.offsetY = 0;
|
|
253
181
|
/**
|
|
254
182
|
* Minimum space to keep between the overlay and the viewport edge.
|
|
255
183
|
* At least `defaultOffsetY` so CDK's fit check — which runs before the `kbq-connected-overlay_below/_above`
|
|
@@ -284,23 +212,39 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
284
212
|
*/
|
|
285
213
|
this.trigger = viewChild.required('trigger');
|
|
286
214
|
/** Reference to the overlay panel element. */
|
|
287
|
-
this.panel = viewChild('panel', ...(ngDevMode ? [{ debugName: "panel" }] : []));
|
|
215
|
+
this.panel = viewChild('panel', ...(ngDevMode ? [{ debugName: "panel" }] : /* istanbul ignore next */ []));
|
|
288
216
|
/** Scrollable option list inside the panel. */
|
|
289
|
-
this.optionsContainer = viewChild('optionsContainer', ...(ngDevMode ? [{ debugName: "optionsContainer" }] : []));
|
|
217
|
+
this.optionsContainer = viewChild('optionsContainer', ...(ngDevMode ? [{ debugName: "optionsContainer" }] : /* istanbul ignore next */ []));
|
|
218
|
+
/** The options container's custom scrollbar viewport, flashed when the panel opens. */
|
|
219
|
+
this.scrollbarViewport = viewChild(KbqScrollbarViewport, ...(ngDevMode ? [{ debugName: "scrollbarViewport" }] : /* istanbul ignore next */ []));
|
|
220
|
+
this.overlayDirQuery = viewChild(CdkConnectedOverlay, ...(ngDevMode ? [{ debugName: "overlayDirQuery" }] : /* istanbul ignore next */ []));
|
|
221
|
+
this.tagsQuery = viewChildren(KbqTag, ...(ngDevMode ? [{ debugName: "tagsQuery" }] : /* istanbul ignore next */ []));
|
|
222
|
+
this.tagsList = kbqQueryListFrom(this.tagsQuery);
|
|
290
223
|
/**
|
|
291
224
|
* Reference to the optional cleaner element for clearing selection.
|
|
225
|
+
*
|
|
292
226
|
* @docs-private
|
|
293
227
|
*/
|
|
294
|
-
this.cleaner = contentChild(KbqCleaner, ...(ngDevMode ?
|
|
228
|
+
this.cleaner = contentChild(KbqCleaner, { ...(ngDevMode ? { debugName: "cleaner" } : /* istanbul ignore next */ {}), descendants: false });
|
|
295
229
|
/** User-supplied override of the trigger element. */
|
|
296
|
-
this.customTrigger = contentChild(KbqSelectTrigger, ...(ngDevMode ? [{ debugName: "customTrigger" }] : []));
|
|
297
|
-
this.customMatcher = contentChild(KbqSelectMatcher, ...(ngDevMode ? [{ debugName: "customMatcher" }] : []));
|
|
298
|
-
this.customTagTemplateRef = contentChild('kbqSelectTagContent', ...(ngDevMode ?
|
|
299
|
-
this.tree = contentChild(KbqTreeSelection, ...(ngDevMode ? [{ debugName: "tree" }] : []));
|
|
300
|
-
this.search = contentChild(KbqSelectSearch, ...(ngDevMode ? [{ debugName: "search" }] : []));
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
230
|
+
this.customTrigger = contentChild(KbqSelectTrigger, ...(ngDevMode ? [{ debugName: "customTrigger" }] : /* istanbul ignore next */ []));
|
|
231
|
+
this.customMatcher = contentChild(KbqSelectMatcher, ...(ngDevMode ? [{ debugName: "customMatcher" }] : /* istanbul ignore next */ []));
|
|
232
|
+
this.customTagTemplateRef = contentChild('kbqSelectTagContent', { ...(ngDevMode ? { debugName: "customTagTemplateRef" } : /* istanbul ignore next */ {}), read: TemplateRef });
|
|
233
|
+
this.tree = contentChild(KbqTreeSelection, ...(ngDevMode ? [{ debugName: "tree" }] : /* istanbul ignore next */ []));
|
|
234
|
+
this.search = contentChild(KbqSelectSearch, ...(ngDevMode ? [{ debugName: "search" }] : /* istanbul ignore next */ []));
|
|
235
|
+
/** Message projected for an empty tree — the only thing the panel opens onto without options. */
|
|
236
|
+
this.noOptionsMessage = contentChild(KbqSelectNoOptions, ...(ngDevMode ? [{ debugName: "noOptionsMessage" }] : /* istanbul ignore next */ []));
|
|
237
|
+
/**
|
|
238
|
+
* Text of the counter of the selected items that do not fit into the trigger. `{{ number }}` is
|
|
239
|
+
* replaced with their number.
|
|
240
|
+
*
|
|
241
|
+
* Left unset, the text follows the active locale (`select.hiddenItemsText`); set, it wins over the
|
|
242
|
+
* locale and survives a locale change.
|
|
243
|
+
*/
|
|
244
|
+
this.hiddenItemsText = input(undefined, ...(ngDevMode ? [{ debugName: "hiddenItemsText" }] : /* istanbul ignore next */ []));
|
|
245
|
+
/** Formats the counter of the items that do not fit into the trigger. */
|
|
246
|
+
this.hiddenItemsTextFormatter = input((hiddenItemsText, hiddenItems) => hiddenItemsText.replace('{{ number }}', hiddenItems.toString()), ...(ngDevMode ? [{ debugName: "hiddenItemsTextFormatter" }] : /* istanbul ignore next */ []));
|
|
247
|
+
this.localeConfiguration = inject(KbqLocaleOverridesDirective, { self: true }).read('select', KBQ_SELECT_LOCALE_CONFIGURATION);
|
|
304
248
|
/**
|
|
305
249
|
* Event emitted when the select panel has been toggled.
|
|
306
250
|
* Also serves as the `openedChange` member of the `KbqSiblingPopup` contract — a tooltip sharing
|
|
@@ -308,10 +252,16 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
308
252
|
* `ngOnInit`) matters beyond this output's original consumers.
|
|
309
253
|
*/
|
|
310
254
|
this.openedChange = new EventEmitter();
|
|
255
|
+
/** @docs-private */
|
|
256
|
+
this.openedChangeOutput = outputFromObservable(this.openedChange, { alias: 'openedChange' });
|
|
311
257
|
/** Event emitted when the select has been opened. */
|
|
312
258
|
this.openedStream = this.openedChange.pipe(filter((o) => o), map(() => { }));
|
|
259
|
+
/** @docs-private */
|
|
260
|
+
this.openedOutput = outputFromObservable(this.openedStream, { alias: 'opened' });
|
|
313
261
|
/** Event emitted when the select has been closed. */
|
|
314
262
|
this.closedStream = this.openedChange.pipe(filter((o) => !o), map(() => { }));
|
|
263
|
+
/** @docs-private */
|
|
264
|
+
this.closedOutput = outputFromObservable(this.closedStream, { alias: 'closed' });
|
|
315
265
|
/** Event emitted when the selected value has been changed by the user. */
|
|
316
266
|
this.selectionChange = output();
|
|
317
267
|
/**
|
|
@@ -319,43 +269,87 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
319
269
|
* checkbox, the Ctrl/Cmd + A shortcut, or a custom `selectAllHandler` that delegates to it.
|
|
320
270
|
*/
|
|
321
271
|
this.onSelectAll = output();
|
|
272
|
+
/** Classes to be passed to the select panel. Supports the same syntax as the `[class]` binding. */
|
|
273
|
+
this.panelClass = input(undefined, ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
|
|
274
|
+
this.backdropClass = input('cdk-overlay-transparent-backdrop', ...(ngDevMode ? [{ debugName: "backdropClass" }] : /* istanbul ignore next */ []));
|
|
322
275
|
/**
|
|
323
|
-
*
|
|
324
|
-
*
|
|
325
|
-
*
|
|
276
|
+
* Name of the control, for when no element on the page carries it. Defaults to the placeholder.
|
|
277
|
+
*
|
|
278
|
+
* Prefer `aria-labelledby` and point it at visible text: a name that duplicates a visible label is one
|
|
279
|
+
* more string to keep in sync, and a name with no visible counterpart cannot be spoken back by voice
|
|
280
|
+
* control (WCAG 2.5.3).
|
|
326
281
|
*/
|
|
327
|
-
this.
|
|
328
|
-
/**
|
|
329
|
-
|
|
330
|
-
|
|
282
|
+
this.ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
|
|
283
|
+
/**
|
|
284
|
+
* Id of the element that names the control. Defaults to the `kbq-label` of a wrapping `kbq-form-field`.
|
|
285
|
+
*
|
|
286
|
+
* A `role="combobox"` element takes its name from the author only, so neither the placeholder nor the
|
|
287
|
+
* selected values name it, and the `<label for>` of the form field names labelable elements only, which
|
|
288
|
+
* a custom control is not. Without a form-field label, point this at whatever visible text names the
|
|
289
|
+
* control.
|
|
290
|
+
*/
|
|
291
|
+
this.ariaLabelledby = input(null, { ...(ngDevMode ? { debugName: "ariaLabelledby" } : /* istanbul ignore next */ {}), alias: 'aria-labelledby' });
|
|
292
|
+
/**
|
|
293
|
+
* Id of the element that names the control: its own `aria-labelledby`, or else the form-field label.
|
|
294
|
+
*
|
|
295
|
+
* @internal
|
|
296
|
+
*/
|
|
297
|
+
this.resolvedAriaLabelledby = computed(() => this.ariaLabelledby() ?? this.parentFormField?.labelId() ?? null, ...(ngDevMode ? [{ debugName: "resolvedAriaLabelledby" }] : /* istanbul ignore next */ []));
|
|
298
|
+
/** Object used to control when error messages are shown. */
|
|
299
|
+
this.errorStateMatcher = input(...(ngDevMode ? [undefined, { debugName: "errorStateMatcher" }] : /* istanbul ignore next */ []));
|
|
300
|
+
/**
|
|
301
|
+
* Function used to sort the values in a select in multiple mode, by default their order in the panel.
|
|
302
|
+
* Follows the same logic as `Array.prototype.sort`. Receives two selected data nodes and every data node of the
|
|
303
|
+
* tree in panel order, collapsed branches included — a node in a collapsed branch has no option.
|
|
304
|
+
*/
|
|
305
|
+
this.sortComparator = input(undefined, ...(ngDevMode ? [{ debugName: "sortComparator" }] : /* istanbul ignore next */ []));
|
|
331
306
|
/**
|
|
332
|
-
*
|
|
333
|
-
*
|
|
307
|
+
* Decides which selected nodes the projected `KbqCleaner` removes: return `true` to clear the node,
|
|
308
|
+
* `false` to keep it. Receives the data node, not the option — a node in a collapsed branch has no
|
|
309
|
+
* option. Disabled nodes are kept by default. Bind a stable reference — a new function on every
|
|
310
|
+
* change detection re-runs the predicate over the whole selection.
|
|
311
|
+
*
|
|
312
|
+
* Not consulted by `writeValue` / `reset()`, which always clear everything. The parameter type becomes the select's
|
|
313
|
+
* `T` in a template: type it with the tree's node, not with an option.
|
|
334
314
|
*/
|
|
335
|
-
this.
|
|
315
|
+
this.clearPredicate = input(this.defaultOptions?.clearPredicate ?? ((node) => !this.isNodeDisabled(node)), { ...(ngDevMode ? { debugName: "clearPredicate" } : /* istanbul ignore next */ {}), transform: (fn) => {
|
|
316
|
+
if (typeof fn !== 'function') {
|
|
317
|
+
throw Error('`clearPredicate` must be a function.');
|
|
318
|
+
}
|
|
319
|
+
return fn;
|
|
320
|
+
} });
|
|
336
321
|
/**
|
|
337
322
|
* Whether to use a multiline matcher or not. Default is false
|
|
338
323
|
*/
|
|
339
|
-
this.multiline = input(false, ...(ngDevMode ?
|
|
324
|
+
this.multiline = input(false, { ...(ngDevMode ? { debugName: "multiline" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
340
325
|
/** Combined stream of all of the child options' change events. */
|
|
341
326
|
this.optionSelectionChanges = defer(() => {
|
|
342
327
|
if (this.options) {
|
|
343
|
-
return this.options.changes.pipe(startWith(this.options), switchMap(() => merge(...this.options.map((option) => outputToObservable(option.
|
|
328
|
+
return this.options.changes.pipe(startWith(this.options), switchMap(() => merge(...this.options.map((option) => outputToObservable(option.selectionChange)))));
|
|
344
329
|
}
|
|
345
|
-
return this.
|
|
330
|
+
return this.optionsInitialized.pipe(switchMap(() => this.optionSelectionChanges));
|
|
346
331
|
});
|
|
347
332
|
/** Combined stream of all of the child options userInteraction events. */
|
|
348
333
|
this.userInteractionChanges = defer(() => {
|
|
349
334
|
if (this.options) {
|
|
350
335
|
return this.options.changes.pipe(startWith(this.options), switchMap(() => merge(...this.options.map((option) => option.userInteraction))));
|
|
351
336
|
}
|
|
352
|
-
return this.
|
|
337
|
+
return this.optionsInitialized.pipe(switchMap(() => this.userInteractionChanges));
|
|
353
338
|
});
|
|
354
|
-
|
|
355
|
-
this.
|
|
356
|
-
|
|
339
|
+
/** Emits once `options` is assigned, for subscribers that arrive before the content is resolved. */
|
|
340
|
+
this.optionsInitialized = new Subject();
|
|
341
|
+
/** Placeholder shown in the trigger while nothing is selected. */
|
|
342
|
+
this.placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
|
|
343
|
+
/** Whether the select is required. */
|
|
344
|
+
this.required = input(false, { ...(ngDevMode ? { debugName: "required" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
345
|
+
/** @docs-private */
|
|
346
|
+
this.multipleInput = input(false, { ...(ngDevMode ? { debugName: "multipleInput" } : /* istanbul ignore next */ {}), alias: 'multiple',
|
|
347
|
+
transform: booleanAttribute });
|
|
348
|
+
/** @docs-private */
|
|
349
|
+
this.autoSelectInput = input(true, { ...(ngDevMode ? { debugName: "autoSelectInput" } : /* istanbul ignore next */ {}), alias: 'autoSelect',
|
|
350
|
+
transform: booleanAttribute });
|
|
357
351
|
/** When `true`, a repeated Ctrl/Cmd+A deselects all options. Off by default (Ctrl+A only selects). */
|
|
358
|
-
this.selectAllToggle = input(false, ...(ngDevMode ?
|
|
352
|
+
this.selectAllToggle = input(false, { ...(ngDevMode ? { debugName: "selectAllToggle" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
359
353
|
/**
|
|
360
354
|
* Whether to render the "select all" master checkbox above the tree. Multiple selection only.
|
|
361
355
|
*
|
|
@@ -364,30 +358,61 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
364
358
|
* covers only the matches. Enabling it also makes Ctrl/Cmd + A a two-way toggle, so the shortcut and
|
|
365
359
|
* the checkbox never disagree (`selectAllToggle` is implied).
|
|
366
360
|
*/
|
|
367
|
-
this.selectAll = input(false, ...(ngDevMode ?
|
|
368
|
-
this.
|
|
369
|
-
|
|
370
|
-
this.
|
|
371
|
-
|
|
361
|
+
this.selectAll = input(false, { ...(ngDevMode ? { debugName: "selectAll" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
362
|
+
this.valueState = signal(undefined, ...(ngDevMode ? [{ debugName: "valueState" }] : /* istanbul ignore next */ []));
|
|
363
|
+
/** Values of the selected nodes: an array in multiple mode. */
|
|
364
|
+
this.value = this.valueState.asReadonly();
|
|
365
|
+
/** @docs-private */
|
|
366
|
+
this.idInput = input(undefined, { ...(ngDevMode ? { debugName: "idInput" } : /* istanbul ignore next */ {}), alias: 'id' });
|
|
367
|
+
/** Unique identifier of the select, generated when not provided. */
|
|
368
|
+
this.id = computed(() => this.idInput() || this.uid, ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
369
|
+
/** Whether the overlay panel is rendered on top of a backdrop. */
|
|
370
|
+
this.hasBackdrop = input(false, { ...(ngDevMode ? { debugName: "hasBackdrop" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
371
|
+
/** @docs-private */
|
|
372
|
+
this.tabIndexInput = input(0, { ...(ngDevMode ? { debugName: "tabIndexInput" } : /* istanbul ignore next */ {}), alias: 'tabIndex' });
|
|
373
|
+
this.validTabIndex = linkedSignal({ ...(ngDevMode ? { debugName: "validTabIndex" } : /* istanbul ignore next */ {}), source: () => this.tabIndexInput(),
|
|
374
|
+
computation: (value, previous) => (Number.isInteger(value) || value === null ? value : (previous?.value ?? 0)) });
|
|
375
|
+
/** @docs-private */
|
|
376
|
+
this.disabledInput = input(false, { ...(ngDevMode ? { debugName: "disabledInput" } : /* istanbul ignore next */ {}), alias: 'disabled',
|
|
377
|
+
transform: booleanAttribute });
|
|
378
|
+
/** Whether the select is disabled. Also set by the bound form control. */
|
|
379
|
+
this.disabled = linkedSignal(() => this.disabledInput(), ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
380
|
+
// One signal per host value. The host bindings of every tree-select in a view run in that view's reactive
|
|
381
|
+
// consumer, where a signal read again by another binding costs a scan of everything the view has read.
|
|
382
|
+
this.resolvedTabIndex = computed(() => (this.disabled() ? -1 : this.validTabIndex()), ...(ngDevMode ? [{ debugName: "resolvedTabIndex" }] : /* istanbul ignore next */ []));
|
|
383
|
+
this.resolvedAriaLabel = computed(() => this.resolvedAriaLabelledby() ? null : this.ariaLabel() || this.placeholder() || null, ...(ngDevMode ? [{ debugName: "resolvedAriaLabel" }] : /* istanbul ignore next */ []));
|
|
384
|
+
/** @internal */
|
|
385
|
+
this.disabledAttribute = computed(() => this.disabled() || null, ...(ngDevMode ? [{ debugName: "disabledAttribute" }] : /* istanbul ignore next */ []));
|
|
386
|
+
/** @internal */
|
|
387
|
+
this.disabledClass = computed(() => this.disabled(), ...(ngDevMode ? [{ debugName: "disabledClass" }] : /* istanbul ignore next */ []));
|
|
388
|
+
/** @internal */
|
|
389
|
+
this.invalidClass = computed(() => this.errorState(), ...(ngDevMode ? [{ debugName: "invalidClass" }] : /* istanbul ignore next */ []));
|
|
390
|
+
/** @docs-private */
|
|
391
|
+
this.selectAllHandlerInput = input(undefined, { ...(ngDevMode ? { debugName: "selectAllHandlerInput" } : /* istanbul ignore next */ {}), alias: 'selectAllHandler',
|
|
392
|
+
transform: kbqSelectAllHandlerTransform });
|
|
393
|
+
this.focusedValue = signal(false, ...(ngDevMode ? [{ debugName: "focusedValue" }] : /* istanbul ignore next */ []));
|
|
394
|
+
this.panelOpenValue = signal(false, ...(ngDevMode ? [{ debugName: "panelOpenValue" }] : /* istanbul ignore next */ []));
|
|
395
|
+
/** Whether the select is focused. */
|
|
396
|
+
this.focused = computed(() => this.focusedValue() || this.panelOpenValue(), ...(ngDevMode ? [{ debugName: "focused" }] : /* istanbul ignore next */ []));
|
|
372
397
|
/**
|
|
373
398
|
* Minimum width of the panel.
|
|
374
399
|
* If minWidth is larger than window width, it will be ignored.
|
|
375
400
|
*/
|
|
376
401
|
this.panelMinWidth = input(this.defaultOptions?.panelMinWidth === undefined
|
|
377
402
|
? KBQ_PANEL_DEFAULT_MIN_WIDTH
|
|
378
|
-
: this.defaultOptions.panelMinWidth, ...(ngDevMode ?
|
|
403
|
+
: this.defaultOptions.panelMinWidth, { ...(ngDevMode ? { debugName: "panelMinWidth" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
379
404
|
/**
|
|
380
405
|
* Width of the panel. If set to `auto`, the panel will match the trigger width, but will never be
|
|
381
406
|
* narrower than `panelMinWidth`. If set to null or an empty string, the panel will grow to match the
|
|
382
407
|
* longest option's text. Any other value is used as an exact width, and `panelMinWidth` is not applied.
|
|
383
408
|
*/
|
|
384
|
-
this.panelWidth = input(this.defaultOptions?.panelWidth ?? null, ...(ngDevMode ? [{ debugName: "panelWidth" }] : []));
|
|
409
|
+
this.panelWidth = input(this.defaultOptions?.panelWidth ?? null, ...(ngDevMode ? [{ debugName: "panelWidth" }] : /* istanbul ignore next */ []));
|
|
385
410
|
/**
|
|
386
411
|
* Maximum width of the panel in pixels. Caps how far the panel grows with its content — it never makes
|
|
387
412
|
* the panel narrower than the trigger, and never clamps an explicit `panelWidth`.
|
|
388
413
|
* When null, the `--kbq-panel-size-width-max` token applies.
|
|
389
414
|
*/
|
|
390
|
-
this.panelMaxWidth = input(this.defaultOptions?.panelMaxWidth === undefined ? null : this.defaultOptions.panelMaxWidth, ...(ngDevMode ?
|
|
415
|
+
this.panelMaxWidth = input(this.defaultOptions?.panelMaxWidth === undefined ? null : this.defaultOptions.panelMaxWidth, { ...(ngDevMode ? { debugName: "panelMaxWidth" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
391
416
|
/**
|
|
392
417
|
* Maximum height of the panel's scrollable option list, in pixels. Applied as the
|
|
393
418
|
* `--kbq-select-panel-size-max-height` custom property on the panel.
|
|
@@ -395,66 +420,140 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
395
420
|
* The search field and the footer sit outside the scrollable area and add to the panel's total height.
|
|
396
421
|
* When null, the token default (256px) applies.
|
|
397
422
|
*/
|
|
398
|
-
this.panelMaxHeight = input(this.defaultOptions?.panelMaxHeight === undefined ? null : this.defaultOptions.panelMaxHeight, ...(ngDevMode ?
|
|
423
|
+
this.panelMaxHeight = input(this.defaultOptions?.panelMaxHeight === undefined ? null : this.defaultOptions.panelMaxHeight, { ...(ngDevMode ? { debugName: "panelMaxHeight" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
399
424
|
/**
|
|
400
425
|
* `panelMaxHeight` rendered as a CSS length for the `--kbq-select-panel-size-max-height` token.
|
|
401
426
|
* A non-finite value (e.g. `null`) leaves the stylesheet default in place.
|
|
427
|
+
*
|
|
402
428
|
* @docs-private
|
|
403
429
|
*/
|
|
404
|
-
this.panelMaxHeightToken = computed(() => kbqResolvePanelMaxHeightToken(this.panelMaxHeight()), ...(ngDevMode ? [{ debugName: "panelMaxHeightToken" }] : []));
|
|
405
|
-
|
|
430
|
+
this.panelMaxHeightToken = computed(() => kbqResolvePanelMaxHeightToken(this.panelMaxHeight()), ...(ngDevMode ? [{ debugName: "panelMaxHeightToken" }] : /* istanbul ignore next */ []));
|
|
431
|
+
/**
|
|
432
|
+
* Controls when the search functionality is displayed based on the number of available options.
|
|
433
|
+
*
|
|
434
|
+
* Automatically enables search hiding if value provided, even if `defaultOptions.searchMinOptionsThreshold` is provided.
|
|
435
|
+
* Defaults to `undefined`.
|
|
436
|
+
*/
|
|
437
|
+
this.searchMinOptionsThreshold = computed(() => this.resolveSearchMinOptionsThreshold(this.searchMinOptionsThresholdInput()) ??
|
|
438
|
+
this.resolveSearchMinOptionsThreshold(this.defaultOptions?.searchMinOptionsThreshold), ...(ngDevMode ? [{ debugName: "searchMinOptionsThreshold" }] : /* istanbul ignore next */ []));
|
|
439
|
+
/** @docs-private */
|
|
440
|
+
this.searchMinOptionsThresholdInput = input(undefined, { ...(ngDevMode ? { debugName: "searchMinOptionsThresholdInput" } : /* istanbul ignore next */ {}), alias: 'searchMinOptionsThreshold' });
|
|
441
|
+
/**
|
|
442
|
+
* Colour of the trigger's tags and arrow.
|
|
443
|
+
*
|
|
444
|
+
* @docs-private
|
|
445
|
+
*/
|
|
446
|
+
this.colorForState = computed(() => this.errorState() ? KbqComponentColors.Error : KbqComponentColors.ContrastFade, ...(ngDevMode ? [{ debugName: "colorForState" }] : /* istanbul ignore next */ []));
|
|
447
|
+
/** Full set of classes for the panel: base class, form-field theme and custom `panelClass`. */
|
|
448
|
+
this.panelClasses = computed(() => {
|
|
449
|
+
const panelClass = this.panelClass();
|
|
450
|
+
const formFieldColor = this.parentFormField?.color();
|
|
451
|
+
const classes = ['kbq-tree-select__panel', formFieldColor ? `kbq-${formFieldColor}` : ''];
|
|
452
|
+
if (typeof panelClass === 'string') {
|
|
453
|
+
classes.push(panelClass);
|
|
454
|
+
}
|
|
455
|
+
else if (Array.isArray(panelClass) || panelClass instanceof Set) {
|
|
456
|
+
classes.push(...panelClass);
|
|
457
|
+
}
|
|
458
|
+
else if (panelClass) {
|
|
459
|
+
classes.push(...Object.keys(panelClass).filter((key) => panelClass[key]));
|
|
460
|
+
}
|
|
461
|
+
return classes.filter(Boolean).join(' ');
|
|
462
|
+
}, ...(ngDevMode ? [{ debugName: "panelClasses" }] : /* istanbul ignore next */ []));
|
|
463
|
+
/** Text of the counter of the items that do not fit into the trigger. */
|
|
464
|
+
this.hiddenItemsLabel = computed(() => this.hiddenItemsTextFormatter()(this.hiddenItemsText() ?? this.localeConfiguration().hiddenItemsText, this.hiddenItems()), ...(ngDevMode ? [{ debugName: "hiddenItemsLabel" }] : /* istanbul ignore next */ []));
|
|
406
465
|
this.triggerValues = [];
|
|
407
466
|
this.closeSubscription = Subscription.EMPTY;
|
|
408
|
-
this._panelOpen = false;
|
|
409
467
|
/** The scroll offset the panel is restored to when it attaches — the list always opens at the top. */
|
|
410
468
|
this.scrollTop = 0;
|
|
411
469
|
/** Unique id for this input. */
|
|
412
470
|
this.uid = `kbq-tree-select-${nextUniqueId++}`;
|
|
471
|
+
/** Id of the overlay panel, referenced by the host's `aria-controls`. */
|
|
472
|
+
this.panelId = `${this.uid}-panel`;
|
|
473
|
+
/**
|
|
474
|
+
* Whether projected content has been resolved. The search field reaches its form control through
|
|
475
|
+
* its own form field, and that is only guaranteed to have been wired by `ngAfterContentInit`.
|
|
476
|
+
*/
|
|
477
|
+
this.contentInitialized = signal(false, ...(ngDevMode ? [{ debugName: "contentInitialized" }] : /* istanbul ignore next */ []));
|
|
478
|
+
/**
|
|
479
|
+
* The last value the form wrote while the tree could not resolve all of it yet — before the content was
|
|
480
|
+
* initialized, or before the data held every node it names. Applied again as the data changes, until every node
|
|
481
|
+
* is found or the selection is reported to the form.
|
|
482
|
+
*/
|
|
483
|
+
this.pendingValue = null;
|
|
484
|
+
/** The data nodes {@link pendingValue} was last resolved against. */
|
|
485
|
+
this.pendingValueDataNodes = null;
|
|
486
|
+
/** Whether the selection is being set to a value the form wrote, which is no change to report back. */
|
|
487
|
+
this.writingValue = false;
|
|
488
|
+
/** Handles of the timers that outlive the call that scheduled them. */
|
|
489
|
+
this.pendingTimers = new Set();
|
|
413
490
|
this.destroyRef = inject(DestroyRef);
|
|
414
|
-
/**
|
|
491
|
+
/**
|
|
492
|
+
* Called when the value changes. Needed to properly implement `ControlValueAccessor`.
|
|
493
|
+
*
|
|
494
|
+
* @docs-private
|
|
495
|
+
*/
|
|
415
496
|
this.onChange = () => { };
|
|
416
|
-
/**
|
|
497
|
+
/**
|
|
498
|
+
* Called when the control is blurred. Needed to properly implement `ControlValueAccessor`.
|
|
499
|
+
*
|
|
500
|
+
* @docs-private
|
|
501
|
+
*/
|
|
417
502
|
this.onTouched = () => { };
|
|
503
|
+
this.emptyValue = signal(true, ...(ngDevMode ? [{ debugName: "emptyValue" }] : /* istanbul ignore next */ []));
|
|
504
|
+
/** Whether no node is selected. */
|
|
505
|
+
this.empty = this.emptyValue.asReadonly();
|
|
506
|
+
/**
|
|
507
|
+
* Recounts the tags of the trigger that do not fit on its first line and refreshes the "+N"
|
|
508
|
+
* counter. Runs on window resize and whenever the rendered tags change.
|
|
509
|
+
*
|
|
510
|
+
* @docs-private
|
|
511
|
+
*/
|
|
418
512
|
this.calculateHiddenItems = () => {
|
|
419
513
|
if (!this.isBrowser ||
|
|
420
514
|
this.customTrigger() ||
|
|
421
515
|
this.customMatcher() ||
|
|
422
|
-
this.empty ||
|
|
516
|
+
this.empty() ||
|
|
423
517
|
!this.multiple ||
|
|
424
518
|
this.multiline())
|
|
425
519
|
return;
|
|
426
|
-
const totalItemsWidth = this.
|
|
427
|
-
|
|
428
|
-
this.hiddenItems = this.selectionModel.selected.length - visibleItems;
|
|
520
|
+
const { totalItemsWidth, visibleItems } = this.measureMatcherItems();
|
|
521
|
+
this.hiddenItems.set(this.selectionModel.selected.length - visibleItems);
|
|
429
522
|
this.changeDetectorRef.detectChanges();
|
|
430
|
-
if (this.hiddenItems) {
|
|
523
|
+
if (this.hiddenItems()) {
|
|
431
524
|
const itemsCounter = this.trigger().nativeElement.querySelector('.kbq-select__match-hidden-text');
|
|
432
525
|
const matcherList = this.trigger().nativeElement.querySelector('.kbq-select__match-list');
|
|
433
|
-
if (!itemsCounter || !matcherList)
|
|
434
|
-
this.changeDetectorRef.markForCheck();
|
|
526
|
+
if (!itemsCounter || !matcherList)
|
|
435
527
|
return;
|
|
436
|
-
}
|
|
437
528
|
const itemsCounterShowed = itemsCounter.offsetTop < itemsCounter.offsetHeight;
|
|
438
529
|
const itemsCounterWidth = Math.floor(itemsCounter.getBoundingClientRect().width);
|
|
439
530
|
const matcherListWidth = Math.floor(matcherList.getBoundingClientRect().width);
|
|
440
531
|
const matcherWidth = matcherListWidth + (itemsCounterShowed ? itemsCounterWidth : 0);
|
|
441
532
|
if (itemsCounterShowed && totalItemsWidth < matcherWidth) {
|
|
442
|
-
this.hiddenItems
|
|
533
|
+
this.hiddenItems.set(0);
|
|
443
534
|
this.changeDetectorRef.detectChanges();
|
|
444
535
|
}
|
|
445
|
-
if (totalVisibleItemsWidth === matcherListWidth ||
|
|
446
|
-
totalVisibleItemsWidth + itemsCounterWidth < matcherListWidth) {
|
|
447
|
-
this.changeDetectorRef.markForCheck();
|
|
448
|
-
return;
|
|
449
|
-
}
|
|
450
536
|
}
|
|
451
|
-
this.changeDetectorRef.markForCheck();
|
|
452
|
-
};
|
|
453
|
-
this.updateLocaleParams = () => {
|
|
454
|
-
this.hiddenItemsText = this.localeService?.getParams('select').hiddenItemsText;
|
|
455
|
-
this.changeDetectorRef.markForCheck();
|
|
456
537
|
};
|
|
457
|
-
|
|
538
|
+
// The selection model is created with the multiplicity of the first binding and cannot follow a change.
|
|
539
|
+
effect(() => {
|
|
540
|
+
const multiple = this.multipleInput();
|
|
541
|
+
if (this.multipleValue !== undefined && multiple !== this.multipleValue) {
|
|
542
|
+
throw getKbqSelectDynamicMultipleError();
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
// A disabled select reports no focus to its form field.
|
|
546
|
+
let wasDisabled = false;
|
|
547
|
+
effect(() => {
|
|
548
|
+
const disabled = this.disabled();
|
|
549
|
+
if (disabled === wasDisabled)
|
|
550
|
+
return;
|
|
551
|
+
wasDisabled = disabled;
|
|
552
|
+
const formField = this.parentFormField;
|
|
553
|
+
if (formField) {
|
|
554
|
+
Promise.resolve().then(() => this.disabled() ? formField.stopFocusMonitor() : formField.runFocusMonitor());
|
|
555
|
+
}
|
|
556
|
+
});
|
|
458
557
|
// The tree owns the "select all" row — it is the only place that can put it in front of the nodes
|
|
459
558
|
// and into the key manager's list. Mirrored through an effect rather than assigned once in
|
|
460
559
|
// `ngAfterContentInit` so a `[selectAll]` bound to a changing expression keeps working.
|
|
@@ -464,13 +563,30 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
464
563
|
tree.selectAll = this.selectAll();
|
|
465
564
|
}
|
|
466
565
|
});
|
|
566
|
+
// `search` is projected content and can come and go with an `@if`, so both the wiring that
|
|
567
|
+
// follows it and the flag the tree reads on blur have to be re-applied, not read once.
|
|
568
|
+
// Gated on content init because the search reaches its control through its own form field,
|
|
569
|
+
// which is only guaranteed to have resolved by then.
|
|
570
|
+
effect((onCleanup) => {
|
|
571
|
+
const tree = this.tree();
|
|
572
|
+
const search = this.search();
|
|
573
|
+
if (!tree || !this.contentInitialized())
|
|
574
|
+
return;
|
|
575
|
+
tree.optionShouldHoldFocusOnBlur = !!search;
|
|
576
|
+
if (!search)
|
|
577
|
+
return;
|
|
578
|
+
const subscription = this.subscribeOnSearchChanges(tree, search);
|
|
579
|
+
onCleanup(() => subscription?.unsubscribe());
|
|
580
|
+
});
|
|
581
|
+
this.destroyRef.onDestroy(() => {
|
|
582
|
+
this.pendingTimers.forEach(clearTimeout);
|
|
583
|
+
this.pendingTimers.clear();
|
|
584
|
+
});
|
|
467
585
|
if (this.ngControl) {
|
|
468
586
|
// Note: we provide the value accessor through here, instead of
|
|
469
587
|
// the `providers` to avoid running into a circular import.
|
|
470
588
|
this.ngControl.valueAccessor = this;
|
|
471
589
|
}
|
|
472
|
-
// Force setter to be called in case id was not specified.
|
|
473
|
-
this.id = this.id;
|
|
474
590
|
afterNextRender(() => {
|
|
475
591
|
if (this.multiple && !this.multiline()) {
|
|
476
592
|
merge(fromEvent(this.window, 'resize'), this.tags.changes)
|
|
@@ -480,22 +596,20 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
480
596
|
});
|
|
481
597
|
}
|
|
482
598
|
ngOnInit() {
|
|
483
|
-
|
|
484
|
-
//
|
|
485
|
-
// fire the animation end event twice for the same animation. See:
|
|
486
|
-
// https://github.com/angular/angular/issues/24084
|
|
599
|
+
// Only the latest report of a frame is delivered, so a close and a reopen within one frame repeat the
|
|
600
|
+
// state delivered before; `distinctUntilChanged` keeps `openedChange` from emitting it twice.
|
|
487
601
|
this.panelDoneAnimatingStream
|
|
488
602
|
.pipe(distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))
|
|
489
603
|
.subscribe(() => {
|
|
490
604
|
if (this.panelOpen) {
|
|
491
|
-
this.
|
|
492
|
-
setTimeout(() => {
|
|
605
|
+
this.scheduleTimeout(() => {
|
|
493
606
|
this.highlightCorrectOption();
|
|
494
607
|
const search = this.search();
|
|
495
608
|
if (search) {
|
|
496
609
|
search.focus();
|
|
497
610
|
}
|
|
498
611
|
});
|
|
612
|
+
this.scrollbarViewport()?.flashScrollIndicators();
|
|
499
613
|
this.openedChange.emit(true);
|
|
500
614
|
}
|
|
501
615
|
else {
|
|
@@ -515,13 +629,20 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
515
629
|
if (!tree)
|
|
516
630
|
return;
|
|
517
631
|
tree.resetFocusedItemOnBlur = false;
|
|
518
|
-
|
|
519
|
-
this.selectionModel =
|
|
632
|
+
this.multipleValue = this.multipleInput();
|
|
633
|
+
this.selectionModel = new SelectionModel(this.multiSelection);
|
|
634
|
+
this.syncSelectionState();
|
|
520
635
|
this.selectionModel.changed.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
521
|
-
this.
|
|
636
|
+
this.syncSelectionState();
|
|
637
|
+
// Neither a written value nor the tree re-pointing the selection at reloaded data is the user's change.
|
|
638
|
+
if (!this.writingValue && !tree.syncingSelection) {
|
|
639
|
+
this.reportValue();
|
|
640
|
+
}
|
|
522
641
|
if (this.multiSelection) {
|
|
523
642
|
this.refreshTriggerValues();
|
|
524
643
|
}
|
|
644
|
+
// The trigger renders the selection, whichever way it changed (a click, `writeValue`, select all).
|
|
645
|
+
this.changeDetectorRef.markForCheck();
|
|
525
646
|
});
|
|
526
647
|
this.selectionModel.changed.pipe(delay(0), takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
527
648
|
// A multiline trigger grows with every selected option, and this is the one signal guaranteed
|
|
@@ -529,30 +650,43 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
529
650
|
this.updatePanelAnchor();
|
|
530
651
|
this.setOverlayPosition();
|
|
531
652
|
});
|
|
532
|
-
//
|
|
533
|
-
tree
|
|
653
|
+
// Hands the tree the model this component owns. Re-running `tree.ngAfterContentInit()` was the
|
|
654
|
+
// old way of doing it and left the tree with a second set of subscribers on query lists that are
|
|
655
|
+
// never re-created — every options change handled twice, for the lifetime of the component.
|
|
656
|
+
tree.initializeForEmbedding(this.selectionModel);
|
|
657
|
+
tree.renderedOptions.changes.pipe(delay(0), takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
658
|
+
// A value written ahead of its data, such as one loaded over HTTP, is applied once the nodes arrive.
|
|
659
|
+
if (this.pendingValue && tree.treeControl.dataNodes !== this.pendingValueDataNodes) {
|
|
660
|
+
this.applyPendingValue();
|
|
661
|
+
}
|
|
662
|
+
// Options render after the first value reaches the control, so the trigger is built before any
|
|
663
|
+
// of them exists and its `disabled` flags can be stale.
|
|
664
|
+
if (this.multiSelection && this.hasStaleTriggerValues()) {
|
|
665
|
+
this.refreshTriggerValues();
|
|
666
|
+
}
|
|
667
|
+
});
|
|
534
668
|
this.initKeyManager();
|
|
535
669
|
this.options = tree.renderedOptions;
|
|
536
670
|
tree.autoSelect = this.autoSelect;
|
|
537
671
|
// Single place the event is raised, so a click on the master checkbox and Ctrl/Cmd + A — which
|
|
538
672
|
// both go through `selectAllOptions` — emit exactly once and with the same payload.
|
|
539
|
-
outputToObservable(tree.
|
|
673
|
+
outputToObservable(tree.selectAllChange)
|
|
540
674
|
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
541
675
|
.subscribe(({ options }) => this.onSelectAll.emit(new KbqSelectAllEvent(this, options, tree.allOptionsSelected)));
|
|
542
676
|
// Tree lives inside the select panel: enable hover-to-focus on options even without a
|
|
543
677
|
// wrapping form-field (e.g. filter-bar pipes render the tree-select bare).
|
|
544
678
|
tree.inSelect = true;
|
|
545
|
-
if (tree.multipleMode === null) {
|
|
546
|
-
|
|
547
|
-
setTimeout(() => (this.tree().multipleMode = this.multiSelection ? MultipleMode.CHECKBOX : null));
|
|
679
|
+
if (tree.multipleMode === null && this.multiSelection) {
|
|
680
|
+
tree.multipleMode = MultipleMode.CHECKBOX;
|
|
548
681
|
}
|
|
549
682
|
if (this.multiSelection) {
|
|
550
683
|
tree.noUnselectLast = false;
|
|
551
684
|
}
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
this.
|
|
685
|
+
// A missing value written ahead of the content leaves the selection as empty as it starts.
|
|
686
|
+
if (this.pendingValue?.value === null || this.pendingValue?.value === undefined) {
|
|
687
|
+
this.pendingValue = null;
|
|
555
688
|
}
|
|
689
|
+
this.applyPendingValue();
|
|
556
690
|
this.userInteractionChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
557
691
|
if (!this.multiSelection && this.panelOpen) {
|
|
558
692
|
this.close();
|
|
@@ -562,7 +696,9 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
562
696
|
tree.selectionChange.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {
|
|
563
697
|
this.selectionChange.emit(new KbqTreeSelectChange(this, event.option, false, event.options));
|
|
564
698
|
const search = this.search();
|
|
565
|
-
|
|
699
|
+
// Guarded the same way every other refocus in the component is: with the field hidden by
|
|
700
|
+
// `searchMinOptionsThreshold` there is nothing to give the caret back to.
|
|
701
|
+
if (search && this.shouldShowSearch()) {
|
|
566
702
|
search.focus();
|
|
567
703
|
}
|
|
568
704
|
});
|
|
@@ -574,7 +710,9 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
574
710
|
this.tree().keyManager.setActiveItem(this.options.find(({ data }) => data === added[0]));
|
|
575
711
|
});
|
|
576
712
|
}
|
|
577
|
-
this.
|
|
713
|
+
this.contentInitialized.set(true);
|
|
714
|
+
this.optionsInitialized.next();
|
|
715
|
+
this.optionsInitialized.complete();
|
|
578
716
|
}
|
|
579
717
|
ngAfterViewInit() {
|
|
580
718
|
const tree = this.tree();
|
|
@@ -584,53 +722,44 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
584
722
|
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
585
723
|
.subscribe(() => this.setOverlayPosition());
|
|
586
724
|
}
|
|
725
|
+
ngAfterViewChecked() {
|
|
726
|
+
// Syncs the list here so `changes` emits once this view is checked.
|
|
727
|
+
this.tagsList();
|
|
728
|
+
}
|
|
587
729
|
ngOnDestroy() {
|
|
588
|
-
this.
|
|
730
|
+
this.panelDoneAnimatingStream.complete();
|
|
731
|
+
this.openedChange.complete();
|
|
589
732
|
this.closeSubscription.unsubscribe();
|
|
590
733
|
this.unsubscribeFromPanelResize();
|
|
591
734
|
}
|
|
592
735
|
updateErrorState() {
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
const matcher = this.errorStateMatcher || this.defaultErrorStateMatcher;
|
|
596
|
-
const control = this.ngControl ? this.ngControl.control : null;
|
|
597
|
-
const newState = matcher.isErrorState(control, parent);
|
|
598
|
-
if (newState !== oldState) {
|
|
599
|
-
this.errorState = newState;
|
|
600
|
-
this.stateChanges.next();
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) {
|
|
604
|
-
return hiddenItemsText.replace('{{ number }}', hiddenItems.toString());
|
|
736
|
+
this.errorStateTracker.errorStateMatcher = this.errorStateMatcher();
|
|
737
|
+
this.errorStateTracker.updateErrorState();
|
|
605
738
|
}
|
|
606
739
|
/**
|
|
607
|
-
* Clears the
|
|
740
|
+
* Clears the nodes `clearPredicate` accepts; disabled ones are kept by default.
|
|
741
|
+
*
|
|
742
|
+
* Deselects on the model directly: `tree.setOptionsFromValues([])` starts by clearing the whole
|
|
743
|
+
* model and would take the kept nodes with it.
|
|
744
|
+
*
|
|
608
745
|
* @docs-private
|
|
609
746
|
*/
|
|
610
747
|
clear() {
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
748
|
+
untracked(() => {
|
|
749
|
+
const targets = this.clearTargets;
|
|
750
|
+
this.selectionModel.deselect(...targets);
|
|
751
|
+
this.tree().keyManager.setActiveItem(-1);
|
|
752
|
+
this.changeDetectorRef.detectChanges();
|
|
753
|
+
this.reportValue();
|
|
754
|
+
this.selectionChange.emit(new KbqTreeSelectChange(this, null, false, targets));
|
|
755
|
+
});
|
|
616
756
|
}
|
|
617
|
-
/**
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
*/
|
|
622
|
-
clearValue(event) {
|
|
623
|
-
const cleaner = this.cleaner();
|
|
624
|
-
if (cleaner) {
|
|
625
|
-
cleaner.clear(event);
|
|
626
|
-
}
|
|
627
|
-
else {
|
|
628
|
-
event.stopPropagation();
|
|
629
|
-
event.preventDefault();
|
|
630
|
-
this.clear();
|
|
631
|
-
this.focus();
|
|
632
|
-
}
|
|
757
|
+
/** Reports the selection to the form, which then holds it instead of a value still waiting for its nodes. */
|
|
758
|
+
reportValue() {
|
|
759
|
+
this.pendingValue = null;
|
|
760
|
+
this.onChange(this.selectedValues);
|
|
633
761
|
}
|
|
762
|
+
/** Host click handler. A custom matcher that opts out of the default handlers takes it over. */
|
|
634
763
|
handleClick() {
|
|
635
764
|
const customMatcher = this.customMatcher();
|
|
636
765
|
if (customMatcher && !customMatcher.useDefaultHandlers())
|
|
@@ -638,15 +767,25 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
638
767
|
this.toggle();
|
|
639
768
|
}
|
|
640
769
|
toggle() {
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
this.
|
|
646
|
-
|
|
770
|
+
// Untracked, like the other imperative methods: called from a consumer's `effect()`, the state read on the
|
|
771
|
+
// way — `panelOpen`, `disabled`, the options, the inputs — would make the effect run again on every open
|
|
772
|
+
// and close.
|
|
773
|
+
untracked(() => {
|
|
774
|
+
if (this.panelOpen) {
|
|
775
|
+
this.close();
|
|
776
|
+
}
|
|
777
|
+
else {
|
|
778
|
+
this.open();
|
|
779
|
+
}
|
|
780
|
+
});
|
|
647
781
|
}
|
|
648
782
|
open() {
|
|
649
|
-
|
|
783
|
+
untracked(() => this.attachPanel());
|
|
784
|
+
}
|
|
785
|
+
attachPanel() {
|
|
786
|
+
if (this.disabled() || !this.options || this.panelOpenValue())
|
|
787
|
+
return;
|
|
788
|
+
if (!this.options.length && !this.noOptionsMessage())
|
|
650
789
|
return;
|
|
651
790
|
// add check for form-field bounding rectangles, since it adds extra padding around the trigger
|
|
652
791
|
this.triggerRect = (this.parentFormField?.getConnectedOverlayOrigin().nativeElement || this.trigger().nativeElement).getBoundingClientRect();
|
|
@@ -660,37 +799,51 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
660
799
|
this.overlayOrigin = this.parentFormField.getConnectedOverlayOrigin();
|
|
661
800
|
}
|
|
662
801
|
this.updateOverlayWidth(this.panelWidth(), this.panelMinWidth(), this.overlayOrigin ?? this.elementRef);
|
|
663
|
-
this.
|
|
802
|
+
this.panelOpenValue.set(true);
|
|
664
803
|
this.changeDetectorRef.markForCheck();
|
|
665
804
|
// Set the font size on the panel element once it exists.
|
|
666
|
-
|
|
667
|
-
.asObservable()
|
|
668
|
-
.pipe(take(1))
|
|
669
|
-
.subscribe(() => {
|
|
805
|
+
afterNextRender(() => {
|
|
670
806
|
if (this.triggerFontSize && this.overlayDir.overlayRef && this.overlayDir.overlayRef.overlayElement) {
|
|
671
807
|
this.overlayDir.overlayRef.overlayElement.style.fontSize = `${this.triggerFontSize}px`;
|
|
672
808
|
}
|
|
673
809
|
if (this.search()) {
|
|
674
810
|
this.lockOverlayWidthForSearch(this.panel());
|
|
675
811
|
}
|
|
676
|
-
});
|
|
812
|
+
}, { injector: this.injector });
|
|
813
|
+
this.reportPanelRendered('showing');
|
|
677
814
|
}
|
|
678
815
|
/** Closes the overlay panel and focuses the host element. */
|
|
679
816
|
close() {
|
|
680
|
-
|
|
817
|
+
untracked(() => {
|
|
818
|
+
if (!this.panelOpenValue()) {
|
|
819
|
+
return;
|
|
820
|
+
}
|
|
821
|
+
this.panelOpenValue.set(false);
|
|
822
|
+
this.unsubscribeFromPanelResize();
|
|
823
|
+
// Back to the two default sides, so the next open is not resolved against a first row that has since
|
|
824
|
+
// changed height.
|
|
825
|
+
this.positions = this.withOverlapPosition(this.positions, null) ?? this.positions;
|
|
826
|
+
this.changeDetectorRef.markForCheck();
|
|
827
|
+
this.onTouched();
|
|
828
|
+
const search = this.search();
|
|
829
|
+
if (search) {
|
|
830
|
+
search.reset();
|
|
831
|
+
}
|
|
832
|
+
this.reportPanelRendered('void');
|
|
833
|
+
});
|
|
834
|
+
}
|
|
835
|
+
/**
|
|
836
|
+
* Reports the panel rendered or removed once the next render has applied `panelOpen`; only the latest
|
|
837
|
+
* report of a frame is delivered.
|
|
838
|
+
*/
|
|
839
|
+
reportPanelRendered(state) {
|
|
840
|
+
this.panelRender?.destroy();
|
|
841
|
+
// The overlay detaching while the select is destroyed closes it too.
|
|
842
|
+
if (this.destroyRef.destroyed)
|
|
681
843
|
return;
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
// Back to the two default sides, so the next open is not resolved against a first row that has since
|
|
686
|
-
// changed height.
|
|
687
|
-
this.positions = this.withOverlapPosition(this.positions, null) ?? this.positions;
|
|
688
|
-
this.changeDetectorRef.markForCheck();
|
|
689
|
-
this.onTouched();
|
|
690
|
-
const search = this.search();
|
|
691
|
-
if (search) {
|
|
692
|
-
search.reset();
|
|
693
|
-
}
|
|
844
|
+
this.panelRender = afterNextRender(() => this.panelDoneAnimatingStream.next(state), {
|
|
845
|
+
injector: this.injector
|
|
846
|
+
});
|
|
694
847
|
}
|
|
695
848
|
/**
|
|
696
849
|
* Sets the select's value. Part of the ControlValueAccessor interface
|
|
@@ -699,11 +852,30 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
699
852
|
* @param value New value to be written to the model.
|
|
700
853
|
*/
|
|
701
854
|
writeValue(value) {
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
this.
|
|
855
|
+
// Untracked: a form control set from an `effect()` writes here synchronously.
|
|
856
|
+
untracked(() => {
|
|
857
|
+
this.pendingValue = { value };
|
|
858
|
+
// Until then the select has no selection model shared with the tree, and `ngAfterContentInit` applies it.
|
|
859
|
+
if (this.contentInitialized()) {
|
|
860
|
+
this.applyPendingValue();
|
|
861
|
+
}
|
|
862
|
+
});
|
|
863
|
+
}
|
|
864
|
+
/** Applies the value the form wrote last, and lets it go once the data holds every node it names. */
|
|
865
|
+
applyPendingValue() {
|
|
866
|
+
const pending = this.pendingValue;
|
|
867
|
+
const treeControl = this.tree()?.treeControl;
|
|
868
|
+
if (!pending || !treeControl)
|
|
869
|
+
return;
|
|
870
|
+
// Dropped first, so a value that throws is not applied again with every change of the data.
|
|
871
|
+
this.pendingValue = null;
|
|
872
|
+
this.pendingValueDataNodes = treeControl.dataNodes;
|
|
873
|
+
this.setSelectionByValue(pending.value);
|
|
874
|
+
const { value } = pending;
|
|
875
|
+
const values = value === null || value === undefined ? [] : this.multiSelection && Array.isArray(value) ? value : [value];
|
|
876
|
+
// Unless another value was written meanwhile.
|
|
877
|
+
if (this.pendingValue === null && !values.every((item) => treeControl.hasValue(item))) {
|
|
878
|
+
this.pendingValue = pending;
|
|
707
879
|
}
|
|
708
880
|
}
|
|
709
881
|
/**
|
|
@@ -723,7 +895,6 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
723
895
|
*
|
|
724
896
|
* @param fn Callback to be triggered when the component has been touched.
|
|
725
897
|
*/
|
|
726
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
727
898
|
registerOnTouched(fn) {
|
|
728
899
|
this.onTouched = fn;
|
|
729
900
|
}
|
|
@@ -734,9 +905,7 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
734
905
|
* @param isDisabled Sets whether the component is disabled.
|
|
735
906
|
*/
|
|
736
907
|
setDisabledState(isDisabled) {
|
|
737
|
-
this.disabled
|
|
738
|
-
this.changeDetectorRef.markForCheck();
|
|
739
|
-
this.stateChanges.next();
|
|
908
|
+
this.disabled.set(isDisabled);
|
|
740
909
|
}
|
|
741
910
|
get selected() {
|
|
742
911
|
return this.multiSelection ? this.selectionModel?.selected : this.selectionModel?.selected[0];
|
|
@@ -746,25 +915,25 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
746
915
|
return this.multiSelection ? selectedValues : selectedValues[0];
|
|
747
916
|
}
|
|
748
917
|
get triggerValue() {
|
|
749
|
-
if (this.empty) {
|
|
918
|
+
if (this.empty()) {
|
|
750
919
|
return '';
|
|
751
920
|
}
|
|
921
|
+
// Shown in single selection, where `selected` is the node.
|
|
752
922
|
return this.tree().treeControl.getViewValue(this.selected);
|
|
753
923
|
}
|
|
754
|
-
|
|
755
|
-
return !this.selectionModel || this.selectionModel.isEmpty();
|
|
756
|
-
}
|
|
757
|
-
isRtl() {
|
|
758
|
-
return this.dir ? this.dir.value === 'rtl' : false;
|
|
759
|
-
}
|
|
924
|
+
/** First selected node that is not disabled — the one the panel highlights when it opens. */
|
|
760
925
|
get firstSelected() {
|
|
761
926
|
return this.selectionModel.selected.filter((node) => !this.tree().treeControl.isDisabled(node))[0];
|
|
762
927
|
}
|
|
928
|
+
/**
|
|
929
|
+
* Host keydown handler, routing the event to the trigger or the panel handler. A custom matcher
|
|
930
|
+
* that opts out of the default handlers reaches those two directly instead.
|
|
931
|
+
*/
|
|
763
932
|
handleKeydown(event) {
|
|
764
933
|
const customMatcher = this.customMatcher();
|
|
765
934
|
if (customMatcher && !customMatcher.useDefaultHandlers())
|
|
766
935
|
return;
|
|
767
|
-
if (!this.disabled) {
|
|
936
|
+
if (!this.disabled()) {
|
|
768
937
|
if (this.panelOpen) {
|
|
769
938
|
this.panelKeydownHandler(event);
|
|
770
939
|
}
|
|
@@ -777,9 +946,8 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
777
946
|
const customMatcher = this.customMatcher();
|
|
778
947
|
if (customMatcher && !customMatcher.useDefaultHandlers())
|
|
779
948
|
return;
|
|
780
|
-
if (!this.disabled) {
|
|
781
|
-
this.
|
|
782
|
-
this.stateChanges.next();
|
|
949
|
+
if (!this.disabled()) {
|
|
950
|
+
this.focusedValue.set(true);
|
|
783
951
|
}
|
|
784
952
|
}
|
|
785
953
|
/**
|
|
@@ -790,25 +958,29 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
790
958
|
const customMatcher = this.customMatcher();
|
|
791
959
|
if (customMatcher && !customMatcher.useDefaultHandlers())
|
|
792
960
|
return;
|
|
793
|
-
this.
|
|
794
|
-
if (!this.disabled && !this.panelOpen) {
|
|
961
|
+
this.focusedValue.set(false);
|
|
962
|
+
if (!this.disabled() && !this.panelOpen) {
|
|
795
963
|
this.onTouched();
|
|
796
964
|
this.changeDetectorRef.markForCheck();
|
|
797
|
-
this.stateChanges.next();
|
|
798
965
|
}
|
|
799
966
|
}
|
|
800
967
|
/** Callback that is invoked when the overlay panel has been attached. */
|
|
801
968
|
onAttached() {
|
|
969
|
+
// `cdkConnectedOverlay` creates and attaches the overlay in one go, so this is the first point it exists.
|
|
970
|
+
this.overlayLayers.adopt(this.overlayDir.overlayRef, this.elementRef.nativeElement);
|
|
802
971
|
this.overlayDir.positionChange.pipe(take(1)).subscribe(() => {
|
|
803
972
|
this.changeDetectorRef.detectChanges();
|
|
804
973
|
this.setOverlayPosition();
|
|
805
974
|
// The panel itself is an `overflow: hidden` box; the option list is what scrolls.
|
|
806
|
-
this.
|
|
975
|
+
this.scrollbarViewport()?.scrollTo({ top: this.scrollTop });
|
|
807
976
|
this.tree().updateScrollSize();
|
|
808
977
|
// Deliberately out of this frame — see `reanchorPanel`. A microtask still lands before paint.
|
|
809
978
|
queueMicrotask(() => this.reanchorPanel());
|
|
810
979
|
});
|
|
811
980
|
this.subscribeToPanelResize();
|
|
981
|
+
// This runs on every open, so without dropping the previous subscription every open would add
|
|
982
|
+
// another one and a single outside click would call `close()` once per open so far.
|
|
983
|
+
this.closeSubscription.unsubscribe();
|
|
812
984
|
this.closeSubscription = this.closingActions().subscribe(() => this.close());
|
|
813
985
|
}
|
|
814
986
|
/** Element the overlay is positioned and sized against. */
|
|
@@ -816,43 +988,51 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
816
988
|
return this.parentFormField?.getConnectedOverlayOrigin().nativeElement ?? this.trigger()?.nativeElement;
|
|
817
989
|
}
|
|
818
990
|
isPanelOpen() {
|
|
819
|
-
return this.
|
|
820
|
-
}
|
|
821
|
-
/** Returns the theme to be used on the panel. */
|
|
822
|
-
getPanelTheme() {
|
|
823
|
-
return this.parentFormField ? `kbq-${this.parentFormField.color}` : '';
|
|
824
|
-
}
|
|
825
|
-
/** Returns the full set of classes for the panel: base class, theme and custom `panelClass`. */
|
|
826
|
-
getPanelClasses() {
|
|
827
|
-
const panelClass = this.panelClass();
|
|
828
|
-
const classes = ['kbq-tree-select__panel', this.getPanelTheme()];
|
|
829
|
-
if (typeof panelClass === 'string') {
|
|
830
|
-
classes.push(panelClass);
|
|
831
|
-
}
|
|
832
|
-
else if (Array.isArray(panelClass) || panelClass instanceof Set) {
|
|
833
|
-
classes.push(...panelClass);
|
|
834
|
-
}
|
|
835
|
-
else if (panelClass) {
|
|
836
|
-
classes.push(...Object.keys(panelClass).filter((key) => panelClass[key]));
|
|
837
|
-
}
|
|
838
|
-
return classes.filter(Boolean).join(' ');
|
|
991
|
+
return this.panelOpenValue();
|
|
839
992
|
}
|
|
840
993
|
focus() {
|
|
841
994
|
this.elementRef.nativeElement.focus();
|
|
842
995
|
}
|
|
843
996
|
/**
|
|
844
997
|
* Implemented as part of KbqFormFieldControl.
|
|
998
|
+
*
|
|
845
999
|
* @docs-private
|
|
846
1000
|
*/
|
|
847
1001
|
onContainerClick() {
|
|
848
1002
|
this.focus();
|
|
849
1003
|
}
|
|
850
|
-
/**
|
|
1004
|
+
/** Removes an option from the selection through the trailing icon of its tag in the trigger. */
|
|
851
1005
|
onRemoveSelectedOption(selectedOption, $event) {
|
|
852
1006
|
$event.stopPropagation();
|
|
853
|
-
|
|
1007
|
+
// Only removable tags render the icon, so this is also the index of the icon among them.
|
|
1008
|
+
const removedIndex = this.triggerValues
|
|
1009
|
+
.filter(({ disabled }) => !disabled)
|
|
1010
|
+
.findIndex(({ value }) => value === selectedOption.value);
|
|
1011
|
+
const removed = this.selectionModel.selected.find((node) => this.tree().treeControl.getValue(node) === selectedOption.value);
|
|
1012
|
+
if (removed !== undefined) {
|
|
1013
|
+
this.selectionModel.deselect(removed);
|
|
1014
|
+
}
|
|
854
1015
|
this.selectionChange.emit(new KbqTreeSelectChange(this, this.options.find((option) => option.value === selectedOption.value) || selectedOption.value));
|
|
855
|
-
this.
|
|
1016
|
+
this.reportValue();
|
|
1017
|
+
this.restoreFocusAfterRemoval(removedIndex);
|
|
1018
|
+
}
|
|
1019
|
+
/**
|
|
1020
|
+
* Takes the focus off the remove icon that has just been destroyed along with its tag.
|
|
1021
|
+
*
|
|
1022
|
+
* The trigger is rebuilt synchronously — `selectionModel.changed` runs `refreshTriggerValues()`,
|
|
1023
|
+
* which calls `detectChanges()` — so by the time the click handler returns the icon the keyboard was
|
|
1024
|
+
* on is gone and the focus has fallen back to the document body. Hands it to the icon that took the
|
|
1025
|
+
* removed tag's place, or to the control itself once no removable tag is left.
|
|
1026
|
+
*/
|
|
1027
|
+
restoreFocusAfterRemoval(removedIndex) {
|
|
1028
|
+
const removeIcons = this.trigger().nativeElement.querySelectorAll('[kbqTagRemove]');
|
|
1029
|
+
const next = removeIcons[Math.min(removedIndex, removeIcons.length - 1)];
|
|
1030
|
+
if (next) {
|
|
1031
|
+
next.focus();
|
|
1032
|
+
}
|
|
1033
|
+
else {
|
|
1034
|
+
this.focus();
|
|
1035
|
+
}
|
|
856
1036
|
}
|
|
857
1037
|
triggerKeydownHandler(event) {
|
|
858
1038
|
const keyCode = event.keyCode;
|
|
@@ -873,7 +1053,7 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
873
1053
|
const keyCode = event.keyCode;
|
|
874
1054
|
const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;
|
|
875
1055
|
const tree = this.tree();
|
|
876
|
-
if ((isArrowKey && event.altKey) || keyCode === ESCAPE
|
|
1056
|
+
if ((isArrowKey && event.altKey) || keyCode === ESCAPE) {
|
|
877
1057
|
// Close the select on ALT + arrow key to match the native <select>
|
|
878
1058
|
event.preventDefault();
|
|
879
1059
|
// Prevent ESCAPE from bubbling to ancestor (when inside overlay)
|
|
@@ -883,8 +1063,15 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
883
1063
|
this.close();
|
|
884
1064
|
this.focus();
|
|
885
1065
|
}
|
|
1066
|
+
else if (keyCode === TAB) {
|
|
1067
|
+
// Deliberately not `preventDefault`-ed. Closing the panel and pulling the focus back to the
|
|
1068
|
+
// host is all this control has to do; the browser then moves on to the next control the way
|
|
1069
|
+
// Tab always does. Swallowing the key trapped the focus inside an open select.
|
|
1070
|
+
this.close();
|
|
1071
|
+
this.focus();
|
|
1072
|
+
}
|
|
886
1073
|
else if (keyCode === LEFT_ARROW || keyCode === RIGHT_ARROW) {
|
|
887
|
-
|
|
1074
|
+
tree.handleKeydown(event);
|
|
888
1075
|
// LEFT_ARROW moves focus to the parent option when the active one is already collapsed,
|
|
889
1076
|
// so the search field has to be given the caret back, the same way the other keys do below.
|
|
890
1077
|
const search = this.search();
|
|
@@ -912,7 +1099,7 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
912
1099
|
else if ((keyCode === ENTER || keyCode === SPACE) && tree.keyManager.activeItem) {
|
|
913
1100
|
event.preventDefault();
|
|
914
1101
|
if (!this.autoSelect) {
|
|
915
|
-
|
|
1102
|
+
tree.handleKeydown(event);
|
|
916
1103
|
}
|
|
917
1104
|
else {
|
|
918
1105
|
this.close();
|
|
@@ -957,9 +1144,20 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
957
1144
|
// reading the tree's own authoritative node count instead of subtracting from `options.length`
|
|
958
1145
|
// sidesteps that race entirely, rather than risking the two going momentarily out of step.
|
|
959
1146
|
const optionsCount = this.tree()?.nodesCount ?? this.options.length;
|
|
960
|
-
return (isUndefined(this.searchMinOptionsThreshold) ||
|
|
1147
|
+
return (isUndefined(this.searchMinOptionsThreshold()) ||
|
|
961
1148
|
!!this.search()?.value() ||
|
|
962
|
-
optionsCount >= this.searchMinOptionsThreshold);
|
|
1149
|
+
optionsCount >= this.searchMinOptionsThreshold());
|
|
1150
|
+
}
|
|
1151
|
+
/**
|
|
1152
|
+
* Runs `callback` after the current task, keeping the handle so that destroying the component
|
|
1153
|
+
* cancels it. A timer left to fire after teardown runs against a component that is already gone.
|
|
1154
|
+
*/
|
|
1155
|
+
scheduleTimeout(callback) {
|
|
1156
|
+
const handle = setTimeout(() => {
|
|
1157
|
+
this.pendingTimers.delete(handle);
|
|
1158
|
+
callback();
|
|
1159
|
+
});
|
|
1160
|
+
this.pendingTimers.add(handle);
|
|
963
1161
|
}
|
|
964
1162
|
closingActions() {
|
|
965
1163
|
const backdrop = this.overlayDir.overlayRef.backdropClick();
|
|
@@ -969,33 +1167,34 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
969
1167
|
const detachments = this.overlayDir.overlayRef.detachments();
|
|
970
1168
|
return merge(backdrop, outsidePointerEvents, detachments);
|
|
971
1169
|
}
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
}
|
|
982
|
-
getTotalVisibleItems() {
|
|
1170
|
+
/**
|
|
1171
|
+
* Measures the tags of the matcher on an off-screen copy of the trigger.
|
|
1172
|
+
*
|
|
1173
|
+
* Two answers are needed — how many tags fit on the first line next to the "+N" counter, and how
|
|
1174
|
+
* wide all of them are together — and they used to cost a clone each. One clone is enough: it is
|
|
1175
|
+
* built, appended and removed once, and the only thing separating the two passes is the counter,
|
|
1176
|
+
* which the second pass drops from the copy.
|
|
1177
|
+
*/
|
|
1178
|
+
measureMatcherItems() {
|
|
983
1179
|
const triggerClone = this.buildTriggerClone();
|
|
984
1180
|
const hiddenText = triggerClone.querySelector('.kbq-select__match-hidden-text');
|
|
985
1181
|
if (hiddenText) {
|
|
986
1182
|
this.renderer.setStyle(hiddenText, 'display', 'block');
|
|
987
1183
|
}
|
|
988
1184
|
this.renderer.appendChild(this.trigger().nativeElement, triggerClone);
|
|
989
|
-
let
|
|
990
|
-
let totalVisibleItemsWidth = 0;
|
|
1185
|
+
let visibleItems = 0;
|
|
991
1186
|
triggerClone.querySelectorAll('kbq-tag').forEach((item) => {
|
|
992
1187
|
if (item.offsetTop < item.offsetHeight) {
|
|
993
|
-
|
|
994
|
-
visibleItemsCount++;
|
|
1188
|
+
visibleItems++;
|
|
995
1189
|
}
|
|
996
1190
|
});
|
|
1191
|
+
hiddenText?.remove();
|
|
1192
|
+
let totalItemsWidth = 0;
|
|
1193
|
+
triggerClone
|
|
1194
|
+
.querySelectorAll('kbq-tag')
|
|
1195
|
+
.forEach((item) => (totalItemsWidth += this.getItemWidth(item)));
|
|
997
1196
|
triggerClone.remove();
|
|
998
|
-
return
|
|
1197
|
+
return { totalItemsWidth, visibleItems };
|
|
999
1198
|
}
|
|
1000
1199
|
buildTriggerClone() {
|
|
1001
1200
|
const triggerClone = this.trigger().nativeElement.cloneNode(true);
|
|
@@ -1018,11 +1217,20 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
1018
1217
|
const marginRight = parseFloat(computedStyle.marginRight) || 0;
|
|
1019
1218
|
return width + marginLeft + marginRight + parseInt(SizeXxs);
|
|
1020
1219
|
}
|
|
1220
|
+
/** Whether the trigger's tags still agree with the selection about which nodes are disabled. */
|
|
1221
|
+
hasStaleTriggerValues() {
|
|
1222
|
+
const selected = this.selectionModel.selected;
|
|
1223
|
+
return (this.triggerValues.length === selected.length &&
|
|
1224
|
+
selected.some((node, index) => this.triggerValues[index].disabled !== this.isNodeDisabled(node)));
|
|
1225
|
+
}
|
|
1021
1226
|
refreshTriggerValues() {
|
|
1227
|
+
const treeControl = this.tree().treeControl;
|
|
1022
1228
|
this.triggerValues = this.selectionModel.selected.map((node) => ({
|
|
1023
|
-
value:
|
|
1024
|
-
viewValue:
|
|
1025
|
-
|
|
1229
|
+
value: treeControl.getValue(node),
|
|
1230
|
+
viewValue: treeControl.getViewValue(node),
|
|
1231
|
+
// `treeControl` alone would miss a node disabled through the option's own input and give it
|
|
1232
|
+
// a remove icon — one-by-one removal of exactly what the cleaner keeps.
|
|
1233
|
+
disabled: this.isNodeDisabled(node)
|
|
1026
1234
|
}));
|
|
1027
1235
|
this.changeDetectorRef.detectChanges();
|
|
1028
1236
|
}
|
|
@@ -1031,42 +1239,76 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
1031
1239
|
* found with the designated value, the select trigger is cleared.
|
|
1032
1240
|
*/
|
|
1033
1241
|
setSelectionByValue(value) {
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1242
|
+
// Restored rather than cleared: a value written while this one is applied must not end the outer write.
|
|
1243
|
+
const wasWritingValue = this.writingValue;
|
|
1244
|
+
this.writingValue = true;
|
|
1245
|
+
try {
|
|
1246
|
+
if (this.multiSelection && value) {
|
|
1247
|
+
if (!Array.isArray(value)) {
|
|
1248
|
+
throw getKbqSelectNonArrayValueError();
|
|
1249
|
+
}
|
|
1250
|
+
this.tree().setOptionsFromValues(value);
|
|
1251
|
+
this.sortValues();
|
|
1252
|
+
}
|
|
1253
|
+
else {
|
|
1254
|
+
this.tree().setOptionsFromValues([value]);
|
|
1037
1255
|
}
|
|
1038
|
-
this.tree().setOptionsFromValues(value);
|
|
1039
|
-
this.sortValues();
|
|
1040
1256
|
}
|
|
1041
|
-
|
|
1042
|
-
this.
|
|
1257
|
+
finally {
|
|
1258
|
+
this.writingValue = wasWritingValue;
|
|
1043
1259
|
}
|
|
1044
1260
|
this.changeDetectorRef.detectChanges();
|
|
1045
1261
|
}
|
|
1046
1262
|
initKeyManager() {
|
|
1047
1263
|
const tree = this.tree();
|
|
1048
|
-
|
|
1049
|
-
tree
|
|
1264
|
+
// The select routes every key itself and calls back into `tree.handleKeydown` for the parts it
|
|
1265
|
+
// delegates, so the tree must not also act on the same event from its own host listener.
|
|
1266
|
+
tree.ownsKeyboard = false;
|
|
1267
|
+
// `panelKeydownHandler` forwards every unhandled key to the tree's key manager, and the search
|
|
1268
|
+
// field sits inside the panel — so its query would otherwise drive the tree's type-ahead.
|
|
1269
|
+
tree.typeAhead = !this.search();
|
|
1050
1270
|
tree.keyManager.change.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
1051
1271
|
const treeValue = this.tree();
|
|
1052
|
-
if (this.
|
|
1272
|
+
if (this.panelOpenValue() && this.panel()) {
|
|
1053
1273
|
this.scrollActiveOptionIntoView();
|
|
1054
1274
|
}
|
|
1055
|
-
else if (!this.
|
|
1275
|
+
else if (!this.panelOpenValue() &&
|
|
1276
|
+
!this.multiSelection &&
|
|
1277
|
+
treeValue.keyManager.activeItem &&
|
|
1278
|
+
// The active option follows a written value, or the selection the tree re-pointed at reloaded data;
|
|
1279
|
+
// selecting it again would report it as the user's.
|
|
1280
|
+
!this.writingValue &&
|
|
1281
|
+
!treeValue.syncingSelection) {
|
|
1056
1282
|
treeValue.keyManager.activeItem.selectViaInteraction();
|
|
1057
1283
|
}
|
|
1058
1284
|
});
|
|
1059
1285
|
}
|
|
1060
|
-
/**
|
|
1286
|
+
/**
|
|
1287
|
+
* Sorts the selected nodes by their order in the panel, collapsed branches included, or with `sortComparator`.
|
|
1288
|
+
* A node missing from the data sorts after every node in it.
|
|
1289
|
+
*/
|
|
1061
1290
|
sortValues() {
|
|
1062
|
-
if (this.multiSelection)
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
this.stateChanges.next();
|
|
1291
|
+
if (!this.multiSelection)
|
|
1292
|
+
return;
|
|
1293
|
+
const nodes = this.tree().treeControl.dataNodes ?? [];
|
|
1294
|
+
const sortComparator = this.sortComparator();
|
|
1295
|
+
if (sortComparator) {
|
|
1296
|
+
this.selectionModel.sort((a, b) => sortComparator(a, b, nodes));
|
|
1069
1297
|
}
|
|
1298
|
+
else {
|
|
1299
|
+
// Indexed once: `indexOf` in the comparator would scan the whole data set on every comparison.
|
|
1300
|
+
const order = new Map(nodes.map((node, index) => [node, index]));
|
|
1301
|
+
const indexOf = (node) => order.get(node) ?? nodes.length;
|
|
1302
|
+
this.selectionModel.sort((a, b) => indexOf(a) - indexOf(b));
|
|
1303
|
+
}
|
|
1304
|
+
this.syncSelectionState();
|
|
1305
|
+
// The tags were built while the model emitted, ahead of the sort.
|
|
1306
|
+
this.refreshTriggerValues();
|
|
1307
|
+
}
|
|
1308
|
+
/** Mirrors the selection into the `value` and `empty` signals. */
|
|
1309
|
+
syncSelectionState() {
|
|
1310
|
+
this.emptyValue.set(this.selectionModel.isEmpty());
|
|
1311
|
+
this.valueState.set(this.selectedValues);
|
|
1070
1312
|
}
|
|
1071
1313
|
/**
|
|
1072
1314
|
* Highlights the selected item. If no option is selected, it will highlight
|
|
@@ -1092,19 +1334,29 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
1092
1334
|
scrollActiveOptionIntoView() {
|
|
1093
1335
|
this.tree().keyManager.activeItem?.focus();
|
|
1094
1336
|
}
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1337
|
+
/**
|
|
1338
|
+
* Keeps `isEmptySearchResult` in step with the search field.
|
|
1339
|
+
*
|
|
1340
|
+
* The flag is read back once the tree has had the chance to re-render for the new query. Waiting on
|
|
1341
|
+
* the rendered set alone is not enough: a query that filters nothing out leaves the option list —
|
|
1342
|
+
* and therefore its `changes` — silent, and the flag kept answering for the query before it. The
|
|
1343
|
+
* timer is the floor that covers that case.
|
|
1344
|
+
*/
|
|
1345
|
+
subscribeOnSearchChanges(tree, search) {
|
|
1346
|
+
const ngControl = search.ngControl;
|
|
1347
|
+
const valueChanges = ngControl?.valueChanges;
|
|
1348
|
+
if (!ngControl || !valueChanges)
|
|
1098
1349
|
return;
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1350
|
+
// Seeded rather than piped through `startWith`, which would open the gate below — and with it a
|
|
1351
|
+
// timer — before the user has typed anything.
|
|
1352
|
+
this.isEmptySearchResult = !!ngControl.value && tree.isEmpty;
|
|
1353
|
+
return valueChanges.pipe(audit(() => merge(tree.unorderedOptions.changes, timer(0)))).subscribe((value) => {
|
|
1354
|
+
this.isEmptySearchResult = !!value && tree.isEmpty;
|
|
1103
1355
|
this.changeDetectorRef.markForCheck();
|
|
1104
1356
|
});
|
|
1105
1357
|
}
|
|
1106
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1107
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
1358
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelect, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1359
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.25", type: KbqTreeSelect, isStandalone: true, selector: "kbq-tree-select", inputs: { hiddenItemsText: { classPropertyName: "hiddenItemsText", publicName: "hiddenItemsText", isSignal: true, isRequired: false, transformFunction: null }, hiddenItemsTextFormatter: { classPropertyName: "hiddenItemsTextFormatter", publicName: "hiddenItemsTextFormatter", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, backdropClass: { classPropertyName: "backdropClass", publicName: "backdropClass", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, errorStateMatcher: { classPropertyName: "errorStateMatcher", publicName: "errorStateMatcher", isSignal: true, isRequired: false, transformFunction: null }, sortComparator: { classPropertyName: "sortComparator", publicName: "sortComparator", isSignal: true, isRequired: false, transformFunction: null }, clearPredicate: { classPropertyName: "clearPredicate", publicName: "clearPredicate", isSignal: true, isRequired: false, transformFunction: null }, multiline: { classPropertyName: "multiline", publicName: "multiline", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, multipleInput: { classPropertyName: "multipleInput", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, autoSelectInput: { classPropertyName: "autoSelectInput", publicName: "autoSelect", isSignal: true, isRequired: false, transformFunction: null }, selectAllToggle: { classPropertyName: "selectAllToggle", publicName: "selectAllToggle", isSignal: true, isRequired: false, transformFunction: null }, selectAll: { classPropertyName: "selectAll", publicName: "selectAll", isSignal: true, isRequired: false, transformFunction: null }, idInput: { classPropertyName: "idInput", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, hasBackdrop: { classPropertyName: "hasBackdrop", publicName: "hasBackdrop", isSignal: true, isRequired: false, transformFunction: null }, tabIndexInput: { classPropertyName: "tabIndexInput", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, selectAllHandlerInput: { classPropertyName: "selectAllHandlerInput", publicName: "selectAllHandler", isSignal: true, isRequired: false, transformFunction: null }, panelMinWidth: { classPropertyName: "panelMinWidth", publicName: "panelMinWidth", isSignal: true, isRequired: false, transformFunction: null }, panelWidth: { classPropertyName: "panelWidth", publicName: "panelWidth", isSignal: true, isRequired: false, transformFunction: null }, panelMaxWidth: { classPropertyName: "panelMaxWidth", publicName: "panelMaxWidth", isSignal: true, isRequired: false, transformFunction: null }, panelMaxHeight: { classPropertyName: "panelMaxHeight", publicName: "panelMaxHeight", isSignal: true, isRequired: false, transformFunction: null }, searchMinOptionsThresholdInput: { classPropertyName: "searchMinOptionsThresholdInput", publicName: "searchMinOptionsThreshold", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openedChangeOutput: "openedChange", openedOutput: "opened", closedOutput: "closed", selectionChange: "selectionChange", onSelectAll: "onSelectAll" }, host: { attributes: { "role": "combobox" }, listeners: { "click": "handleClick()", "keydown": "handleKeydown($event)", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "class.kbq-select_multiple": "multiple", "class.kbq-select_multiline": "multiline()", "class.kbq-disabled": "disabledClass()", "class.kbq-invalid": "invalidClass()", "attr.id": "id()", "attr.aria-expanded": "panelOpen", "attr.aria-controls": "panelOpen ? panelId : null", "attr.aria-label": "ariaLabelText", "attr.aria-labelledby": "resolvedAriaLabelledby()", "attr.aria-invalid": "errorState()", "attr.aria-required": "required()", "attr.aria-disabled": "disabled() || null", "attr.tabindex": "tabIndex", "attr.disabled": "disabledAttribute()" }, classAttribute: "kbq-tree-select" }, providers: [
|
|
1108
1360
|
{ provide: KbqFormFieldControl, useExisting: KbqTreeSelect },
|
|
1109
1361
|
kbqCleanerFactoryProvider((() => {
|
|
1110
1362
|
const treeSelect = inject(KbqTreeSelect);
|
|
@@ -1112,22 +1364,16 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
1112
1364
|
get control() {
|
|
1113
1365
|
return treeSelect;
|
|
1114
1366
|
},
|
|
1115
|
-
get keydownTarget() {
|
|
1116
|
-
return treeSelect.elementRef.nativeElement;
|
|
1117
|
-
},
|
|
1118
1367
|
clearByEscape: false,
|
|
1119
|
-
clear: (() => treeSelect.clear())
|
|
1368
|
+
clear: (() => treeSelect.clear()),
|
|
1369
|
+
canClear: (() => treeSelect.canClear)
|
|
1120
1370
|
};
|
|
1121
1371
|
})),
|
|
1122
|
-
{ provide: KbqTree, useExisting: KbqTreeSelect },
|
|
1123
1372
|
{ provide: KBQ_PARENT_POPUP, useExisting: KbqTreeSelect },
|
|
1124
1373
|
kbqSiblingPopupProvider(KbqTreeSelect)
|
|
1125
|
-
], queries: [{ propertyName: "cleaner", first: true, predicate: KbqCleaner, isSignal: true }, { propertyName: "customTrigger", first: true, predicate: KbqSelectTrigger, descendants: true, isSignal: true }, { propertyName: "customMatcher", first: true, predicate: KbqSelectMatcher, descendants: true, isSignal: true }, { propertyName: "customTagTemplateRef", first: true, predicate: ["kbqSelectTagContent"], descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "tree", first: true, predicate: KbqTreeSelection, descendants: true, isSignal: true }, { propertyName: "search", first: true, predicate: KbqSelectSearch, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "optionsContainer", first: true, predicate: ["optionsContainer"], descendants: true, isSignal: true }, { propertyName: "overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "tags", predicate: KbqTag, descendants: true }], exportAs: ["kbqTreeSelect"], usesInheritance: true, ngImport: i0, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty\"\n [class.kbq-select__trigger_multiline]=\"multiline()\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher()) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger()) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n #multilineMatchList\n [class.kbq-select__match-list]=\"!multiline()\"\n [class.kbq-select__multiline-match-list]=\"multiline()\"\n >\n @if (!customTagTemplateRef()) {\n @for (option of triggerValues; track option) {\n <kbq-tag\n [color]=\"colorForState\"\n [disabled]=\"option.disabled || disabled\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled) {\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n (click)=\"onRemoveSelectedOption(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n } @else {\n @for (option of triggerValues; track option) {\n <ng-container\n [ngTemplateOutlet]=\"customTagTemplateRef()\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n @if (!multiline()) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) }}\n </div>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div class=\"kbq-select__cleaner\">\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n>\n <div\n #panel\n cdkMonitorSubtreeFocus\n [class]=\"getPanelClasses()\"\n [style.--kbq-select-panel-size-max-height]=\"panelMaxHeightToken()\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.max-width.px]=\"panelMaxWidth()\"\n [style.transformOrigin]=\"transformOrigin\"\n (keydown)=\"panelKeydownHandler($event)\"\n >\n @if (search() && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div\n #optionsContainer\n class=\"kbq-tree-select__content kbq-scrollbar\"\n [@fadeInContent]=\"'showing'\"\n (@fadeInContent.done)=\"panelDoneAnimatingStream.next($event.toState)\"\n >\n @if (isEmptySearchResult) {\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n }\n\n <ng-content select=\"kbq-tree-selection\" />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-tree-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-tree-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-tree-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline),.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty{height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-tree-select .kbq-select__matcher{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-tree-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-tree-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text{box-sizing:content-box;flex:0 0 var(--kbq-form-field-size-addon-width);align-self:center;padding-left:var(--kbq-size-xxs);padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-tree-select kbq-select-trigger,.kbq-tree-select [kbq-select-trigger]{width:100%}.kbq-tree-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-form-field-appearance-fill .kbq-tree-select .kbq-select__arrow-wrapper,.kbq-form-field-appearance-standard .kbq-tree-select .kbq-select__arrow-wrapper{transform:translateY(-50%)}.kbq-form-field-appearance-outline .kbq-tree-select .kbq-select__arrow-wrapper{transform:translateY(-25%)}.kbq-disabled.kbq-tree-select .kbq-select__trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.kbq-tree-select__panel{min-width:100%;max-width:var(--kbq-panel-size-width-max, 640px);overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}.kbq-tree-select__panel .kbq-option{font-size:inherit}.kbq-tree-select__panel .kbq-select__no-options-message{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;justify-content:center;box-sizing:border-box;position:relative;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl);max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-tree-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-tree-select__content{box-sizing:initial;max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-tree-select__panel .kbq-select__footer{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:var(--kbq-select-footer-size-min-height, var(--kbq-size-4xl));border-top-width:var(--kbq-select-footer-size-border-width, var(--kbq-size-border-width));border-top-style:solid;padding:var(--kbq-select-footer-size-padding-vertical, var(--kbq-size-xxs)) var(--kbq-select-footer-size-padding-horizontal, var(--kbq-size-l))}.kbq-tree-select__content .kbq-tree-selection{height:100%}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option{position:relative}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before,.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-form-field-type-select:not(.kbq-disabled) .kbq-form-field-flex{cursor:pointer}.kbq-tree-select{color:var(--kbq-foreground-contrast)}.kbq-tree-select.kbq-control_has-validate-directive.ng-invalid,.kbq-tree-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-tree-select.kbq-control_has-validate-directive.ng-invalid .kbq-select__placeholder,.kbq-tree-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-tree-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-tree-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-tree-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-default-container-background);background:var(--kbq-tree-default-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-default-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-default-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-default-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused{--kbq-option-background: var(--kbq-tree-states-hover-container-background);background:var(--kbq-tree-states-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-text{color:var(--kbq-tree-states-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-active-container-background);background:var(--kbq-tree-states-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-states-selected-container-background);background:var(--kbq-tree-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-states-selected-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-states-selected-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused{--kbq-option-background: var(--kbq-tree-states-selected-hover-container-background);background:var(--kbq-tree-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-text{color:var(--kbq-tree-states-selected-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-selected-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-selected-active-container-background);background:var(--kbq-tree-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-hovered:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-hovered:not(.kbq-focused){background:var(--kbq-tree-multiple-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-focused,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-focused{background:var(--kbq-tree-multiple-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-multiple-states-selected-active-container-background);background:var(--kbq-tree-multiple-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused:not(.kbq-action-button-focused){border-color:transparent}.kbq-tree-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-tree-select,.kbq-tree-select__panel{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}\n", ".kbq-tree-select__panel{--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}.kbq-tree-select__panel .kbq-tree-selection{--kbq-tree-option-border-radius: var(--kbq-size-xs)}\n", ".kbq-select,.kbq-tree-select,.kbq-select__panel{--kbq-select-size-single-padding-left: 0;--kbq-select-size-single-padding-right: 0;--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius);--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i1.KbqIcon, selector: "[kbq-icon]", inputs: ["small", "autoColor", "kbq-icon"] }, { kind: "directive", type: KbqTagRemove, selector: "[kbqTagRemove]" }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "component", type: KbqTag, selector: "kbq-tag, [kbq-tag], kbq-basic-tag, [kbq-basic-tag]", inputs: ["editable", "preventEditSubmit", "selected", "value", "selectable", "removable", "tabindex", "disabled"], outputs: ["editChange", "selectionChange", "destroyed", "removed"], exportAs: ["kbqTag"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], animations: [
|
|
1126
|
-
kbqSelectAnimations.transformPanel,
|
|
1127
|
-
kbqSelectAnimations.fadeInContent
|
|
1128
|
-
], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
1374
|
+
], queries: [{ propertyName: "cleaner", first: true, predicate: KbqCleaner, isSignal: true }, { propertyName: "customTrigger", first: true, predicate: KbqSelectTrigger, descendants: true, isSignal: true }, { propertyName: "customMatcher", first: true, predicate: KbqSelectMatcher, descendants: true, isSignal: true }, { propertyName: "customTagTemplateRef", first: true, predicate: ["kbqSelectTagContent"], descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "tree", first: true, predicate: KbqTreeSelection, descendants: true, isSignal: true }, { propertyName: "search", first: true, predicate: KbqSelectSearch, descendants: true, isSignal: true }, { propertyName: "noOptionsMessage", first: true, predicate: KbqSelectNoOptions, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "optionsContainer", first: true, predicate: ["optionsContainer"], descendants: true, isSignal: true }, { propertyName: "scrollbarViewport", first: true, predicate: KbqScrollbarViewport, descendants: true, isSignal: true }, { propertyName: "overlayDirQuery", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }, { propertyName: "tagsQuery", predicate: KbqTag, descendants: true, isSignal: true }], exportAs: ["kbqTreeSelect"], usesInheritance: true, hostDirectives: [{ directive: i1.KbqLocaleOverridesDirective, inputs: ["kbqLocaleOverrides", "localeOverrides"] }], ngImport: i0, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty()\"\n [class.kbq-select__trigger_multiline]=\"multiline()\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher()) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty()) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder() || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger()) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n #multilineMatchList\n [class.kbq-select__match-list]=\"!multiline()\"\n [class.kbq-select__multiline-match-list]=\"multiline()\"\n >\n @if (!customTagTemplateRef()) {\n @for (option of triggerValues; track $index) {\n <kbq-tag\n [color]=\"colorForState()\"\n [disabled]=\"option.disabled || disabled()\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled()) {\n <!--\n `tabIndex` defaults to -1, because inside a tag list\n the tag itself is the tab stop. Here the tag stands on\n its own in the trigger, so the control has to opt in or\n it is left mouse-only.\n -->\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n [tabIndex]=\"0\"\n (click)=\"onRemoveSelectedOption(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n } @else {\n @for (option of triggerValues; track $index) {\n <ng-container\n [ngTemplateOutlet]=\"customTagTemplateRef()\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n @if (!multiline()) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems() > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsLabel() }}\n </div>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div class=\"kbq-select__cleaner\">\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState()\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop()\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n>\n <div\n #panel\n cdkMonitorSubtreeFocus\n [attr.id]=\"panelId\"\n [class]=\"panelClasses()\"\n [style.--kbq-select-panel-size-max-height]=\"panelMaxHeightToken()\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.max-width.px]=\"panelMaxWidth()\"\n (keydown)=\"panelKeydownHandler($event)\"\n >\n @if (search() && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div #optionsContainer kbqScrollbarViewport class=\"kbq-tree-select__content\">\n @if (isEmptySearchResult) {\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n }\n\n <ng-content select=\"kbq-select-no-options, [kbq-select-no-options]\" />\n\n <ng-content select=\"kbq-tree-selection\" />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-tree-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-tree-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-tree-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline),.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty{height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-tree-select .kbq-select__matcher{-webkit-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-tree-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-tree-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text{box-sizing:content-box;display:none;flex:0 0 var(--kbq-form-field-size-addon-width);align-self:center;padding-left:var(--kbq-size-xxs);padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text.kbq-select__match-hidden-text_visible{display:block}.kbq-tree-select kbq-select-trigger,.kbq-tree-select [kbq-select-trigger]{width:100%}.kbq-tree-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-disabled.kbq-tree-select .kbq-select__trigger{-webkit-user-select:none;user-select:none;cursor:default}.kbq-tree-select__panel{min-width:100%;max-width:var(--kbq-panel-size-width-max, 640px);overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}@supports (corner-shape: squircle){.kbq-tree-select__panel{corner-shape:squircle;border-radius:clamp(var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 1.85,var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 2.3 - 3.6px,var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 2)}}.kbq-tree-select__panel .kbq-option{font-size:inherit}.kbq-tree-select__panel .kbq-select__no-options-message{-webkit-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;justify-content:center;box-sizing:border-box;position:relative;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl);max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-tree-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-tree-select__content{box-sizing:initial;max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-tree-select__panel .kbq-select__footer{-webkit-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:var(--kbq-select-footer-size-min-height, var(--kbq-size-4xl));border-top-width:var(--kbq-select-footer-size-border-width, var(--kbq-size-border-width));border-top-style:solid;padding:var(--kbq-select-footer-size-padding-vertical, var(--kbq-size-xxs)) var(--kbq-select-footer-size-padding-horizontal, var(--kbq-size-l))}.kbq-tree-select__content .kbq-tree-selection{height:100%}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option{position:relative}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before,.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select{color:var(--kbq-foreground-contrast)}.kbq-tree-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-tree-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-tree-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-tree-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-tree-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-default-container-background);background:var(--kbq-tree-default-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-default-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-default-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-default-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused{--kbq-option-background: var(--kbq-tree-states-hover-container-background);background:var(--kbq-tree-states-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-text{color:var(--kbq-tree-states-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-active-container-background);background:var(--kbq-tree-states-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-states-selected-container-background);background:var(--kbq-tree-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-states-selected-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-states-selected-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused{--kbq-option-background: var(--kbq-tree-states-selected-hover-container-background);background:var(--kbq-tree-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-text{color:var(--kbq-tree-states-selected-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-selected-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-selected-active-container-background);background:var(--kbq-tree-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-hovered:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-hovered:not(.kbq-focused){background:var(--kbq-tree-multiple-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-focused,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-focused{background:var(--kbq-tree-multiple-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-multiple-states-selected-active-container-background);background:var(--kbq-tree-multiple-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused:not(.kbq-action-button-focused){border-color:transparent}.kbq-tree-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-tree-select,.kbq-tree-select__panel{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}\n", ".kbq-tree-select,.kbq-tree-select__panel{--kbq-select-size-single-padding-left: 0;--kbq-select-size-single-padding-right: 0;--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius)}.kbq-tree-select__panel{--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}.kbq-tree-select__panel .kbq-tree-selection{--kbq-tree-option-border-radius: var(--kbq-size-xs)}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i2.KbqIcon, selector: "[kbq-icon]", inputs: ["aria-hidden", "iconSize", "autoColor", "kbq-icon"] }, { kind: "directive", type: KbqTagRemove, selector: "[kbqTagRemove]", inputs: ["aria-label", "tabIndex"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "component", type: KbqTag, selector: "kbq-tag, [kbq-tag], kbq-basic-tag, [kbq-basic-tag]", inputs: ["editable", "preventEditSubmit", "selected", "selectable", "removable", "value", "tabindex", "disabled"], outputs: ["editChange", "selectionChange", "destroyed", "removed"], exportAs: ["kbqTag"] }, { kind: "directive", type: KbqScrollbarViewport, selector: "[kbqScrollbarViewport]", inputs: ["kbqScrollbarMode", "kbqScrollbarHideDelay"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
1129
1375
|
}
|
|
1130
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1376
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelect, decorators: [{
|
|
1131
1377
|
type: Component,
|
|
1132
1378
|
args: [{ selector: 'kbq-tree-select', imports: [
|
|
1133
1379
|
CdkOverlayOrigin,
|
|
@@ -1136,6 +1382,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
|
|
|
1136
1382
|
CdkConnectedOverlay,
|
|
1137
1383
|
CdkMonitorFocus,
|
|
1138
1384
|
KbqTag,
|
|
1385
|
+
KbqScrollbarViewport,
|
|
1139
1386
|
NgTemplateOutlet
|
|
1140
1387
|
], providers: [
|
|
1141
1388
|
{ provide: KbqFormFieldControl, useExisting: KbqTreeSelect },
|
|
@@ -1145,130 +1392,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
|
|
|
1145
1392
|
get control() {
|
|
1146
1393
|
return treeSelect;
|
|
1147
1394
|
},
|
|
1148
|
-
get keydownTarget() {
|
|
1149
|
-
return treeSelect.elementRef.nativeElement;
|
|
1150
|
-
},
|
|
1151
1395
|
clearByEscape: false,
|
|
1152
|
-
clear: (() => treeSelect.clear())
|
|
1396
|
+
clear: (() => treeSelect.clear()),
|
|
1397
|
+
canClear: (() => treeSelect.canClear)
|
|
1153
1398
|
};
|
|
1154
1399
|
})),
|
|
1155
|
-
{ provide: KbqTree, useExisting: KbqTreeSelect },
|
|
1156
1400
|
{ provide: KBQ_PARENT_POPUP, useExisting: KbqTreeSelect },
|
|
1157
1401
|
kbqSiblingPopupProvider(KbqTreeSelect)
|
|
1158
1402
|
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
1159
1403
|
class: 'kbq-tree-select',
|
|
1160
1404
|
'[class.kbq-select_multiple]': 'multiple',
|
|
1161
1405
|
'[class.kbq-select_multiline]': 'multiline()',
|
|
1162
|
-
'[class.kbq-disabled]': '
|
|
1163
|
-
'[class.kbq-invalid]': '
|
|
1406
|
+
'[class.kbq-disabled]': 'disabledClass()',
|
|
1407
|
+
'[class.kbq-invalid]': 'invalidClass()',
|
|
1408
|
+
// The tree-select is not a native control, so its combobox semantics, its accessible name and
|
|
1409
|
+
// its invalid/required/disabled states all have to be exposed explicitly.
|
|
1410
|
+
//
|
|
1411
|
+
// No `aria-haspopup` here: the panel carries no `role="tree"` yet, and announcing a popup that
|
|
1412
|
+
// the assistive technology then cannot find is worse than announcing none — the same call
|
|
1413
|
+
// `KbqDropdownTrigger` made. Add it together with the tree roles.
|
|
1414
|
+
//
|
|
1415
|
+
// No `aria-activedescendant` either: it is only read off the element that HAS the focus, and this
|
|
1416
|
+
// control moves the focus into the panel — onto the option, or into the projected search field —
|
|
1417
|
+
// for as long as the panel is open. It can only start telling the truth once the option highlight
|
|
1418
|
+
// stops being driven by real DOM focus (`KbqTreeOption` paints `kbq-focused` from `hasFocus`),
|
|
1419
|
+
// which is `@koobiq/components/tree`'s call to make.
|
|
1420
|
+
role: 'combobox',
|
|
1421
|
+
'[attr.id]': 'id()',
|
|
1422
|
+
'[attr.aria-expanded]': 'panelOpen',
|
|
1423
|
+
'[attr.aria-controls]': 'panelOpen ? panelId : null',
|
|
1424
|
+
'[attr.aria-label]': 'ariaLabelText',
|
|
1425
|
+
'[attr.aria-labelledby]': 'resolvedAriaLabelledby()',
|
|
1426
|
+
'[attr.aria-invalid]': 'errorState()',
|
|
1427
|
+
'[attr.aria-required]': 'required()',
|
|
1428
|
+
'[attr.aria-disabled]': 'disabled() || null',
|
|
1164
1429
|
'[attr.tabindex]': 'tabIndex',
|
|
1165
|
-
'[attr.disabled]': '
|
|
1430
|
+
'[attr.disabled]': 'disabledAttribute()',
|
|
1166
1431
|
'(click)': 'handleClick()',
|
|
1167
1432
|
'(keydown)': 'handleKeydown($event)',
|
|
1168
1433
|
'(focus)': 'onFocus()',
|
|
1169
1434
|
'(blur)': 'onBlur()'
|
|
1170
|
-
},
|
|
1171
|
-
|
|
1172
|
-
kbqSelectAnimations.fadeInContent
|
|
1173
|
-
], exportAs: 'kbqTreeSelect', template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty\"\n [class.kbq-select__trigger_multiline]=\"multiline()\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher()) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger()) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n #multilineMatchList\n [class.kbq-select__match-list]=\"!multiline()\"\n [class.kbq-select__multiline-match-list]=\"multiline()\"\n >\n @if (!customTagTemplateRef()) {\n @for (option of triggerValues; track option) {\n <kbq-tag\n [color]=\"colorForState\"\n [disabled]=\"option.disabled || disabled\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled) {\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n (click)=\"onRemoveSelectedOption(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n } @else {\n @for (option of triggerValues; track option) {\n <ng-container\n [ngTemplateOutlet]=\"customTagTemplateRef()\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n @if (!multiline()) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) }}\n </div>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div class=\"kbq-select__cleaner\">\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n>\n <div\n #panel\n cdkMonitorSubtreeFocus\n [class]=\"getPanelClasses()\"\n [style.--kbq-select-panel-size-max-height]=\"panelMaxHeightToken()\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.max-width.px]=\"panelMaxWidth()\"\n [style.transformOrigin]=\"transformOrigin\"\n (keydown)=\"panelKeydownHandler($event)\"\n >\n @if (search() && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div\n #optionsContainer\n class=\"kbq-tree-select__content kbq-scrollbar\"\n [@fadeInContent]=\"'showing'\"\n (@fadeInContent.done)=\"panelDoneAnimatingStream.next($event.toState)\"\n >\n @if (isEmptySearchResult) {\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n }\n\n <ng-content select=\"kbq-tree-selection\" />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-tree-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-tree-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-tree-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline),.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty{height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-tree-select .kbq-select__matcher{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-tree-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-tree-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text{box-sizing:content-box;flex:0 0 var(--kbq-form-field-size-addon-width);align-self:center;padding-left:var(--kbq-size-xxs);padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-tree-select kbq-select-trigger,.kbq-tree-select [kbq-select-trigger]{width:100%}.kbq-tree-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-form-field-appearance-fill .kbq-tree-select .kbq-select__arrow-wrapper,.kbq-form-field-appearance-standard .kbq-tree-select .kbq-select__arrow-wrapper{transform:translateY(-50%)}.kbq-form-field-appearance-outline .kbq-tree-select .kbq-select__arrow-wrapper{transform:translateY(-25%)}.kbq-disabled.kbq-tree-select .kbq-select__trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.kbq-tree-select__panel{min-width:100%;max-width:var(--kbq-panel-size-width-max, 640px);overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}.kbq-tree-select__panel .kbq-option{font-size:inherit}.kbq-tree-select__panel .kbq-select__no-options-message{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;justify-content:center;box-sizing:border-box;position:relative;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl);max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-tree-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-tree-select__content{box-sizing:initial;max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-tree-select__panel .kbq-select__footer{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:var(--kbq-select-footer-size-min-height, var(--kbq-size-4xl));border-top-width:var(--kbq-select-footer-size-border-width, var(--kbq-size-border-width));border-top-style:solid;padding:var(--kbq-select-footer-size-padding-vertical, var(--kbq-size-xxs)) var(--kbq-select-footer-size-padding-horizontal, var(--kbq-size-l))}.kbq-tree-select__content .kbq-tree-selection{height:100%}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option{position:relative}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before,.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-form-field-type-select:not(.kbq-disabled) .kbq-form-field-flex{cursor:pointer}.kbq-tree-select{color:var(--kbq-foreground-contrast)}.kbq-tree-select.kbq-control_has-validate-directive.ng-invalid,.kbq-tree-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-tree-select.kbq-control_has-validate-directive.ng-invalid .kbq-select__placeholder,.kbq-tree-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-tree-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-tree-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-tree-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-default-container-background);background:var(--kbq-tree-default-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-default-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-default-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-default-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused{--kbq-option-background: var(--kbq-tree-states-hover-container-background);background:var(--kbq-tree-states-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-text{color:var(--kbq-tree-states-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-active-container-background);background:var(--kbq-tree-states-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-states-selected-container-background);background:var(--kbq-tree-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-states-selected-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-states-selected-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused{--kbq-option-background: var(--kbq-tree-states-selected-hover-container-background);background:var(--kbq-tree-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-text{color:var(--kbq-tree-states-selected-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-selected-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-selected-active-container-background);background:var(--kbq-tree-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-hovered:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-hovered:not(.kbq-focused){background:var(--kbq-tree-multiple-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-focused,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-focused{background:var(--kbq-tree-multiple-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-multiple-states-selected-active-container-background);background:var(--kbq-tree-multiple-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused:not(.kbq-action-button-focused){border-color:transparent}.kbq-tree-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-tree-select,.kbq-tree-select__panel{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}\n", ".kbq-tree-select__panel{--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}.kbq-tree-select__panel .kbq-tree-selection{--kbq-tree-option-border-radius: var(--kbq-size-xs)}\n", ".kbq-select,.kbq-tree-select,.kbq-select__panel{--kbq-select-size-single-padding-left: 0;--kbq-select-size-single-padding-right: 0;--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius);--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}\n"] }]
|
|
1174
|
-
}], ctorParameters: () => [], propDecorators: { trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], panel: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], optionsContainer: [{ type: i0.ViewChild, args: ['optionsContainer', { isSignal: true }] }], overlayDir: [{
|
|
1175
|
-
type: ViewChild,
|
|
1176
|
-
args: [CdkConnectedOverlay, { static: false }]
|
|
1177
|
-
}], tags: [{
|
|
1178
|
-
type: ViewChildren,
|
|
1179
|
-
args: [KbqTag]
|
|
1180
|
-
}], cleaner: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqCleaner), { ...{ descendants: false }, isSignal: true }] }], customTrigger: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectTrigger), { isSignal: true }] }], customMatcher: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectMatcher), { isSignal: true }] }], customTagTemplateRef: [{ type: i0.ContentChild, args: ['kbqSelectTagContent', { ...{ read: TemplateRef }, isSignal: true }] }], tree: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqTreeSelection), { isSignal: true }] }], search: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectSearch), { isSignal: true }] }], hiddenItemsText: [{
|
|
1181
|
-
type: Input
|
|
1182
|
-
}], openedChange: [{
|
|
1183
|
-
type: Output
|
|
1184
|
-
}], openedStream: [{
|
|
1185
|
-
type: Output,
|
|
1186
|
-
args: ['opened']
|
|
1187
|
-
}], closedStream: [{
|
|
1188
|
-
type: Output,
|
|
1189
|
-
args: ['closed']
|
|
1190
|
-
}], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], onSelectAll: [{ type: i0.Output, args: ["onSelectAll"] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }], errorStateMatcher: [{
|
|
1191
|
-
type: Input
|
|
1192
|
-
}], sortComparator: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortComparator", required: false }] }], multiline: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiline", required: false }] }], placeholder: [{
|
|
1193
|
-
type: Input
|
|
1194
|
-
}], required: [{
|
|
1195
|
-
type: Input
|
|
1196
|
-
}], multiple: [{
|
|
1197
|
-
type: Input,
|
|
1198
|
-
args: [{ transform: booleanAttribute }]
|
|
1199
|
-
}], autoSelect: [{
|
|
1200
|
-
type: Input
|
|
1201
|
-
}], selectAllToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllToggle", required: false }] }], selectAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAll", required: false }] }], id: [{
|
|
1202
|
-
type: Input
|
|
1203
|
-
}], hasBackdrop: [{
|
|
1204
|
-
type: Input
|
|
1205
|
-
}], tabIndex: [{
|
|
1206
|
-
type: Input
|
|
1207
|
-
}], disabled: [{
|
|
1208
|
-
type: Input,
|
|
1209
|
-
args: [{ transform: booleanAttribute }]
|
|
1210
|
-
}], selectAllHandler: [{
|
|
1211
|
-
type: Input
|
|
1212
|
-
}], panelMinWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMinWidth", required: false }] }], panelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelWidth", required: false }] }], panelMaxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMaxWidth", required: false }] }], panelMaxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMaxHeight", required: false }] }], searchMinOptionsThreshold: [{
|
|
1213
|
-
type: Input
|
|
1214
|
-
}], hiddenItemsTextFormatter: [{
|
|
1215
|
-
type: Input
|
|
1216
|
-
}] } });
|
|
1435
|
+
}, hostDirectives: [
|
|
1436
|
+
{ directive: KbqLocaleOverridesDirective, inputs: ['kbqLocaleOverrides: localeOverrides'] }
|
|
1437
|
+
], exportAs: 'kbqTreeSelect', template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty()\"\n [class.kbq-select__trigger_multiline]=\"multiline()\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher()) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty()) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder() || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger()) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n #multilineMatchList\n [class.kbq-select__match-list]=\"!multiline()\"\n [class.kbq-select__multiline-match-list]=\"multiline()\"\n >\n @if (!customTagTemplateRef()) {\n @for (option of triggerValues; track $index) {\n <kbq-tag\n [color]=\"colorForState()\"\n [disabled]=\"option.disabled || disabled()\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled()) {\n <!--\n `tabIndex` defaults to -1, because inside a tag list\n the tag itself is the tab stop. Here the tag stands on\n its own in the trigger, so the control has to opt in or\n it is left mouse-only.\n -->\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n [tabIndex]=\"0\"\n (click)=\"onRemoveSelectedOption(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n } @else {\n @for (option of triggerValues; track $index) {\n <ng-container\n [ngTemplateOutlet]=\"customTagTemplateRef()\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n @if (!multiline()) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems() > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsLabel() }}\n </div>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div class=\"kbq-select__cleaner\">\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState()\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop()\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n>\n <div\n #panel\n cdkMonitorSubtreeFocus\n [attr.id]=\"panelId\"\n [class]=\"panelClasses()\"\n [style.--kbq-select-panel-size-max-height]=\"panelMaxHeightToken()\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.max-width.px]=\"panelMaxWidth()\"\n (keydown)=\"panelKeydownHandler($event)\"\n >\n @if (search() && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div #optionsContainer kbqScrollbarViewport class=\"kbq-tree-select__content\">\n @if (isEmptySearchResult) {\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n }\n\n <ng-content select=\"kbq-select-no-options, [kbq-select-no-options]\" />\n\n <ng-content select=\"kbq-tree-selection\" />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-tree-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-tree-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-tree-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline),.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty{height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-tree-select .kbq-select__matcher{-webkit-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-tree-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-tree-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text{box-sizing:content-box;display:none;flex:0 0 var(--kbq-form-field-size-addon-width);align-self:center;padding-left:var(--kbq-size-xxs);padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text.kbq-select__match-hidden-text_visible{display:block}.kbq-tree-select kbq-select-trigger,.kbq-tree-select [kbq-select-trigger]{width:100%}.kbq-tree-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-disabled.kbq-tree-select .kbq-select__trigger{-webkit-user-select:none;user-select:none;cursor:default}.kbq-tree-select__panel{min-width:100%;max-width:var(--kbq-panel-size-width-max, 640px);overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}@supports (corner-shape: squircle){.kbq-tree-select__panel{corner-shape:squircle;border-radius:clamp(var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 1.85,var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 2.3 - 3.6px,var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 2)}}.kbq-tree-select__panel .kbq-option{font-size:inherit}.kbq-tree-select__panel .kbq-select__no-options-message{-webkit-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;justify-content:center;box-sizing:border-box;position:relative;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl);max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-tree-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-tree-select__content{box-sizing:initial;max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-tree-select__panel .kbq-select__footer{-webkit-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:var(--kbq-select-footer-size-min-height, var(--kbq-size-4xl));border-top-width:var(--kbq-select-footer-size-border-width, var(--kbq-size-border-width));border-top-style:solid;padding:var(--kbq-select-footer-size-padding-vertical, var(--kbq-size-xxs)) var(--kbq-select-footer-size-padding-horizontal, var(--kbq-size-l))}.kbq-tree-select__content .kbq-tree-selection{height:100%}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option{position:relative}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before,.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select{color:var(--kbq-foreground-contrast)}.kbq-tree-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-tree-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-tree-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-tree-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-tree-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-default-container-background);background:var(--kbq-tree-default-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-default-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-default-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-default-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused{--kbq-option-background: var(--kbq-tree-states-hover-container-background);background:var(--kbq-tree-states-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-text{color:var(--kbq-tree-states-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-active-container-background);background:var(--kbq-tree-states-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-states-selected-container-background);background:var(--kbq-tree-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-states-selected-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-states-selected-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused{--kbq-option-background: var(--kbq-tree-states-selected-hover-container-background);background:var(--kbq-tree-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-text{color:var(--kbq-tree-states-selected-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-selected-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-selected-active-container-background);background:var(--kbq-tree-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-hovered:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-hovered:not(.kbq-focused){background:var(--kbq-tree-multiple-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-focused,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-focused{background:var(--kbq-tree-multiple-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-multiple-states-selected-active-container-background);background:var(--kbq-tree-multiple-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused:not(.kbq-action-button-focused){border-color:transparent}.kbq-tree-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-tree-select,.kbq-tree-select__panel{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}\n", ".kbq-tree-select,.kbq-tree-select__panel{--kbq-select-size-single-padding-left: 0;--kbq-select-size-single-padding-right: 0;--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius)}.kbq-tree-select__panel{--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}.kbq-tree-select__panel .kbq-tree-selection{--kbq-tree-option-border-radius: var(--kbq-size-xs)}\n"] }]
|
|
1438
|
+
}], ctorParameters: () => [], propDecorators: { trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], panel: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], optionsContainer: [{ type: i0.ViewChild, args: ['optionsContainer', { isSignal: true }] }], scrollbarViewport: [{ type: i0.ViewChild, args: [i0.forwardRef(() => KbqScrollbarViewport), { isSignal: true }] }], overlayDirQuery: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkConnectedOverlay), { isSignal: true }] }], tagsQuery: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => KbqTag), { isSignal: true }] }], cleaner: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqCleaner), { ...{ descendants: false }, isSignal: true }] }], customTrigger: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectTrigger), { isSignal: true }] }], customMatcher: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectMatcher), { isSignal: true }] }], customTagTemplateRef: [{ type: i0.ContentChild, args: ['kbqSelectTagContent', { ...{ read: TemplateRef }, isSignal: true }] }], tree: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqTreeSelection), { isSignal: true }] }], search: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectSearch), { isSignal: true }] }], noOptionsMessage: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectNoOptions), { isSignal: true }] }], hiddenItemsText: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenItemsText", required: false }] }], hiddenItemsTextFormatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenItemsTextFormatter", required: false }] }], openedChangeOutput: [{ type: i0.Output, args: ["openedChange"] }], openedOutput: [{ type: i0.Output, args: ["opened"] }], closedOutput: [{ type: i0.Output, args: ["closed"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], onSelectAll: [{ type: i0.Output, args: ["onSelectAll"] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], sortComparator: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortComparator", required: false }] }], clearPredicate: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearPredicate", required: false }] }], multiline: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiline", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], multipleInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], autoSelectInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoSelect", required: false }] }], selectAllToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllToggle", required: false }] }], selectAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAll", required: false }] }], idInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], hasBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasBackdrop", required: false }] }], tabIndexInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], selectAllHandlerInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllHandler", required: false }] }], panelMinWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMinWidth", required: false }] }], panelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelWidth", required: false }] }], panelMaxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMaxWidth", required: false }] }], panelMaxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMaxHeight", required: false }] }], searchMinOptionsThresholdInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchMinOptionsThreshold", required: false }] }] } });
|
|
1217
1439
|
|
|
1440
|
+
/**
|
|
1441
|
+
* The module declares nothing — `KbqTreeSelect` is standalone and brings its own imports — so the
|
|
1442
|
+
* entries below are here either to be re-exported or for the providers they carry (`OverlayModule`,
|
|
1443
|
+
* `KbqTagsModule`, `KbqTreeModule`).
|
|
1444
|
+
*/
|
|
1218
1445
|
class KbqTreeSelectModule {
|
|
1219
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1220
|
-
/** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
1446
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
1447
|
+
/** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelectModule, imports: [OverlayModule,
|
|
1221
1448
|
KbqTreeModule,
|
|
1222
|
-
KbqIconModule,
|
|
1223
1449
|
KbqTagsModule,
|
|
1224
|
-
KbqPseudoCheckboxModule,
|
|
1225
1450
|
KbqSelectSearch,
|
|
1226
1451
|
KbqSelectFooter,
|
|
1227
1452
|
KbqSelectMatcher,
|
|
1228
1453
|
KbqSelectTrigger,
|
|
1229
1454
|
KbqSelectSearchEmptyResult,
|
|
1230
|
-
|
|
1231
|
-
A11yModule,
|
|
1455
|
+
KbqSelectNoOptions,
|
|
1232
1456
|
KbqTreeSelect], exports: [KbqTreeSelect,
|
|
1457
|
+
// `kbq-tree-selection` content is mandatory, so importing the tree-select without the tree
|
|
1458
|
+
// gives a consumer a control they cannot fill.
|
|
1459
|
+
KbqTreeModule,
|
|
1233
1460
|
KbqSelectSearch,
|
|
1234
1461
|
KbqSelectFooter,
|
|
1235
1462
|
KbqSelectMatcher,
|
|
1236
1463
|
KbqSelectTrigger,
|
|
1237
1464
|
KbqSelectSearchEmptyResult,
|
|
1465
|
+
KbqSelectNoOptions,
|
|
1238
1466
|
KbqFormFieldModule] }); }
|
|
1239
|
-
/** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
1467
|
+
/** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelectModule, imports: [OverlayModule,
|
|
1240
1468
|
KbqTreeModule,
|
|
1241
|
-
KbqIconModule,
|
|
1242
1469
|
KbqTagsModule,
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1470
|
+
KbqSelectNoOptions,
|
|
1471
|
+
KbqTreeSelect,
|
|
1472
|
+
// `kbq-tree-selection` content is mandatory, so importing the tree-select without the tree
|
|
1473
|
+
// gives a consumer a control they cannot fill.
|
|
1474
|
+
KbqTreeModule,
|
|
1475
|
+
KbqFormFieldModule] }); }
|
|
1246
1476
|
}
|
|
1247
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1477
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelectModule, decorators: [{
|
|
1248
1478
|
type: NgModule,
|
|
1249
1479
|
args: [{
|
|
1250
1480
|
imports: [
|
|
1251
1481
|
OverlayModule,
|
|
1252
1482
|
KbqTreeModule,
|
|
1253
|
-
KbqIconModule,
|
|
1254
1483
|
KbqTagsModule,
|
|
1255
|
-
KbqPseudoCheckboxModule,
|
|
1256
1484
|
KbqSelectSearch,
|
|
1257
1485
|
KbqSelectFooter,
|
|
1258
1486
|
KbqSelectMatcher,
|
|
1259
1487
|
KbqSelectTrigger,
|
|
1260
1488
|
KbqSelectSearchEmptyResult,
|
|
1261
|
-
|
|
1262
|
-
A11yModule,
|
|
1489
|
+
KbqSelectNoOptions,
|
|
1263
1490
|
KbqTreeSelect
|
|
1264
1491
|
],
|
|
1265
1492
|
exports: [
|
|
1266
1493
|
KbqTreeSelect,
|
|
1494
|
+
// `kbq-tree-selection` content is mandatory, so importing the tree-select without the tree
|
|
1495
|
+
// gives a consumer a control they cannot fill.
|
|
1496
|
+
KbqTreeModule,
|
|
1267
1497
|
KbqSelectSearch,
|
|
1268
1498
|
KbqSelectFooter,
|
|
1269
1499
|
KbqSelectMatcher,
|
|
1270
1500
|
KbqSelectTrigger,
|
|
1271
1501
|
KbqSelectSearchEmptyResult,
|
|
1502
|
+
KbqSelectNoOptions,
|
|
1272
1503
|
KbqFormFieldModule
|
|
1273
1504
|
]
|
|
1274
1505
|
}]
|