Skip to content

Commit d92a2c6

Browse files
chore: Enable eslint react/prop-types rule - part 4 (#4638)
* Refactored components * Refactor * Refactored BusolaExtensions * Refactored components * Refactored components * Refactor ClusterValidationConfiguration * Corrected types and added new * Refactored components * Corrected and refactored files * Refactored and corrected components * Corrected types * Refactored HelmReleases to tsx * Type corrections * Corrections * Correction
1 parent 585fff3 commit d92a2c6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+939
-403
lines changed

src/components/App/ExtensibilityRoutes.jsx renamed to src/components/App/ExtensibilityRoutes.tsx

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import { Spinner } from 'shared/components/Spinner/Spinner';
1414
import { ResourceCreate } from 'shared/components/ResourceCreate/ResourceCreate';
1515
import { ErrorBoundary } from 'shared/components/ErrorBoundary/ErrorBoundary';
1616
import { usePrepareLayoutColumns } from 'shared/hooks/usePrepareLayout';
17+
import { K8sResource } from 'types';
18+
import FCLLayout from '@ui5/webcomponents-fiori/dist/types/FCLLayout';
1719
import { lazyWithRetries } from 'shared/helpers/lazyWithRetries';
1820

1921
const List = lazyWithRetries(
@@ -26,7 +28,17 @@ const Create = lazyWithRetries(
2628
() => import('../Extensibility/ExtensibilityCreate'),
2729
);
2830

29-
const ColumnWrapper = ({ resourceType, extension, urlPath }) => {
31+
type ColumnWrapperProps = {
32+
resourceType?: string;
33+
extension?: Record<string, any>;
34+
urlPath?: string;
35+
};
36+
37+
const ColumnWrapper = ({
38+
resourceType,
39+
extension,
40+
urlPath,
41+
}: ColumnWrapperProps) => {
3042
const layoutState = useAtomValue(columnLayoutAtom);
3143
const { resourceListUrl } = useUrl();
3244

@@ -52,6 +64,9 @@ const ColumnWrapper = ({ resourceType, extension, urlPath }) => {
5264
layoutState?.showEdit?.resource ||
5365
null,
5466
rawResourceTypeName: extension?.general?.resource?.kind,
67+
isCustomResource: undefined,
68+
crName: undefined,
69+
isModule: undefined,
5570
});
5671

5772
const overrides = { resourceType: urlPath };
@@ -62,13 +77,14 @@ const ColumnWrapper = ({ resourceType, extension, urlPath }) => {
6277
metadata: {
6378
namespace: layoutState?.midColumn?.namespaceId ?? namespaceId,
6479
},
65-
},
66-
urlPath ? overrides : null,
80+
} as K8sResource,
81+
urlPath ? overrides : undefined,
6782
);
6883

6984
let startColumnComponent = null;
7085
if (layoutState.layout === 'OneColumn' && defaultColumn === 'details') {
7186
startColumnComponent = (
87+
/*@ts-expect-error Type mismatch between js and ts*/
7288
<Details
7389
resourceName={resourceName}
7490
namespaceId={namespaceId}
@@ -77,6 +93,7 @@ const ColumnWrapper = ({ resourceType, extension, urlPath }) => {
7793
);
7894
} else {
7995
startColumnComponent = (
96+
/*@ts-expect-error Type mismatch between js and ts*/
8097
<List
8198
rawResourceType={extension?.general?.resource?.kind}
8299
layoutCloseCreateUrl={layoutCloseCreateUrl}
@@ -90,12 +107,14 @@ const ColumnWrapper = ({ resourceType, extension, urlPath }) => {
90107
resourceTypeForTitle: extension?.general?.name,
91108
apiGroup: extension?.general.resource.group,
92109
apiVersion: extension?.general.resource.version,
110+
resourceCustomType: undefined,
93111
});
94112

95113
let midColumnComponent = null;
96114

97115
if (layoutState?.showCreate?.resourceType) {
98116
midColumnComponent = (
117+
/*@ts-expect-error Type mismatch between js and ts*/
99118
<ResourceCreate
100119
title={elementCreateProps.resourceTitle}
101120
confirmText={t('common.buttons.create')}
@@ -122,6 +141,7 @@ const ColumnWrapper = ({ resourceType, extension, urlPath }) => {
122141
!(layoutState?.layout === 'OneColumn' && defaultColumn === 'details')
123142
) {
124143
midColumnComponent = (
144+
/*@ts-expect-error Type mismatch between js and ts*/
125145
<Details
126146
resourceName={layoutState?.midColumn?.resourceName ?? resourceName}
127147
namespaceId={layoutState.midColumn?.namespaceId ?? namespaceId}
@@ -134,15 +154,22 @@ const ColumnWrapper = ({ resourceType, extension, urlPath }) => {
134154
<FlexibleColumnLayout
135155
style={{ height: '100%' }}
136156
layout={
137-
!midColumnComponent ? 'OneColumn' : layoutState?.layout || 'OneColumn'
157+
(!midColumnComponent
158+
? 'OneColumn'
159+
: layoutState?.layout || 'OneColumn') as
160+
| FCLLayout
161+
| keyof typeof FCLLayout
138162
}
139163
startColumn={<div className="column-content">{startColumnComponent}</div>}
140164
midColumn={<div className="column-content">{midColumnComponent}</div>}
141165
/>
142166
);
143167
};
144168

145-
export const createExtensibilityRoutes = (extension, language) => {
169+
export const createExtensibilityRoutes = (
170+
extension: Record<string, any>,
171+
language: string,
172+
) => {
146173
const urlPath =
147174
extension?.general?.urlPath ||
148175
pluralize(extension?.general?.resource?.kind?.toLowerCase() || '');
Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Button, MessageBox, Text } from '@ui5/webcomponents-react';
22
import { useTranslation } from 'react-i18next';
3-
import { useMatch, useNavigate } from 'react-router';
3+
import { To, useMatch, useNavigate } from 'react-router';
44
import { useAtomValue } from 'jotai';
55
import { extensionsAtom } from 'state/navigation/extensionsAtom';
66

@@ -10,7 +10,17 @@ import { useUrl } from 'hooks/useUrl';
1010
import { Spinner } from 'shared/components/Spinner/Spinner';
1111
import { useNotification } from 'shared/contexts/NotificationContext';
1212

13-
export function IncorrectPath({ to, title = '', message = '' }) {
13+
type IncorrectPathProps = {
14+
to: To;
15+
title?: string;
16+
message?: string;
17+
};
18+
19+
export function IncorrectPath({
20+
to,
21+
title = '',
22+
message = '',
23+
}: IncorrectPathProps) {
1424
const { t } = useTranslation();
1525
const { namespace, namespaceUrl, clusterUrl } = useUrl();
1626
const notificationManager = useNotification();
@@ -49,8 +59,12 @@ export function IncorrectPath({ to, title = '', message = '' }) {
4959
const resourceName = namespace ? namespaceResourceName : clusterResourceName;
5060

5161
const { data, loading } = useGetList(
52-
(crd) => pluralize(crd.spec.names.kind.toLowerCase()) === resourceType,
53-
)(resourceUrl, { skip: !extensions?.length });
62+
(crd: { spec: { names: { kind: string } } }) =>
63+
pluralize(crd.spec.names.kind.toLowerCase()) === resourceType,
64+
)(resourceUrl, { skip: !extensions?.length }) as {
65+
data: { spec?: { group?: string } }[] | null;
66+
loading?: boolean;
67+
};
5468

5569
if (!extensions?.length && extensions?.length !== 0) return null;
5670

src/components/BusolaExtensions/BusolaExtensionCreate.jsx renamed to src/components/BusolaExtensions/BusolaExtensionCreate.tsx

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useState } from 'react';
1+
import { FormEventHandler, RefObject, useState } from 'react';
22
import { useTranslation } from 'react-i18next';
33
import { useAtomValue, useSetAtom } from 'jotai';
44

@@ -15,12 +15,19 @@ import { clusterAtom } from 'state/clusterAtom';
1515
import { usePrepareLayout } from 'shared/hooks/usePrepareLayout';
1616
import { columnLayoutAtom } from 'state/columnLayoutAtom';
1717
import { useNavigate } from 'react-router';
18+
import { Crd } from 'types';
19+
20+
type BusolaExtensionCreateProps = {
21+
formElementRef: RefObject<HTMLFormElement>;
22+
onChange: FormEventHandler<HTMLFormElement>;
23+
layoutNumber: string;
24+
};
1825

1926
export default function BusolaExtensionCreate({
2027
formElementRef,
2128
onChange,
2229
layoutNumber,
23-
}) {
30+
}: BusolaExtensionCreateProps) {
2431
const { t } = useTranslation();
2532
const navigate = useNavigate();
2633
const notificationManager = useNotification();
@@ -32,8 +39,8 @@ export default function BusolaExtensionCreate({
3239

3340
const { data: crds } = useGetList()(
3441
'/apis/apiextensions.k8s.io/v1/customresourcedefinitions',
35-
);
36-
const [crd, setCrd] = useState(null);
42+
) as { data: Crd[] | null; loading: boolean; error: null };
43+
const [crd, setCrd] = useState<Crd | null>(null);
3744
const [state, setState] = useState({});
3845

3946
return (
@@ -46,11 +53,10 @@ export default function BusolaExtensionCreate({
4653
setResource={setState}
4754
className="resource-form--unset-height"
4855
createResource={async () => {
49-
const onError = (e) =>
56+
const onError = (e: Error) =>
5057
notificationManager.notifyError({
5158
content: t('common.messages.error', { error: e.message }),
52-
title: t('extensibility.starter-modal.messages.error'),
53-
type: 'error',
59+
header: t('extensibility.starter-modal.messages.error'),
5460
});
5561

5662
const onSuccess = () => {
@@ -68,15 +74,15 @@ export default function BusolaExtensionCreate({
6874
namespaceId: 'kube-public',
6975
},
7076
midColumn: {
71-
resourceName: crd?.metadata?.name,
77+
resourceName: crd?.metadata?.name ?? null,
7278
resourceType: 'Extensions',
7379
rawResourceTypeName: 'ConfigMap',
7480
namespaceId: 'kube-public',
7581
},
7682
endColumn: null,
7783
});
7884
navigate(
79-
`/cluster/${cluster.contextName}/busolaextensions/kube-public/${crd.metadata.name}${nextQuery}`,
85+
`/cluster/${cluster?.contextName}/busolaextensions/kube-public/${crd?.metadata?.name}${nextQuery}`,
8086
);
8187
};
8288

@@ -94,8 +100,8 @@ export default function BusolaExtensionCreate({
94100
required
95101
label={t('extensibility.starter-modal.crd')}
96102
value={crd?.metadata.name}
97-
setValue={(value) => {
98-
const crd = crds.find((crd) => crd.metadata.name === value);
103+
setValue={(value: string) => {
104+
const crd = crds?.find((crd) => crd.metadata.name === value);
99105
if (crd) {
100106
setCrd(crd);
101107
setState(createExtensibilityTemplate(crd, t));

src/components/BusolaExtensions/BusolaExtensionDetails.jsx renamed to src/components/BusolaExtensions/BusolaExtensionDetails.tsx

Lines changed: 46 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { ComponentProps } from 'react';
12
import { ExternalLink } from 'shared/components/ExternalLink/ExternalLink';
23
import { Trans, useTranslation } from 'react-i18next';
34
import { createPatch } from 'rfc6902';
@@ -32,22 +33,33 @@ import { EXTENSION_VERSION_LABEL } from './constants';
3233
import { UI5Panel } from 'shared/components/UI5Panel/UI5Panel';
3334
import { configFeaturesNames } from 'state/types';
3435

35-
export function BusolaExtensionDetails({ name, namespace }) {
36+
type BusolaExtensionDetailsProps = {
37+
name: string;
38+
namespace: string;
39+
};
40+
41+
export function BusolaExtensionDetails({
42+
name,
43+
namespace,
44+
}: BusolaExtensionDetailsProps) {
3645
const { t } = useTranslation();
3746
const extensibilitySchemas = useAtomValue(extensibilitySchemasAtom);
3847

3948
const { clusterUrl } = useUrl();
4049

4150
const resourceUrl = `/api/v1/namespaces/${namespace}/configmaps/${name}`;
4251

43-
const updateResourceMutation = useUpdate(resourceUrl);
52+
const updateResourceMutation = useUpdate();
4453
const notification = useNotification();
4554

4655
if (!name || !namespace) {
4756
return null;
4857
}
4958

50-
const updateBusolaExtension = async (newBusolaExtension, configmap) => {
59+
const updateBusolaExtension = async (
60+
newBusolaExtension: Record<string, any>,
61+
configmap: Record<string, any>,
62+
) => {
5163
try {
5264
const diff = createPatch(configmap, newBusolaExtension);
5365
await updateResourceMutation(resourceUrl, diff);
@@ -61,14 +73,14 @@ export function BusolaExtensionDetails({ name, namespace }) {
6173
notification.notifyError({
6274
content: t('components.resource-details.messages.failure', {
6375
resourceType: 'BusolaExtension',
64-
error: e.message,
76+
error: (e as Error)?.message,
6577
}),
6678
});
6779
throw e;
6880
}
6981
};
7082

71-
const BusolaExtensionEditor = (resource) => {
83+
const BusolaExtensionEditor = (resource: Record<string, any>) => {
7284
const { data } = resource;
7385
return SECTIONS.map((key) => (
7486
<ReadonlyEditorPanel
@@ -92,20 +104,21 @@ export function BusolaExtensionDetails({ name, namespace }) {
92104
id="edit-resource-modal"
93105
key="edit-resource-modal"
94106
className="modal-size--l"
95-
renderForm={(props) => (
107+
renderForm={(
108+
props: Partial<ComponentProps<typeof SectionEditor>>,
109+
) => (
96110
<ErrorBoundary>
97111
<SectionEditor
98112
{...props}
99113
onlyYaml={
100114
// onlyYaml view for form & details due to heavy performance issues
101-
!extensibilitySchemas[key] ||
115+
!extensibilitySchemas?.[key] ||
102116
key === 'form' ||
103117
key === 'details'
104118
}
105119
data={data[key]}
106-
schema={extensibilitySchemas[key]}
107-
resource={data}
108-
onSubmit={(newData) => {
120+
schema={extensibilitySchemas?.[key]}
121+
onSubmit={(newData: string) => {
109122
const newResource = {
110123
...resource,
111124
data: {
@@ -124,7 +137,9 @@ export function BusolaExtensionDetails({ name, namespace }) {
124137
));
125138
};
126139

127-
const ExtensibilityVersion = (configmap) => {
140+
const ExtensibilityVersion = (configmap: {
141+
metadata?: { labels?: Record<string, string> };
142+
}) => {
128143
const { t } = useTranslation();
129144
const { isEnabled: isExtensibilityEnabled } = useFeature(
130145
configFeaturesNames.EXTENSIBILITY,
@@ -136,7 +151,7 @@ export function BusolaExtensionDetails({ name, namespace }) {
136151
if (!(isExtensibilityEnabled && hasExtensibilityLabel)) return null;
137152

138153
const currentVersion = formatCurrentVersion(
139-
configmap?.metadata.labels?.[EXTENSION_VERSION_LABEL],
154+
configmap?.metadata?.labels?.[EXTENSION_VERSION_LABEL],
140155
);
141156

142157
const hasMigrationFunction = getMigrationFunctions().some(
@@ -191,23 +206,18 @@ export function BusolaExtensionDetails({ name, namespace }) {
191206
key={'extensibility-version'}
192207
accessibleName={t('extensibility.accessible-name.version-panel')}
193208
headerActions={
194-
hasMigrationFunction && (
195-
<>
196-
{currentVersion && (
197-
<>
198-
<Button
199-
disabled={currentVersion === getLatestVersion()}
200-
endIcon="forward"
201-
onClick={() => {
202-
const newBusolaExtension = migrateToLatest(configmap);
203-
updateBusolaExtension(newBusolaExtension, configmap);
204-
}}
205-
>
206-
{t('config-maps.buttons.migrate')}
207-
</Button>
208-
</>
209-
)}
210-
</>
209+
hasMigrationFunction &&
210+
currentVersion && (
211+
<Button
212+
disabled={currentVersion === getLatestVersion()}
213+
endIcon="forward"
214+
onClick={() => {
215+
const newBusolaExtension = migrateToLatest(configmap);
216+
updateBusolaExtension(newBusolaExtension, configmap);
217+
}}
218+
>
219+
{t('config-maps.buttons.migrate')}
220+
</Button>
211221
)
212222
}
213223
>
@@ -227,9 +237,13 @@ export function BusolaExtensionDetails({ name, namespace }) {
227237
const customColumns = [
228238
{
229239
header: t('common.headers.owner'),
230-
value: (secret) => (
231-
<ControlledBy ownerReferences={secret.metadata.ownerReferences} />
232-
),
240+
value: (secret: {
241+
metadata: {
242+
ownerReferences?:
243+
| { kind?: string; name?: string }[]
244+
| { kind?: string; name?: string };
245+
};
246+
}) => <ControlledBy ownerReferences={secret.metadata.ownerReferences} />,
233247
},
234248
];
235249

0 commit comments

Comments
 (0)