mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Table component injection tokens (#7754)
Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>
This commit is contained in:
parent
4b63bc238e
commit
1ffdb6c89f
@ -9,7 +9,8 @@ import {
|
|||||||
rendererExtensionApi as Renderer,
|
rendererExtensionApi as Renderer,
|
||||||
commonExtensionApi as Common,
|
commonExtensionApi as Common,
|
||||||
registerLensCore,
|
registerLensCore,
|
||||||
metricsFeature
|
metricsFeature,
|
||||||
|
tableFeature,
|
||||||
} from "@k8slens/core/renderer";
|
} from "@k8slens/core/renderer";
|
||||||
import { autoRegister } from "@ogre-tools/injectable-extension-for-auto-registration";
|
import { autoRegister } from "@ogre-tools/injectable-extension-for-auto-registration";
|
||||||
import { registerFeature } from "@k8slens/feature-core";
|
import { registerFeature } from "@k8slens/feature-core";
|
||||||
@ -49,7 +50,8 @@ runInAction(() => {
|
|||||||
keyboardShortcutsFeature,
|
keyboardShortcutsFeature,
|
||||||
reactApplicationFeature,
|
reactApplicationFeature,
|
||||||
routingFeature,
|
routingFeature,
|
||||||
metricsFeature
|
metricsFeature,
|
||||||
|
tableFeature,
|
||||||
);
|
);
|
||||||
|
|
||||||
autoRegister({
|
autoRegister({
|
||||||
|
|||||||
18
package-lock.json
generated
18
package-lock.json
generated
@ -3833,6 +3833,10 @@
|
|||||||
"resolved": "packages/utility-features/startable-stoppable",
|
"resolved": "packages/utility-features/startable-stoppable",
|
||||||
"link": true
|
"link": true
|
||||||
},
|
},
|
||||||
|
"node_modules/@k8slens/table-tokens": {
|
||||||
|
"resolved": "packages/table",
|
||||||
|
"link": true
|
||||||
|
},
|
||||||
"node_modules/@k8slens/test-utils": {
|
"node_modules/@k8slens/test-utils": {
|
||||||
"resolved": "packages/utility-features/test-utils",
|
"resolved": "packages/utility-features/test-utils",
|
||||||
"link": true
|
"link": true
|
||||||
@ -34324,6 +34328,7 @@
|
|||||||
"@k8slens/routing": "^1.0.0-alpha.5",
|
"@k8slens/routing": "^1.0.0-alpha.5",
|
||||||
"@k8slens/run-many": "^1.0.0-alpha.1",
|
"@k8slens/run-many": "^1.0.0-alpha.1",
|
||||||
"@k8slens/startable-stoppable": "^1.0.0-alpha.1",
|
"@k8slens/startable-stoppable": "^1.0.0-alpha.1",
|
||||||
|
"@k8slens/table-tokens": "^6.5.0-alpha.7",
|
||||||
"@k8slens/tooltip": "^1.0.0-alpha.5",
|
"@k8slens/tooltip": "^1.0.0-alpha.5",
|
||||||
"@k8slens/utilities": "^1.0.0-alpha.1",
|
"@k8slens/utilities": "^1.0.0-alpha.1",
|
||||||
"@kubernetes/client-node": "^0.18.1",
|
"@kubernetes/client-node": "^0.18.1",
|
||||||
@ -35304,6 +35309,19 @@
|
|||||||
"rimraf": "^4.4.1"
|
"rimraf": "^4.4.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"packages/table": {
|
||||||
|
"name": "@k8slens/table-tokens",
|
||||||
|
"version": "6.5.0-alpha.7",
|
||||||
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"@k8slens/webpack": "^6.5.0-alpha.8",
|
||||||
|
"rimraf": "^4.4.1"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@ogre-tools/injectable": "^16.1.0",
|
||||||
|
"react": "^17.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"packages/technical-features/application/agnostic": {
|
"packages/technical-features/application/agnostic": {
|
||||||
"name": "@k8slens/application",
|
"name": "@k8slens/application",
|
||||||
"version": "6.5.0-alpha.9",
|
"version": "6.5.0-alpha.9",
|
||||||
|
|||||||
@ -230,6 +230,7 @@
|
|||||||
"@k8slens/routing": "^1.0.0-alpha.5",
|
"@k8slens/routing": "^1.0.0-alpha.5",
|
||||||
"@k8slens/run-many": "^1.0.0-alpha.1",
|
"@k8slens/run-many": "^1.0.0-alpha.1",
|
||||||
"@k8slens/startable-stoppable": "^1.0.0-alpha.1",
|
"@k8slens/startable-stoppable": "^1.0.0-alpha.1",
|
||||||
|
"@k8slens/table-tokens": "^6.5.0-alpha.7",
|
||||||
"@k8slens/tooltip": "^1.0.0-alpha.5",
|
"@k8slens/tooltip": "^1.0.0-alpha.5",
|
||||||
"@k8slens/utilities": "^1.0.0-alpha.1",
|
"@k8slens/utilities": "^1.0.0-alpha.1",
|
||||||
"@kubernetes/client-node": "^0.18.1",
|
"@kubernetes/client-node": "^0.18.1",
|
||||||
|
|||||||
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import { tableComponentInjectionToken } from "@k8slens/table-tokens";
|
||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import { Table } from "../../renderer/components/table/table";
|
||||||
|
|
||||||
|
const tableComponentInjectable = getInjectable({
|
||||||
|
id: "table-component",
|
||||||
|
instantiate: () => ({ Component: Table }),
|
||||||
|
injectionToken: tableComponentInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default tableComponentInjectable;
|
||||||
14
packages/core/src/features/table/table-feature.ts
Normal file
14
packages/core/src/features/table/table-feature.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import { getFeature } from "@k8slens/feature-core";
|
||||||
|
import tableComponentInjectable from "./table-component.injectable";
|
||||||
|
|
||||||
|
export const tableFeature = getFeature({
|
||||||
|
id: "core-table-feature",
|
||||||
|
|
||||||
|
register: (di) => {
|
||||||
|
di.register(tableComponentInjectable);
|
||||||
|
},
|
||||||
|
});
|
||||||
@ -18,6 +18,9 @@ import { Cluster } from "../../../../common/cluster/cluster";
|
|||||||
import hostedClusterInjectable from "../../../cluster-frame-context/hosted-cluster.injectable";
|
import hostedClusterInjectable from "../../../cluster-frame-context/hosted-cluster.injectable";
|
||||||
import userPreferencesStateInjectable from "../../../../features/user-preferences/common/state.injectable";
|
import userPreferencesStateInjectable from "../../../../features/user-preferences/common/state.injectable";
|
||||||
import type { DiContainer } from "@ogre-tools/injectable";
|
import type { DiContainer } from "@ogre-tools/injectable";
|
||||||
|
import { registerFeature } from "@k8slens/feature-core";
|
||||||
|
import { runInAction } from "mobx";
|
||||||
|
import { tableFeature } from "../../../library";
|
||||||
|
|
||||||
describe("<PodDisruptionBudgets />", () => {
|
describe("<PodDisruptionBudgets />", () => {
|
||||||
let di: DiContainer;
|
let di: DiContainer;
|
||||||
@ -69,6 +72,10 @@ describe("<PodDisruptionBudgets />", () => {
|
|||||||
}),
|
}),
|
||||||
} as any,
|
} as any,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
runInAction(() => {
|
||||||
|
registerFeature(di, tableFeature);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("PDB with minAvailable 0", () => {
|
describe("PDB with minAvailable 0", () => {
|
||||||
|
|||||||
@ -11,14 +11,14 @@ import { computed, makeObservable } from "mobx";
|
|||||||
import { Observer, observer } from "mobx-react";
|
import { Observer, observer } from "mobx-react";
|
||||||
import type { ConfirmDialogParams } from "../confirm-dialog";
|
import type { ConfirmDialogParams } from "../confirm-dialog";
|
||||||
import type { TableProps, TableRowProps, TableSortCallbacks } from "../table";
|
import type { TableProps, TableRowProps, TableSortCallbacks } from "../table";
|
||||||
import { Table, TableCell, TableHead, TableRow } from "../table";
|
import { TableCell, TableHead, TableRow } from "../table";
|
||||||
import type { IClassName, StrictReactNode } from "@k8slens/utilities";
|
import type { IClassName, StrictReactNode } from "@k8slens/utilities";
|
||||||
import { cssNames, isDefined, isReactNode, noop, prevDefault, stopPropagation } from "@k8slens/utilities";
|
import { cssNames, isDefined, isReactNode, noop, prevDefault, stopPropagation } from "@k8slens/utilities";
|
||||||
import type { AddRemoveButtonsProps } from "../add-remove-buttons";
|
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,6 +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 } 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[];
|
||||||
@ -54,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;
|
||||||
@ -79,6 +82,7 @@ interface Dependencies {
|
|||||||
openConfirmDialog: OpenConfirmDialog;
|
openConfirmDialog: OpenConfirmDialog;
|
||||||
toggleTableColumnVisibility: ToggleTableColumnVisibility;
|
toggleTableColumnVisibility: ToggleTableColumnVisibility;
|
||||||
isTableColumnHidden: IsTableColumnHidden;
|
isTableColumnHidden: IsTableColumnHidden;
|
||||||
|
table: TableComponent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@observer
|
@observer
|
||||||
@ -299,6 +303,7 @@ class NonInjectedItemListLayoutContent<
|
|||||||
const {
|
const {
|
||||||
store, hasDetailsView, addRemoveButtons = {}, virtual, sortingCallbacks,
|
store, hasDetailsView, addRemoveButtons = {}, virtual, sortingCallbacks,
|
||||||
detailsItem, className, tableProps = {}, tableId, getItems, activeTheme,
|
detailsItem, className, tableProps = {}, tableId, getItems, activeTheme,
|
||||||
|
table,
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const selectedItemId = detailsItem && detailsItem.getId();
|
const selectedItemId = detailsItem && detailsItem.getId();
|
||||||
const classNames = cssNames(className, "box", "grow", activeTheme.get().type);
|
const classNames = cssNames(className, "box", "grow", activeTheme.get().type);
|
||||||
@ -307,8 +312,9 @@ class NonInjectedItemListLayoutContent<
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="items box grow flex column">
|
<div className="items box grow flex column">
|
||||||
<Table
|
<table.Component
|
||||||
tableId={tableId}
|
tableId={tableId}
|
||||||
|
columns={this.props.columns}
|
||||||
virtual={virtual}
|
virtual={virtual}
|
||||||
selectable={hasDetailsView}
|
selectable={hasDetailsView}
|
||||||
sortable={sortingCallbacks}
|
sortable={sortingCallbacks}
|
||||||
@ -322,7 +328,7 @@ class NonInjectedItemListLayoutContent<
|
|||||||
>
|
>
|
||||||
{this.renderTableHeader()}
|
{this.renderTableHeader()}
|
||||||
{this.renderItems()}
|
{this.renderItems()}
|
||||||
</Table>
|
</table.Component>
|
||||||
|
|
||||||
<Observer>
|
<Observer>
|
||||||
{() => (
|
{() => (
|
||||||
@ -385,5 +391,6 @@ export const ItemListLayoutContent = withInjectables<Dependencies, ItemListLayou
|
|||||||
openConfirmDialog: di.inject(openConfirmDialogInjectable),
|
openConfirmDialog: di.inject(openConfirmDialogInjectable),
|
||||||
toggleTableColumnVisibility: di.inject(toggleTableColumnVisibilityInjectable),
|
toggleTableColumnVisibility: di.inject(toggleTableColumnVisibilityInjectable),
|
||||||
isTableColumnHidden: di.inject(isTableColumnHiddenInjectable),
|
isTableColumnHidden: di.inject(isTableColumnHiddenInjectable),
|
||||||
|
table: di.inject(tableComponentInjectionToken),
|
||||||
}),
|
}),
|
||||||
}) as <Item extends ItemObject, PreLoadStores extends boolean>(props: ItemListLayoutContentProps<Item, PreLoadStores>) => React.ReactElement;
|
}) as <Item extends ItemObject, PreLoadStores extends boolean>(props: ItemListLayoutContentProps<Item, PreLoadStores>) => React.ReactElement;
|
||||||
|
|||||||
@ -13,7 +13,9 @@ import type { TableProps, TableRowProps, TableSortCallbacks } from "../table";
|
|||||||
import type { IClassName, StrictReactNode, SingleOrMany } from "@k8slens/utilities";
|
import type { IClassName, StrictReactNode, SingleOrMany } from "@k8slens/utilities";
|
||||||
import { cssNames, noop } from "@k8slens/utilities";
|
import { cssNames, noop } from "@k8slens/utilities";
|
||||||
import type { AddRemoveButtonsProps } from "../add-remove-buttons";
|
import type { AddRemoveButtonsProps } from "../add-remove-buttons";
|
||||||
import type { ItemObject, TableCellProps } from "@k8slens/list-layout";
|
import type { ItemObject, TableCellProps,
|
||||||
|
GeneralKubeObjectListLayoutColumn,
|
||||||
|
} from "@k8slens/list-layout";
|
||||||
import type { SearchInputUrlProps } from "../input";
|
import type { SearchInputUrlProps } from "../input";
|
||||||
import type { PageFiltersStore } from "./page-filters/store";
|
import type { PageFiltersStore } from "./page-filters/store";
|
||||||
import { FilterType } from "./page-filters/store";
|
import { FilterType } from "./page-filters/store";
|
||||||
@ -98,6 +100,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 +307,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}
|
||||||
|
|||||||
@ -23,6 +23,9 @@ import type { PodStore } from "../workloads-pods/store";
|
|||||||
import { Cluster } from "../../../common/cluster/cluster";
|
import { Cluster } from "../../../common/cluster/cluster";
|
||||||
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 { podListLayoutColumnInjectionToken } from "@k8slens/list-layout";
|
import { podListLayoutColumnInjectionToken } from "@k8slens/list-layout";
|
||||||
|
import { registerFeature } from "@k8slens/feature-core";
|
||||||
|
import { runInAction } from "mobx";
|
||||||
|
import { tableFeature } from "../../library";
|
||||||
|
|
||||||
describe("kube-object-list-layout", () => {
|
describe("kube-object-list-layout", () => {
|
||||||
let di: DiContainer;
|
let di: DiContainer;
|
||||||
@ -54,6 +57,10 @@ describe("kube-object-list-layout", () => {
|
|||||||
get: () => ({}),
|
get: () => ({}),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
runInAction(() => {
|
||||||
|
registerFeature(di, tableFeature);
|
||||||
|
});
|
||||||
|
|
||||||
podStore = di.inject(podStoreInjectable);
|
podStore = di.inject(podStoreInjectable);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -42,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>;
|
||||||
@ -193,6 +193,7 @@ class NonInjectedKubeObjectListLayout<
|
|||||||
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: (
|
||||||
|
|||||||
@ -72,6 +72,7 @@ import { sendMessageToChannelInjectionToken } from "@k8slens/messaging";
|
|||||||
import { getMessageBridgeFake } from "@k8slens/messaging-fake-bridge";
|
import { getMessageBridgeFake } from "@k8slens/messaging-fake-bridge";
|
||||||
import { historyInjectionToken } from "@k8slens/routing";
|
import { historyInjectionToken } from "@k8slens/routing";
|
||||||
import writeJsonSyncInjectable from "../../../common/fs/write-json-sync.injectable";
|
import writeJsonSyncInjectable from "../../../common/fs/write-json-sync.injectable";
|
||||||
|
import { tableFeature } from "../../library";
|
||||||
|
|
||||||
type MainDiCallback = (container: { mainDi: DiContainer }) => void | Promise<void>;
|
type MainDiCallback = (container: { mainDi: DiContainer }) => void | Promise<void>;
|
||||||
type WindowDiCallback = (container: { windowDi: DiContainer }) => void | Promise<void>;
|
type WindowDiCallback = (container: { windowDi: DiContainer }) => void | Promise<void>;
|
||||||
@ -256,6 +257,7 @@ export const getApplicationBuilder = () => {
|
|||||||
registerFeature(
|
registerFeature(
|
||||||
windowDi,
|
windowDi,
|
||||||
applicationFeature,
|
applicationFeature,
|
||||||
|
tableFeature,
|
||||||
);
|
);
|
||||||
|
|
||||||
windowDi.register(rendererExtensionsStateInjectable);
|
windowDi.register(rendererExtensionsStateInjectable);
|
||||||
|
|||||||
@ -22,3 +22,4 @@ export * as ReactRouterDom from "react-router-dom";
|
|||||||
export * as rendererExtensionApi from "../extensions/renderer-api";
|
export * as rendererExtensionApi from "../extensions/renderer-api";
|
||||||
export * as commonExtensionApi from "../extensions/common-api";
|
export * as commonExtensionApi from "../extensions/common-api";
|
||||||
export { metricsFeature } from "../features/metrics/metrics-feature";
|
export { metricsFeature } from "../features/metrics/metrics-feature";
|
||||||
|
export { tableFeature } from "../features/table/table-feature";
|
||||||
|
|||||||
@ -63,7 +63,10 @@ export const logSillyInjectionToken = getInjectionToken<LogFunction>({
|
|||||||
|
|
||||||
const screamingKebabCase = (str: string) => pipeline(str, kebabCase, toUpper);
|
const screamingKebabCase = (str: string) => pipeline(str, kebabCase, toUpper);
|
||||||
|
|
||||||
const getLogFunctionFor = (scenario: keyof Logger, namespace: string | undefined) => {
|
const getLogFunctionFor = (
|
||||||
|
scenario: keyof Logger,
|
||||||
|
namespace: string | undefined
|
||||||
|
) => {
|
||||||
const prefix = namespace
|
const prefix = namespace
|
||||||
? `[${screamingKebabCase(namespace.replace(/-feature$/, ""))}]: `
|
? `[${screamingKebabCase(namespace.replace(/-feature$/, ""))}]: `
|
||||||
: "";
|
: "";
|
||||||
|
|||||||
@ -90,7 +90,6 @@ describe("logger", () => {
|
|||||||
instantiate: (di) => di.inject(injectionToken),
|
instantiate: (di) => di.inject(injectionToken),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
const someFeature = getFeature({
|
const someFeature = getFeature({
|
||||||
id: "some-feature",
|
id: "some-feature",
|
||||||
|
|
||||||
@ -124,11 +123,13 @@ describe("logger", () => {
|
|||||||
|
|
||||||
registerFeature(di, loggerFeature);
|
registerFeature(di, loggerFeature);
|
||||||
|
|
||||||
di.register(getInjectable({
|
di.register(
|
||||||
|
getInjectable({
|
||||||
id: "some-transport",
|
id: "some-transport",
|
||||||
instantiate: () => new TransportStream({ log }),
|
instantiate: () => new TransportStream({ log }),
|
||||||
injectionToken: loggerTransportInjectionToken,
|
injectionToken: loggerTransportInjectionToken,
|
||||||
}))
|
})
|
||||||
|
);
|
||||||
|
|
||||||
const logger = di.inject(loggerInjectable);
|
const logger = di.inject(loggerInjectable);
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,8 @@
|
|||||||
import { getInjectionToken } from "@ogre-tools/injectable";
|
import { getInjectionToken } from "@ogre-tools/injectable";
|
||||||
import type TransportStream from "winston-transport";
|
import type TransportStream from "winston-transport";
|
||||||
|
|
||||||
export const loggerTransportInjectionToken = getInjectionToken<TransportStream>({
|
export const loggerTransportInjectionToken = getInjectionToken<TransportStream>(
|
||||||
|
{
|
||||||
id: "logger-transport",
|
id: "logger-transport",
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|||||||
3
packages/table/README.md
Normal file
3
packages/table/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Description
|
||||||
|
|
||||||
|
The package exports tokens needed for external table configuration.
|
||||||
28
packages/table/index.ts
Normal file
28
packages/table/index.ts
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import { getInjectionToken } from "@ogre-tools/injectable";
|
||||||
|
import type { KubeObject } from "@k8slens/kube-object/src/kube-object";
|
||||||
|
import type {
|
||||||
|
BaseKubeObjectListLayoutColumn,
|
||||||
|
GeneralKubeObjectListLayoutColumn,
|
||||||
|
SpecificKubeListLayoutColumn,
|
||||||
|
} from "@k8slens/list-layout";
|
||||||
|
|
||||||
|
type Column = (
|
||||||
|
| BaseKubeObjectListLayoutColumn<KubeObject>
|
||||||
|
| SpecificKubeListLayoutColumn<KubeObject>
|
||||||
|
| GeneralKubeObjectListLayoutColumn
|
||||||
|
);
|
||||||
|
|
||||||
|
export interface TableComponentProps {
|
||||||
|
tableId?: string;
|
||||||
|
columns?: Column[];
|
||||||
|
save?: (state: object) => void;
|
||||||
|
load?: (tableId: string) => object;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TableComponent {
|
||||||
|
Component: React.ComponentType<TableComponentProps>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const tableComponentInjectionToken = getInjectionToken<TableComponent>({
|
||||||
|
id: "table-component-injection-token",
|
||||||
|
});
|
||||||
28
packages/table/package.json
Normal file
28
packages/table/package.json
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"name": "@k8slens/table-tokens",
|
||||||
|
"version": "6.5.0-alpha.7",
|
||||||
|
"description": "Injection token exporter for table components",
|
||||||
|
"license": "MIT",
|
||||||
|
"type": "commonjs",
|
||||||
|
"private": false,
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public",
|
||||||
|
"registry": "https://registry.npmjs.org/"
|
||||||
|
},
|
||||||
|
"main": "./dist/index.js",
|
||||||
|
"types": "./dist/index.d.ts",
|
||||||
|
"files": [
|
||||||
|
"dist"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"clean": "rimraf dist/",
|
||||||
|
"build": "lens-webpack-build"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@k8slens/webpack": "^6.5.0-alpha.8",
|
||||||
|
"rimraf": "^4.4.1"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@ogre-tools/injectable": "^16.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
4
packages/table/tsconfig.json
Normal file
4
packages/table/tsconfig.json
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"extends": "@k8slens/typescript/config/base.json",
|
||||||
|
"include": ["**/*.ts"]
|
||||||
|
}
|
||||||
1
packages/table/webpack.config.js
Normal file
1
packages/table/webpack.config.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
module.exports = require("@k8slens/webpack").configForNode;
|
||||||
Loading…
Reference in New Issue
Block a user