primeng
Version:
[](https://opensource.org/licenses/MIT) [](https://badge.fury.io/js/primeng) [ • 15.9 kB
JavaScript
import { EventEmitter, ElementRef, Input, Output, ViewChild, ContentChildren, Component, ChangeDetectionStrategy, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ButtonModule } from 'primeng/button';
import { PrimeTemplate, SharedModule } from 'primeng/api';
import { DomHandler } from 'primeng/dom';
import { ObjectUtils, FilterUtils } from 'primeng/utils';
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
let OrderList = class OrderList {
constructor(el) {
this.el = el;
this.metaKeySelection = true;
this.controlsPosition = 'left';
this.filterMatchMode = "contains";
this.selectionChange = new EventEmitter();
this.trackBy = (index, item) => item;
this.onReorder = new EventEmitter();
this.onSelectionChange = new EventEmitter();
this.onFilterEvent = new EventEmitter();
}
get selection() {
return this._selection;
}
set selection(val) {
this._selection = val;
}
ngAfterContentInit() {
this.templates.forEach((item) => {
switch (item.getType()) {
case 'item':
this.itemTemplate = item.template;
break;
default:
this.itemTemplate = item.template;
break;
}
});
}
ngAfterViewChecked() {
if (this.movedUp || this.movedDown) {
let listItems = DomHandler.find(this.listViewChild.nativeElement, 'li.ui-state-highlight');
let listItem;
if (listItems.length > 0) {
if (this.movedUp)
listItem = listItems[0];
else
listItem = listItems[listItems.length - 1];
DomHandler.scrollInView(this.listViewChild.nativeElement, listItem);
}
this.movedUp = false;
this.movedDown = false;
}
}
get value() {
return this._value;
}
set value(val) {
this._value = val;
if (this.filterValue) {
this.filter();
}
}
onItemClick(event, item, index) {
this.itemTouched = false;
let selectedIndex = ObjectUtils.findIndexInList(item, this.selection);
let selected = (selectedIndex != -1);
let metaSelection = this.itemTouched ? false : this.metaKeySelection;
if (metaSelection) {
let metaKey = (event.metaKey || event.ctrlKey || event.shiftKey);
if (selected && metaKey) {
this._selection = this._selection.filter((val, index) => index !== selectedIndex);
}
else {
this._selection = (metaKey) ? this._selection ? [...this._selection] : [] : [];
ObjectUtils.insertIntoOrderedArray(item, index, this._selection, this.value);
}
}
else {
if (selected) {
this._selection = this._selection.filter((val, index) => index !== selectedIndex);
}
else {
this._selection = this._selection ? [...this._selection] : [];
ObjectUtils.insertIntoOrderedArray(item, index, this._selection, this.value);
}
}
//binding
this.selectionChange.emit(this._selection);
//event
this.onSelectionChange.emit({ originalEvent: event, value: this._selection });
}
onFilterKeyup(event) {
this.filterValue = event.target.value.trim().toLowerCase();
this.filter();
this.onFilterEvent.emit({
originalEvent: event,
value: this.visibleOptions
});
}
filter() {
let searchFields = this.filterBy.split(',');
this.visibleOptions = FilterUtils.filter(this.value, searchFields, this.filterValue, this.filterMatchMode);
}
isItemVisible(item) {
if (this.filterValue && this.filterValue.trim().length) {
for (let i = 0; i < this.visibleOptions.length; i++) {
if (item == this.visibleOptions[i]) {
return true;
}
}
}
else {
return true;
}
}
onItemTouchEnd(event) {
this.itemTouched = true;
}
isSelected(item) {
return ObjectUtils.findIndexInList(item, this.selection) != -1;
}
moveUp(event) {
if (this.selection) {
for (let i = 0; i < this.selection.length; i++) {
let selectedItem = this.selection[i];
let selectedItemIndex = ObjectUtils.findIndexInList(selectedItem, this.value);
if (selectedItemIndex != 0) {
let movedItem = this.value[selectedItemIndex];
let temp = this.value[selectedItemIndex - 1];
this.value[selectedItemIndex - 1] = movedItem;
this.value[selectedItemIndex] = temp;
}
else {
break;
}
}
this.movedUp = true;
this.onReorder.emit(event);
}
}
moveTop(event) {
if (this.selection) {
for (let i = this.selection.length - 1; i >= 0; i--) {
let selectedItem = this.selection[i];
let selectedItemIndex = ObjectUtils.findIndexInList(selectedItem, this.value);
if (selectedItemIndex != 0) {
let movedItem = this.value.splice(selectedItemIndex, 1)[0];
this.value.unshift(movedItem);
}
else {
break;
}
}
this.onReorder.emit(event);
this.listViewChild.nativeElement.scrollTop = 0;
}
}
moveDown(event) {
if (this.selection) {
for (let i = this.selection.length - 1; i >= 0; i--) {
let selectedItem = this.selection[i];
let selectedItemIndex = ObjectUtils.findIndexInList(selectedItem, this.value);
if (selectedItemIndex != (this.value.length - 1)) {
let movedItem = this.value[selectedItemIndex];
let temp = this.value[selectedItemIndex + 1];
this.value[selectedItemIndex + 1] = movedItem;
this.value[selectedItemIndex] = temp;
}
else {
break;
}
}
this.movedDown = true;
this.onReorder.emit(event);
}
}
moveBottom(event) {
if (this.selection) {
for (let i = 0; i < this.selection.length; i++) {
let selectedItem = this.selection[i];
let selectedItemIndex = ObjectUtils.findIndexInList(selectedItem, this.value);
if (selectedItemIndex != (this.value.length - 1)) {
let movedItem = this.value.splice(selectedItemIndex, 1)[0];
this.value.push(movedItem);
}
else {
break;
}
}
this.onReorder.emit(event);
this.listViewChild.nativeElement.scrollTop = this.listViewChild.nativeElement.scrollHeight;
}
}
onDragStart(event, index) {
event.dataTransfer.setData('text', 'b'); // For firefox
event.target.blur();
this.dragging = true;
this.draggedItemIndex = index;
}
onDragOver(event, index) {
if (this.dragging && this.draggedItemIndex !== index && this.draggedItemIndex + 1 !== index) {
this.dragOverItemIndex = index;
event.preventDefault();
}
}
onDragLeave(event) {
this.dragOverItemIndex = null;
}
onDrop(event, index) {
let dropIndex = (this.draggedItemIndex > index) ? index : (index === 0) ? 0 : index - 1;
ObjectUtils.reorderArray(this.value, this.draggedItemIndex, dropIndex);
this.dragOverItemIndex = null;
this.onReorder.emit(event);
event.preventDefault();
}
onDragEnd(event) {
this.dragging = false;
}
onListMouseMove(event) {
if (this.dragging) {
let offsetY = this.listViewChild.nativeElement.getBoundingClientRect().top + document.body.scrollTop;
let bottomDiff = (offsetY + this.listViewChild.nativeElement.clientHeight) - event.pageY;
let topDiff = (event.pageY - offsetY);
if (bottomDiff < 25 && bottomDiff > 0)
this.listViewChild.nativeElement.scrollTop += 15;
else if (topDiff < 25 && topDiff > 0)
this.listViewChild.nativeElement.scrollTop -= 15;
}
}
onItemKeydown(event, item, index) {
let listItem = event.currentTarget;
switch (event.which) {
//down
case 40:
var nextItem = this.findNextItem(listItem);
if (nextItem) {
nextItem.focus();
}
event.preventDefault();
break;
//up
case 38:
var prevItem = this.findPrevItem(listItem);
if (prevItem) {
prevItem.focus();
}
event.preventDefault();
break;
//enter
case 13:
this.onItemClick(event, item, index);
event.preventDefault();
break;
}
}
findNextItem(item) {
let nextItem = item.nextElementSibling;
if (nextItem)
return !DomHandler.hasClass(nextItem, 'ui-orderlist-item') || DomHandler.isHidden(nextItem) ? this.findNextItem(nextItem) : nextItem;
else
return null;
}
findPrevItem(item) {
let prevItem = item.previousElementSibling;
if (prevItem)
return !DomHandler.hasClass(prevItem, 'ui-orderlist-item') || DomHandler.isHidden(prevItem) ? this.findPrevItem(prevItem) : prevItem;
else
return null;
}
};
OrderList.ctorParameters = () => [
{ type: ElementRef }
];
__decorate([
Input()
], OrderList.prototype, "header", void 0);
__decorate([
Input()
], OrderList.prototype, "style", void 0);
__decorate([
Input()
], OrderList.prototype, "styleClass", void 0);
__decorate([
Input()
], OrderList.prototype, "listStyle", void 0);
__decorate([
Input()
], OrderList.prototype, "responsive", void 0);
__decorate([
Input()
], OrderList.prototype, "filterBy", void 0);
__decorate([
Input()
], OrderList.prototype, "filterPlaceholder", void 0);
__decorate([
Input()
], OrderList.prototype, "metaKeySelection", void 0);
__decorate([
Input()
], OrderList.prototype, "dragdrop", void 0);
__decorate([
Input()
], OrderList.prototype, "controlsPosition", void 0);
__decorate([
Input()
], OrderList.prototype, "ariaFilterLabel", void 0);
__decorate([
Input()
], OrderList.prototype, "filterMatchMode", void 0);
__decorate([
Output()
], OrderList.prototype, "selectionChange", void 0);
__decorate([
Input()
], OrderList.prototype, "trackBy", void 0);
__decorate([
Output()
], OrderList.prototype, "onReorder", void 0);
__decorate([
Output()
], OrderList.prototype, "onSelectionChange", void 0);
__decorate([
Output()
], OrderList.prototype, "onFilterEvent", void 0);
__decorate([
ViewChild('listelement')
], OrderList.prototype, "listViewChild", void 0);
__decorate([
ContentChildren(PrimeTemplate)
], OrderList.prototype, "templates", void 0);
__decorate([
Input()
], OrderList.prototype, "selection", null);
__decorate([
Input()
], OrderList.prototype, "value", null);
OrderList = __decorate([
Component({
selector: 'p-orderList',
template: `
<div [ngClass]="{'ui-orderlist ui-widget': true, 'ui-orderlist-controls-left': controlsPosition === 'left',
'ui-orderlist-controls-right': controlsPosition === 'right'}" [ngStyle]="style" [class]="styleClass">
<div class="ui-orderlist-controls">
<button type="button" pButton icon="pi pi-angle-up" (click)="moveUp($event)"></button>
<button type="button" pButton icon="pi pi-angle-double-up" (click)="moveTop($event)"></button>
<button type="button" pButton icon="pi pi-angle-down" (click)="moveDown($event)"></button>
<button type="button" pButton icon="pi pi-angle-double-down" (click)="moveBottom($event)"></button>
</div>
<div class="ui-orderlist-list-container">
<div class="ui-orderlist-caption ui-widget-header ui-corner-top" *ngIf="header">{{header}}</div>
<div class="ui-orderlist-filter-container ui-widget-content" *ngIf="filterBy">
<input type="text" role="textbox" (keyup)="onFilterKeyup($event)" class="ui-inputtext ui-widget ui-state-default ui-corner-all" [attr.placeholder]="filterPlaceholder" [attr.aria-label]="ariaFilterLabel">
<span class="ui-orderlist-filter-icon pi pi-search"></span>
</div>
<ul #listelement class="ui-widget-content ui-orderlist-list ui-corner-bottom" [ngStyle]="listStyle" (dragover)="onListMouseMove($event)">
<ng-template ngFor [ngForTrackBy]="trackBy" let-item [ngForOf]="value" let-i="index" let-l="last">
<li class="ui-orderlist-droppoint" *ngIf="dragdrop && isItemVisible(item)" (dragover)="onDragOver($event, i)" (drop)="onDrop($event, i)" (dragleave)="onDragLeave($event)"
[ngClass]="{'ui-orderlist-droppoint-highlight': (i === dragOverItemIndex)}"></li>
<li class="ui-orderlist-item" tabindex="0"
[ngClass]="{'ui-state-highlight':isSelected(item)}"
(click)="onItemClick($event,item,i)" (touchend)="onItemTouchEnd($event)" (keydown)="onItemKeydown($event,item,i)"
[style.display]="isItemVisible(item) ? 'block' : 'none'" role="option" [attr.aria-selected]="isSelected(item)"
[draggable]="dragdrop" (dragstart)="onDragStart($event, i)" (dragend)="onDragEnd($event)">
<ng-container *ngTemplateOutlet="itemTemplate; context: {$implicit: item, index: i}"></ng-container>
</li>
<li class="ui-orderlist-droppoint" *ngIf="dragdrop && l" (dragover)="onDragOver($event, i + 1)" (drop)="onDrop($event, i + 1)" (dragleave)="onDragLeave($event)"
[ngClass]="{'ui-orderlist-droppoint-highlight': (i + 1 === dragOverItemIndex)}"></li>
</ng-template>
</ul>
</div>
</div>
`,
changeDetection: ChangeDetectionStrategy.Default
})
], OrderList);
let OrderListModule = class OrderListModule {
};
OrderListModule = __decorate([
NgModule({
imports: [CommonModule, ButtonModule, SharedModule],
exports: [OrderList, SharedModule],
declarations: [OrderList]
})
], OrderListModule);
/**
* Generated bundle index. Do not edit.
*/
export { OrderList, OrderListModule };
//# sourceMappingURL=primeng-orderlist.js.map