nts-ng2-components
Version:
Paquete de componentes para Angular2 desarrollado por NITSNETS.
106 lines (94 loc) • 3.29 kB
text/typescript
import { Component, EventEmitter, Input, OnChanges, Output } from '@angular/core';
import { NtsListItem } from './list.component';
import { objEquals } from '../../../utils';
export interface NtsListItem {
name: string;
icon: string;
}
export class NtsListComponent implements OnChanges {
local = true;
sortable: any;
selectable = false;
deletable = false;
placeholder: string;
defaultSortableOptions = {
animation: 150,
handle: 'inactive',
onSort: (evt) => this.onSort(evt),
};
sortableOptions = this.defaultSortableOptions;
itemSelected: NtsListItem;
itemSelectedChange = new EventEmitter<NtsListItem>();
data: NtsListItem[];
delete = new EventEmitter<{ index: number, item: NtsListItem }>();
edit = new EventEmitter<{ index: number, item: NtsListItem }>();
sort = new EventEmitter<NtsListItem[]>();
// Double click handlers
preventDoubleclick = false;
preventClick = false;
timer: NodeJS.Timer;
delay = 300;
ngOnChanges(changes) {
if (changes.sortable) {
if (this.sortable) {
this.sortableOptions = Object.assign(this.sortableOptions, this.sortable === true ? {} : this.sortable);
this.sortableOptions.handle = '.drag-handle';
} else {
this.sortableOptions = this.defaultSortableOptions;
}
}
}
onSort(event) {
this.sort.emit(this.data);
}
onClick(item: NtsListItem) {
this.preventDoubleclick = false;
const lastSelected = this.itemSelected;
if (!this.selectable) { return; }
if (this.local) {
this.itemSelected = item;
}
this.timer = setTimeout(
_ => {
if (!this.preventClick) {
this.itemSelectedChange.emit(item);
} else {
this.itemSelected = lastSelected;
}
this.preventClick = false;
}, this.delay
);
}
onDoubleclick(item: NtsListItem) {
if (this.preventDoubleclick) { return false; }
clearTimeout(this.timer);
this.preventClick = true;
this.data.map(s => s['editing'] = false);
item['editing'] = true;
item['newname'] = item.name;
}
onEdit(index: number, item: NtsListItem) {
item.name = item['newname'];
item['editing'] = false;
this.edit.emit({ index, item });
}
onDelete(index: number, item: NtsListItem, e: MouseEvent) {
if (!this.deletable) { return; }
e.stopPropagation();
this.preventDoubleclick = true;
if (this.local) {
this.data.splice(index, 1);
}
this.delete.emit({ index, item });
}
isSelected(item: NtsListItem): boolean {
if (!this.itemSelected) { return false; }
if (item['id'] && this.itemSelected['id'] && item['id'] === this.itemSelected['id']) { return true; }
return objEquals(this.itemSelected, item);
}
}