Skip to content

Commit a2ecf11

Browse files
authored
fix: Console errors in busola (#4204)
* fix: console errors * fix: container logs * fix: duplicate keys * fix: test issues * fix: correctly set initialResource * fix: test flakiness * fix: test flakiness
1 parent 139e722 commit a2ecf11

38 files changed

+222
-179
lines changed

src/command-pallette/CommandPalletteUI/components/components.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ export function CommandPalletteHelp({
110110
</Title>
111111
<br className="help-divider" />
112112
<div className="help-text">
113-
{helpEntries.navigation.map(({ name, aliases }) => (
114-
<div key={name}>
113+
{helpEntries.navigation.map(({ name, aliases }, idx) => (
114+
<div key={`${name}-${idx}`}>
115115
<p className="help-text__name">{name}</p>
116116
<pre className="key">
117117
{aliases?.join(', ') || EMPTY_TEXT_PLACEHOLDER}

src/components/App/ExtensibilityRoutes.jsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { Suspense } from 'react';
22
import pluralize from 'pluralize';
33
import i18next from 'i18next';
4-
import { Route, useParams } from 'react-router';
4+
import { Route, useParams, useSearchParams } from 'react-router';
55
import { useAtomValue } from 'jotai';
66
import { FlexibleColumnLayout } from '@ui5/webcomponents-react';
77
import { useTranslation } from 'react-i18next';
@@ -27,7 +27,12 @@ const ColumnWrapper = ({ resourceType, extension, urlPath }) => {
2727

2828
const { t } = useTranslation();
2929

30-
const { namespaceId, resourceName } = useParams();
30+
const { namespaceId: rawNamespaceId, resourceName } = useParams();
31+
const [searchParams] = useSearchParams();
32+
const namespaceId =
33+
rawNamespaceId === '-all-'
34+
? searchParams.get('resourceNamespace')
35+
: rawNamespaceId;
3136

3237
const defaultColumn = resourceName ? 'details' : 'list';
3338

@@ -127,7 +132,7 @@ const ColumnWrapper = ({ resourceType, extension, urlPath }) => {
127132
);
128133
};
129134

130-
export const createExtensibilityRoutes = (extension, language, ...props) => {
135+
export const createExtensibilityRoutes = (extension, language) => {
131136
const urlPath =
132137
extension?.general?.urlPath ||
133138
pluralize(extension?.general?.resource?.kind?.toLowerCase() || '');

src/components/BusolaExtensions/BusolaExtensionDetails.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export function BusolaExtensionDetails({ name, namespace }) {
4343
const updateResourceMutation = useUpdate(resourceUrl);
4444
const notification = useNotification();
4545

46-
if (!name) {
46+
if (!name || !namespace) {
4747
return null;
4848
}
4949

src/components/CustomResources/CustomResources.jsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ export function CustomResources({
2222
const name = names.plural;
2323
const customUrl = useCustomResourceUrl(crd);
2424
const { namespace } = useUrl();
25+
26+
if (!group || !version.name) {
27+
return null;
28+
}
29+
2530
const resourceUrl =
2631
namespace && namespace !== '-all-'
2732
? `/apis/${group}/${version.name}/namespaces/${namespace}/${name}`

src/components/Extensibility/ExtensibilityCreate.jsx

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import { useCallback, useMemo, useState, useContext, useEffect } from 'react';
1+
import {
2+
useCallback,
3+
useMemo,
4+
useState,
5+
useContext,
6+
useEffect,
7+
useRef,
8+
} from 'react';
29
import { fromJS } from 'immutable';
310
import pluralize from 'pluralize';
411
import { useTranslation } from 'react-i18next';
@@ -22,7 +29,7 @@ import {
2229
} from './helpers/immutableConverter';
2330
import { useVariables } from './hooks/useVariables';
2431
import { prepareRules } from './helpers/prepareRules';
25-
import { merge } from 'lodash';
32+
import { cloneDeep, merge } from 'lodash';
2633

2734
import { TriggerContext, TriggerContextProvider } from './contexts/Trigger';
2835
import { useAtomValue } from 'jotai';
@@ -69,6 +76,7 @@ export function ExtensibilityCreateCore({
6976
const [initialResource, setInitialResource] = useState(
7077
initialExtensibilityResource,
7178
);
79+
const hasSetInitialResource = useRef(false);
7280

7381
useEffect(() => {
7482
if (layoutState?.showEdit?.resource) return;
@@ -85,9 +93,24 @@ export function ExtensibilityCreateCore({
8593
const presets = usePreparePresets(createResource?.presets, emptyTemplate);
8694
const resource = useMemo(() => getResourceObjFromUIStore(store), [store]);
8795

96+
useEffect(() => {
97+
if (
98+
!initialResource &&
99+
!initialExtensibilityResource &&
100+
!hasSetInitialResource.current &&
101+
resource
102+
) {
103+
const excludedResource = cloneDeep(resource);
104+
delete excludedResource.status;
105+
delete excludedResource.metadata;
106+
setInitialResource(excludedResource);
107+
hasSetInitialResource.current = true;
108+
}
109+
}, [initialExtensibilityResource, initialResource, resource]);
110+
88111
const isEdit = useMemo(
89112
() =>
90-
!!initialResource?.metadata?.name && !!!layoutState?.showCreate?.resource,
113+
!!initialResource?.metadata?.name && !layoutState?.showCreate?.resource,
91114
[initialResource, layoutState?.showCreate?.resource],
92115
);
93116

src/components/Extensibility/ExtensibilityWizard.jsx

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,10 @@ function FormContainer({ children }) {
5353
const FormStack = injectPluginStack(FormContainer);
5454

5555
export function ExtensibilityWizardCore({
56-
formElementRef,
57-
setCustomValid,
58-
resourceType,
59-
resourceUrl,
6056
resource: initialResource,
6157
resourceSchema,
62-
toggleFormFn,
63-
resourceName,
6458
onCancel,
6559
disableOnEdit = false,
66-
...props
6760
}) {
6861
const { prepareVars, setVar } = useVariables();
6962
const { t } = useTranslation();

src/components/Extensibility/components/ConditionList.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export const ConditionList = ({
3434
value.map(async (v) => {
3535
const override = structure?.highlights?.find((o) => o.type === v.type);
3636
const customContentPromise = await Promise.all(
37-
structure?.customContent?.map(async (c) => {
37+
(structure?.customContent || []).map(async (c) => {
3838
return {
3939
...c,
4040
value:

src/components/HelmReleases/HelmReleasesDetails.jsx

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { decodeHelmRelease } from './decodeHelmRelease';
1616
import { EventsList } from 'shared/components/EventsList';
1717
import { filterByResource } from 'hooks/useMessageList';
1818

19-
function HelmReleasesDetails({ releaseName, namespace }) {
19+
export default function HelmReleasesDetails({ releaseName, namespace }) {
2020
const { t } = useTranslation();
2121

2222
const resourceUrl =
@@ -82,39 +82,35 @@ function HelmReleasesDetails({ releaseName, namespace }) {
8282
);
8383

8484
return (
85-
<>
86-
<ResourceDetails
87-
description={ResourceDescription}
88-
resourceType="HelmReleases"
89-
namespace={namespace}
90-
resourceName={releaseName}
91-
customTitle={releaseName}
92-
resourceUrl={resourceUrl}
93-
resource={releaseSecret}
94-
customStatusColumns={customStatusColumns}
95-
statusBadge={statusBadge}
96-
createResourceForm={() => (
97-
<ResourceCreate
98-
title={'HelmRelease'}
99-
isEdit={true}
100-
confirmText={t('common.buttons.save')}
101-
disableEdit={true}
102-
renderForm={(props) => (
103-
<ErrorBoundary>
104-
<HelmReleasesYaml
105-
resource={releaseSecret}
106-
editMode={true}
107-
{...props}
108-
/>
109-
</ErrorBoundary>
110-
)}
111-
/>
112-
)}
113-
customComponents={customComponents}
114-
disableDelete
115-
/>
116-
</>
85+
<ResourceDetails
86+
description={ResourceDescription}
87+
resourceType="HelmReleases"
88+
namespace={namespace}
89+
resourceName={releaseName}
90+
customTitle={releaseName}
91+
resourceUrl={resourceUrl}
92+
resource={releaseSecret}
93+
customStatusColumns={customStatusColumns}
94+
statusBadge={statusBadge}
95+
createResourceForm={() => (
96+
<ResourceCreate
97+
title={'HelmRelease'}
98+
isEdit={true}
99+
confirmText={t('common.buttons.save')}
100+
disableEdit={true}
101+
renderForm={(props) => (
102+
<ErrorBoundary>
103+
<HelmReleasesYaml
104+
resource={releaseSecret}
105+
editMode={true}
106+
{...props}
107+
/>
108+
</ErrorBoundary>
109+
)}
110+
/>
111+
)}
112+
customComponents={customComponents}
113+
disableDelete
114+
/>
117115
);
118116
}
119-
120-
export default HelmReleasesDetails;

src/resources/ClusterEvents/ClusterEventDetails.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ export default function ClusterEventDetails({
1717
}: ClusterEventDetailsProps) {
1818
const params = useParams();
1919
const overriddenNamespace = params.namespace ?? namespace;
20-
const overriddenResourceUrl = resourceUrl
21-
? `/api/v1/namespaces/${overriddenNamespace}/events/${resourceName}`
22-
: undefined;
20+
const overriddenResourceUrl =
21+
resourceUrl && overriddenNamespace && resourceName
22+
? `/api/v1/namespaces/${overriddenNamespace}/events/${resourceName}`
23+
: undefined;
2324
const { clusterUrl } = useUrl();
25+
2426
return (
2527
<EventDetails
2628
{...props}

src/resources/CustomResourceDefinitions/CRCreate.jsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ function CRCreateForm({
4242

4343
const isEdit = useMemo(
4444
() =>
45-
!!initialResource?.metadata?.name &&
46-
!!!layoutColumn?.showCreate?.resource,
45+
!!initialResource?.metadata?.name && !layoutColumn?.showCreate?.resource,
4746
[initialResource, layoutColumn?.showCreate?.resource],
4847
);
4948

0 commit comments

Comments
 (0)