diff --git a/packages/frontend-core/src/components/grid/stores/rows.js b/packages/frontend-core/src/components/grid/stores/rows.js index 1631ad449b..7459059d1e 100644 --- a/packages/frontend-core/src/components/grid/stores/rows.js +++ b/packages/frontend-core/src/components/grid/stores/rows.js @@ -638,14 +638,6 @@ export const createActions = context => { get(fetch)?.nextPage() } - // Checks if we have a row with a certain ID - const hasRow = id => { - if (id === NewRowID) { - return true - } - return get(rowLookupMap)[id] != null - } - // Cleans a row by removing any internal grid metadata from it. // Call this before passing a row to any sort of external flow. const cleanRow = row => { @@ -667,7 +659,6 @@ export const createActions = context => { updateValue, applyRowChanges, deleteRows, - hasRow, loadNextPage, refreshRow, replaceRow, diff --git a/packages/frontend-core/src/components/grid/stores/ui.js b/packages/frontend-core/src/components/grid/stores/ui.js index a465d6ed81..2e14c6a662 100644 --- a/packages/frontend-core/src/components/grid/stores/ui.js +++ b/packages/frontend-core/src/components/grid/stores/ui.js @@ -117,8 +117,11 @@ export const deriveStores = context => { } // Row indices - const sourceRowIndex = $rowLookupMap[sourceInfo.rowId].__idx - const targetRowIndex = $rowLookupMap[targetInfo.rowId].__idx + const sourceRowIndex = $rowLookupMap[sourceInfo.rowId]?.__idx + const targetRowIndex = $rowLookupMap[targetInfo.rowId]?.__idx + if (sourceRowIndex == null || targetRowIndex == null) { + return [] + } const lowerRowIndex = Math.min(sourceRowIndex, targetRowIndex) const upperRowIndex = Math.max(sourceRowIndex, targetRowIndex) @@ -305,7 +308,7 @@ export const initialise = context => { focusedRowId, previousFocusedRowId, previousFocusedCellId, - rows, + rowLookupMap, focusedCellId, selectedRows, hoveredRowId, @@ -320,18 +323,17 @@ export const initialise = context => { } = context // Ensure we clear invalid rows from state if they disappear - rows.subscribe(async () => { + rowLookupMap.subscribe(async $rowLookupMap => { // We tick here to ensure other derived stores have properly updated. // We depend on the row lookup map which is a derived store, await tick() - const $focusedCellId = get(focusedCellId) + const $focusedRowId = get(focusedRowId) const $selectedRows = get(selectedRows) const $hoveredRowId = get(hoveredRowId) - const hasRow = rows.actions.hasRow + const hasRow = id => $rowLookupMap[id] != null - // Check selected cell - const selectedRowId = parseCellID($focusedCellId).rowId - if (selectedRowId && !hasRow(selectedRowId)) { + // Check focused cell + if ($focusedRowId && !hasRow($focusedRowId)) { focusedCellId.set(null) } @@ -341,17 +343,19 @@ export const initialise = context => { } // Check selected rows - let newSelectedRows = { ...$selectedRows } - let selectedRowsNeedsUpdate = false const selectedIds = Object.keys($selectedRows) - for (let i = 0; i < selectedIds.length; i++) { - if (!hasRow(selectedIds[i])) { - delete newSelectedRows[selectedIds[i]] - selectedRowsNeedsUpdate = true + if (selectedIds.length) { + let newSelectedRows = { ...$selectedRows } + let selectedRowsNeedsUpdate = false + for (let i = 0; i < selectedIds.length; i++) { + if (!hasRow(selectedIds[i])) { + delete newSelectedRows[selectedIds[i]] + selectedRowsNeedsUpdate = true + } + } + if (selectedRowsNeedsUpdate) { + selectedRows.set(newSelectedRows) } - } - if (selectedRowsNeedsUpdate) { - selectedRows.set(newSelectedRows) } })