@c-standard/angular-devui-extension
Version:
an extensional components lib for devui
333 lines • 72.5 kB
JavaScript
import { Component, ContentChildren, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
import { Observable } from 'rxjs';
import { find, isEmpty, isNull, isUndefined, remove } from 'lodash-es';
import { DataStore } from '@c-standard/angular-devui-extension/data';
import { TemplateDirective } from '@c-standard/angular-devui-extension/template';
import * as i0 from "@angular/core";
import * as i1 from "ng-devui";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
export class DataGridComponent {
constructor(ref) {
this.ref = ref;
this.sortMode = 'local';
this.showCheckBox = false;
this.showNumberColumn = true;
this.draggable = false;
this.selectionMode = 'multiple';
this.scrollable = true;
this.sortable = false;
this.headerFilter = false;
this.enablePaging = false;
this.striped = false;
this.border = '';
this.loading = false;
this.clickToSelect = false;
// 触发事件
/**
* 1. 初始化事件
* 2. 行选中事件
* 3. 行点击事件
* 4. 列点击事件
*/
this.initialized = new EventEmitter();
this.rowClick = new EventEmitter();
this.rowDBClick = new EventEmitter();
this.sortChange = new EventEmitter();
this.rowCheckedChange = new EventEmitter();
this.rowDrop = new EventEmitter();
// todo 生成table的id 拖拽的scope方式一个页面加载多个table时冲突问题
// 全选框默认值
this.pageAllChecked = false;
this.halfChecked = false;
// 表格数据
this.dataList = [];
// 表格数据是否为空
this.dataEmpty = false;
this.sorts = [];
this.filters = [];
this.pager = {
total: 0,
pageIndex: 1,
pageSize: 10,
};
// 选中所有
this.checked = (data) => {
data.$checked = true;
};
// 取消选中所有
this.unChecked = (data) => {
data.$checked = false;
};
// 判断数据是否存在选中状态
this.hasChecked = (data) => {
return data.$checked;
};
// 判断数据是否存在未选中状态
this.hasUnChecked = (data) => {
return !data.$checked;
};
}
get dataSource() {
return this._dataSource || [];
}
set dataSource(value) {
this._dataSource = value;
if (this.dataSource instanceof Array) {
this.dataList = this.dataSource;
}
}
get templates() {
if (this.definitions != null) {
const templates = {};
for (const definition of this.definitions.toArray()) {
templates[definition.template] = definition.templateRef;
}
return templates;
}
else {
return {};
}
}
ngOnInit() {
// 加载数据
this.loadData();
// 组件初始化事件
this.initialized.emit({
element: this.ref,
component: this,
});
}
ngAfterContentInit() {
for (const definition of this.definitions.toArray()) {
this.templates[definition.template] = definition.templateRef;
}
}
// 行点击事件
onRowClick(e, rowData) {
if (this.clickToSelect) {
this.dataList.filter((t) => t !== e).forEach(this.unChecked);
rowData['$checked'] = true;
}
this.rowClick.emit({
event: e,
data: rowData,
});
}
// 行双击事件
onRowDBClick(e, rowData) {
this.rowDBClick.emit({
event: e,
data: rowData,
});
}
// 筛选回调事件
onGridFilterChange(e) {
console.log(e);
}
// 排序回调事件
onGridSortChange(e, column) {
// 排序数组
if (isEmpty(e.direction)) {
remove(this.sorts, (t) => t.name === column.name);
}
else {
const sort = find(this.sorts, (t) => t.name == column.name);
if (sort) {
sort.direction = e.direction;
}
else {
this.sorts.push({
name: column.name,
direction: e.direction,
});
}
}
this.sortChange.emit({
name: column.name,
direction: e.direction,
});
this.refresh();
}
// 分页pageSize回调事件
onPageSizeChange() {
this.refresh();
}
// 分页pageIndex回调事件
onPageIndexChange() {
this.refresh();
}
// 行拖动事件
onDrop(e) {
let index = e.dropIndex;
if (this.sortMode === 'local') {
const fromIndex = e.dragFromIndex;
if (-1 !== index) {
/* 修正同一个container排序,往下拖动index多了1个位置*/
if (-1 !== fromIndex && index > fromIndex) {
index--;
}
this.dataList.splice(index, 0, fromIndex === -1 ? e.dragData : this.dataList.splice(fromIndex, 1)[0]);
}
else {
this.dataList.push(e.dragData);
}
}
this.rowDrop.emit({
current: e.dragData,
before: this.dataList[index - 1],
after: this.dataList[index + 1],
});
}
// 全选 todo选中所有数据还是分页数据
onAllCheckBoxChange(e) {
this.halfChecked = false;
if (e) {
this.dataList.forEach(this.checked);
this.pageAllChecked = true;
}
else {
this.pageAllChecked = false;
this.dataList.forEach(this.unChecked);
}
}
// 行选中
onRowCheckBoxChange(index, record) {
if (this.selectionMode === 'single') {
// 单选模式
this.dataList.filter((t) => t !== record).forEach(this.unChecked);
}
else {
// 多选模式
const hasChecked = this.dataList.some(this.hasChecked);
const hasUnChecked = this.dataList.some(this.hasUnChecked);
this.pageAllChecked = !hasUnChecked;
this.halfChecked = hasChecked && hasUnChecked;
}
this.rowCheckedChange.emit({
index: index,
checked: record.$checked,
rowItem: record,
});
}
getSelectedRows() {
return this.dataTable?.getCheckedRows();
}
setFilter(f) {
if (isUndefined(f.value) || isNull(f.value)) {
remove(this.filters, (t) => t.name === f.name);
}
else {
const ft = find(this.filters, (t) => t.name == f.name);
if (ft) {
ft.value = f.value;
ft.salt = f.salt;
}
else {
this.filters.push(f);
}
}
this.refresh();
}
// 刷新数据
refresh() {
this.loadData();
// this.service.loadData()
// todo 数据刷新使用 observable订阅方式
}
/**
* 私有方法
* @private
*/
loadData() {
this.dataEmpty = false;
if (this.dataSource instanceof DataStore) {
this.onLoading = this.dataSource
.load?.({
page: this.pager.pageIndex,
size: this.pager.pageSize,
filter: this.filters,
sorts: this.sorts,
})
.subscribe((resp) => {
this.dataEmpty = true;
if (resp.success) {
this.dataList = resp.data.list;
this.pager.total = resp.data.count;
}
});
}
else if (this.dataSource instanceof Observable) {
this.onLoading = this.dataSource.subscribe((resp) => {
this.dataEmpty = true;
if (resp.success) {
this.pager.total = resp.data.count;
this.dataList = resp.data.list;
}
});
}
else {
this.dataEmpty = true;
this.dataList = this.dataSource;
}
}
}
DataGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: DataGridComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
DataGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: DataGridComponent, selector: "d-data-grid", inputs: { dataSource: "dataSource", className: "className", viewName: "viewName", sortMode: "sortMode", columns: "columns", showCheckBox: "showCheckBox", showNumberColumn: "showNumberColumn", draggable: "draggable", selectionMode: "selectionMode", scrollable: "scrollable", sortable: "sortable", headerFilter: "headerFilter", enablePaging: "enablePaging", striped: "striped", border: "border", loading: "loading", clickToSelect: "clickToSelect" }, outputs: { initialized: "initialized", rowClick: "rowClick", rowDBClick: "rowDBClick", sortChange: "sortChange", rowCheckedChange: "rowCheckedChange", rowDrop: "rowDrop" }, queries: [{ propertyName: "definitions", predicate: TemplateDirective }], viewQueries: [{ propertyName: "dataTable", first: true, predicate: ["DataTable"], descendants: true }], ngImport: i0, template: "<!-- \u662F\u5426\u663E\u793A\u9009\u62E9\u6846, \u662F\u5426\u8FDB\u884C\u62D6\u62FD, \u662F\u5426\u663E\u793A\u5E8F\u53F7\u5217, \u9009\u62E9\u6A21\u5F0F:\u5355\u9009\u548C\u591A\u9009 -->\r\n<div class=\"x-data-table-content\">\r\n <div\r\n class=\"loading-template\"\r\n dLoading\r\n [showLoading]=\"loading\"\r\n [loading]=\"onLoading\"\r\n [message]=\"'\u52A0\u8F7D\u4E2D...'\"\r\n ></div>\r\n <d-data-table\r\n #DataTable\r\n dDroppable\r\n [borderType]=\"border\"\r\n [dropScope]=\"'multiple-group'\"\r\n (dropEvent)=\"onDrop($event)\"\r\n [checkable]=\"showCheckBox\"\r\n [dataSource]=\"dataList\"\r\n [scrollable]=\"true\"\r\n [fixHeader]=\"true\"\r\n [striped]=\"striped\"\r\n [containFixHeaderHeight]=\"true\"\r\n [switchWhileCrossEdge]=\"true\"\r\n tableLayout=\"fixed\"\r\n tableHeight=\"100%\"\r\n >\r\n <thead dTableHead>\r\n <tr dTableRow>\r\n <!-- \u62D6\u62FD\u5217 -->\r\n <th\r\n *ngIf=\"draggable\"\r\n class=\"default\"\r\n style=\"text-align: center\"\r\n >\r\n <span class=\"title\">#</span>\r\n </th>\r\n <!-- \u9009\u62E9\u6846 -->\r\n <th\r\n *ngIf=\"showCheckBox\"\r\n class=\"default\"\r\n style=\"text-align: center\"\r\n >\r\n <span class=\"title default-cell\">\r\n <d-checkbox\r\n *ngIf=\"selectionMode === 'multiple'\"\r\n [(ngModel)]=\"pageAllChecked\"\r\n [halfchecked]=\"halfChecked\"\r\n (change)=\"onAllCheckBoxChange($event)\"\r\n ></d-checkbox>\r\n </span>\r\n </th>\r\n <!-- i18N NumberOrder -->\r\n <th\r\n *ngIf=\"showNumberColumn\"\r\n class=\"default\"\r\n style=\"text-align: center\"\r\n >\r\n <span class=\"title\">\u5E8F\u53F7 </span>\r\n </th>\r\n <th\r\n dHeadCell\r\n *ngFor=\"let column of columns\"\r\n [resizeEnabled]=\"column.resizeEnabled || false\"\r\n (sortChange)=\"onGridSortChange($event, column)\"\r\n [filterable]=\"false\"\r\n [customFilterTemplate]=\"customFilterTemplate\"\r\n (filterChange)=\"onGridFilterChange($event)\"\r\n [sortable]=\"column.sortable || false\"\r\n >\r\n {{ column.caption }}\r\n </th>\r\n </tr>\r\n <tr\r\n *ngIf=\"headerFilter\"\r\n dTableRow\r\n >\r\n <th\r\n dHeadCell\r\n *ngIf=\"draggable\"\r\n ></th>\r\n <th\r\n dHeadCell\r\n *ngIf=\"showCheckBox\"\r\n ></th>\r\n <th\r\n dHeadCell\r\n *ngIf=\"showNumberColumn\"\r\n ></th>\r\n <th *ngFor=\"let column of columns\">\r\n <ng-container\r\n *ngIf=\"column.filterable\"\r\n [ngTemplateOutletContext]=\"{ $implicit: { column: column } }\"\r\n [ngTemplateOutlet]=\"\r\n templates[column.filterTemplate || ''] || defaultTemplate\r\n \"\r\n >\r\n <ng-template #defaultTemplate></ng-template>\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody dTableBody>\r\n <ng-template\r\n let-rowIndex=\"rowIndex\"\r\n let-rowItem=\"rowItem\"\r\n >\r\n <tr\r\n dDraggable\r\n dTableRow\r\n [dragData]=\"rowItem\"\r\n [draggable]=\"draggable\"\r\n [dragScope]=\"'multiple-group'\"\r\n [enableDragFollow]=\"true\"\r\n [dragFollowOptions]=\"{ appendToBody: true }\"\r\n [dragHandle]=\"'.table-drag-row-handle, .table-drag-row-handle *'\"\r\n [ngClass]=\"{ 'table-row-selected': rowItem['$checked'] }\"\r\n (click)=\"onRowClick($event, rowItem)\"\r\n (dblclick)=\"onRowDBClick($event, rowItem)\"\r\n >\r\n <td\r\n *ngIf=\"draggable\"\r\n class=\"table-drag-row-handle default\"\r\n >\r\n <i class=\"icon-drag-small\"></i>\r\n </td>\r\n <td\r\n *ngIf=\"showCheckBox\"\r\n class=\"default\"\r\n style=\"padding: 0; text-align: center\"\r\n >\r\n <span>\r\n <d-checkbox\r\n [(ngModel)]=\"rowItem['$checked']\"\r\n (change)=\"onRowCheckBoxChange(rowIndex, rowItem)\"\r\n ></d-checkbox>\r\n </span>\r\n </td>\r\n <td\r\n *ngIf=\"showNumberColumn\"\r\n class=\"default\"\r\n >\r\n {{ rowIndex + 1 }}\r\n </td>\r\n <td\r\n dTableCell\r\n *ngFor=\"let column of columns\"\r\n >\r\n <ng-container *ngIf=\"column.template; else noCustomTemplate\">\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: {\r\n row: rowItem,\r\n cell: rowItem[column.name],\r\n column: column\r\n }\r\n }\"\r\n [ngTemplateOutlet]=\"\r\n templates[column.template || ''] || defaultTemplate\r\n \"\r\n >\r\n <ng-template #defaultTemplate>\r\n {{ rowItem[column.name] }}\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #noCustomTemplate>\r\n <span *ngIf=\"column.format\">{{column.format(rowItem[column.name])}}</span>\r\n <span *ngIf=\"!column.format\">{{ rowItem[column.name] }}</span>\r\n </ng-template>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </tbody>\r\n <ng-template #noResultTemplateRef>\r\n <div\r\n class=\"empty-data-container\"\r\n *ngIf=\"dataEmpty && !loading\"\r\n >\r\n \u65E0\u6570\u636E\r\n </div>\r\n </ng-template>\r\n </d-data-table>\r\n</div>\r\n<div\r\n *ngIf=\"enablePaging\"\r\n class=\"x-data-table-pagination\"\r\n>\r\n <d-pagination\r\n [(pageIndex)]=\"pager.pageIndex\"\r\n [(pageSize)]=\"pager.pageSize\"\r\n [canChangePageSize]=\"true\"\r\n [canJumpPage]=\"true\"\r\n [canViewTotal]=\"true\"\r\n [maxItems]=\"4\"\r\n (pageSizeChange)=\"onPageSizeChange()\"\r\n (pageIndexChange)=\"onPageIndexChange()\"\r\n [total]=\"pager.total\"\r\n >\r\n </d-pagination>\r\n</div>\r\n\r\n<!-- \u5B9A\u4E49\u5E38\u7528\u7684\u8FC7\u6EE4\u6A21\u677F\uFF0Cstring\u7C7B\u578B\uFF0Cnumber\u7C7B\u578B\uFF0C Boolean\u7C7B\u578B \u548C \u65F6\u95F4\u65E5\u671F\u7C7B\u578B -->\r\n<ng-template\r\n #customFilterTemplate\r\n let-filterList=\"filterListDisplay\"\r\n let-dropdown=\"dropdown\"\r\n>\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{ $implicit: { filterList: filterList, dropdown: dropdown } }\"\r\n [ngTemplateOutlet]=\"defaultTemplate\"\r\n >\r\n <ng-template #defaultTemplate>\r\n {{ 123 }}\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n", styles: [":host{display:flex;flex-direction:column;height:100%;min-height:120px}:host .x-data-table-content{flex:auto;display:block;position:relative;height:inherit;overflow:hidden}:host .x-data-table-content .loading-template{position:absolute!important;width:100%;height:calc(100% - 45px);margin-top:45px}:host .x-data-table-pagination{margin-top:16px;text-align:right}:host .empty-data-container{text-align:center;position:absolute;top:90px;width:100%}.default{text-align:center;width:60px;min-width:40px}.default span{display:inline-block}::ng-deep .sort-clickable{position:relative!important;top:0!important;left:0!important}::ng-deep .sort-clickable i{display:inline-block;vertical-align:middle;height:16px;margin-top:-3px}.table-column-header{-webkit-user-select:none;user-select:none}.table-data-empty-text{text-align:center;margin-top:20px}\n"], components: [{ type: i1.DataTableComponent, selector: "d-data-table", inputs: ["checkable", "headerCheckDisabled", "headerCheckVisible", "checkOptions", "showExpandToggle", "fixHeader", "scrollable", "editModel", "maxWidth", "maxHeight", "type", "rowHoveredHighlight", "generalRowHoveredData", "cssClass", "tableWidth", "tableHeight", "containFixHeaderHeight", "onlyOneColumnSort", "multiSort", "resizeable", "colDraggable", "colDropFreezeTo", "detailTemplateRef", "timeout", "showOperationArea", "showSortIcon", "showFilterIcon", "beforeCellEdit", "tableLevel", "checkableRelation", "loadChildrenTable", "loadAllChildrenTable", "virtualScroll", "headerExpandConfig", "virtualItemSize", "virtualMinBufferPx", "virtualMaxBufferPx", "lazy", "tableWidthConfig", "headerBg", "tableLayout", "borderType", "striped", "minHeight", "size", "shadowType", "tableOverflowType", "dataSource", "hideColumn", "pageAllChecked"], outputs: ["multiSortChange", "cellClick", "cellDBClick", "rowClick", "rowDBClick", "detialToggle", "cellEditStart", "cellEditEnd", "rowCheckChange", "checkAllChange", "loadMore", "resize", "childrenTableClose", "allChildrenTableClose", "tableScrollEvent", "columnDragEnd"], exportAs: ["dataTable"] }, { type: i1.TableTheadComponent, selector: "[dTableHead]", inputs: ["checkable", "checkDisabled", "checkOptions"] }, { type: i1.TableTrComponent, selector: "[dTableRow]", outputs: ["headerCheckStatusEvent", "checkStatusEvent"] }, { type: i1.CheckBoxComponent, selector: "d-checkbox", inputs: ["name", "label", "cssClass", "color", "disabled", "isShowTitle", "title", "labelTemplate", "halfchecked", "showAnimation", "beforeChange"], outputs: ["change"] }, { type: i1.TableThComponent, selector: "[dHeadCell]", inputs: ["resizeEnabled", "filterable", "beforeFilter", "customFilterTemplate", "extraFilterTemplate", "searchFn", "showFilterIcon", "filterList", "filterIconActive", "filterMultiple", "closeFilterWhenScroll", "filterBoxWidth", "filterBoxHeight", "sortable", "sortDirection", "showSortIcon", "colDraggable", "nestedColumn", "iconFoldTable", "iconUnFoldTable", "tableViewRefElement", "minWidth", "maxWidth", "fixedLeft", "fixedRight", "isLastFixedLeft", "isFirstFixedRight", "childrenTableOpen", "column"], outputs: ["filterChange", "filterToggle", "sortDirectionChange", "sortChange", "resizeEndEvent", "resizeStartEvent", "resizingEvent", "toggleChildrenTableEvent", "tapEvent"] }, { type: i1.TableTbodyComponent, selector: "[dTableBody]", inputs: ["dataSource", "rowTemplete", "nestedLayer", "nestedIndex", "virtualScroll", "tableWidthConfig", "minHeight", "minHeightStretchRow"] }, { type: i1.TableTdComponent, selector: "[dTableCell]", inputs: ["editable", "editableTip", "nestedColumn", "nestedLayer", "field", "rowItem", "fixedLeft", "fixedRight", "iconFoldTable", "iconUnFoldTable", "nestedColumnIndent", "beforeEditStart", "beforeEditEnd", "editing"], outputs: ["toggleChildTableEvent", "editStatusEvent", "editingChange"] }, { type: i1.PaginationComponent, selector: "d-pagination", inputs: ["pageSize", "pageSizeOptions", "pageSizeDirection", "pageIndex", "maxItems", "preLink", "nextLink", "size", "canJumpPage", "canChangePageSize", "canViewTotal", "cssClass", "showJumpButton", "showTruePageIndex", "id", "totalItemText", "goToText", "selectDirection", "lite", "showPageSelector", "haveConfigMenu", "autoFixPageIndex", "autoHide", "total"], outputs: ["pageIndexChange", "pageSizeChange"], exportAs: ["pagination"] }], directives: [{ type: i1.LoadingDirective, selector: "[dLoading]", inputs: ["message", "backdrop", "loadingTemplateRef", "positionType", "view", "showLoading", "loading", "zIndex"], exportAs: ["dLoading"] }, { type: i1.DroppableDirective, selector: "[dDroppable]", inputs: ["dragOverClass", "dropScope", "placeholderTag", "placeholderStyle", "placeholderText", "allowDropOnItem", "dragOverItemClass", "nestingTargetRect", "switchWhileCrossEdge", "defaultDropPosition", "dropSortCountSelector", "dropSortVirtualScrollOption"], outputs: ["dragEnterEvent", "dragOverEvent", "dragLeaveEvent", "dropEvent"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.DraggableDirective, selector: "[dDraggable]", inputs: ["dragData", "dragHandle", "dragEffect", "dragScope", "dragHandleClass", "dragOverClass", "disabled", "enableDragFollow", "dragFollowOptions", "originPlaceholder", "dragIdentity", "dragItemParentName", "dragItemChildrenName"], outputs: ["dragStartEvent", "dragEvent", "dragEndEvent", "dropEndEvent"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: DataGridComponent, decorators: [{
type: Component,
args: [{ selector: 'd-data-grid', template: "<!-- \u662F\u5426\u663E\u793A\u9009\u62E9\u6846, \u662F\u5426\u8FDB\u884C\u62D6\u62FD, \u662F\u5426\u663E\u793A\u5E8F\u53F7\u5217, \u9009\u62E9\u6A21\u5F0F:\u5355\u9009\u548C\u591A\u9009 -->\r\n<div class=\"x-data-table-content\">\r\n <div\r\n class=\"loading-template\"\r\n dLoading\r\n [showLoading]=\"loading\"\r\n [loading]=\"onLoading\"\r\n [message]=\"'\u52A0\u8F7D\u4E2D...'\"\r\n ></div>\r\n <d-data-table\r\n #DataTable\r\n dDroppable\r\n [borderType]=\"border\"\r\n [dropScope]=\"'multiple-group'\"\r\n (dropEvent)=\"onDrop($event)\"\r\n [checkable]=\"showCheckBox\"\r\n [dataSource]=\"dataList\"\r\n [scrollable]=\"true\"\r\n [fixHeader]=\"true\"\r\n [striped]=\"striped\"\r\n [containFixHeaderHeight]=\"true\"\r\n [switchWhileCrossEdge]=\"true\"\r\n tableLayout=\"fixed\"\r\n tableHeight=\"100%\"\r\n >\r\n <thead dTableHead>\r\n <tr dTableRow>\r\n <!-- \u62D6\u62FD\u5217 -->\r\n <th\r\n *ngIf=\"draggable\"\r\n class=\"default\"\r\n style=\"text-align: center\"\r\n >\r\n <span class=\"title\">#</span>\r\n </th>\r\n <!-- \u9009\u62E9\u6846 -->\r\n <th\r\n *ngIf=\"showCheckBox\"\r\n class=\"default\"\r\n style=\"text-align: center\"\r\n >\r\n <span class=\"title default-cell\">\r\n <d-checkbox\r\n *ngIf=\"selectionMode === 'multiple'\"\r\n [(ngModel)]=\"pageAllChecked\"\r\n [halfchecked]=\"halfChecked\"\r\n (change)=\"onAllCheckBoxChange($event)\"\r\n ></d-checkbox>\r\n </span>\r\n </th>\r\n <!-- i18N NumberOrder -->\r\n <th\r\n *ngIf=\"showNumberColumn\"\r\n class=\"default\"\r\n style=\"text-align: center\"\r\n >\r\n <span class=\"title\">\u5E8F\u53F7 </span>\r\n </th>\r\n <th\r\n dHeadCell\r\n *ngFor=\"let column of columns\"\r\n [resizeEnabled]=\"column.resizeEnabled || false\"\r\n (sortChange)=\"onGridSortChange($event, column)\"\r\n [filterable]=\"false\"\r\n [customFilterTemplate]=\"customFilterTemplate\"\r\n (filterChange)=\"onGridFilterChange($event)\"\r\n [sortable]=\"column.sortable || false\"\r\n >\r\n {{ column.caption }}\r\n </th>\r\n </tr>\r\n <tr\r\n *ngIf=\"headerFilter\"\r\n dTableRow\r\n >\r\n <th\r\n dHeadCell\r\n *ngIf=\"draggable\"\r\n ></th>\r\n <th\r\n dHeadCell\r\n *ngIf=\"showCheckBox\"\r\n ></th>\r\n <th\r\n dHeadCell\r\n *ngIf=\"showNumberColumn\"\r\n ></th>\r\n <th *ngFor=\"let column of columns\">\r\n <ng-container\r\n *ngIf=\"column.filterable\"\r\n [ngTemplateOutletContext]=\"{ $implicit: { column: column } }\"\r\n [ngTemplateOutlet]=\"\r\n templates[column.filterTemplate || ''] || defaultTemplate\r\n \"\r\n >\r\n <ng-template #defaultTemplate></ng-template>\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody dTableBody>\r\n <ng-template\r\n let-rowIndex=\"rowIndex\"\r\n let-rowItem=\"rowItem\"\r\n >\r\n <tr\r\n dDraggable\r\n dTableRow\r\n [dragData]=\"rowItem\"\r\n [draggable]=\"draggable\"\r\n [dragScope]=\"'multiple-group'\"\r\n [enableDragFollow]=\"true\"\r\n [dragFollowOptions]=\"{ appendToBody: true }\"\r\n [dragHandle]=\"'.table-drag-row-handle, .table-drag-row-handle *'\"\r\n [ngClass]=\"{ 'table-row-selected': rowItem['$checked'] }\"\r\n (click)=\"onRowClick($event, rowItem)\"\r\n (dblclick)=\"onRowDBClick($event, rowItem)\"\r\n >\r\n <td\r\n *ngIf=\"draggable\"\r\n class=\"table-drag-row-handle default\"\r\n >\r\n <i class=\"icon-drag-small\"></i>\r\n </td>\r\n <td\r\n *ngIf=\"showCheckBox\"\r\n class=\"default\"\r\n style=\"padding: 0; text-align: center\"\r\n >\r\n <span>\r\n <d-checkbox\r\n [(ngModel)]=\"rowItem['$checked']\"\r\n (change)=\"onRowCheckBoxChange(rowIndex, rowItem)\"\r\n ></d-checkbox>\r\n </span>\r\n </td>\r\n <td\r\n *ngIf=\"showNumberColumn\"\r\n class=\"default\"\r\n >\r\n {{ rowIndex + 1 }}\r\n </td>\r\n <td\r\n dTableCell\r\n *ngFor=\"let column of columns\"\r\n >\r\n <ng-container *ngIf=\"column.template; else noCustomTemplate\">\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: {\r\n row: rowItem,\r\n cell: rowItem[column.name],\r\n column: column\r\n }\r\n }\"\r\n [ngTemplateOutlet]=\"\r\n templates[column.template || ''] || defaultTemplate\r\n \"\r\n >\r\n <ng-template #defaultTemplate>\r\n {{ rowItem[column.name] }}\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #noCustomTemplate>\r\n <span *ngIf=\"column.format\">{{column.format(rowItem[column.name])}}</span>\r\n <span *ngIf=\"!column.format\">{{ rowItem[column.name] }}</span>\r\n </ng-template>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </tbody>\r\n <ng-template #noResultTemplateRef>\r\n <div\r\n class=\"empty-data-container\"\r\n *ngIf=\"dataEmpty && !loading\"\r\n >\r\n \u65E0\u6570\u636E\r\n </div>\r\n </ng-template>\r\n </d-data-table>\r\n</div>\r\n<div\r\n *ngIf=\"enablePaging\"\r\n class=\"x-data-table-pagination\"\r\n>\r\n <d-pagination\r\n [(pageIndex)]=\"pager.pageIndex\"\r\n [(pageSize)]=\"pager.pageSize\"\r\n [canChangePageSize]=\"true\"\r\n [canJumpPage]=\"true\"\r\n [canViewTotal]=\"true\"\r\n [maxItems]=\"4\"\r\n (pageSizeChange)=\"onPageSizeChange()\"\r\n (pageIndexChange)=\"onPageIndexChange()\"\r\n [total]=\"pager.total\"\r\n >\r\n </d-pagination>\r\n</div>\r\n\r\n<!-- \u5B9A\u4E49\u5E38\u7528\u7684\u8FC7\u6EE4\u6A21\u677F\uFF0Cstring\u7C7B\u578B\uFF0Cnumber\u7C7B\u578B\uFF0C Boolean\u7C7B\u578B \u548C \u65F6\u95F4\u65E5\u671F\u7C7B\u578B -->\r\n<ng-template\r\n #customFilterTemplate\r\n let-filterList=\"filterListDisplay\"\r\n let-dropdown=\"dropdown\"\r\n>\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{ $implicit: { filterList: filterList, dropdown: dropdown } }\"\r\n [ngTemplateOutlet]=\"defaultTemplate\"\r\n >\r\n <ng-template #defaultTemplate>\r\n {{ 123 }}\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n", styles: [":host{display:flex;flex-direction:column;height:100%;min-height:120px}:host .x-data-table-content{flex:auto;display:block;position:relative;height:inherit;overflow:hidden}:host .x-data-table-content .loading-template{position:absolute!important;width:100%;height:calc(100% - 45px);margin-top:45px}:host .x-data-table-pagination{margin-top:16px;text-align:right}:host .empty-data-container{text-align:center;position:absolute;top:90px;width:100%}.default{text-align:center;width:60px;min-width:40px}.default span{display:inline-block}::ng-deep .sort-clickable{position:relative!important;top:0!important;left:0!important}::ng-deep .sort-clickable i{display:inline-block;vertical-align:middle;height:16px;margin-top:-3px}.table-column-header{-webkit-user-select:none;user-select:none}.table-data-empty-text{text-align:center;margin-top:20px}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { dataSource: [{
type: Input
}], className: [{
type: Input
}], viewName: [{
type: Input
}], sortMode: [{
type: Input
}], columns: [{
type: Input
}], showCheckBox: [{
type: Input
}], showNumberColumn: [{
type: Input
}], draggable: [{
type: Input
}], selectionMode: [{
type: Input
}], scrollable: [{
type: Input
}], sortable: [{
type: Input
}], headerFilter: [{
type: Input
}], enablePaging: [{
type: Input
}], striped: [{
type: Input
}], border: [{
type: Input
}], loading: [{
type: Input
}], clickToSelect: [{
type: Input
}], initialized: [{
type: Output
}], rowClick: [{
type: Output
}], rowDBClick: [{
type: Output
}], sortChange: [{
type: Output
}], rowCheckedChange: [{
type: Output
}], rowDrop: [{
type: Output
}], dataTable: [{
type: ViewChild,
args: ['DataTable']
}], definitions: [{
type: ContentChildren,
args: [TemplateDirective]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvZGF0YS1ncmlkL2RhdGEtZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2RhdGEtZ3JpZC9kYXRhLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQUUsZUFBZSxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUEwQixTQUFTLEdBQUcsTUFBTSxlQUFlLENBQUM7QUFFbEssT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV2RSxPQUFPLEVBQUUsU0FBUyxFQUFrQixNQUFNLDBDQUEwQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7OztBQU9qRixNQUFNLE9BQU8saUJBQWlCO0lBeUkxQixZQUFvQixHQUFlO1FBQWYsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQW5IbkMsYUFBUSxHQUF3QixPQUFPLENBQUM7UUFNeEMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFHOUIscUJBQWdCLEdBQVksSUFBSSxDQUFDO1FBR2pDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFHM0Isa0JBQWEsR0FBbUIsVUFBVSxDQUFDO1FBRzNDLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFHM0IsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUcxQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUc5QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUc5QixZQUFPLEdBQVksS0FBSyxDQUFDO1FBR3pCLFdBQU0sR0FBbUMsRUFBRSxDQUFD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RFQsTUFBTTtnQkFPUCxVQUFVO3NCQURULE1BQU07Z0JBSVAsZ0JBQWdCO3NCQURmLE1BQU07Z0JBUVAsT0FBTztzQkFETixNQUFNO2dCQUdpQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBRWMsV0FBVztzQkFBOUMsZUFBZTt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGF0YVRhYmxlQ29tcG9uZW50LCBGaWx0ZXJDb25maWcsIExvYWRpbmdUeXBlLCBTb3J0RXZlbnRBcmcgfSBmcm9tICduZy1kZXZ1aSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmluZCwgaXNFbXB0eSwgaXNOdWxsLCBpc1VuZGVmaW5lZCwgcmVtb3ZlIH0gZnJvbSAnbG9kYXNoLWVzJztcclxuaW1wb3J0IHsgRENvbHVtbiwgRFNlbGVjdGlvbk1vZGUgfSBmcm9tICcuL2RhdGEtZ3JpZCc7XHJcbmltcG9ydCB7IERhdGFTdG9yZSwgREZpbHRlciwgRFNvcnQgfSBmcm9tICdAYy1zdGFuZGFyZC9hbmd1bGFyLWRldnVpLWV4dGVuc2lvbi9kYXRhJztcclxuaW1wb3J0IHsgVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICdAYy1zdGFuZGFyZC9hbmd1bGFyLWRldnVpLWV4dGVuc2lvbi90ZW1wbGF0ZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZC1kYXRhLWdyaWQnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9kYXRhLWdyaWQuY29tcG9uZW50Lmxlc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGFHcmlkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcclxuICAgIHByaXZhdGUgX2RhdGFTb3VyY2U/OiBBcnJheTxhbnk+IHwgT2JzZXJ2YWJsZTxhbnk+IHwgRGF0YVN0b3JlPGFueT47XHJcblxyXG4gICAgZ2V0IGRhdGFTb3VyY2UoKTogQXJyYXk8YW55PiB8IE9ic2VydmFibGU8YW55PiB8IERhdGFTdG9yZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZSB8fCBbXTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGRhdGFTb3VyY2UodmFsdWU6IEFycmF5PGFueT4gfCBPYnNlcnZhYmxlPGFueT4gfCBEYXRhU3RvcmU8YW55Pikge1xyXG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5kYXRhU291cmNlIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhTGlzdCA9IHRoaXMuZGF0YVNvdXJjZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGNsYXNzTmFtZT86IHN0cmluZztcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgdmlld05hbWU/OiBzdHJpbmc7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNvcnRNb2RlPzogJ2xvY2FsJyB8ICdyZW1vdGUnID0gJ2xvY2FsJztcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgY29sdW1ucz86IERDb2x1bW5bXTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2hvd0NoZWNrQm94OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNob3dOdW1iZXJDb2x1bW46IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBkcmFnZ2FibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2VsZWN0aW9uTW9kZTogRFNlbGVjdGlvbk1vZGUgPSAnbXVsdGlwbGUnO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzY3JvbGxhYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc29ydGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgaGVhZGVyRmlsdGVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGVuYWJsZVBhZ2luZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzdHJpcGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGJvcmRlcjogJycgfCAnYm9yZGVyZWQnIHwgJ2JvcmRlcmxlc3MnID0gJyc7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgY2xpY2tUb1NlbGVjdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLy8g6Kem5Y+R5LqL5Lu2XHJcbiAgICAvKipcclxuICAgICAqIDEuIOWIneWni+WMluS6i+S7tlxyXG4gICAgICogMi4g6KGM6YCJ5Lit5LqL5Lu2XHJcbiAgICAgKiAzLiDooYzngrnlh7vkuovku7ZcclxuICAgICAqIDQuIOWIl+eCueWHu+S6i+S7tlxyXG4gICAgICovXHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBpbml0aWFsaXplZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHJvd0NsaWNrOiBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgZGF0YTogYW55IH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7XHJcbiAgICAgICAgZXZlbnQ6IE1vdXNlRXZlbnQ7XHJcbiAgICAgICAgZGF0YTogYW55O1xyXG4gICAgfT4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHJvd0RCQ2xpY2s6IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBNb3VzZUV2ZW50OyBkYXRhOiBhbnkgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHtcclxuICAgICAgICBldmVudDogTW91c2VFdmVudDtcclxuICAgICAgICBkYXRhOiBhbnk7XHJcbiAgIC