import {Component, AfterViewChecked, EventEmitter, Output, Input} from "@angular/core"; import {TableCell} from "../shared/tableCell"; import {TableRow} from "../shared/tableRow"; import {EditedObject} from "../shared/editedObject"; import {EditableObject} from "../shared/editableObject"; declare var jQuery: any; declare var swal: any; @Component({ selector: 'editable-table', templateUrl: './editable-table.component.html', styleUrls: ['./editable-table.component.css'] }) export class EditableTableComponent implements AfterViewChecked { @Input() private limit: number; @Input() private loadingData: boolean; @Output() objectEdited = new EventEmitter(); @Output() objectDeleted = new EventEmitter(); private editedObject: EditedObject; private initialized = false; private _data: Array; private _columnNames: Array; private pageNumber: number; private totalPages: number; constructor() { } ngOnInit() { this.pageNumber = 1; this.totalPages = 1; } @Input('data') set data(value) { this._data = value; if (value) { this.initialized = false; this.pageNumber = 1; this.totalPages = Math.ceil(value.length / this.limit); } } @Input('columnNames') set columnNames(value: Array) { value.push("Remove") this._columnNames = value; } get columnNames(): Array { return this._columnNames; } getData() { if (this._data) { let end = 0; this.pageNumber * this.limit > this._data.length ? end = this._data.length : end = this.pageNumber * this.limit; let start = (this.pageNumber - 1) * this.limit; return this._data.slice(start, end); } else { return this._data; } } increasePageNumber() { this.pageNumber < this.totalPages ? this.pageNumber++ : this.pageNumber = 1; this.initialized = false; } decreasePageNumber() { this.pageNumber === 1 ? this.pageNumber = this.totalPages : this.pageNumber--; this.initialized = false; } ngAfterViewChecked() { if (!this.initialized) { this.init(); } } init() { this.initialized = true; } onEdit(rowId: string, editable: EditableObject) { let that = this; swal({ input: 'text', text: 'Enter new value', inputPlaceholder: editable.getValue(), showCancelButton: true, inputValidator: function (value) { return new Promise(function (resolve, reject) { if (value) { let editObject = new EditedObject(rowId, editable); if (editable.getValue() === value.trim()) { reject('Cannot updat to the same value.'); } else { let object = editObject.getEditableObject(); object.setValue(value.trim()); that.objectEdited.emit(editObject); resolve(); } } else { reject('New value cannot be empty!'); } }); } }).catch(function (err) { console.log("Promise Rejected:" + err); }); } onRemove(index: number, row: TableRow) { let that = this; swal({ title: 'Are you sure?', text: "You won't be able to revert this!", type: 'warning', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: 'Yes, delete it!' }).then(function () { if (index) { that._data.splice(index, 1); } that.objectDeleted.emit(row.getId()); }).catch(function (err) { console.log("Promise Rejected:" + err); }); } }