@skyux/lists 8.7.2 → 9.0.0-alpha.1
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/documentation.json +120 -120
- package/esm2022/lib/modules/filter/filter-button.component.mjs +73 -0
- package/{esm2020 → esm2022}/lib/modules/filter/filter-inline-item.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/modules/filter/filter-inline.component.mjs +4 -4
- package/esm2022/lib/modules/filter/filter-summary-item.component.mjs +52 -0
- package/{esm2020 → esm2022}/lib/modules/filter/filter-summary.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/modules/filter/filter.module.mjs +21 -21
- package/esm2022/lib/modules/infinite-scroll/infinite-scroll-dom-adapter.service.mjs +82 -0
- package/esm2022/lib/modules/infinite-scroll/infinite-scroll.component.mjs +116 -0
- package/{esm2020 → esm2022}/lib/modules/infinite-scroll/infinite-scroll.module.mjs +5 -5
- package/esm2022/lib/modules/paging/paging.component.mjs +122 -0
- package/{esm2020 → esm2022}/lib/modules/paging/paging.module.mjs +11 -11
- package/esm2022/lib/modules/repeater/repeater-adapter.service.mjs +75 -0
- package/{esm2020 → esm2022}/lib/modules/repeater/repeater-auto-scroll.service.mjs +4 -4
- package/{esm2020 → esm2022}/lib/modules/repeater/repeater-item-content.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/modules/repeater/repeater-item-context-menu.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/modules/repeater/repeater-item-title.component.mjs +4 -4
- package/esm2022/lib/modules/repeater/repeater-item.component.mjs +504 -0
- package/esm2022/lib/modules/repeater/repeater.component.mjs +373 -0
- package/{esm2020 → esm2022}/lib/modules/repeater/repeater.module.mjs +27 -27
- package/esm2022/lib/modules/repeater/repeater.service.mjs +86 -0
- package/{esm2020 → esm2022}/lib/modules/shared/sky-lists-resources.module.mjs +11 -11
- package/esm2022/lib/modules/sort/sort-item.component.mjs +66 -0
- package/{esm2020 → esm2022}/lib/modules/sort/sort-menu-heading.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/modules/sort/sort.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/modules/sort/sort.module.mjs +17 -17
- package/{esm2020 → esm2022}/lib/modules/sort/sort.service.mjs +4 -4
- package/esm2022/testing/filter/filter-fixture-button.mjs +53 -0
- package/esm2022/testing/filter/filter-fixture-summary.mjs +31 -0
- package/{esm2020 → esm2022}/testing/filter/filter-testing.module.mjs +5 -5
- package/esm2022/testing/infinite-scroll/infinite-scroll-fixture.mjs +31 -0
- package/esm2022/testing/infinite-scroll/infinite-scroll-harness.mjs +49 -0
- package/{esm2020 → esm2022}/testing/infinite-scroll/infinite-scroll-testing.module.mjs +5 -5
- package/esm2022/testing/paging/paging-fixture.mjs +95 -0
- package/{esm2020 → esm2022}/testing/paging/paging-testing.module.mjs +5 -5
- package/esm2022/testing/repeater/repeater-harness.mjs +25 -0
- package/esm2022/testing/repeater/repeater-item-harness.mjs +167 -0
- package/esm2022/testing/sort/sort-fixture.mjs +149 -0
- package/{esm2020 → esm2022}/testing/sort/sort-testing.module.mjs +5 -5
- package/fesm2022/skyux-lists-testing.mjs +664 -0
- package/{fesm2020 → fesm2022}/skyux-lists-testing.mjs.map +1 -1
- package/fesm2022/skyux-lists.mjs +1913 -0
- package/{fesm2020 → fesm2022}/skyux-lists.mjs.map +1 -1
- package/lib/modules/filter/filter-button.component.d.ts +1 -1
- package/lib/modules/filter/filter-summary-item.component.d.ts +1 -1
- package/lib/modules/infinite-scroll/infinite-scroll.component.d.ts +1 -1
- package/lib/modules/paging/paging.component.d.ts +1 -1
- package/lib/modules/repeater/repeater-item.component.d.ts +1 -1
- package/lib/modules/repeater/repeater.component.d.ts +1 -1
- package/lib/modules/sort/sort-item.component.d.ts +1 -1
- package/lib/modules/sort/sort.component.d.ts +1 -1
- package/package.json +22 -30
- package/esm2020/lib/modules/filter/filter-button.component.mjs +0 -75
- package/esm2020/lib/modules/filter/filter-summary-item.component.mjs +0 -54
- package/esm2020/lib/modules/infinite-scroll/infinite-scroll-dom-adapter.service.mjs +0 -84
- package/esm2020/lib/modules/infinite-scroll/infinite-scroll.component.mjs +0 -116
- package/esm2020/lib/modules/paging/paging.component.mjs +0 -123
- package/esm2020/lib/modules/repeater/repeater-adapter.service.mjs +0 -73
- package/esm2020/lib/modules/repeater/repeater-item.component.mjs +0 -492
- package/esm2020/lib/modules/repeater/repeater.component.mjs +0 -357
- package/esm2020/lib/modules/repeater/repeater.service.mjs +0 -88
- package/esm2020/lib/modules/sort/sort-item.component.mjs +0 -69
- package/esm2020/testing/filter/filter-fixture-button.mjs +0 -55
- package/esm2020/testing/filter/filter-fixture-summary.mjs +0 -34
- package/esm2020/testing/infinite-scroll/infinite-scroll-fixture.mjs +0 -34
- package/esm2020/testing/infinite-scroll/infinite-scroll-harness.mjs +0 -55
- package/esm2020/testing/paging/paging-fixture.mjs +0 -91
- package/esm2020/testing/repeater/repeater-harness.mjs +0 -25
- package/esm2020/testing/repeater/repeater-item-harness.mjs +0 -173
- package/esm2020/testing/sort/sort-fixture.mjs +0 -148
- package/fesm2015/skyux-lists-testing.mjs +0 -747
- package/fesm2015/skyux-lists-testing.mjs.map +0 -1
- package/fesm2015/skyux-lists.mjs +0 -1894
- package/fesm2015/skyux-lists.mjs.map +0 -1
- package/fesm2020/skyux-lists-testing.mjs +0 -673
- package/fesm2020/skyux-lists.mjs +0 -1886
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/repeater/repeater-auto-scroll-options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/repeater/repeater-auto-scroller.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/repeater/repeater-expand-mode-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/repeater/repeater-item-roles.type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/repeater/repeater-role.type.mjs +0 -0
- /package/{esm2020 → esm2022}/skyux-lists.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/filter/lists-filter-fixture-button.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/infinite-scroll/infinite-scroll-harness-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/paging/paging-fixture-button.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/repeater/repeater-harness-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/repeater/repeater-item-harness-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/skyux-lists-testing.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/sort/sort-fixture-menu-item.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/sort/sort-fixture-menu.mjs +0 -0
|
@@ -0,0 +1,1913 @@
|
|
|
1
|
+
import * as i1 from '@angular/common';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { NgModule, EventEmitter, Component, ChangeDetectionStrategy, Input, Output, Injectable, ElementRef, ViewEncapsulation, ContentChild, HostBinding, ViewChild, ContentChildren, HostListener, inject, ChangeDetectorRef, Renderer2 } from '@angular/core';
|
|
5
|
+
import * as i2 from '@skyux/indicators';
|
|
6
|
+
import { SkyIconModule, SkyTokensModule, SkyWaitModule, SkyChevronModule } from '@skyux/indicators';
|
|
7
|
+
import * as i3 from '@skyux/theme';
|
|
8
|
+
import { SkyThemeModule } from '@skyux/theme';
|
|
9
|
+
import * as i3$1 from '@skyux/i18n';
|
|
10
|
+
import { getLibStringForLocale, SkyI18nModule, SKY_LIB_RESOURCES_PROVIDERS } from '@skyux/i18n';
|
|
11
|
+
import { Subject, fromEvent, BehaviorSubject, forkJoin } from 'rxjs';
|
|
12
|
+
import { takeUntil, filter, map } from 'rxjs/operators';
|
|
13
|
+
import * as i1$1 from '@skyux/core';
|
|
14
|
+
import { SkyScrollableHostService, SkyLogService, SkyIdModule } from '@skyux/core';
|
|
15
|
+
import * as i2$1 from '@angular/cdk/observers';
|
|
16
|
+
import { ObserversModule } from '@angular/cdk/observers';
|
|
17
|
+
import * as i6 from '@skyux/forms';
|
|
18
|
+
import { SkyCheckboxModule } from '@skyux/forms';
|
|
19
|
+
import * as i7 from '@skyux/inline-form';
|
|
20
|
+
import { SkyInlineFormModule } from '@skyux/inline-form';
|
|
21
|
+
import * as i1$2 from 'ng2-dragula';
|
|
22
|
+
import { DragulaService, DragulaModule } from 'ng2-dragula';
|
|
23
|
+
import { skyAnimationSlide } from '@skyux/animations';
|
|
24
|
+
import autoScroll from 'dom-autoscroller';
|
|
25
|
+
import * as i2$2 from '@skyux/popovers';
|
|
26
|
+
import { SkyDropdownMessageType, SkyDropdownModule } from '@skyux/popovers';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* NOTICE: DO NOT MODIFY THIS FILE!
|
|
30
|
+
* The contents of this file were automatically generated by
|
|
31
|
+
* the 'ng generate @skyux/i18n:lib-resources-module lib/modules/shared/sky-lists' schematic.
|
|
32
|
+
* To update this file, simply rerun the command.
|
|
33
|
+
*/
|
|
34
|
+
const RESOURCES = {
|
|
35
|
+
'EN-US': {
|
|
36
|
+
skyux_filter_button_title: { message: 'Filter' },
|
|
37
|
+
skyux_filter_summary_close: { message: 'Remove filter' },
|
|
38
|
+
skyux_filter_summary_header: { message: 'Filter' },
|
|
39
|
+
skyux_infinite_scroll_load_more_button: { message: 'Load more' },
|
|
40
|
+
skyux_paging_label: { message: 'Pagination' },
|
|
41
|
+
skyux_paging_next: { message: 'Next' },
|
|
42
|
+
skyux_paging_page_link_aria_label: { message: 'Page {0}' },
|
|
43
|
+
skyux_paging_previous: { message: 'Previous' },
|
|
44
|
+
skyux_repeater_label: { message: 'List of items' },
|
|
45
|
+
skyux_repeater_item_collapse: { message: 'Collapse {0}' },
|
|
46
|
+
skyux_repeater_item_collapse_default: { message: 'Collapse' },
|
|
47
|
+
skyux_repeater_item_expand: { message: 'Expand {0}' },
|
|
48
|
+
skyux_repeater_item_expand_default: { message: 'Expand' },
|
|
49
|
+
skyux_repeater_item_checkbox_label: { message: 'Select {0}' },
|
|
50
|
+
skyux_repeater_item_checkbox_label_default: { message: 'Select row' },
|
|
51
|
+
skyux_repeater_item_reorder_cancel: {
|
|
52
|
+
message: 'Item reordering was canceled. The item was returned to its original position.',
|
|
53
|
+
},
|
|
54
|
+
skyux_repeater_item_reorder_finish: {
|
|
55
|
+
message: 'Dropped the item in position',
|
|
56
|
+
},
|
|
57
|
+
skyux_repeater_item_reorder_instructions: {
|
|
58
|
+
message: 'Item grabbed. Press the up and down arrow keys to change position. Press the spacebar or enter key to drop. And press the escape key to cancel.',
|
|
59
|
+
},
|
|
60
|
+
skyux_repeater_item_reorder_moved: {
|
|
61
|
+
message: 'Moved the item to position',
|
|
62
|
+
},
|
|
63
|
+
skyux_repeater_item_reorder_label_default: { message: 'Reorder' },
|
|
64
|
+
skyux_repeater_item_reorder_label: { message: 'Reorder {0}' },
|
|
65
|
+
skyux_repeater_item_reorder_operation: {
|
|
66
|
+
message: 'Press the spacebar or enter key to reorder.',
|
|
67
|
+
},
|
|
68
|
+
skyux_repeater_item_reorder_top: { message: 'Top' },
|
|
69
|
+
skyux_repeater_item_reorder_top_label: { message: 'Move {0} to top' },
|
|
70
|
+
skyux_repeater_item_reorder_top_label_default: { message: 'Move to top' },
|
|
71
|
+
skyux_sort_button_label: { message: 'Sort' },
|
|
72
|
+
skyux_sort_menu_heading: { message: 'Sort by' },
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
class SkyListsResourcesProvider {
|
|
76
|
+
getString(localeInfo, name) {
|
|
77
|
+
return getLibStringForLocale(RESOURCES, localeInfo.locale, name);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Import into any component library module that needs to use resource strings.
|
|
82
|
+
*/
|
|
83
|
+
class SkyListsResourcesModule {
|
|
84
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyListsResourcesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
85
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: SkyListsResourcesModule, exports: [SkyI18nModule] }); }
|
|
86
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyListsResourcesModule, providers: [
|
|
87
|
+
{
|
|
88
|
+
provide: SKY_LIB_RESOURCES_PROVIDERS,
|
|
89
|
+
useClass: SkyListsResourcesProvider,
|
|
90
|
+
multi: true,
|
|
91
|
+
},
|
|
92
|
+
], imports: [SkyI18nModule] }); }
|
|
93
|
+
}
|
|
94
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyListsResourcesModule, decorators: [{
|
|
95
|
+
type: NgModule,
|
|
96
|
+
args: [{
|
|
97
|
+
exports: [SkyI18nModule],
|
|
98
|
+
providers: [
|
|
99
|
+
{
|
|
100
|
+
provide: SKY_LIB_RESOURCES_PROVIDERS,
|
|
101
|
+
useClass: SkyListsResourcesProvider,
|
|
102
|
+
multi: true,
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
}]
|
|
106
|
+
}] });
|
|
107
|
+
|
|
108
|
+
let nextId = 0;
|
|
109
|
+
class SkyFilterButtonComponent {
|
|
110
|
+
/**
|
|
111
|
+
* The ID for the filter button.
|
|
112
|
+
*/
|
|
113
|
+
get filterButtonId() {
|
|
114
|
+
return this.#filterButtonIdOrDefault;
|
|
115
|
+
}
|
|
116
|
+
set filterButtonId(value) {
|
|
117
|
+
this.#filterButtonIdOrDefault = value || this.#defaultButtonId;
|
|
118
|
+
}
|
|
119
|
+
constructor() {
|
|
120
|
+
/**
|
|
121
|
+
* Whether the filtering options are exposed.
|
|
122
|
+
* To support [accessibility rules for disclosures](https://www.w3.org/TR/wai-aria-practices-1.1/#disclosure),
|
|
123
|
+
* this property is necessary to set the `aria-expanded` attribute when using inline filters.
|
|
124
|
+
* For more information about the `aria-expanded` attribute, see the [WAI-ARIA definition](https://www.w3.org/TR/wai-aria/#aria-expanded).
|
|
125
|
+
*/
|
|
126
|
+
this.ariaExpanded = false;
|
|
127
|
+
/**
|
|
128
|
+
* Whether to highlight the filter button to indicate that filters were applied.
|
|
129
|
+
* We recommend setting this property to `true` when no indication of filtering is visible
|
|
130
|
+
* to users. For example, set it to `true` if you do not display the filter summary.
|
|
131
|
+
*/
|
|
132
|
+
this.active = false;
|
|
133
|
+
/**
|
|
134
|
+
* Whether to disable the filter button.
|
|
135
|
+
*/
|
|
136
|
+
this.disabled = false;
|
|
137
|
+
/**
|
|
138
|
+
* Whether to display a "Filter" label beside the icon on the filter button.
|
|
139
|
+
*/
|
|
140
|
+
this.showButtonText = false;
|
|
141
|
+
/**
|
|
142
|
+
* Fires when the filter button is selected.
|
|
143
|
+
*/
|
|
144
|
+
this.filterButtonClick = new EventEmitter();
|
|
145
|
+
this.#filterButtonIdOrDefault =
|
|
146
|
+
this.#defaultButtonId = `sky-filter-button-${++nextId}`;
|
|
147
|
+
}
|
|
148
|
+
#defaultButtonId;
|
|
149
|
+
#filterButtonIdOrDefault;
|
|
150
|
+
filterButtonOnClick() {
|
|
151
|
+
this.filterButtonClick.emit();
|
|
152
|
+
}
|
|
153
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
154
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyFilterButtonComponent, selector: "sky-filter-button", inputs: { filterButtonId: "filterButtonId", ariaControls: "ariaControls", ariaExpanded: "ariaExpanded", active: "active", disabled: "disabled", showButtonText: "showButtonText" }, outputs: { filterButtonClick: "filterButtonClick" }, ngImport: i0, template: "<button\n class=\"sky-btn sky-btn-default sky-filter-btn\"\n type=\"button\"\n [attr.aria-controls]=\"ariaControls\"\n [attr.aria-expanded]=\"ariaExpanded\"\n [attr.aria-label]=\"'skyux_filter_button_title' | skyLibResources\"\n [attr.title]=\"'skyux_filter_button_title' | skyLibResources\"\n [disabled]=\"disabled\"\n [id]=\"filterButtonId\"\n [ngClass]=\"{\n 'sky-filter-btn-active': active\n }\"\n [skyThemeClass]=\"{\n 'sky-rounded-corners': 'default',\n 'sky-theme-modern': 'modern'\n }\"\n (click)=\"filterButtonOnClick()\"\n>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"filter\" size=\"lg\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"filter\" iconType=\"skyux\"></sky-icon>\n <span *ngIf=\"showButtonText\" class=\"sky-filter-btn-text\">\n {{ 'skyux_filter_button_title' | skyLibResources }}\n </span>\n</button>\n", styles: [".sky-filter-btn-active,.sky-filter-btn-active:hover,.sky-filter-btn-active:focus{color:#72bf44;border:2px solid #72bf44;padding:5px 11px}.sky-filter-btn-active:hover,.sky-filter-btn-active:focus{color:#212327}.sky-theme-modern.sky-filter-btn-active,.sky-theme-modern.sky-filter-btn-active:hover,.sky-theme-modern.sky-filter-btn-active:focus{color:initial;border:none;box-shadow:inset 0 0 0 1px #0974a1;background-color:#c1e8fb;color:#212327;padding:9px 21px}.sky-theme-modern.sky-filter-btn-active:hover,.sky-theme-modern.sky-filter-btn-active:hover:hover,.sky-theme-modern.sky-filter-btn-active:focus:hover{border:none;box-shadow:inset 0 0 0 1px #0974a1;text-decoration:none}.sky-theme-modern.sky-filter-btn-active:hover,.sky-theme-modern.sky-filter-btn-active:active,.sky-theme-modern.sky-filter-btn-active.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover:hover,.sky-theme-modern.sky-filter-btn-active:hover:active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus:hover,.sky-theme-modern.sky-filter-btn-active:focus:active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-active{color:#212327}.sky-theme-modern.sky-filter-btn-active:active,.sky-theme-modern.sky-filter-btn-active.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover:active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus:active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-active{border:none;box-shadow:inset 0 0 0 2px #0974a1;background-image:none}.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled:hover,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled:focus-visible,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled.sky-btn-focus,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled:active,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled.sky-btn-active,.sky-theme-modern.sky-filter-btn-active[disabled],.sky-theme-modern.sky-filter-btn-active[disabled]:hover,.sky-theme-modern.sky-filter-btn-active[disabled]:focus-visible,.sky-theme-modern.sky-filter-btn-active[disabled].sky-btn-focus,.sky-theme-modern.sky-filter-btn-active[disabled]:active,.sky-theme-modern.sky-filter-btn-active[disabled].sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled:hover,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled:focus-visible,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled.sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled:active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover[disabled],.sky-theme-modern.sky-filter-btn-active:hover[disabled]:hover,.sky-theme-modern.sky-filter-btn-active:hover[disabled]:focus-visible,.sky-theme-modern.sky-filter-btn-active:hover[disabled].sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:hover[disabled]:active,.sky-theme-modern.sky-filter-btn-active:hover[disabled].sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled:hover,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled:focus-visible,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled.sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled:active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus[disabled],.sky-theme-modern.sky-filter-btn-active:focus[disabled]:hover,.sky-theme-modern.sky-filter-btn-active:focus[disabled]:focus-visible,.sky-theme-modern.sky-filter-btn-active:focus[disabled].sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:focus[disabled]:active,.sky-theme-modern.sky-filter-btn-active:focus[disabled].sky-btn-active{border:none;box-shadow:inset 0 0 0 1px #d2d2d2;background-color:#ededee;color:#686c73;opacity:1}.sky-theme-modern.sky-filter-btn-active:focus-visible,.sky-theme-modern.sky-filter-btn-active:hover:focus-visible,.sky-theme-modern.sky-filter-btn-active:focus:focus-visible{outline:none}.sky-theme-modern.sky-filter-btn-active:focus-visible:not(:active),.sky-theme-modern.sky-filter-btn-active:hover:focus-visible:not(:active),.sky-theme-modern.sky-filter-btn-active:focus:focus-visible:not(:active){border:none;box-shadow:inset 0 0 0 2px #0974a1,0 1px 8px #0000004d}:host .sky-filter-btn-text{display:none}:host .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:none}:host-context(.sky-responsive-container-xs) .sky-filter-btn-text,:host-context(.sky-responsive-container-sm) .sky-filter-btn-text,:host-context(.sky-responsive-container-md) .sky-filter-btn-text,:host-context(.sky-responsive-container-lg) .sky-filter-btn-text{display:none}:host-context(.sky-responsive-container-xs) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-sm) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-md) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-lg) .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:none}@media (min-width: 768px){:host .sky-filter-btn-text{display:inline}:host .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:inline-block}}:host-context(.sky-responsive-container-sm) .sky-filter-btn-text,:host-context(.sky-responsive-container-md) .sky-filter-btn-text,:host-context(.sky-responsive-container-lg) .sky-filter-btn-text{display:inline}:host-context(.sky-responsive-container-sm) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-md) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-lg) .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:inline-block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "directive", type: i3.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { kind: "directive", type: i3.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
155
|
+
}
|
|
156
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterButtonComponent, decorators: [{
|
|
157
|
+
type: Component,
|
|
158
|
+
args: [{ selector: 'sky-filter-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"sky-btn sky-btn-default sky-filter-btn\"\n type=\"button\"\n [attr.aria-controls]=\"ariaControls\"\n [attr.aria-expanded]=\"ariaExpanded\"\n [attr.aria-label]=\"'skyux_filter_button_title' | skyLibResources\"\n [attr.title]=\"'skyux_filter_button_title' | skyLibResources\"\n [disabled]=\"disabled\"\n [id]=\"filterButtonId\"\n [ngClass]=\"{\n 'sky-filter-btn-active': active\n }\"\n [skyThemeClass]=\"{\n 'sky-rounded-corners': 'default',\n 'sky-theme-modern': 'modern'\n }\"\n (click)=\"filterButtonOnClick()\"\n>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"filter\" size=\"lg\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"filter\" iconType=\"skyux\"></sky-icon>\n <span *ngIf=\"showButtonText\" class=\"sky-filter-btn-text\">\n {{ 'skyux_filter_button_title' | skyLibResources }}\n </span>\n</button>\n", styles: [".sky-filter-btn-active,.sky-filter-btn-active:hover,.sky-filter-btn-active:focus{color:#72bf44;border:2px solid #72bf44;padding:5px 11px}.sky-filter-btn-active:hover,.sky-filter-btn-active:focus{color:#212327}.sky-theme-modern.sky-filter-btn-active,.sky-theme-modern.sky-filter-btn-active:hover,.sky-theme-modern.sky-filter-btn-active:focus{color:initial;border:none;box-shadow:inset 0 0 0 1px #0974a1;background-color:#c1e8fb;color:#212327;padding:9px 21px}.sky-theme-modern.sky-filter-btn-active:hover,.sky-theme-modern.sky-filter-btn-active:hover:hover,.sky-theme-modern.sky-filter-btn-active:focus:hover{border:none;box-shadow:inset 0 0 0 1px #0974a1;text-decoration:none}.sky-theme-modern.sky-filter-btn-active:hover,.sky-theme-modern.sky-filter-btn-active:active,.sky-theme-modern.sky-filter-btn-active.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover:hover,.sky-theme-modern.sky-filter-btn-active:hover:active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus:hover,.sky-theme-modern.sky-filter-btn-active:focus:active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-active{color:#212327}.sky-theme-modern.sky-filter-btn-active:active,.sky-theme-modern.sky-filter-btn-active.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover:active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus:active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-active{border:none;box-shadow:inset 0 0 0 2px #0974a1;background-image:none}.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled:hover,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled:focus-visible,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled.sky-btn-focus,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled:active,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled.sky-btn-active,.sky-theme-modern.sky-filter-btn-active[disabled],.sky-theme-modern.sky-filter-btn-active[disabled]:hover,.sky-theme-modern.sky-filter-btn-active[disabled]:focus-visible,.sky-theme-modern.sky-filter-btn-active[disabled].sky-btn-focus,.sky-theme-modern.sky-filter-btn-active[disabled]:active,.sky-theme-modern.sky-filter-btn-active[disabled].sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled:hover,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled:focus-visible,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled.sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled:active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover[disabled],.sky-theme-modern.sky-filter-btn-active:hover[disabled]:hover,.sky-theme-modern.sky-filter-btn-active:hover[disabled]:focus-visible,.sky-theme-modern.sky-filter-btn-active:hover[disabled].sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:hover[disabled]:active,.sky-theme-modern.sky-filter-btn-active:hover[disabled].sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled:hover,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled:focus-visible,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled.sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled:active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus[disabled],.sky-theme-modern.sky-filter-btn-active:focus[disabled]:hover,.sky-theme-modern.sky-filter-btn-active:focus[disabled]:focus-visible,.sky-theme-modern.sky-filter-btn-active:focus[disabled].sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:focus[disabled]:active,.sky-theme-modern.sky-filter-btn-active:focus[disabled].sky-btn-active{border:none;box-shadow:inset 0 0 0 1px #d2d2d2;background-color:#ededee;color:#686c73;opacity:1}.sky-theme-modern.sky-filter-btn-active:focus-visible,.sky-theme-modern.sky-filter-btn-active:hover:focus-visible,.sky-theme-modern.sky-filter-btn-active:focus:focus-visible{outline:none}.sky-theme-modern.sky-filter-btn-active:focus-visible:not(:active),.sky-theme-modern.sky-filter-btn-active:hover:focus-visible:not(:active),.sky-theme-modern.sky-filter-btn-active:focus:focus-visible:not(:active){border:none;box-shadow:inset 0 0 0 2px #0974a1,0 1px 8px #0000004d}:host .sky-filter-btn-text{display:none}:host .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:none}:host-context(.sky-responsive-container-xs) .sky-filter-btn-text,:host-context(.sky-responsive-container-sm) .sky-filter-btn-text,:host-context(.sky-responsive-container-md) .sky-filter-btn-text,:host-context(.sky-responsive-container-lg) .sky-filter-btn-text{display:none}:host-context(.sky-responsive-container-xs) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-sm) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-md) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-lg) .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:none}@media (min-width: 768px){:host .sky-filter-btn-text{display:inline}:host .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:inline-block}}:host-context(.sky-responsive-container-sm) .sky-filter-btn-text,:host-context(.sky-responsive-container-md) .sky-filter-btn-text,:host-context(.sky-responsive-container-lg) .sky-filter-btn-text{display:inline}:host-context(.sky-responsive-container-sm) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-md) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-lg) .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:inline-block}\n"] }]
|
|
159
|
+
}], ctorParameters: function () { return []; }, propDecorators: { filterButtonId: [{
|
|
160
|
+
type: Input
|
|
161
|
+
}], ariaControls: [{
|
|
162
|
+
type: Input
|
|
163
|
+
}], ariaExpanded: [{
|
|
164
|
+
type: Input
|
|
165
|
+
}], active: [{
|
|
166
|
+
type: Input
|
|
167
|
+
}], disabled: [{
|
|
168
|
+
type: Input
|
|
169
|
+
}], showButtonText: [{
|
|
170
|
+
type: Input
|
|
171
|
+
}], filterButtonClick: [{
|
|
172
|
+
type: Output
|
|
173
|
+
}] } });
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Specifies an inline filter.
|
|
177
|
+
*/
|
|
178
|
+
class SkyFilterInlineItemComponent {
|
|
179
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterInlineItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
180
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyFilterInlineItemComponent, selector: "sky-filter-inline-item", ngImport: i0, template: "<div class=\"sky-filter-inline-item\">\n <ng-content></ng-content>\n</div>\n", styles: [".sky-filter-inline-item{margin-right:10px}\n"] }); }
|
|
181
|
+
}
|
|
182
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterInlineItemComponent, decorators: [{
|
|
183
|
+
type: Component,
|
|
184
|
+
args: [{ selector: 'sky-filter-inline-item', template: "<div class=\"sky-filter-inline-item\">\n <ng-content></ng-content>\n</div>\n", styles: [".sky-filter-inline-item{margin-right:10px}\n"] }]
|
|
185
|
+
}] });
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Specifies a wrapper for the inline filters.
|
|
189
|
+
*/
|
|
190
|
+
class SkyFilterInlineComponent {
|
|
191
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterInlineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
192
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyFilterInlineComponent, selector: "sky-filter-inline", ngImport: i0, template: "<div class=\"sky-filter-inline sky-padding-even-default\">\n <ng-content></ng-content>\n</div>\n", styles: [".sky-filter-inline{background-color:#eeeeef;display:flex;align-items:center}\n"] }); }
|
|
193
|
+
}
|
|
194
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterInlineComponent, decorators: [{
|
|
195
|
+
type: Component,
|
|
196
|
+
args: [{ selector: 'sky-filter-inline', template: "<div class=\"sky-filter-inline sky-padding-even-default\">\n <ng-content></ng-content>\n</div>\n", styles: [".sky-filter-inline{background-color:#eeeeef;display:flex;align-items:center}\n"] }]
|
|
197
|
+
}] });
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Specifies a filter that was applied.
|
|
201
|
+
*/
|
|
202
|
+
class SkyFilterSummaryItemComponent {
|
|
203
|
+
constructor() {
|
|
204
|
+
/**
|
|
205
|
+
* Fires when the summary item close button is selected.
|
|
206
|
+
*/
|
|
207
|
+
this.dismiss = new EventEmitter();
|
|
208
|
+
/**
|
|
209
|
+
* Fires when the summary item is selected.
|
|
210
|
+
*/
|
|
211
|
+
this.itemClick = new EventEmitter();
|
|
212
|
+
this.#_dismissible = true;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Whether the filter summary item has a close button.
|
|
216
|
+
*/
|
|
217
|
+
get dismissible() {
|
|
218
|
+
return this.#_dismissible;
|
|
219
|
+
}
|
|
220
|
+
set dismissible(value) {
|
|
221
|
+
this.#_dismissible = value !== false;
|
|
222
|
+
}
|
|
223
|
+
#_dismissible;
|
|
224
|
+
onItemDismiss() {
|
|
225
|
+
this.dismiss.emit();
|
|
226
|
+
}
|
|
227
|
+
onItemClick() {
|
|
228
|
+
this.itemClick.emit();
|
|
229
|
+
}
|
|
230
|
+
onItemKeypress() {
|
|
231
|
+
this.itemClick.emit();
|
|
232
|
+
}
|
|
233
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterSummaryItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
234
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyFilterSummaryItemComponent, selector: "sky-filter-summary-item", inputs: { dismissible: "dismissible" }, outputs: { dismiss: "dismiss", itemClick: "itemClick" }, ngImport: i0, template: "<div\n class=\"sky-filter-summary-item\"\n (click)=\"onItemClick()\"\n (keypress.enter)=\"onItemKeypress()\"\n>\n <sky-token\n [ariaLabel]=\"'skyux_filter_summary_close' | skyLibResources\"\n [dismissible]=\"dismissible\"\n (dismiss)=\"onItemDismiss()\"\n >\n <ng-content> </ng-content>\n </sky-token>\n</div>\n", styles: [".sky-filter-summary-item{display:inline-block}:host:not(:last-child){margin-right:5px}:host-context(.sky-theme-modern) .sky-filter-summary-item{padding:0 0 5px}.sky-theme-modern .sky-filter-summary-item{padding:0 0 5px}\n"], dependencies: [{ kind: "component", type: i2.λ12, selector: "sky-token", inputs: ["disabled", "ariaLabel", "dismissible", "focusable", "role"], outputs: ["dismiss", "tokenFocus"] }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
235
|
+
}
|
|
236
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterSummaryItemComponent, decorators: [{
|
|
237
|
+
type: Component,
|
|
238
|
+
args: [{ selector: 'sky-filter-summary-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"sky-filter-summary-item\"\n (click)=\"onItemClick()\"\n (keypress.enter)=\"onItemKeypress()\"\n>\n <sky-token\n [ariaLabel]=\"'skyux_filter_summary_close' | skyLibResources\"\n [dismissible]=\"dismissible\"\n (dismiss)=\"onItemDismiss()\"\n >\n <ng-content> </ng-content>\n </sky-token>\n</div>\n", styles: [".sky-filter-summary-item{display:inline-block}:host:not(:last-child){margin-right:5px}:host-context(.sky-theme-modern) .sky-filter-summary-item{padding:0 0 5px}.sky-theme-modern .sky-filter-summary-item{padding:0 0 5px}\n"] }]
|
|
239
|
+
}], propDecorators: { dismissible: [{
|
|
240
|
+
type: Input
|
|
241
|
+
}], dismiss: [{
|
|
242
|
+
type: Output
|
|
243
|
+
}], itemClick: [{
|
|
244
|
+
type: Output
|
|
245
|
+
}] } });
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Specifies a wrapper for the filters that were applied.
|
|
249
|
+
*/
|
|
250
|
+
class SkyFilterSummaryComponent {
|
|
251
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterSummaryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
252
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyFilterSummaryComponent, selector: "sky-filter-summary", ngImport: i0, template: "<div class=\"sky-filter-summary\">\n <span class=\"sky-filter-summary-header\"\n >{{ 'skyux_filter_summary_header' | skyLibResources }}:</span\n >\n <div class=\"sky-filter-summary-items\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".sky-filter-summary-header{margin:5px 10px 0 0;font-weight:600}.sky-filter-summary{background-color:#fff;overflow-x:auto;display:flex;align-items:flex-start}.sky-filter-summary-items{display:flex;flex-wrap:wrap}:host-context(.sky-theme-modern) .sky-filter-summary-header{margin:0 10px 0 0}.sky-theme-modern .sky-filter-summary-header{margin:0 10px 0 0}\n"], dependencies: [{ kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
253
|
+
}
|
|
254
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterSummaryComponent, decorators: [{
|
|
255
|
+
type: Component,
|
|
256
|
+
args: [{ selector: 'sky-filter-summary', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sky-filter-summary\">\n <span class=\"sky-filter-summary-header\"\n >{{ 'skyux_filter_summary_header' | skyLibResources }}:</span\n >\n <div class=\"sky-filter-summary-items\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".sky-filter-summary-header{margin:5px 10px 0 0;font-weight:600}.sky-filter-summary{background-color:#fff;overflow-x:auto;display:flex;align-items:flex-start}.sky-filter-summary-items{display:flex;flex-wrap:wrap}:host-context(.sky-theme-modern) .sky-filter-summary-header{margin:0 10px 0 0}.sky-theme-modern .sky-filter-summary-header{margin:0 10px 0 0}\n"] }]
|
|
257
|
+
}] });
|
|
258
|
+
|
|
259
|
+
class SkyFilterModule {
|
|
260
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
261
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterModule, declarations: [SkyFilterButtonComponent,
|
|
262
|
+
SkyFilterInlineComponent,
|
|
263
|
+
SkyFilterInlineItemComponent,
|
|
264
|
+
SkyFilterSummaryComponent,
|
|
265
|
+
SkyFilterSummaryItemComponent], imports: [CommonModule,
|
|
266
|
+
SkyIconModule,
|
|
267
|
+
SkyListsResourcesModule,
|
|
268
|
+
SkyTokensModule,
|
|
269
|
+
SkyThemeModule], exports: [SkyFilterButtonComponent,
|
|
270
|
+
SkyFilterInlineComponent,
|
|
271
|
+
SkyFilterInlineItemComponent,
|
|
272
|
+
SkyFilterSummaryComponent,
|
|
273
|
+
SkyFilterSummaryItemComponent] }); }
|
|
274
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterModule, imports: [CommonModule,
|
|
275
|
+
SkyIconModule,
|
|
276
|
+
SkyListsResourcesModule,
|
|
277
|
+
SkyTokensModule,
|
|
278
|
+
SkyThemeModule] }); }
|
|
279
|
+
}
|
|
280
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterModule, decorators: [{
|
|
281
|
+
type: NgModule,
|
|
282
|
+
args: [{
|
|
283
|
+
declarations: [
|
|
284
|
+
SkyFilterButtonComponent,
|
|
285
|
+
SkyFilterInlineComponent,
|
|
286
|
+
SkyFilterInlineItemComponent,
|
|
287
|
+
SkyFilterSummaryComponent,
|
|
288
|
+
SkyFilterSummaryItemComponent,
|
|
289
|
+
],
|
|
290
|
+
imports: [
|
|
291
|
+
CommonModule,
|
|
292
|
+
SkyIconModule,
|
|
293
|
+
SkyListsResourcesModule,
|
|
294
|
+
SkyTokensModule,
|
|
295
|
+
SkyThemeModule,
|
|
296
|
+
],
|
|
297
|
+
exports: [
|
|
298
|
+
SkyFilterButtonComponent,
|
|
299
|
+
SkyFilterInlineComponent,
|
|
300
|
+
SkyFilterInlineItemComponent,
|
|
301
|
+
SkyFilterSummaryComponent,
|
|
302
|
+
SkyFilterSummaryItemComponent,
|
|
303
|
+
],
|
|
304
|
+
}]
|
|
305
|
+
}] });
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* @internal
|
|
309
|
+
*/
|
|
310
|
+
class SkyInfiniteScrollDomAdapterService {
|
|
311
|
+
#ngUnsubscribe = new Subject();
|
|
312
|
+
#observer;
|
|
313
|
+
#parentChanges;
|
|
314
|
+
#parentChangesObs;
|
|
315
|
+
#scrollableHostSvc;
|
|
316
|
+
#windowRef;
|
|
317
|
+
constructor(scrollableHostSvc, windowRef) {
|
|
318
|
+
this.#scrollableHostSvc = scrollableHostSvc;
|
|
319
|
+
this.#windowRef = windowRef;
|
|
320
|
+
this.#parentChanges = new Subject();
|
|
321
|
+
this.#parentChangesObs = this.#parentChanges.asObservable();
|
|
322
|
+
}
|
|
323
|
+
ngOnDestroy() {
|
|
324
|
+
this.#parentChanges.complete();
|
|
325
|
+
this.#ngUnsubscribe.next();
|
|
326
|
+
this.#ngUnsubscribe.complete();
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* This event is triggered when child nodes are added to the infinite
|
|
330
|
+
* scroll parent container. e.g., A repeating list of elements was added.
|
|
331
|
+
* @param elementRef The infinite scroll element reference.
|
|
332
|
+
*/
|
|
333
|
+
parentChanges(elementRef) {
|
|
334
|
+
this.#createObserver(elementRef);
|
|
335
|
+
return this.#parentChangesObs;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* This event is triggered when the provided element reference
|
|
339
|
+
* is visible (or scrolled to) within its scrollable parent container.
|
|
340
|
+
* @param elementRef The infinite scroll element reference.
|
|
341
|
+
*/
|
|
342
|
+
scrollTo(elementRef) {
|
|
343
|
+
const parent = this.#scrollableHostSvc.getScrollableHost(elementRef);
|
|
344
|
+
return fromEvent(parent, 'scroll').pipe(takeUntil(this.#ngUnsubscribe), filter(() => {
|
|
345
|
+
return this.#isElementScrolledInView(elementRef.nativeElement, parent);
|
|
346
|
+
}), map(() => undefined) // Change to void return type
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
#createObserver(elementRef) {
|
|
350
|
+
this.#observer = new MutationObserver((mutations) => {
|
|
351
|
+
const hasUpdates = !!mutations.find((mutation) => {
|
|
352
|
+
return (!elementRef.nativeElement.contains(mutation.target) &&
|
|
353
|
+
mutation.addedNodes.length > 0);
|
|
354
|
+
});
|
|
355
|
+
if (hasUpdates) {
|
|
356
|
+
this.#parentChanges.next();
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
const windowObj = this.#windowRef.nativeWindow;
|
|
360
|
+
const parent = this.#scrollableHostSvc.getScrollableHost(elementRef);
|
|
361
|
+
const observedParent = parent === windowObj ? windowObj.document.body : parent;
|
|
362
|
+
this.#observer.observe(observedParent, {
|
|
363
|
+
childList: true,
|
|
364
|
+
subtree: true,
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
#isElementScrolledInView(element, parentElement) {
|
|
368
|
+
const windowObj = this.#windowRef.nativeWindow;
|
|
369
|
+
if (parentElement === windowObj) {
|
|
370
|
+
return (parentElement.pageYOffset + parentElement.innerHeight >
|
|
371
|
+
element.offsetTop);
|
|
372
|
+
}
|
|
373
|
+
const elementRect = element.getBoundingClientRect();
|
|
374
|
+
const parentRect = parentElement.getBoundingClientRect();
|
|
375
|
+
return elementRect.top < parentRect.top + parentRect.height;
|
|
376
|
+
}
|
|
377
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollDomAdapterService, deps: [{ token: i1$1.SkyScrollableHostService }, { token: i1$1.SkyAppWindowRef }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
378
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollDomAdapterService }); }
|
|
379
|
+
}
|
|
380
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollDomAdapterService, decorators: [{
|
|
381
|
+
type: Injectable
|
|
382
|
+
}], ctorParameters: function () { return [{ type: i1$1.SkyScrollableHostService }, { type: i1$1.SkyAppWindowRef }]; } });
|
|
383
|
+
|
|
384
|
+
class SkyInfiniteScrollComponent {
|
|
385
|
+
/**
|
|
386
|
+
* Whether to make the infinite scroll component active when more data is available
|
|
387
|
+
* to load. By default, infinite scroll is inactive and does not call the load function.
|
|
388
|
+
* @default false
|
|
389
|
+
*/
|
|
390
|
+
get enabled() {
|
|
391
|
+
return this.#_enabled;
|
|
392
|
+
}
|
|
393
|
+
set enabled(value) {
|
|
394
|
+
if (this.#_enabled !== value) {
|
|
395
|
+
this.#_enabled = value;
|
|
396
|
+
this.#setListeners();
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Whether data is loading because of a `scrollEnd` event. Setting the property
|
|
401
|
+
* to `true` disables new `scrollEnd` events from firing until it changes to `false`. If this
|
|
402
|
+
* property is not specified, the infinite scroll component watches the DOM for changes
|
|
403
|
+
* and fires `scrollEnd` events when changes occur on its parent DOM element. Relying
|
|
404
|
+
* on this default behavior could fire an excessive number of `scrollEnd` events
|
|
405
|
+
* if the DOM changes are not related to loading data, so we strongly recommend using this
|
|
406
|
+
* property to explicitly set the infinite scroll's loading state.
|
|
407
|
+
* @required
|
|
408
|
+
*/
|
|
409
|
+
get loading() {
|
|
410
|
+
return this.#_loading;
|
|
411
|
+
}
|
|
412
|
+
set loading(value) {
|
|
413
|
+
this.#_loading = value;
|
|
414
|
+
if (value !== undefined) {
|
|
415
|
+
this.isWaiting = value;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
#changeDetector;
|
|
419
|
+
#domAdapter;
|
|
420
|
+
#elementRef;
|
|
421
|
+
#ngUnsubscribe;
|
|
422
|
+
#_enabled;
|
|
423
|
+
#_loading;
|
|
424
|
+
constructor(changeDetector, elementRef, domAdapter) {
|
|
425
|
+
/**
|
|
426
|
+
* Fires when scrolling triggers the need to load more data or when users select the button
|
|
427
|
+
* to load more data. This event only fires when the `enabled` property is set to `true`
|
|
428
|
+
* and data is not already loading.
|
|
429
|
+
*/
|
|
430
|
+
this.scrollEnd = new EventEmitter();
|
|
431
|
+
this.isWaiting = false;
|
|
432
|
+
this.#ngUnsubscribe = new Subject();
|
|
433
|
+
this.#_enabled = false;
|
|
434
|
+
this.#changeDetector = changeDetector;
|
|
435
|
+
this.#elementRef = elementRef;
|
|
436
|
+
this.#domAdapter = domAdapter;
|
|
437
|
+
}
|
|
438
|
+
ngOnDestroy() {
|
|
439
|
+
this.enabled = false;
|
|
440
|
+
this.#ngUnsubscribe.next();
|
|
441
|
+
this.#ngUnsubscribe.complete();
|
|
442
|
+
}
|
|
443
|
+
startInfiniteScrollLoad() {
|
|
444
|
+
this.#notifyScrollEnd();
|
|
445
|
+
}
|
|
446
|
+
#notifyScrollEnd() {
|
|
447
|
+
this.isWaiting = true;
|
|
448
|
+
this.scrollEnd.emit();
|
|
449
|
+
this.#changeDetector.markForCheck();
|
|
450
|
+
}
|
|
451
|
+
#setListeners() {
|
|
452
|
+
if (this.enabled) {
|
|
453
|
+
// The user has scrolled to the infinite scroll element.
|
|
454
|
+
this.#domAdapter
|
|
455
|
+
.scrollTo(this.#elementRef)
|
|
456
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
457
|
+
.subscribe(() => {
|
|
458
|
+
if (!this.isWaiting && this.enabled) {
|
|
459
|
+
this.#notifyScrollEnd();
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
// New items have been loaded into the parent element.
|
|
463
|
+
this.#domAdapter
|
|
464
|
+
.parentChanges(this.#elementRef)
|
|
465
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
466
|
+
.subscribe(() => {
|
|
467
|
+
if (!this.loading) {
|
|
468
|
+
this.isWaiting = false;
|
|
469
|
+
this.#changeDetector.markForCheck();
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
this.#ngUnsubscribe.next();
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: SkyInfiniteScrollDomAdapterService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
478
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyInfiniteScrollComponent, selector: "sky-infinite-scroll", inputs: { enabled: "enabled", loading: "loading" }, outputs: { scrollEnd: "scrollEnd" }, providers: [SkyInfiniteScrollDomAdapterService], ngImport: i0, template: "<div *ngIf=\"enabled\" class=\"sky-infinite-scroll\">\n <button\n *ngIf=\"!isWaiting && enabled\"\n class=\"sky-btn sky-btn-default sky-infinite-scroll-load-more-button\"\n type=\"button\"\n (click)=\"startInfiniteScrollLoad()\"\n >\n {{ 'skyux_infinite_scroll_load_more_button' | skyLibResources }}\n </button>\n <sky-wait [isWaiting]=\"isWaiting\"> </sky-wait>\n</div>\n", styles: [".sky-infinite-scroll{margin-top:20px;text-align:center;min-height:75px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.λ14, selector: "sky-wait", inputs: ["ariaLabel", "isWaiting", "isFullPage", "isNonBlocking", "screenReaderCompletedText"] }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
479
|
+
}
|
|
480
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollComponent, decorators: [{
|
|
481
|
+
type: Component,
|
|
482
|
+
args: [{ selector: 'sky-infinite-scroll', changeDetection: ChangeDetectionStrategy.OnPush, providers: [SkyInfiniteScrollDomAdapterService], template: "<div *ngIf=\"enabled\" class=\"sky-infinite-scroll\">\n <button\n *ngIf=\"!isWaiting && enabled\"\n class=\"sky-btn sky-btn-default sky-infinite-scroll-load-more-button\"\n type=\"button\"\n (click)=\"startInfiniteScrollLoad()\"\n >\n {{ 'skyux_infinite_scroll_load_more_button' | skyLibResources }}\n </button>\n <sky-wait [isWaiting]=\"isWaiting\"> </sky-wait>\n</div>\n", styles: [".sky-infinite-scroll{margin-top:20px;text-align:center;min-height:75px}\n"] }]
|
|
483
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: SkyInfiniteScrollDomAdapterService }]; }, propDecorators: { enabled: [{
|
|
484
|
+
type: Input
|
|
485
|
+
}], loading: [{
|
|
486
|
+
type: Input
|
|
487
|
+
}], scrollEnd: [{
|
|
488
|
+
type: Output
|
|
489
|
+
}] } });
|
|
490
|
+
|
|
491
|
+
class SkyInfiniteScrollModule {
|
|
492
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
493
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollModule, declarations: [SkyInfiniteScrollComponent], imports: [CommonModule, SkyListsResourcesModule, SkyWaitModule], exports: [SkyInfiniteScrollComponent] }); }
|
|
494
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollModule, imports: [CommonModule, SkyListsResourcesModule, SkyWaitModule] }); }
|
|
495
|
+
}
|
|
496
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollModule, decorators: [{
|
|
497
|
+
type: NgModule,
|
|
498
|
+
args: [{
|
|
499
|
+
declarations: [SkyInfiniteScrollComponent],
|
|
500
|
+
imports: [CommonModule, SkyListsResourcesModule, SkyWaitModule],
|
|
501
|
+
exports: [SkyInfiniteScrollComponent],
|
|
502
|
+
}]
|
|
503
|
+
}] });
|
|
504
|
+
|
|
505
|
+
class SkyPagingComponent {
|
|
506
|
+
constructor() {
|
|
507
|
+
/**
|
|
508
|
+
* The page number of the current page. Page numbers start at 1 and increment.
|
|
509
|
+
*/
|
|
510
|
+
this.currentPage = 1;
|
|
511
|
+
/**
|
|
512
|
+
* The total number of items across all pages.
|
|
513
|
+
*/
|
|
514
|
+
this.itemCount = 0;
|
|
515
|
+
/**
|
|
516
|
+
* The maximum number of pages to display in the pagination control.
|
|
517
|
+
*/
|
|
518
|
+
this.maxPages = 5;
|
|
519
|
+
/**
|
|
520
|
+
* The number of items to display per page.
|
|
521
|
+
*/
|
|
522
|
+
this.pageSize = 10;
|
|
523
|
+
/**
|
|
524
|
+
* Fires when the current page changes and emits the new current page.
|
|
525
|
+
*/
|
|
526
|
+
this.currentPageChange = new EventEmitter();
|
|
527
|
+
this.displayedPages = [];
|
|
528
|
+
this.pageCount = 0;
|
|
529
|
+
}
|
|
530
|
+
ngOnChanges(changes) {
|
|
531
|
+
this.setPage(this.currentPage);
|
|
532
|
+
}
|
|
533
|
+
setPage(pageNumber) {
|
|
534
|
+
const previousPage = this.currentPage;
|
|
535
|
+
this.#setPageCount();
|
|
536
|
+
if (pageNumber < 1 || this.pageCount < 1) {
|
|
537
|
+
this.currentPage = 1;
|
|
538
|
+
}
|
|
539
|
+
else if (pageNumber > this.pageCount) {
|
|
540
|
+
this.currentPage = this.pageCount;
|
|
541
|
+
}
|
|
542
|
+
else {
|
|
543
|
+
this.currentPage = pageNumber;
|
|
544
|
+
}
|
|
545
|
+
this.#setDisplayedPages();
|
|
546
|
+
if (previousPage !== this.currentPage) {
|
|
547
|
+
this.currentPageChange.emit(this.currentPage);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
nextPage() {
|
|
551
|
+
this.setPage(this.currentPage + 1);
|
|
552
|
+
}
|
|
553
|
+
previousPage() {
|
|
554
|
+
this.setPage(this.currentPage - 1);
|
|
555
|
+
}
|
|
556
|
+
get isPreviousButtonDisabled() {
|
|
557
|
+
return this.currentPage === 1;
|
|
558
|
+
}
|
|
559
|
+
get isNextButtonDisabled() {
|
|
560
|
+
return this.currentPage === this.pageCount;
|
|
561
|
+
}
|
|
562
|
+
#getDisplayedPageNumbers(pageCount, maxDisplayedPages, pageNumber) {
|
|
563
|
+
const pageIndex = pageNumber - 1;
|
|
564
|
+
const pageBounds = Math.floor(maxDisplayedPages / 2);
|
|
565
|
+
let upperBound = pageIndex + pageBounds;
|
|
566
|
+
let lowerBound = pageIndex - pageBounds;
|
|
567
|
+
if (maxDisplayedPages % 2 !== 0) {
|
|
568
|
+
upperBound += 1;
|
|
569
|
+
}
|
|
570
|
+
// Wrap negative values to increase the upper bound
|
|
571
|
+
if (lowerBound < 0) {
|
|
572
|
+
upperBound -= lowerBound;
|
|
573
|
+
lowerBound = 0;
|
|
574
|
+
}
|
|
575
|
+
// Wrap overflow to decrease the lower bound
|
|
576
|
+
if (upperBound > pageCount) {
|
|
577
|
+
lowerBound -= upperBound - pageCount;
|
|
578
|
+
upperBound = pageCount;
|
|
579
|
+
}
|
|
580
|
+
// If both are the same ignore everything else and just display it all
|
|
581
|
+
if (pageCount < maxDisplayedPages) {
|
|
582
|
+
lowerBound = 0;
|
|
583
|
+
upperBound = pageCount;
|
|
584
|
+
}
|
|
585
|
+
const displayedPageNumbers = [];
|
|
586
|
+
for (let i = lowerBound; i < upperBound; i++) {
|
|
587
|
+
displayedPageNumbers.push(i + 1);
|
|
588
|
+
}
|
|
589
|
+
return displayedPageNumbers;
|
|
590
|
+
}
|
|
591
|
+
#setPageCount() {
|
|
592
|
+
if (this.itemCount === 0 || this.pageSize === 0) {
|
|
593
|
+
this.pageCount = 0;
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
this.pageCount = Math.ceil(this.itemCount / this.pageSize);
|
|
597
|
+
}
|
|
598
|
+
#setDisplayedPages() {
|
|
599
|
+
this.displayedPages = this.#getDisplayedPageNumbers(this.pageCount, this.maxPages, this.currentPage);
|
|
600
|
+
}
|
|
601
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPagingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
602
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyPagingComponent, selector: "sky-paging", inputs: { currentPage: "currentPage", itemCount: "itemCount", maxPages: "maxPages", pageSize: "pageSize", pagingLabel: "pagingLabel" }, outputs: { currentPageChange: "currentPageChange" }, usesOnChanges: true, ngImport: i0, template: "<nav\n *ngIf=\"pageCount > 1\"\n class=\"sky-paging\"\n [attr.aria-label]=\"pagingLabel || ('skyux_paging_label' | skyLibResources)\"\n>\n <ul>\n <li>\n <button\n class=\"sky-btn sky-btn-default sky-paging-btn sky-paging-btn-previous sky-box\"\n sky-cmp-id=\"previous\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_paging_previous' | skyLibResources\"\n [disabled]=\"isPreviousButtonDisabled\"\n (click)=\"previousPage()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"caret-left\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"chevron-left\"\n iconType=\"skyux\"\n ></sky-icon>\n </button>\n </li>\n <li *ngFor=\"let pageNumber of displayedPages\" class=\"sky-list-paging-link\">\n <button\n class=\"sky-btn sky-btn-default sky-paging-btn sky-box\"\n type=\"button\"\n [attr.aria-current]=\"currentPage === pageNumber ? 'page' : null\"\n [attr.sky-cmp-id]=\"pageNumber\"\n [attr.aria-label]=\"\n 'skyux_paging_page_link_aria_label' | skyLibResources : pageNumber\n \"\n [disabled]=\"currentPage === pageNumber\"\n [ngClass]=\"{ 'sky-paging-current': currentPage === pageNumber }\"\n (click)=\"setPage(pageNumber)\"\n >\n {{ pageNumber }}\n </button>\n </li>\n <li>\n <button\n class=\"sky-btn sky-btn-default sky-paging-btn sky-paging-btn-next sky-box\"\n sky-cmp-id=\"next\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_paging_next' | skyLibResources\"\n [disabled]=\"isNextButtonDisabled\"\n (click)=\"nextPage()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"caret-right\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"chevron-right\"\n iconType=\"skyux\"\n ></sky-icon>\n </button>\n </li>\n </ul>\n</nav>\n", styles: [":host{display:block}ul{margin:15px 0 0;display:inline-block;padding-left:0;border-radius:4px}li{display:inline}.sky-paging-btn{border-top:1px solid #e2e3e4;border-right:1px solid #e2e3e4;border-bottom:1px solid #e2e3e4;border-left:1px solid #e2e3e4;border-radius:0;background-color:#fff;color:inherit;float:left;margin-left:-1px;padding:4px 10px;text-decoration:none;line-height:1.428571429;font-size:15px;cursor:pointer}.sky-paging-btn.sky-paging-caret{transform:none}.sky-paging-btn.sky-paging-current,.sky-paging-btn.sky-paging-current:disabled,.sky-paging-btn.sky-paging-current[disabled]{background-color:#eeeeef;cursor:default;color:inherit;opacity:1}.sky-paging-btn:hover{background-color:#d4d4d6}.sky-paging-btn:disabled{color:#686c73;cursor:not-allowed;pointer-events:none}.sky-paging-btn.sky-paging-btn-previous,.sky-paging-btn.sky-paging-btn-next{padding-left:8.5px;padding-right:8.5px}:host-context(.sky-theme-modern) .sky-paging-btn{background-color:transparent;border:none;box-shadow:none;border-radius:6px;margin-right:10px;padding:3px 10px}:host-context(.sky-theme-modern) .sky-paging-btn:hover{background-color:transparent;border:solid 1px #1870B8;padding:2px 9px;z-index:1}:host-context(.sky-theme-modern) .sky-paging-btn:active,:host-context(.sky-theme-modern) .sky-paging-btn:focus{border:solid 2px #1870B8;color:#212327;padding:1px 8px}:host-context(.sky-theme-modern) .sky-paging-btn:focus:not(:active){outline:none;box-shadow:0 1px 3px #0000004d}:host-context(.sky-theme-modern) .sky-paging-current{background-color:var(--sky-background-color-item-selected);border:solid 1px #1870B8;padding:2px 9px}.sky-theme-modern .sky-paging-btn{background-color:transparent;border:none;box-shadow:none;border-radius:6px;margin-right:10px;padding:3px 10px}.sky-theme-modern .sky-paging-btn:hover{background-color:transparent;border:solid 1px #1870B8;padding:2px 9px;z-index:1}.sky-theme-modern .sky-paging-btn:active,.sky-theme-modern .sky-paging-btn:focus{border:solid 2px #1870B8;color:#212327;padding:1px 8px}.sky-theme-modern .sky-paging-btn:focus:not(:active){outline:none;box-shadow:0 1px 3px #0000004d}.sky-theme-modern .sky-paging-current{background-color:var(--sky-background-color-item-selected);border:solid 1px #1870B8;padding:2px 9px}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-paging-btn:active,:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-paging-btn:focus{color:#fbfcfe}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-paging-current{background-color:#1870b8}.sky-theme-modern.sky-theme-mode-dark .sky-paging-btn:active,.sky-theme-modern.sky-theme-mode-dark .sky-paging-btn:focus{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark .sky-paging-current{background-color:#1870b8}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "directive", type: i3.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
603
|
+
}
|
|
604
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPagingComponent, decorators: [{
|
|
605
|
+
type: Component,
|
|
606
|
+
args: [{ selector: 'sky-paging', changeDetection: ChangeDetectionStrategy.OnPush, template: "<nav\n *ngIf=\"pageCount > 1\"\n class=\"sky-paging\"\n [attr.aria-label]=\"pagingLabel || ('skyux_paging_label' | skyLibResources)\"\n>\n <ul>\n <li>\n <button\n class=\"sky-btn sky-btn-default sky-paging-btn sky-paging-btn-previous sky-box\"\n sky-cmp-id=\"previous\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_paging_previous' | skyLibResources\"\n [disabled]=\"isPreviousButtonDisabled\"\n (click)=\"previousPage()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"caret-left\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"chevron-left\"\n iconType=\"skyux\"\n ></sky-icon>\n </button>\n </li>\n <li *ngFor=\"let pageNumber of displayedPages\" class=\"sky-list-paging-link\">\n <button\n class=\"sky-btn sky-btn-default sky-paging-btn sky-box\"\n type=\"button\"\n [attr.aria-current]=\"currentPage === pageNumber ? 'page' : null\"\n [attr.sky-cmp-id]=\"pageNumber\"\n [attr.aria-label]=\"\n 'skyux_paging_page_link_aria_label' | skyLibResources : pageNumber\n \"\n [disabled]=\"currentPage === pageNumber\"\n [ngClass]=\"{ 'sky-paging-current': currentPage === pageNumber }\"\n (click)=\"setPage(pageNumber)\"\n >\n {{ pageNumber }}\n </button>\n </li>\n <li>\n <button\n class=\"sky-btn sky-btn-default sky-paging-btn sky-paging-btn-next sky-box\"\n sky-cmp-id=\"next\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_paging_next' | skyLibResources\"\n [disabled]=\"isNextButtonDisabled\"\n (click)=\"nextPage()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"caret-right\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"chevron-right\"\n iconType=\"skyux\"\n ></sky-icon>\n </button>\n </li>\n </ul>\n</nav>\n", styles: [":host{display:block}ul{margin:15px 0 0;display:inline-block;padding-left:0;border-radius:4px}li{display:inline}.sky-paging-btn{border-top:1px solid #e2e3e4;border-right:1px solid #e2e3e4;border-bottom:1px solid #e2e3e4;border-left:1px solid #e2e3e4;border-radius:0;background-color:#fff;color:inherit;float:left;margin-left:-1px;padding:4px 10px;text-decoration:none;line-height:1.428571429;font-size:15px;cursor:pointer}.sky-paging-btn.sky-paging-caret{transform:none}.sky-paging-btn.sky-paging-current,.sky-paging-btn.sky-paging-current:disabled,.sky-paging-btn.sky-paging-current[disabled]{background-color:#eeeeef;cursor:default;color:inherit;opacity:1}.sky-paging-btn:hover{background-color:#d4d4d6}.sky-paging-btn:disabled{color:#686c73;cursor:not-allowed;pointer-events:none}.sky-paging-btn.sky-paging-btn-previous,.sky-paging-btn.sky-paging-btn-next{padding-left:8.5px;padding-right:8.5px}:host-context(.sky-theme-modern) .sky-paging-btn{background-color:transparent;border:none;box-shadow:none;border-radius:6px;margin-right:10px;padding:3px 10px}:host-context(.sky-theme-modern) .sky-paging-btn:hover{background-color:transparent;border:solid 1px #1870B8;padding:2px 9px;z-index:1}:host-context(.sky-theme-modern) .sky-paging-btn:active,:host-context(.sky-theme-modern) .sky-paging-btn:focus{border:solid 2px #1870B8;color:#212327;padding:1px 8px}:host-context(.sky-theme-modern) .sky-paging-btn:focus:not(:active){outline:none;box-shadow:0 1px 3px #0000004d}:host-context(.sky-theme-modern) .sky-paging-current{background-color:var(--sky-background-color-item-selected);border:solid 1px #1870B8;padding:2px 9px}.sky-theme-modern .sky-paging-btn{background-color:transparent;border:none;box-shadow:none;border-radius:6px;margin-right:10px;padding:3px 10px}.sky-theme-modern .sky-paging-btn:hover{background-color:transparent;border:solid 1px #1870B8;padding:2px 9px;z-index:1}.sky-theme-modern .sky-paging-btn:active,.sky-theme-modern .sky-paging-btn:focus{border:solid 2px #1870B8;color:#212327;padding:1px 8px}.sky-theme-modern .sky-paging-btn:focus:not(:active){outline:none;box-shadow:0 1px 3px #0000004d}.sky-theme-modern .sky-paging-current{background-color:var(--sky-background-color-item-selected);border:solid 1px #1870B8;padding:2px 9px}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-paging-btn:active,:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-paging-btn:focus{color:#fbfcfe}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-paging-current{background-color:#1870b8}.sky-theme-modern.sky-theme-mode-dark .sky-paging-btn:active,.sky-theme-modern.sky-theme-mode-dark .sky-paging-btn:focus{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark .sky-paging-current{background-color:#1870b8}\n"] }]
|
|
607
|
+
}], propDecorators: { currentPage: [{
|
|
608
|
+
type: Input
|
|
609
|
+
}], itemCount: [{
|
|
610
|
+
type: Input
|
|
611
|
+
}], maxPages: [{
|
|
612
|
+
type: Input
|
|
613
|
+
}], pageSize: [{
|
|
614
|
+
type: Input
|
|
615
|
+
}], pagingLabel: [{
|
|
616
|
+
type: Input
|
|
617
|
+
}], currentPageChange: [{
|
|
618
|
+
type: Output
|
|
619
|
+
}] } });
|
|
620
|
+
|
|
621
|
+
class SkyPagingModule {
|
|
622
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPagingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
623
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: SkyPagingModule, declarations: [SkyPagingComponent], imports: [CommonModule,
|
|
624
|
+
SkyIconModule,
|
|
625
|
+
SkyListsResourcesModule,
|
|
626
|
+
SkyThemeModule], exports: [SkyPagingComponent] }); }
|
|
627
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPagingModule, imports: [CommonModule,
|
|
628
|
+
SkyIconModule,
|
|
629
|
+
SkyListsResourcesModule,
|
|
630
|
+
SkyThemeModule] }); }
|
|
631
|
+
}
|
|
632
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPagingModule, decorators: [{
|
|
633
|
+
type: NgModule,
|
|
634
|
+
args: [{
|
|
635
|
+
declarations: [SkyPagingComponent],
|
|
636
|
+
imports: [
|
|
637
|
+
CommonModule,
|
|
638
|
+
SkyIconModule,
|
|
639
|
+
SkyListsResourcesModule,
|
|
640
|
+
SkyThemeModule,
|
|
641
|
+
],
|
|
642
|
+
exports: [SkyPagingComponent],
|
|
643
|
+
}]
|
|
644
|
+
}] });
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* Displays content text when the repeater is expanded.
|
|
648
|
+
*/
|
|
649
|
+
class SkyRepeaterItemContentComponent {
|
|
650
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
651
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyRepeaterItemContentComponent, selector: "sky-repeater-item-content", ngImport: i0, template: "<ng-content></ng-content>\n" }); }
|
|
652
|
+
}
|
|
653
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemContentComponent, decorators: [{
|
|
654
|
+
type: Component,
|
|
655
|
+
args: [{ selector: 'sky-repeater-item-content', template: "<ng-content></ng-content>\n" }]
|
|
656
|
+
}] });
|
|
657
|
+
|
|
658
|
+
/**
|
|
659
|
+
* Wraps and styles a
|
|
660
|
+
* [`skyux-dropdown` component](https://developer.blackbaud.com/skyux-popovers/docs/dropdown).
|
|
661
|
+
*/
|
|
662
|
+
/* istanbul ignore next */
|
|
663
|
+
/* Code coverage having problems with no statements in classes */
|
|
664
|
+
class SkyRepeaterItemContextMenuComponent {
|
|
665
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemContextMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
666
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyRepeaterItemContextMenuComponent, selector: "sky-repeater-item-context-menu", ngImport: i0, template: "<ng-content></ng-content>\n" }); }
|
|
667
|
+
}
|
|
668
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemContextMenuComponent, decorators: [{
|
|
669
|
+
type: Component,
|
|
670
|
+
args: [{ selector: 'sky-repeater-item-context-menu', template: "<ng-content></ng-content>\n" }]
|
|
671
|
+
}] });
|
|
672
|
+
|
|
673
|
+
/**
|
|
674
|
+
* Displays a header inside the repeater item.
|
|
675
|
+
*/
|
|
676
|
+
class SkyRepeaterItemTitleComponent {
|
|
677
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
678
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyRepeaterItemTitleComponent, selector: "sky-repeater-item-title", ngImport: i0, template: "<ng-content></ng-content>\n" }); }
|
|
679
|
+
}
|
|
680
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemTitleComponent, decorators: [{
|
|
681
|
+
type: Component,
|
|
682
|
+
args: [{ selector: 'sky-repeater-item-title', template: "<ng-content></ng-content>\n" }]
|
|
683
|
+
}] });
|
|
684
|
+
|
|
685
|
+
let uniqueId = 0;
|
|
686
|
+
const DEFAULT_EXPAND_MODE = 'none';
|
|
687
|
+
/**
|
|
688
|
+
* @internal
|
|
689
|
+
*/
|
|
690
|
+
class SkyRepeaterService {
|
|
691
|
+
constructor() {
|
|
692
|
+
this.activeItemChange = new BehaviorSubject(undefined);
|
|
693
|
+
this.activeItemIndexChange = new BehaviorSubject(undefined);
|
|
694
|
+
this.enableActiveState = false;
|
|
695
|
+
this.itemCollapseStateChange = new EventEmitter();
|
|
696
|
+
this.items = [];
|
|
697
|
+
this.itemRole = new BehaviorSubject({
|
|
698
|
+
content: undefined,
|
|
699
|
+
item: undefined,
|
|
700
|
+
title: undefined,
|
|
701
|
+
});
|
|
702
|
+
this.orderChange = new BehaviorSubject(undefined);
|
|
703
|
+
this.repeaterGroupId = ++uniqueId;
|
|
704
|
+
this.#_expandMode = DEFAULT_EXPAND_MODE;
|
|
705
|
+
}
|
|
706
|
+
// TODO: Remove 'string' as a valid type in a breaking change.
|
|
707
|
+
get expandMode() {
|
|
708
|
+
return this.#_expandMode;
|
|
709
|
+
}
|
|
710
|
+
set expandMode(value) {
|
|
711
|
+
this.#_expandMode = value ?? DEFAULT_EXPAND_MODE;
|
|
712
|
+
}
|
|
713
|
+
#_expandMode;
|
|
714
|
+
ngOnDestroy() {
|
|
715
|
+
this.activeItemChange.complete();
|
|
716
|
+
this.itemCollapseStateChange.complete();
|
|
717
|
+
this.orderChange.complete();
|
|
718
|
+
}
|
|
719
|
+
activateItem(item) {
|
|
720
|
+
if (this.enableActiveState) {
|
|
721
|
+
/* istanbul ignore else */
|
|
722
|
+
if (item && !item.disabled) {
|
|
723
|
+
const index = this.items.findIndex((i) => i === item);
|
|
724
|
+
this.activeItemIndexChange.next(index);
|
|
725
|
+
this.activeItemChange.next(item);
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
activateItemByIndex(index) {
|
|
730
|
+
/* istanbul ignore else */
|
|
731
|
+
if (this.enableActiveState) {
|
|
732
|
+
if (index === undefined) {
|
|
733
|
+
this.activeItemChange.next(undefined);
|
|
734
|
+
}
|
|
735
|
+
else {
|
|
736
|
+
const activeItem = this.items[index];
|
|
737
|
+
if (activeItem && !activeItem.disabled) {
|
|
738
|
+
this.activeItemChange.next(activeItem);
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
registerItem(item) {
|
|
744
|
+
this.items.push(item);
|
|
745
|
+
}
|
|
746
|
+
unregisterItem(item) {
|
|
747
|
+
const indexOfDestroyedItem = this.items.indexOf(item);
|
|
748
|
+
if (indexOfDestroyedItem > -1) {
|
|
749
|
+
this.items.splice(indexOfDestroyedItem, 1);
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
onItemCollapseStateChange(item) {
|
|
753
|
+
this.itemCollapseStateChange.emit(item);
|
|
754
|
+
}
|
|
755
|
+
registerOrderChange() {
|
|
756
|
+
this.orderChange.next();
|
|
757
|
+
}
|
|
758
|
+
reorderItem(oldIndex, newIndex) {
|
|
759
|
+
this.items.splice(newIndex, 0, this.items.splice(oldIndex, 1)[0]);
|
|
760
|
+
}
|
|
761
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
762
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterService }); }
|
|
763
|
+
}
|
|
764
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterService, decorators: [{
|
|
765
|
+
type: Injectable
|
|
766
|
+
}] });
|
|
767
|
+
|
|
768
|
+
/**
|
|
769
|
+
* @internal
|
|
770
|
+
*/
|
|
771
|
+
class SkyRepeaterAdapterService {
|
|
772
|
+
get #repeaterItemGroupSelector() {
|
|
773
|
+
return '.sky-repeater-item-group-' + this.#repeaterService.repeaterGroupId;
|
|
774
|
+
}
|
|
775
|
+
#host;
|
|
776
|
+
#repeaterService;
|
|
777
|
+
constructor(repeaterService) {
|
|
778
|
+
this.#repeaterService = repeaterService;
|
|
779
|
+
}
|
|
780
|
+
focusElement(element) {
|
|
781
|
+
if (element) {
|
|
782
|
+
if (element instanceof ElementRef) {
|
|
783
|
+
element.nativeElement.focus();
|
|
784
|
+
}
|
|
785
|
+
else {
|
|
786
|
+
element.focus();
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
setRepeaterHost(hostRef) {
|
|
791
|
+
this.#host = hostRef;
|
|
792
|
+
}
|
|
793
|
+
getRepeaterItemIndex(element) {
|
|
794
|
+
return this.#getRepeaterItemArray().indexOf(element);
|
|
795
|
+
}
|
|
796
|
+
moveItemUp(element, top = false, steps = 1) {
|
|
797
|
+
const index = this.getRepeaterItemIndex(element);
|
|
798
|
+
if (index === 0) {
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
801
|
+
let newIndex = index - steps;
|
|
802
|
+
if (top || newIndex < 0) {
|
|
803
|
+
newIndex = 0;
|
|
804
|
+
}
|
|
805
|
+
return this.#moveItem(element, index, newIndex);
|
|
806
|
+
}
|
|
807
|
+
moveItemDown(element, steps = 1) {
|
|
808
|
+
const itemArray = this.#getRepeaterItemArray();
|
|
809
|
+
const index = this.getRepeaterItemIndex(element);
|
|
810
|
+
if (index === itemArray.length - steps) {
|
|
811
|
+
return;
|
|
812
|
+
}
|
|
813
|
+
const newIndex = index + steps;
|
|
814
|
+
return this.#moveItem(element, index, newIndex);
|
|
815
|
+
}
|
|
816
|
+
#moveItem(element, oldIndex, newIndex) {
|
|
817
|
+
/* istanbul ignore else */
|
|
818
|
+
if (this.#host) {
|
|
819
|
+
const repeaterDiv = this.#host.nativeElement.querySelector('.sky-repeater');
|
|
820
|
+
repeaterDiv.removeChild(element);
|
|
821
|
+
const nextSibling = repeaterDiv.querySelectorAll(this.#repeaterItemGroupSelector)[newIndex];
|
|
822
|
+
repeaterDiv.insertBefore(element, nextSibling);
|
|
823
|
+
this.#repeaterService.reorderItem(oldIndex, newIndex);
|
|
824
|
+
}
|
|
825
|
+
return newIndex;
|
|
826
|
+
}
|
|
827
|
+
/**
|
|
828
|
+
* Returns an array of the immediate repeater item descendants. Excludes nested repeater items.
|
|
829
|
+
*/
|
|
830
|
+
#getRepeaterItemArray() {
|
|
831
|
+
return Array.from(this.#host?.nativeElement.querySelectorAll(this.#repeaterItemGroupSelector));
|
|
832
|
+
}
|
|
833
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterAdapterService, deps: [{ token: SkyRepeaterService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
834
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterAdapterService }); }
|
|
835
|
+
}
|
|
836
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterAdapterService, decorators: [{
|
|
837
|
+
type: Injectable
|
|
838
|
+
}], ctorParameters: function () { return [{ type: SkyRepeaterService }]; } });
|
|
839
|
+
|
|
840
|
+
let nextContentId = 0;
|
|
841
|
+
/**
|
|
842
|
+
* Creates an individual repeater item.
|
|
843
|
+
*/
|
|
844
|
+
class SkyRepeaterItemComponent {
|
|
845
|
+
/**
|
|
846
|
+
* Make the first, non-disabled item tab-focusable.
|
|
847
|
+
* - Disabled items should not be focusable per [W3C](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_disabled_controls).
|
|
848
|
+
* - One item per list/grid/listbox should be tab focusable per [W3C](https://www.w3.org/TR/wai-aria-practices-1.1/#grid).
|
|
849
|
+
*/
|
|
850
|
+
get tabindex() {
|
|
851
|
+
return this.#repeaterService.items.filter((item) => !item.disabled)[0] ===
|
|
852
|
+
this
|
|
853
|
+
? 0
|
|
854
|
+
: -1;
|
|
855
|
+
}
|
|
856
|
+
/**
|
|
857
|
+
* Whether to exclude an item when cycling through.
|
|
858
|
+
*/
|
|
859
|
+
set disabled(value) {
|
|
860
|
+
if (this.#_isDisabled !== value) {
|
|
861
|
+
if (value) {
|
|
862
|
+
this.isSelected = false;
|
|
863
|
+
this.#_isDisabled = true;
|
|
864
|
+
}
|
|
865
|
+
else {
|
|
866
|
+
this.#_isDisabled = false;
|
|
867
|
+
}
|
|
868
|
+
if (this.isActive) {
|
|
869
|
+
this.#repeaterService.activateItemByIndex(undefined);
|
|
870
|
+
}
|
|
871
|
+
if (this.#elementRef.nativeElement.matches(':focus-within')) {
|
|
872
|
+
this.#elementRef.nativeElement.ownerDocument.activeElement.blur();
|
|
873
|
+
}
|
|
874
|
+
this.#changeDetector.markForCheck();
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
get disabled() {
|
|
878
|
+
return this.#_isDisabled;
|
|
879
|
+
}
|
|
880
|
+
/**
|
|
881
|
+
* Whether the repeater item is expanded.
|
|
882
|
+
* @default true
|
|
883
|
+
*/
|
|
884
|
+
set isExpanded(value) {
|
|
885
|
+
this.updateForExpanded(value !== false, true);
|
|
886
|
+
}
|
|
887
|
+
get isExpanded() {
|
|
888
|
+
return this.#isExpanded;
|
|
889
|
+
}
|
|
890
|
+
/**
|
|
891
|
+
* Whether the repeater item's checkbox is selected.
|
|
892
|
+
* When users select the repeater item, the specified property on your model is updated accordingly.
|
|
893
|
+
* @default false
|
|
894
|
+
*/
|
|
895
|
+
set isSelected(value) {
|
|
896
|
+
if (!this.disabled && value !== this.#_isSelected) {
|
|
897
|
+
this.#_isSelected = value;
|
|
898
|
+
this.isSelectedChange.emit(this.#_isSelected);
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
get isSelected() {
|
|
902
|
+
return this.#_isSelected;
|
|
903
|
+
}
|
|
904
|
+
set isCollapsible(value) {
|
|
905
|
+
if (this.isCollapsible !== value) {
|
|
906
|
+
this.#_isCollapsible = value !== false;
|
|
907
|
+
/*istanbul ignore else */
|
|
908
|
+
if (!this.#_isCollapsible) {
|
|
909
|
+
this.updateForExpanded(true, true);
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
this.#changeDetector.markForCheck();
|
|
913
|
+
}
|
|
914
|
+
get isCollapsible() {
|
|
915
|
+
return this.#_isCollapsible;
|
|
916
|
+
}
|
|
917
|
+
get repeaterGroupClass() {
|
|
918
|
+
return 'sky-repeater-item-group-' + this.#repeaterService.repeaterGroupId;
|
|
919
|
+
}
|
|
920
|
+
#adapterService;
|
|
921
|
+
#changeDetector;
|
|
922
|
+
#elementRef;
|
|
923
|
+
#isExpanded;
|
|
924
|
+
#keyboardReorderingEnabled;
|
|
925
|
+
#ngUnsubscribe;
|
|
926
|
+
#reorderCancelText;
|
|
927
|
+
#reorderCurrentIndex;
|
|
928
|
+
#reorderFinishText;
|
|
929
|
+
#reorderInstructions;
|
|
930
|
+
#reorderMovedText;
|
|
931
|
+
#reorderStateDescription;
|
|
932
|
+
#reorderSteps;
|
|
933
|
+
#repeaterService;
|
|
934
|
+
#resourceService;
|
|
935
|
+
#_isCollapsible;
|
|
936
|
+
#_isDisabled;
|
|
937
|
+
#_isSelected;
|
|
938
|
+
constructor(repeaterService, changeDetector, adapterService, elementRef, resourceService) {
|
|
939
|
+
/**
|
|
940
|
+
* Whether users can change the order of the repeater item.
|
|
941
|
+
* The repeater component's `reorderable` property must also be set to `true`.
|
|
942
|
+
*/
|
|
943
|
+
this.reorderable = false;
|
|
944
|
+
/**
|
|
945
|
+
* Whether to display a checkbox in the left of the repeater item.
|
|
946
|
+
*/
|
|
947
|
+
this.selectable = false;
|
|
948
|
+
/**
|
|
949
|
+
* Whether to display an inline form within the repeater.
|
|
950
|
+
* Users can toggle between displaying and hiding the inline form.
|
|
951
|
+
*/
|
|
952
|
+
this.showInlineForm = false;
|
|
953
|
+
/**
|
|
954
|
+
* Fires when users collapse the repeater item.
|
|
955
|
+
*/
|
|
956
|
+
this.collapse = new EventEmitter();
|
|
957
|
+
/**
|
|
958
|
+
* Fires when users expand the repeater item.
|
|
959
|
+
*/
|
|
960
|
+
this.expand = new EventEmitter();
|
|
961
|
+
/**
|
|
962
|
+
* Fires when the repeater includes an inline form and users close it. This event emits
|
|
963
|
+
* [a `SkyInlineFormCloseArgs` type](https://developer.blackbaud.com/skyux/components/inline-form#skyinlineformcloseargs-properties).
|
|
964
|
+
*/
|
|
965
|
+
this.inlineFormClose = new EventEmitter();
|
|
966
|
+
/**
|
|
967
|
+
* Fires when users select or clear the checkbox for the repeater item.
|
|
968
|
+
*/
|
|
969
|
+
this.isSelectedChange = new EventEmitter();
|
|
970
|
+
this.hasItemContent = false;
|
|
971
|
+
this.isActive = false;
|
|
972
|
+
this.reorderButtonLabel = '';
|
|
973
|
+
this.animationDisabled = false;
|
|
974
|
+
this.#isExpanded = true;
|
|
975
|
+
this.#keyboardReorderingEnabled = false;
|
|
976
|
+
this.#ngUnsubscribe = new Subject();
|
|
977
|
+
this.#reorderCancelText = '';
|
|
978
|
+
this.#reorderCurrentIndex = -1;
|
|
979
|
+
this.#reorderFinishText = '';
|
|
980
|
+
this.#reorderInstructions = '';
|
|
981
|
+
this.#reorderMovedText = '';
|
|
982
|
+
this.#reorderStateDescription = '';
|
|
983
|
+
this.#reorderSteps = 0;
|
|
984
|
+
this.#_isCollapsible = true;
|
|
985
|
+
this.#_isDisabled = false;
|
|
986
|
+
this.#repeaterService = repeaterService;
|
|
987
|
+
this.#changeDetector = changeDetector;
|
|
988
|
+
this.#adapterService = adapterService;
|
|
989
|
+
this.#elementRef = elementRef;
|
|
990
|
+
this.#resourceService = resourceService;
|
|
991
|
+
this.#slideForExpanded(false);
|
|
992
|
+
forkJoin([
|
|
993
|
+
this.#resourceService.getString('skyux_repeater_item_reorder_cancel'),
|
|
994
|
+
this.#resourceService.getString('skyux_repeater_item_reorder_finish'),
|
|
995
|
+
this.#resourceService.getString('skyux_repeater_item_reorder_instructions'),
|
|
996
|
+
this.#resourceService.getString('skyux_repeater_item_reorder_operation'),
|
|
997
|
+
this.#resourceService.getString('skyux_repeater_item_reorder_moved'),
|
|
998
|
+
])
|
|
999
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
1000
|
+
.subscribe(([reorderCancelText, reorderFinishText, reorderInstructionsText, reorderOperationText, reorderMovedText,]) => {
|
|
1001
|
+
this.#reorderCancelText = reorderCancelText;
|
|
1002
|
+
this.#reorderFinishText = reorderFinishText;
|
|
1003
|
+
this.#reorderStateDescription = reorderInstructionsText;
|
|
1004
|
+
this.#reorderInstructions = reorderOperationText;
|
|
1005
|
+
this.#reorderMovedText = reorderMovedText;
|
|
1006
|
+
this.reorderButtonLabel = this.#reorderInstructions;
|
|
1007
|
+
});
|
|
1008
|
+
this.contentId = `sky-repeater-item-content-${++nextContentId}`;
|
|
1009
|
+
this.itemRole$ = this.#repeaterService.itemRole.asObservable();
|
|
1010
|
+
}
|
|
1011
|
+
ngOnInit() {
|
|
1012
|
+
this.#repeaterService.registerItem(this);
|
|
1013
|
+
this.#repeaterService.activeItemChange
|
|
1014
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
1015
|
+
.subscribe((item) => {
|
|
1016
|
+
const newIsActiveValue = this === item;
|
|
1017
|
+
if (newIsActiveValue !== this.isActive) {
|
|
1018
|
+
this.isActive = newIsActiveValue;
|
|
1019
|
+
this.#changeDetector.markForCheck();
|
|
1020
|
+
}
|
|
1021
|
+
});
|
|
1022
|
+
}
|
|
1023
|
+
ngAfterViewInit() {
|
|
1024
|
+
this.hasItemContent = !!this.repeaterItemContentComponents?.length;
|
|
1025
|
+
this.#updateExpandOnContentChange();
|
|
1026
|
+
}
|
|
1027
|
+
ngOnDestroy() {
|
|
1028
|
+
this.collapse.complete();
|
|
1029
|
+
this.expand.complete();
|
|
1030
|
+
this.inlineFormClose.complete();
|
|
1031
|
+
this.isSelectedChange.complete();
|
|
1032
|
+
this.#ngUnsubscribe.next();
|
|
1033
|
+
this.#ngUnsubscribe.complete();
|
|
1034
|
+
this.#repeaterService.unregisterItem(this);
|
|
1035
|
+
}
|
|
1036
|
+
onKeydown($event) {
|
|
1037
|
+
if ([' ', 'Enter', 'Home', 'End', 'ArrowUp', 'ArrowDown'].includes($event.key)) {
|
|
1038
|
+
if ($event.target.matches('input, textarea, select, option, [contenteditable], [contenteditable] *')) {
|
|
1039
|
+
return;
|
|
1040
|
+
}
|
|
1041
|
+
$event.preventDefault();
|
|
1042
|
+
$event.stopPropagation();
|
|
1043
|
+
let activateItem = undefined;
|
|
1044
|
+
/* istanbul ignore else */
|
|
1045
|
+
if ([' ', 'Enter'].includes($event.key)) {
|
|
1046
|
+
if (this.selectable) {
|
|
1047
|
+
this.isSelected = !this.isSelected;
|
|
1048
|
+
}
|
|
1049
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
1050
|
+
activateItem = this;
|
|
1051
|
+
}
|
|
1052
|
+
/* istanbul ignore else */
|
|
1053
|
+
if (['Home', 'End'].includes($event.key)) {
|
|
1054
|
+
const items = this.#repeaterService.items.filter((item) => !item.disabled);
|
|
1055
|
+
if ($event.key === 'Home') {
|
|
1056
|
+
activateItem = items.shift();
|
|
1057
|
+
}
|
|
1058
|
+
else {
|
|
1059
|
+
activateItem = items.pop();
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
/* istanbul ignore else */
|
|
1063
|
+
if (['ArrowUp', 'ArrowDown'].includes($event.key)) {
|
|
1064
|
+
const currentIndex = this.#repeaterService.items.findIndex((item) => item === this);
|
|
1065
|
+
let sliceFrom;
|
|
1066
|
+
let sliceTo;
|
|
1067
|
+
if ($event.key === 'ArrowUp') {
|
|
1068
|
+
sliceFrom = 0;
|
|
1069
|
+
sliceTo = currentIndex;
|
|
1070
|
+
}
|
|
1071
|
+
else {
|
|
1072
|
+
sliceFrom = currentIndex + 1;
|
|
1073
|
+
sliceTo = undefined;
|
|
1074
|
+
}
|
|
1075
|
+
const items = this.#repeaterService.items
|
|
1076
|
+
.slice(sliceFrom, sliceTo)
|
|
1077
|
+
.filter((item) => !item.disabled);
|
|
1078
|
+
activateItem = $event.key === 'ArrowUp' ? items.pop() : items.shift();
|
|
1079
|
+
if (!activateItem) {
|
|
1080
|
+
// Wrap around.
|
|
1081
|
+
if ($event.key === 'ArrowDown') {
|
|
1082
|
+
sliceFrom = 0;
|
|
1083
|
+
sliceTo = currentIndex;
|
|
1084
|
+
}
|
|
1085
|
+
else {
|
|
1086
|
+
sliceFrom = currentIndex + 1;
|
|
1087
|
+
sliceTo = undefined;
|
|
1088
|
+
}
|
|
1089
|
+
const items = this.#repeaterService.items
|
|
1090
|
+
.slice(sliceFrom, sliceTo)
|
|
1091
|
+
.filter((item) => !item.disabled);
|
|
1092
|
+
activateItem = $event.key === 'ArrowUp' ? items.pop() : items.shift();
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
/* istanbul ignore else */
|
|
1096
|
+
if (activateItem && !activateItem.isActive) {
|
|
1097
|
+
this.#repeaterService.activateItem(activateItem);
|
|
1098
|
+
if (!activateItem.#elementRef.nativeElement.matches(':focus-within')) {
|
|
1099
|
+
activateItem.itemRef?.nativeElement.focus();
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
headerClick() {
|
|
1105
|
+
if (this.isCollapsible) {
|
|
1106
|
+
this.updateForExpanded(!this.isExpanded, true);
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
1109
|
+
chevronDirectionChange(direction) {
|
|
1110
|
+
this.updateForExpanded(direction === 'up', true);
|
|
1111
|
+
}
|
|
1112
|
+
onRepeaterItemClick(event) {
|
|
1113
|
+
// Only activate item if clicking on the title, content, or parent item div.
|
|
1114
|
+
// This will avoid accidental activations when clicking inside interactive elements like
|
|
1115
|
+
// the expand/collapse chevron, dropdown, inline-delete, etc...
|
|
1116
|
+
if (event.target === this.itemRef?.nativeElement ||
|
|
1117
|
+
this.itemContentRef?.nativeElement.contains(event.target) ||
|
|
1118
|
+
this.itemHeaderRef?.nativeElement.contains(event.target)) {
|
|
1119
|
+
this.#repeaterService.activateItem(this);
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
updateForExpanded(value, animate) {
|
|
1123
|
+
if (this.isCollapsible === false && value === false) {
|
|
1124
|
+
console.warn(`Setting isExpanded to false when the repeater item is not collapsible
|
|
1125
|
+
will have no effect.`);
|
|
1126
|
+
}
|
|
1127
|
+
else if (this.#isExpanded !== value) {
|
|
1128
|
+
this.#isExpanded = value;
|
|
1129
|
+
if (this.#isExpanded) {
|
|
1130
|
+
this.expand.emit();
|
|
1131
|
+
}
|
|
1132
|
+
else {
|
|
1133
|
+
this.collapse.emit();
|
|
1134
|
+
}
|
|
1135
|
+
this.#repeaterService.onItemCollapseStateChange(this);
|
|
1136
|
+
this.#slideForExpanded(animate);
|
|
1137
|
+
this.#changeDetector.markForCheck();
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
onCheckboxChange(value) {
|
|
1141
|
+
this.isSelected = value.checked;
|
|
1142
|
+
}
|
|
1143
|
+
onInlineFormClose(inlineFormCloseArgs) {
|
|
1144
|
+
this.inlineFormClose.emit(inlineFormCloseArgs);
|
|
1145
|
+
}
|
|
1146
|
+
moveToTop(event) {
|
|
1147
|
+
event.stopPropagation();
|
|
1148
|
+
this.#adapterService.moveItemUp(this.#elementRef.nativeElement, true);
|
|
1149
|
+
this.#adapterService.focusElement(event.target);
|
|
1150
|
+
this.#repeaterService.registerOrderChange();
|
|
1151
|
+
}
|
|
1152
|
+
onReorderHandleKeyDown(event) {
|
|
1153
|
+
/*istanbul ignore else */
|
|
1154
|
+
if (event.key) {
|
|
1155
|
+
switch (event.key.toLowerCase()) {
|
|
1156
|
+
case ' ':
|
|
1157
|
+
case 'enter':
|
|
1158
|
+
this.#keyboardToggleReorder();
|
|
1159
|
+
event.preventDefault();
|
|
1160
|
+
event.stopPropagation();
|
|
1161
|
+
break;
|
|
1162
|
+
case 'escape':
|
|
1163
|
+
/* istanbul ignore else */
|
|
1164
|
+
if (this.#keyboardReorderingEnabled) {
|
|
1165
|
+
this.#keyboardReorderingEnabled = false;
|
|
1166
|
+
this.#revertReorderSteps();
|
|
1167
|
+
this.reorderButtonLabel =
|
|
1168
|
+
this.#reorderCancelText + ' ' + this.#reorderInstructions;
|
|
1169
|
+
this.#adapterService.focusElement(event.target);
|
|
1170
|
+
event.preventDefault();
|
|
1171
|
+
event.stopPropagation();
|
|
1172
|
+
}
|
|
1173
|
+
break;
|
|
1174
|
+
case 'arrowup':
|
|
1175
|
+
if (this.#keyboardReorderingEnabled) {
|
|
1176
|
+
this.#keyboardReorderUp();
|
|
1177
|
+
event.preventDefault();
|
|
1178
|
+
event.stopPropagation();
|
|
1179
|
+
this.#repeaterService.registerOrderChange();
|
|
1180
|
+
}
|
|
1181
|
+
break;
|
|
1182
|
+
case 'arrowdown':
|
|
1183
|
+
/* istanbul ignore else */
|
|
1184
|
+
if (this.#keyboardReorderingEnabled) {
|
|
1185
|
+
this.#keyboardReorderDown();
|
|
1186
|
+
event.preventDefault();
|
|
1187
|
+
event.stopPropagation();
|
|
1188
|
+
this.#repeaterService.registerOrderChange();
|
|
1189
|
+
}
|
|
1190
|
+
break;
|
|
1191
|
+
case 'arrowleft':
|
|
1192
|
+
case 'arrowright':
|
|
1193
|
+
/* istanbul ignore else */
|
|
1194
|
+
if (this.#keyboardReorderingEnabled) {
|
|
1195
|
+
event.preventDefault();
|
|
1196
|
+
event.stopPropagation();
|
|
1197
|
+
}
|
|
1198
|
+
break;
|
|
1199
|
+
/* istanbul ignore next */
|
|
1200
|
+
default:
|
|
1201
|
+
break;
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1205
|
+
onReorderHandleBlur(event) {
|
|
1206
|
+
this.#keyboardReorderingEnabled = false;
|
|
1207
|
+
this.#revertReorderSteps();
|
|
1208
|
+
this.reorderButtonLabel = this.#reorderInstructions;
|
|
1209
|
+
this.reorderState = undefined;
|
|
1210
|
+
}
|
|
1211
|
+
#slideForExpanded(animate) {
|
|
1212
|
+
this.animationDisabled = !animate;
|
|
1213
|
+
this.slideDirection = this.isExpanded ? 'down' : 'up';
|
|
1214
|
+
}
|
|
1215
|
+
#keyboardReorderUp() {
|
|
1216
|
+
const newIndex = this.#adapterService.moveItemUp(this.#elementRef.nativeElement);
|
|
1217
|
+
if (newIndex !== undefined) {
|
|
1218
|
+
this.#reorderCurrentIndex = newIndex;
|
|
1219
|
+
this.#reorderSteps--;
|
|
1220
|
+
this.#adapterService.focusElement(this.grabHandle);
|
|
1221
|
+
this.#keyboardReorderingEnabled = true;
|
|
1222
|
+
this.reorderButtonLabel = `${this.#reorderMovedText} ${this.#reorderCurrentIndex + 1}`;
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1225
|
+
#keyboardReorderDown() {
|
|
1226
|
+
const newIndex = this.#adapterService.moveItemDown(this.#elementRef.nativeElement);
|
|
1227
|
+
if (newIndex) {
|
|
1228
|
+
this.#reorderCurrentIndex = newIndex;
|
|
1229
|
+
this.#reorderSteps++;
|
|
1230
|
+
this.#adapterService.focusElement(this.grabHandle);
|
|
1231
|
+
this.#keyboardReorderingEnabled = true;
|
|
1232
|
+
this.reorderButtonLabel = `${this.#reorderMovedText} ${this.#reorderCurrentIndex + 1}`;
|
|
1233
|
+
}
|
|
1234
|
+
}
|
|
1235
|
+
#keyboardToggleReorder() {
|
|
1236
|
+
this.#keyboardReorderingEnabled = !this.#keyboardReorderingEnabled;
|
|
1237
|
+
this.#reorderSteps = 0;
|
|
1238
|
+
if (this.#keyboardReorderingEnabled) {
|
|
1239
|
+
this.reorderState = this.#reorderStateDescription;
|
|
1240
|
+
}
|
|
1241
|
+
else {
|
|
1242
|
+
// TODO: Needs improvement to be localized
|
|
1243
|
+
this.reorderState = `${this.#reorderFinishText} ${this.#reorderCurrentIndex + 1} ${this.#reorderInstructions}`;
|
|
1244
|
+
this.#reorderCurrentIndex = -1;
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
#revertReorderSteps() {
|
|
1248
|
+
if (this.#reorderSteps < 0) {
|
|
1249
|
+
this.#adapterService.moveItemDown(this.#elementRef.nativeElement, Math.abs(this.#reorderSteps));
|
|
1250
|
+
}
|
|
1251
|
+
else if (this.#reorderSteps > 0) {
|
|
1252
|
+
this.#adapterService.moveItemUp(this.#elementRef.nativeElement, false, this.#reorderSteps);
|
|
1253
|
+
}
|
|
1254
|
+
this.#repeaterService.registerOrderChange();
|
|
1255
|
+
}
|
|
1256
|
+
#updateExpandOnContentChange() {
|
|
1257
|
+
this.repeaterItemContentComponents?.changes
|
|
1258
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
1259
|
+
.subscribe(() => {
|
|
1260
|
+
this.hasItemContent = !!this.repeaterItemContentComponents?.length;
|
|
1261
|
+
/* istanbul ignore next */
|
|
1262
|
+
this.isCollapsible =
|
|
1263
|
+
this.hasItemContent && this.#repeaterService.expandMode !== 'none';
|
|
1264
|
+
/* istanbul ignore else */
|
|
1265
|
+
if (this.#repeaterService.expandMode === 'single') {
|
|
1266
|
+
this.#repeaterService.onItemCollapseStateChange(this);
|
|
1267
|
+
}
|
|
1268
|
+
});
|
|
1269
|
+
}
|
|
1270
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemComponent, deps: [{ token: SkyRepeaterService }, { token: i0.ChangeDetectorRef }, { token: SkyRepeaterAdapterService }, { token: i0.ElementRef }, { token: i3$1.SkyLibResourcesService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1271
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyRepeaterItemComponent, selector: "sky-repeater-item", inputs: { disabled: "disabled", itemName: "itemName", inlineFormConfig: "inlineFormConfig", inlineFormTemplate: "inlineFormTemplate", isExpanded: "isExpanded", isSelected: "isSelected", reorderable: "reorderable", selectable: "selectable", showInlineForm: "showInlineForm", tag: "tag" }, outputs: { collapse: "collapse", expand: "expand", inlineFormClose: "inlineFormClose", isSelectedChange: "isSelectedChange" }, host: { listeners: { "keydown": "onKeydown($event)" }, properties: { "class": "this.repeaterGroupClass" } }, queries: [{ propertyName: "contextMenu", first: true, predicate: SkyRepeaterItemContextMenuComponent, descendants: true, read: ElementRef }, { propertyName: "repeaterItemContentComponents", predicate: SkyRepeaterItemContentComponent }], viewQueries: [{ propertyName: "grabHandle", first: true, predicate: ["grabHandle"], descendants: true, read: ElementRef }, { propertyName: "itemContentRef", first: true, predicate: ["itemContentRef"], descendants: true, read: ElementRef }, { propertyName: "itemHeaderRef", first: true, predicate: ["itemHeaderRef"], descendants: true, read: ElementRef }, { propertyName: "itemRef", first: true, predicate: ["itemRef"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n class=\"sky-repeater-item sky-padding-even-default\"\n [attr.aria-label]=\"itemName\"\n [attr.aria-selected]=\"selectable ? !!isSelected : undefined\"\n [attr.role]=\"(itemRole$ | async)?.item\"\n [attr.tabIndex]=\"tabindex\"\n [ngClass]=\"{\n 'sky-repeater-item-active': isActive,\n 'sky-repeater-item-collapsible': isCollapsible,\n 'sky-repeater-item-selected': isSelected\n }\"\n (click)=\"onRepeaterItemClick($event)\"\n #itemRef\n>\n <div #inlineDelete>\n <ng-content select=\"sky-inline-delete\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"inlineFormTemplate\">\n <sky-inline-form\n [config]=\"inlineFormConfig\"\n [showForm]=\"showInlineForm\"\n [template]=\"inlineFormTemplate\"\n (close)=\"onInlineFormClose($event)\"\n >\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemLeft\"></ng-container>\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemRight\"></ng-container>\n </sky-inline-form>\n </ng-container>\n\n <ng-container *ngIf=\"!inlineFormTemplate\">\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemLeft\"></ng-container>\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemRight\"></ng-container>\n </ng-container>\n</div>\n\n<ng-template #skyRepeaterItemLeft>\n <div\n [attr.role]=\"!showInlineForm ? (itemRole$ | async)?.content : undefined\"\n class=\"sky-repeater-item-left\"\n >\n <ng-container *ngIf=\"reorderable\">\n <span\n aria-live=\"assertive\"\n class=\"sky-screen-reader-only\"\n [id]=\"contentId + '-reorder-state'\"\n >\n {{ reorderState }}\n </span>\n <span\n class=\"sky-screen-reader-only\"\n [id]=\"contentId + '-reorder-instructions'\"\n >{{ reorderButtonLabel }}</span\n >\n <button\n class=\"sky-btn sky-tile-tools-control sky-repeater-item-grab-handle\"\n type=\"button\"\n [attr.aria-describedby]=\"contentId + '-reorder-instructions'\"\n [attr.aria-label]=\"\n itemName\n ? ('skyux_repeater_item_reorder_label' | skyLibResources : itemName)\n : ('skyux_repeater_item_reorder_label_default' | skyLibResources)\n \"\n (blur)=\"onReorderHandleBlur($event)\"\n (keydown)=\"onReorderHandleKeyDown($event)\"\n #grabHandle\n >\n <sky-icon icon=\"arrows-v\"></sky-icon>\n </button>\n </ng-container>\n <sky-checkbox\n *ngIf=\"selectable\"\n class=\"sky-repeater-item-checkbox\"\n [checked]=\"isSelected\"\n [label]=\"\n itemName\n ? ('skyux_repeater_item_checkbox_label' | skyLibResources : itemName)\n : ('skyux_repeater_item_checkbox_label_default' | skyLibResources)\n \"\n (change)=\"onCheckboxChange($event)\"\n >\n </sky-checkbox>\n <div\n class=\"sky-repeater-item-context-menu\"\n [hidden]=\"contextMenuEl.children.length === 0\"\n #contextMenuEl\n >\n <ng-content select=\"sky-repeater-item-context-menu\"></ng-content>\n </div>\n </div>\n</ng-template>\n\n<ng-template #skyRepeaterItemRight>\n <div class=\"sky-repeater-item-right\" #itemHeaderRef>\n <div\n class=\"sky-repeater-item-header\"\n [attr.role]=\"(itemRole$ | async)?.title\"\n [hidden]=\"titleRef.children.length === 0\"\n (click)=\"headerClick()\"\n >\n <div class=\"sky-repeater-item-title sky-font-emphasized\" #titleRef>\n <ng-content select=\"sky-repeater-item-title\"></ng-content>\n </div>\n <button\n *ngIf=\"reorderable\"\n class=\"sky-btn sky-btn-link sky-repeater-item-reorder-top\"\n type=\"button\"\n [attr.aria-label]=\"\n itemName\n ? ('skyux_repeater_item_reorder_top_label'\n | skyLibResources : itemName)\n : ('skyux_repeater_item_reorder_top_label_default'\n | skyLibResources)\n \"\n (click)=\"moveToTop($event)\"\n >\n <sky-icon icon=\"arrow-circle-up\"></sky-icon>\n {{ 'skyux_repeater_item_reorder_top' | skyLibResources }}\n </button>\n <div *ngIf=\"isCollapsible\" class=\"sky-repeater-item-chevron\">\n <sky-chevron\n [ariaControls]=\"contentId\"\n [ariaLabel]=\"\n itemName\n ? isExpanded\n ? ('skyux_repeater_item_expand' | skyLibResources : itemName)\n : ('skyux_repeater_item_collapse' | skyLibResources : itemName)\n : isExpanded\n ? ('skyux_repeater_item_expand_default' | skyLibResources)\n : ('skyux_repeater_item_collapse_default' | skyLibResources)\n \"\n [direction]=\"isExpanded ? 'up' : 'down'\"\n (directionChange)=\"chevronDirectionChange($event)\"\n >\n </sky-chevron>\n </div>\n <!-- Used for when the chevron is hidden to ensure that the right side is the same height as the left.-->\n <div\n *ngIf=\"!isCollapsible && !contextMenu\"\n class=\"sky-repeater-item-chevron-placeholder\"\n ></div>\n <!-- Used to ensure that the right side is the same height as the left.-->\n <div\n *ngIf=\"contextMenu\"\n class=\"sky-repeater-item-chevron-placeholder-with-context\"\n ></div>\n </div>\n <div\n class=\"sky-repeater-item-content\"\n [id]=\"contentId\"\n [@.disabled]=\"animationDisabled\"\n [@skyAnimationSlide]=\"slideDirection\"\n #itemContentRef\n [attr.role]=\"(itemRole$ | async)?.content\"\n >\n <ng-content select=\"sky-repeater-item-content\"></ng-content>\n </div>\n </div>\n</ng-template>\n", styles: ["sky-repeater-item .sky-repeater-item{display:flex;border-bottom:1px dotted #cdcfd2;padding-top:0;position:relative;transition:box-shadow .15s;align-items:flex-start}sky-repeater-item .sky-repeater-item sky-inline-form{display:block;width:100%}sky-repeater-item .sky-repeater-item sky-inline-form>:first-child,sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-first,sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-last{display:flex;align-items:flex-start;flex:1 0 auto;width:100%}sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-last{padding-top:10px}sky-repeater-item .sky-repeater-item.sky-repeater-item-active{background-color:#eeeeef;color:#212327;padding-left:6px;border-left:4px solid #00b4f1}sky-repeater-item .sky-repeater-item.sky-repeater-item-active .sky-inline-delete{margin-left:-4px;width:calc(100% + 4px)}sky-repeater-item .sky-repeater-item-left{display:flex;padding-top:10px;align-items:center}sky-repeater-item .sky-repeater-item-left sky-checkbox{display:flex}sky-repeater-item .sky-repeater-item-right{max-width:100%;flex-grow:1;align-self:center}sky-repeater-item .sky-repeater-item-header{align-items:center;display:flex;padding-top:10px}sky-repeater-item .sky-repeater-item-chevron{margin-left:10px}sky-repeater-item .sky-repeater-item-chevron-placeholder{height:24px}sky-repeater-item .sky-repeater-item-chevron-placeholder-with-context{height:29px}sky-repeater-item .sky-repeater-item-context-menu{padding:0 10px 0 0}sky-repeater-item .sky-repeater-item-checkbox{padding:0 5px 0 0}sky-repeater-item .sky-repeater-item-selected{background-color:#f1eef6;transition:background-color .15s}sky-repeater-item .sky-repeater-item-title{margin:0;flex-grow:1;line-height:1.1;color:#212327}sky-repeater-item sky-repeater-item-content{display:block;margin:10px 0 0}sky-repeater-item .sky-repeater-item-collapsible .sky-repeater-item-header{cursor:pointer}sky-repeater-item .sky-repeater-item-collapsible .sky-repeater-item-content{padding-right:34px}sky-repeater-item .sky-repeater-item-collapsed .sky-repeater-item-content{display:none}sky-repeater-item .sky-repeater-item-grab-handle{color:#cdcfd2;cursor:pointer;border:0;width:24px;height:24px;cursor:grab;cursor:-moz-grab;padding:0;margin:5px 10px 5px 0}sky-repeater-item .sky-repeater-item-grab-handle:hover{color:#979ba2;transition:color .15s}sky-repeater-item.sky-repeater-item-dragging.gu-mirror{opacity:initial;-ms-filter:initial;filter:initial;background-color:#fff;box-shadow:0 0 5px #0000004d}sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item{background-color:#d8d8d8}sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item .sky-repeater-item-left,sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item .sky-repeater-item-right{visibility:hidden}sky-repeater-item.sky-repeater-item-dragging .sky-repeater-item-grab-handle{cursor:grabbing;cursor:-webkit-grabbing}.sky-theme-modern sky-repeater-item .sky-repeater-item{padding-bottom:20px}.sky-theme-modern sky-repeater-item .sky-repeater-item.sky-repeater-item-active{background-color:transparent;border-left-color:#1870b8}.sky-theme-modern sky-repeater-item .sky-repeater-item:focus,.sky-theme-modern sky-repeater-item .sky-repeater-item:active:focus{outline:solid 2px #1870B8;outline-offset:-2px}.sky-theme-modern sky-repeater-item .sky-repeater-item:focus:not(:active){box-shadow:0 1px 8px #0000004d}.sky-theme-modern sky-repeater-item .sky-repeater-item-header[hidden]+.sky-repeater-item-content sky-repeater-item-content{margin:20px 0 0}.sky-theme-modern sky-repeater-item .sky-repeater-item-header,.sky-theme-modern sky-repeater-item .sky-repeater-item-left{padding-top:20px}.sky-theme-modern sky-repeater-item sky-inline-form .sky-slide-dissolve-last{padding-top:20px}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item{border-bottom-color:#686c73}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item.sky-repeater-item-active{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item-title{color:#fbfcfe}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.λ2, selector: "sky-chevron", inputs: ["ariaControls", "ariaLabel", "direction", "disabled"], outputs: ["directionChange"] }, { kind: "component", type: i6.λ3, selector: "sky-checkbox", inputs: ["label", "labelledBy", "id", "disabled", "tabindex", "name", "icon", "checkboxType", "checked", "indeterminate", "required"], outputs: ["change", "checkedChange", "disabledChange", "indeterminateChange"] }, { kind: "component", type: i2.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "component", type: i7.λ1, selector: "sky-inline-form", inputs: ["config", "template", "showForm"], outputs: ["close"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], animations: [skyAnimationSlide], encapsulation: i0.ViewEncapsulation.None }); }
|
|
1272
|
+
}
|
|
1273
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemComponent, decorators: [{
|
|
1274
|
+
type: Component,
|
|
1275
|
+
args: [{ selector: 'sky-repeater-item', animations: [skyAnimationSlide], encapsulation: ViewEncapsulation.None, template: "<div\n class=\"sky-repeater-item sky-padding-even-default\"\n [attr.aria-label]=\"itemName\"\n [attr.aria-selected]=\"selectable ? !!isSelected : undefined\"\n [attr.role]=\"(itemRole$ | async)?.item\"\n [attr.tabIndex]=\"tabindex\"\n [ngClass]=\"{\n 'sky-repeater-item-active': isActive,\n 'sky-repeater-item-collapsible': isCollapsible,\n 'sky-repeater-item-selected': isSelected\n }\"\n (click)=\"onRepeaterItemClick($event)\"\n #itemRef\n>\n <div #inlineDelete>\n <ng-content select=\"sky-inline-delete\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"inlineFormTemplate\">\n <sky-inline-form\n [config]=\"inlineFormConfig\"\n [showForm]=\"showInlineForm\"\n [template]=\"inlineFormTemplate\"\n (close)=\"onInlineFormClose($event)\"\n >\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemLeft\"></ng-container>\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemRight\"></ng-container>\n </sky-inline-form>\n </ng-container>\n\n <ng-container *ngIf=\"!inlineFormTemplate\">\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemLeft\"></ng-container>\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemRight\"></ng-container>\n </ng-container>\n</div>\n\n<ng-template #skyRepeaterItemLeft>\n <div\n [attr.role]=\"!showInlineForm ? (itemRole$ | async)?.content : undefined\"\n class=\"sky-repeater-item-left\"\n >\n <ng-container *ngIf=\"reorderable\">\n <span\n aria-live=\"assertive\"\n class=\"sky-screen-reader-only\"\n [id]=\"contentId + '-reorder-state'\"\n >\n {{ reorderState }}\n </span>\n <span\n class=\"sky-screen-reader-only\"\n [id]=\"contentId + '-reorder-instructions'\"\n >{{ reorderButtonLabel }}</span\n >\n <button\n class=\"sky-btn sky-tile-tools-control sky-repeater-item-grab-handle\"\n type=\"button\"\n [attr.aria-describedby]=\"contentId + '-reorder-instructions'\"\n [attr.aria-label]=\"\n itemName\n ? ('skyux_repeater_item_reorder_label' | skyLibResources : itemName)\n : ('skyux_repeater_item_reorder_label_default' | skyLibResources)\n \"\n (blur)=\"onReorderHandleBlur($event)\"\n (keydown)=\"onReorderHandleKeyDown($event)\"\n #grabHandle\n >\n <sky-icon icon=\"arrows-v\"></sky-icon>\n </button>\n </ng-container>\n <sky-checkbox\n *ngIf=\"selectable\"\n class=\"sky-repeater-item-checkbox\"\n [checked]=\"isSelected\"\n [label]=\"\n itemName\n ? ('skyux_repeater_item_checkbox_label' | skyLibResources : itemName)\n : ('skyux_repeater_item_checkbox_label_default' | skyLibResources)\n \"\n (change)=\"onCheckboxChange($event)\"\n >\n </sky-checkbox>\n <div\n class=\"sky-repeater-item-context-menu\"\n [hidden]=\"contextMenuEl.children.length === 0\"\n #contextMenuEl\n >\n <ng-content select=\"sky-repeater-item-context-menu\"></ng-content>\n </div>\n </div>\n</ng-template>\n\n<ng-template #skyRepeaterItemRight>\n <div class=\"sky-repeater-item-right\" #itemHeaderRef>\n <div\n class=\"sky-repeater-item-header\"\n [attr.role]=\"(itemRole$ | async)?.title\"\n [hidden]=\"titleRef.children.length === 0\"\n (click)=\"headerClick()\"\n >\n <div class=\"sky-repeater-item-title sky-font-emphasized\" #titleRef>\n <ng-content select=\"sky-repeater-item-title\"></ng-content>\n </div>\n <button\n *ngIf=\"reorderable\"\n class=\"sky-btn sky-btn-link sky-repeater-item-reorder-top\"\n type=\"button\"\n [attr.aria-label]=\"\n itemName\n ? ('skyux_repeater_item_reorder_top_label'\n | skyLibResources : itemName)\n : ('skyux_repeater_item_reorder_top_label_default'\n | skyLibResources)\n \"\n (click)=\"moveToTop($event)\"\n >\n <sky-icon icon=\"arrow-circle-up\"></sky-icon>\n {{ 'skyux_repeater_item_reorder_top' | skyLibResources }}\n </button>\n <div *ngIf=\"isCollapsible\" class=\"sky-repeater-item-chevron\">\n <sky-chevron\n [ariaControls]=\"contentId\"\n [ariaLabel]=\"\n itemName\n ? isExpanded\n ? ('skyux_repeater_item_expand' | skyLibResources : itemName)\n : ('skyux_repeater_item_collapse' | skyLibResources : itemName)\n : isExpanded\n ? ('skyux_repeater_item_expand_default' | skyLibResources)\n : ('skyux_repeater_item_collapse_default' | skyLibResources)\n \"\n [direction]=\"isExpanded ? 'up' : 'down'\"\n (directionChange)=\"chevronDirectionChange($event)\"\n >\n </sky-chevron>\n </div>\n <!-- Used for when the chevron is hidden to ensure that the right side is the same height as the left.-->\n <div\n *ngIf=\"!isCollapsible && !contextMenu\"\n class=\"sky-repeater-item-chevron-placeholder\"\n ></div>\n <!-- Used to ensure that the right side is the same height as the left.-->\n <div\n *ngIf=\"contextMenu\"\n class=\"sky-repeater-item-chevron-placeholder-with-context\"\n ></div>\n </div>\n <div\n class=\"sky-repeater-item-content\"\n [id]=\"contentId\"\n [@.disabled]=\"animationDisabled\"\n [@skyAnimationSlide]=\"slideDirection\"\n #itemContentRef\n [attr.role]=\"(itemRole$ | async)?.content\"\n >\n <ng-content select=\"sky-repeater-item-content\"></ng-content>\n </div>\n </div>\n</ng-template>\n", styles: ["sky-repeater-item .sky-repeater-item{display:flex;border-bottom:1px dotted #cdcfd2;padding-top:0;position:relative;transition:box-shadow .15s;align-items:flex-start}sky-repeater-item .sky-repeater-item sky-inline-form{display:block;width:100%}sky-repeater-item .sky-repeater-item sky-inline-form>:first-child,sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-first,sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-last{display:flex;align-items:flex-start;flex:1 0 auto;width:100%}sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-last{padding-top:10px}sky-repeater-item .sky-repeater-item.sky-repeater-item-active{background-color:#eeeeef;color:#212327;padding-left:6px;border-left:4px solid #00b4f1}sky-repeater-item .sky-repeater-item.sky-repeater-item-active .sky-inline-delete{margin-left:-4px;width:calc(100% + 4px)}sky-repeater-item .sky-repeater-item-left{display:flex;padding-top:10px;align-items:center}sky-repeater-item .sky-repeater-item-left sky-checkbox{display:flex}sky-repeater-item .sky-repeater-item-right{max-width:100%;flex-grow:1;align-self:center}sky-repeater-item .sky-repeater-item-header{align-items:center;display:flex;padding-top:10px}sky-repeater-item .sky-repeater-item-chevron{margin-left:10px}sky-repeater-item .sky-repeater-item-chevron-placeholder{height:24px}sky-repeater-item .sky-repeater-item-chevron-placeholder-with-context{height:29px}sky-repeater-item .sky-repeater-item-context-menu{padding:0 10px 0 0}sky-repeater-item .sky-repeater-item-checkbox{padding:0 5px 0 0}sky-repeater-item .sky-repeater-item-selected{background-color:#f1eef6;transition:background-color .15s}sky-repeater-item .sky-repeater-item-title{margin:0;flex-grow:1;line-height:1.1;color:#212327}sky-repeater-item sky-repeater-item-content{display:block;margin:10px 0 0}sky-repeater-item .sky-repeater-item-collapsible .sky-repeater-item-header{cursor:pointer}sky-repeater-item .sky-repeater-item-collapsible .sky-repeater-item-content{padding-right:34px}sky-repeater-item .sky-repeater-item-collapsed .sky-repeater-item-content{display:none}sky-repeater-item .sky-repeater-item-grab-handle{color:#cdcfd2;cursor:pointer;border:0;width:24px;height:24px;cursor:grab;cursor:-moz-grab;padding:0;margin:5px 10px 5px 0}sky-repeater-item .sky-repeater-item-grab-handle:hover{color:#979ba2;transition:color .15s}sky-repeater-item.sky-repeater-item-dragging.gu-mirror{opacity:initial;-ms-filter:initial;filter:initial;background-color:#fff;box-shadow:0 0 5px #0000004d}sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item{background-color:#d8d8d8}sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item .sky-repeater-item-left,sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item .sky-repeater-item-right{visibility:hidden}sky-repeater-item.sky-repeater-item-dragging .sky-repeater-item-grab-handle{cursor:grabbing;cursor:-webkit-grabbing}.sky-theme-modern sky-repeater-item .sky-repeater-item{padding-bottom:20px}.sky-theme-modern sky-repeater-item .sky-repeater-item.sky-repeater-item-active{background-color:transparent;border-left-color:#1870b8}.sky-theme-modern sky-repeater-item .sky-repeater-item:focus,.sky-theme-modern sky-repeater-item .sky-repeater-item:active:focus{outline:solid 2px #1870B8;outline-offset:-2px}.sky-theme-modern sky-repeater-item .sky-repeater-item:focus:not(:active){box-shadow:0 1px 8px #0000004d}.sky-theme-modern sky-repeater-item .sky-repeater-item-header[hidden]+.sky-repeater-item-content sky-repeater-item-content{margin:20px 0 0}.sky-theme-modern sky-repeater-item .sky-repeater-item-header,.sky-theme-modern sky-repeater-item .sky-repeater-item-left{padding-top:20px}.sky-theme-modern sky-repeater-item sky-inline-form .sky-slide-dissolve-last{padding-top:20px}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item{border-bottom-color:#686c73}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item.sky-repeater-item-active{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item-title{color:#fbfcfe}\n"] }]
|
|
1276
|
+
}], ctorParameters: function () { return [{ type: SkyRepeaterService }, { type: i0.ChangeDetectorRef }, { type: SkyRepeaterAdapterService }, { type: i0.ElementRef }, { type: i3$1.SkyLibResourcesService }]; }, propDecorators: { disabled: [{
|
|
1277
|
+
type: Input
|
|
1278
|
+
}], itemName: [{
|
|
1279
|
+
type: Input
|
|
1280
|
+
}], inlineFormConfig: [{
|
|
1281
|
+
type: Input
|
|
1282
|
+
}], inlineFormTemplate: [{
|
|
1283
|
+
type: Input
|
|
1284
|
+
}], isExpanded: [{
|
|
1285
|
+
type: Input
|
|
1286
|
+
}], isSelected: [{
|
|
1287
|
+
type: Input
|
|
1288
|
+
}], reorderable: [{
|
|
1289
|
+
type: Input
|
|
1290
|
+
}], selectable: [{
|
|
1291
|
+
type: Input
|
|
1292
|
+
}], showInlineForm: [{
|
|
1293
|
+
type: Input
|
|
1294
|
+
}], tag: [{
|
|
1295
|
+
type: Input
|
|
1296
|
+
}], collapse: [{
|
|
1297
|
+
type: Output
|
|
1298
|
+
}], expand: [{
|
|
1299
|
+
type: Output
|
|
1300
|
+
}], inlineFormClose: [{
|
|
1301
|
+
type: Output
|
|
1302
|
+
}], isSelectedChange: [{
|
|
1303
|
+
type: Output
|
|
1304
|
+
}], contextMenu: [{
|
|
1305
|
+
type: ContentChild,
|
|
1306
|
+
args: [SkyRepeaterItemContextMenuComponent, { read: ElementRef }]
|
|
1307
|
+
}], repeaterGroupClass: [{
|
|
1308
|
+
type: HostBinding,
|
|
1309
|
+
args: ['class']
|
|
1310
|
+
}], grabHandle: [{
|
|
1311
|
+
type: ViewChild,
|
|
1312
|
+
args: ['grabHandle', { read: ElementRef }]
|
|
1313
|
+
}], itemContentRef: [{
|
|
1314
|
+
type: ViewChild,
|
|
1315
|
+
args: ['itemContentRef', { read: ElementRef }]
|
|
1316
|
+
}], itemHeaderRef: [{
|
|
1317
|
+
type: ViewChild,
|
|
1318
|
+
args: ['itemHeaderRef', { read: ElementRef }]
|
|
1319
|
+
}], itemRef: [{
|
|
1320
|
+
type: ViewChild,
|
|
1321
|
+
args: ['itemRef', { read: ElementRef }]
|
|
1322
|
+
}], repeaterItemContentComponents: [{
|
|
1323
|
+
type: ContentChildren,
|
|
1324
|
+
args: [SkyRepeaterItemContentComponent]
|
|
1325
|
+
}], onKeydown: [{
|
|
1326
|
+
type: HostListener,
|
|
1327
|
+
args: ['keydown', ['$event']]
|
|
1328
|
+
}] } });
|
|
1329
|
+
|
|
1330
|
+
/**
|
|
1331
|
+
* @internal
|
|
1332
|
+
*/
|
|
1333
|
+
class SkyRepeaterAutoScrollService {
|
|
1334
|
+
autoScroll(elements, options) {
|
|
1335
|
+
return autoScroll(elements, options);
|
|
1336
|
+
}
|
|
1337
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterAutoScrollService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1338
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterAutoScrollService }); }
|
|
1339
|
+
}
|
|
1340
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterAutoScrollService, decorators: [{
|
|
1341
|
+
type: Injectable
|
|
1342
|
+
}] });
|
|
1343
|
+
|
|
1344
|
+
/**
|
|
1345
|
+
* Creates a container to display repeater items.
|
|
1346
|
+
*/
|
|
1347
|
+
class SkyRepeaterComponent {
|
|
1348
|
+
/**
|
|
1349
|
+
* The layout that determines which repeater items are expanded by default and whether
|
|
1350
|
+
* repeater items are expandable and collapsible. Collapsed items display titles only.
|
|
1351
|
+
* The valid options are `multiple`, `none`, and `single`.
|
|
1352
|
+
* - `multiple` loads repeater items in an expanded state unless `isExpanded` is set to
|
|
1353
|
+
* `false` for a repeater item. This layout allows users to expand and collapse
|
|
1354
|
+
* as many repeater items as necessary. It is best-suited to repeater items where body
|
|
1355
|
+
* content is important but users don't always need to see it.
|
|
1356
|
+
* - `none` loads all repeater items in an expanded state and does not allow users to
|
|
1357
|
+
* collapse them. This default layout provides the quickest access to the details in the
|
|
1358
|
+
* repeater items. It is best-suited to repeater items with concise content
|
|
1359
|
+
* that users need to view frequently.
|
|
1360
|
+
* - `single` loads one repeater item in an expanded state and collapses all others.
|
|
1361
|
+
* The expanded repeater item is the first one where `isExpanded` is set to `true`. This layout
|
|
1362
|
+
* allows users to expand one item at a time. It provides the most compact view and is
|
|
1363
|
+
* best-suited to repeater items where the most important information is in the titles
|
|
1364
|
+
* and users only occasionally need to view the body content.
|
|
1365
|
+
* @default "none"
|
|
1366
|
+
*/
|
|
1367
|
+
set expandMode(value) {
|
|
1368
|
+
this.#repeaterService.expandMode = value;
|
|
1369
|
+
this.#updateForExpandMode();
|
|
1370
|
+
}
|
|
1371
|
+
get expandMode() {
|
|
1372
|
+
return this.#repeaterService.expandMode;
|
|
1373
|
+
}
|
|
1374
|
+
#autoScroller;
|
|
1375
|
+
#ngUnsubscribe;
|
|
1376
|
+
#itemNameWarned;
|
|
1377
|
+
#adapterService;
|
|
1378
|
+
#changeDetector;
|
|
1379
|
+
#dragulaService;
|
|
1380
|
+
#elementRef;
|
|
1381
|
+
#renderer;
|
|
1382
|
+
#repeaterService;
|
|
1383
|
+
#autoScrollSvc;
|
|
1384
|
+
#scrollableHostSvc;
|
|
1385
|
+
#logSvc;
|
|
1386
|
+
constructor() {
|
|
1387
|
+
/**
|
|
1388
|
+
* Whether users can change the order of items in the repeater list.
|
|
1389
|
+
* Each repeater item also has `reorderable` property to indicate whether
|
|
1390
|
+
* users can change its order.
|
|
1391
|
+
*/
|
|
1392
|
+
this.reorderable = false;
|
|
1393
|
+
/**
|
|
1394
|
+
* Fires when the active repeater item changes.
|
|
1395
|
+
*/
|
|
1396
|
+
this.activeIndexChange = new EventEmitter();
|
|
1397
|
+
/**
|
|
1398
|
+
* Fires when users change the order of repeater items.
|
|
1399
|
+
* This event emits an ordered array of the `tag` properties that the consumer provides for each repeater item.
|
|
1400
|
+
*/
|
|
1401
|
+
this.orderChange = new EventEmitter();
|
|
1402
|
+
this.#ngUnsubscribe = new Subject();
|
|
1403
|
+
this.#itemNameWarned = false;
|
|
1404
|
+
this.#adapterService = inject(SkyRepeaterAdapterService);
|
|
1405
|
+
this.#changeDetector = inject(ChangeDetectorRef);
|
|
1406
|
+
this.#dragulaService = inject(DragulaService);
|
|
1407
|
+
this.#elementRef = inject(ElementRef);
|
|
1408
|
+
this.#renderer = inject(Renderer2);
|
|
1409
|
+
this.#repeaterService = inject(SkyRepeaterService);
|
|
1410
|
+
this.#autoScrollSvc = inject(SkyRepeaterAutoScrollService);
|
|
1411
|
+
this.#scrollableHostSvc = inject(SkyScrollableHostService);
|
|
1412
|
+
this.#logSvc = inject(SkyLogService);
|
|
1413
|
+
this.dragulaGroupName = `sky-repeater-dragula-${this.#repeaterService.repeaterGroupId}`;
|
|
1414
|
+
this.#repeaterService.itemCollapseStateChange
|
|
1415
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
1416
|
+
.subscribe((item) => {
|
|
1417
|
+
if (this.expandMode === 'single' && item.isExpanded) {
|
|
1418
|
+
this.items?.forEach((otherItem) => {
|
|
1419
|
+
if (otherItem !== item &&
|
|
1420
|
+
otherItem.isExpanded &&
|
|
1421
|
+
otherItem.isCollapsible) {
|
|
1422
|
+
otherItem.isExpanded = false;
|
|
1423
|
+
}
|
|
1424
|
+
});
|
|
1425
|
+
}
|
|
1426
|
+
});
|
|
1427
|
+
this.#repeaterService.activeItemIndexChange
|
|
1428
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
1429
|
+
.subscribe((index) => {
|
|
1430
|
+
if (index !== this.activeIndex) {
|
|
1431
|
+
this.activeIndex = index;
|
|
1432
|
+
this.activeIndexChange.emit(index);
|
|
1433
|
+
}
|
|
1434
|
+
});
|
|
1435
|
+
this.#repeaterService.orderChange
|
|
1436
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
1437
|
+
.subscribe(() => {
|
|
1438
|
+
this.#emitTags();
|
|
1439
|
+
});
|
|
1440
|
+
this.#updateForExpandMode();
|
|
1441
|
+
this.#adapterService.setRepeaterHost(this.#elementRef);
|
|
1442
|
+
this.#initializeDragAndDrop();
|
|
1443
|
+
}
|
|
1444
|
+
ngAfterContentInit() {
|
|
1445
|
+
// If activeIndex has been set on init, call service to activate the appropriate item.
|
|
1446
|
+
setTimeout(() => {
|
|
1447
|
+
if (this.activeIndex || this.activeIndex === 0) {
|
|
1448
|
+
this.#repeaterService.activateItemByIndex(this.activeIndex);
|
|
1449
|
+
}
|
|
1450
|
+
this.#validateTags();
|
|
1451
|
+
});
|
|
1452
|
+
// HACK: Not updating for expand mode in a timeout causes an error.
|
|
1453
|
+
// https://github.com/angular/angular/issues/6005
|
|
1454
|
+
this.items?.changes.pipe(takeUntil(this.#ngUnsubscribe)).subscribe(() => {
|
|
1455
|
+
setTimeout(() => {
|
|
1456
|
+
if (this.items?.length) {
|
|
1457
|
+
this.#updateForExpandMode(this.items.last);
|
|
1458
|
+
this.#updateReorderability();
|
|
1459
|
+
this.#repeaterService.items = this.items.toArray();
|
|
1460
|
+
}
|
|
1461
|
+
if (this.activeIndex !== undefined) {
|
|
1462
|
+
this.#repeaterService.activateItemByIndex(this.activeIndex);
|
|
1463
|
+
}
|
|
1464
|
+
this.#updateRole();
|
|
1465
|
+
this.#validateTags();
|
|
1466
|
+
});
|
|
1467
|
+
});
|
|
1468
|
+
setTimeout(() => {
|
|
1469
|
+
this.#updateForExpandMode();
|
|
1470
|
+
this.items?.forEach((item) => {
|
|
1471
|
+
item.reorderable = this.reorderable;
|
|
1472
|
+
});
|
|
1473
|
+
this.#updateRole();
|
|
1474
|
+
}, 0);
|
|
1475
|
+
}
|
|
1476
|
+
ngAfterViewChecked() {
|
|
1477
|
+
if (!this.#itemNameWarned && this.items?.some((item) => !item.itemName)) {
|
|
1478
|
+
this.#logSvc?.deprecated('SkyRepeaterItemComponent without `itemName`', {
|
|
1479
|
+
deprecationMajorVersion: 8,
|
|
1480
|
+
replacementRecommendation: 'Always specify an `itemName` property.',
|
|
1481
|
+
});
|
|
1482
|
+
this.#itemNameWarned = true;
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1485
|
+
ngOnChanges(changes) {
|
|
1486
|
+
if (changes['activeIndex']) {
|
|
1487
|
+
this.#repeaterService.enableActiveState = true;
|
|
1488
|
+
if (changes['activeIndex'].currentValue !==
|
|
1489
|
+
changes['activeIndex'].previousValue) {
|
|
1490
|
+
this.#repeaterService.activateItemByIndex(this.activeIndex);
|
|
1491
|
+
}
|
|
1492
|
+
}
|
|
1493
|
+
if (changes['reorderable']) {
|
|
1494
|
+
if (this.items) {
|
|
1495
|
+
this.#updateReorderability();
|
|
1496
|
+
}
|
|
1497
|
+
this.#updateRole();
|
|
1498
|
+
this.#changeDetector.markForCheck();
|
|
1499
|
+
}
|
|
1500
|
+
}
|
|
1501
|
+
ngOnDestroy() {
|
|
1502
|
+
this.#ngUnsubscribe.next();
|
|
1503
|
+
this.#ngUnsubscribe.complete();
|
|
1504
|
+
this.#destroyDragAndDrop();
|
|
1505
|
+
}
|
|
1506
|
+
ngOnInit() {
|
|
1507
|
+
this.#updateRole();
|
|
1508
|
+
}
|
|
1509
|
+
onCdkObserveContent() {
|
|
1510
|
+
this.#updateRole();
|
|
1511
|
+
}
|
|
1512
|
+
#updateForExpandMode(itemAdded) {
|
|
1513
|
+
if (this.items) {
|
|
1514
|
+
let foundExpanded = false;
|
|
1515
|
+
const isCollapsible = this.expandMode !== 'none';
|
|
1516
|
+
const isSingle = this.expandMode === 'single';
|
|
1517
|
+
// Keep any newly-added expanded item expanded and collapse the rest.
|
|
1518
|
+
if (itemAdded && itemAdded.isExpanded) {
|
|
1519
|
+
foundExpanded = true;
|
|
1520
|
+
}
|
|
1521
|
+
for (const item of this.items) {
|
|
1522
|
+
item.isCollapsible = isCollapsible && !!item.hasItemContent;
|
|
1523
|
+
// Collapse any items that aren't the item that was just added.
|
|
1524
|
+
if (item !== itemAdded && isSingle && item.isExpanded) {
|
|
1525
|
+
if (foundExpanded) {
|
|
1526
|
+
// If this item is being collapsed because a new item was
|
|
1527
|
+
// added, animate it.
|
|
1528
|
+
item.updateForExpanded(false, !!itemAdded);
|
|
1529
|
+
}
|
|
1530
|
+
foundExpanded = true;
|
|
1531
|
+
}
|
|
1532
|
+
}
|
|
1533
|
+
this.#updateRole();
|
|
1534
|
+
}
|
|
1535
|
+
}
|
|
1536
|
+
#initializeDragAndDrop() {
|
|
1537
|
+
/* Sanity check that we haven't already set up dragging abilities */
|
|
1538
|
+
/* istanbul ignore else */
|
|
1539
|
+
if (!this.#dragulaService.find(this.dragulaGroupName)) {
|
|
1540
|
+
this.#dragulaService.createGroup(this.dragulaGroupName, {
|
|
1541
|
+
moves: (el, _container, handle) => {
|
|
1542
|
+
const target = el?.querySelector('.sky-repeater-item-grab-handle');
|
|
1543
|
+
return !!(this.reorderable && target?.contains(handle));
|
|
1544
|
+
},
|
|
1545
|
+
});
|
|
1546
|
+
}
|
|
1547
|
+
let draggedItemIndex = -1;
|
|
1548
|
+
this.#dragulaService
|
|
1549
|
+
.drag(this.dragulaGroupName)
|
|
1550
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
1551
|
+
.subscribe((args) => {
|
|
1552
|
+
/* istanbul ignore else */
|
|
1553
|
+
if (args.name === this.dragulaGroupName) {
|
|
1554
|
+
this.#destroyAutoScroll();
|
|
1555
|
+
this.#autoScroller = this.#autoScrollSvc.autoScroll([this.#scrollableHostSvc.getScrollableHost(this.#elementRef)], {
|
|
1556
|
+
margin: 20,
|
|
1557
|
+
maxSpeed: 10,
|
|
1558
|
+
scrollWhenOutside: true,
|
|
1559
|
+
autoScroll: () => true,
|
|
1560
|
+
});
|
|
1561
|
+
this.#renderer.addClass(args.el, 'sky-repeater-item-dragging');
|
|
1562
|
+
draggedItemIndex = this.#adapterService.getRepeaterItemIndex(args.el);
|
|
1563
|
+
}
|
|
1564
|
+
});
|
|
1565
|
+
this.#dragulaService
|
|
1566
|
+
.dragend(this.dragulaGroupName)
|
|
1567
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
1568
|
+
.subscribe((args) => {
|
|
1569
|
+
/* istanbul ignore else */
|
|
1570
|
+
if (args.name === this.dragulaGroupName) {
|
|
1571
|
+
this.#destroyAutoScroll();
|
|
1572
|
+
this.#renderer.removeClass(args.el, 'sky-repeater-item-dragging');
|
|
1573
|
+
const newItemIndex = this.#adapterService.getRepeaterItemIndex(args.el);
|
|
1574
|
+
/* sanity check */
|
|
1575
|
+
/* istanbul ignore else */
|
|
1576
|
+
if (draggedItemIndex >= 0) {
|
|
1577
|
+
this.#repeaterService.reorderItem(draggedItemIndex, newItemIndex);
|
|
1578
|
+
draggedItemIndex = -1;
|
|
1579
|
+
}
|
|
1580
|
+
this.#emitTags();
|
|
1581
|
+
}
|
|
1582
|
+
});
|
|
1583
|
+
}
|
|
1584
|
+
#destroyDragAndDrop() {
|
|
1585
|
+
/* Sanity check that we have set up dragging abilities */
|
|
1586
|
+
/* istanbul ignore else */
|
|
1587
|
+
if (this.#dragulaService.find(this.dragulaGroupName)) {
|
|
1588
|
+
this.#dragulaService.destroy(this.dragulaGroupName);
|
|
1589
|
+
}
|
|
1590
|
+
this.#destroyAutoScroll();
|
|
1591
|
+
}
|
|
1592
|
+
#destroyAutoScroll() {
|
|
1593
|
+
if (this.#autoScroller) {
|
|
1594
|
+
this.#autoScroller.destroy();
|
|
1595
|
+
this.#autoScroller = undefined;
|
|
1596
|
+
}
|
|
1597
|
+
}
|
|
1598
|
+
#emitTags() {
|
|
1599
|
+
const tags = this.#repeaterService.items.map((item) => item.tag);
|
|
1600
|
+
this.orderChange.emit(tags);
|
|
1601
|
+
}
|
|
1602
|
+
#everyItemHasTag() {
|
|
1603
|
+
/* sanity check */
|
|
1604
|
+
/* istanbul ignore if */
|
|
1605
|
+
if (!this.items || this.items.length === 0) {
|
|
1606
|
+
return false;
|
|
1607
|
+
}
|
|
1608
|
+
return this.items.toArray().every((item) => {
|
|
1609
|
+
return item.tag !== undefined;
|
|
1610
|
+
});
|
|
1611
|
+
}
|
|
1612
|
+
#updateRole() {
|
|
1613
|
+
// Determine a role using a hierarchy based on https://www.w3.org/TR/wai-aria-practices-1.1/
|
|
1614
|
+
// 1. If there are one or more interactions in the repeater item projected content, use grid.
|
|
1615
|
+
// 2. If there are selectable repeater items and no other interactions, use listbox.
|
|
1616
|
+
// 3. If there are no interactions, use list.
|
|
1617
|
+
// Default to list role.
|
|
1618
|
+
let autoRole = 'list';
|
|
1619
|
+
const roleMap = {
|
|
1620
|
+
list: { item: 'listitem', title: undefined, content: undefined },
|
|
1621
|
+
listbox: { item: 'option', title: undefined, content: undefined },
|
|
1622
|
+
grid: { item: 'row', title: 'rowheader', content: 'gridcell' },
|
|
1623
|
+
};
|
|
1624
|
+
// Based on https://html.spec.whatwg.org/multipage/dom.html#interactive-content
|
|
1625
|
+
const interactionSelector = [
|
|
1626
|
+
'a[href]',
|
|
1627
|
+
'audio[controls]',
|
|
1628
|
+
'button',
|
|
1629
|
+
'details',
|
|
1630
|
+
'embed',
|
|
1631
|
+
'iframe',
|
|
1632
|
+
'img[usemap]',
|
|
1633
|
+
'input:not([type="hidden"])',
|
|
1634
|
+
'label',
|
|
1635
|
+
'select',
|
|
1636
|
+
'textarea',
|
|
1637
|
+
'video[controls]',
|
|
1638
|
+
'[contenteditable]',
|
|
1639
|
+
'.sky-repeater[role="grid"]',
|
|
1640
|
+
]
|
|
1641
|
+
.map((selector) => `sky-repeater-item-title ${selector}:not([hidden]), sky-repeater-item-content ${selector}:not([hidden])`)
|
|
1642
|
+
.concat([`skyux-dropdown`])
|
|
1643
|
+
.join(', ');
|
|
1644
|
+
const hasInteraction = this.reorderable ||
|
|
1645
|
+
this.items?.some((item) => item.isCollapsible) ||
|
|
1646
|
+
this.items?.some((item) => !!item.selectable) ||
|
|
1647
|
+
!!this.#elementRef.nativeElement.querySelector(interactionSelector);
|
|
1648
|
+
if (hasInteraction) {
|
|
1649
|
+
// If the repeater matches interaction selector https://www.w3.org/TR/wai-aria-practices-1.1/#grid
|
|
1650
|
+
autoRole = 'grid';
|
|
1651
|
+
}
|
|
1652
|
+
if (this.role !== autoRole) {
|
|
1653
|
+
this.#repeaterService.itemRole.next({
|
|
1654
|
+
...roleMap[autoRole],
|
|
1655
|
+
});
|
|
1656
|
+
this.role = `${autoRole}`;
|
|
1657
|
+
this.#changeDetector.markForCheck();
|
|
1658
|
+
}
|
|
1659
|
+
}
|
|
1660
|
+
#updateReorderability() {
|
|
1661
|
+
if (this.items) {
|
|
1662
|
+
for (const item of this.items) {
|
|
1663
|
+
item.reorderable = this.reorderable;
|
|
1664
|
+
}
|
|
1665
|
+
}
|
|
1666
|
+
}
|
|
1667
|
+
#validateTags() {
|
|
1668
|
+
if (this.reorderable && !this.#everyItemHasTag()) {
|
|
1669
|
+
console.warn('Please supply tag properties for each repeater item when reordering functionality is enabled.');
|
|
1670
|
+
}
|
|
1671
|
+
}
|
|
1672
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1673
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyRepeaterComponent, selector: "sky-repeater", inputs: { activeIndex: "activeIndex", ariaLabel: "ariaLabel", reorderable: "reorderable", expandMode: "expandMode" }, outputs: { activeIndexChange: "activeIndexChange", orderChange: "orderChange" }, providers: [
|
|
1674
|
+
SkyRepeaterService,
|
|
1675
|
+
SkyRepeaterAdapterService,
|
|
1676
|
+
SkyRepeaterAutoScrollService,
|
|
1677
|
+
], queries: [{ propertyName: "items", predicate: SkyRepeaterItemComponent }], usesOnChanges: true, ngImport: i0, template: "<ng-container #repeaterHost>\n <div\n class=\"sky-repeater\"\n [attr.role]=\"role\"\n [attr.aria-label]=\"ariaLabel || ('skyux_repeater_label' | skyLibResources)\"\n [dragula]=\"dragulaGroupName\"\n (cdkObserveContent)=\"onCdkObserveContent()\"\n >\n <ng-content></ng-content>\n </div>\n</ng-container>\n", styles: [".sky-repeater{padding:0}\n"], dependencies: [{ kind: "directive", type: i1$2.DragulaDirective, selector: "[dragula]", inputs: ["dragula", "dragulaModel"], outputs: ["dragulaModelChange"] }, { kind: "directive", type: i2$1.CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1678
|
+
}
|
|
1679
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterComponent, decorators: [{
|
|
1680
|
+
type: Component,
|
|
1681
|
+
args: [{ selector: 'sky-repeater', providers: [
|
|
1682
|
+
SkyRepeaterService,
|
|
1683
|
+
SkyRepeaterAdapterService,
|
|
1684
|
+
SkyRepeaterAutoScrollService,
|
|
1685
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container #repeaterHost>\n <div\n class=\"sky-repeater\"\n [attr.role]=\"role\"\n [attr.aria-label]=\"ariaLabel || ('skyux_repeater_label' | skyLibResources)\"\n [dragula]=\"dragulaGroupName\"\n (cdkObserveContent)=\"onCdkObserveContent()\"\n >\n <ng-content></ng-content>\n </div>\n</ng-container>\n", styles: [".sky-repeater{padding:0}\n"] }]
|
|
1686
|
+
}], ctorParameters: function () { return []; }, propDecorators: { activeIndex: [{
|
|
1687
|
+
type: Input
|
|
1688
|
+
}], ariaLabel: [{
|
|
1689
|
+
type: Input
|
|
1690
|
+
}], reorderable: [{
|
|
1691
|
+
type: Input
|
|
1692
|
+
}], expandMode: [{
|
|
1693
|
+
type: Input
|
|
1694
|
+
}], activeIndexChange: [{
|
|
1695
|
+
type: Output
|
|
1696
|
+
}], orderChange: [{
|
|
1697
|
+
type: Output
|
|
1698
|
+
}], items: [{
|
|
1699
|
+
type: ContentChildren,
|
|
1700
|
+
args: [SkyRepeaterItemComponent]
|
|
1701
|
+
}] } });
|
|
1702
|
+
|
|
1703
|
+
class SkyRepeaterModule {
|
|
1704
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
1705
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterModule, declarations: [SkyRepeaterComponent,
|
|
1706
|
+
SkyRepeaterItemComponent,
|
|
1707
|
+
SkyRepeaterItemContentComponent,
|
|
1708
|
+
SkyRepeaterItemContextMenuComponent,
|
|
1709
|
+
SkyRepeaterItemTitleComponent], imports: [CommonModule,
|
|
1710
|
+
DragulaModule,
|
|
1711
|
+
ObserversModule,
|
|
1712
|
+
SkyChevronModule,
|
|
1713
|
+
SkyCheckboxModule,
|
|
1714
|
+
SkyIconModule,
|
|
1715
|
+
SkyInlineFormModule,
|
|
1716
|
+
SkyListsResourcesModule], exports: [SkyRepeaterComponent,
|
|
1717
|
+
SkyRepeaterItemComponent,
|
|
1718
|
+
SkyRepeaterItemContentComponent,
|
|
1719
|
+
SkyRepeaterItemContextMenuComponent,
|
|
1720
|
+
SkyRepeaterItemTitleComponent] }); }
|
|
1721
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterModule, providers: [DragulaService], imports: [CommonModule,
|
|
1722
|
+
DragulaModule,
|
|
1723
|
+
ObserversModule,
|
|
1724
|
+
SkyChevronModule,
|
|
1725
|
+
SkyCheckboxModule,
|
|
1726
|
+
SkyIconModule,
|
|
1727
|
+
SkyInlineFormModule,
|
|
1728
|
+
SkyListsResourcesModule] }); }
|
|
1729
|
+
}
|
|
1730
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterModule, decorators: [{
|
|
1731
|
+
type: NgModule,
|
|
1732
|
+
args: [{
|
|
1733
|
+
declarations: [
|
|
1734
|
+
SkyRepeaterComponent,
|
|
1735
|
+
SkyRepeaterItemComponent,
|
|
1736
|
+
SkyRepeaterItemContentComponent,
|
|
1737
|
+
SkyRepeaterItemContextMenuComponent,
|
|
1738
|
+
SkyRepeaterItemTitleComponent,
|
|
1739
|
+
],
|
|
1740
|
+
imports: [
|
|
1741
|
+
CommonModule,
|
|
1742
|
+
DragulaModule,
|
|
1743
|
+
ObserversModule,
|
|
1744
|
+
SkyChevronModule,
|
|
1745
|
+
SkyCheckboxModule,
|
|
1746
|
+
SkyIconModule,
|
|
1747
|
+
SkyInlineFormModule,
|
|
1748
|
+
SkyListsResourcesModule,
|
|
1749
|
+
],
|
|
1750
|
+
exports: [
|
|
1751
|
+
SkyRepeaterComponent,
|
|
1752
|
+
SkyRepeaterItemComponent,
|
|
1753
|
+
SkyRepeaterItemContentComponent,
|
|
1754
|
+
SkyRepeaterItemContextMenuComponent,
|
|
1755
|
+
SkyRepeaterItemTitleComponent,
|
|
1756
|
+
],
|
|
1757
|
+
providers: [DragulaService],
|
|
1758
|
+
}]
|
|
1759
|
+
}] });
|
|
1760
|
+
|
|
1761
|
+
/**
|
|
1762
|
+
* @internal
|
|
1763
|
+
*/
|
|
1764
|
+
class SkySortService {
|
|
1765
|
+
constructor() {
|
|
1766
|
+
this.selectedItem = new BehaviorSubject('');
|
|
1767
|
+
}
|
|
1768
|
+
selectItem(sortItem) {
|
|
1769
|
+
this.selectedItem.next(sortItem);
|
|
1770
|
+
}
|
|
1771
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1772
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortService }); }
|
|
1773
|
+
}
|
|
1774
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortService, decorators: [{
|
|
1775
|
+
type: Injectable
|
|
1776
|
+
}] });
|
|
1777
|
+
|
|
1778
|
+
const SORT_ITEM_ID_PREFIX = 'sky-sort-item-';
|
|
1779
|
+
let sortItemIdNumber = 0;
|
|
1780
|
+
class SkySortItemComponent {
|
|
1781
|
+
#subscription;
|
|
1782
|
+
#sortItemId;
|
|
1783
|
+
#sortService;
|
|
1784
|
+
#detector;
|
|
1785
|
+
constructor(sortService, detector) {
|
|
1786
|
+
/**
|
|
1787
|
+
* Fires when a sort item is selected.
|
|
1788
|
+
*/
|
|
1789
|
+
this.itemSelect = new EventEmitter(); // TODO: Change to `EventEmitter<void>` in a breaking change.
|
|
1790
|
+
this.isSelected = new BehaviorSubject(false);
|
|
1791
|
+
this.#sortService = sortService;
|
|
1792
|
+
this.#detector = detector;
|
|
1793
|
+
}
|
|
1794
|
+
ngOnInit() {
|
|
1795
|
+
sortItemIdNumber++;
|
|
1796
|
+
this.#sortItemId = SORT_ITEM_ID_PREFIX + sortItemIdNumber.toString();
|
|
1797
|
+
this.#subscription = this.#sortService.selectedItem.subscribe((itemId) => {
|
|
1798
|
+
this.isSelected.next(itemId === this.#sortItemId);
|
|
1799
|
+
this.#detector.detectChanges();
|
|
1800
|
+
});
|
|
1801
|
+
if (this.active) {
|
|
1802
|
+
this.#sortService.selectItem(this.#sortItemId);
|
|
1803
|
+
}
|
|
1804
|
+
}
|
|
1805
|
+
ngOnChanges(changes) {
|
|
1806
|
+
if (this.#sortItemId &&
|
|
1807
|
+
changes &&
|
|
1808
|
+
changes['active'] &&
|
|
1809
|
+
changes['active'].currentValue &&
|
|
1810
|
+
changes['active'].currentValue !== changes['active'].previousValue) {
|
|
1811
|
+
this.#sortService.selectItem(this.#sortItemId);
|
|
1812
|
+
}
|
|
1813
|
+
}
|
|
1814
|
+
itemClicked() {
|
|
1815
|
+
if (this.#sortItemId) {
|
|
1816
|
+
this.#sortService.selectItem(this.#sortItemId);
|
|
1817
|
+
this.itemSelect.emit();
|
|
1818
|
+
}
|
|
1819
|
+
}
|
|
1820
|
+
ngOnDestroy() {
|
|
1821
|
+
/* istanbul ignore else */
|
|
1822
|
+
/* sanity check */
|
|
1823
|
+
if (this.#subscription) {
|
|
1824
|
+
this.#subscription.unsubscribe();
|
|
1825
|
+
}
|
|
1826
|
+
}
|
|
1827
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortItemComponent, deps: [{ token: SkySortService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1828
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkySortItemComponent, selector: "sky-sort-item", inputs: { active: "active" }, outputs: { itemSelect: "itemSelect" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"sky-sort-item\"\n role=\"menuitemradio\"\n [attr.aria-checked]=\"isSelected | async\"\n [ngClass]=\"{ 'sky-sort-item-selected': (isSelected | async) }\"\n>\n <button\n type=\"button\"\n [ngClass]=\"{ 'sky-font-emphasized': (isSelected | async) }\"\n (click)=\"itemClicked()\"\n >\n <ng-content></ng-content>\n </button>\n</div>\n", styles: [".sky-sort-item{background-color:transparent;border:none;display:block;margin:4px;min-width:160px;text-align:left;transition:background-color .15s}.sky-sort-item.sky-dropdown-item-active a,.sky-sort-item.sky-dropdown-item-active button,.sky-sort-item:hover a,.sky-sort-item:hover button{background-color:var(--sky-background-color-neutral-light)}.sky-sort-item button[disabled],.sky-sort-item a[disabled]{cursor:default}.sky-sort-item button[disabled]:hover,.sky-sort-item a[disabled]:hover{background-color:transparent}.sky-sort-item ::ng-deep>button{background-color:transparent;border:none;color:var(--sky-text-color-default);cursor:pointer;display:block;padding:3px 20px;text-align:left;width:100%}.sky-sort-item ::ng-deep>button[disabled]{color:var(--sky-text-color-deemphasized)}.sky-sort-item ::ng-deep>button[disabled]:hover{cursor:default}.sky-sort-item-selected{background-color:#f1eef6;padding:4px;margin:0}:host-context(.sky-theme-modern) .sky-sort-item{margin:0;border:none;color:var(--sky-text-color-deemphasized);font-weight:400;transition:box-shadow .15s;border-radius:6px;padding:10px 20px}:host-context(.sky-theme-modern) .sky-sort-item:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus-visible){background-color:transparent;border-bottom:solid 1px var(--sky-highlight-color-info);color:var(--sky-text-color-default);padding-bottom:9px}:host-context(.sky-theme-modern) .sky-sort-item:focus-visible{background-color:transparent;color:var(--sky-text-color-default);outline:none}:host-context(.sky-theme-modern) .sky-sort-item:focus-visible:not(:active){color:var(--sky-text-color-default);outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px;box-shadow:0 1px 8px #0000004d}:host-context(.sky-theme-modern) .sky-sort-item:active{color:var(--sky-text-color-default);padding-bottom:7px}:host-context(.sky-theme-modern) .sky-sort-item.sky-btn-tab-disabled{background-color:transparent;font-family:BLKB Sans,Helvetica Neue,Arial,sans-serif;color:var(--sky-text-color-deemphasized);font-weight:400;font-size:15px;font-style:italic}:host-context(.sky-theme-modern) .sky-sort-item.sky-btn-tab-disabled .sky-btn-tab-close{font-size:16px}:host-context(.sky-theme-modern) .sky-sort-item:hover:not(.sky-btn-tab-disabled){background-color:transparent;border-bottom:none;outline:solid 1px var(--sky-background-color-primary-dark);outline-offset:-1px}:host-context(.sky-theme-modern) .sky-sort-item:focus-visible:not(:active){background-color:transparent;box-shadow:0 1px 8px #0000004d;outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px}:host-context(.sky-theme-modern) .sky-sort-item button{padding:0;color:#686c73}:host-context(.sky-theme-modern) .sky-sort-item-selected{color:var(--sky-text-color-default);border-bottom:none;border-radius:0 6px 6px 0;border-left:solid 3px var(--sky-background-color-primary-dark);padding-bottom:10px;padding-left:17px;background-color:inherit}:host-context(.sky-theme-modern) .sky-sort-item-selected button{font-weight:400;color:#212327}.sky-theme-modern .sky-sort-item{margin:0;border:none;color:var(--sky-text-color-deemphasized);font-weight:400;transition:box-shadow .15s;border-radius:6px;padding:10px 20px}.sky-theme-modern .sky-sort-item:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus-visible){background-color:transparent;border-bottom:solid 1px var(--sky-highlight-color-info);color:var(--sky-text-color-default);padding-bottom:9px}.sky-theme-modern .sky-sort-item:focus-visible{background-color:transparent;color:var(--sky-text-color-default);outline:none}.sky-theme-modern .sky-sort-item:focus-visible:not(:active){color:var(--sky-text-color-default);outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px;box-shadow:0 1px 8px #0000004d}.sky-theme-modern .sky-sort-item:active{color:var(--sky-text-color-default);padding-bottom:7px}.sky-theme-modern .sky-sort-item.sky-btn-tab-disabled{background-color:transparent;font-family:BLKB Sans,Helvetica Neue,Arial,sans-serif;color:var(--sky-text-color-deemphasized);font-weight:400;font-size:15px;font-style:italic}.sky-theme-modern .sky-sort-item.sky-btn-tab-disabled .sky-btn-tab-close{font-size:16px}.sky-theme-modern .sky-sort-item:hover:not(.sky-btn-tab-disabled){background-color:transparent;border-bottom:none;outline:solid 1px var(--sky-background-color-primary-dark);outline-offset:-1px}.sky-theme-modern .sky-sort-item:focus-visible:not(:active){background-color:transparent;box-shadow:0 1px 8px #0000004d;outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px}.sky-theme-modern .sky-sort-item button{padding:0;color:#686c73}.sky-theme-modern .sky-sort-item-selected{color:var(--sky-text-color-default);border-bottom:none;border-radius:0 6px 6px 0;border-left:solid 3px var(--sky-background-color-primary-dark);padding-bottom:10px;padding-left:17px;background-color:inherit}.sky-theme-modern .sky-sort-item-selected button{font-weight:400;color:#212327}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-sort-item button{color:#c0c2c5}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-sort-item-selected button{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark .sky-sort-item button{color:#c0c2c5}.sky-theme-modern.sky-theme-mode-dark .sky-sort-item-selected button{color:#fbfcfe}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1829
|
+
}
|
|
1830
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortItemComponent, decorators: [{
|
|
1831
|
+
type: Component,
|
|
1832
|
+
args: [{ selector: 'sky-sort-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"sky-sort-item\"\n role=\"menuitemradio\"\n [attr.aria-checked]=\"isSelected | async\"\n [ngClass]=\"{ 'sky-sort-item-selected': (isSelected | async) }\"\n>\n <button\n type=\"button\"\n [ngClass]=\"{ 'sky-font-emphasized': (isSelected | async) }\"\n (click)=\"itemClicked()\"\n >\n <ng-content></ng-content>\n </button>\n</div>\n", styles: [".sky-sort-item{background-color:transparent;border:none;display:block;margin:4px;min-width:160px;text-align:left;transition:background-color .15s}.sky-sort-item.sky-dropdown-item-active a,.sky-sort-item.sky-dropdown-item-active button,.sky-sort-item:hover a,.sky-sort-item:hover button{background-color:var(--sky-background-color-neutral-light)}.sky-sort-item button[disabled],.sky-sort-item a[disabled]{cursor:default}.sky-sort-item button[disabled]:hover,.sky-sort-item a[disabled]:hover{background-color:transparent}.sky-sort-item ::ng-deep>button{background-color:transparent;border:none;color:var(--sky-text-color-default);cursor:pointer;display:block;padding:3px 20px;text-align:left;width:100%}.sky-sort-item ::ng-deep>button[disabled]{color:var(--sky-text-color-deemphasized)}.sky-sort-item ::ng-deep>button[disabled]:hover{cursor:default}.sky-sort-item-selected{background-color:#f1eef6;padding:4px;margin:0}:host-context(.sky-theme-modern) .sky-sort-item{margin:0;border:none;color:var(--sky-text-color-deemphasized);font-weight:400;transition:box-shadow .15s;border-radius:6px;padding:10px 20px}:host-context(.sky-theme-modern) .sky-sort-item:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus-visible){background-color:transparent;border-bottom:solid 1px var(--sky-highlight-color-info);color:var(--sky-text-color-default);padding-bottom:9px}:host-context(.sky-theme-modern) .sky-sort-item:focus-visible{background-color:transparent;color:var(--sky-text-color-default);outline:none}:host-context(.sky-theme-modern) .sky-sort-item:focus-visible:not(:active){color:var(--sky-text-color-default);outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px;box-shadow:0 1px 8px #0000004d}:host-context(.sky-theme-modern) .sky-sort-item:active{color:var(--sky-text-color-default);padding-bottom:7px}:host-context(.sky-theme-modern) .sky-sort-item.sky-btn-tab-disabled{background-color:transparent;font-family:BLKB Sans,Helvetica Neue,Arial,sans-serif;color:var(--sky-text-color-deemphasized);font-weight:400;font-size:15px;font-style:italic}:host-context(.sky-theme-modern) .sky-sort-item.sky-btn-tab-disabled .sky-btn-tab-close{font-size:16px}:host-context(.sky-theme-modern) .sky-sort-item:hover:not(.sky-btn-tab-disabled){background-color:transparent;border-bottom:none;outline:solid 1px var(--sky-background-color-primary-dark);outline-offset:-1px}:host-context(.sky-theme-modern) .sky-sort-item:focus-visible:not(:active){background-color:transparent;box-shadow:0 1px 8px #0000004d;outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px}:host-context(.sky-theme-modern) .sky-sort-item button{padding:0;color:#686c73}:host-context(.sky-theme-modern) .sky-sort-item-selected{color:var(--sky-text-color-default);border-bottom:none;border-radius:0 6px 6px 0;border-left:solid 3px var(--sky-background-color-primary-dark);padding-bottom:10px;padding-left:17px;background-color:inherit}:host-context(.sky-theme-modern) .sky-sort-item-selected button{font-weight:400;color:#212327}.sky-theme-modern .sky-sort-item{margin:0;border:none;color:var(--sky-text-color-deemphasized);font-weight:400;transition:box-shadow .15s;border-radius:6px;padding:10px 20px}.sky-theme-modern .sky-sort-item:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus-visible){background-color:transparent;border-bottom:solid 1px var(--sky-highlight-color-info);color:var(--sky-text-color-default);padding-bottom:9px}.sky-theme-modern .sky-sort-item:focus-visible{background-color:transparent;color:var(--sky-text-color-default);outline:none}.sky-theme-modern .sky-sort-item:focus-visible:not(:active){color:var(--sky-text-color-default);outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px;box-shadow:0 1px 8px #0000004d}.sky-theme-modern .sky-sort-item:active{color:var(--sky-text-color-default);padding-bottom:7px}.sky-theme-modern .sky-sort-item.sky-btn-tab-disabled{background-color:transparent;font-family:BLKB Sans,Helvetica Neue,Arial,sans-serif;color:var(--sky-text-color-deemphasized);font-weight:400;font-size:15px;font-style:italic}.sky-theme-modern .sky-sort-item.sky-btn-tab-disabled .sky-btn-tab-close{font-size:16px}.sky-theme-modern .sky-sort-item:hover:not(.sky-btn-tab-disabled){background-color:transparent;border-bottom:none;outline:solid 1px var(--sky-background-color-primary-dark);outline-offset:-1px}.sky-theme-modern .sky-sort-item:focus-visible:not(:active){background-color:transparent;box-shadow:0 1px 8px #0000004d;outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px}.sky-theme-modern .sky-sort-item button{padding:0;color:#686c73}.sky-theme-modern .sky-sort-item-selected{color:var(--sky-text-color-default);border-bottom:none;border-radius:0 6px 6px 0;border-left:solid 3px var(--sky-background-color-primary-dark);padding-bottom:10px;padding-left:17px;background-color:inherit}.sky-theme-modern .sky-sort-item-selected button{font-weight:400;color:#212327}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-sort-item button{color:#c0c2c5}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-sort-item-selected button{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark .sky-sort-item button{color:#c0c2c5}.sky-theme-modern.sky-theme-mode-dark .sky-sort-item-selected button{color:#fbfcfe}\n"] }]
|
|
1833
|
+
}], ctorParameters: function () { return [{ type: SkySortService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { active: [{
|
|
1834
|
+
type: Input
|
|
1835
|
+
}], itemSelect: [{
|
|
1836
|
+
type: Output
|
|
1837
|
+
}] } });
|
|
1838
|
+
|
|
1839
|
+
class SkySortMenuHeadingComponent {
|
|
1840
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortMenuHeadingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1841
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkySortMenuHeadingComponent, selector: "sky-sort-menu-heading", ngImport: i0, template: "<div\n class=\"sky-sort-menu-heading\"\n [skyThemeClass]=\"{\n 'sky-subsection-heading': 'default',\n 'sky-font-heading-4': 'modern'\n }\"\n>\n {{ 'skyux_sort_menu_heading' | skyLibResources }}\n</div>\n", styles: [".sky-sort-menu-heading{background-color:transparent;border:none;display:block;margin:4px;min-width:160px;transition:background-color .15s;padding:3px 20px;text-align:left;width:100%}:host-context(.sky-theme-modern) .sky-sort-menu-heading{margin:0;padding:10px 20px}.sky-theme-modern .sky-sort-menu-heading{margin:0;padding:10px 20px}\n"], dependencies: [{ kind: "directive", type: i3.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }] }); }
|
|
1842
|
+
}
|
|
1843
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortMenuHeadingComponent, decorators: [{
|
|
1844
|
+
type: Component,
|
|
1845
|
+
args: [{ selector: 'sky-sort-menu-heading', template: "<div\n class=\"sky-sort-menu-heading\"\n [skyThemeClass]=\"{\n 'sky-subsection-heading': 'default',\n 'sky-font-heading-4': 'modern'\n }\"\n>\n {{ 'skyux_sort_menu_heading' | skyLibResources }}\n</div>\n", styles: [".sky-sort-menu-heading{background-color:transparent;border:none;display:block;margin:4px;min-width:160px;transition:background-color .15s;padding:3px 20px;text-align:left;width:100%}:host-context(.sky-theme-modern) .sky-sort-menu-heading{margin:0;padding:10px 20px}.sky-theme-modern .sky-sort-menu-heading{margin:0;padding:10px 20px}\n"] }]
|
|
1846
|
+
}] });
|
|
1847
|
+
|
|
1848
|
+
class SkySortComponent {
|
|
1849
|
+
constructor() {
|
|
1850
|
+
/**
|
|
1851
|
+
* Whether to display a "Sort" label beside the icon on the sort button.
|
|
1852
|
+
*/
|
|
1853
|
+
this.showButtonText = false;
|
|
1854
|
+
this.dropdownController = new Subject();
|
|
1855
|
+
}
|
|
1856
|
+
dropdownClicked() {
|
|
1857
|
+
this.dropdownController.next({
|
|
1858
|
+
type: SkyDropdownMessageType.Close,
|
|
1859
|
+
});
|
|
1860
|
+
}
|
|
1861
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1862
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkySortComponent, selector: "sky-sort", inputs: { showButtonText: "showButtonText" }, providers: [SkySortService], ngImport: i0, template: "<div class=\"sky-sort\">\n <sky-dropdown\n buttonType=\"select\"\n [label]=\"'skyux_sort_button_label' | skyLibResources\"\n [messageStream]=\"dropdownController\"\n [title]=\"'skyux_sort_button_label' | skyLibResources\"\n >\n <sky-dropdown-button>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"sort\"></sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"sort\" iconType=\"skyux\"></sky-icon>\n <span *ngIf=\"showButtonText\" class=\"sky-sort-btn-text\">\n {{ 'skyux_sort_button_label' | skyLibResources }}\n </span>\n </sky-dropdown-button>\n <sky-dropdown-menu\n ariaRole=\"menu\"\n [ariaLabelledBy]=\"sortMenuHeading.id\"\n (click)=\"dropdownClicked()\"\n >\n <sky-sort-menu-heading\n skyId\n #sortMenuHeading=\"skyId\"\n ></sky-sort-menu-heading>\n <div *skyThemeIf=\"'default'\" class=\"sky-sort-heading-divider\"></div>\n <ng-content></ng-content>\n </sky-dropdown-menu>\n </sky-dropdown>\n</div>\n", styles: [".sky-sort-heading-divider{margin:0;height:1px;overflow:hidden;background-color:#eeeeef}:host .sky-sort-btn-text{display:none}:host-context(.sky-responsive-container-xs) .sky-sort-btn-text,:host-context(.sky-responsive-container-sm) .sky-sort-btn-text,:host-context(.sky-responsive-container-md) .sky-sort-btn-text,:host-context(.sky-responsive-container-lg) .sky-sort-btn-text{display:none}@media (min-width: 768px){:host .sky-sort-btn-text{display:inline}}:host-context(.sky-responsive-container-sm) .sky-sort-btn-text,:host-context(.sky-responsive-container-md) .sky-sort-btn-text,:host-context(.sky-responsive-container-lg) .sky-sort-btn-text{display:inline}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2$2.λ2, selector: "sky-dropdown-button" }, { kind: "component", type: i2$2.λ3, selector: "sky-dropdown", inputs: ["buttonStyle", "buttonType", "disabled", "dismissOnBlur", "label", "horizontalAlignment", "messageStream", "title", "trigger"] }, { kind: "component", type: i2$2.λ4, selector: "sky-dropdown-menu", inputs: ["ariaLabelledBy", "ariaRole", "useNativeFocus"], outputs: ["menuChanges"] }, { kind: "component", type: i2.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "directive", type: i1$1.λ2, selector: "[skyId]", exportAs: ["skyId"] }, { kind: "directive", type: i3.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { kind: "component", type: SkySortMenuHeadingComponent, selector: "sky-sort-menu-heading" }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1863
|
+
}
|
|
1864
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortComponent, decorators: [{
|
|
1865
|
+
type: Component,
|
|
1866
|
+
args: [{ selector: 'sky-sort', providers: [SkySortService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sky-sort\">\n <sky-dropdown\n buttonType=\"select\"\n [label]=\"'skyux_sort_button_label' | skyLibResources\"\n [messageStream]=\"dropdownController\"\n [title]=\"'skyux_sort_button_label' | skyLibResources\"\n >\n <sky-dropdown-button>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"sort\"></sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"sort\" iconType=\"skyux\"></sky-icon>\n <span *ngIf=\"showButtonText\" class=\"sky-sort-btn-text\">\n {{ 'skyux_sort_button_label' | skyLibResources }}\n </span>\n </sky-dropdown-button>\n <sky-dropdown-menu\n ariaRole=\"menu\"\n [ariaLabelledBy]=\"sortMenuHeading.id\"\n (click)=\"dropdownClicked()\"\n >\n <sky-sort-menu-heading\n skyId\n #sortMenuHeading=\"skyId\"\n ></sky-sort-menu-heading>\n <div *skyThemeIf=\"'default'\" class=\"sky-sort-heading-divider\"></div>\n <ng-content></ng-content>\n </sky-dropdown-menu>\n </sky-dropdown>\n</div>\n", styles: [".sky-sort-heading-divider{margin:0;height:1px;overflow:hidden;background-color:#eeeeef}:host .sky-sort-btn-text{display:none}:host-context(.sky-responsive-container-xs) .sky-sort-btn-text,:host-context(.sky-responsive-container-sm) .sky-sort-btn-text,:host-context(.sky-responsive-container-md) .sky-sort-btn-text,:host-context(.sky-responsive-container-lg) .sky-sort-btn-text{display:none}@media (min-width: 768px){:host .sky-sort-btn-text{display:inline}}:host-context(.sky-responsive-container-sm) .sky-sort-btn-text,:host-context(.sky-responsive-container-md) .sky-sort-btn-text,:host-context(.sky-responsive-container-lg) .sky-sort-btn-text{display:inline}\n"] }]
|
|
1867
|
+
}], propDecorators: { showButtonText: [{
|
|
1868
|
+
type: Input
|
|
1869
|
+
}] } });
|
|
1870
|
+
|
|
1871
|
+
class SkySortModule {
|
|
1872
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
1873
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: SkySortModule, declarations: [SkySortComponent,
|
|
1874
|
+
SkySortItemComponent,
|
|
1875
|
+
SkySortMenuHeadingComponent], imports: [CommonModule,
|
|
1876
|
+
SkyDropdownModule,
|
|
1877
|
+
SkyIconModule,
|
|
1878
|
+
SkyIdModule,
|
|
1879
|
+
SkyListsResourcesModule,
|
|
1880
|
+
SkyThemeModule], exports: [SkySortComponent, SkySortItemComponent] }); }
|
|
1881
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortModule, imports: [CommonModule,
|
|
1882
|
+
SkyDropdownModule,
|
|
1883
|
+
SkyIconModule,
|
|
1884
|
+
SkyIdModule,
|
|
1885
|
+
SkyListsResourcesModule,
|
|
1886
|
+
SkyThemeModule] }); }
|
|
1887
|
+
}
|
|
1888
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortModule, decorators: [{
|
|
1889
|
+
type: NgModule,
|
|
1890
|
+
args: [{
|
|
1891
|
+
declarations: [
|
|
1892
|
+
SkySortComponent,
|
|
1893
|
+
SkySortItemComponent,
|
|
1894
|
+
SkySortMenuHeadingComponent,
|
|
1895
|
+
],
|
|
1896
|
+
imports: [
|
|
1897
|
+
CommonModule,
|
|
1898
|
+
SkyDropdownModule,
|
|
1899
|
+
SkyIconModule,
|
|
1900
|
+
SkyIdModule,
|
|
1901
|
+
SkyListsResourcesModule,
|
|
1902
|
+
SkyThemeModule,
|
|
1903
|
+
],
|
|
1904
|
+
exports: [SkySortComponent, SkySortItemComponent],
|
|
1905
|
+
}]
|
|
1906
|
+
}] });
|
|
1907
|
+
|
|
1908
|
+
/**
|
|
1909
|
+
* Generated bundle index. Do not edit.
|
|
1910
|
+
*/
|
|
1911
|
+
|
|
1912
|
+
export { SkyFilterModule, SkyInfiniteScrollModule, SkyPagingModule, SkyRepeaterModule, SkySortModule, SkyFilterButtonComponent as λ1, SkyRepeaterItemComponent as λ10, SkyRepeaterComponent as λ11, SkyRepeaterItemTitleComponent as λ12, SkySortItemComponent as λ13, SkySortComponent as λ14, SkyFilterInlineComponent as λ2, SkyFilterInlineItemComponent as λ3, SkyFilterSummaryItemComponent as λ4, SkyFilterSummaryComponent as λ5, SkyInfiniteScrollComponent as λ6, SkyPagingComponent as λ7, SkyRepeaterItemContentComponent as λ8, SkyRepeaterItemContextMenuComponent as λ9 };
|
|
1913
|
+
//# sourceMappingURL=skyux-lists.mjs.map
|