1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Removing table context. Pass columns through the props

Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>
This commit is contained in:
Alex Andreev 2023-05-25 13:25:03 +03:00
parent 6e5fc63953
commit febae16bbb
5 changed files with 14 additions and 30 deletions

View File

@ -18,7 +18,7 @@ import type { AddRemoveButtonsProps } from "../add-remove-buttons";
import { AddRemoveButtons } from "../add-remove-buttons"; import { AddRemoveButtons } from "../add-remove-buttons";
import { NoItems } from "../no-items"; import { NoItems } from "../no-items";
import { Spinner } from "../spinner"; import { Spinner } from "../spinner";
import type { ItemObject, TableCellProps } from "@k8slens/list-layout"; import type { GeneralKubeObjectListLayoutColumn, ItemObject, TableCellProps } from "@k8slens/list-layout";
import type { Filter, PageFiltersStore } from "./page-filters/store"; import type { Filter, PageFiltersStore } from "./page-filters/store";
import type { LensTheme } from "../../themes/lens-theme"; import type { LensTheme } from "../../themes/lens-theme";
import { MenuActions } from "../menu/menu-actions"; import { MenuActions } from "../menu/menu-actions";
@ -35,8 +35,8 @@ import type { ToggleTableColumnVisibility } from "../../../features/user-prefere
import toggleTableColumnVisibilityInjectable from "../../../features/user-preferences/common/toggle-table-column-visibility.injectable"; import toggleTableColumnVisibilityInjectable from "../../../features/user-preferences/common/toggle-table-column-visibility.injectable";
import type { IsTableColumnHidden } from "../../../features/user-preferences/common/is-table-column-hidden.injectable"; import type { IsTableColumnHidden } from "../../../features/user-preferences/common/is-table-column-hidden.injectable";
import isTableColumnHiddenInjectable from "../../../features/user-preferences/common/is-table-column-hidden.injectable"; import isTableColumnHiddenInjectable from "../../../features/user-preferences/common/is-table-column-hidden.injectable";
import type { TableComponent, TableDataContextValue } from "@k8slens/table-tokens"; import type { TableComponent } from "@k8slens/table-tokens";
import { TableDataContext, tableComponentInjectionToken } from "@k8slens/table-tokens"; import { tableComponentInjectionToken } from "@k8slens/table-tokens";
export interface ItemListLayoutContentProps<Item extends ItemObject, PreLoadStores extends boolean> { export interface ItemListLayoutContentProps<Item extends ItemObject, PreLoadStores extends boolean> {
getFilters: () => Filter[]; getFilters: () => Filter[];
@ -56,6 +56,7 @@ export interface ItemListLayoutContentProps<Item extends ItemObject, PreLoadStor
customizeTableRowProps?: (item: Item) => Partial<TableRowProps<Item>>; customizeTableRowProps?: (item: Item) => Partial<TableRowProps<Item>>;
addRemoveButtons?: Partial<AddRemoveButtonsProps>; addRemoveButtons?: Partial<AddRemoveButtonsProps>;
virtual?: boolean; virtual?: boolean;
columns?: GeneralKubeObjectListLayoutColumn[];
// item details view // item details view
hasDetailsView?: boolean; hasDetailsView?: boolean;
@ -89,9 +90,6 @@ class NonInjectedItemListLayoutContent<
Item extends ItemObject, Item extends ItemObject,
PreLoadStores extends boolean, PreLoadStores extends boolean,
> extends React.Component<ItemListLayoutContentProps<Item, PreLoadStores> & Dependencies> { > extends React.Component<ItemListLayoutContentProps<Item, PreLoadStores> & Dependencies> {
static contextType = TableDataContext;
declare context: TableDataContextValue;
constructor(props: ItemListLayoutContentProps<Item, PreLoadStores> & Dependencies) { constructor(props: ItemListLayoutContentProps<Item, PreLoadStores> & Dependencies) {
super(props); super(props);
makeObservable(this); makeObservable(this);
@ -316,7 +314,7 @@ class NonInjectedItemListLayoutContent<
<div className="items box grow flex column"> <div className="items box grow flex column">
<table.Component <table.Component
tableId={tableId} tableId={tableId}
columns={this.context.columns} columns={this.props.columns}
virtual={virtual} virtual={virtual}
selectable={hasDetailsView} selectable={hasDetailsView}
sortable={sortingCallbacks} sortable={sortingCallbacks}

View File

@ -31,6 +31,9 @@ import selectedFilterNamespacesInjectable from "../../../common/k8s-api/selected
import pageFiltersStoreInjectable from "./page-filters/store.injectable"; import pageFiltersStoreInjectable from "./page-filters/store.injectable";
import type { StorageLayer } from "../../utils/storage-helper"; import type { StorageLayer } from "../../utils/storage-helper";
import autoBindReact from "auto-bind/react"; import autoBindReact from "auto-bind/react";
import type {
GeneralKubeObjectListLayoutColumn
} from "@k8slens/list-layout";
export type SearchFilter<I extends ItemObject> = (item: I) => SingleOrMany<string | number | undefined | null>; export type SearchFilter<I extends ItemObject> = (item: I) => SingleOrMany<string | number | undefined | null>;
export type SearchFilters<I extends ItemObject> = Record<string, SearchFilter<I>>; export type SearchFilters<I extends ItemObject> = Record<string, SearchFilter<I>>;
@ -98,6 +101,7 @@ export type ItemListLayoutProps<Item extends ItemObject, PreLoadStores extends b
headerClassName?: IClassName; headerClassName?: IClassName;
renderHeaderTitle?: RenderHeaderTitle<Item, PreLoadStores>; renderHeaderTitle?: RenderHeaderTitle<Item, PreLoadStores>;
customizeHeader?: HeaderCustomizer | HeaderCustomizer[]; customizeHeader?: HeaderCustomizer | HeaderCustomizer[];
columns?: GeneralKubeObjectListLayoutColumn[];
// items list configuration // items list configuration
isReady?: boolean; // show loading indicator while not ready isReady?: boolean; // show loading indicator while not ready
@ -304,6 +308,7 @@ class NonInjectedItemListLayout<I extends ItemObject, PreLoadStores extends bool
/> />
<ItemListLayoutContent<I, PreLoadStores> <ItemListLayoutContent<I, PreLoadStores>
columns={this.props.columns}
getItems={() => this.items} getItems={() => this.items}
getFilters={() => this.filters} getFilters={() => this.filters}
tableId={this.props.tableId} tableId={this.props.tableId}

View File

@ -31,7 +31,6 @@ import type { ClusterContext } from "../../cluster-frame-context/cluster-frame-c
import type { GeneralKubeObjectListLayoutColumn, SpecificKubeListLayoutColumn } from "@k8slens/list-layout"; import type { GeneralKubeObjectListLayoutColumn, SpecificKubeListLayoutColumn } from "@k8slens/list-layout";
import { kubeObjectListLayoutColumnInjectionToken } from "@k8slens/list-layout"; import { kubeObjectListLayoutColumnInjectionToken } from "@k8slens/list-layout";
import { sortBy } from "lodash"; import { sortBy } from "lodash";
import { TableDataContext } from "@k8slens/table-tokens";
export type KubeItemListStore<K extends KubeObject> = ItemListStore<K, false> & SubscribableStore & { export type KubeItemListStore<K extends KubeObject> = ItemListStore<K, false> & SubscribableStore & {
getByPath: (path: string) => K | undefined; getByPath: (path: string) => K | undefined;
@ -43,7 +42,7 @@ export interface KubeObjectListLayoutProps<
// eslint-disable-next-line unused-imports/no-unused-vars-ts, @typescript-eslint/no-unused-vars // eslint-disable-next-line unused-imports/no-unused-vars-ts, @typescript-eslint/no-unused-vars
A extends KubeApi<K, D>, A extends KubeApi<K, D>,
D extends KubeJsonApiDataFor<K>, D extends KubeJsonApiDataFor<K>,
> extends Omit<ItemListLayoutProps<K, false>, "getItems" | "dependentStores" | "preloadStores"> { > extends Omit<ItemListLayoutProps<K, false>, "getItems" | "dependentStores" | "preloadStores" | "columns"> {
items?: K[]; items?: K[];
getItems?: () => K[]; getItems?: () => K[];
store: KubeItemListStore<K>; store: KubeItemListStore<K>;
@ -187,13 +186,14 @@ class NonInjectedKubeObjectListLayout<
...targetColumns, ...targetColumns,
], (v) => -v.priority).map((col) => col.header); ], (v) => -v.priority).map((col) => col.header);
const itemsListLayout = ( return (
<ItemListLayout<K, false> <ItemListLayout<K, false>
className={cssNames("KubeObjectListLayout", className)} className={cssNames("KubeObjectListLayout", className)}
store={store} store={store}
getItems={() => this.props.items || store.contextItems} getItems={() => this.props.items || store.contextItems}
preloadStores={false} // loading handled in kubeWatchApi.subscribeStores() preloadStores={false} // loading handled in kubeWatchApi.subscribeStores()
detailsItem={this.selectedItem} detailsItem={this.selectedItem}
columns={targetColumns as GeneralKubeObjectListLayoutColumn[]}
customizeHeader={[ customizeHeader={[
({ filters, searchProps, info, ...headerPlaceHolders }) => ({ ({ filters, searchProps, info, ...headerPlaceHolders }) => ({
filters: ( filters: (
@ -234,15 +234,6 @@ class NonInjectedKubeObjectListLayout<
{...layoutProps} {...layoutProps}
/> />
); );
return (
<TableDataContext.Provider
value={{
columns: targetColumns as GeneralKubeObjectListLayoutColumn[],
}}>
{itemsListLayout}
</TableDataContext.Provider>
);
} }
} }

View File

@ -5,7 +5,6 @@ import type {
GeneralKubeObjectListLayoutColumn, GeneralKubeObjectListLayoutColumn,
SpecificKubeListLayoutColumn, SpecificKubeListLayoutColumn,
} from "@k8slens/list-layout"; } from "@k8slens/list-layout";
import React from "react";
type Column = ( type Column = (
| BaseKubeObjectListLayoutColumn<KubeObject> | BaseKubeObjectListLayoutColumn<KubeObject>
@ -20,14 +19,6 @@ export interface TableComponentProps {
load?: (tableId: string) => object; load?: (tableId: string) => object;
} }
export interface TableDataContextValue {
columns?: Column[];
}
export const TableDataContext = React.createContext<TableDataContextValue>({
columns: [],
});
export interface TableComponent { export interface TableComponent {
Component: React.ComponentType<TableComponentProps>; Component: React.ComponentType<TableComponentProps>;
} }

View File

@ -23,7 +23,6 @@
"rimraf": "^4.4.1" "rimraf": "^4.4.1"
}, },
"peerDependencies": { "peerDependencies": {
"@ogre-tools/injectable": "^16.1.0", "@ogre-tools/injectable": "^16.1.0"
"react": "^17.0.2"
} }
} }