@skyux/lists 6.0.0-beta.9 → 6.0.2
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 +523 -256
- package/esm2020/lib/modules/repeater/repeater-item-roles.type.mjs +2 -0
- package/esm2020/lib/modules/repeater/repeater-item.component.mjs +118 -29
- package/esm2020/lib/modules/repeater/repeater-role.type.mjs +2 -0
- package/esm2020/lib/modules/repeater/repeater.component.mjs +66 -4
- package/esm2020/lib/modules/repeater/repeater.module.mjs +5 -1
- package/esm2020/lib/modules/repeater/repeater.service.mjs +8 -3
- package/fesm2015/skyux-lists.mjs +191 -32
- package/fesm2015/skyux-lists.mjs.map +1 -1
- package/fesm2020/skyux-lists.mjs +192 -32
- package/fesm2020/skyux-lists.mjs.map +1 -1
- package/lib/modules/repeater/repeater-item-roles.type.d.ts +5 -0
- package/lib/modules/repeater/repeater-item.component.d.ts +17 -2
- package/lib/modules/repeater/repeater-role.type.d.ts +1 -0
- package/lib/modules/repeater/repeater.component.d.ts +7 -2
- package/lib/modules/repeater/repeater.module.d.ts +6 -5
- package/lib/modules/repeater/repeater.service.d.ts +2 -0
- package/package.json +11 -10
package/fesm2015/skyux-lists.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i2 from '@angular/common';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { NgModule, EventEmitter, Component, ChangeDetectionStrategy, Input, Output, Injectable, ElementRef, ViewEncapsulation,
|
|
4
|
+
import { NgModule, EventEmitter, Component, ChangeDetectionStrategy, Input, Output, Injectable, ElementRef, ViewEncapsulation, HostBinding, ContentChild, ViewChild, ContentChildren, HostListener } from '@angular/core';
|
|
5
5
|
import * as i1 from '@skyux/indicators';
|
|
6
6
|
import { SkyIconModule, SkyTokensModule, SkyWaitModule, SkyChevronModule } from '@skyux/indicators';
|
|
7
7
|
import * as i3 from '@skyux/theme';
|
|
@@ -12,6 +12,8 @@ import { Subject, fromEvent, BehaviorSubject, forkJoin } from 'rxjs';
|
|
|
12
12
|
import { takeUntil, filter, map } from 'rxjs/operators';
|
|
13
13
|
import * as i1$1 from '@skyux/core';
|
|
14
14
|
import { SkyIdModule } from '@skyux/core';
|
|
15
|
+
import * as i4$2 from '@angular/cdk/observers';
|
|
16
|
+
import { ObserversModule } from '@angular/cdk/observers';
|
|
15
17
|
import * as i6 from '@skyux/forms';
|
|
16
18
|
import { SkyCheckboxModule } from '@skyux/forms';
|
|
17
19
|
import * as i4$1 from '@skyux/inline-form';
|
|
@@ -676,6 +678,11 @@ class SkyRepeaterService {
|
|
|
676
678
|
this.enableActiveState = false;
|
|
677
679
|
this.itemCollapseStateChange = new EventEmitter();
|
|
678
680
|
this.items = [];
|
|
681
|
+
this.itemRole = new BehaviorSubject({
|
|
682
|
+
content: undefined,
|
|
683
|
+
item: undefined,
|
|
684
|
+
title: undefined,
|
|
685
|
+
});
|
|
679
686
|
this.orderChange = new BehaviorSubject(undefined);
|
|
680
687
|
}
|
|
681
688
|
ngOnDestroy() {
|
|
@@ -686,7 +693,7 @@ class SkyRepeaterService {
|
|
|
686
693
|
activateItem(item) {
|
|
687
694
|
if (this.enableActiveState) {
|
|
688
695
|
/* istanbul ignore else */
|
|
689
|
-
if (item) {
|
|
696
|
+
if (item && !item.disabled) {
|
|
690
697
|
const index = this.items.findIndex((i) => i === item);
|
|
691
698
|
this.activeItemIndexChange.next(index);
|
|
692
699
|
this.activeItemChange.next(item);
|
|
@@ -701,7 +708,7 @@ class SkyRepeaterService {
|
|
|
701
708
|
}
|
|
702
709
|
else {
|
|
703
710
|
const activeItem = this.items[index];
|
|
704
|
-
if (activeItem) {
|
|
711
|
+
if (activeItem && !activeItem.disabled) {
|
|
705
712
|
this.activeItemChange.next(activeItem);
|
|
706
713
|
}
|
|
707
714
|
}
|
|
@@ -848,6 +855,7 @@ class SkyRepeaterItemComponent {
|
|
|
848
855
|
this.keyboardReorderingEnabled = false;
|
|
849
856
|
this.ngUnsubscribe = new Subject();
|
|
850
857
|
this._isCollapsible = true;
|
|
858
|
+
this._isDisabled = false;
|
|
851
859
|
this._isExpanded = true;
|
|
852
860
|
this._isSelected = false;
|
|
853
861
|
this.slideForExpanded(false);
|
|
@@ -865,6 +873,42 @@ class SkyRepeaterItemComponent {
|
|
|
865
873
|
this.reorderMovedText = translatedStrings[4];
|
|
866
874
|
this.reorderButtonLabel = this.reorderInstructions;
|
|
867
875
|
});
|
|
876
|
+
this.itemRole$ = this.repeaterService.itemRole.asObservable();
|
|
877
|
+
}
|
|
878
|
+
/**
|
|
879
|
+
* Make the first, non-disabled item tab-focusable.
|
|
880
|
+
* - Disabled items should not be focusable per [W3C](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_disabled_controls).
|
|
881
|
+
* - One item per list/grid/listbox should be tab focusable per [W3C](https://www.w3.org/TR/wai-aria-practices-1.1/#grid).
|
|
882
|
+
*/
|
|
883
|
+
get tabindex() {
|
|
884
|
+
return this.repeaterService.items.filter((item) => !item.disabled)[0] ===
|
|
885
|
+
this
|
|
886
|
+
? 0
|
|
887
|
+
: -1;
|
|
888
|
+
}
|
|
889
|
+
/**
|
|
890
|
+
* Whether to exclude an item when cycling through.
|
|
891
|
+
*/
|
|
892
|
+
set disabled(value) {
|
|
893
|
+
if (this._isDisabled !== value) {
|
|
894
|
+
if (value) {
|
|
895
|
+
this.isSelected = false;
|
|
896
|
+
this._isDisabled = true;
|
|
897
|
+
}
|
|
898
|
+
else {
|
|
899
|
+
this._isDisabled = false;
|
|
900
|
+
}
|
|
901
|
+
if (this.isActive) {
|
|
902
|
+
this.repeaterService.activateItemByIndex(undefined);
|
|
903
|
+
}
|
|
904
|
+
if (this.elementRef.nativeElement.matches(':focus-within')) {
|
|
905
|
+
this.elementRef.nativeElement.ownerDocument.activeElement.blur();
|
|
906
|
+
}
|
|
907
|
+
this.changeDetector.markForCheck();
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
get disabled() {
|
|
911
|
+
return this._isDisabled;
|
|
868
912
|
}
|
|
869
913
|
/**
|
|
870
914
|
* Indicates whether the repeater item is expanded.
|
|
@@ -882,7 +926,7 @@ class SkyRepeaterItemComponent {
|
|
|
882
926
|
* @default false
|
|
883
927
|
*/
|
|
884
928
|
set isSelected(value) {
|
|
885
|
-
if (value !== this._isSelected) {
|
|
929
|
+
if (!this.disabled && value !== this._isSelected) {
|
|
886
930
|
this._isSelected = value;
|
|
887
931
|
this.isSelectedChange.emit(this._isSelected);
|
|
888
932
|
}
|
|
@@ -931,6 +975,74 @@ class SkyRepeaterItemComponent {
|
|
|
931
975
|
this.ngUnsubscribe.complete();
|
|
932
976
|
this.repeaterService.unregisterItem(this);
|
|
933
977
|
}
|
|
978
|
+
onKeydown($event) {
|
|
979
|
+
if ([' ', 'Enter', 'Home', 'End', 'ArrowUp', 'ArrowDown'].includes($event.key)) {
|
|
980
|
+
if ($event.target.matches('input, textarea, select, option, [contenteditable], [contenteditable] *')) {
|
|
981
|
+
return;
|
|
982
|
+
}
|
|
983
|
+
$event.preventDefault();
|
|
984
|
+
$event.stopPropagation();
|
|
985
|
+
let activateItem = undefined;
|
|
986
|
+
/* istanbul ignore else */
|
|
987
|
+
if ([' ', 'Enter'].includes($event.key)) {
|
|
988
|
+
if (this.selectable) {
|
|
989
|
+
this.isSelected = !this.isSelected;
|
|
990
|
+
}
|
|
991
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
992
|
+
activateItem = this;
|
|
993
|
+
}
|
|
994
|
+
/* istanbul ignore else */
|
|
995
|
+
if (['Home', 'End'].includes($event.key)) {
|
|
996
|
+
const items = this.repeaterService.items.filter((item) => !item.disabled);
|
|
997
|
+
if ($event.key === 'Home') {
|
|
998
|
+
activateItem = items.shift();
|
|
999
|
+
}
|
|
1000
|
+
else {
|
|
1001
|
+
activateItem = items.pop();
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
/* istanbul ignore else */
|
|
1005
|
+
if (['ArrowUp', 'ArrowDown'].includes($event.key)) {
|
|
1006
|
+
const currentIndex = this.repeaterService.items.findIndex((item) => item === this);
|
|
1007
|
+
let sliceFrom;
|
|
1008
|
+
let sliceTo;
|
|
1009
|
+
if ($event.key === 'ArrowUp') {
|
|
1010
|
+
sliceFrom = 0;
|
|
1011
|
+
sliceTo = currentIndex;
|
|
1012
|
+
}
|
|
1013
|
+
else {
|
|
1014
|
+
sliceFrom = currentIndex + 1;
|
|
1015
|
+
sliceTo = undefined;
|
|
1016
|
+
}
|
|
1017
|
+
const items = this.repeaterService.items
|
|
1018
|
+
.slice(sliceFrom, sliceTo)
|
|
1019
|
+
.filter((item) => !item.disabled);
|
|
1020
|
+
activateItem = $event.key === 'ArrowUp' ? items.pop() : items.shift();
|
|
1021
|
+
if (!activateItem) {
|
|
1022
|
+
// Wrap around.
|
|
1023
|
+
if ($event.key === 'ArrowDown') {
|
|
1024
|
+
sliceFrom = 0;
|
|
1025
|
+
sliceTo = currentIndex;
|
|
1026
|
+
}
|
|
1027
|
+
else {
|
|
1028
|
+
sliceFrom = currentIndex + 1;
|
|
1029
|
+
sliceTo = undefined;
|
|
1030
|
+
}
|
|
1031
|
+
const items = this.repeaterService.items
|
|
1032
|
+
.slice(sliceFrom, sliceTo)
|
|
1033
|
+
.filter((item) => !item.disabled);
|
|
1034
|
+
activateItem = $event.key === 'ArrowUp' ? items.pop() : items.shift();
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
/* istanbul ignore else */
|
|
1038
|
+
if (activateItem && !activateItem.isActive) {
|
|
1039
|
+
this.repeaterService.activateItem(activateItem);
|
|
1040
|
+
if (!activateItem.elementRef.nativeElement.matches(':focus-within')) {
|
|
1041
|
+
activateItem.elementRef.nativeElement.focus();
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
934
1046
|
headerClick() {
|
|
935
1047
|
if (this.isCollapsible) {
|
|
936
1048
|
this.updateForExpanded(!this.isExpanded, true);
|
|
@@ -1038,29 +1150,6 @@ class SkyRepeaterItemComponent {
|
|
|
1038
1150
|
this.reorderButtonLabel = this.reorderInstructions;
|
|
1039
1151
|
this.reorderState = undefined;
|
|
1040
1152
|
}
|
|
1041
|
-
onItemKeyDown(event) {
|
|
1042
|
-
/*istanbul ignore else */
|
|
1043
|
-
if (event.key) {
|
|
1044
|
-
switch (event.key.toLowerCase()) {
|
|
1045
|
-
case ' ':
|
|
1046
|
-
case 'enter':
|
|
1047
|
-
/* istanbul ignore else */
|
|
1048
|
-
/* Sanity check */
|
|
1049
|
-
// Space/enter should never execute unless focused on the parent item element.
|
|
1050
|
-
if (event.target === this.itemRef.nativeElement) {
|
|
1051
|
-
if (this.selectable) {
|
|
1052
|
-
this.isSelected = !this.isSelected;
|
|
1053
|
-
}
|
|
1054
|
-
this.repeaterService.activateItem(this);
|
|
1055
|
-
event.preventDefault();
|
|
1056
|
-
}
|
|
1057
|
-
break;
|
|
1058
|
-
/* istanbul ignore next */
|
|
1059
|
-
default:
|
|
1060
|
-
break;
|
|
1061
|
-
}
|
|
1062
|
-
}
|
|
1063
|
-
}
|
|
1064
1153
|
slideForExpanded(animate) {
|
|
1065
1154
|
this.slideDirection = this.isExpanded ? 'down' : 'up';
|
|
1066
1155
|
}
|
|
@@ -1113,11 +1202,15 @@ class SkyRepeaterItemComponent {
|
|
|
1113
1202
|
}
|
|
1114
1203
|
}
|
|
1115
1204
|
SkyRepeaterItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyRepeaterItemComponent, deps: [{ token: SkyRepeaterService }, { token: i0.ChangeDetectorRef }, { token: SkyRepeaterAdapterService }, { token: i0.ElementRef }, { token: i4.SkyLibResourcesService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1116
|
-
SkyRepeaterItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: SkyRepeaterItemComponent, selector: "sky-repeater-item", inputs: { 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: { 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 role=\"option\"\n [attr.aria-label]=\"itemName\"\n [attr.aria-selected]=\"selectable ? isSelected : null\"\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 (keydown)=\"onItemKeyDown($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 class=\"sky-repeater-item-left\">\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 [hidden]=\"titleRef.children.length === 0\"\n (click)=\"headerClick()\"\n >\n <div class=\"sky-repeater-item-title sky-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 ? ('skyux_repeater_item_expand' | skyLibResources: itemName)\n : ('skyux_repeater_item_expand_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 [@skyAnimationSlide]=\"slideDirection\"\n #itemContentRef\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;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-right:10px}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"], components: [{ type: i4$1.λ1, selector: "sky-inline-form", inputs: ["config", "template", "showForm"], outputs: ["close"] }, { type: i1.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { type: i6.λ3, selector: "sky-checkbox", inputs: ["label", "labelledBy", "id", "disabled", "tabindex", "name", "icon", "checkboxType", "checked", "required"], outputs: ["change", "checkedChange", "disabledChange"] }, { type: i1.λ2, selector: "sky-chevron", inputs: ["ariaControls", "ariaLabel", "direction", "disabled"], outputs: ["directionChange"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "skyLibResources": i4.SkyLibResourcesPipe }, animations: [skyAnimationSlide], encapsulation: i0.ViewEncapsulation.None });
|
|
1205
|
+
SkyRepeaterItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", 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: { "tabindex": "this.tabindex", "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 [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 class=\"sky-repeater-item-left\">\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 [hidden]=\"titleRef.children.length === 0\"\n (click)=\"headerClick()\"\n >\n <div\n class=\"sky-repeater-item-title sky-emphasized\"\n #titleRef\n [attr.role]=\"(itemRole$ | async).title\"\n >\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 ? ('skyux_repeater_item_expand' | skyLibResources: itemName)\n : ('skyux_repeater_item_expand_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 [@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;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-right:10px}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"], components: [{ type: i4$1.λ1, selector: "sky-inline-form", inputs: ["config", "template", "showForm"], outputs: ["close"] }, { type: i1.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { type: i6.λ3, selector: "sky-checkbox", inputs: ["label", "labelledBy", "id", "disabled", "tabindex", "name", "icon", "checkboxType", "checked", "required"], outputs: ["change", "checkedChange", "disabledChange"] }, { type: i1.λ2, selector: "sky-chevron", inputs: ["ariaControls", "ariaLabel", "direction", "disabled"], outputs: ["directionChange"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i2.AsyncPipe, "skyLibResources": i4.SkyLibResourcesPipe }, animations: [skyAnimationSlide], encapsulation: i0.ViewEncapsulation.None });
|
|
1117
1206
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyRepeaterItemComponent, decorators: [{
|
|
1118
1207
|
type: Component,
|
|
1119
|
-
args: [{ selector: 'sky-repeater-item', animations: [skyAnimationSlide], encapsulation: ViewEncapsulation.None, template: "<div\n class=\"sky-repeater-item sky-padding-even-default\"\n
|
|
1120
|
-
}], ctorParameters: function () { return [{ type: SkyRepeaterService }, { type: i0.ChangeDetectorRef }, { type: SkyRepeaterAdapterService }, { type: i0.ElementRef }, { type: i4.SkyLibResourcesService }]; }, propDecorators: {
|
|
1208
|
+
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 [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 class=\"sky-repeater-item-left\">\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 [hidden]=\"titleRef.children.length === 0\"\n (click)=\"headerClick()\"\n >\n <div\n class=\"sky-repeater-item-title sky-emphasized\"\n #titleRef\n [attr.role]=\"(itemRole$ | async).title\"\n >\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 ? ('skyux_repeater_item_expand' | skyLibResources: itemName)\n : ('skyux_repeater_item_expand_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 [@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;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-right:10px}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"] }]
|
|
1209
|
+
}], ctorParameters: function () { return [{ type: SkyRepeaterService }, { type: i0.ChangeDetectorRef }, { type: SkyRepeaterAdapterService }, { type: i0.ElementRef }, { type: i4.SkyLibResourcesService }]; }, propDecorators: { tabindex: [{
|
|
1210
|
+
type: HostBinding
|
|
1211
|
+
}], disabled: [{
|
|
1212
|
+
type: Input
|
|
1213
|
+
}], itemName: [{
|
|
1121
1214
|
type: Input
|
|
1122
1215
|
}], inlineFormConfig: [{
|
|
1123
1216
|
type: Input
|
|
@@ -1164,6 +1257,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
|
|
|
1164
1257
|
}], repeaterItemContentComponents: [{
|
|
1165
1258
|
type: ContentChildren,
|
|
1166
1259
|
args: [SkyRepeaterItemContentComponent]
|
|
1260
|
+
}], onKeydown: [{
|
|
1261
|
+
type: HostListener,
|
|
1262
|
+
args: ['keydown', ['$event']]
|
|
1167
1263
|
}] } });
|
|
1168
1264
|
|
|
1169
1265
|
let uniqueId = 0;
|
|
@@ -1276,6 +1372,7 @@ class SkyRepeaterComponent {
|
|
|
1276
1372
|
if (this.activeIndex !== undefined) {
|
|
1277
1373
|
this.repeaterService.activateItemByIndex(this.activeIndex);
|
|
1278
1374
|
}
|
|
1375
|
+
this.updateRole();
|
|
1279
1376
|
});
|
|
1280
1377
|
});
|
|
1281
1378
|
setTimeout(() => {
|
|
@@ -1283,6 +1380,7 @@ class SkyRepeaterComponent {
|
|
|
1283
1380
|
this.items.forEach((item) => {
|
|
1284
1381
|
item.reorderable = this.reorderable;
|
|
1285
1382
|
});
|
|
1383
|
+
this.updateRole();
|
|
1286
1384
|
}, 0);
|
|
1287
1385
|
}
|
|
1288
1386
|
ngOnChanges(changes) {
|
|
@@ -1297,6 +1395,7 @@ class SkyRepeaterComponent {
|
|
|
1297
1395
|
if (this.items) {
|
|
1298
1396
|
this.items.forEach((item) => (item.reorderable = this.reorderable));
|
|
1299
1397
|
}
|
|
1398
|
+
this.updateRole();
|
|
1300
1399
|
this.changeDetector.markForCheck();
|
|
1301
1400
|
}
|
|
1302
1401
|
}
|
|
@@ -1305,6 +1404,12 @@ class SkyRepeaterComponent {
|
|
|
1305
1404
|
this.ngUnsubscribe.complete();
|
|
1306
1405
|
this.destroyDragAndDrop();
|
|
1307
1406
|
}
|
|
1407
|
+
ngOnInit() {
|
|
1408
|
+
this.updateRole();
|
|
1409
|
+
}
|
|
1410
|
+
onCdkObserveContent() {
|
|
1411
|
+
this.updateRole();
|
|
1412
|
+
}
|
|
1308
1413
|
updateForExpandMode(itemAdded) {
|
|
1309
1414
|
if (this.items) {
|
|
1310
1415
|
let foundExpanded = false;
|
|
@@ -1323,6 +1428,7 @@ class SkyRepeaterComponent {
|
|
|
1323
1428
|
foundExpanded = true;
|
|
1324
1429
|
}
|
|
1325
1430
|
});
|
|
1431
|
+
this.updateRole();
|
|
1326
1432
|
}
|
|
1327
1433
|
}
|
|
1328
1434
|
initializeDragAndDrop() {
|
|
@@ -1389,12 +1495,62 @@ class SkyRepeaterComponent {
|
|
|
1389
1495
|
return item.tag !== undefined;
|
|
1390
1496
|
});
|
|
1391
1497
|
}
|
|
1498
|
+
updateRole() {
|
|
1499
|
+
var _a, _b;
|
|
1500
|
+
// Determine a role using a hierarchy based on https://www.w3.org/TR/wai-aria-practices-1.1/
|
|
1501
|
+
// 1. If there are one or more interactions in the repeater item projected content, use grid.
|
|
1502
|
+
// 2. If there are selectable repeater items and no other interactions, use listbox.
|
|
1503
|
+
// 3. If there are no interactions, use list.
|
|
1504
|
+
// Default to list role.
|
|
1505
|
+
let autoRole = 'list';
|
|
1506
|
+
const roleMap = {
|
|
1507
|
+
list: { item: 'listitem', title: undefined, content: undefined },
|
|
1508
|
+
listbox: { item: 'option', title: undefined, content: undefined },
|
|
1509
|
+
grid: { item: 'row', title: 'rowheader', content: 'gridcell' },
|
|
1510
|
+
};
|
|
1511
|
+
// Based on https://html.spec.whatwg.org/multipage/dom.html#interactive-content
|
|
1512
|
+
const interactionSelector = [
|
|
1513
|
+
'a[href]',
|
|
1514
|
+
'audio[controls]',
|
|
1515
|
+
'button',
|
|
1516
|
+
'details',
|
|
1517
|
+
'embed',
|
|
1518
|
+
'iframe',
|
|
1519
|
+
'img[usemap]',
|
|
1520
|
+
'input:not([type="hidden"])',
|
|
1521
|
+
'label',
|
|
1522
|
+
'select',
|
|
1523
|
+
'textarea',
|
|
1524
|
+
'video[controls]',
|
|
1525
|
+
'[contenteditable]',
|
|
1526
|
+
'.sky-repeater[role="grid"]',
|
|
1527
|
+
]
|
|
1528
|
+
.map((selector) => `sky-repeater-item-title ${selector}:not([hidden]), sky-repeater-item-content ${selector}:not([hidden])`)
|
|
1529
|
+
.concat([`skyux-dropdown`])
|
|
1530
|
+
.join(', ');
|
|
1531
|
+
const hasInteraction = this.reorderable ||
|
|
1532
|
+
((_a = this.items) === null || _a === void 0 ? void 0 : _a.some((item) => item.isCollapsible)) ||
|
|
1533
|
+
!!this.elementRef.nativeElement.querySelector(interactionSelector);
|
|
1534
|
+
if (hasInteraction) {
|
|
1535
|
+
// If the repeater matches interaction selector https://www.w3.org/TR/wai-aria-practices-1.1/#grid
|
|
1536
|
+
autoRole = 'grid';
|
|
1537
|
+
}
|
|
1538
|
+
else if ((_b = this.items) === null || _b === void 0 ? void 0 : _b.some((item) => item.selectable)) {
|
|
1539
|
+
// If the only interaction is select https://www.w3.org/TR/wai-aria-practices-1.1/#Listbox
|
|
1540
|
+
autoRole = 'listbox';
|
|
1541
|
+
}
|
|
1542
|
+
if (this.role !== autoRole) {
|
|
1543
|
+
this.repeaterService.itemRole.next(Object.assign({}, roleMap[autoRole]));
|
|
1544
|
+
this.role = `${autoRole}`;
|
|
1545
|
+
this.changeDetector.markForCheck();
|
|
1546
|
+
}
|
|
1547
|
+
}
|
|
1392
1548
|
}
|
|
1393
1549
|
SkyRepeaterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyRepeaterComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: SkyRepeaterService }, { token: SkyRepeaterAdapterService }, { token: i3$1.DragulaService }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
1394
|
-
SkyRepeaterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: SkyRepeaterComponent, selector: "sky-repeater", inputs: { activeIndex: "activeIndex", ariaLabel: "ariaLabel", reorderable: "reorderable", expandMode: "expandMode" }, outputs: { activeIndexChange: "activeIndexChange", orderChange: "orderChange" }, providers: [SkyRepeaterService, SkyRepeaterAdapterService], queries: [{ propertyName: "items", predicate: SkyRepeaterItemComponent }], usesOnChanges: true, ngImport: i0, template: "<ng-container #repeaterHost>\n <div\n class=\"sky-repeater\"\n role=\"
|
|
1550
|
+
SkyRepeaterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: SkyRepeaterComponent, selector: "sky-repeater", inputs: { activeIndex: "activeIndex", ariaLabel: "ariaLabel", reorderable: "reorderable", expandMode: "expandMode" }, outputs: { activeIndexChange: "activeIndexChange", orderChange: "orderChange" }, providers: [SkyRepeaterService, SkyRepeaterAdapterService], 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"], directives: [{ type: i3$1.DragulaDirective, selector: "[dragula]", inputs: ["dragula", "dragulaModel"], outputs: ["dragulaModelChange"] }, { type: i4$2.CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }], pipes: { "skyLibResources": i4.SkyLibResourcesPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1395
1551
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyRepeaterComponent, decorators: [{
|
|
1396
1552
|
type: Component,
|
|
1397
|
-
args: [{ selector: 'sky-repeater', providers: [SkyRepeaterService, SkyRepeaterAdapterService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container #repeaterHost>\n <div\n class=\"sky-repeater\"\n role=\"
|
|
1553
|
+
args: [{ selector: 'sky-repeater', providers: [SkyRepeaterService, SkyRepeaterAdapterService], 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"] }]
|
|
1398
1554
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: SkyRepeaterService }, { type: SkyRepeaterAdapterService }, { type: i3$1.DragulaService }, { type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { activeIndex: [{
|
|
1399
1555
|
type: Input
|
|
1400
1556
|
}], ariaLabel: [{
|
|
@@ -1421,6 +1577,7 @@ SkyRepeaterModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", versi
|
|
|
1421
1577
|
SkyRepeaterItemContextMenuComponent,
|
|
1422
1578
|
SkyRepeaterItemTitleComponent], imports: [CommonModule,
|
|
1423
1579
|
DragulaModule,
|
|
1580
|
+
ObserversModule,
|
|
1424
1581
|
SkyChevronModule,
|
|
1425
1582
|
SkyCheckboxModule,
|
|
1426
1583
|
SkyIconModule,
|
|
@@ -1433,6 +1590,7 @@ SkyRepeaterModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", versi
|
|
|
1433
1590
|
SkyRepeaterModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyRepeaterModule, providers: [DragulaService], imports: [[
|
|
1434
1591
|
CommonModule,
|
|
1435
1592
|
DragulaModule,
|
|
1593
|
+
ObserversModule,
|
|
1436
1594
|
SkyChevronModule,
|
|
1437
1595
|
SkyCheckboxModule,
|
|
1438
1596
|
SkyIconModule,
|
|
@@ -1452,6 +1610,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
|
|
|
1452
1610
|
imports: [
|
|
1453
1611
|
CommonModule,
|
|
1454
1612
|
DragulaModule,
|
|
1613
|
+
ObserversModule,
|
|
1455
1614
|
SkyChevronModule,
|
|
1456
1615
|
SkyCheckboxModule,
|
|
1457
1616
|
SkyIconModule,
|