From 7a849dedb0f551aed8c708e8f800ca907eab9ca9 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Mon, 15 Nov 2021 09:50:28 -0500 Subject: [PATCH] Switch to failedToLoadMessage as ReactNode and added test Signed-off-by: Sebastian Malton --- src/common/k8s-api/__tests__/crd.test.ts | 32 +++++++++++++++++-- .../+custom-resources/crd-resources.tsx | 21 ++++++------ .../item-object-list/item-list-layout.tsx | 13 ++++++-- 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/common/k8s-api/__tests__/crd.test.ts b/src/common/k8s-api/__tests__/crd.test.ts index 7e4d255d15..0eba45e2cd 100644 --- a/src/common/k8s-api/__tests__/crd.test.ts +++ b/src/common/k8s-api/__tests__/crd.test.ts @@ -51,7 +51,7 @@ describe("Crds", () => { expect(() => crd.getVersion()).toThrowError("Failed to find a version for CustomResourceDefinition foo"); }); - it("should should get the version that is both served and stored", () => { + it("should get the version that is both served and stored", () => { const crd = new CustomResourceDefinition({ apiVersion: "apiextensions.k8s.io/v1", kind: "CustomResourceDefinition", @@ -79,7 +79,35 @@ describe("Crds", () => { expect(crd.getVersion()).toBe("123"); }); - it("should should get the version that is both served and stored even with version field", () => { + it("should get the version that is only stored", () => { + const crd = new CustomResourceDefinition({ + apiVersion: "apiextensions.k8s.io/v1", + kind: "CustomResourceDefinition", + metadata: { + name: "foo", + resourceVersion: "12345", + uid: "12345", + }, + spec: { + versions: [ + { + name: "123", + served: false, + storage: true, + }, + { + name: "1234", + served: false, + storage: false, + }, + ], + }, + }); + + expect(crd.getVersion()).toBe("123"); + }); + + it("should get the version that is both served and stored even with version field", () => { const crd = new CustomResourceDefinition({ apiVersion: "apiextensions.k8s.io/v1", kind: "CustomResourceDefinition", diff --git a/src/renderer/components/+custom-resources/crd-resources.tsx b/src/renderer/components/+custom-resources/crd-resources.tsx index 33ad0d8eec..d0eb4779c7 100644 --- a/src/renderer/components/+custom-resources/crd-resources.tsx +++ b/src/renderer/components/+custom-resources/crd-resources.tsx @@ -78,6 +78,17 @@ export class CrdResources extends React.Component { sortingCallbacks[column.name] = item => jsonPath.value(item, parseJsonPath(column.jsonPath.slice(1))); }); + const version = crd.getPreferedVersion(); + const loadFailedPrefix =

Failed to load {crd.getPluralName()}

; + const failedToLoadMessage = version.served + ? loadFailedPrefix + : ( + <> + {loadFailedPrefix} +

Prefered version ({crd.getGroup()}/{version.name}) is not served

+ + ); + return ( { }), crdInstance.getAge(), ]} - renderFailedToLoadDetails={() => { - if (!crd.getPreferedVersion().served) { - return ( -

Prefered version is not served.

- ); - } - - return undefined; - }} + failedToLoadMessage={failedToLoadMessage} /> ); } 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 438a885020..7e5123c48f 100644 --- a/src/renderer/components/item-object-list/item-list-layout.tsx +++ b/src/renderer/components/item-object-list/item-list-layout.tsx @@ -97,7 +97,13 @@ export interface ItemListLayoutProps { // other customizeRemoveDialog?: (selectedItems: I[]) => Partial; renderFooter?: (parent: ItemListLayout) => React.ReactNode; - renderFailedToLoadDetails?: () => React.ReactNode; + + /** + * Message to display when a store failed to load + * + * @default "Failed to load items" + */ + failedToLoadMessage?: React.ReactNode; filterCallbacks?: ItemsFilters; } @@ -115,7 +121,8 @@ const defaultProps: Partial> = { hasDetailsView: true, onDetails: noop, virtual: true, - customizeTableRowProps: () => ({} as TableRowProps), + customizeTableRowProps: () => ({}), + failedToLoadMessage: "Failed to load items", }; @observer @@ -323,7 +330,7 @@ export class ItemListLayout extends React.ComponentFailed to load items.{this.props.renderFailedToLoadDetails?.()}; + return {this.props.failedToLoadMessage}; } if (!this.isReady) {