UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

1,450 lines 250 kB
/** * @fileoverview added by tsickle * Generated from: data-table-head.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, IterableDiffers, KeyValueDiffers, NgZone, Output } from '@angular/core'; import { BehaviorSubject, fromEvent } from 'rxjs'; import { debounceTime, map, switchMap } from 'rxjs/operators'; import { DataTableComponent } from './data-table.component'; import { DataTableColumnTmplComponent } from './tmpl/data-table-column-tmpl.component'; import { DataTableHeadTmplComponent } from './tmpl/data-table-head-tmpl.component'; import { I18nService } from '@duoduo-oba/ng-devui/i18n'; /** @type {?} */ const documentElement = document.documentElement; export class DataTableHeadComponent { /** * @param {?} dt * @param {?} zone * @param {?} element * @param {?} differs * @param {?} iterableDiffers * @param {?} ref * @param {?} i18n */ constructor(dt, zone, element, differs, iterableDiffers, ref, i18n) { this.dt = dt; this.zone = zone; this.element = element; this.differs = differs; this.iterableDiffers = iterableDiffers; this.ref = ref; this.i18n = i18n; this.multiSort = []; this.dataSource = []; this.headClickSortEvent = new EventEmitter(); this.resizeHandlerEvent = new EventEmitter(); this.beginResizeHandlerEvent = new EventEmitter(); this.resizingHandlerEvent = new EventEmitter(); this.dragTableEndEvent = new EventEmitter(); this.searchQuery = {}; this.multiSortArray = []; this.rowItem = undefined; this.classes = { originTable: 'sindu_origin_table', draggableTable: 'sindu_dragger', dragging: 'sindu_dragging', static: 'sindu_static', handle: 'sindu_handle', }; this.oldCoord = 0; this.childTables = []; this.dataSourceChange = false; this.tableScrollbarWidth = 0; this.colOffset = 0; this.seconedHeaderOffset = 0; this.cellMapOffset = 0; this.cellMap = {}; this.searchText = ''; this.filterListDisplay = []; this.isFilterHidden = false; this.checkedListForFilter = []; this.handleMousemove = (/** * @param {?} e * @return {?} */ (e) => { e.preventDefault(); documentElement.removeEventListener('mousemove', this.handleMousemove); documentElement.addEventListener('mousedown', this.grab); documentElement.addEventListener('mouseup', this.release); setTimeout((/** * @return {?} */ () => { this.dispatchMousedown(); })); }); this.grab = (/** * @param {?} e * @return {?} */ (e) => { e.preventDefault(); documentElement.removeEventListener('mousedown', this.grab); this.addClass(documentElement, 'gu-unselectable'); /** @type {?} */ const context = this.canStart(e.target); this.grabbed = context; documentElement.addEventListener('mousemove', this.startBecauseMouseMoved); }); this.startBecauseMouseMoved = (/** * @param {?} e * @return {?} */ (e) => { e.preventDefault(); if (!this.grabbed) { return; } documentElement.removeEventListener('mousemove', this.startBecauseMouseMoved); documentElement.addEventListener('mousemove', this.drag); this.source = this.grabbed.source; this.item = this.grabbed.item; this.initialSibling = this.currentSibling = this.nextEl(this.grabbed.item); this.addClass(this.item, 'gu-transit'); this.el.style.display = 'flex'; this.el.style.position = 'relative'; this.originTable.style.display = 'none'; if (this.fixHeader) { this.fixTableOffsetTop = this.fixOriginTable.parentNode.parentNode.scrollTop; this.fixFakeTableEl.style.display = 'flex'; this.fixOriginTable.style.display = 'none'; this.fixFakeTableEl.style.position = 'relative'; } this.offsetX = 15; this.offsetY = 15; this.renderMirrorImage(this.item); }); this.release = (/** * @param {?} e * @return {?} */ (e) => { e.preventDefault(); this.grabbed = null; documentElement.removeEventListener('mousemove', this.drag); documentElement.removeEventListener('mouseup', this.release); /** @type {?} */ const to = Array.from(this.el.children).indexOf(this.item); this.removeMirrorImage(); this.el.style.display = 'none'; this.originTable.style.display = 'table'; if (this.fixHeader) { this.fixFakeTableEl.style.display = 'none'; this.fixOriginTable.style.display = 'table'; this.fixFakeTableEl.style.position = 'absolute'; } documentElement.style.overflow = this.bodyOverflow; documentElement.removeEventListener('mouseup', this.release); if (this.item) { this.rmClass(this.item, 'gu-transit'); } this.sortColumn(this.originCellIndex.x, to); cancelAnimationFrame(this.animationRequestId); }); this.sortColumn = (/** * @param {?} from * @param {?} to * @return {?} */ (from, to) => { if (from === to) { return; } /** @type {?} */ let offset = 0; if (this.checkable) { offset++; } if (this.showExpandToggle) { offset++; } from = from - offset; to = to - offset; /** @type {?} */ let toCell = this.cellMap[to].sortKey[0]; /** @type {?} */ let fromCell = this.cellMap[from].sortKey[0]; /** @type {?} */ let loopCount = 1; if (this.cellMap[from].isAdvanceHeader) { loopCount = this.cellMap[from].headerLength; if (from > to) { fromCell = this.cellMap[from].sortKey[this.cellMap[from].headerLength - 1]; } } if (this.cellMap[to].isAdvanceHeader && from < to) { toCell = this.cellMap[to].sortKey[this.cellMap[to].headerLength - 1]; } for (let i = 0; i < loopCount; i++) { this.dragTableEndEvent.emit({ from: fromCell, to: toCell }); } }); this.sort = (/** * @param {?} __0 * @return {?} */ ({ list, from, to }) => { if (!list[from] && !list[to]) { return; } if (from < to) { this.appendSibling({ target: list[from], origin: list[to] }); } else { this.insertBeforeSibling({ target: list[from], origin: list[to] }); } }); this.rerenderTables = (/** * @return {?} */ () => { this.dataSourceChange = true; if (this.fixHeader && this.tableBodyEl) { this.fixOriginTable = this.tableBodyEl.nativeElement; setTimeout((/** * @return {?} */ () => { this.renderFixFakeTableEl(); this.fixFakeTableEl.style.display = 'none'; })); } else { this.detecteOriginTable(); setTimeout((/** * @return {?} */ () => { this.renderFakeTable(); this.el.style.display = 'none'; })); } }); this.drag = (/** * @param {?} e * @return {?} */ (e) => { e.preventDefault(); if (!this.mirror) { return; } /** @type {?} */ const clientX = this.getCoord('clientX', e); /** @type {?} */ const clientY = this.getCoord('clientY', e); if (this.animationRequestId) { cancelAnimationFrame(this.animationRequestId); this.animationRequestId = null; } this.handleScroll(clientX, clientY, e); documentElement.style.overflow = 'hidden'; /** @type {?} */ const x = clientX - this.offsetX; /** @type {?} */ const y = clientY - this.offsetY; this.mirror.style.left = x + 'px'; this.mirror.style.top = y + 'px'; this.mirror.style.visibility = 'visible'; /** @type {?} */ const elementBehindCursor = this.getElementBehindPoint(this.mirror, clientX, clientY); /** @type {?} */ const dropTarget = this.findDropTarget(elementBehindCursor, clientX, clientY); if (!dropTarget) { return; } /** @type {?} */ const immediate = this.getImmediateChild(dropTarget, elementBehindCursor); /** @type {?} */ let reference; if (immediate) { reference = this.getReference(dropTarget, immediate, clientX); } /** @type {?} */ const changed = dropTarget !== null && dropTarget !== this.lastDropTarget; if (changed || dropTarget === null) { this.lastDropTarget = dropTarget; } if ((reference === null && changed) || reference !== this.item && reference !== this.nextEl(this.item)) { /** @type {?} */ let mover; /** @type {?} */ const nowCord = e.pageX; if (nowCord < this.oldCoord) { mover = reference; // upward or right } else { mover = reference ? (reference.previousElementSibling ? reference.previousElementSibling : reference) : dropTarget.lastElementChild; } this.oldCoord = nowCord; /** @type {?} */ let from; /** @type {?} */ let to; /** @type {?} */ let moverIndex; /** @type {?} */ let fixItemRect; /** @type {?} */ let fixItem; /** @type {?} */ let fixMoverRect; /** @type {?} */ let fixMover; if (this.fixHeader) { from = Array.from(this.el.children).indexOf(this.item); to = Array.from(this.el.children).indexOf(reference); moverIndex = Array.from(this.el.children).indexOf(mover); fixItem = Array.from(this.fixFakeTableEl.children)[from]; fixItemRect = fixItem.getBoundingClientRect(); fixMover = Array.from(this.fixFakeTableEl.children)[moverIndex]; fixMoverRect = moverIndex !== -1 && fixMover.getBoundingClientRect(); } /** @type {?} */ const moverRect = mover && mover.getBoundingClientRect(); /** @type {?} */ const itemRact = this.item.getBoundingClientRect(); this.moveTarget(dropTarget, this.item, reference); if (this.fixHeader) { this.moveTarget(this.fixFakeTableEl, Array.from(this.fixFakeTableEl.children)[from], Array.from(this.fixFakeTableEl.children)[to]); } if (mover && moverRect) { this.animate(moverRect, mover, 300); this.animate(itemRact, this.item, 300); } if (this.fixHeader && moverIndex !== -1 && fixMoverRect) { this.animate(fixMoverRect, fixMover, 300); this.animate(fixItemRect, fixItem, 300); } } }); this.getLongestRow = (/** * @param {?} table * @return {?} */ (table) => { /** @type {?} */ let result = table.rows[0]; Array.from(table.rows).forEach((/** * @param {?} row * @return {?} */ (row) => { /** @type {?} */ const rowL = ((/** @type {?} */ (row))).children.length; /** @type {?} */ const resultL = result.children.length; result = rowL > resultL ? row : result; })); return result; }); this.getChildTableColumn = (/** * @param {?} table * @param {?} index * @return {?} */ (table, index) => { /** @type {?} */ const cTable = table.cloneNode(true); this.origin2DragItem(cTable); /** @type {?} */ const empty = (/** * @param {?} node * @return {?} */ (node) => { while (node.firstChild) { node.removeChild(node.firstChild); } }); Array.from(cTable.rows).forEach((/** * @param {?} row * @return {?} */ (row) => { if (((/** @type {?} */ (row))).classList.contains('child-table')) { /** @type {?} */ const target = this.getChildTableColumn(((/** @type {?} */ (row))).children[0].children[0], index); empty(((/** @type {?} */ (row))).children[0]); ((/** @type {?} */ (row))).children[0].appendChild(target); } else { /** @type {?} */ const target = ((/** @type {?} */ (row))).children[index]; empty(row); if (target) { ((/** @type {?} */ (row))).appendChild(target); } } })); this.sizeChildColumnFake(cTable, table, index); return cTable; }); this.detecteChildTables = (/** * @param {?} table * @return {?} */ (table) => { Array.from(table.rows).forEach((/** * @param {?} row * @param {?} index * @return {?} */ (row, index) => { if (((/** @type {?} */ (row))).classList.contains('child-table')) { /** @type {?} */ const childTable = ((/** @type {?} */ (table.rows[index]))).children[0].children[0]; this.childTables.push(childTable); this.detecteChildTables(childTable); } })); }); this.getReference = (/** * @param {?} dropTarget * @param {?} target * @param {?} x * @return {?} */ (dropTarget, target, x) => { /** @type {?} */ const resolve = (/** * @param {?} after * @return {?} */ (after) => { return after ? this.nextEl(target) : target; }); /** @type {?} */ const inside = (/** * @return {?} */ () => { // faster, but only available if dropped inside a child element /** @type {?} */ const rect = target.getBoundingClientRect(); return resolve(x > rect.left + this.getRectWidth(rect) / 2); }); /** @type {?} */ const outside = (/** * @return {?} */ () => { // slower, but able to figure out any position /** @type {?} */ const len = dropTarget.children.length; /** @type {?} */ let i; /** @type {?} */ let el; /** @type {?} */ let rect; for (i = 0; i < len; i++) { el = dropTarget.children[i]; rect = el.getBoundingClientRect(); if ((rect.left + rect.width / 2) > x) { return el; } } return null; }); /** @type {?} */ const reference = target !== dropTarget ? inside() : outside(); return reference; }); this.getImmediateChild = (/** * @param {?} dropTarget * @param {?} target * @return {?} */ (dropTarget, target) => { /** @type {?} */ let immediate = target; /** @type {?} */ const isElementDropFreeze = (/** * @param {?} element * @return {?} */ (element) => { /** @type {?} */ const index = Array.from(element.parentNode.children).indexOf(element); return index < this.colDropFreezeTo; }); while (immediate !== dropTarget && this.getParent(immediate) !== dropTarget) { immediate = this.getParent(immediate); } if (immediate === documentElement || isElementDropFreeze(immediate)) { return null; } return immediate; }); this.i18nCommonText = this.i18n.getI18nText().common; } /** * @return {?} */ ngOnInit() { if (this.colDraggable) { this.iterableDiffer = this.iterableDiffers.find([]).create(null); this.objDiffer = {}; this.dataSource.forEach((/** * @param {?} data * @param {?} index * @return {?} */ (data, index) => { this.objDiffer[index] = this.differs.find(data).create(); })); } this.i18nSubscription = this.i18n.langChange().subscribe((/** * @param {?} data * @return {?} */ (data) => { this.i18nCommonText = data.common; })); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes && changes.columns || changes.multiSort) { this.multiSortArray = []; this.columns.forEach((/** * @param {?} column * @return {?} */ column => { if (column.sortable) { /** @type {?} */ const sortIndex = this.multiSort.findIndex((/** * @param {?} item * @return {?} */ item => item['field'] === column.field)); this.multiSortArray.push({ field: column.field, direction: sortIndex !== -1 ? this.multiSort[sortIndex].direction : '' }); } })); } if (changes['columns']) { this.rowCount = Math.max(...this.columns.map((/** * @param {?} column * @return {?} */ column => { if (column.advancedHeader) { return column.advancedHeader.length; } else { return 0; } }))); if (this.rowCount > 0) { this.rowCountArray = new Array(this.rowCount); this.initAdvanceHeader(); } if (this.colDraggable) { this.rerenderTables(); } } if (changes && changes.dataSource) { if (this.colDraggable) { this.rerenderTables(); } } } /** * @return {?} */ ngDoCheck() { if (!this.colDraggable) { return; } this.dataSource.forEach((/** * @param {?} elt * @param {?} index * @return {?} */ (elt, index) => { /** @type {?} */ const objDiffer = this.objDiffer[index]; if (!objDiffer) { return; } /** @type {?} */ const objChanges = objDiffer.diff(elt); if (objChanges) { objChanges.forEachChangedItem((/** * @param {?} changeItem * @return {?} */ (changeItem) => { if (changeItem.key === '$isChildTableOpen' && elt.children && elt.children.length) { this.rerenderTables(); } if (changeItem.key === 'children') { this.rerenderTables(); } })); } })); /** @type {?} */ const changes = this.iterableDiffer.diff(this.columns); if (changes) { this.createCellMap(); } } /** * @return {?} */ ngAfterViewInit() { if (this.colDraggable) { // set mirror container to table-wrap element this.mirrorContainer = this.element.nativeElement.parentNode.parentNode; this.bodyOverflow = documentElement.style.overflow; this.detecteOriginTable(); setTimeout((/** * @return {?} */ () => { this.renderFakeTable(); this.el.style.display = 'none'; if (this.fixHeader && this.tableBodyEl) { this.fixOriginTable = this.tableBodyEl.nativeElement; this.tableScrollbarWidth = this.getScrollbarWidth(); this.renderFixFakeTableEl(); this.fixFakeTableEl.style.display = 'none'; } })); documentElement.addEventListener('resize', this.renderFakeTable); this.createCellMap(); this.scrollViewEl = this.originTable.parentNode.parentNode; this.scrollViewRect = this.scrollViewEl.getBoundingClientRect(); if (this.fixHeader && this.tableBodyEl) { this.fixTableScrollViewEl = this.fixOriginTable.parentNode.parentNode; } } } /** * @return {?} */ createCellMap() { /** @type {?} */ let cellIndex = 0; this.columns.forEach((/** * @param {?} column * @param {?} index * @return {?} */ (column, index) => { if (!column.advancedHeader) { this.cellMap[cellIndex] = { name: column.field, sortKey: [index] }; cellIndex++; } else { if (column.advancedHeader[0].colspan) { this.cellMap[cellIndex] = { name: column.field, isAdvanceHeader: true, sortKey: [index], headerLength: column.advancedHeader[0].colspan }; cellIndex++; } else { Object.keys(this.cellMap).forEach((/** * @param {?} key * @return {?} */ key => { /** @type {?} */ const item = this.cellMap[key]; if (item.isAdvanceHeader && item.sortKey.length < item.headerLength) { item.sortKey.push(index); } })); } } })); } /** * @return {?} */ ngOnDestroy() { if (this.colDraggable) { documentElement.removeEventListener('resize', this.renderFakeTable); } if (this.i18nSubscription) { this.i18nSubscription.unsubscribe(); } } /** * @return {?} */ resetSources() { this.checkedListForFilter = []; if (this.sourceSubscription) { this.sourceSubscription.unsubscribe(); } if (this.filterSubscription) { this.filterSubscription.unsubscribe(); } } /** * @param {?} column * @return {?} */ onHeadClick(column) { if (!column.sortable) { return; } /** @type {?} */ const sortIndex = this.multiSortArray.findIndex((/** * @param {?} item * @return {?} */ item => item['field'] === column.field)); if (sortIndex === -1) { return; } switch (this.multiSortArray[sortIndex].direction) { case 'ASC': this.multiSortArray[sortIndex].direction = 'DESC'; break; case 'DESC': this.multiSortArray[sortIndex].direction = ''; break; case '': default: this.multiSortArray[sortIndex].direction = 'ASC'; } this.headClickSortEvent.emit({ field: column.field, direction: this.multiSortArray[sortIndex].direction }); } /** * @param {?} columns * @return {?} */ hasAnyFilterColumns(columns) { return (columns || []).some((/** * @param {?} col * @return {?} */ col => col && col.filterable)); } /** * @return {?} */ onCheckAllChange() { this.dt.onCheckAllChange(this.pageAllChecked); } /** * @return {?} */ onSearchQueryChange() { this.dt.onSearchQueryChange(this.searchQuery); } /** * @param {?} column * @return {?} */ canFilterable(column) { return column.field && column.field !== '$index' && column.filterable; } /** * @param {?} field * @return {?} */ getIfExistMultiSort(field) { /** @type {?} */ const column = this.columns.find((/** * @param {?} item * @return {?} */ item => item['field'] === field)); return !!column.sortable; } /** * @param {?} field * @return {?} */ getSortDirection(field) { if (!this.multiSortArray) { return false; } /** @type {?} */ const filterField = this.multiSortArray.filter((/** * @param {?} item * @return {?} */ item => { return item['field'] === field; })); if (filterField.length !== 0) { return filterField[0]['direction']; } else { return undefined; } } /** * @param {?} $event * @param {?} column * @param {?} isUserDefined * @return {?} */ onResize($event, column, isUserDefined) { // tslint:disable-next-line:no-unused-expression column['advancedHeader'] == null && this.resizeHandlerEvent.emit(Object.assign({}, $event, { field: column.field, isUserDefined: isUserDefined })); } /** * @param {?} $event * @return {?} */ beginResize($event) { this.beginResizeHandlerEvent.emit($event); } /** * @param {?} $event * @param {?} column * @return {?} */ onResizing($event, column) { // tslint:disable-next-line:no-unused-expression column['advancedHeader'] == null && this.resizingHandlerEvent.emit(Object.assign({}, $event, { column })); } /** * @private * @param {?} lastChildIndex * @param {?} parentWidth * @param {?} newParentWidth * @return {?} */ setParentNextWidth(lastChildIndex, parentWidth, newParentWidth) { if (!lastChildIndex) { return; } /** @type {?} */ const lastChilds = this.columns.filter((/** * @param {?} column * @return {?} */ column => column['$colIndex'] === lastChildIndex)).map((/** * @param {?} item * @return {?} */ item => item.field)); for (let index = 0; index < this.columns.length - 1; index++) { if (this.columns[index].field === lastChilds[0] && index + 1 < this.columns.length && this.columns[index + 1].width) { /** @type {?} */ const totalWidth = parentWidth + parseInt(this.columns[index + 1].width, 10); this.columns[index + 1].width = totalWidth - newParentWidth + 'px'; return; } } } /** * @param {?} $event * @param {?} changeColumn * @return {?} */ resizingParent($event, changeColumn) { const { width } = $event; if (this.rowCount > 0) { this.columns.filter((/** * @param {?} column * @return {?} */ column => column['advancedHeader'] !== undefined)) .map((/** * @param {?} column * @return {?} */ column => column['advancedHeader'])) .reduce((/** * @param {?} target * @param {?} newItemArr * @return {?} */ (target, newItemArr) => target.concat(newItemArr))) .filter((/** * @param {?} item * @return {?} */ item => item['$cols'].indexOf(changeColumn['$colIndex']) > -1)) .forEach((/** * @param {?} item * @return {?} */ item => { this.zone.run((/** * @return {?} */ () => { if (!item.$rowIndex) { /** @type {?} */ const length = item['$cols'].length; /** @type {?} */ const currentIsLastChild = changeColumn['$colIndex'] === item['$cols'][length - 1]; // tslint:disable-next-line:no-unused-expression !currentIsLastChild && this.setParentNextWidth(item['$cols'][length - 1], parseInt(item['$width'], 10), length * width); item['$width'] = length * width + 'px'; } })); })); } } // 初始化多行表头,为了兼容resizeable对表头互相影响数据做了记录 /** * @return {?} */ initAdvanceHeader() { if (this.resizeable) { this.columns.forEach((/** * @param {?} column * @param {?} colIndex * @return {?} */ (column, colIndex) => { if (column['advancedHeader']) { column['advancedHeader'].forEach((/** * @param {?} item * @param {?} rowIndex * @return {?} */ (item, rowIndex) => { item['$rowIndex'] = rowIndex; item['$colIndex'] = colIndex; item['$cols'] = new Array(item.colspan).fill(1).map((/** * @param {?} v * @param {?} i * @return {?} */ (v, i) => colIndex + i)); })); } column['$colIndex'] = colIndex; })); } } /** * @param {?} $event * @param {?} changeColumn * @return {?} */ resizeParent($event, changeColumn) { const { width } = $event; if (this.rowCount > 0) { this.columns.filter((/** * @param {?} column * @return {?} */ column => column['advancedHeader'] !== undefined)) .map((/** * @param {?} column * @return {?} */ column => column['advancedHeader'])) .reduce((/** * @param {?} target * @param {?} newItemArr * @return {?} */ (target, newItemArr) => target.concat(newItemArr))) .filter((/** * @param {?} item * @return {?} */ item => item['$cols'].indexOf(changeColumn['$colIndex']) > -1)) .forEach((/** * @param {?} item * @return {?} */ item => { if (item['header'] === changeColumn['header']) { // 是当前列则直接赋值 item['$width'] = width; } else { // 判断是父列,则修改父列宽 if (!item.$rowIndex) { item['$width'] = item['$cols'].length * parseInt(width, 10) + 'px'; } } })); } } /** * @param {?} index * @param {?} item * @return {?} */ trackByFn(index, item) { return index; } /** * @param {?} e * @return {?} */ onTap(e) { e.preventDefault(); this.originCellIndex = this.findCellIndex(e); setTimeout((/** * @return {?} */ () => { documentElement.addEventListener('mousemove', this.handleMousemove); documentElement.addEventListener('mouseup', (/** * @return {?} */ () => { documentElement.removeEventListener('mousemove', this.handleMousemove); })); })); } /** * @param {?} __0 * @return {?} */ appendSibling({ target, origin }) { if (!target) { return; } target.parentNode.insertBefore(target, origin ? origin.nextElementSibling : null); } /** * @param {?} el * @return {?} */ getOffset(el) { /** @type {?} */ const rect = el.getBoundingClientRect(); return { left: rect.left + this.getScroll('scrollLeft', 'pageXOffset'), top: rect.top + this.getScroll('scrollTop', 'pageYOffset') }; } /** * @param {?} scrollProp * @param {?} offsetProp * @return {?} */ getScroll(scrollProp, offsetProp) { if (typeof window[offsetProp] !== 'undefined') { return window[offsetProp]; } if (documentElement.clientHeight) { return documentElement[scrollProp]; } return document.body[scrollProp]; } /** * @return {?} */ dispatchMousedown() { const { el, originCellIndex } = this; el.children[originCellIndex.x].dispatchEvent(this.getTouchyEvent()); } /** * @return {?} */ getTouchyEvent() { /** @type {?} */ let event; // This is true only for IE,firefox if (document.createEvent) { // To create a mouse event , first we need to create an event and then initialize it. event = document.createEvent('MouseEvent'); event.initMouseEvent('mousedown', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); } else { event = new MouseEvent('mousedown', { 'view': window, 'bubbles': true, 'cancelable': true }); } return event; } /** * @return {?} */ removeMirrorImage() { if (this.mirror) { documentElement.removeEventListener('mousemove', this.grab); this.getParent(this.mirror).removeChild(this.mirror); this.mirror = null; setTimeout((/** * @return {?} */ () => { this.rmClass(this.mirrorContainer, 'gu-unselectable'); this.rmClass(documentElement, 'gu-unselectable'); })); } } /** * @param {?} item * @return {?} */ canStart(item) { while (this.getParent(item) && this.isContainer(this.getParent(item)) === false) { item = this.getParent(item); // drag target should be a top element if (!item) { return; } } /** @type {?} */ const source = this.getParent(item); if (!source) { return; } return { item: item, source: source }; } /** * @return {?} */ detecteOriginTable() { /** @type {?} */ let target = this.element.nativeElement; while (target.nodeName !== 'TABLE') { target = target.parentElement; } this.originTable = target; if (this.fixHeader && this.tableBodyEl) { this.fixOriginTable = this.tableBodyEl.nativeElement; this.detecteChildTables(this.fixOriginTable); } else { this.detecteChildTables(this.originTable); } } /** * @return {?} */ renderFakeTable() { if (this.el && !this.dataSourceChange) { return; } this.childTables = []; this.detecteChildTables(this.originTable); /** @type {?} */ const fakeTable = this.buildFakeTable(this.originTable); this.fakeTable = fakeTable; /** @type {?} */ const el = fakeTable.reduce((/** * @param {?} previous * @param {?} current * @return {?} */ (previous, current) => { /** @type {?} */ const li = document.createElement('li'); if (current) { li.appendChild(current); } return previous.appendChild(li) && previous; }), document.createElement('ul')); this.el = el; this.renderEl(el, this.originTable, fakeTable); } /** * @return {?} */ renderFixFakeTableEl() { if (this.fixFakeTableEl && !this.dataSourceChange) { return; } /** @type {?} */ const fakeTable = this.buildFakeTable(this.fixOriginTable); this.mainFakeTable = fakeTable; /** @type {?} */ const el = fakeTable.reduce((/** * @param {?} previous * @param {?} current * @return {?} */ (previous, current) => { /** @type {?} */ const li = document.createElement('li'); li.appendChild(current); return previous.appendChild(li) && previous; }), document.createElement('ul')); this.fixFakeTableEl = el; this.renderEl(el, this.fixOriginTable, this.mainFakeTable); } /** * @param {?} table * @return {?} */ buildFakeTable(table) { this.colOffset = 0; this.seconedHeaderOffset = 0; return Array.from(table.rows[0].children).map((/** * @param {?} cell * @param {?} index * @return {?} */ (cell, index) => { return this.getColumnAsTableByIndex(table, index, ((/** @type {?} */ (cell))).colSpan, ((/** @type {?} */ (cell))).rowSpan); })); } /** * @param {?} el * @param {?} originEl * @param {?} fakeTables * @return {?} */ renderEl(el, originEl, fakeTables) { this.sizeColumnFake(fakeTables, originEl); this.css(el, { position: 'absolute', }); if (originEl.parentNode.children[0].nodeName === 'UL') { originEl.parentNode.removeChild(originEl.parentNode.children[0]); this.insertBeforeSibling({ target: el, origin: originEl }); } else { this.insertBeforeSibling({ target: el, origin: originEl }); } // render every wrapper of table(element li) /** @type {?} */ const spacing = window.getComputedStyle(originEl).getPropertyValue('border-spacing').split(' ')[0]; /** @type {?} */ const attr = 'margin-right'; /** @type {?} */ const length = el.children.length; Array.from(el.children).forEach((/** * @param {?} li * @param {?} dex * @return {?} */ (li, dex) => { if (spacing && dex < (length - 1)) { ((/** @type {?} */ (li))).style[attr] = `-${spacing}`; } })); this.addClass(el.parentElement, this.classes.dragging); this.addClass(el, this.classes.draggableTable); this.addClass(el, 'sindu_column'); } /** * @param {?} fakeTables * @param {?} originEl * @return {?} */ sizeColumnFake(fakeTables, originEl) { // calculate width of every column Array.from(originEl.rows[0].children).forEach((/** * @param {?} cell * @param {?} index * @return {?} */ (cell, index) => { if (!fakeTables[index]) { return; } /** @type {?} */ const w = ((/** @type {?} */ (cell))).getBoundingClientRect().width; /** @type {?} */ const t = fakeTables[index]; this.css(t, { width: `${w}px` }); this.css(t.rows[0].children[0], { width: `${w}px` }); })); } /** * @param {?} el * @param {?} csses * @return {?} */ css(el, csses) { Object.keys(csses).forEach((/** * @param {?} k * @return {?} */ (k) => { el.style[k] = csses[k]; })); return el; } /** * @param {?} __0 * @return {?} */ insertBeforeSibling({ target, origin }) { if (!target) { return; } origin.parentNode.insertBefore(target, origin); } /** * @param {?} e * @return {?} */ findCellIndex(e) { /** @type {?} */ let target = e.target; while (target.nodeName !== 'TH') { target = target.parentElement || target.parentNode; } return { x: target.cellIndex, y: target.parentElement.rowIndex }; } /** * @param {?} target * @return {?} */ renderMirrorImage(target) { if (this.mirror) { return; } this.mirror = target.cloneNode(true); /** @type {?} */ const getFixTableTotalHeight = (/** * @return {?} */ () => { return this.fixOriginTable.parentNode.parentNode.parentNode.getBoundingClientRect().height; }); /** @type {?} */ const getTableTotalHeight = (/** * @return {?} */ () => { return this.originTable.parentNode.parentNode.parentNode.getBoundingClientRect().height; }); // 固定表头表格时,对拖动内容进行截取 if (this.fixHeader) { /** @type {?} */ const to = Array.from(this.el.children).indexOf(target); /** @type {?} */ const fixTarget = this.fixFakeTableEl.children[to].children[0].cloneNode(true); /** @type {?} */ const fixTargetContainer = document.createElement('div'); /** @type {?} */ const mirrorHeight = Math.min(parseInt(this.maxHeight, 10), getFixTableTotalHeight()); fixTargetContainer.style.height = mirrorHeight + 'px'; fixTargetContainer.style.overflow = 'hidden'; fixTargetContainer.appendChild(fixTarget); fixTarget.style.maxHeight = this.maxHeight; fixTarget.style.top = '-' + this.fixTableOffsetTop + 'px'; this.mirror.appendChild(fixTargetContainer); } // 设置最大高度,但不是固定表头的表格 if (!this.fixHeader && this.maxHeight) { /** @type {?} */ const mirrorHeight = Math.min(parseInt(this.maxHeight, 10), getTableTotalHeight()); this.mirror.style.height = mirrorHeight + 'px'; this.mirror.style.overflow = 'hidden'; } this.mirror.style.visibility = 'hidden'; /** @type {?} */ const thNode = this.mirror.querySelector('th'); this.addClass(thNode, 'hover'); this.rmClass(this.mirror, 'gu-transit'); this.addClass(this.mirror, 'gu-mirror'); this.mirrorContainer.appendChild(this.mirror); this.addClass(this.mirrorContainer, 'gu-unselectable'); } /** * @param {?} className * @return {?} */ lookupClass(className) { /** @type {?} */ const cache = {}; /** @type {?} */ const start = '(?:^|\\s)'; /** @type {?} */ const end = '(?:\\s|$)'; /** @type {?} */ let cached = cache[className]; if (cached) { cached.lastIndex = 0; } else { cache[className] = cached = new RegExp(start + className + end, 'g'); } return cached; } /** * @param {?} el * @param {?} className * @return {?} */ addClass(el, className) { /** @type {?} */ const current = el.className; if (!current.length) { el.className = className; } else if (!this.lookupClass(className).test(current)) { el.className += ' ' + className; } } /** * @param {?} el * @param {?} className * @return {?} */ rmClass(el, className) { el.className = el.className.replace(this.lookupClass(className), ' ').trim(); } /** * @param {?} x * @param {?} y * @param {?} e * @return {?} */ handleScroll(x, y, e) { this.scrollViewRect = this.scrollViewEl.getBoundingClientRect(); /** @type {?} */ let fixTableScrollViewRect; if (this.fixHeader) { this.fixTableScrollViewEl = this.fixOriginTable.parentNode.parentNode; fixTableScrollViewRect = this.fixTableScrollViewEl.getBoundingClientRect(); } /** @type {?} */ let scrollLeft = this.scrollViewEl.scrollLeft; /** @type {?} */ const range = 150; /** @type {?} */ const scrollToLeft = (/** * @return {?} */ () => { scrollLeft -= 50; if (this.fixHeader) { this.fixTableScrollViewEl.scrollTo(scrollLeft, 0); } this.scrollViewEl.scrollTo(scrollLeft, 0); this.animationRequestId = requestAnimationFrame(scrollToLeft); documentElement.dispatchEvent(e); }); /** @type {?} */ const scrollToRight = (/** * @return {?} */ () => { scrollLeft += 50; if (this.fixHeader) { this.fixTableScrollViewEl.scrollTo(scrollLeft, 0); } this.scrollViewEl.scrollTo(scrollLeft, 0); this.animationRequestId = requestAnimationFrame(scrollToRight); documentElement.dispatchEvent(e); }); if (!this.fixHeader && (y < this.scrollViewRect.top || y > this.scrollViewRect.bottom)) { return; } if (this.fixHeader && (y < this.scrollViewRect.top || y > fixTableScrollViewRect.bottom)) { return; } if (this.scrollViewRect.left < x && x < (this.scrollViewRect.left + range)) { this.animationRequestId = requestAnimationFrame(scrollToLeft); } if ((this.scrollViewRect.right - range) < x && x < this.scrollViewRect.right) { this.animationRequestId = reque