UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

737 lines 112 kB
import * as tslib_1 from "tslib"; /** * Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company. * @link https://truedirective.com/ * @license MIT */ import { Component, Output, ViewChild, ElementRef, ChangeDetectorRef, KeyValueDiffers, EventEmitter, Inject } from '@angular/core'; import { takeUntil } from 'rxjs/operators'; import { ColumnBand, GridPart, UIActionType, UIAction, Keys, RowLayout } from '@true-directive/base'; import { RowDragEvent, RowClickEvent, ContextMenuEvent, CellClickEvent } from '@true-directive/base'; import { GridViewComponent } from './grid-view.component'; import { GridStateService } from './grid-state.service'; import { InternationalizationService } from './internationalization/internationalization.service'; var GridComponent = /** @class */ (function (_super) { tslib_1.__extends(GridComponent, _super); function GridComponent(state, intl, elementRef, changeDetector, keyValueDiffers) { var _this = _super.call(this, state, intl, elementRef, changeDetector, keyValueDiffers) || this; _this.state = state; _this.intl = intl; _this.elementRef = elementRef; _this.changeDetector = changeDetector; _this.keyValueDiffers = keyValueDiffers; _this.rowMouseDown = new EventEmitter(); _this.rowMouseUp = new EventEmitter(); _this.rowClick = new EventEmitter(); _this.cellClick = new EventEmitter(); _this.rowDblClick = new EventEmitter(); _this.rowKeyDown = new EventEmitter(); _this.contextMenu = new EventEmitter(); _this.selectionChanged = new EventEmitter(); _this.checkedChanged = new EventEmitter(); /** * Пользователь перетащил строки. Событие возникает до того, как строки будут перенесены * гридом. Это действие можно отменить и обработать вне грида. */ _this.rowDrag = new EventEmitter(false); /** * Пользователь перетащил строки и грид обработал это действие. */ _this.rowDragged = new EventEmitter(false); _this._cellTouched = null; // Ячейка с тачем _this._cellTouchedScrollPos = { X: 0, Y: 0 }; _this._dragColumn = false; // Перетаскивание заголовка колонки в процессе _this._drag_x0 = -1; // Предыдущая позиция перетаскиваемого заголовка _this._drag_y0 = -1; _this._lastSel = 0; // Время последнего изменения выделения _this._paging = false; // Грид в процессе исполнения PgDn/PgUp // Строчка ушла после редактирования... _this.state.events.onRowUnfiltered.pipe(takeUntil(_this.destroy$)).subscribe(function (r) { setTimeout(function () { if (_this.state.dataSource.removeResultRow(r)) { _this.state.layoutsHandler.updateSelectionIndices(); _this.need_recalc_page = true; _this.updatePage('rowUnfiltered'); } }, 100); }); // Изменены колонки _this.state.events.onColumnsChanged.pipe(takeUntil(_this.destroy$)).subscribe(function (v) { _this.RC.clear(); _this.checkSize(true); }); // Перетаскивание заголовка колонки _this.state.events.onDrag.pipe(takeUntil(_this.destroy$)).subscribe(function (v) { return _this.dragColumn(v); }); // Drop заголовка колонки _this.state.events.onDrop.pipe(takeUntil(_this.destroy$)).subscribe(function (v) { return _this.dropColumn(v); }); // Изменение выделения _this.state.events.onSelect.pipe(takeUntil(_this.destroy$)).subscribe(function (cellPos) { _this.refreshSelection(cellPos); _this.selectionChanged.emit(_this.state.selection); }); // Изменение значения _this.state.events.onValueChanged.pipe(takeUntil(_this.destroy$)).subscribe(function (v) { return _this.detectChanges('valueChanged'); }); // Изменение значения чекбокса _this.state.events.onCheckedChanged.pipe(takeUntil(_this.destroy$)).subscribe(function (e) { return _this.checkedChanged.emit(e); }); // Включение редактирования _this.state.events.onStartEditing.pipe(takeUntil(_this.destroy$)).subscribe(function (v) { return _this.detectChanges('startEditing'); }); // Выключение редактирования _this.state.events.onStopEditing.pipe(takeUntil(_this.destroy$)).subscribe(function (returnFocus) { _this.detectChanges(); if (returnFocus && _this.state.settings.autoFocusAfterEditor) { _this.focus(); } }); return _this; } Object.defineProperty(GridComponent.prototype, "isDragging", { get: function () { return this._dragColumn; }, enumerable: true, configurable: true }); /** * Начало действия пользователя (перемещение строки или выделение ячеек) * @param eX Начальная координата X * @param eY Начальная координата Y * @param place Часть грида, в которой инициировано действие * @param ctrlKey Нажата ли клавиша Ctrl * @param byTouch Инициировано ли тач-событием */ GridComponent.prototype.startAction = function (cp, eX, eY, place, ctrlKey, byTouch, button) { if (ctrlKey === void 0) { ctrlKey = false; } if (byTouch === void 0) { byTouch = false; } if (button === void 0) { button = 0; } if (cp && cp.row) { this.scroller.prepareAutoScroll(); var uiType = this.state.ui.startAction(cp, ctrlKey, byTouch, button); if (uiType) { this.uiAction = new UIAction(uiType, null, eX, eY); this.addDocumentMouseListeners(); } } }; /** * Касание пальцем * @param e Параметры события */ GridComponent.prototype.touchStart = function (e) { // В течение 50мс не выделяем по тачстарту, потому что этот тач останавливает // прокрутку if (this._lastScroll.time > 0) { var ms = Date.now() - this._lastScroll.time; if (ms < 50) { // Не выделяем ничего, если мы остановили прокрутку return; } } e.stopPropagation(); var touches = e.changedTouches; if (touches.length === 1) { // Если касание одно, то запоминаем ячейку, которой касаемся this._cellTouched = this.cellByXY(touches[0].clientX, touches[0].clientY); // Запоминаем положение прокрутки this._cellTouchedScrollPos = { X: this.scroller.scrollLeft, Y: this.scroller.scrollTop }; } }; Object.defineProperty(GridComponent.prototype, "touchScroll", { // Проверим, не было ли скролла во время касания get: function () { return this._cellTouchedScrollPos.X !== this.scroller.scrollLeft || this._cellTouchedScrollPos.Y !== this.scroller.scrollTop; }, enumerable: true, configurable: true }); /** * Окончание касания * @param e Параметры события */ GridComponent.prototype.touchEnd = function (e) { var touches = e.changedTouches; if (touches.length >= 1) { var rr = this.cellByXY(touches[0].clientX, touches[0].clientY); if (rr !== null && rr.equals(this._cellTouched) && !this.touchScroll) { // Should we toggle a checkbox in this cell? if (this.state.settings.checkByCellClick && this.state.check.canToggleCheck(rr)) { // Yes, we should. this.state.ui.toggleCheck(rr.row, rr.fieldName); } else { // Something will be selected. if (!rr.equals(this.state.selection.focusedCell)) { // Если клик не на выделенной ячейке, то начинаем выделение. // Начало и окончание выделения вынесено сюда, т.к. мы не можем // сразу понять, действие пользователя - это прокрутка или // выделение строки. // Поэтому, если положение прокрутки не изменилось - выделяем this.startAction(rr, touches[0].clientX, touches[0].clientY, GridPart.CENTER, false, true); } else { // Редактирование и фокус на редакторе this.state.ui.startAction(this._cellTouched, false, true); e.stopPropagation(); return; } } // End selecting anyway this.state.ui.endSelect(rr, true); } } e.stopPropagation(); }; /** * Нажатие кнопки мыши. * @param e Параметры события */ GridComponent.prototype.dataMouseDown = function (e) { if (this._cellTouched) { // Touchstart has been handled. Skip this mousedown. return; } this.rowMouseDown.emit(e); if (!e.defaultPrevented) { var cp = this.cellByXY(e.clientX, e.clientY); if (this.state.ui.mouseDown(cp, false, e.button)) { // This event has been handled. return; } this.startAction(cp, e.clientX, e.clientY, GridPart.CENTER, e.ctrlKey, false, e.button); } }; GridComponent.prototype.doRowClick = function (e) { if (this.state.ui.click(this.cellByXY(e.clientX, e.clientY))) { e.stopPropagation(); e.preventDefault(); } }; GridComponent.prototype.dataContextMenu = function (e) { if (this.settings.enableDataContextMenu && this.settings.dataContextMenuActions.length > 0) { this.menuStarter.start(e, this.state.settings.dataContextMenuActions, 'selection'); this.detectChanges(); e.preventDefault(); return; } this.contextMenu.emit(new ContextMenuEvent(this.cellByXY(e.clientX, e.clientY), e)); }; GridComponent.prototype.dataRowClick = function (e, r) { this.rowClick.emit(new RowClickEvent(r, e)); this.cellClick.emit(new CellClickEvent(this.cellByXY(e.clientX, e.clientY), e)); if (this._cellTouched) { // Skip this click. this._cellTouched = null; return; } this.doRowClick(e); }; GridComponent.prototype.dataRowDblClick = function (e, r) { this.rowDblClick.emit(new RowClickEvent(r, e)); this.state.ui.dblClick(e, r); }; /** * Key event handler * @param keyEvent Key event parameters */ GridComponent.prototype.processKey = function (e) { var _this = this; this.rowKeyDown.emit(e); if (e.defaultPrevented) { return; } var keyCode = e.keyCode; if (keyCode === Keys.SPACE && this.state.selection.focusedRow) { var f = this.state.check.firstCheckableField(); if (f !== '') { this.toggleCheckbox({ row: this.state.selection.focusedRow, fieldName: f }); return true; } } var ri = this.state.dataSource.resultRows.indexOf(this.state.selection.focusedRow); if (!this.state.st.fixedRowHeight && (keyCode === Keys.PAGE_DOWN || keyCode === Keys.PAGE_UP)) { // При переменной высоте строк прокрутить на одну страницу вниз или вверх - большая печаль. // Потому что мы не знаем, какая высота у строк выше или ниже текущей страницы. // Поэтому принимаем тяжелое решение и... // 1. Игнорируем нажатие, если еще не обработали предыдущее: if (this._paging) { return true; } // 2. Рендерим с запасом var overWork = { fwd: 4, back: 4 }; // 3. Запас как раз равен максимальному количеству строк, умещающемуся на экране if (keyCode === Keys.PAGE_DOWN) { overWork.fwd = this.scroller.viewPortHeight / this.RC.currentRH + 1; } else { if (keyCode === Keys.PAGE_UP) { overWork.back = this.scroller.viewPortHeight / this.RC.currentRH + 1; } } // 4. Рендерим страницу с заданной переработкой this.updatePage('keydown', true, overWork); // 5. Указываем на приостановку обработки клавиш this._paging = true; setTimeout(function () { // 6. Теперь мы можем точно рассчитать емкость предыдущей страницы var newPageCapacity = _this.RC.pageCapacity(ri, _this.scroller.viewPortHeight, _this.state.dataSource.resultRows.length); // 7. Handle key if (_this.state.ui.processKey(newPageCapacity, e)) { e.stopPropagation(); } // 8. Done _this._paging = false; }, 50); return true; } // Остальное намного проще var pageCapacity = this.RC.pageCapacity(ri, this.scroller.viewPortHeight, this.state.dataSource.resultRows.length); return this.state.ui.processKey(pageCapacity, e); }; GridComponent.prototype.dataKeyDown = function (e) { if (this.processKey(e)) { e.preventDefault(); e.stopPropagation(); } }; GridComponent.prototype.checkAll = function (fieldName) { this.state.check.setColumnCheck(this.state.columnCollection.columnByFieldName(fieldName), true); }; GridComponent.prototype.uncheckAll = function (fieldName) { this.state.check.setColumnCheck(this.state.columnCollection.columnByFieldName(fieldName), false); }; /** * Continue selecting * @param e Event parameters */ GridComponent.prototype.doSelect = function (e) { var rr = this.cellByXY(e.clientX, e.clientY); if (rr && rr.fieldName !== '') { this.state.ui.proceedToSelect(rr); } this.scroller.checkAutoScrollX(e.clientX); this.scroller.checkAutoScrollY(e.clientY); }; Object.defineProperty(GridComponent.prototype, "selection", { /** * Selection of the grid * @return GridSelection instance with selected ranges list. */ get: function () { return this.state.selection; }, enumerable: true, configurable: true }); Object.defineProperty(GridComponent.prototype, "selectedData", { /** * Returns data which contained in selected ranges * @return Array with the data */ get: function () { return this.state.getSelectedData(this.selection).result; }, enumerable: true, configurable: true }); Object.defineProperty(GridComponent.prototype, "draggedRows", { get: function () { if (this.uiAction && this.uiAction.target) { if (this.uiAction.renderTarget === null) { // Первые три записи в обратном порядке this.uiAction.renderTarget = []; for (var i = 0; i < 3 && i < this.uiAction.target.length; i++) { this.uiAction.renderTarget.unshift(this.uiAction.target[i]); } } return this.uiAction.renderTarget; } return []; }, enumerable: true, configurable: true }); GridComponent.prototype.getDragTransform = function (i) { var l = this.draggedRows.length; var scale = Math.pow(0.97, l - i - 1); var dx = -40; var dy = -i * this.state.settings.rowHeight + (l - i - 1) * 7 - 40; var res = 'matrix(' + scale + ', 0, 0, 1, ' + dx + ', ' + dy + ')'; return res; }; GridComponent.prototype.getDragWidth = function () { var res = 0; this.state.layoutDrag.columns.forEach(function (c) { return res += c.width; }); return res + this.state.settings.widthUnit; }; GridComponent.prototype.checkRowDrag = function (e) { if (!this.state.settings.rowDrag) { return false; } if (this.uiAction.action === UIActionType.ROW_DRAG) { // Уже включено return false; } var xx = e.clientX; var yy = e.clientY; if (Math.abs(xx - this.uiAction.x) > 9 || Math.abs(yy - this.uiAction.y) > 9) { this.startDragRows(); return true; } return false; }; GridComponent.prototype.startDragRows = function () { this.uiAction.action = UIActionType.ROW_DRAG; this.state.dragDrop.setDragItem(this.uiAction); this.setDragPosition(this.uiAction); this.detectChanges(); this.dragInProcess(true); this.dragItem.nativeElement.style.visibility = 'visible'; }; GridComponent.prototype.specifyDropPosition = function (pos, rLeft, e) { return pos; }; GridComponent.prototype.dropInfo = function (e) { var r = RowLayout.rowPosByXY(this.rowLayouts(this.displayedRows), e.clientX, e.clientY, this.state.isTree); var rl = r.rl; if (!rl) { return null; } var centerRect = this.scroller.centerRect; var rd = rl.rowComponent; var rr = rd.firstCellRect(); r = this.specifyDropPosition(r, rr.left, e); var canDrop = this.state.canDrop(this.uiAction.target, rl.rowComponent.row, r.pos); var dropTarget = null; if (canDrop !== '') { dropTarget = rl.rowComponent.row; r.pos = canDrop; } var top = (r.pos !== 'before' ? rl.clientRect.bottom : rl.clientRect.top) - 1; var left = rr.left; var height = 2; var width = rl.clientRect.width - (left - centerRect.left); if (r.pos === 'last') { left -= this.state.settings.levelIndent; width += this.state.settings.levelIndent; } if (r.pos === 'in') { top -= rl.clientRect.height - 3; height = rl.clientRect.height - 6; } if (left < centerRect.left) { left = centerRect.left; } if ((left + width) > rl.clientRect.right) { width = rl.clientRect.right - left; } var rect = new DOMRect(left, top, width, height); if (rect.top < centerRect.top - 1 || rect.top >= centerRect.bottom) { return null; } return { dropTarget: dropTarget, rowPosition: r, pos: r.pos, markerRect: rect }; }; GridComponent.prototype.dragRows = function (e) { if (!this.uiAction.move(e.clientX, e.clientY)) { //return null; } this.setDragPosition(this.uiAction); var di = this.dropInfo(e); if (di === null || di.dropTarget === null) { this.toggleClass(true, 'true-drag-not-allowed'); this.toggleClass(false, 'true-drag-allowed'); this.hideMarker(); } else { this.showMarker(di.markerRect.left, di.markerRect.top, di.markerRect.width, di.markerRect.height, true); this.toggleClass(false, 'true-drag-not-allowed'); this.toggleClass(true, 'true-drag-allowed'); } this.scroller.checkAutoScrollY(e.clientY); return di ? di.rowPosition : null; }; GridComponent.prototype.endDragRows = function (e) { this.hideMarker(); this.scroller.stopAutoScroll(); this.toggleClass(false, 'true-drag-not-allowed'); this.toggleClass(false, 'true-drag-allowed'); this.dragItem.nativeElement.style.visibility = 'hidden'; this.dragInProcess(false); var di = this.dropInfo(e); if (di && di.dropTarget) { var ce = new RowDragEvent(this.uiAction.target, di.dropTarget, di.pos); this.rowDrag.emit(ce); if (!ce.isCanceled) { this.state.moveRows(this.uiAction.target, di.dropTarget, di.pos); this.rowDragged.emit(ce); } } }; GridComponent.prototype.documentMouseMove = function (e) { _super.prototype.documentMouseMove.call(this, e); if (this.uiAction) // если что-то началось.. { if (e.clientX === this.uiAction.x && e.clientY === this.uiAction.y) { return; } if (this.checkRowDrag(e)) { return; } if (this.uiAction.action === UIActionType.ROW_DRAG) { this.dragRows(e); } // Продолжаем выделение данных if (this.uiAction.action === UIActionType.SELECT) { var dt = Date.now(); var ms = dt - this._lastSel; var delay = this.state.IE ? 70 : 0; if (ms < delay) { // Не так давно обновляли.. return; } this._lastSel = Date.now(); this.doSelect(e); e.preventDefault(); e.stopPropagation(); } } }; // Завершение выделения области GridComponent.prototype.documentMouseUp = function (e) { if (this.uiAction.action === UIActionType.ROW_DRAG) { // Переставляем. this.endDragRows(e); } if (this.uiAction.action === UIActionType.SELECT) { var rr = this.cellByXY(e.clientX, e.clientY); if (rr && rr.fieldName !== '') { this.state.ui.endSelect(rr, false, e.button); this.focus(); } } _super.prototype.documentMouseUp.call(this, e); this.rowMouseUp.emit(e); // Останавливаем автопрокрутку this.scroller.stopAutoScroll(); this.uiAction = null; }; GridComponent.prototype.resizeInProcess = function (value) { this.toggleClass(value, 'true-resize-in-process'); }; GridComponent.prototype.dragInProcess = function (value) { this.toggleClass(value, 'true-drag-in-process'); }; GridComponent.prototype.showMarker = function (mrX, mrY, mrW, mrH, rowDrag) { if (rowDrag === void 0) { rowDrag = false; } this.dropMarker.nativeElement.style.top = mrY + 'px'; this.dropMarker.nativeElement.style.left = mrX + 'px'; this.dropMarker.nativeElement.style.width = mrW + 'px'; this.dropMarker.nativeElement.style.height = mrH + 'px'; this.dropMarker.nativeElement.style.visibility = 'visible'; }; // Hide marker of REORDERING/RESIZING GridComponent.prototype.hideMarker = function () { this.dropMarker.nativeElement.style.visibility = 'hidden'; }; GridComponent.prototype.proceedToResizeColumn = function (ui) { var r0 = this.scroller.clientRect; var mrX = ui.x; if ((mrX > r0.left) && mrX < r0.right) { this.showMarker(mrX, r0.top + 1, 1, r0.height - 2); } else { this.hideMarker(); } if (ui.x < r0.left) { // листаем влево this.scroller.scrollSpeedX = -this.state.st.autoScrollStep; } else { if (ui.x > r0.right) { this.scroller.scrollSpeedX = this.state.st.autoScrollStep; } else { this.scroller.scrollSpeedX = 0; } } }; GridComponent.prototype.resizeColumn = function (e) { if (e.action === 'start') { this.resizeInProcess(true); return; } if (e.action === 'end') { this.hideMarker(); this.resizeInProcess(false); return; } this.proceedToResizeColumn(e.ui); }; GridComponent.prototype.setDragPosition = function (e) { var dy = this.state.iOS ? window.pageYOffset : 0; this.dragItem.nativeElement.style.left = e.x + e.targetOffsetX + 'px'; this.dragItem.nativeElement.style.top = dy + e.y + e.targetOffsetY + 'px'; }; GridComponent.prototype.isDragColumn = function () { return this._dragColumn; }; GridComponent.prototype.startDragColumn = function (e) { if (this.filterPopup && this.filterPopup.visible) { this.filterPopup.closePopup(); } this._dragColumn = true; this.scroller.prepareAutoScroll(); this.state.dragDrop.setDragItem(e); this.detectChanges('dragColumn'); this.setDragPosition(e); this.dragItem.nativeElement.style.visibility = 'visible'; this.dragInProcess(true); }; GridComponent.prototype.commitDrag = function () { this.checkSize(); this.need_recalc_page = true; }; GridComponent.prototype.dragColumn = function (e) { if (!this._dragColumn) { this.startDragColumn(e); return; } this.setDragPosition(e); if (Math.abs(e.x - this._drag_x0) < 5 && Math.abs(e.y - this._drag_y0) < 5) { return; } this._drag_x0 = e.x; this._drag_y0 = e.y; var dropInfo = null; this.headerParts.forEach(function (p) { if (p && !dropInfo) { dropInfo = p.canDrop(e, false); //showMarker); } }); if (dropInfo) { if (e.target instanceof ColumnBand) { this.state.reorderBand(e.target, dropInfo); } else { this.state.reorderColumn(e.target, dropInfo, false); } this.commitDrag(); } var r0 = this.scroller.checkAutoScrollX(e.x); // Передаем rectangle this.checkParts(e.x, r0, e.target); }; GridComponent.prototype.dropColumn = function (e) { var _this = this; this._dragColumn = false; this.scroller.stopAutoScroll(); this.dragItem.nativeElement.style.visibility = 'hidden'; var dropInfo = null; this.headerParts.forEach(function (p) { if (!dropInfo && p) { dropInfo = p.canDrop(e, false); } }); if (dropInfo) { this.state.reorderColumn(e.target, dropInfo); } else { this.state.fixDrag(e.target); // Если тащили из панели группировки, то! } this.state.dragDrop.clearDragItem(); this.dragInProcess(false); // Почему через 100 миллисекунд? Для того,чтобы плавно затухло setTimeout(function () { _this.state.layoutsHandler.setLayoutsVisibility(); _this.updatePage('dropColumn', true); // Может поменяться ширина центральной части _this.checkSize(); }, 100); }; /** * Обработка события строки - переключение чекбокса. * @param e Параметры события */ GridComponent.prototype.toggleCheckbox = function (e) { this.state.ui.toggleCheck(e.row, e.fieldName, e.value); }; GridComponent.prototype.toggleCheckColumn = function (col) { this.state.ui.toggleCheckColumn(col); }; GridComponent.prototype.setAppearance = function () { _super.prototype.setAppearance.call(this); this.dragItem.nativeElement.classList.add(this.state.sta.dragItemClass); }; tslib_1.__decorate([ Output('rowMouseDown'), tslib_1.__metadata("design:type", EventEmitter) ], GridComponent.prototype, "rowMouseDown", void 0); tslib_1.__decorate([ Output('rowMouseUp'), tslib_1.__metadata("design:type", EventEmitter) ], GridComponent.prototype, "rowMouseUp", void 0); tslib_1.__decorate([ Output('rowClick'), tslib_1.__metadata("design:type", EventEmitter) ], GridComponent.prototype, "rowClick", void 0); tslib_1.__decorate([ Output('cellClick'), tslib_1.__metadata("design:type", EventEmitter) ], GridComponent.prototype, "cellClick", void 0); tslib_1.__decorate([ Output('rowDblClick'), tslib_1.__metadata("design:type", EventEmitter) ], GridComponent.prototype, "rowDblClick", void 0); tslib_1.__decorate([ Output('rowKeyDown'), tslib_1.__metadata("design:type", EventEmitter) ], GridComponent.prototype, "rowKeyDown", void 0); tslib_1.__decorate([ Output('contextMenu'), tslib_1.__metadata("design:type", EventEmitter) ], GridComponent.prototype, "contextMenu", void 0); tslib_1.__decorate([ Output('selectionChanged'), tslib_1.__metadata("design:type", EventEmitter) ], GridComponent.prototype, "selectionChanged", void 0); tslib_1.__decorate([ Output('checkedChanged'), tslib_1.__metadata("design:type", EventEmitter) ], GridComponent.prototype, "checkedChanged", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], GridComponent.prototype, "rowDrag", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], GridComponent.prototype, "rowDragged", void 0); tslib_1.__decorate([ ViewChild('dropMarker', { static: true }), tslib_1.__metadata("design:type", Object) ], GridComponent.prototype, "dropMarker", void 0); GridComponent = tslib_1.__decorate([ Component({ selector: 'true-grid', template: "<div #dropMarker class=\"true-grid-drop-marker\"></div>\r\n\r\n<true-menu-starter #menuStarter (itemClick)=\"menuItemClick($event)\"></true-menu-starter>\r\n<!-- \u0432\u0441\u043F\u043B\u044B\u0432\u0430\u044E\u0449\u0435\u0435 \u043E\u043A\u043D\u043E \u0434\u043B\u044F \u0444\u0438\u043B\u044C\u0442\u0440\u043E\u0432 -->\r\n<true-filter-popup #filterPopup *ngIf=\"state.settings.allowFilter\"\r\n (setFilter)=\"setFilter($event)\"\r\n (resetFilter)=\"resetFilter($event)\"\r\n (closed)=\"filterClosed($event)\">\r\n</true-filter-popup>\r\n<!-- \u042D\u043B\u0435\u043C\u0435\u043D\u0442, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043F\u0435\u0440\u0435\u0442\u0430\u0441\u043A\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043C\u044B\u0448\u044C\u044E, \u043F\u0440\u0438 reordering columns -->\r\n<div #dragItem true-drag-item class=\"true-grid-drag-item\">\r\n <true-grid-header *ngIf=\"isDragColumn()\"\r\n [ngClass]=\"state.settings.appearance.headerAreaClass\"\r\n [layout]=\"state.layoutDrag\"></true-grid-header>\r\n <div *ngIf=\"!isDragColumn()\" class=\"true-drag-data\" [ngClass]=\"settings.appearance.getDataClass()\">\r\n <table *ngFor=\"let r of draggedRows; let i=index\"\r\n [style.transform]=\"getDragTransform(i)\"\r\n [style.width]=\"getDragWidth()\"\r\n class=\"true-grid-data true-grid-data_fixed-height\">\r\n <colgroup>\r\n <col *ngFor=\"let c of state.layoutDrag.columns\" [style.width]=\"c.displayedWidthU\" />\r\n </colgroup>\r\n <tbody>\r\n <tr true-row\r\n [row]=\"r\"\r\n [true-layout]=\"state.layoutDrag\"\r\n [true-state]=\"state\"\r\n [true-i]=\"i\"\r\n [style.height.px]=\"state.settings.rowHeight\">\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n</div>\r\n<!-- \u041A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442, \u043E\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043B\u044F\u044E\u0449\u0438\u0439 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u043D\u044B\u0439 \u0441\u043A\u0440\u043E\u043B\u043B\u0438\u043D\u0433 \u0434\u0430\u043D\u043D\u044B\u0445 \u0438 \u0432\u0441\u0435\u0445 \u0441\u043E\u043F\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 -->\r\n<true-scroller #scroller\r\n tabindex=\"-1\"\r\n [maxHeight]=\"maxHeight\"\r\n (keydown)=\"dataKeyDown($event)\"\r\n (autoscrollx)=\"gridAutoScrollX($event)\"\r\n (scroll)=\"gridScroll($event)\">\r\n <!-- \u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 -->\r\n <true-grid-header #gridHeader true-header\r\n [layout]=\"state.layout\"\r\n [scroller]=\"scroller\"\r\n (toggleCheckColumn)=\"toggleCheckColumn($event)\"\r\n (resizeColumn)=\"resizeColumn($event)\">\r\n </true-grid-header>\r\n <!-- \u041E\u0441\u043D\u043E\u0432\u043D\u0430\u044F \u0447\u0430\u0441\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0445 -->\r\n <div true-data [ngClass]=\"settings.appearance.getDataClass()\">\r\n <table #gridData class=\"true-grid-data\"\r\n [class.true-grid-data_fixed-height]=\"state.settings.fixedRowHeight\"\r\n [style.width]=\"state.layout.dataWidth\"\r\n (mousedown)=\"dataMouseDown($event)\">\r\n <colgroup>\r\n <!-- \u0433\u0440\u0443\u043F\u043F\u0438\u0440\u043E\u0432\u043A\u0430 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F -->\r\n <col *ngFor=\"let c of state.layout.levelColumns\" [style.width]=\"state.st.levelWidth\" />\r\n <!-- \u0434\u0430\u043D\u043D\u044B\u0435 -->\r\n <col *ngFor=\"let c of state.layout.columns\" [style.width]=\"c.displayedWidthU\" />\r\n </colgroup>\r\n\r\n <tbody *ngIf=\"!state.st.customTemplate\">\r\n <tr *ngFor=\"let r of RC.ghostRows('start'); trackBy: RC.trackGhostRowStart\" [style.height.px]=\"r.H\" style=\"border:0\">\r\n <td [style.height.px]=\"r.H\" style=\"padding:0; border-right: 0;\">&nbsp;</td>\r\n </tr>\r\n <tr *ngFor=\"let r of visibleRows; let i=index; trackBy: trackRow;\"\r\n true-row\r\n [view-port-left]=\"viewPortLeft\"\r\n [view-port-width]=\"viewPortWidth\"\r\n [row]=\"r\"\r\n [true-locale]=\"locale\"\r\n [true-layout]=\"state.layout\"\r\n [true-state]=\"state\"\r\n [true-i]=\"i\"\r\n [style.height.px]=\"state.settings.rowHeight\"\r\n (toggleCheckbox)=\"toggleCheckbox($event)\"\r\n (click)=\"dataRowClick($event, r)\"\r\n (contextmenu)=\"dataContextMenu($event)\"\r\n (dblclick)=\"dataRowDblClick($event, r)\"\r\n #displayedRows>\r\n </tr>\r\n <tr *ngFor=\"let r of RC.ghostRows('end')\" [style.height.px]=\"r.H\">\r\n <td [style.height.px]=\"r.H\" style=\"padding:0; border-right: 0;\">&nbsp;</td>\r\n </tr>\r\n <!--<tr *ngIf=\"visibleRows.length === 0\"><td style=\"border: 0;\"></td></tr>--> <!-- \u0412\u044B\u043D\u0435\u0441\u0442\u0438 \u0432 \u0441\u0442\u0438\u043B\u0438 -->\r\n </tbody>\r\n <!-- User's template -->\r\n <ng-content *ngIf=\"state.st.customTemplate\" select=\"[true-body]\"></ng-content>\r\n </table>\r\n </div>\r\n <!-- Footer -->\r\n <true-grid-footer #gridFooter true-footer [layout]=\"state.layout\"></true-grid-footer>\r\n</true-scroller>\r\n", providers: [{ provide: 'gridState', useClass: GridStateService }], styles: [":host{display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.true-grid{box-sizing:border-box;height:100%;width:100%}.true-grid-data{box-sizing:border-box;table-layout:fixed;border-spacing:0;border-collapse:collapse;outline:0}.true-grid-data td{overflow-x:hidden;overflow-y:hidden}.true-grid-drop-marker{box-sizing:border-box;visibility:hidden;position:fixed;width:3px;border:1px solid #757779;background-color:rgba(255,255,255,.05);pointer-events:none;z-index:7}.true-grid-data_fixed-height td:not(.true-cell-indent){white-space:nowrap}.true-grid-data_fixed-height td:not(.true-cell-indent):not(.true-cell-checkbox){text-overflow:ellipsis}.true-cell-checkbox.true-check-by-click{cursor:pointer}.true-grid-drag-item{visibility:hidden;position:fixed;overflow-x:hidden;text-overflow:ellipsis;pointer-events:none;z-index:8}::ng-deep .true-grid-btn{cursor:pointer;align-self:stretch;visibility:hidden;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-pack:center;justify-content:center;flex-shrink:0}::ng-deep .true-grid-btn span{display:inline-block}::ng-deep .true-align-right{text-align:right}::ng-deep .true-align-center{text-align:center}::ng-deep .true-align-left{text-align:left!important}"] }), tslib_1.__param(0, Inject('gridState')), tslib_1.__metadata("design:paramtypes", [GridStateService, InternationalizationService, ElementRef, ChangeDetectorRef, KeyValueDiffers]) ], GridComponent); return GridComponent; }(GridViewComponent)); export { GridComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdHJ1ZS1kaXJlY3RpdmUvZ3JpZC8iLCJzb3VyY2VzIjpbInNyYy9ncmlkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQzNELGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUN0QyxNQUFNLGVBQWUsQ0FBQztBQUU5QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFVLFVBQVUsRUFBZ0IsUUFBUSxFQUMxQyxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFDNUIsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQzdDLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXRELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBWWxHO0lBQW1DLHlDQUFpQjtJQWt1QmxELHVCQUM4QixLQUF1QixFQUN6QyxJQUFpQyxFQUNqQyxVQUFzQixFQUN0QixjQUFpQyxFQUNqQyxlQUFnQztRQUw1QyxZQU9JLGtCQUFNLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxlQUFlLENBQUMsU0ErQ2xFO1FBckQ2QixXQUFLLEdBQUwsS0FBSyxDQUFrQjtRQUN6QyxVQUFJLEdBQUosSUFBSSxDQUE2QjtRQUNqQyxnQkFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixvQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMscUJB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