@true-directive/grid
Version:
Angular Data Grid from Yopsilon.
737 lines • 112 kB
JavaScript
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;\"> </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;\"> </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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