UNPKG

handsontable

Version:

Handsontable is a JavaScript Data Grid available for React, Angular and Vue.

95 lines (88 loc) 4.76 kB
import "core-js/modules/es.array.push.js"; import "core-js/modules/esnext.iterator.constructor.js"; import "core-js/modules/esnext.iterator.filter.js"; import { arrayEach, arrayMap } from "../../../helpers/array.mjs"; import * as C from "../../../i18n/constants.mjs"; /** * @param {HiddenRows} hiddenRowsPlugin The plugin instance. * @returns {object} */ export default function showRowItem(hiddenRowsPlugin) { const rows = []; return { key: 'hidden_rows_show', name() { const pluralForm = rows.length > 1 ? 1 : 0; return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_SHOW_ROW, pluralForm); }, callback() { var _this$rowIndexMapper$, _this$rowIndexMapper$2; if (rows.length === 0) { return; } let startVisualRow = rows[0]; let endVisualRow = rows[rows.length - 1]; // Add to the selection one more visual row on the top. startVisualRow = (_this$rowIndexMapper$ = this.rowIndexMapper.getNearestNotHiddenIndex(startVisualRow - 1, -1)) !== null && _this$rowIndexMapper$ !== void 0 ? _this$rowIndexMapper$ : 0; // Add to the selection one more visual row on the bottom. endVisualRow = (_this$rowIndexMapper$2 = this.rowIndexMapper.getNearestNotHiddenIndex(endVisualRow + 1, 1)) !== null && _this$rowIndexMapper$2 !== void 0 ? _this$rowIndexMapper$2 : this.countRows() - 1; hiddenRowsPlugin.showRows(rows); // We render rows at first. It was needed for getting fixed rows. // Please take a look at #6864 for broader description. this.view.adjustElementsSize(); this.render(); const allRowsSelected = endVisualRow - startVisualRow + 1 === this.countRows(); // When all headers needs to be selected then do nothing. The header selection is // automatically handled by corner click. if (!allRowsSelected) { this.selectRows(startVisualRow, endVisualRow); } }, disabled: false, hidden() { const hiddenPhysicalRows = arrayMap(hiddenRowsPlugin.getHiddenRows(), visualRowIndex => { return this.toPhysicalRow(visualRowIndex); }); if (!(this.selection.isSelectedByRowHeader() || this.selection.isSelectedByCorner()) || hiddenPhysicalRows.length < 1) { return true; } rows.length = 0; const selectedRangeActive = this.getSelectedRangeActive(); const visualStartRow = selectedRangeActive.getTopStartCorner().row; const visualEndRow = selectedRangeActive.getBottomEndCorner().row; const rowIndexMapper = this.rowIndexMapper; const renderableStartRow = rowIndexMapper.getRenderableFromVisualIndex(visualStartRow); const renderableEndRow = rowIndexMapper.getRenderableFromVisualIndex(visualEndRow); const notTrimmedRowIndexes = rowIndexMapper.getNotTrimmedIndexes(); const physicalRowIndexes = []; if (visualStartRow !== visualEndRow) { const visualRowsInRange = visualEndRow - visualStartRow + 1; const renderedRowsInRange = renderableEndRow - renderableStartRow + 1; // Collect not trimmed rows if there are some hidden rows in the selection range. if (visualRowsInRange > renderedRowsInRange) { const physicalIndexesInRange = notTrimmedRowIndexes.slice(visualStartRow, visualEndRow + 1); physicalRowIndexes.push(...physicalIndexesInRange.filter(physicalIndex => hiddenPhysicalRows.includes(physicalIndex))); } // Handled row is the first rendered index and there are some visual indexes before it. } else if (renderableStartRow === 0 && renderableStartRow < visualStartRow) { // not trimmed indexes -> array of mappings from visual (native array's index) to physical indexes (value). physicalRowIndexes.push(...notTrimmedRowIndexes.slice(0, visualStartRow)); // physical indexes // When all rows are hidden and the context menu is triggered using top-left corner. } else if (renderableStartRow === null) { // Show all hidden rows. physicalRowIndexes.push(...notTrimmedRowIndexes.slice(0, this.countRows())); } else { const lastVisualIndex = this.countRows() - 1; const lastRenderableIndex = rowIndexMapper.getRenderableFromVisualIndex(rowIndexMapper.getNearestNotHiddenIndex(lastVisualIndex, -1)); // Handled row is the last rendered index and there are some visual indexes after it. if (renderableEndRow === lastRenderableIndex && lastVisualIndex > visualEndRow) { physicalRowIndexes.push(...notTrimmedRowIndexes.slice(visualEndRow + 1)); } } arrayEach(physicalRowIndexes, physicalRowIndex => { rows.push(this.toVisualRow(physicalRowIndex)); }); return rows.length === 0; } }; }