UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

432 lines 81.5 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { CdkDrag, DragDrop, moveItemInArray, transferArrayItem, } from "@angular/cdk/drag-drop"; import { CdkVirtualScrollViewport } from "@angular/cdk/scrolling"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, Input, IterableDiffers, Output, QueryList, TemplateRef, ViewChild, ViewChildren, ViewEncapsulation, } from "@angular/core"; import _isEqual from "lodash/isEqual"; import { Subject } from "rxjs"; import { takeUntil, tap } from "rxjs/operators"; import { PaddingOptions, RepeatSelectionMode, } from "./types"; import { nameof } from "../../functions/nameof"; import { LoggerService } from "../../services/log-service"; import * as i0 from "@angular/core"; import * as i1 from "../../services/log-service"; import * as i2 from "@angular/cdk/drag-drop"; import * as i3 from "@angular/common"; import * as i4 from "../checkbox/checkbox.component"; import * as i5 from "../radio/radio-group.component"; import * as i6 from "@angular/cdk/scrolling"; import * as i7 from "./repeat-item/repeat-item.component"; /** * repeat is used for displaying of continuous rows. * It can be used in "single"/"radio" or "multi" selection mode * <example-url>./../examples/index.html#/repeat</example-url> */ export class RepeatComponent { /** * Turns on/off dragging functionality */ set draggable(value) { this._draggable = value; // make sure we initialize the list this.initializeCDKDropList(); if (this.dropListRef) { this.dropListRef.disabled = !this._draggable; } if (!this._draggable && this._reorderable) { this._reorderable = false; this.reorderableChange.emit(this._reorderable); } } get draggable() { return this._draggable; } /** * Turns on/off item reorder functionality */ set reorderable(value) { if (this._draggable === false) { this.logger.warn("'reorderable' property must be used only when draggable is true"); } // make item also draggable ONLY if we ever change it to sortable if (value && !this._draggable) { this._draggable = true; this.draggableChange.emit(value); } // update propriety ONLY if it actually changes if (this.dropListRef && this._reorderable !== value) { this.dropListRef.sortingDisabled = !value; } this._reorderable = value; } get reorderable() { return this._reorderable; } get viewportRef() { if (!this.virtualScroll) { throw new Error("VirtualScroll is not enabled"); } return this._viewportRef; } get role() { return this.selectionMode !== RepeatSelectionMode.none ? "listbox" : "list"; } get ariaMultiselectable() { return this.isModeMulti() || null; } constructor(changeDetector, logger, iterableDiffers, dragDropService, elRef) { this.changeDetector = changeDetector; this.logger = logger; this.iterableDiffers = iterableDiffers; this.dragDropService = dragDropService; this.elRef = elRef; // made event async to avoid ExpressionChangedAfterItHasBeenCheckedError this.draggableChange = new EventEmitter(true); this.reorderableChange = new EventEmitter(true); /** * This will stretch repeat items full width */ this.width = "100%"; /** * Prevent item bodies from capturing clicks */ this.preventRowClick = false; /** * Drag preview class that is applied on the previewed item * * This input is required since CDK adds the preview DOM element as the last child on the body; * without it all drag previews within a project would have the same style */ this.dragPreviewClass = "nui-dnd-preview"; /** * Possible values are 'single', 'radio', 'multi' and 'none' */ this.selectionMode = RepeatSelectionMode.none; /** * Enables virtual scroll feature. Requires @itemSize input to have a correct item size set. */ this.virtualScroll = false; /** * Selected repeat objects */ this.selection = []; /** * Is emitted when on items order has changed */ this.itemsReordered = new EventEmitter(); /** * Is selected item should be highlighted */ this.highlightSelectedItem = true; /** * Is emitted when another item in the repeat is selected */ this.selectionChange = new EventEmitter(); this.mousedOver = []; this.selectionHasChanged = false; /** Emits when the drop list has been destroyed. */ this.dropListDestroyed = new Subject(); this.intersectionObserverCallback = (entries, observer) => { if (entries[0].isIntersecting && this.virtualScroll) { // recheck the cdk viewport size in case the repeat is instantiated before becoming visible in the viewport (NUI-5820) this.viewportRef.checkViewportSize(); } }; } ngOnInit() { this.intersectionObserver = new IntersectionObserver(this.intersectionObserverCallback); if (this.elRef.nativeElement instanceof Element) { this.intersectionObserver.observe(this.elRef.nativeElement); } if (this.dragPreviewTemplateRef || this.dragHandleTemplateRef || this._reorderable === true) { this._draggable = true; this.draggableChange.emit(this._draggable); } this.paddingSize = this.paddingSize in PaddingOptions ? this.paddingSize : PaddingOptions.compact; if (!this.itemSize && this.virtualScroll) { this.logger.error("ERROR: To use virtual scroll feature please set correct value to the 'itemSize' input!"); } // Note: Using empty array as a fallback value to obtain a proper differ factory // when the itemsSource is not provided by parent at init. this.itemsSourceDiff = this.iterableDiffers .find(this.itemsSource || []) .create(); } ngDoCheck() { // Note: In case the input value have changed the CD will not be triggered because // of onPush strategy we have to check if array values changed manually and trigger CD. if (this.itemsSourceDiff.diff(this.itemsSource)) { this.changeDetector.markForCheck(); } } ngAfterViewInit() { this.initializeCDKDropList(); } /** * Cleanup CDK * PS: No need to unsubscribe from the EventEmitters, they are handled * automatically by Angular & RxJs */ ngOnDestroy() { this.intersectionObserver?.unobserve(this.elRef.nativeElement); this.disposeCDKDropList(); } update() { this.changeDetector.detectChanges(); } getFilters() { const response = { type: nameof("selection"), value: { selection: this.selection, itemsSource: this.itemsSource, selectionMode: this.selectionMode, selectionHasChanged: this.selectionHasChanged, }, }; this.selectionHasChanged = false; return response; } /** * Checks if repeat item is selected * @param item selected repeat item in repeat */ isItemSelected(item) { if (!this.highlightSelectedItem) { return false; } switch (this.selectionMode) { case RepeatSelectionMode.single: case RepeatSelectionMode.radio: case RepeatSelectionMode.singleWithRequiredSelection: case RepeatSelectionMode.radioWithNonRequiredSelection: return this.selection && _isEqual(item, this.selection[0]); case RepeatSelectionMode.multi: return Boolean(this.selection && this.selection.length && this.selection.indexOf(item) !== -1); default: return false; } } /** * repeat item is clicked * @param event * @param item value object that is used in nui-repeat-item */ itemClicked(event, item) { if (this.selectionMode === RepeatSelectionMode.none || this.isItemDisabled(item)) { return; } // prevent handling both from row and input event.stopImmediatePropagation(); event.stopPropagation(); event.preventDefault(); if (this.isModeMulti()) { this.selectionHasChanged = true; this.multiSelectionChanged(item); return; } if (this.selectionMode === RepeatSelectionMode.singleWithRequiredSelection || this.selectionMode === RepeatSelectionMode.radio) { this.selection = [item]; } if (this.selectionMode === RepeatSelectionMode.single || this.selectionMode === RepeatSelectionMode.radioWithNonRequiredSelection) { if (this.selection.indexOf(item) !== -1) { this.selection = []; } else { this.selection = [item]; } } this.changeDetector.markForCheck(); this.selectionHasChanged = true; this.selectionChange.emit(this.selection); } /** * nui-repeat-item selection change handler * @param item selected nui-repeat-item */ multiSelectionChanged(item) { if (this.selection.indexOf(item) === -1) { this.selection = [...this.selection, item]; } else { this.selection = this.selection.filter((selectionItem) => selectionItem !== item); } this.selectionChange.emit(this.selection); } isModeMulti() { return this.selectionMode === RepeatSelectionMode.multi; } isModeRadio() { return [ RepeatSelectionMode.radio, RepeatSelectionMode.radioWithNonRequiredSelection, ].includes(this.selectionMode); } /* START - ITEM BEHAVIOUR DECIDERS */ isItemClickable(item) { return !this.preventRowClick && !this.isItemDisabled(item); } isItemSelectable(item) { return !this.isItemDisabled(item); } isItemDisabled(item) { return (item.disabled ?? !!this.itemConfig?.isDisabled?.(item)); } isItemDraggable(item) { if (this.virtualScroll || this.isItemDisabled(item)) { return false; } // Note: Item cannot be draggable if the main draggable is off. if (this.itemConfig && this.draggable === false) { this.logger.warn(`Draggable config per item is available only when ${nameof("draggable")} is set to true`); return false; } return this.itemConfig?.isDraggable?.(item) ?? this.draggable; } /* END - ITEM BEHAVIOUR DECIDERS */ initializeCDKDropList() { if (!this.virtualScroll && this.dropListArea && this._draggable && !this.dropListRef) { this.dropListRef = this.dragDropService.createDropList(this.dropListArea); this.dropListRef.disabled = !this._draggable; this.dropListRef.data = this.itemsSource; // self-destroyed subscription this.dropListRef.dropped .pipe(tap((event) => this.itemDropped(event)), takeUntil(this.dropListDestroyed)) .subscribe(); this.dropListRef.withItems(this.draggableElements.map((item) => item._dragRef)); } } disposeCDKDropList() { if (this.dropListRef) { this.dropListRef.dispose(); this.dropListDestroyed.next(); this.dropListDestroyed.complete(); } } itemDropped(event) { // CDK retrieves incorrectly event.previousIndex so we need to compute it ourselves const item = event.item.data; const computedPreviousIndex = this.itemsSource.indexOf(item.data, 0); const oldSorting = [...this.itemsSource]; const newSorting = [...this.itemsSource]; let sortingOrderChanged = true; this.mousedOver = []; if (event.previousContainer === event.container) { moveItemInArray(newSorting, computedPreviousIndex, event.currentIndex); sortingOrderChanged = computedPreviousIndex !== event.currentIndex; } else { // moves the item from the source: event.container[computedPreviousIndex] to target: event.container.data[event.currentIndex] transferArrayItem(event.previousContainer.data, event.container.data, computedPreviousIndex, event.currentIndex); } if (sortingOrderChanged) { // trigger event only if position index or the container actually changed this.itemsReordered.emit({ item: item, previousIndex: computedPreviousIndex, currentIndex: event.currentIndex, currentState: newSorting, previousState: oldSorting, dropListRef: this.dropListRef, }); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RepeatComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.LoggerService }, { token: i0.IterableDiffers }, { token: i2.DragDrop }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: RepeatComponent, selector: "nui-repeat", inputs: { draggable: "draggable", reorderable: "reorderable", preventRowClick: "preventRowClick", repeatItemTemplateRef: "repeatItemTemplateRef", dragHandleTemplateRef: "dragHandleTemplateRef", dragPreviewClass: "dragPreviewClass", dragPreviewTemplateRef: "dragPreviewTemplateRef", actionsTemplateRef: "actionsTemplateRef", selectionMode: "selectionMode", paddingSize: "paddingSize", virtualScroll: "virtualScroll", itemSize: "itemSize", selection: "selection", itemConfig: "itemConfig", itemsSource: "itemsSource", highlightSelectedItem: "highlightSelectedItem" }, outputs: { draggableChange: "draggableChange", reorderableChange: "reorderableChange", itemsReordered: "itemsReordered", selectionChange: "selectionChange" }, host: { properties: { "class.virtual-scroll-viewport": "virtualScroll", "attr.role": "role", "attr.aria-multiselectable": "ariaMultiselectable", "style.width": "this.width" } }, viewQueries: [{ propertyName: "dropListArea", first: true, predicate: ["dropListArea"], descendants: true }, { propertyName: "_viewportRef", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "draggableElements", predicate: CdkDrag, descendants: true }], ngImport: i0, template: "<ng-template #repeatItems let-item=\"item\" let-itemIndex=\"itemIndex\">\n <nui-repeat-item\n class=\"repeat-group-item\"\n #drag=\"cdkDrag\"\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragPreviewClass]=\"dragPreviewClass\"\n [cdkDragDisabled]=\"!isItemDraggable(item)\"\n (rowClicked)=\"itemClicked($event, item)\"\n [clickable]=\"isItemClickable(item)\"\n [selectable]=\"isItemSelectable(item)\"\n [selected]=\"isItemSelected(item) && !isItemDisabled(item)\"\n [class.repeat-group-item--disabled]=\"isItemDisabled(item)\"\n [class.nui-dnd-without-drag-handle]=\"\n isItemDraggable(item) && !dragHandleTemplateRef\n \"\n [class.nui-dnd-raised-state]=\"\n isItemDraggable(item) && mousedOver[itemIndex]\n \"\n >\n <div\n *ngIf=\"dragHandleTemplateRef && !virtualScroll\"\n [class.hide]=\"!draggable\"\n [class.invisible]=\"!isItemDraggable(item)\"\n class=\"nui-repeat-item__controls-drag-handle align-self-center\"\n >\n <div\n cdkDragHandle\n (mouseover)=\"mousedOver[itemIndex] = true\"\n (mouseout)=\"mousedOver[itemIndex] = false\"\n [class.nui-dnd-handle]=\"!drag.disabled\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dragHandleTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n ></ng-container>\n </div>\n </div>\n <div\n *ngIf=\"dragPreviewTemplateRef && !virtualScroll\"\n class=\"nui-repeat-item__controls-drag-handle\"\n >\n <div\n *cdkDragPreview\n [class.nui-dnd-preview]=\"!isItemDisabled(item)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dragPreviewTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n ></ng-container>\n </div>\n </div>\n <div class=\"nui-repeat-item__controls-container\">\n <nui-checkbox\n *ngIf=\"isModeMulti()\"\n class=\"nui-repeat-item__checkbox\"\n [value]=\"item\"\n [checked]=\"isItemSelected(item)\"\n [disabled]=\"isItemDisabled(item)\"\n (valueChange)=\"itemClicked($event, item)\"\n >\n </nui-checkbox>\n <nui-radio\n *ngIf=\"isModeRadio()\"\n class=\"nui-repeat-item__radio\"\n [value]=\"item\"\n [checked]=\"isItemSelected(item)\"\n [disabled]=\"isItemDisabled(item)\"\n (click)=\"itemClicked($event, item)\"\n >\n </nui-radio>\n </div>\n <div class=\"nui-repeat-item__content-container\">\n <ng-container\n [ngTemplateOutlet]=\"repeatItemTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n ></ng-container>\n </div>\n <div\n class=\"nui-repeat-item__actions-container\"\n *ngIf=\"actionsTemplateRef\"\n >\n <ng-container\n [ngTemplateOutlet]=\"actionsTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n >\n </ng-container>\n </div>\n </nui-repeat-item>\n</ng-template>\n\n<div class=\"nui-repeat nui-repeat__{{ paddingSize }}\">\n <div class=\"nui-repeat-header\">\n <ng-content select=\"[repeatHeaderTemplate]\"></ng-content>\n </div>\n <ul #dropListArea class=\"repeat-group\" aria-dropeffect=\"move\">\n <div *ngIf=\"!virtualScroll\">\n <ng-container\n *ngFor=\"\n let sourceItem of itemsSource;\n trackBy: itemConfig?.trackBy;\n let itemIndex = index\n \"\n [ngTemplateOutlet]=\"repeatItems\"\n [ngTemplateOutletContext]=\"{\n item: sourceItem,\n itemIndex: itemIndex\n }\"\n ></ng-container>\n </div>\n <cdk-virtual-scroll-viewport\n [itemSize]=\"itemSize\"\n *ngIf=\"virtualScroll && itemSize\"\n >\n <ng-container\n *cdkVirtualFor=\"\n let sourceItem of itemsSource;\n templateCacheSize: 0\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"repeatItems\"\n [ngTemplateOutletContext]=\"{ item: sourceItem }\"\n ></ng-container>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n </ul>\n</div>\n", styles: [".nui .nui-repeat{height:inherit}.nui .nui-repeat__normal .nui-repeat-item{padding-top:5px;padding-bottom:5px}.nui .nui-repeat>ul>cdk-virtual-scroll-viewport{height:100%}.nui .nui-repeat__compact .nui-repeat-item{padding-top:0;padding-bottom:0}.nui .nui-repeat-header{color:var(--nui-color-text-default,#111);background-color:var(--nui-color-bg-light,#fff)}.nui .nui-repeat .repeat-group .nui-repeat-item{cursor:auto}.nui .nui-repeat .repeat-group .nui-repeat-item.nui-repeat-item--clickable{cursor:pointer}.nui .nui-repeat .repeat-group .nui-repeat-item.nui-repeat-item--clickable:hover:not(.nui-repeat-item--selected){border-color:var(--nui-color-line-default,#d9d9d9)}.nui .nui-repeat .repeat-group-item:first-child .nui-repeat-item{border-top:solid 1px;border-top-color:var(--nui-color-line-default,#d9d9d9)}.nui .nui-repeat .repeat-group{margin-bottom:0;padding-left:0;margin-left:0;height:inherit}.nui .nui-repeat .repeat-group-item{position:relative;display:block;color:var(--nui-color-text-default,#111);background-color:var(--nui-color-bg-light,#fff);-webkit-transition:box-shadow .4s;-o-transition:box-shadow .4s;transition:box-shadow .4s}.nui .nui-repeat .repeat-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.nui .nui-repeat .repeat-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.nui .nui-repeat .repeat-group-item:hover{cursor:pointer}.nui .nui-repeat .repeat-group-item:hover.nui-dnd-without-drag-handle:not(.cdk-drag-disabled){cursor:move;z-index:1;box-sizing:border-box;box-shadow:0 2px 10px 0 var(--nui-shadow-color, rgba(17, 17, 17, .3))}.nui .nui-repeat .repeat-group-item--disabled{color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3))}.nui .nui-repeat .repeat-group-item--disabled:hover{cursor:not-allowed}.nui .nui-repeat .nui-repeat-item{border-bottom:solid 1px;border-bottom-color:var(--nui-color-line-default,#d9d9d9)}@supports (-ms-ime-align: auto){.nui .nui-repeat .nui-repeat-item{margin-bottom:.5px}}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.CheckboxComponent, selector: "nui-checkbox", inputs: ["ariaLabel", "ariaLabelledby", "ariaDescribedby", "name", "title", "value", "hovered", "checked", "required", "hint", "disabled", "indeterminate"], outputs: ["valueChange"] }, { kind: "component", type: i5.RadioComponent, selector: "nui-radio", inputs: ["value", "hovered", "checked", "hint", "disabled", "ariaLabel"], outputs: ["valueChange"] }, { kind: "directive", type: i6.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i6.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i6.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i2.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "component", type: i7.RepeatItemComponent, selector: "nui-repeat-item", inputs: ["clickable", "nowrap", "selected", "selectable"], outputs: ["rowClicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RepeatComponent, decorators: [{ type: Component, args: [{ selector: "nui-repeat", changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { "[class.virtual-scroll-viewport]": "virtualScroll", "[attr.role]": "role", "[attr.aria-multiselectable]": "ariaMultiselectable", }, template: "<ng-template #repeatItems let-item=\"item\" let-itemIndex=\"itemIndex\">\n <nui-repeat-item\n class=\"repeat-group-item\"\n #drag=\"cdkDrag\"\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragPreviewClass]=\"dragPreviewClass\"\n [cdkDragDisabled]=\"!isItemDraggable(item)\"\n (rowClicked)=\"itemClicked($event, item)\"\n [clickable]=\"isItemClickable(item)\"\n [selectable]=\"isItemSelectable(item)\"\n [selected]=\"isItemSelected(item) && !isItemDisabled(item)\"\n [class.repeat-group-item--disabled]=\"isItemDisabled(item)\"\n [class.nui-dnd-without-drag-handle]=\"\n isItemDraggable(item) && !dragHandleTemplateRef\n \"\n [class.nui-dnd-raised-state]=\"\n isItemDraggable(item) && mousedOver[itemIndex]\n \"\n >\n <div\n *ngIf=\"dragHandleTemplateRef && !virtualScroll\"\n [class.hide]=\"!draggable\"\n [class.invisible]=\"!isItemDraggable(item)\"\n class=\"nui-repeat-item__controls-drag-handle align-self-center\"\n >\n <div\n cdkDragHandle\n (mouseover)=\"mousedOver[itemIndex] = true\"\n (mouseout)=\"mousedOver[itemIndex] = false\"\n [class.nui-dnd-handle]=\"!drag.disabled\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dragHandleTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n ></ng-container>\n </div>\n </div>\n <div\n *ngIf=\"dragPreviewTemplateRef && !virtualScroll\"\n class=\"nui-repeat-item__controls-drag-handle\"\n >\n <div\n *cdkDragPreview\n [class.nui-dnd-preview]=\"!isItemDisabled(item)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dragPreviewTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n ></ng-container>\n </div>\n </div>\n <div class=\"nui-repeat-item__controls-container\">\n <nui-checkbox\n *ngIf=\"isModeMulti()\"\n class=\"nui-repeat-item__checkbox\"\n [value]=\"item\"\n [checked]=\"isItemSelected(item)\"\n [disabled]=\"isItemDisabled(item)\"\n (valueChange)=\"itemClicked($event, item)\"\n >\n </nui-checkbox>\n <nui-radio\n *ngIf=\"isModeRadio()\"\n class=\"nui-repeat-item__radio\"\n [value]=\"item\"\n [checked]=\"isItemSelected(item)\"\n [disabled]=\"isItemDisabled(item)\"\n (click)=\"itemClicked($event, item)\"\n >\n </nui-radio>\n </div>\n <div class=\"nui-repeat-item__content-container\">\n <ng-container\n [ngTemplateOutlet]=\"repeatItemTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n ></ng-container>\n </div>\n <div\n class=\"nui-repeat-item__actions-container\"\n *ngIf=\"actionsTemplateRef\"\n >\n <ng-container\n [ngTemplateOutlet]=\"actionsTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n >\n </ng-container>\n </div>\n </nui-repeat-item>\n</ng-template>\n\n<div class=\"nui-repeat nui-repeat__{{ paddingSize }}\">\n <div class=\"nui-repeat-header\">\n <ng-content select=\"[repeatHeaderTemplate]\"></ng-content>\n </div>\n <ul #dropListArea class=\"repeat-group\" aria-dropeffect=\"move\">\n <div *ngIf=\"!virtualScroll\">\n <ng-container\n *ngFor=\"\n let sourceItem of itemsSource;\n trackBy: itemConfig?.trackBy;\n let itemIndex = index\n \"\n [ngTemplateOutlet]=\"repeatItems\"\n [ngTemplateOutletContext]=\"{\n item: sourceItem,\n itemIndex: itemIndex\n }\"\n ></ng-container>\n </div>\n <cdk-virtual-scroll-viewport\n [itemSize]=\"itemSize\"\n *ngIf=\"virtualScroll && itemSize\"\n >\n <ng-container\n *cdkVirtualFor=\"\n let sourceItem of itemsSource;\n templateCacheSize: 0\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"repeatItems\"\n [ngTemplateOutletContext]=\"{ item: sourceItem }\"\n ></ng-container>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n </ul>\n</div>\n", styles: [".nui .nui-repeat{height:inherit}.nui .nui-repeat__normal .nui-repeat-item{padding-top:5px;padding-bottom:5px}.nui .nui-repeat>ul>cdk-virtual-scroll-viewport{height:100%}.nui .nui-repeat__compact .nui-repeat-item{padding-top:0;padding-bottom:0}.nui .nui-repeat-header{color:var(--nui-color-text-default,#111);background-color:var(--nui-color-bg-light,#fff)}.nui .nui-repeat .repeat-group .nui-repeat-item{cursor:auto}.nui .nui-repeat .repeat-group .nui-repeat-item.nui-repeat-item--clickable{cursor:pointer}.nui .nui-repeat .repeat-group .nui-repeat-item.nui-repeat-item--clickable:hover:not(.nui-repeat-item--selected){border-color:var(--nui-color-line-default,#d9d9d9)}.nui .nui-repeat .repeat-group-item:first-child .nui-repeat-item{border-top:solid 1px;border-top-color:var(--nui-color-line-default,#d9d9d9)}.nui .nui-repeat .repeat-group{margin-bottom:0;padding-left:0;margin-left:0;height:inherit}.nui .nui-repeat .repeat-group-item{position:relative;display:block;color:var(--nui-color-text-default,#111);background-color:var(--nui-color-bg-light,#fff);-webkit-transition:box-shadow .4s;-o-transition:box-shadow .4s;transition:box-shadow .4s}.nui .nui-repeat .repeat-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.nui .nui-repeat .repeat-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.nui .nui-repeat .repeat-group-item:hover{cursor:pointer}.nui .nui-repeat .repeat-group-item:hover.nui-dnd-without-drag-handle:not(.cdk-drag-disabled){cursor:move;z-index:1;box-sizing:border-box;box-shadow:0 2px 10px 0 var(--nui-shadow-color, rgba(17, 17, 17, .3))}.nui .nui-repeat .repeat-group-item--disabled{color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3))}.nui .nui-repeat .repeat-group-item--disabled:hover{cursor:not-allowed}.nui .nui-repeat .nui-repeat-item{border-bottom:solid 1px;border-bottom-color:var(--nui-color-line-default,#d9d9d9)}@supports (-ms-ime-align: auto){.nui .nui-repeat .nui-repeat-item{margin-bottom:.5px}}\n"] }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.LoggerService }, { type: i0.IterableDiffers }, { type: i2.DragDrop }, { type: i0.ElementRef }], propDecorators: { draggable: [{ type: Input }], reorderable: [{ type: Input }], draggableChange: [{ type: Output }], reorderableChange: [{ type: Output }], width: [{ type: HostBinding, args: ["style.width"] }], preventRowClick: [{ type: Input }], repeatItemTemplateRef: [{ type: Input }], dragHandleTemplateRef: [{ type: Input }], dragPreviewClass: [{ type: Input }], dragPreviewTemplateRef: [{ type: Input }], actionsTemplateRef: [{ type: Input }], selectionMode: [{ type: Input }], paddingSize: [{ type: Input }], virtualScroll: [{ type: Input }], itemSize: [{ type: Input }], selection: [{ type: Input }], itemsReordered: [{ type: Output }], itemConfig: [{ type: Input }], itemsSource: [{ type: Input }], highlightSelectedItem: [{ type: Input }], selectionChange: [{ type: Output }], dropListArea: [{ type: ViewChild, args: ["dropListArea"] }], _viewportRef: [{ type: ViewChild, args: [CdkVirtualScrollViewport] }], draggableElements: [{ type: ViewChildren, args: [CdkDrag] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVwZWF0L3JlcGVhdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3JlcGVhdC9yZXBlYXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFDSCxPQUFPLEVBQ1AsUUFBUSxFQUdSLGVBQWUsRUFFZixpQkFBaUIsR0FDcEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUVMLGVBQWUsRUFHZixNQUFNLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEQsT0FBTyxFQUlILGNBQWMsRUFDZCxtQkFBbUIsR0FDdEIsTUFB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QkFBOUIsS0FBSztnQkFLRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBS1UsYUFBYTtzQkFBNUIsS0FBSztnQkFRVSxXQUFXO3NCQUExQixLQUFLO2dCQUtVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBT1UsUUFBUTtzQkFBdkIsS0FBSztnQkFLVSxTQUFTO3NCQUF4QixLQUFLO2dCQUtXLGNBQWM7c0JBQTlCLE1BQU07Z0JBT1MsVUFBVTtzQkFBekIsS0FBSztnQkFLVSxXQUFXO3NCQUExQixLQUFLO2dCQUtVLHFCQUFxQjtzQkFBcEMsS0FBSztnQkFLVyxlQUFlO3NCQUEvQixNQUFNO2dCQUVvQixZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBU2pCLFlBQVk7c0JBRG5CLFNBQVM7dUJBQUMsd0JBQXdCO2dCQVNaLGlCQUFpQjtzQkFBdkMsWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxF