UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

637 lines 87.6 kB
import { __assign, __decorate, __metadata, __read, __spread } from "tslib"; import { Injectable, EventEmitter, NgZone } from '@angular/core'; // TODO: Refactor - export in a separate file var IgxRow = /** @class */ (function () { function IgxRow(id, index, data) { this.id = id; this.index = index; this.data = data; } IgxRow.prototype.createEditEventArgs = function () { return { rowID: this.id, oldValue: __assign({}, this.data), newValue: this.newData, cancel: false }; }; return IgxRow; }()); export { IgxRow }; var IgxCell = /** @class */ (function () { function IgxCell(id, rowIndex, column, value, editValue, rowData) { this.id = id; this.rowIndex = rowIndex; this.column = column; this.value = value; this.editValue = editValue; this.rowData = rowData; } IgxCell.prototype.castToNumber = function (value) { if (this.column.dataType === 'number' && !this.column.inlineEditorTemplate) { var v = parseFloat(value); return !isNaN(v) && isFinite(v) ? v : 0; } return value; }; IgxCell.prototype.createEditEventArgs = function () { return { rowID: this.id.rowID, cellID: this.id, oldValue: this.value, newValue: this.editValue, cancel: false }; }; return IgxCell; }()); export { IgxCell }; var IgxGridCRUDService = /** @class */ (function () { function IgxGridCRUDService() { this.cell = null; this.row = null; } IgxGridCRUDService.prototype.createCell = function (cell) { return new IgxCell(cell.cellID, cell.rowIndex, cell.column, cell.value, cell.value, cell.row.rowData); }; IgxGridCRUDService.prototype.createRow = function (cell) { return new IgxRow(cell.id.rowID, cell.rowIndex, cell.rowData); }; IgxGridCRUDService.prototype.sameRow = function (rowID) { return this.row && this.row.id === rowID; }; IgxGridCRUDService.prototype.sameCell = function (cell) { return (this.cell.id.rowID === cell.id.rowID && this.cell.id.columnID === cell.id.columnID); }; Object.defineProperty(IgxGridCRUDService.prototype, "inEditMode", { get: function () { return !!this.cell; }, enumerable: true, configurable: true }); Object.defineProperty(IgxGridCRUDService.prototype, "rowEditing", { get: function () { return this.grid.rowEditable; }, enumerable: true, configurable: true }); Object.defineProperty(IgxGridCRUDService.prototype, "primaryKey", { get: function () { return this.grid.primaryKey; }, enumerable: true, configurable: true }); IgxGridCRUDService.prototype.beginRowEdit = function () { if (this.grid.rowEditable && (this.grid.primaryKey === undefined || this.grid.primaryKey === null)) { console.warn('The grid must have a `primaryKey` specified when using `rowEditable`!'); } this.row = this.createRow(this.cell); var args = { rowID: this.row.id, oldValue: this.row.data, cancel: false }; this.grid.onRowEditEnter.emit(args); if (args.cancel) { this.endRowEdit(); return; } this.row.transactionState = this.grid.transactions.getAggregatedValue(this.row.id, true); this.grid.transactions.startPending(); this.grid.openRowOverlay(this.row.id); }; IgxGridCRUDService.prototype.endRowEdit = function () { this.row = null; }; IgxGridCRUDService.prototype.begin = function (cell) { var newCell = this.createCell(cell); newCell.primaryKey = this.primaryKey; var args = { cellID: newCell.id, rowID: newCell.id.rowID, oldValue: newCell.value, cancel: false }; this.grid.onCellEditEnter.emit(args); if (args.cancel) { this.end(); return; } if (this.rowEditing) { if (this.row && !this.sameRow(newCell.id.rowID)) { this.grid.endEdit(true); this.cell = newCell; this.beginRowEdit(); return; } this.cell = newCell; if (!this.row) { this.beginRowEdit(); return; } } else { this.cell = newCell; this.endRowEdit(); } }; IgxGridCRUDService.prototype.end = function () { this.cell = null; }; IgxGridCRUDService.prototype.isInEditMode = function (rowIndex, columnIndex) { if (!this.cell) { return false; } return this.cell.column.index === columnIndex && this.cell.rowIndex === rowIndex; }; IgxGridCRUDService = __decorate([ Injectable() ], IgxGridCRUDService); return IgxGridCRUDService; }()); export { IgxGridCRUDService }; var IgxGridSelectionService = /** @class */ (function () { function IgxGridSelectionService(zone) { this.zone = zone; this.dragMode = false; this.keyboardState = {}; this.pointerState = {}; this.selection = new Map(); this.temp = new Map(); this._ranges = new Set(); this.rowSelection = new Set(); this.initPointerState(); this.initKeyboardState(); } Object.defineProperty(IgxGridSelectionService.prototype, "ranges", { /** * Returns the current selected ranges in the grid from both * keyboard and pointer interactions */ get: function () { // The last action was keyboard + shift selection -> add it this.addKeyboardRange(); var ranges = Array.from(this._ranges).map(function (range) { return JSON.parse(range); }); // No ranges but we have a focused cell -> add it if (!ranges.length && this.activeElement && this.grid.isCellSelectable) { ranges.push(this.generateRange(this.activeElement)); } return ranges; }, enumerable: true, configurable: true }); Object.defineProperty(IgxGridSelectionService.prototype, "primaryButton", { get: function () { return this.pointerState.primaryButton; }, set: function (value) { this.pointerState.primaryButton = value; }, enumerable: true, configurable: true }); /** * Resets the keyboard state */ IgxGridSelectionService.prototype.initKeyboardState = function () { this.keyboardState.node = null; this.keyboardState.shift = false; this.keyboardState.range = null; this.keyboardState.active = false; }; /** * Resets the pointer state */ IgxGridSelectionService.prototype.initPointerState = function () { this.pointerState.node = null; this.pointerState.ctrl = false; this.pointerState.shift = false; this.pointerState.range = null; this.pointerState.primaryButton = true; }; /** * Adds a single node. * Single clicks | Ctrl + single clicks on cells is the usual case. */ IgxGridSelectionService.prototype.add = function (node, addToRange) { if (addToRange === void 0) { addToRange = true; } this.selection.has(node.row) ? this.selection.get(node.row).add(node.column) : this.selection.set(node.row, new Set()).get(node.row).add(node.column); if (addToRange) { this._ranges.add(JSON.stringify(this.generateRange(node))); } }; /** * Adds the active keyboard range selection (if any) to the `ranges` meta. */ IgxGridSelectionService.prototype.addKeyboardRange = function () { if (this.keyboardState.range) { this._ranges.add(JSON.stringify(this.keyboardState.range)); } }; IgxGridSelectionService.prototype.remove = function (node) { if (this.selection.has(node.row)) { this.selection.get(node.row).delete(node.column); } if (this.isActiveNode(node)) { this.activeElement = null; } this._ranges.delete(JSON.stringify(this.generateRange(node))); }; IgxGridSelectionService.prototype.isInMap = function (node) { return (this.selection.has(node.row) && this.selection.get(node.row).has(node.column)) || (this.temp.has(node.row) && this.temp.get(node.row).has(node.column)); }; IgxGridSelectionService.prototype.selected = function (node) { return (this.isActiveNode(node) && this.grid.isCellSelectable) || this.isInMap(node); }; IgxGridSelectionService.prototype.isActiveNode = function (node) { if (this.activeElement) { var isActive = this.activeElement.column === node.column && this.activeElement.row === node.row; if (this.grid.hasColumnLayouts) { var layout = this.activeElement.layout; return isActive && this.isActiveLayout(layout, node.layout); } return isActive; } return false; }; IgxGridSelectionService.prototype.isActiveLayout = function (current, target) { return current.columnVisibleIndex === target.columnVisibleIndex; }; IgxGridSelectionService.prototype.addRangeMeta = function (node, state) { this._ranges.add(JSON.stringify(this.generateRange(node, state))); }; IgxGridSelectionService.prototype.removeRangeMeta = function (node, state) { this._ranges.delete(JSON.stringify(this.generateRange(node, state))); }; /** * Generates a new selection range from the given `node`. * If `state` is passed instead it will generate the range based on the passed `node` * and the start node of the `state`. */ IgxGridSelectionService.prototype.generateRange = function (node, state) { if (!state) { return { rowStart: node.row, rowEnd: node.row, columnStart: node.column, columnEnd: node.column }; } var _a = state.node, row = _a.row, column = _a.column; var rowStart = Math.min(node.row, row); var rowEnd = Math.max(node.row, row); var columnStart = Math.min(node.column, column); var columnEnd = Math.max(node.column, column); return { rowStart: rowStart, rowEnd: rowEnd, columnStart: columnStart, columnEnd: columnEnd }; }; /** * */ IgxGridSelectionService.prototype.keyboardStateOnKeydown = function (node, shift, shiftTab) { this.keyboardState.active = true; this.initPointerState(); this.keyboardState.shift = shift && !shiftTab; // Kb navigation with shift and no previous node. // Clear the current selection init the start node. if (this.keyboardState.shift && !this.keyboardState.node) { this.clear(); this.keyboardState.node = node; } }; IgxGridSelectionService.prototype.keyboardStateOnFocus = function (node, emitter, dom) { var kbState = this.keyboardState; // Focus triggered by keyboard navigation if (kbState.active) { if (isChromium()) { this._moveSelectionChrome(dom); } // Start generating a range if shift is hold if (kbState.shift) { this.dragSelect(node, kbState); kbState.range = this.generateRange(node, kbState); emitter.emit(this.generateRange(node, kbState)); return; } this.initKeyboardState(); this.clear(); this.add(node); } }; IgxGridSelectionService.prototype.pointerDown = function (node, shift, ctrl) { this.addKeyboardRange(); this.initKeyboardState(); this.pointerState.ctrl = ctrl; this.pointerState.shift = shift; // No ctrl key pressed - no multiple selection if (!ctrl) { this.clear(); } if (shift) { // No previously 'clicked' node. Use the last active node. if (!this.pointerState.node) { this.pointerState.node = this.activeElement || node; } this.pointerDownShiftKey(node); this.clearTextSelection(); return; } this.removeRangeMeta(node); this.pointerState.node = node; }; IgxGridSelectionService.prototype.pointerDownShiftKey = function (node) { this.clear(); this.selectRange(node, this.pointerState); }; IgxGridSelectionService.prototype.mergeMap = function (target, source) { var iterator = source.entries(); var pair = iterator.next(); var key; var value; var _loop_1 = function () { var _a; _a = __read(pair.value, 2), key = _a[0], value = _a[1]; if (target.has(key)) { var newValue_1 = target.get(key); value.forEach(function (record) { return newValue_1.add(record); }); target.set(key, newValue_1); } else { target.set(key, value); } pair = iterator.next(); }; while (!pair.done) { _loop_1(); } }; IgxGridSelectionService.prototype.pointerEnter = function (node, event) { // https://www.w3.org/TR/pointerevents/#the-button-property this.dragMode = event.buttons === 1 && event.button === -1; if (!this.dragMode) { return false; } this.clearTextSelection(); // If the users triggers a drag-like event by first clicking outside the grid cells // and then enters in the grid body we may not have a initial pointer starting node. // Assume the first pointerenter node is where we start. if (!this.pointerState.node) { this.pointerState.node = node; } this.pointerState.ctrl ? this.selectRange(node, this.pointerState, this.temp) : this.dragSelect(node, this.pointerState); return true; }; IgxGridSelectionService.prototype.pointerUp = function (node, emitter) { var _this = this; if (this.dragMode) { this.restoreTextSelection(); this.addRangeMeta(node, this.pointerState); this.mergeMap(this.selection, this.temp); this.zone.runTask(function () { return emitter.emit(_this.generateRange(node, _this.pointerState)); }); this.temp.clear(); this.dragMode = false; return true; } if (this.pointerState.shift) { this.clearTextSelection(); this.restoreTextSelection(); this.addRangeMeta(node, this.pointerState); emitter.emit(this.generateRange(node, this.pointerState)); return true; } this.add(node); return false; }; IgxGridSelectionService.prototype.selectRange = function (node, state, collection) { if (collection === void 0) { collection = this.selection; } if (collection === this.temp) { collection.clear(); } var _a = this.generateRange(node, state), rowStart = _a.rowStart, rowEnd = _a.rowEnd, columnStart = _a.columnStart, columnEnd = _a.columnEnd; for (var i = rowStart; i <= rowEnd; i++) { for (var j = columnStart; j <= columnEnd; j++) { collection.has(i) ? collection.get(i).add(j) : collection.set(i, new Set()).get(i).add(j); } } }; IgxGridSelectionService.prototype.dragSelect = function (node, state) { if (!this.pointerState.ctrl) { this.selection.clear(); } this.selectRange(node, state); }; IgxGridSelectionService.prototype.clear = function (clearAcriveEl) { if (clearAcriveEl === void 0) { clearAcriveEl = false; } if (clearAcriveEl) { this.activeElement = null; } this.selection.clear(); this.temp.clear(); this._ranges.clear(); }; IgxGridSelectionService.prototype.clearTextSelection = function () { var selection = window.getSelection(); if (selection.rangeCount) { this._selectionRange = selection.getRangeAt(0); this._selectionRange.collapse(true); selection.removeAllRanges(); } }; IgxGridSelectionService.prototype.restoreTextSelection = function () { var selection = window.getSelection(); if (!selection.rangeCount) { selection.addRange(this._selectionRange || document.createRange()); } }; /** * (╯°□°)╯︵ ┻━┻ * Chrome and Chromium don't care about the active * range after keyboard navigation, thus this. */ IgxGridSelectionService.prototype._moveSelectionChrome = function (node) { var selection = window.getSelection(); selection.removeAllRanges(); var range = new Range(); range.selectNode(node); range.collapse(true); selection.addRange(range); }; /** Returns array of the selected row id's. */ IgxGridSelectionService.prototype.getSelectedRows = function () { return this.rowSelection.size ? Array.from(this.rowSelection.keys()) : []; }; /** Clears row selection, if filtering is applied clears only selected rows from filtered data. */ IgxGridSelectionService.prototype.clearRowSelection = function (event) { var _this = this; var removedRec = this.isFilteringApplied() ? this.getRowIDs(this.allData).filter(function (rID) { return _this.isRowSelected(rID); }) : this.getSelectedRows(); var newSelection = this.isFilteringApplied() ? this.getSelectedRows().filter(function (x) { return !removedRec.includes(x); }) : []; this.emitRowSelectionEvent(newSelection, [], removedRec, event); }; /** Select all rows, if filtering is applied select only from filtered data. */ IgxGridSelectionService.prototype.selectAllRows = function (event) { var _this = this; var allRowIDs = this.getRowIDs(this.allData); var addedRows = allRowIDs.filter(function (rID) { return !_this.isRowSelected(rID); }); var newSelection = this.rowSelection.size ? this.getSelectedRows().concat(addedRows) : addedRows; this.emitRowSelectionEvent(newSelection, addedRows, [], event); }; /** Select the specified row and emit event. */ IgxGridSelectionService.prototype.selectRowById = function (rowID, clearPrevSelection, event) { if (!this.grid.isRowSelectable || this.isRowDeleted(rowID)) { return; } clearPrevSelection = !this.grid.isMultiRowSelectionEnabled || clearPrevSelection; var newSelection = clearPrevSelection ? [rowID] : this.getSelectedRows().indexOf(rowID) !== -1 ? this.getSelectedRows() : __spread(this.getSelectedRows(), [rowID]); var removed = clearPrevSelection ? this.getSelectedRows() : []; this.emitRowSelectionEvent(newSelection, [rowID], removed, event); }; /** Deselect the specified row and emit event. */ IgxGridSelectionService.prototype.deselectRow = function (rowID, event) { if (!this.isRowSelected(rowID)) { return; } var newSelection = this.getSelectedRows().filter(function (r) { return r !== rowID; }); if (this.rowSelection.size && this.rowSelection.has(rowID)) { this.emitRowSelectionEvent(newSelection, [], [rowID], event); } }; /** Select specified rows. No event is emitted. */ IgxGridSelectionService.prototype.selectRowsWithNoEvent = function (rowIDs, clearPrevSelection) { var _this = this; if (clearPrevSelection) { this.rowSelection.clear(); } rowIDs.forEach(function (rowID) { _this.rowSelection.add(rowID); }); this.allRowsSelected = undefined; }; /** Deselect specified rows. No event is emitted. */ IgxGridSelectionService.prototype.deselectRowsWithNoEvent = function (rowIDs) { var _this = this; rowIDs.forEach(function (rowID) { return _this.rowSelection.delete(rowID); }); this.allRowsSelected = undefined; }; IgxGridSelectionService.prototype.isRowSelected = function (rowID) { return this.rowSelection.size > 0 && this.rowSelection.has(rowID); }; /** Select range from last selected row to the current specified row.*/ IgxGridSelectionService.prototype.selectMultipleRows = function (rowID, rowData, event) { var _this = this; this.allRowsSelected = undefined; if (!this.rowSelection.size || this.isRowDeleted(rowID)) { this.selectRowById(rowID); return; } var gridData = this.allData; var lastRowID = this.getSelectedRows()[this.rowSelection.size - 1]; var currIndex = gridData.indexOf(this.getRowDataById(lastRowID)); var newIndex = gridData.indexOf(rowData); var rows = gridData.slice(Math.min(currIndex, newIndex), Math.max(currIndex, newIndex) + 1); var added = this.getRowIDs(rows).filter(function (rID) { return !_this.isRowSelected(rID); }); var newSelection = this.getSelectedRows().concat(added); this.emitRowSelectionEvent(newSelection, added, [], event); }; IgxGridSelectionService.prototype.areAllRowSelected = function () { if (!this.grid.data) { return false; } if (this.allRowsSelected !== undefined) { return this.allRowsSelected; } var dataItemsID = this.getRowIDs(this.allData); return this.allRowsSelected = Math.min(this.rowSelection.size, dataItemsID.length) > 0 && new Set(Array.from(this.rowSelection.values()).concat(dataItemsID)).size === this.rowSelection.size; }; IgxGridSelectionService.prototype.hasSomeRowSelected = function () { var _this = this; var filteredData = this.isFilteringApplied() ? this.getRowIDs(this.grid.filteredData).some(function (rID) { return _this.isRowSelected(rID); }) : true; return this.rowSelection.size > 0 && filteredData && !this.areAllRowSelected(); }; Object.defineProperty(IgxGridSelectionService.prototype, "filteredSelectedRowIds", { get: function () { var _this = this; return this.isFilteringApplied() ? this.getRowIDs(this.allData).filter(function (rowID) { return _this.isRowSelected(rowID); }) : this.getSelectedRows().filter(function (rowID) { return !_this.isRowDeleted(rowID); }); }, enumerable: true, configurable: true }); IgxGridSelectionService.prototype.emitRowSelectionEvent = function (newSelection, added, removed, event) { var currSelection = this.getSelectedRows(); if (this.areEqualCollections(currSelection, newSelection)) { return; } var args = { oldSelection: currSelection, newSelection: newSelection, added: added, removed: removed, event: event, cancel: false }; this.grid.onRowSelectionChange.emit(args); if (args.cancel) { return; } this.selectRowsWithNoEvent(args.newSelection, true); }; IgxGridSelectionService.prototype.getRowDataById = function (rowID) { if (!this.grid.primaryKey) { return rowID; } var rowIndex = this.getRowIDs(this.grid.gridAPI.get_all_data(true)).indexOf(rowID); return rowIndex < 0 ? {} : this.grid.gridAPI.get_all_data(true)[rowIndex]; }; IgxGridSelectionService.prototype.getRowIDs = function (data) { var _this = this; return this.grid.primaryKey && data.length ? data.map(function (rec) { return rec[_this.grid.primaryKey]; }) : data; }; IgxGridSelectionService.prototype.clearHeaderCBState = function () { this.allRowsSelected = undefined; }; /**Clear rowSelection and update checkbox state*/ IgxGridSelectionService.prototype.clearAllSelectedRows = function () { this.rowSelection.clear(); this.clearHeaderCBState(); }; Object.defineProperty(IgxGridSelectionService.prototype, "allData", { /** Returns all data in the grid, with applied filtering and sorting and without deleted rows. */ get: function () { var _this = this; var allData = this.isFilteringApplied() || this.grid.sortingExpressions.length ? this.grid.filteredSortedData : this.grid.gridAPI.get_all_data(true); return allData.filter(function (rData) { return !_this.isRowDeleted(_this.grid.gridAPI.get_row_id(rData)); }); }, enumerable: true, configurable: true }); IgxGridSelectionService.prototype.areEqualCollections = function (first, second) { return first.length === second.length && new Set(first.concat(second)).size === first.length; }; IgxGridSelectionService.prototype.isFilteringApplied = function () { return this.grid.filteringExpressionsTree.filteringOperands.length > 0; }; IgxGridSelectionService.prototype.isRowDeleted = function (rowID) { return this.grid.gridAPI.row_deleted_transaction(rowID); }; IgxGridSelectionService.ctorParameters = function () { return [ { type: NgZone } ]; }; IgxGridSelectionService = __decorate([ Injectable(), __metadata("design:paramtypes", [NgZone]) ], IgxGridSelectionService); return IgxGridSelectionService; }()); export { IgxGridSelectionService }; export function isChromium() { return (/Chrom|e?ium/g.test(navigator.userAgent) || /Google Inc/g.test(navigator.vendor)) && !/Edge/g.test(navigator.userAgent); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2dyaWRzL3NlbGVjdGlvbi9zZWxlY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBeUNqRSw2Q0FBNkM7QUFFN0M7SUFLSSxnQkFBbUIsRUFBTyxFQUFTLEtBQWEsRUFBUyxJQUFTO1FBQS9DLE9BQUUsR0FBRixFQUFFLENBQUs7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQVMsU0FBSSxHQUFKLElBQUksQ0FBSztJQUFHLENBQUM7SUFFdEUsb0NBQW1CLEdBQW5CO1FBQ0ksT0FBTztZQUNILEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNkLFFBQVEsZUFBUSxJQUFJLENBQUMsSUFBSSxDQUFFO1lBQzNCLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTztZQUN0QixNQUFNLEVBQUUsS0FBSztTQUNoQixDQUFDO0lBQ04sQ0FBQztJQUNMLGFBQUM7QUFBRCxDQUFDLEFBZkQsSUFlQzs7QUFFRDtJQUtJLGlCQUNXLEVBQUUsRUFDRixRQUFnQixFQUNoQixNQUFNLEVBQ04sS0FBVSxFQUNWLFNBQWMsRUFDZCxPQUFZO1FBTFosT0FBRSxHQUFGLEVBQUUsQ0FBQTtRQUNGLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FBQTtRQUNOLFVBQUssR0FBTCxLQUFLLENBQUs7UUFDVixjQUFTLEdBQVQsU0FBUyxDQUFLO1FBQ2QsWUFBTyxHQUFQLE9BQU8sQ0FBSztJQUFHLENBQUM7SUFFM0IsOEJBQVksR0FBWixVQUFhLEtBQVU7UUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG9C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