Skip to content
This repository was archived by the owner on Jul 28, 2025. It is now read-only.

Commit b50ce35

Browse files
committed
fixed concurrency problem
1 parent 9342c1d commit b50ce35

File tree

3 files changed

+31
-19
lines changed

3 files changed

+31
-19
lines changed

src/cdm/TableStateInterface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export interface ColumnsState {
6060
addToRight: (column: TableColumn, customName?: string) => void;
6161
remove: (column: TableColumn) => void;
6262
alterSorting: (column: TableColumn) => void;
63-
addOptionToColumn: (column: TableColumn, option: string, backgroundColor: string) => Promise<void>;
63+
addOptionToColumn: (column: TableColumn, option: string, backgroundColor: string) => void;
6464
alterColumnType: (column: TableColumn, input: string, parsedRows?: RowDataType[]) => Promise<void>;
6565
alterColumnId: (column: TableColumn, root: string, nestedIds: string[]) => Promise<void>;
6666
alterColumnLabel: (column: TableColumn, label: string) => Promise<void>;

src/components/cellTypes/SelectCell.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ const SelectCell = (popperProps: CellComponentProps) => {
7777
[selectRow]
7878
);
7979

80-
const handleOnChange = (
80+
const handleOnChange = async (
8181
newValue: OnChangeValue<SelectValue, false>,
8282
actionMeta: ActionMeta<RowSelectOption>
8383
) => {
@@ -102,7 +102,11 @@ const SelectCell = (popperProps: CellComponentProps) => {
102102
selectValue &&
103103
!tableColumn.options.find((option) => option.label === selectValue)
104104
) {
105-
columnActions.addOptionToColumn(tableColumn, selectValue, randomColor());
105+
await columnActions.addOptionToColumn(
106+
tableColumn,
107+
selectValue,
108+
randomColor()
109+
);
106110
}
107111
setShowSelect(false);
108112
};

src/stateManagement/columns/handlers/AlterOptionToColumnAction.ts

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,34 @@ import { AbstractTableAction } from "stateManagement/AbstractTableAction";
44

55
export default class AlterOptionToColumnHandlerAction extends AbstractTableAction<ColumnsState> {
66
handle(tableActionResponse: TableActionResponse<ColumnsState>): TableActionResponse<ColumnsState> {
7-
const { view, set, implementation } = tableActionResponse;
8-
implementation.actions.addOptionToColumn = async (
7+
const { view, set, get, implementation } = tableActionResponse;
8+
implementation.actions.addOptionToColumn = (
99
column: TableColumn,
1010
option: string,
1111
backgroundColor: string
1212
) => {
13-
// Save on disk
14-
const newOptions = [...column.options, { label: option, backgroundColor: backgroundColor }];
15-
await view.diskConfig.updateColumnProperties(column.id, {
16-
options: newOptions,
17-
});
18-
// Save on memory
19-
set((updater) => {
20-
const optionIndex = updater.columns.findIndex(
21-
(col: TableColumn) => col.id === column.id
22-
);
23-
const updatedColumns = [...updater.columns];
24-
updatedColumns[optionIndex].options = newOptions;
25-
return { columns: updatedColumns };
26-
});
13+
// Wrap in a promise of a queue to avoid concurrency issues
14+
const columnIndex = get().columns.findIndex(
15+
(col: TableColumn) => col.id === column.id
16+
);
17+
const memoryColumn = get().columns[columnIndex];
18+
// Check if the option already exists
19+
const optionIndex = memoryColumn.options.findIndex((o) => o.label === option);
20+
// Add the option to the column if it doesn't exist
21+
if (optionIndex === -1) {
22+
// Save on disk
23+
const newOptions = [...memoryColumn.options, { label: option, backgroundColor: backgroundColor }];
24+
view.diskConfig.updateColumnProperties(column.id, {
25+
options: newOptions,
26+
});
27+
28+
// Save on memory
29+
set((updater) => {
30+
memoryColumn.options = newOptions;
31+
updater.columns[columnIndex] = memoryColumn;
32+
return { columns: updater.columns };
33+
});
34+
}
2735
}
2836

2937
tableActionResponse.implementation = implementation;

0 commit comments

Comments
 (0)