Skip to content

Commit f6893e8

Browse files
authored
Merge pull request #10 from ghazi-git/track-selected-objects
track selected objects rather than their IDs
2 parents 4b679f3 + 720b0c2 commit f6893e8

File tree

5 files changed

+33
-77
lines changed

5 files changed

+33
-77
lines changed

src/devtools/components/main-content/object-store-view/DeleteObjectsButton.tsx

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,25 @@
11
import { createMemo, Match, Show, Switch } from "solid-js";
22

33
import UnstyledButton from "@/devtools/components/buttons/UnstyledButton";
4-
import {
5-
SelectedObjectID,
6-
useTableMutationContext,
7-
} from "@/devtools/components/main-content/object-store-view/table-mutation-context";
4+
import { useTableMutationContext } from "@/devtools/components/main-content/object-store-view/table-mutation-context";
85
import CloseIcon from "@/devtools/components/svg-icons/CloseIcon";
96
import DeleteIcon from "@/devtools/components/svg-icons/DeleteIcon";
107
import LoadingIcon from "@/devtools/components/svg-icons/LoadingIcon";
8+
import { getIndexedDBKey } from "@/devtools/utils/grid-options";
119
import {
1210
DATA_MUTATION_ERROR_MSG,
1311
generateRequestID,
1412
} from "@/devtools/utils/inspected-window-helpers";
15-
import { ActiveObjectStore, DataValue } from "@/devtools/utils/types";
13+
import { ActiveObjectStore, TableColumn } from "@/devtools/utils/types";
1614

1715
import styles from "./DeleteObjectsButton.module.css";
1816

