Skip to content

Commit 1e71550

Browse files
authored
fix: Unable to delete selected rows in some input tables (#1678)
- 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
1 parent 1b06675 commit 1e71550

2 files changed

Lines changed: 21 additions & 98 deletions

File tree

packages/iris-grid/src/IrisGridTableModel.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -271,18 +271,29 @@ class IrisGridTableModel extends IrisGridTableModelTemplate<Table, UIRow> {
271271
if (tableRanges.length <= 0) {
272272
return;
273273
}
274+
274275
const [data, deleteTable] = await Promise.all([
275276
// Need to get the key values of each row
276277
this.snapshot(
277-
tableRanges.map(range => {
278-
assertNotNull(range);
279-
return new GridRange(
280-
0,
281-
range.startRow,
282-
keyColumns.length - 1,
283-
range.endRow
284-
);
285-
})
278+
tableRanges
279+
.map(range => {
280+
assertNotNull(range);
281+
// Need to map each key column to it's range so we can pass that into the snapshot function
282+
return keyColumns.map(keyColumn => {
283+
const keyIndex = this.getColumnIndexByName(keyColumn.name);
284+
if (keyIndex == null) {
285+
throw new Error(`Key column ${keyColumn.name} not found`);
286+
}
287+
288+
return new GridRange(
289+
keyIndex,
290+
range.startRow,
291+
keyIndex,
292+
range.endRow
293+
);
294+
});
295+
})
296+
.flat()
286297
),
287298
this.table.copy(),
288299
]);

packages/iris-grid/src/IrisGridTableModelTemplate.ts

Lines changed: 1 addition & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -2086,95 +2086,7 @@ class IrisGridTableModelTemplate<
20862086
}
20872087

20882088
async delete(ranges: GridRange[]): Promise<void> {
2089-
if (!this.isDeletableRanges(ranges)) {
2090-
throw new Error(`Undeletable ranges ${ranges}`);
2091-
}
2092-
2093-
assertNotNull(this.inputTable);
2094-
const { keyColumns } = this.inputTable;
2095-
if (keyColumns.length === 0) {
2096-
throw new Error('No key columns to allow deletion');
2097-
}
2098-
2099-
const pendingAreaRange = this.getPendingAreaRange();
2100-
const pendingRanges = ranges
2101-
.map(range => GridRange.intersection(pendingAreaRange, range))
2102-
.filter(range => range != null)
2103-
.map(range => {
2104-
assertNotNull(range);
2105-
2106-
return GridRange.offset(
2107-
range,
2108-
0,
2109-
-(this.floatingTopRowCount + this.table.size)
2110-
);
2111-
});
2112-
2113-
if (pendingRanges.length > 0) {
2114-
const newDataMap = new Map(this.pendingNewDataMap);
2115-
for (let i = 0; i < pendingRanges.length; i += 1) {
2116-
const pendingRange = pendingRanges[i];
2117-
assertNotNull(pendingRange.startRow);
2118-
assertNotNull(pendingRange.endRow);
2119-
for (let r = pendingRange.startRow; r <= pendingRange.endRow; r += 1) {
2120-
newDataMap.delete(r);
2121-
}
2122-
}
2123-
this.pendingNewDataMap = newDataMap;
2124-
2125-
this.formattedStringData = [];
2126-
2127-
this.dispatchEvent(
2128-
new EventShimCustomEvent(IrisGridModel.EVENT.PENDING_DATA_UPDATED)
2129-
);
2130-
2131-
this.dispatchEvent(new EventShimCustomEvent(IrisGridModel.EVENT.UPDATED));
2132-
}
2133-
2134-
const tableAreaRange = this.getTableAreaRange();
2135-
const tableRanges = ranges
2136-
.map(range => GridRange.intersection(tableAreaRange, range))
2137-
.filter(range => range != null);
2138-
if (tableRanges.length <= 0) {
2139-
return;
2140-
}
2141-
const [data, deleteTable] = await Promise.all([
2142-
// Need to get the key values of each row
2143-
this.snapshot(
2144-
tableRanges.map(range => {
2145-
assertNotNull(range);
2146-
return new GridRange(
2147-
0,
2148-
range.startRow,
2149-
keyColumns.length - 1,
2150-
range.endRow
2151-
);
2152-
})
2153-
),
2154-
this.table.copy(),
2155-
]);
2156-
2157-
// Now copy the existing table and filter it on the values in the snapshot for the key columns in the input table
2158-
const filters = data.map(row => {
2159-
const columnFilters = [];
2160-
for (let c = 0; c < keyColumns.length; c += 1) {
2161-
const column = keyColumns[c];
2162-
const value = row[c];
2163-
const filterValue = this.tableUtils.makeFilterRawValue(
2164-
column.type,
2165-
value
2166-
);
2167-
const filter = column.filter().eq(filterValue);
2168-
columnFilters.push(filter);
2169-
}
2170-
return columnFilters.reduce((agg, curr) => agg?.and(curr) ?? curr);
2171-
});
2172-
2173-
const filter = filters.reduce((agg, curr) => agg?.or(curr) ?? curr);
2174-
deleteTable.applyFilter([filter]);
2175-
2176-
// await this.inputTable?.deleteTable(deleteTable);
2177-
deleteTable.close();
2089+
throw new Error('Delete not implemented');
21782090
}
21792091

21802092
isValidForCell(x: ModelIndex, y: ModelIndex, value: string): boolean {

0 commit comments

Comments
 (0)