UNPKG

@c-standard/angular-devui-extension

Version:

an extensional components lib for devui

333 lines 72.5 kB
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