/* * @Author: 疯狂秀才(Lucas Huang) * @Date: 2019-04-08 16:51:39 * @LastEditors: 疯狂秀才(Lucas Huang) * @LastEditTime: 2019-09-23 16:51:21 * @QQ: 1055818239 * @Version: v0.0.1 */ import { Component, OnInit, Input, EventEmitter, AfterViewInit, Output, ElementRef, Renderer2, ViewChild } from '@angular/core'; import { deepCopy, convertColumns } from '../datatable-column'; import { DataTableService } from '../datatable.service'; import { DataColumn } from '@farris/ui-common/column'; import { CommonUtils } from '@farris/ui-common'; import { DataTableComponent } from '../datatable.component'; import { DTCheckboxComponent } from '../datatable-checkbox.component'; @Component({ selector: 'datatable-header', template: `
{{ col.title }}
`, styleUrls: ['./datatable-header.component.scss'] }) export class DataTableHeaderComponent implements OnInit, AfterViewInit { @Input() size: string; @Input() hover: boolean; @Input() columns: DataColumn[] = []; @Input() singleSelect = true; @Input() fixed: string; // 数据排序使用 @Input() rows: any; // 恢复源数据使用 @Input() data: any; @Input() rowClassName: (row: any, index: number) => string; @Output() checkedAll = new EventEmitter(); @Output() rowsChange = new EventEmitter(); @Output() loadData = new EventEmitter<{ pageSize: number; total: number; data: any; pageIndex: number }>(); @ViewChild('checkall') checkallEl: DTCheckboxComponent; sortType = {}; filterFields = {}; clickedUp = false; clickedDown = false; copyColumns: any; copyRows: any; originRows: any; isCheckAll = false; allClass = ' '; constructor( public el: ElementRef, private dataService: DataTableService, private render: Renderer2, public utils: CommonUtils, private dt: DataTableComponent ) { this.allClass += this.el.nativeElement.classList.value; this.dataService.updateCheckAllStatus.subscribe( (n: number) => { if (n !== 2) { this.isCheckAll = n ? true : false; // this.checkallEl.elementRef.nativeElement.checked = this.isCheckAll; } else { this.isCheckAll = false; // this.checkallEl.elementRef.nativeElement.checked = false; } }); } width = '100%'; ngOnInit() { if (this.fixed === 'left') { this.columns = convertColumns(this.columns, 'left'); } if (this.fixed === 'right') { this.columns = convertColumns(this.columns, 'right'); } } ngAfterViewInit() {} onCheckedChange($event) { this.isCheckAll = $event.checked; this.checkedAll.emit($event.checked); } createRowClassName(row, index) { return this.rowClassName ? this.rowClassName(row, index) : ''; } private compare(a, b) { if (typeof a === 'string') { return a.localeCompare(b); } else { return a === b ? 0 : (a > b ? 1 : -1); } } private _sort(r1, r2) { let r = 0; const sortFields = this.dt.sortName.split(','); const orders = this.dt.sortOrder.split(','); if (!this.dt.sortName) { return r; } for (let i = 0; i < sortFields.length; i++) { const sn = sortFields[i]; const so = orders[i]; const col = this.columns.find(c => c.field === sn); const orderby = col['sorter'] || this.compare; let v1 = this.utils.getValue(sn, r1); if (v1 === null || v1 === undefined) { v1 = ''; } let v2 = this.utils.getValue(sn, r2); if (v2 === null || v2 === undefined) { v2 = ''; } r = orderby(v1, v2); if (r !== 0) { return r * (so === 'asc' ? 1 : -1); } } return r; } private clientSort() { const sortedData = this.data.sort(this._sort.bind(this)); this.loadData.emit(sortedData); } onSortColumnClick($event, col) { if (!col.sortable) { return; } const sortName = this.dt.sortName; const sortOrder = this.dt.sortOrder; let sortFields = []; let sortOrders = []; if (sortName) { sortFields = sortName.split(','); sortOrders = sortOrder.split(','); } const colOrder = col.order || 'asc'; let newOrder = colOrder; const i = sortFields.findIndex(n => n === col.field); if (i >= 0) { const _order = sortOrders[i] === 'asc' ? 'desc' : 'asc'; newOrder = _order; if (this.dt.multiSort && newOrder === 'asc') { newOrder = undefined; sortFields.splice(i, 1); sortOrders.splice(i, 1); if (sortFields.length === 0) { sortFields.push(col.field); sortOrders.push('asc'); newOrder = 'asc'; } } else { sortOrders[i] = _order; } } else { if (this.dt.multiSort) { sortFields.push(col.field); sortOrders.push(colOrder); } else { sortFields = [col.field]; sortOrders = [colOrder]; } } col.order = newOrder; this.dt.sortName = sortFields.join(','); this.dt.sortOrder = sortOrders.join(','); // this.dfs.setSortInfo(this.dg.sortName, this.dg.sortOrder); if (!this.dt.multiSort) { const updateFieldOrder = (cols: DataColumn[]) => { if (!cols || !cols.length) { return; } cols.forEach(c => { c.order = undefined; const k = sortFields.findIndex(f => f === c.field); if (k >= 0) { c.order = sortOrders[k]; } }); }; updateFieldOrder(this.columns); // this.cdRef.detectChanges(); } this.dt.beforeSortColumn(this.dt.sortName, this.dt.sortOrder).subscribe(() => { if (this.dt.remoteSort) { // this.reload(); } else { this.clientSort(); } this.dt.columnSorted.emit({ sortName: this.dt.sortName, sortOrder: this.dt.sortOrder }); }); } deepCopyData() { const copyColumns = deepCopy(this.columns); const copyRows = deepCopy(this.rows); copyColumns.forEach(element => { element.sortType = 'normal'; }); return { copyColumns, copyRows }; } /* 若存在筛选条件 保存按钮可点击 */ hasChecked(col) { if (this.filterFields.hasOwnProperty(col.field)) { this.filterFields[col.field].some(ele => { return ele.checked; }); } return false; } }