19-
export default function DeleteObjectsButton(props: {
20-
activeStore: ActiveObjectStore;
21-
}) {
17+
export default function DeleteObjectsButton(props: DeleteObjectsButtonProps) {
2218
const { tableMutationStore, setErrorMsg, deleteOperation, deleteData } =
2319
useTableMutationContext();
24-
const canDelete = () => tableMutationStore.selectedObjectIDs.length > 0;
20+
const canDelete = () => tableMutationStore.selectedObjects.length > 0;
2521
const deletionMsg = () => {
26-
const count = tableMutationStore.selectedObjectIDs.length;
22+
const count = tableMutationStore.selectedObjects.length;
2723
if (count === 1) {
2824
return "Are you sure you want to delete the selected object?";
2925
} else if (count > 1) {
@@ -34,7 +30,9 @@ export default function DeleteObjectsButton(props: {
3430
};
3531
const validObjectKeys = createMemo(() => {
3632
try {
37-
return getObjectKeys(tableMutationStore.selectedObjectIDs);
33+
return tableMutationStore.selectedObjects.map((obj) =>
34+
getIndexedDBKey(props.keypath, props.columns, obj),
35+
);
3836
} catch {
3937
return [];
4038
}
@@ -111,21 +109,8 @@ export default function DeleteObjectsButton(props: {
111109
);
112110
}
113111

114-
function getObjectKeys(objectIDs: SelectedObjectID[]) {
115-
return objectIDs.map((objectID) => {
116-
return objectID.map((cell) => {
117-
if (
118-
cell.datatype !== "string" &&
119-
cell.datatype !== "number" &&
120-
cell.datatype !== "timestamp" &&
121-
cell.datatype !== "json_data" &&
122-
cell.datatype !== "date"
123-
) {
124-
throw new Error("Invalid key column datatype");
125-
}
126-
if (cell.value == null) throw new Error("Invalid key column value");
127-
128-
return { datatype: cell.datatype, value: cell.value } as DataValue;
129-
});
130-
});
112+
interface DeleteObjectsButtonProps {
113+
activeStore: ActiveObjectStore;
114+
keypath: string[];
115+
columns: TableColumn[];
131116
}

src/devtools/components/main-content/object-store-view/Table.tsx

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import { getUnsupportedColdef } from "@/devtools/utils/coldef-unsupported";
4040
import {
4141
convertGetterValueToRowDataValue,
4242
getIndexedDBKey,
43-
getSelectedObjectID,
4443
parseBooleanNull,
4544
updateRowData,
4645
} from "@/devtools/utils/grid-options";
@@ -64,7 +63,7 @@ export default function Table(props: TableProps) {
6463

6564
const {
6665
setErrorMsg,
67-
setSelectedObjectIDs,
66+
setSelectedObjects,
6867
updateOperation,
6968
updateField,
7069
deleteOperation,
@@ -178,10 +177,7 @@ export default function Table(props: TableProps) {
178177
},
179178
onSelectionChanged(params: SelectionChangedEvent) {
180179
const nodes = params.selectedNodes || [];
181-
const selectedObjectIDs = nodes.map((node) => {
182-
return getSelectedObjectID(node, props.keypath, props.columns);
183-
});
184-
setSelectedObjectIDs(selectedObjectIDs);
180+
setSelectedObjects(nodes.map((node) => node.data));
185181
},
186182
readOnlyEdit: true,
187183
onCellEditRequest: async (params: CellEditRequestEvent) => {
@@ -263,13 +259,10 @@ export default function Table(props: TableProps) {
263259
// delete the rows from the table on deletion success in indexedDB
264260
if (deleteOperation.isSuccess) {
265261
untrack(() => {
266-
const rows = tableMutationStore.selectedObjectIDs.map((row) => {
267-
return Object.fromEntries(
268-
row.map(({ name, value }) => [name, value]),
269-
);
262+
gridApi.applyTransaction({
263+
remove: tableMutationStore.selectedObjects,
270264
});
271-
gridApi.applyTransaction({ remove: rows });
272-
setSelectedObjectIDs([]);
265+
setSelectedObjects([]);
273266
resetDeleteOperation();
274267
});
275268
}
@@ -286,7 +279,7 @@ export default function Table(props: TableProps) {
286279
});
287280
batch(() => {
288281
// reset selected rows and error msg on table reload
289-
setSelectedObjectIDs([]);
282+
setSelectedObjects([]);
290283
setErrorMsg(null);
291284
});
292285
});

src/devtools/components/main-content/object-store-view/TableStateWrapper.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ export default function TableStateWrapper() {
2727
<TableSettingsWrapper>
2828
<TableSearch />
2929
<Show when={data().rows?.length}>
30-
<DeleteObjectsButton activeStore={data().activeStore} />
30+
<DeleteObjectsButton
31+
activeStore={data().activeStore}
32+
keypath={data().keypath}
33+
columns={data().columns}
34+
/>
3135
</Show>
3236
<AddObjectsButton />
3337
<TableSettingsButton />

src/devtools/components/main-content/object-store-view/table-mutation-context.tsx

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ import {
1414
DataCreationRequest,
1515
DataDeletionRequest,
1616
DataUpdateRequest,
17-
TableColumnDatatype,
18-
TableColumnValue,
17+
TableRow,
1918
} from "@/devtools/utils/types";
2019

2120
const TableMutationContext = createContext<TableMutationContextType>();
@@ -35,12 +34,12 @@ export function TableMutationContextProvider(props: FlowProps) {
3534
const [tableMutationStore, setTableMutationStore] =
3635
createStore<TableMutationStore>({
3736
errorMsg: null,
38-
selectedObjectIDs: [],
37+
selectedObjects: [],
3938
});
4039
const setErrorMsg = (msg: string | null) =>
4140
setTableMutationStore("errorMsg", msg);
42-
const setSelectedObjectIDs = (selectedObjectIDs: SelectedObjectID[]) => {
43-
setTableMutationStore("selectedObjectIDs", selectedObjectIDs);
41+
const setSelectedObjects = (selectedObjects: TableRow[]) => {
42+
setTableMutationStore("selectedObjects", selectedObjects);
4443
};
4544

4645
const { mutation: updateOperation, mutate: updateField } =
@@ -78,15 +77,15 @@ export function TableMutationContextProvider(props: FlowProps) {
7877
const { activeObjectStore } = useActiveObjectStoreContext();
7978
createEffect(() => {
8079
activeObjectStore();
81-
setTableMutationStore({ errorMsg: null, selectedObjectIDs: [] });
80+
setTableMutationStore({ errorMsg: null, selectedObjects: [] });
8281
});
8382

8483
return (
8584
<TableMutationContext.Provider
8685
value={{
8786
tableMutationStore,
8887
setErrorMsg,
89-
setSelectedObjectIDs,
88+
setSelectedObjects,
9089
updateOperation,
9190
updateField,
9291
deleteOperation,
@@ -105,7 +104,7 @@ export function TableMutationContextProvider(props: FlowProps) {
105104
interface TableMutationContextType {
106105
tableMutationStore: TableMutationStore;
107106
setErrorMsg: (msg: string | null) => void;
108-
setSelectedObjectIDs: (selectedObjectIDs: SelectedObjectID[]) => void;
107+
setSelectedObjects: (selectedObjects: TableRow[]) => void;
109108
updateOperation: Mutation;
110109
updateField: (params: DataUpdateRequest) => Promise<void>;
111110
deleteOperation: Mutation;
@@ -118,11 +117,5 @@ interface TableMutationContextType {
118117

119118
interface TableMutationStore {
120119
errorMsg: string | null;
121-
selectedObjectIDs: SelectedObjectID[];
120+
selectedObjects: TableRow[];
122121
}
123-
124-
export type SelectedObjectID = {
125-
name: string;
126-
datatype: TableColumnDatatype;
127-
value: TableColumnValue;
128-
}[];

src/devtools/utils/grid-options.ts

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import { GridApi, IRowNode } from "ag-grid-community";
1+
import { GridApi } from "ag-grid-community";
22

3-
import { SelectedObjectID } from "@/devtools/components/main-content/object-store-view/table-mutation-context";
43
import {
54
DataValue,
65
TableColumn,
@@ -97,21 +96,3 @@ export function convertGetterValueToRowDataValue(
9796
return value;
9897
}
9998
}
100-
101-
export function getSelectedObjectID(
102-
node: IRowNode,
103-
keypath: string[],
104-
columns: TableColumn[],
105-
): SelectedObjectID {
106-
const objectID = JSON.parse(node.id!) as TableColumnValue[];
107-
108-
return objectID.map((value, index) => {
109-
const colName = keypath[index];
110-
const column = columns.find((col) => col.name === colName);
111-
return {
112-
value,
113-
name: colName,
114-
datatype: column!.datatype,
115-
};
116-
});
117-
}

0 commit comments

Comments
 (0)