diff --git a/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx b/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx index ee17bdaec05..21a5c27d026 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx @@ -207,7 +207,7 @@ const ConsolePluginsTable: React.FC = ({ obj, rows, lo const compare = React.useCallback>( (a, b) => { - const { index, direction } = sortBy; + const { index = 0, direction } = sortBy; const { id } = columns[index]; const desc = direction === SortByDirection.desc; const left = (desc ? b : a)[id]; @@ -256,7 +256,7 @@ const ConsolePluginsTable: React.FC = ({ obj, rows, lo {columns.map(({ id, name, sortable }, columnIndex) => ( - + {name} ))} @@ -343,7 +343,7 @@ const PluginsPage: React.FC = (props) => { .find((i) => i?.pluginName === pluginName); if (loadedPluginInfo) { return { - name: plugin?.metadata?.name, + name: pluginName, version: loadedPluginInfo?.metadata?.version, description: loadedPluginInfo?.metadata?.customProperties?.console?.description, enabled, @@ -352,9 +352,9 @@ const PluginsPage: React.FC = (props) => { }; } return { - name: plugin?.metadata?.name, + name: pluginName, enabled, - status: notLoadedPluginInfo?.status, + status: notLoadedPluginInfo?.status || 'Pending', errorMessage: notLoadedPluginInfo?.status === 'Failed' ? notLoadedPluginInfo?.errorMessage : undefined, errorCause: @@ -416,7 +416,7 @@ export const ConsoleOperatorConfigDetailsPage: React.FC = ({ o pluginName, ]); - return isLoadedDynamicPluginInfo(pluginInfo) ? ( + return pluginInfo && isLoadedDynamicPluginInfo(pluginInfo) ? ( <>{pluginInfo.metadata.customProperties?.console?.description || DASH} ) : ( <>{DASH} diff --git a/frontend/packages/console-app/src/components/console-operator/ConsolePluginEnabledStatusDetail.tsx b/frontend/packages/console-app/src/components/console-operator/ConsolePluginEnabledStatusDetail.tsx index 4dfa01669be..8f537c3025a 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsolePluginEnabledStatusDetail.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsolePluginEnabledStatusDetail.tsx @@ -23,13 +23,13 @@ const ConsolePluginEnabledStatusDetail: React.FC = ({ consoleOperatorConfig?.spec?.plugins, ]); - return consoleOperatorConfigLoaded ? ( + return consoleOperatorConfigLoaded && pluginName ? ( ) : ( diff --git a/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx b/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx index 8ea9a27aae1..b86c4277877 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx @@ -9,10 +9,10 @@ export const ConsolePluginManifestPage: React.FC = ({ obj }) const pluginStore = usePluginStore(); const pluginName = React.useMemo(() => obj?.metadata?.name, [obj?.metadata?.name]); - const pluginManifest = React.useMemo(() => pluginStore.getDynamicPluginManifest(pluginName), [ - pluginStore, - pluginName, - ]); + const pluginManifest = React.useMemo( + () => (pluginName ? pluginStore.getDynamicPluginManifest(pluginName) : undefined), + [pluginStore, pluginName], + ); return ( diff --git a/frontend/packages/console-app/src/components/dashboards-page/OperatorStatus.tsx b/frontend/packages/console-app/src/components/dashboards-page/OperatorStatus.tsx index baa16d9718e..9a94d4e73b5 100644 --- a/frontend/packages/console-app/src/components/dashboards-page/OperatorStatus.tsx +++ b/frontend/packages/console-app/src/components/dashboards-page/OperatorStatus.tsx @@ -11,7 +11,7 @@ const ClusterOperatorStatusRow: React.FC> = ({ diff --git a/frontend/packages/console-app/src/components/dashboards-page/status.ts b/frontend/packages/console-app/src/components/dashboards-page/status.ts index c3e747df7b1..710b6cd0bd8 100644 --- a/frontend/packages/console-app/src/components/dashboards-page/status.ts +++ b/frontend/packages/console-app/src/components/dashboards-page/status.ts @@ -92,9 +92,8 @@ export const getWorstStatus = ( export const getControlPlaneHealth: PrometheusHealthHandler = ( responses, - t, - resource, - infrastructure, + t: TFunction, + infrastructure?, ) => { const componentsHealth = responses.map(({ response, error }) => getControlPlaneComponentHealth(response, error, t), @@ -105,7 +104,7 @@ export const getControlPlaneHealth: PrometheusHealthHandler = ( const worstStatus = getWorstStatus(componentsHealth, t); const singleMasterMsg = - worstStatus.state === HealthState.OK && isSingleNode(infrastructure) + worstStatus.state === HealthState.OK && infrastructure && isSingleNode(infrastructure) ? t('console-app~Single control plane node') : undefined; @@ -117,7 +116,7 @@ export const getControlPlaneHealth: PrometheusHealthHandler = ( ? worstStatus.count === 4 ? worstStatus.message : `${pluralize(worstStatus.count, 'component')} ${worstStatus.message.toLowerCase()}` - : null), + : undefined), }; }; diff --git a/frontend/packages/console-app/src/components/detect-namespace/__tests__/checkNamespaceExists.spec.ts b/frontend/packages/console-app/src/components/detect-namespace/__tests__/checkNamespaceExists.spec.ts index 22984f9ecb4..1bc768107d2 100644 --- a/frontend/packages/console-app/src/components/detect-namespace/__tests__/checkNamespaceExists.spec.ts +++ b/frontend/packages/console-app/src/components/detect-namespace/__tests__/checkNamespaceExists.spec.ts @@ -17,7 +17,7 @@ describe('getValueForNamespace', () => { it('should return false if namespace is not defined', async () => { k8sGetMock.mockReturnValueOnce(Promise.resolve()); - const exists = await checkNamespaceExists(null, true); + const exists = await checkNamespaceExists('', true); expect(exists).toBeFalsy(); }); diff --git a/frontend/packages/console-app/src/components/detect-namespace/__tests__/getValueForNamespace.spec.ts b/frontend/packages/console-app/src/components/detect-namespace/__tests__/getValueForNamespace.spec.ts index eb7c53dd8e6..6dc2c6002c3 100644 --- a/frontend/packages/console-app/src/components/detect-namespace/__tests__/getValueForNamespace.spec.ts +++ b/frontend/packages/console-app/src/components/detect-namespace/__tests__/getValueForNamespace.spec.ts @@ -34,7 +34,12 @@ describe('getValueForNamespace', () => { checkNamespaceExistsMock .mockReturnValueOnce(Promise.resolve(false)) .mockReturnValueOnce(Promise.resolve(true)); - const namespace = await getValueForNamespace(preferredNamespace, lastNamespace, true); + const namespace = await getValueForNamespace( + preferredNamespace, + lastNamespace, + true, + activeNamespace, + ); expect(namespace).toEqual(preferredNamespace); }); @@ -45,7 +50,12 @@ describe('getValueForNamespace', () => { .mockReturnValueOnce(Promise.resolve(false)) .mockReturnValueOnce(Promise.resolve(true)); - const namespace = await getValueForNamespace(preferredNamespace, lastNamespace, true); + const namespace = await getValueForNamespace( + preferredNamespace, + lastNamespace, + true, + activeNamespace, + ); expect(namespace).toEqual(lastNamespace); }); @@ -56,7 +66,12 @@ describe('getValueForNamespace', () => { .mockReturnValueOnce(Promise.resolve(false)) .mockReturnValueOnce(Promise.resolve(false)); - const namespace = await getValueForNamespace(preferredNamespace, lastNamespace, true); + const namespace = await getValueForNamespace( + preferredNamespace, + lastNamespace, + true, + activeNamespace, + ); expect(namespace).toEqual(ALL_NAMESPACES_KEY); }); diff --git a/frontend/packages/console-app/src/components/detect-namespace/getValueForNamespace.ts b/frontend/packages/console-app/src/components/detect-namespace/getValueForNamespace.ts index 54f520bbe32..1e4dd393b94 100644 --- a/frontend/packages/console-app/src/components/detect-namespace/getValueForNamespace.ts +++ b/frontend/packages/console-app/src/components/detect-namespace/getValueForNamespace.ts @@ -7,7 +7,7 @@ export const getValueForNamespace = async ( useProjects: boolean, activeNamespace?: string, ): Promise => { - if (await checkNamespaceExists(activeNamespace, useProjects)) { + if (activeNamespace && (await checkNamespaceExists(activeNamespace, useProjects))) { return activeNamespace; } if (await checkNamespaceExists(preferredNamespace, useProjects)) { diff --git a/frontend/packages/console-plugin-sdk/src/store.ts b/frontend/packages/console-plugin-sdk/src/store.ts index d90b757d297..79437cf8d53 100644 --- a/frontend/packages/console-plugin-sdk/src/store.ts +++ b/frontend/packages/console-plugin-sdk/src/store.ts @@ -24,12 +24,13 @@ export const augmentExtension = ( }); export const isExtensionInUse = (e: Extension, flags: FlagsObject): boolean => - e.flags.required.every((f) => flags[f]) && e.flags.disallowed.every((f) => !flags[f]); + (e.flags?.required?.every((f) => flags[f]) ?? true) && + (e.flags?.disallowed?.every((f) => !flags[f]) ?? true); export const getGatingFlagNames = (extensions: Extension[]): string[] => _.uniq([ - ..._.flatMap(extensions.map((e) => e.flags.required)), - ..._.flatMap(extensions.map((e) => e.flags.disallowed)), + ..._.flatMap(extensions.map((e) => e.flags?.required ?? [])), + ..._.flatMap(extensions.map((e) => e.flags?.disallowed ?? [])), ]); export const isLoadedDynamicPluginInfo = (i: DynamicPluginInfo): i is LoadedDynamicPluginInfo => @@ -203,7 +204,7 @@ export class PluginStore { const plugin = this.loadedDynamicPlugins.get(pluginID); - if (plugin.enabled !== enabled) { + if (plugin && plugin.enabled !== enabled) { plugin.enabled = enabled; this.updateExtensions(); @@ -306,7 +307,7 @@ export class PluginStore { return [...loadedPluginEntries, ...failedPluginEntries, ...pendingPluginEntries]; } - findDynamicPluginInfo(pluginName: string): DynamicPluginInfo { + findDynamicPluginInfo(pluginName?: string): DynamicPluginInfo | undefined { return this.getDynamicPluginInfo().find((entry) => isLoadedDynamicPluginInfo(entry) ? entry.metadata.name === pluginName @@ -314,7 +315,7 @@ export class PluginStore { ); } - getDynamicPluginManifest(pluginName: string): DynamicPluginManifest { + getDynamicPluginManifest(pluginName: string): DynamicPluginManifest | undefined { return this.getLoadedDynamicPlugin(pluginName)?.manifest; }