diff --git a/src/common/user-store/preferences-helpers.ts b/src/common/user-store/preferences-helpers.ts index 4363511120..c4c365a84b 100644 --- a/src/common/user-store/preferences-helpers.ts +++ b/src/common/user-store/preferences-helpers.ts @@ -23,7 +23,7 @@ import moment from "moment-timezone"; import path from "path"; import os from "os"; import { ThemeStore } from "../../renderer/theme.store"; -import { ObservableToggleSet } from "../utils"; +import { observable, ObservableMap } from "mobx"; export interface KubeconfigSyncEntry extends KubeconfigSyncValue { filePath: string; @@ -184,14 +184,14 @@ const openAtLogin: PreferenceDescription = { }, }; -const hiddenTableColumns: PreferenceDescription<[string, string[]][], Map>> = { +const hiddenTableColumns: PreferenceDescription<[string, [string, boolean][]][], Map>> = { fromStore(val) { return new Map( - (val ?? []).map(([tableId, columnIds]) => [tableId, new ObservableToggleSet(columnIds)]) + (val ?? []).map(([tableId, columns]) => [tableId, observable.map(columns)]) ); }, toStore(val) { - const res: [string, string[]][] = []; + const res: [string, [string, boolean][]][] = []; for (const [table, columns] of val) { if (columns.size) { diff --git a/src/common/user-store/user-store.ts b/src/common/user-store/user-store.ts index 7121357671..9c38851c34 100644 --- a/src/common/user-store/user-store.ts +++ b/src/common/user-store/user-store.ts @@ -21,7 +21,7 @@ import { app, remote } from "electron"; import semver from "semver"; -import { action, computed, observable, reaction, makeObservable } from "mobx"; +import { action, computed, observable, reaction, makeObservable, ObservableMap } from "mobx"; import { BaseStore } from "../base-store"; import migrations from "../../migrations/user-store"; import { getAppVersion } from "../utils/app-version"; @@ -29,7 +29,7 @@ import { kubeConfigDefaultPath } from "../kube-helpers"; import { appEventBus } from "../event-bus"; import path from "path"; import { fileNameMigration } from "../../migrations/user-store"; -import { ObservableToggleSet, toJS } from "../../renderer/utils"; +import { toJS } from "../../renderer/utils"; import { DESCRIPTORS, KubeconfigSyncValue, UserPreferencesModel } from "./preferences-helpers"; import logger from "../../main/logger"; @@ -79,7 +79,7 @@ export class UserStore extends BaseStore /* implements UserStore * The column IDs under each configurable table ID that have been configured * to not be shown */ - hiddenTableColumns = observable.map>(); + hiddenTableColumns = observable.map>(); /** * The set of file/folder paths to be synced @@ -136,12 +136,12 @@ export class UserStore extends BaseStore /* implements UserStore /** * Toggles the hidden configuration of a table's column */ - toggleTableColumnVisibility(tableId: string, columnId: string) { - if (!this.hiddenTableColumns.get(tableId)) { - this.hiddenTableColumns.set(tableId, new ObservableToggleSet()); + toggleTableColumnVisibility(tableId: string, columnId: string, defaultHidden: boolean) { + if (this.hiddenTableColumns.get(tableId)?.get(columnId) === undefined){ + this.hiddenTableColumns.get(tableId)?.set(columnId, !defaultHidden); + } else if (!!this.hiddenTableColumns.get(tableId)?.get(columnId) !== defaultHidden) { + this.hiddenTableColumns.get(tableId)?.delete(columnId); } - - this.hiddenTableColumns.get(tableId).toggle(columnId); } @action diff --git a/src/renderer/components/item-object-list/item-list-layout.tsx b/src/renderer/components/item-object-list/item-list-layout.tsx index 1287312653..6ce1ea71f3 100644 --- a/src/renderer/components/item-object-list/item-list-layout.tsx +++ b/src/renderer/components/item-object-list/item-list-layout.tsx @@ -23,11 +23,11 @@ import "./item-list-layout.scss"; import groupBy from "lodash/groupBy"; import React, { ReactNode } from "react"; -import { computed, makeObservable } from "mobx"; +import { computed, makeObservable, observable } from "mobx"; import { observer } from "mobx-react"; import { ConfirmDialog, ConfirmDialogParams } from "../confirm-dialog"; import { Table, TableCell, TableCellProps, TableHead, TableProps, TableRow, TableRowProps, TableSortCallbacks } from "../table"; -import { boundMethod, createStorage, cssNames, IClassName, isReactNode, noop, ObservableToggleSet, prevDefault, stopPropagation } from "../../utils"; +import { boundMethod, createStorage, cssNames, IClassName, isReactNode, noop, prevDefault, stopPropagation } from "../../utils"; import { AddRemoveButtons, AddRemoveButtonsProps } from "../add-remove-buttons"; import { NoItems } from "../no-items"; import { Spinner } from "../spinner"; @@ -68,6 +68,7 @@ export interface ItemListLayoutProps { searchFilters?: SearchFilter[]; /** @deprecated */ filterItems?: ItemsFilter[]; + hiddenColumns?: string[]; // header (title, filtering, searching, etc.) showHeader?: boolean; @@ -111,6 +112,7 @@ const defaultProps: Partial> = { searchFilters: [], customizeHeader: [], filterItems: [], + hiddenColumns: [], hasDetailsView: true, onDetails: noop, virtual: true, @@ -146,7 +148,7 @@ export class ItemListLayout extends React.Component extends React.Component @@ -492,7 +494,7 @@ export class ItemListLayout extends React.Component`} value={this.showColumn(cellProps)} - onChange={() => UserStore.getInstance().toggleTableColumnVisibility(tableId, cellProps.id)} + onChange={() => UserStore.getInstance().toggleTableColumnVisibility(tableId, cellProps.id, hiddenColumns.includes(cellProps.id))} /> )