Skip to content

Commit f640799

Browse files
Scott DoverScott Dover
authored andcommitted
chore: persist column sort criteria
Signed-off-by: Scott Dover <[email protected]>
1 parent 5ee1909 commit f640799

File tree

3 files changed

+42
-6
lines changed

3 files changed

+42
-6
lines changed

client/src/panels/DataViewer.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@
22
// SPDX-License-Identifier: Apache-2.0
33
import { Uri, l10n, window } from "vscode";
44

5-
import { SortModelItem } from "ag-grid-community";
5+
import type { ColumnState, SortModelItem } from "ag-grid-community";
66

77
import PaginatedResultSet from "../components/LibraryNavigator/PaginatedResultSet";
88
import { TableData } from "../components/LibraryNavigator/types";
99
import { Column } from "../connection/rest/api/compute";
1010
import { WebView } from "./WebviewManager";
1111

12+
export type ViewProperties = { columnState?: ColumnState[] };
13+
1214
class DataViewer extends WebView {
15+
protected viewProperties: ViewProperties = {};
1316
public constructor(
1417
extensionUri: Uri,
1518
uid: string,
@@ -57,6 +60,7 @@ class DataViewer extends WebView {
5760
end?: number;
5861
sortModel?: SortModelItem[];
5962
columnName?: string;
63+
viewProperties?: Partial<ViewProperties>;
6064
};
6165
},
6266
): Promise<void> {
@@ -81,14 +85,25 @@ class DataViewer extends WebView {
8185
this.panel.webview.postMessage({
8286
key: event.key,
8387
command: "response:loadColumns",
84-
data: await this.fetchColumns(),
88+
data: {
89+
columns: await this.fetchColumns(),
90+
viewProperties: this.viewProperties,
91+
},
8592
});
8693
break;
8794
case "request:loadColumnProperties":
8895
if (event.data.columnName) {
8996
this.loadColumnProperties(event.data.columnName);
9097
}
9198
break;
99+
case "request:storeViewProperties":
100+
if (event.data.viewProperties) {
101+
this.viewProperties = {
102+
...this.viewProperties,
103+
...event.data.viewProperties,
104+
};
105+
}
106+
break;
92107
default:
93108
break;
94109
}

client/src/webview/ColumnMenu.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { AgColumn, ColumnState, GridApi } from "ag-grid-community";
44

55
import GridMenu from "./GridMenu";
66
import localize from "./localize";
7+
import { storeViewProperties } from "./useDataViewer";
78

89
export interface ColumnMenuProps {
910
column: AgColumn;
@@ -21,6 +22,7 @@ export interface ColumnMenuProps {
2122
const applyColumnState = (api: GridApi, state: ColumnState[]) => {
2223
api.applyColumnState({ state, defaultState: { sort: null } });
2324
api.ensureIndexVisible(0);
25+
storeViewProperties({ columnState: state });
2426
};
2527

2628
export const getColumnMenu = (

client/src/webview/useDataViewer.ts

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { v4 } from "uuid";
1717

1818
import { TableData } from "../components/LibraryNavigator/types";
1919
import { Column } from "../connection/rest/api/compute";
20+
import type { ViewProperties } from "../panels/DataViewer";
2021
import ColumnHeader from "./ColumnHeader";
2122
import { ColumnMenuProps, getColumnMenu } from "./ColumnMenu";
2223

@@ -77,7 +78,10 @@ const queryTableData = (
7778
let fetchColumnsTimeoutId: ReturnType<typeof setTimeout> | null = null;
7879
const clearFetchColumnsTimeout = () =>
7980
fetchColumnsTimeoutId && clearTimeout(fetchColumnsTimeoutId);
80-
const fetchColumns = (): Promise<Column[]> => {
81+
const fetchColumns = (): Promise<{
82+
columns: Column[];
83+
viewProperties?: ViewProperties;
84+
}> => {
8185
const requestKey = v4();
8286
vscode.postMessage({ command: "request:loadColumns", key: requestKey });
8387

@@ -104,10 +108,15 @@ const fetchColumns = (): Promise<Column[]> => {
104108
});
105109
};
106110

111+
export const storeViewProperties = (viewProperties: ViewProperties) =>
112+
vscode.postMessage({
113+
command: "request:storeViewProperties",
114+
data: { viewProperties },
115+
});
116+
107117
const useDataViewer = (theme: string) => {
108118
const [columns, setColumns] = useState<ColDef[]>([]);
109119
const [columnMenu, setColumnMenu] = useState<ColumnMenuProps | undefined>();
110-
111120
const columnMenuRef = useRef<ColumnMenuProps | undefined>(columnMenu);
112121
useEffect(() => {
113122
columnMenuRef.current = columnMenu;
@@ -180,7 +189,11 @@ const useDataViewer = (theme: string) => {
180189
return;
181190
}
182191

183-
fetchColumns().then((columnsData) => {
192+
fetchColumns().then(({ columns: columnsData, viewProperties }) => {
193+
const getColumnState = (name: string) =>
194+
viewProperties.columnState
195+
? viewProperties.columnState.find(({ colId }) => colId === name)
196+
: {};
184197
const columns: ColDef[] = columnsData.map((column) => ({
185198
field: column.name,
186199
headerComponent: ColumnHeader,
@@ -190,6 +203,7 @@ const useDataViewer = (theme: string) => {
190203
displayMenuForColumn,
191204
theme,
192205
},
206+
...getColumnState(column.name),
193207
suppressHeaderKeyboardEvent: (
194208
params: SuppressHeaderKeyboardEventParams,
195209
) => {
@@ -245,7 +259,12 @@ const useDataViewer = (theme: string) => {
245259

246260
const dismissMenu = () => setColumnMenu(undefined);
247261

248-
return { columns, onGridReady, columnMenu, dismissMenu };
262+
return {
263+
columns,
264+
onGridReady,
265+
columnMenu,
266+
dismissMenu,
267+
};
249268
};
250269

251270
export default useDataViewer;

0 commit comments

Comments
 (0)