data-table-kit
Version:
A simple datatable/datagrid for Angular projects
885 lines • 89.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ContentChildren, QueryList, ViewContainerRef, ViewChild, TemplateRef, Inject, ChangeDetectionStrategy, ElementRef } from '@angular/core';
import { DataTableColumnDirective } from './data-table-column.directive';
import { DataTableChildDirective } from './data-table-child.directive';
import { DOCUMENT } from '@angular/common';
export class DataTableKitComponent {
/**
* @param {?} doc
*/
constructor(doc) {
this.doc = doc;
this.datacount = 0;
this.allowResize = true;
this.pagesize = 0;
this.collapseChildren = null;
this.multiSelect = false;
this.bufferedPageNoChanged = new EventEmitter();
this.sortOrderChanged = new EventEmitter();
this.selectionChanged = new EventEmitter();
this.editStarted = new EventEmitter();
this.editCompleted = new EventEmitter();
this.editCancelled = new EventEmitter();
this.pageno = 0;
this.columnCount = 0;
this.resizeInfo = null;
this.haschildren = false;
this.sortInfo = [];
this.gridid = "g" + this.uuidv4();
this.selectedRows = [];
this.editingRow = -1;
this.gridStyle = {
thSep: {
padding: "0px",
"border-top": "1px solid lightgray",
"border-bottom": "1px solid lightgray",
"border-right": "1px solid lightgray",
width: "4px"
},
thSepGroup: {
padding: "0px",
"border-top": "1px solid lightgray",
"border-bottom": "0px solid lightgray",
"border-right": "1px solid lightgray",
width: "4px"
},
tdSep: {
width: "1px",
padding: "0px"
},
th: {
"vertical-align": "bottom",
"border-top": "1px solid lightgray",
"border-bottom": "1px solid lightgray"
},
thGroup: {
"text-align": "center",
"vertical-align": "bottom",
"border-top": "1px solid lightgray",
"border-bottom": "0px solid lightgray"
},
thGroupLabel: {
"text-align": "center",
"vertical-align": "bottom",
"border-top": "1px solid lightgray",
"border-bottom": "1px solid lightgray"
},
td: {}
};
this.gridClass = {
thSep: "",
tdSep: "",
th: "data-table-col-header",
td: "data-table-col-data"
};
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.haschildren = this.Children != null && this.Children.length > 0;
this.columnCount = this.Columns == null ? 0 : this.Columns.length * 2 - 1;
this.setupColumns();
}
/**
* @return {?}
*/
ngAfterViewInit() {
// following code is to fix columns from resizing on page change and edit
if (this.TableHeader != null && this.TableHeader.nativeElement != null && this.TableHeader.nativeElement.children != null) {
/** @type {?} */
let children = this.TableHeader.nativeElement.children;
for (let i = 0; i < (children.length - 1); i++) {
if (children[i] != null) {
children[i].style.width = children[i].clientWidth + "px";
}
}
}
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes["allowResize"]) {
if (this.allowResize) {
this.gridStyle.thSep["cursor"] = "col-resize";
}
else {
delete this.gridStyle.thSep["cursor"];
}
}
if (changes["tabledata"] || changes["pagesize"] || changes["datacount"]) {
this.analyzeTableData();
this.updatePageData();
}
if (changes["tabledata"]) {
if (this._viewContainerRef != null) {
this._viewContainerRef.createEmbeddedView(this._columnTemplate);
}
}
}
/**
* @param {?} gcColumn
* @return {?}
*/
headers(gcColumn) {
return gcColumn.headers;
}
/**
* @return {?}
*/
setupColumns() {
/** @type {?} */
let groupHeaders = [];
/** @type {?} */
let found = false;
if (this.Columns != null) {
/** @type {?} */
let columns = this.Columns.toArray();
/** @type {?} */
let noWidthColumns = columns.filter((/**
* @param {?} p
* @return {?}
*/
p => p.columnWidth == null || p.columnWidth == ""));
if (noWidthColumns.length > 1) {
/** @type {?} */
let equalWidth = `${Math.round(100 / noWidthColumns.length)}px`;
noWidthColumns.splice(noWidthColumns.length - 1, 1);
//noWidthColumns.forEach(p=>p.columnWidth=equalWidth);
}
//update group header to empty for columns where it is not specified
/** @type {?} */
let i = 0;
while (i < columns.length) {
/** @type {?} */
let group = {};
group["colStyle"] = this.gridStyle.thGroup;
if (columns[i] != null) {
if (columns[i].groupHeader != null) {
found = true;
group["headers"] = columns[i].groupHeader;
if (!Array.isArray(group["headers"])) {
group["headers"] = [group["headers"]];
}
}
if (columns[i].groupColumns != null && columns[i].groupColumns > 1) {
found = true;
group["colspan"] = columns[i].groupColumns * 2 - 1;
i = i + columns[i].groupColumns - 1;
}
if (found) {
group["colStyle"] = this.gridStyle.thGroupLabel;
}
}
groupHeaders.push(group);
i = i + 1;
}
}
if (found) {
this.groups = groupHeaders;
this.gridStyle.th["border-top"] = "0px solid lightgray";
this.gridStyle.thSep["border-top"] = "0px solid lightgray";
}
else {
this.groups = null;
}
}
/**
* @return {?}
*/
analyzeTableData() {
/** @type {?} */
let datalength = 0;
if (this.datacount != 0) {
datalength = this.datacount;
}
else if (this.tabledata != null) {
datalength = this.tabledata.length;
}
this.fadein = null;
this.totalpages = [];
if (this.pagesize != 0 && datalength > this.pagesize) {
/** @type {?} */
let pagecount = Math.ceil(datalength / this.pagesize);
this.totalpages = [];
for (let i = 0; i < pagecount; i++) {
this.totalpages.push(i + 1);
}
}
}
/**
* @return {?}
*/
updatePageData() {
if (this.pagesize == 0 ||
this.tabledata == null ||
this.tabledata.length <= this.pagesize) {
this.pagedata = this.tabledata;
this.fadein = null;
}
else {
/** @type {?} */
let start = this.pageno * this.pagesize;
/** @type {?} */
let end = start + this.pagesize * 1;
if (this.bufferedpageno != null && this.bufferedpagecount != null) {
/** @type {?} */
let currentFrom = this.bufferedpageno * this.bufferedpagecount * this.pagesize;
/** @type {?} */
let currentTo = currentFrom + this.tabledata.length - 1;
if (start < currentFrom || start > currentTo) {
/** @type {?} */
let refreshPage = Math.floor(start / (this.bufferedpagecount * this.pagesize));
this.bufferedPageNoChanged.emit({
newPageNo: refreshPage,
currentPageNo: this.bufferedpageno
});
return;
}
else {
start -= currentFrom;
end -= currentFrom;
}
}
this.pagedata = this.tabledata.slice(start, end);
if (this.pageno > 0) {
this.fadein = "data-table-fade-in";
}
}
}
/**
* @return {?}
*/
setFirstPage() {
if (this.pageno > 0) {
/** @type {?} */
let page = 0;
this.setPage(page);
}
}
/**
* @return {?}
*/
setPrevPage() {
if (this.pageno > 0) {
/** @type {?} */
let page = this.pageno - 1;
this.setPage(page);
}
}
/**
* @return {?}
*/
setNextPage() {
if (this.pageno < this.totalpages.length - 1) {
/** @type {?} */
let page = this.pageno + 1;
this.setPage(page);
}
}
/**
* @return {?}
*/
setLastPage() {
if (this.pageno < this.totalpages.length - 1) {
/** @type {?} */
let page = this.totalpages.length - 1;
this.setPage(page);
}
}
/**
* @param {?} pageNo
* @return {?}
*/
gotoPage(pageNo) {
if (pageNo !== "") {
/** @type {?} */
let page = parseInt(pageNo);
if (page > 0 && page <= this.totalpages.length) {
page--;
this.setPage(page);
}
}
}
/**
* @param {?} page
* @return {?}
*/
setPage(page) {
if (this.pageno != page) {
this.pageno = page;
this.updatePageData();
}
}
/**
* @param {?} e
* @return {?}
*/
resizeColumn(e) {
if (!this.allowResize) {
return;
}
if (this.resizeInfo != null && e != null) {
if (e.buttons == 0) {
this.resizeInfo = null;
}
else {
/** @type {?} */
let diff = this.resizeInfo.startX - e.pageX;
/** @type {?} */
let width = this.resizeInfo.element.clientWidth;
/** @type {?} */
let newWidth = width - (diff + 2);
if (newWidth > 0) {
if (this.resizeInfo.fixColumns > 0) {
for (let i = 0; i < this.resizeInfo.fixColumns; i++) {
if (i % 2 == 0 && this.resizeInfo.children.length > i) {
this.resizeInfo.children[i].style.width =
this.resizeInfo.children[i].clientWidth + "px";
}
}
this.resizeInfo.fixColumns = 0;
}
this.resizeInfo.startX = e.pageX;
this.resizeInfo.element.style.width = newWidth + "px";
}
}
}
}
/**
* @param {?} e
* @return {?}
*/
resizeColumnEnd(e) {
if (!this.allowResize) {
return;
}
this.resizeInfo = null;
}
/**
* @param {?} e
* @return {?}
*/
resizeColumnStart(e) {
if (!this.allowResize) {
return;
}
if (e != null && e.target != null) {
/** @type {?} */
let target = e.target;
/** @type {?} */
let parent = target.parentElement;
if (parent != null) {
/** @type {?} */
let children = parent.children;
if (children != null && children.length > 0) {
/** @type {?} */
let columnIndex = -1;
for (let i = 0; i < children.length; i++) {
if (children[i] == target) {
columnIndex = i;
break;
}
}
if (columnIndex > 0) {
this.resizeInfo = {
children: children,
startX: e.pageX,
element: children[columnIndex - 1],
fixColumns: columnIndex - 2
};
}
}
}
}
}
/**
* @param {?} event
* @param {?} rowidx
* @return {?}
*/
toggleChildren(event, rowidx) {
if (this.doc != null) {
/** @type {?} */
let id = this.gridid + "_" + rowidx + "_inner";
/** @type {?} */
let target = event.target;
/** @type {?} */
let childTablesElement = this.doc.querySelector("#" + id);
if (childTablesElement != null) {
/** @type {?} */
let datatoggle = target.getAttribute("data-toggle");
/** @type {?} */
let collapse = "-" == datatoggle;
this.dataTableCollapseChild(target, childTablesElement, collapse);
}
}
}
/**
* @param {?} toggler
* @param {?} child
* @param {?} collapse
* @return {?}
*/
dataTableCollapseChild(toggler, child, collapse) {
if (collapse) {
if (child != null) {
child.classList.add("data-table-collapse");
}
if (toggler != null) {
toggler.setAttribute("data-toggle", "+");
toggler.classList.remove("data-table-minus");
toggler.classList.add("data-table-plus");
}
}
else {
if (child != null) {
child.classList.remove("data-table-collapse");
}
if (toggler != null) {
toggler.classList.remove("data-table-plus");
toggler.classList.add("data-table-minus");
toggler.setAttribute("data-toggle", "-");
}
}
}
/**
* @param {?} event
* @param {?} collapse
* @return {?}
*/
dataTableCollapseChildren(event, collapse) {
if (this.doc != null) {
/** @type {?} */
let toggler = this.doc.querySelectorAll(".data-table-toggler-" + this.gridid);
/** @type {?} */
let children = this.doc.querySelectorAll(".data-table-children-" + this.gridid);
/** @type {?} */
let count = Math.min(toggler.length, children.length);
for (let i = 0; i < count; i++) {
this.dataTableCollapseChild(toggler[i], children[i], collapse);
}
this.collapseChildren = collapse;
}
}
/**
* @return {?}
*/
uuidv4() {
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (/**
* @param {?} c
* @return {?}
*/
function (c) {
/** @type {?} */
var r = (Math.random() * 16) | 0;
/** @type {?} */
var v = c == "x" ? r : (r & 0x3) | 0x8;
return v.toString(16);
}));
}
/**
* @return {?}
*/
clearSort() {
for (let i = 0; i < this.sortInfo.length; i++) {
/** @type {?} */
let sort = this.sortInfo[i];
if (sort != null) {
sort.sortButton.classList.remove("sorted");
}
}
this.sortInfo = [];
}
/**
* @param {?} event
* @param {?} colSort
* @param {?} aord
* @return {?}
*/
sortColumn(event, colSort, aord) {
if (colSort == null || colSort.length == 0) {
return;
}
/** @type {?} */
let target = event.target;
if (!event.ctrlKey) {
this.clearSort();
}
for (let i = 0; i < colSort.length; i++) {
/** @type {?} */
let idx = -1;
/** @type {?} */
let skip = false;
for (let j = 0; j < this.sortInfo.length; j++) {
/** @type {?} */
let sort = this.sortInfo[j];
if (sort != null && sort.field == colSort[i]) {
sort.sortButton.classList.remove("sorted");
idx = j;
if (sort.aord == aord) {
skip = true;
}
break;
}
}
if (idx != -1) {
this.sortInfo.splice(idx, 1);
}
if (!skip) {
this.sortInfo.push({
field: colSort[i],
sortButton: event.target,
aord: aord
});
event.target.classList.add("sorted");
}
}
if (this.sortOrderChanged.observers == null ||
this.sortOrderChanged.observers.length == 0) {
/** @type {?} */
let sortColumns = [];
this.sortInfo.forEach((/**
* @param {?} sort
* @return {?}
*/
sort => {
if (sort != null) {
sortColumns.push(`${sort.field}:${sort.aord}`);
}
}));
/** @type {?} */
let sortText = sortColumns.join(",");
this.tabledata = this.quickSort(this.tabledata, sortText);
this.analyzeTableData();
this.updatePageData();
}
else {
/** @type {?} */
let sortOrder = this.sortInfo.map((/**
* @param {?} p
* @return {?}
*/
p => {
return {
field: p.field,
mode: p.aord
};
}));
this.sortOrderChanged.emit(sortOrder);
}
}
/**
* @param {?} data
* @param {?} orderBy
* @return {?}
*/
quickSort(data, orderBy) {
if (data == null || orderBy == null || orderBy.length == 0) {
return data;
}
/** @type {?} */
let sortFields = orderBy
.split(",")
.map((/**
* @param {?} f
* @return {?}
*/
f => f.trim().split(":")))
.map((/**
* @param {?} f
* @return {?}
*/
f => {
if (f == null || f.length == 0) {
return null;
}
/** @type {?} */
let field = f[0];
/** @type {?} */
let mode = f.length > 1 ? f[1] : "a";
if (mode != "a" && mode != "A" && mode != "d" && mode != "D") {
mode = "a";
}
return {
field: field,
mode: mode.toLowerCase()
};
}))
.filter((/**
* @param {?} f
* @return {?}
*/
f => f != null));
return data.sort((/**
* @param {?} rowA
* @param {?} rowB
* @return {?}
*/
(rowA, rowB) => {
if (rowB == null || rowA == null) {
return 1;
}
for (let sortField of sortFields) {
/** @type {?} */
let factor = sortField.mode == "d" ? -1 : 1;
/** @type {?} */
let valueA = this.propertyValue(rowA, sortField.field);
/** @type {?} */
let valueB = this.propertyValue(rowB, sortField.field);
if (valueA < valueB) {
return -1 * factor;
}
if (valueA > valueB) {
return 1 * factor;
}
}
return 0;
}));
}
/**
* @param {?} obj
* @param {?} propertyPath
* @return {?}
*/
propertyValue(obj, propertyPath) {
while (Array.isArray(obj)) {
if (obj.length > 0) {
obj = obj[0];
}
else {
obj = null;
}
}
if (obj == null) {
return null;
}
propertyPath = propertyPath
.split(".")
.map((/**
* @param {?} name
* @return {?}
*/
name => name.trim()))
.filter((/**
* @param {?} name
* @return {?}
*/
name => name.length > 0))
.join(".");
/** @type {?} */
let propertyName = propertyPath;
/** @type {?} */
let rightPath = null;
/** @type {?} */
let dotIndex = propertyPath.indexOf(".");
if (dotIndex == 0) {
propertyName = propertyPath.substr(1);
}
else if (dotIndex > 0) {
propertyName = propertyPath.substr(0, dotIndex);
rightPath = propertyPath.substr(dotIndex + 1);
}
/** @type {?} */
let value = obj[propertyName];
if (rightPath != null) {
return this.propertyValue(value, rightPath);
}
return value;
}
/**
* @return {?}
*/
clearSelections() {
this.selectedRows = [];
/** @type {?} */
let rowSelector = `#grid_${this.gridid}>tbody>tr`;
/** @type {?} */
let allRows = this.doc.querySelectorAll(rowSelector);
allRows.forEach((/**
* @param {?} p
* @return {?}
*/
p => {
if (p != null && p.classList != null) {
p.classList.remove("data-table-selected");
}
}));
}
/**
* @param {?} event
* @param {?} rowIdx
* @return {?}
*/
clickRow(event, rowIdx) {
/** @type {?} */
let adjustedRowIdx = rowIdx + this.pageno * this.pagesize;
if (this.editingRow != adjustedRowIdx) {
this.clearEdits();
}
/** @type {?} */
let clear = true;
if (this.multiSelect) {
if (event != null && event.ctrlKey) {
clear = false;
}
}
if (clear) {
this.clearSelections();
}
/** @type {?} */
let idx = this.selectedRows.indexOf(adjustedRowIdx);
if (idx != -1) {
this.selectedRows.splice(idx, 1);
}
else {
this.selectedRows.push(adjustedRowIdx);
}
/** @type {?} */
let cllickInfo = {
event: event,
rowIdx: adjustedRowIdx,
selectedRows: this.selectedRows.map((/**
* @param {?} p
* @return {?}
*/
p => p)),
bufferOffset: this.bufferedpageno * this.bufferedpagecount * this.pagesize
};
/** @type {?} */
let trElement = event.currentTarget;
if (trElement != null) {
trElement.classList.toggle("data-table-selected");
}
this.selectionChanged.emit(cllickInfo);
}
/**
* @return {?}
*/
clearEdits() {
this.editingRow = -1;
}
/**
* @param {?} event
* @param {?} rowIdx
* @return {?}
*/
dblclickRow(event, rowIdx) {
this.editingRow = rowIdx;
}
}
DataTableKitComponent.decorators = [
{ type: Component, args: [{
selector: "data-table",
template: "<ng-template #columnTemplate>\r\n <tr>\r\n <ng-container #rowColumns></ng-container>\r\n </tr>\r\n</ng-template>\r\n<table [ngClass]=\"'data-table '+datatableClass\" style=\"width: 100%;\" [id]=\"'grid_'+gridid\">\r\n <thead>\r\n <tr *ngIf=\"groups!=null&&groups.length>0\" class=\"header\">\r\n <th *ngIf=\"haschildren&&collapseChildren!=null\" [className]=\"gridClass.th\" [ngStyle]=\"gridStyle.thGroup\">\r\n </th>\r\n <ng-template ngFor let-colIndex=\"index\" let-group [ngForOf]=\"groups\">\r\n <th *ngIf=\"colIndex>0\" [className]=\"gridClass.thSep\" [ngStyle]=\"gridStyle.thSepGroup\"></th>\r\n <th [className]=\"gridClass.th\" [ngStyle]=\"group.colStyle\" [attr.colspan]=\"group.colspan\">\r\n <ng-template ngFor let-line [ngForOf]=\"group.headers\">\r\n <div>{{line}}</div>\r\n </ng-template>\r\n </th>\r\n </ng-template>\r\n </tr>\r\n <tr #tableHeader class=\"header\" (mousemove)=\"allowResize?resizeColumn($event):null\">\r\n <th *ngIf=\"haschildren&&collapseChildren!=null\" [className]=\"gridClass.th\" [ngStyle]=\"gridStyle.th\">\r\n <div class=\"data-table-plus\" style=\"font-size: smaller;\" (click)=\"dataTableCollapseChildren($event, false)\"> </div>\r\n <div class=\"data-table-minus\" style=\"font-size: smaller;\" (click)=\"dataTableCollapseChildren($event, true)\"> </div>\r\n </th>\r\n <ng-template ngFor let-colIndex=\"index\" let-col [ngForOf]=\"Columns\">\r\n <th *ngIf=\"colIndex>0\" [className]=\"gridClass.thSep\" [ngStyle]=\"gridStyle.thSep\" (mousedown)=\"(allowResize)?resizeColumnStart($event):null\"\r\n (mouseup)=\"(allowResize)?resizeColumnEnd($event):null\"></th>\r\n <th [className]=\"gridClass.th\" [ngStyle]=\"gridStyle.th\">\r\n <div class=\"data-table-col-header-text\">\r\n <div class=\"data-table-col-header-middle\">\r\n <ng-template ngFor let-line [ngForOf]=\"col.header\">\r\n <div>{{line}}</div>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"col.sort!=null && col.sort.length>0\" class=\"data-table-col-header-middle\" style=\"margin-left:5px;\">\r\n <div class=\"data-table-up\" (click)=\"sortColumn($event, col.sort,'a')\"> </div>\r\n <div class=\"data-table-down\" (click)=\"sortColumn($event, col.sort,'d')\"> </div>\r\n </div>\r\n </div>\r\n </th>\r\n </ng-template>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container #gridBody></ng-container>\r\n <ng-container *ngFor=\"let row of pagedata; let rowidx=index;\">\r\n <tr class=\"data\" (click)=\"clickRow($event, rowidx)\" (dblclick)=\"dblclickRow($event, rowidx)\">\r\n <td *ngIf=\"haschildren&&collapseChildren!=null\">\r\n <div [attr.data-toggle]=\"collapseChildren?'+':'-'\" (click)=\"toggleChildren($event, rowidx)\" [ngClass]=\"'data-table-toggler-'+gridid+' data-table-'+(collapseChildren?'plus':'minus')\"> </div>\r\n </td>\r\n <ng-template ngFor let-colIndex=\"index\" let-col [ngForOf]=\"Columns\">\r\n <td *ngIf=\"colIndex>0\" [className]=\"gridClass.tdSep\" [ngStyle]=\"gridStyle.tdSep\"></td>\r\n <td [className]=\"gridClass.td\" [ngStyle]=\"col.dtcStyle\">\r\n <data-table-cell [data]=\"row\" [column]=\"col\" [fadein]=\"fadein\" [editing]=\"rowidx==editingRow\" [rowIndex]=\"rowidx + (pageno * pagesize)\"></data-table-cell>\r\n </td>\r\n </ng-template>\r\n </tr>\r\n <tr *ngIf=\"haschildren\">\r\n <td *ngIf=\"collapseChildren!=null\" style=\"border: 0px;padding:0px;\"></td>\r\n <td [attr.colspan]=\"columnCount\" style=\"border: 0px; padding: 0px;\">\r\n <div [id]=\"gridid+'_'+rowidx+'_inner'\" [ngClass]=\"'data-table-children-'+gridid+(collapseChildren=='true'||collapseChildren==true?' data-table-collapse':' ')\">\r\n <div *ngFor=\"let child of Children\">\r\n <data-table-cell [data]=\"row\" [child]=\"child\" [rowIndex]=\"rowidx + (pageno * pagesize)\"></data-table-cell>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n</table>\r\n<div *ngIf=\"totalpages!=null&&totalpages.length>0\">\r\n <div>\r\n <ul class=\"data-table-pages\">\r\n <li [ngClass]=\"(pageno==0?'disabled':'')+' data-table-hand'\"><a (click)=\"setFirstPage()\">First</a></li>\r\n <li [ngClass]=\"(pageno==0?'disabled':'')+' data-table-hand'\"><a (click)=\"setPrevPage()\"><span aria-hidden=\"true\">«</span> Previous</a></li>\r\n <li><a><input type=\"number\" class=\"data-table-input-pageno\" min=\"1\" [max]=\"totalpages.length\" [value]=\"pageno+1\"\r\n (keyup.enter)=\"gotoPage(pagegoto.value)\" #pagegoto> / {{totalpages.length}}</a></li>\r\n <li [ngClass]=\"(pageno < totalpages.length - 1?'':'disabled')+' data-table-hand'\"><a (click)=\"setNextPage()\">Next <span aria-hidden=\"true\">»</span></a></li>\r\n <li [ngClass]=\"(pageno < totalpages.length - 1?'':'disabled')+' data-table-hand'\"><a (click)=\"setLastPage()\">Last</a></li>\r\n </ul>\r\n </div>\r\n</div>\r\n",
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [".data-table{border:0;border-spacing:0}.data-table th{padding-top:10px;padding-bottom:10px}.data-table>tbody>tr:hover{background-color:#f5f5f5}.data-table-collapse{display:none}.data-table-collapse.in{display:block}.data-table .header{color:#000;font-size:smaller;font-weight:700}.data-table .data{color:#000;font-size:smaller;font-weight:400}.data-table .disabled{color:#777;opacity:.8}.data-table-hand{cursor:pointer}.data-table-col-header{display:table-cell;padding:\"3px\";text-align:center;font-size:14px;line-height:normal}.data-table-col-header-text:before{content:\"\";display:inline-block;vertical-align:middle}.data-table-col-header-middle{display:inline-block;vertical-align:middle}.data-table-col-data{display:table-cell;padding:\"3px\"}.data-table-input-pageno{background-color:transparent;border:0!important;border-top:0!important;border-bottom:0!important;border-left:0!important;border-right:0!important;width:auto!important;height:auto!important;text-align:right;font-family:inherit;font-size:inherit;font-weight:inherit;padding:0}.data-table-input-pageno:focus{outline:0!important;border-bottom:0!important}.data-table-input-pageno::-webkit-inner-spin-button,.data-table-input-pageno::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.data-table-minus{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAAABnRSTlMA/wD/AP83WBt9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAH0lEQVQokWP8//8/A+mAiQw9o9qoqI2+gHE0lQxJbQDl0gYZ+lGHlgAAAABJRU5ErkJggg==);background-origin:content-box;background-position:center;background-repeat:no-repeat;background-size:contain;cursor:pointer;margin-right:5px;padding:2px;width:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.data-table-plus{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAAABnRSTlMA/wD/AP83WBt9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAKUlEQVQokWP8//8/AzbAyMjIwMCAS5YJqyhBMKqNWtroCxhHU8mQ1AYA6OYMGQghg24AAAAASUVORK5CYII=);background-origin:content-box;background-position:center;background-repeat:no-repeat;background-size:contain;cursor:pointer;margin-right:5px;padding:2px;width:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.data-table-up{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAOCAIAAACtuNvgAAAABnRSTlMA/wD/AP83WBt9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAWUlEQVQokZ2SUQ7AIAhDV+L9r9z9LQTbxsmX0D40CEg+/2PJKoDvLPtWZvZUY9K0FyvLTionZLIOmWlzH0AySPqSDughZcaRM3cPm5PsvrBow4a7nRTLdRIvsT4qGLm5+W8AAAAASUVORK5CYII=);background-origin:content-box;background-position:center;background-repeat:no-repeat;background-size:contain;cursor:pointer;font-size:6px;margin:0;padding:0;width:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.data-table-down{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAOCAIAAACtuNvgAAAABnRSTlMA/wD/AP83WBt9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAYklEQVQokZ2S2w7AMAhCwez/f5k9dFkWvDRr3xSPkhRKwv8XBwyACwDJVcyXv2M0rSNf5inzRCaNqTEjMzO5kjRIXFq9sjcS883OWuTWloF990Ca5CkpydwswmVD5SKeRfkGMzBE5GopGhMAAAAASUVORK5CYII=);background-origin:content-box;background-position:center;background-repeat:no-repeat;background-size:contain;cursor:pointer;font-size:6px;margin:0;padding:0;width:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.data-table-up.sorted{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAOCAIAAACtuNvgAAAABnRSTlMA/wD/AP83WBt9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAZ0lEQVQokZ2SUQ6AMAhDB/EKetVdYV6VS9QPE2PWQqZ8QduXsAUD0L7XJtXTjqfvCA54zfCoMRli0Ws7szwzatIXmSnmGdMR8g/vsI22S0buNi+ZMTxqTIZY9LckGbY6wv7dpHjbSl0wcCvzYSLAvwAAAABJRU5ErkJggg==)!important}.data-table-down.sorted{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAOCAIAAACtuNvgAAAABnRSTlMA/wD/AP83WBt9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAb0lEQVQokZ2S0Q2AMAhED+IKumpX0FW7BH6QNASPquUP7h6FUDEz/A9dYABsAC45PGnWJ9ZokxN71CpyMHzIJFdFslsy0UZKpxpWyjTr4gegMg1/RmPykUHc7ZWMBq2ECZOxinwWyQGSiTaSta98A6LMNe+ezG6VAAAAAElFTkSuQmCC)!important}.data-table-pages{display:inline-block;height:40px;margin:20px 0;padding:0;-webkit-padding-start:0;padding-inline-start:0;-webkit-padding-before:0;padding-block-start:0}.data-table-pages ul{display:inline-block;margin-left:0;margin-bottom:0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.1)}.data-table-pages li{display:inline}.data-table-pages a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.data-table-pages a:hover{background-color:#f5f5f5}.data-table-pages .active a{background-color:#f5f5f5;color:#999;cursor:default}.data-table-pages .disabled a,.data-table-pages .disabled a:hover,.data-table-pages .disabled span{color:#999;background-color:transparent;cursor:default}.data-table-pages li:first-child a{border-left-width:1px;border-radius:3px 0 0 3px}.data-table-pages li:last-child a{border-radius:0 3px 3px 0}.data-table-fade-in{-webkit-animation:1s linear forwards fadein;animation:1s linear forwards fadein}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes fadein{from{opacity:0}to{opacity:1}}.data-table-selected{background-color:#add8e6!important}"]
}] }
];
/** @nocollapse */
DataTableKitComponent.ctorParameters = () => [
{ type: Document, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
DataTableKitComponent.propDecorators = {
_viewContainerRef: [{ type: ViewChild, args: ["gridBody", { read: ViewContainerRef, static: false },] }],
_columnTemplate: [{ type: ViewChild, args: ["columnTemplate", { static: false },] }],
TableHeader: [{ type: ViewChild, args: ["tableHeader", { static: false },] }],
Columns: [{ type: ContentChildren, args: [DataTableColumnDirective,] }],
Children: [{ type: ContentChildren, args: [DataTableChildDirective,] }],
datatableClass: [{ type: Input, args: ["data-table-class",] }],
tabledata: [{ type: Input }],
datacount: [{ type: Input }],
bufferedpageno: [{ type: Input, args: ["buffered-page-no",] }],
bufferedpagecount: [{ type: Input, args: ["buffered-page-count",] }],
allowResize: [{ type: Input }],
pagesize: [{ type: Input }],
collapseChildren: [{ type: Input, args: ["collapse-children",] }],
multiSelect: [{ type: Input, args: ["allow-multiselect",] }],
bufferedPageNoChanged: [{ type: Output }],
sortOrderChanged: [{ type: Output }],
selectionChanged: [{ type: Output }],
editStarted: [{ type: Output }],
editCompleted: [{ type: Output }],
editCancelled: [{ type: Output }]
};
if (false) {
/** @type {?} */
DataTableKitComponent.prototype._viewContainerRef;
/** @type {?} */
DataTableKitComponent.prototype._columnTemplate;
/** @type {?} */
DataTableKitComponent.prototype.TableHeader;
/** @type {?} */
DataTableKitComponent.prototype.Columns;
/** @type {?} */
DataTableKitComponent.prototype.Children;
/** @type {?} */
DataTableKitComponent.prototype.datatableClass;
/** @type {?} */
DataTableKitComponent.prototype.tabledata;
/** @type {?} */
DataTableKitComponent.prototype.datacount;
/** @type {?} */
DataTableKitComponent.prototype.bufferedpageno;
/** @type {?} */
DataTableKitComponent.prototype.bufferedpagecount;
/** @type {?} */
DataTableKitComponent.prototype.allowResize;
/** @type {?} */
DataTableKitComponent.prototype.pagesize;
/** @type {?} */
DataTableKitComponent.prototype.collapseChildren;
/** @type {?} */
DataTableKitComponent.prototype.multiSelect;
/** @type {?} */
DataTableKitComponent.prototype.bufferedPageNoChanged;
/** @type {?} */
DataTableKitComponent.prototype.sortOrderChanged;
/** @type {?} */
DataTableKitComponent.prototype.selectionChanged;
/** @type {?} */
DataTableKitComponent.prototype.editStarted;
/** @type {?} */
DataTableKitComponent.prototype.editCompleted;
/** @type {?} */
DataTableKitComponent.prototype.editCancelled;
/** @type {?} */
DataTableKitComponent.prototype.pageno;
/** @type {?} */
DataTableKitComponent.prototype.pagedata;
/** @type {?} */
DataTableKitComponent.prototype.groups;
/** @type {?} */
DataTableKitComponent.prototype.columnCount;
/** @type {?} */
DataTableKitComponent.prototype.resizeInfo;
/** @type {?} */
DataTableKitComponent.prototype.totalpages;
/** @type {?} */
DataTableKitComponent.prototype.fadein;
/** @type {?} */
DataTableKitComponent.prototype.haschildren;
/** @type {?} */
DataTableKitComponent.prototype.sortInfo;
/** @type {?} */
DataTableKitComponent.prototype.gridid;
/** @type {?} */
DataTableKitComponent.prototype.selectedRows;
/** @type {?} */
DataTableKitComponent.prototype.editingRow;
/** @type {?} */
DataTableKitComponent.prototype.gridStyle;
/** @type {?} */
DataTableKitComponent.prototype.gridClass;
/**
* @type {?}
* @private
*/
DataTableKitComponent.prototype.doc;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS1raXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGF0YS10YWJsZS1raXQvIiwic291cmNlcyI6WyJsaWIvZGF0YS10YWJsZS1raXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFrRCxlQUFlLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFnQixVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeFAsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBUTNDLE1BQU0sT0FBTyxxQkFBcUI7Ozs7SUFpRmhDLFlBQXNDLEdBQWE7UUFBYixRQUFHLEdBQUgsR0FBRyxDQUFVO1FBekUxQyxjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBR3RCLGdCQUFXLEdBQVksSUFBSSxDQUFDO1FBQzVCLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFDRixxQkFBZ0IsR0FBUSxJQUFJLENBQUM7UUFDN0IsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDL0MsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNoRCxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzNDLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDM0MsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3RDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN4QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFbEQsV0FBTSxHQUFXLENBQUMsQ0FB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