From 0e443fb57f6cd1ad3c80853f14c1a8e3053006cf Mon Sep 17 00:00:00 2001 From: mikebender Date: Fri, 8 Dec 2023 09:44:23 -0500 Subject: [PATCH] fix: Unable to delete selected rows in some input tables - Erroneously assumed that the key columns were the first columns in the table - Removed unused delete function from `IrisGridTableModelTemplate` - It should only be implemented for regular JsTables as JsTreeTables do not have input tables - Was duplicated code - Fixes #1677 - Tested using the code in the ticket --- packages/iris-grid/src/IrisGridTableModel.ts | 29 ++++-- .../src/IrisGridTableModelTemplate.ts | 90 +------------------ 2 files changed, 21 insertions(+), 98 deletions(-) diff --git a/packages/iris-grid/src/IrisGridTableModel.ts b/packages/iris-grid/src/IrisGridTableModel.ts index 900d9eecdb..1d99694591 100644 --- a/packages/iris-grid/src/IrisGridTableModel.ts +++ b/packages/iris-grid/src/IrisGridTableModel.ts @@ -271,18 +271,29 @@ class IrisGridTableModel extends IrisGridTableModelTemplate { if (tableRanges.length <= 0) { return; } + const [data, deleteTable] = await Promise.all([ // Need to get the key values of each row this.snapshot( - tableRanges.map(range => { - assertNotNull(range); - return new GridRange( - 0, - range.startRow, - keyColumns.length - 1, - range.endRow - ); - }) + tableRanges + .map(range => { + assertNotNull(range); + // Need to map each key column to it's range so we can pass that into the snapshot function + return keyColumns.map(keyColumn => { + const keyIndex = this.getColumnIndexByName(keyColumn.name); + if (keyIndex == null) { + throw new Error(`Key column ${keyColumn.name} not found`); + } + + return new GridRange( + keyIndex, + range.startRow, + keyIndex, + range.endRow + ); + }); + }) + .flat() ), this.table.copy(), ]); diff --git a/packages/iris-grid/src/IrisGridTableModelTemplate.ts b/packages/iris-grid/src/IrisGridTableModelTemplate.ts index b5796d9f66..26578c8e9f 100644 --- a/packages/iris-grid/src/IrisGridTableModelTemplate.ts +++ b/packages/iris-grid/src/IrisGridTableModelTemplate.ts @@ -2086,95 +2086,7 @@ class IrisGridTableModelTemplate< } async delete(ranges: GridRange[]): Promise { - if (!this.isDeletableRanges(ranges)) { - throw new Error(`Undeletable ranges ${ranges}`); - } - - assertNotNull(this.inputTable); - const { keyColumns } = this.inputTable; - if (keyColumns.length === 0) { - throw new Error('No key columns to allow deletion'); - } - - const pendingAreaRange = this.getPendingAreaRange(); - const pendingRanges = ranges - .map(range => GridRange.intersection(pendingAreaRange, range)) - .filter(range => range != null) - .map(range => { - assertNotNull(range); - - return GridRange.offset( - range, - 0, - -(this.floatingTopRowCount + this.table.size) - ); - }); - - if (pendingRanges.length > 0) { - const newDataMap = new Map(this.pendingNewDataMap); - for (let i = 0; i < pendingRanges.length; i += 1) { - const pendingRange = pendingRanges[i]; - assertNotNull(pendingRange.startRow); - assertNotNull(pendingRange.endRow); - for (let r = pendingRange.startRow; r <= pendingRange.endRow; r += 1) { - newDataMap.delete(r); - } - } - this.pendingNewDataMap = newDataMap; - - this.formattedStringData = []; - - this.dispatchEvent( - new EventShimCustomEvent(IrisGridModel.EVENT.PENDING_DATA_UPDATED) - ); - - this.dispatchEvent(new EventShimCustomEvent(IrisGridModel.EVENT.UPDATED)); - } - - const tableAreaRange = this.getTableAreaRange(); - const tableRanges = ranges - .map(range => GridRange.intersection(tableAreaRange, range)) - .filter(range => range != null); - if (tableRanges.length <= 0) { - return; - } - const [data, deleteTable] = await Promise.all([ - // Need to get the key values of each row - this.snapshot( - tableRanges.map(range => { - assertNotNull(range); - return new GridRange( - 0, - range.startRow, - keyColumns.length - 1, - range.endRow - ); - }) - ), - this.table.copy(), - ]); - - // Now copy the existing table and filter it on the values in the snapshot for the key columns in the input table - const filters = data.map(row => { - const columnFilters = []; - for (let c = 0; c < keyColumns.length; c += 1) { - const column = keyColumns[c]; - const value = row[c]; - const filterValue = this.tableUtils.makeFilterRawValue( - column.type, - value - ); - const filter = column.filter().eq(filterValue); - columnFilters.push(filter); - } - return columnFilters.reduce((agg, curr) => agg?.and(curr) ?? curr); - }); - - const filter = filters.reduce((agg, curr) => agg?.or(curr) ?? curr); - deleteTable.applyFilter([filter]); - - // await this.inputTable?.deleteTable(deleteTable); - deleteTable.close(); + throw new Error('Delete not implemented'); } isValidForCell(x: ModelIndex, y: ModelIndex, value: string): boolean {