UNPKG

angular-json-table

Version:

Angular JSON Table is an Angular 2+ module to populate tables from the JSON data provided

240 lines (239 loc) 19.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, EventEmitter, Input, Output } from '@angular/core'; var DataTableComponent = /** @class */ (function () { function DataTableComponent() { this.deleteRow = new EventEmitter(); this.updateRow = new EventEmitter(); this.data = {}; this.displayed = []; this.perpage = 10; this.page = 1; this.checked = []; this.checkAll = false; this.dialogue = false; this.dialogeData = {}; } /** * @return {?} */ DataTableComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.processData(); }; /** * @param {?} e * @param {?} id * @return {?} */ DataTableComponent.prototype.selected = /** * @param {?} e * @param {?} id * @return {?} */ function (e, id) { if (e.target.checked) { this.checked.push(id); } }; /** * @return {?} */ DataTableComponent.prototype.deleteSelected = /** * @return {?} */ function () { var _this = this; if (this.checked.length > 0) { this.deleteRow.emit(this.checked); this.dataSource = this.dataSource.filter(function (value, index, array) { return !_this.checked.includes(value.id); }); this.checked = []; this.paginate(this.page); } }; /** * @return {?} */ DataTableComponent.prototype.totalItems = /** * @return {?} */ function () { if (this.total > this.perpage) { return Math.ceil(this.total / this.perpage); } else { return 1; } }; /** * @param {?} page * @return {?} */ DataTableComponent.prototype.paginate = /** * @param {?} page * @return {?} */ function (page) { /** @type {?} */ var start = (this.perpage * page) - this.perpage; /** @type {?} */ var end = (this.perpage * page); // console.log(start, end); this.data['data'] = this.dataSource.slice(start, end); // console.log(this.data); }; /** * @param {?} perPage * @return {?} */ DataTableComponent.prototype.pageOnChange = /** * @param {?} perPage * @return {?} */ function (perPage) { this.perpage = perPage; this.page = 1; //console.log(perPage); this.paginate(this.page); }; /** * @return {?} */ DataTableComponent.prototype.previousPage = /** * @return {?} */ function () { if (this.page > 1) { this.page--; } this.paginate(this.page); }; /** * @return {?} */ DataTableComponent.prototype.nextPage = /** * @return {?} */ function () { if (this.page + 1 <= this.totalItems()) { this.page++; } this.paginate(this.page); }; /** * @param {?} id * @return {?} */ DataTableComponent.prototype.showUpdate = /** * @param {?} id * @return {?} */ function (id) { var _this = this; this.dialogue = true; // console.log('Showing the updates'); this.data.data.forEach(function (value) { if (value.id === id) { _this.dialogeData = value; } }); }; /** * @return {?} */ DataTableComponent.prototype.closeDialogue = /** * @return {?} */ function () { this.dialogue ? this.dialogue = false : this.dialogue = true; this.dialogeData = {}; }; /** * @param {?} dialogeData * @return {?} */ DataTableComponent.prototype.submitUpdateRow = /** * @param {?} dialogeData * @return {?} */ function (dialogeData) { this.updateRow.emit(dialogeData); }; /** * @return {?} */ DataTableComponent.prototype.processData = /** * @return {?} */ function () { if (this.dataSource && this.dataSource.length > 0) { this.total = this.dataSource.length; if (this.headers.thead && this.headers.thead.length > 0) { this.data['headers'] = this.headers.thead; this.displayed = this.headers.displayed; } else { console.warn('No headers data for table provided'); } this.paginate(this.page); } else { console.warn('No data for table provided'); } }; DataTableComponent.decorators = [ { type: Component, args: [{ selector: 'json-table', template: "<div *ngIf=\"data\" class=\"data-table\">\n <div *ngIf=\"false\">\n <input type=\"text\" class=\"search\" placeholder=\"Search for details\">\n </div>\n <table>\n <thead>\n <tr>\n <th style=\"width: 4%\">&nbsp;</th>\n <th style=\"width: 4%\">#</th>\n <th *ngFor=\"let header of data.headers\" style=\"text-align:left\">{{header}}</th>\n <th *ngIf=\"update\">&nbsp;</th>\n </tr>\n </thead>\n <tbody>\n\n <tr *ngFor=\"let row of data.data; let i = index\">\n <td><input type=\"checkbox\" [checked]=\"checkAll\" (change)=\"selected($event,row.id)\"></td>\n <td>{{ i+1 }}</td>\n <td *ngFor=\"let attr of displayed\" >{{row[attr]}}</td>\n <td *ngIf=\"update\" style=\"text-align:center\">\n <span (click)=\"showUpdate(row.id)\">\uD83D\uDD89</span>\n </td>\n </tr>\n\n </tbody>\n <tfoot></tfoot>\n </table>\n\n <div class=\"footer\">\n <div class=\"delete\">\n <button (click)=\"deleteSelected()\">Delete {{checked.length}} rows</button>\n </div>\n\n <div class=\"spacer\">\n\n </div>\n\n <div class=\"data-pagination\">\n <select (change)=\"pageOnChange(device.value)\" #device>\n <option value=\"10\">10</option>\n <option value=\"15\">15</option>\n <option value=\"20\">20</option>\n <option value=\"100\">100</option>\n </select>\n | Showing {{page}} of {{totalItems()}} |\n <button class=\"link-button\" (click)=\"previousPage()\">Previous</button>\n -\n <button class=\"link-button\" (click)=\"nextPage()\">Next</button>\n </div>\n </div>\n\n\n <div *ngIf=\"update && dialogue\" class=\"update\" (click)=\"closeDialogue()\">\n\n <div class=\"update-box\" (click)=\"$event.stopPropagation()\">\n <h2>Edit the Row</h2>\n <form #customForm=\"ngForm\" novalidate (ngSubmit)=\"submitUpdateRow(dialogeData); closeDialogue()\">\n <div class=\"f-x\">\n <ng-container *ngFor=\"let attr of displayed; let i = index\">\n <div *ngIf=\"attr!='id' \" class=\"f-y\">\n <label>{{data.headers[i]}}</label>\n <input type=\"text\" [value]=\"dialogeData[attr]\" [placeholder]=\"attr\" [name]=\"attr\"\n [(ngModel)]=\"dialogeData[attr]\">\n </div>\n </ng-container>\n </div>\n <footer>\n <br>\n <button type=\"submit\">Update the row</button>\n <button type=\"button\" (click)=\"closeDialogue()\">Cancel</button>\n </footer>\n </form>\n </div>\n </div>\n\n</div>\n", styles: [".data-table{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);margin:10px;border-radius:8px;background:#fff;padding-top:8px}.data-table .search{width:100%;height:42px;border:none;outline:0;text-align:left;border-bottom:1px solid rgba(0,0,0,.12)}.data-table table{display:table;border-collapse:separate;border-spacing:2px;border-color:grey;width:100%;background:#fff}.data-table table tbody td:first-of-type,.data-table table tbody th:first-of-type,.data-table table thead td:first-of-type,.data-table table thead th:first-of-type{padding-left:24px!important;padding-right:24px!important}.data-table table thead{display:table-header-group;vertical-align:middle;border-color:inherit}.data-table table thead tr{height:56px}.data-table table tbody{display:table-row-group;vertical-align:middle;border-color:inherit}.data-table table tbody tr{height:48px;color:rgba(0,0,0,.87)}.data-table table th{padding:0;color:rgba(0,0,0,.54);border-bottom:1px solid rgba(0,0,0,.12)}.data-table table tfoot{display:table-footer-group;vertical-align:middle;border-color:inherit}.data-table .footer{display:flex;height:40px;border-top:1px solid rgba(0,0,0,.12)}.data-table .footer .spacer{flex-grow:1}.data-table .footer .delete{width:120px;background:0 0}.data-table .footer .delete button{height:80%;background:0 0;border:none;outline:0;cursor:pointer;transition:.25s linear;border-radius:4px;margin-left:5px;margin-top:4px}.data-table .footer .delete button:hover{background-color:#fbab33;color:#fff}.data-table .footer .data-pagination{padding-right:20px;padding-top:4px}.data-table .footer .data-pagination select{outline:0;background:0 0;padding:4px}.data-table .footer .data-pagination .link-button{border:none;outline:0;background:0 0}.data-table .footer .data-pagination .link-button:hover{text-decoration:underline}.data-table .update{transition:.5s linear;position:fixed;height:100vh;width:100vw;background:rgba(212,212,212,.51);top:0;left:0;display:flex;align-items:center;justify-content:center}.data-table .update .update-box{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);background:#fff;padding:8px;border-radius:4px;width:250px}.data-table .update .f-x{display:flex;flex-direction:column}.data-table .update .f-y{display:flex;flex-direction:column;margin-top:6px}.data-table .update input[type=text]{margin-right:4px;padding:4px}"] }] } ]; /** @nocollapse */ DataTableComponent.ctorParameters = function () { return []; }; DataTableComponent.propDecorators = { dataSource: [{ type: Input }], headers: [{ type: Input }], update: [{ type: Input }], deleteRow: [{ type: Output }], updateRow: [{ type: Output }] }; return DataTableComponent; }()); export { DataTableComponent }; if (false) { /** @type {?} */ DataTableComponent.prototype.dataSource; /** @type {?} */ DataTableComponent.prototype.headers; /** @type {?} */ DataTableComponent.prototype.update; /** @type {?} */ DataTableComponent.prototype.deleteRow; /** @type {?} */ DataTableComponent.prototype.updateRow; /** @type {?} */ DataTableComponent.prototype.data; /** @type {?} */ DataTableComponent.prototype.displayed; /** @type {?} */ DataTableComponent.prototype.perpage; /** @type {?} */ DataTableComponent.prototype.total; /** @type {?} */ DataTableComponent.prototype.page; /** @type {?} */ DataTableComponent.prototype.checked; /** @type {?} */ DataTableComponent.prototype.checkAll; /** @type {?} */ DataTableComponent.prototype.dialogue; /** @type {?} */ DataTableComponent.prototype.dialogeData; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWpzb24tdGFibGUvIiwic291cmNlcyI6WyJzcmMvYXBwL21vZHVsZXMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQzs7SUE0QjNFO3lCQWZ5QyxJQUFJLFlBQVksRUFBTzt5QkFDdkIsSUFBSSxZQUFZLEVBQU87b0JBRXBELEVBQUU7eUJBRUYsRUFBRTt1QkFDSixFQUFFO29CQUVMLENBQUM7dUJBRU8sRUFBRTt3QkFDTixLQUFLO3dCQUNMLEtBQUs7MkJBQ0csRUFBRTtLQUdwQjs7OztJQUVELHFDQUFROzs7SUFBUjtRQUNFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUNwQjs7Ozs7O0lBRUQscUNBQVE7Ozs7O0lBQVIsVUFBUyxDQUFDLEVBQUUsRUFBRTtRQUNaLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdkI7S0FDRjs7OztJQUVELDJDQUFjOzs7SUFBZDtRQUFBLGlCQVNDO1FBUkMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7Z0JBQzNELE9BQU8sQ0FBQyxLQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7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Q0FBQyxFQUFFO2dCQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO2FBQ3pDO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLENBQUMsQ0FBQzthQUNwRDtZQUVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFCO2FBQU07WUFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDNUM7OztnQkEzSEosU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxZQUFZO29CQUN0Qiw2aEZBQTBDOztpQkFFM0M7Ozs7OzZCQUdFLEtBQUs7MEJBQ0wsS0FBSzt5QkFDTCxLQUFLOzRCQUVMLE1BQU07NEJBQ04sTUFBTTs7NkJBZFQ7O1NBT2Esa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnanNvbi10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS10YWJsZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgZGF0YVNvdXJjZTogYW55O1xuICBASW5wdXQoKSBoZWFkZXJzOiBhbnk7XG4gIEBJbnB1dCgpIHVwZGF0ZTogYm9vbGVhbjtcblxuICBAT3V0cHV0KCkgZGVsZXRlUm93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdXBkYXRlUm93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGRhdGE6IGFueSA9IHt9O1xuXG4gIGRpc3BsYXllZCA9IFtdO1xuICBwZXJwYWdlID0gMTA7XG4gIHRvdGFsOiBudW1iZXI7XG4gIHBhZ2UgPSAxO1xuXG4gIGNoZWNrZWQ6IGFueSA9IFtdO1xuICBjaGVja0FsbCA9IGZhbHNlO1xuICBkaWFsb2d1ZSA9IGZhbHNlO1xuICBkaWFsb2dlRGF0YTogYW55ID0ge307XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnByb2Nlc3NEYXRhKCk7XG4gIH1cblxuICBzZWxlY3RlZChlLCBpZCkge1xuICAgIGlmIChlLnRhcmdldC5jaGVja2VkKSB7XG4gICAgICB0aGlzLmNoZWNrZWQucHVzaChpZCk7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlU2VsZWN0ZWQoKSB7XG4gICAgaWYgKHRoaXMuY2hlY2tlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmRlbGV0ZVJvdy5lbWl0KHRoaXMuY2hlY2tlZCk7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UgPSB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jaGVja2VkLmluY2x1ZGVzKHZhbHVlLmlkKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jaGVja2VkID0gW107XG4gICAgICB0aGlzLnBhZ2luYXRlKHRoaXMucGFnZSk7XG4gICAgfVxuICB9XG5cbiAgdG90YWxJdGVtcygpIHtcbiAgICBpZiAodGhpcy50b3RhbCA+IHRoaXMucGVycGFnZSkge1xuICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLnRvdGFsIC8gdGhpcy5wZXJwYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgcGFnaW5hdGUocGFnZSkge1xuICAgIGNvbnN0IHN0YXJ0ID0gKHRoaXMucGVycGFnZSAqIHBhZ2UpIC0gdGhpcy5wZXJwYWdlO1xuICAgIGNvbnN0IGVuZCA9ICh0aGlzLnBlcnBhZ2UgKiBwYWdlKTtcbiAgICAvLyBjb25zb2xlLmxvZyhzdGFydCwgZW5kKTtcbiAgICB0aGlzLmRhdGFbJ2RhdGEnXSA9IHRoaXMuZGF0YVNvdXJjZS5zbGljZShzdGFydCwgZW5kKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmRhdGEpO1xuICB9XG5cbiAgcGFnZU9uQ2hhbmdlKHBlclBhZ2UpIHtcbiAgICB0aGlzLnBlcnBhZ2UgPSBwZXJQYWdlO1xuICAgIHRoaXMucGFnZSA9IDE7XG4gICAgLy9jb25zb2xlLmxvZyhwZXJQYWdlKTtcbiAgICB0aGlzLnBhZ2luYXRlKHRoaXMucGFnZSk7XG4gIH1cblxuICBwcmV2aW91c1BhZ2UoKSB7XG4gICAgaWYgKHRoaXMucGFnZSA+IDEpIHtcbiAgICAgIHRoaXMucGFnZS0tO1xuICAgIH1cblxuICAgIHRoaXMucGFnaW5hdGUodGhpcy5wYWdlKTtcbiAgfVxuXG4gIG5leHRQYWdlKCkge1xuICAgIGlmICh0aGlzLnBhZ2UgKyAxIDw9IHRoaXMudG90YWxJdGVtcygpKSB7XG4gICAgICB0aGlzLnBhZ2UrKztcbiAgICB9XG5cbiAgICB0aGlzLnBhZ2luYXRlKHRoaXMucGFnZSk7XG4gIH1cblxuICBzaG93VXBkYXRlKGlkOiBhbnkpIHtcbiAgICB0aGlzLmRpYWxvZ3VlID0gdHJ1ZTtcbiAgICAvLyBjb25zb2xlLmxvZygnU2hvd2luZyB0aGUgdXBkYXRlcycpO1xuICAgIHRoaXMuZGF0YS5kYXRhLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUuaWQgPT09IGlkKSB7XG4gICAgICAgIHRoaXMuZGlhbG9nZURhdGEgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgY2xvc2VEaWFsb2d1ZSgpIHtcbiAgICB0aGlzLmRpYWxvZ3VlID8gdGhpcy5kaWFsb2d1ZSA9IGZhbHNlIDogdGhpcy5kaWFsb2d1ZSA9IHRydWU7XG4gICAgdGhpcy5kaWFsb2dlRGF0YSA9IHt9O1xuICB9XG5cbiAgc3VibWl0VXBkYXRlUm93KGRpYWxvZ2VEYXRhOiBhbnkpIHtcbiAgICB0aGlzLnVwZGF0ZVJvdy5lbWl0KGRpYWxvZ2VEYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0RhdGEoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZSAmJiB0aGlzLmRhdGFTb3VyY2UubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50b3RhbCA9IHRoaXMuZGF0YVNvdXJjZS5sZW5ndGg7XG5cbiAgICAgIGlmICh0aGlzLmhlYWRlcnMudGhlYWQgJiYgdGhpcy5oZWFkZXJzLnRoZWFkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5kYXRhWydoZWFkZXJzJ10gPSB0aGlzLmhlYWRlcnMudGhlYWQ7XG4gICAgICAgIHRoaXMuZGlzcGxheWVkID0gdGhpcy5oZWFkZXJzLmRpc3BsYXllZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTm8gaGVhZGVycyBkYXRhIGZvciB0YWJsZSBwcm92aWRlZCcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBhZ2luYXRlKHRoaXMucGFnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gZGF0YSBmb3IgdGFibGUgcHJvdmlkZWQnKTtcbiAgICB9XG5cblxuICB9XG59XG5cbiJdfQ==