Skip to content

Commit 14ca124

Browse files
authored
refactor: Rework kyma modules list (#3867)
* Rework kyma modules list * Rework modules, add KymaModuleProvider, remove kyma channel * move module templates to provider * Show modules in navigation if module templates exist * Use provider for edit * Disable button when no kyma * Fix tests * Fix tests * Fix tests * Fix job test
1 parent 92bfb6c commit 14ca124

File tree

14 files changed

+346
-309
lines changed

14 files changed

+346
-309
lines changed

src/components/Extensibility/ExtensibilityDetails.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import pluralize from 'pluralize';
2+
import { useContext } from 'react';
23

34
import { usePrepareDetailsProps } from 'resources/helpers';
45
import { ResourceDetails } from 'shared/components/ResourceDetails/ResourceDetails';
@@ -20,6 +21,7 @@ import { useJsonata } from './hooks/useJsonata';
2021
import CustomResource from 'resources/CustomResourceDefinitions/CustomResources.details';
2122
import { useSetRecoilState } from 'recoil';
2223
import { resourcesConditions } from 'state/resourceConditionsAtom';
24+
import { KymaModuleContext } from 'components/KymaModules/providers/KymaModuleProvider';
2325

2426
export const ExtensibilityDetailsCore = ({
2527
resMetaData,
@@ -224,11 +226,12 @@ const ExtensibilityDetails = ({
224226
layoutCloseCreateUrl,
225227
namespaceId,
226228
isModule = false,
227-
headerActions,
228229
}) => {
229230
const resMetaData = useGetCRbyPath(resourceType);
230231
const { urlPath, defaultPlaceholder } = resMetaData?.general || {};
231232

233+
const { deleteModuleButton: headerActions } = useContext(KymaModuleContext);
234+
232235
if (!resMetaData) {
233236
return (
234237
<CustomResource

src/components/KymaModules/KymaModulesAddModule.js

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
1-
import { useCallback, useEffect, useState } from 'react';
1+
import { useCallback, useContext, useEffect, useState } from 'react';
22
import { MessageStrip } from '@ui5/webcomponents-react';
33
import { useTranslation } from 'react-i18next';
44
import { ResourceForm } from 'shared/ResourceForm';
55
import { Spinner } from 'shared/components/Spinner/Spinner';
66
import ModulesCard from 'components/KymaModules/components/ModulesCard';
77
import { cloneDeep } from 'lodash';
8-
import {
9-
useModulesReleaseQuery,
10-
useModuleTemplatesQuery,
11-
} from './kymaModulesQueries';
8+
import { useModulesReleaseQuery } from './kymaModulesQueries';
9+
import { KymaModuleContext } from './providers/KymaModuleProvider';
1210

1311
import './KymaModulesAddModule.scss';
1412
import { findModuleStatus } from './support';
1513

16-
export default function KymaModulesAddModule({
17-
resourceName,
18-
kymaResourceUrl,
19-
loading,
20-
activeKymaModules,
21-
initialUnchangedResource,
22-
kymaResource,
23-
setKymaResource,
24-
props,
25-
}) {
14+
export default function KymaModulesAddModule(props) {
2615
const { t } = useTranslation();
2716

17+
const {
18+
kymaResource: resourceName,
19+
resourceUrl: kymaResourceUrl,
20+
kymaResourceState: kymaResource,
21+
setKymaResourceState: setKymaResource,
22+
kymaResourceLoading: loading,
23+
selectedModules: activeKymaModules,
24+
moduleTemplates,
25+
initialUnchangedResource,
26+
} = useContext(KymaModuleContext);
27+
2828
const [resource, setResource] = useState(cloneDeep(kymaResource));
2929

3030
const [selectedModules, setSelectedModules] = useState([]);
@@ -51,9 +51,6 @@ export default function KymaModulesAddModule({
5151
const { data: moduleReleaseMetas } = useModulesReleaseQuery({
5252
skip: !resourceName,
5353
});
54-
const { data: moduleTemplates } = useModuleTemplatesQuery({
55-
skip: !resourceName,
56-
});
5754

5855
const [columnsCount, setColumnsCount] = useState(2);
5956
const [cardsContainerRef, setCardsContainerRef] = useState(null);

src/components/KymaModules/KymaModulesEdit.js

Lines changed: 45 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -408,50 +408,52 @@ export default function KymaModulesEdit({ resource, ...props }) {
408408
/>,
409409
document.body,
410410
)}
411-
<ResourceForm
412-
{...props}
413-
className="kyma-modules-create"
414-
pluralKind="kymas"
415-
singularName={t('kyma-modules.kyma')}
416-
resource={kymaResource}
417-
initialResource={initialResource}
418-
setResource={setKymaResource}
419-
createUrl={props.resourceUrl}
420-
disableDefaultFields
421-
skipCreateFn={skipModuleFn}
422-
>
423-
<ResourceForm.CollapsibleSection
424-
defaultOpen
425-
defaultTitleType
426-
className="collapsible-margins"
427-
title={t('kyma-modules.modules-channel')}
411+
{kymaResource && (
412+
<ResourceForm
413+
{...props}
414+
className="kyma-modules-create"
415+
pluralKind="kymas"
416+
singularName={t('kyma-modules.kyma')}
417+
resource={kymaResource}
418+
initialResource={initialResource}
419+
setResource={setKymaResource}
420+
createUrl={props.resourceUrl}
421+
disableDefaultFields
422+
skipCreateFn={skipModuleFn}
428423
>
429-
<UnmanagedModuleInfo kymaResource={kymaResource} />
430-
{modulesEditData?.length !== 0 ? (
431-
<>
432-
{checkIfSelectedModuleIsBeta() ? (
433-
<MessageStrip
434-
key={'beta'}
435-
design="Critical"
436-
hideCloseButton
437-
className="sap-margin-top-tiny"
438-
>
439-
{t('kyma-modules.beta-alert')}
440-
</MessageStrip>
441-
) : null}
442-
{renderModules()}
443-
</>
444-
) : (
445-
<MessageStrip
446-
design="Critical"
447-
hideCloseButton
448-
className="sap-margin-top-small"
449-
>
450-
{t('extensibility.widgets.modules.no-modules-installed')}
451-
</MessageStrip>
452-
)}
453-
</ResourceForm.CollapsibleSection>
454-
</ResourceForm>
424+
<ResourceForm.CollapsibleSection
425+
defaultOpen
426+
defaultTitleType
427+
className="collapsible-margins"
428+
title={t('kyma-modules.modules-channel')}
429+
>
430+
<UnmanagedModuleInfo kymaResource={kymaResource} />
431+
{modulesEditData?.length !== 0 ? (
432+
<>
433+
{checkIfSelectedModuleIsBeta() ? (
434+
<MessageStrip
435+
key={'beta'}
436+
design="Critical"
437+
hideCloseButton
438+
className="sap-margin-top-tiny"
439+
>
440+
{t('kyma-modules.beta-alert')}
441+
</MessageStrip>
442+
) : null}
443+
{renderModules()}
444+
</>
445+
) : (
446+
<MessageStrip
447+
design="Critical"
448+
hideCloseButton
449+
className="sap-margin-top-small"
450+
>
451+
{t('extensibility.widgets.modules.no-modules-installed')}
452+
</MessageStrip>
453+
)}
454+
</ResourceForm.CollapsibleSection>
455+
</ResourceForm>
456+
)}
455457
</>
456458
);
457459
}
Lines changed: 62 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,80 @@
1+
import { useContext } from 'react';
12
import { useTranslation } from 'react-i18next';
2-
import { ResourceDetails } from 'shared/components/ResourceDetails/ResourceDetails';
3-
import { DynamicPageHeader, FlexBox, Text } from '@ui5/webcomponents-react';
4-
import { HintButton } from 'shared/components/DescriptionHint/DescriptionHint';
5-
import { useState } from 'react';
6-
import {
7-
apiGroup,
8-
apiVersion,
9-
Create,
10-
ReleaseChannelDescription,
11-
ResourceDescription,
12-
resourceType,
13-
} from 'components/KymaModules';
3+
4+
import { Create, ResourceDescription } from 'components/KymaModules';
145
import { Spinner } from 'shared/components/Spinner/Spinner';
15-
import { Label } from 'shared/ResourceForm/components/Label';
16-
import { useModuleTemplatesQuery } from './kymaModulesQueries';
176
import { ModulesList } from './components/ModulesList';
7+
import { KymaModuleContext } from './providers/KymaModuleProvider';
8+
import { DynamicPageComponent } from 'shared/components/DynamicPageComponent/DynamicPageComponent';
9+
import { ResourceCreate } from 'shared/components/ResourceCreate/ResourceCreate';
10+
import { ErrorBoundary } from 'shared/components/ErrorBoundary/ErrorBoundary';
11+
import { useProtectedResources } from 'shared/hooks/useProtectedResources';
1812

19-
export default function KymaModulesList({
20-
resourceName,
21-
resourceUrl,
22-
kymaResource,
23-
kymaResourceLoading,
24-
selectedModules,
25-
namespaced,
26-
setOpenedModuleIndex,
27-
handleResourceDelete,
28-
}) {
13+
export default function KymaModulesList({ namespaced }) {
2914
const { t } = useTranslation();
30-
const [
31-
showReleaseChannelTitleDescription,
32-
setShowReleaseChannelTitleDescription,
33-
] = useState(false);
34-
35-
const namespace = 'kyma-system';
3615

37-
// Fetching all Module Templates can be replcaed with fetching one by one from api after implementing https://github.com/kyma-project/lifecycle-manager/issues/2232
3816
const {
39-
data: moduleTemplates,
40-
loading: moduleTemplateLoading,
41-
} = useModuleTemplatesQuery({ skip: !resourceName });
42-
if (moduleTemplateLoading || kymaResourceLoading) {
17+
resourceName,
18+
resourceUrl,
19+
kymaResource,
20+
kymaResourceLoading,
21+
selectedModules,
22+
moduleTemplates,
23+
moduleTemplatesLoading,
24+
setOpenedModuleIndex,
25+
handleResourceDelete,
26+
} = useContext(KymaModuleContext);
27+
const { isProtected, protectedResourceWarning } = useProtectedResources();
28+
29+
if (moduleTemplatesLoading || kymaResourceLoading) {
4330
return <Spinner />;
4431
}
4532

4633
return (
47-
<ResourceDetails
34+
<DynamicPageComponent
4835
className="kyma-modules"
36+
showYamlTab={false}
4937
layoutNumber="startColumn"
50-
windowTitle={t('kyma-modules.title')}
51-
headerContent={
52-
<DynamicPageHeader className="no-shadow">
53-
<FlexBox alignItems="Center">
54-
<Label showColon>{t('kyma-modules.release-channel')}</Label>
55-
<Text style={{ marginRight: '0.2rem' }}> </Text>
56-
<Text>{kymaResource?.spec.channel}</Text>
57-
<HintButton
58-
className="sap-margin-begin-tiny"
59-
setShowTitleDescription={setShowReleaseChannelTitleDescription}
60-
showTitleDescription={showReleaseChannelTitleDescription}
61-
description={ReleaseChannelDescription}
62-
ariaTitle={t('kyma-modules.release-channel')}
38+
title={t('kyma-modules.title')}
39+
description={ResourceDescription}
40+
content={
41+
<>
42+
{kymaResource && (
43+
<ModulesList
44+
key="kyma-modules-list"
45+
resource={kymaResource}
46+
moduleTemplates={moduleTemplates}
47+
resourceName={resourceName}
48+
selectedModules={selectedModules}
49+
kymaResource={kymaResource}
50+
namespaced={namespaced}
51+
resourceUrl={resourceUrl}
52+
setOpenedModuleIndex={setOpenedModuleIndex}
53+
handleResourceDelete={handleResourceDelete}
6354
/>
64-
</FlexBox>
65-
</DynamicPageHeader>
55+
)}
56+
</>
6657
}
67-
customComponents={[
68-
resource => (
69-
<ModulesList
70-
key="kyma-modules-list"
71-
resource={resource}
72-
moduleTemplates={moduleTemplates}
73-
resourceName={resourceName}
74-
selectedModules={selectedModules}
75-
kymaResource={kymaResource}
76-
namespaced={namespaced}
77-
resourceUrl={resourceUrl}
78-
setOpenedModuleIndex={setOpenedModuleIndex}
79-
handleResourceDelete={handleResourceDelete}
80-
/>
81-
),
82-
]}
83-
apiGroup={apiGroup}
84-
apiVersion={apiVersion}
85-
resourceUrl={resourceUrl}
86-
resourceType={resourceType}
87-
resourceName={resourceName}
88-
namespace={namespace}
89-
customTitle={t('kyma-modules.title')}
90-
headerDescription={ResourceDescription}
91-
createResourceForm={Create}
92-
disableResourceDetailsCard
93-
disableDelete
58+
inlineEditForm={() => (
59+
<ResourceCreate
60+
isEdit={true}
61+
confirmText={t('common.buttons.save')}
62+
protectedResource={isProtected(kymaResource)}
63+
protectedResourceWarning={protectedResourceWarning(
64+
kymaResource,
65+
true,
66+
)}
67+
renderForm={props => (
68+
<ErrorBoundary>
69+
<Create
70+
resource={kymaResource}
71+
resourceUrl={resourceUrl}
72+
{...props}
73+
/>
74+
</ErrorBoundary>
75+
)}
76+
/>
77+
)}
9478
/>
9579
);
9680
}

src/components/KymaModules/components/ModulesList.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ export const ModulesList = ({
300300
<Button
301301
key="add-module"
302302
design="Emphasized"
303+
disabled={!resource}
303304
onClick={handleShowAddModule}
304305
>
305306
{t('common.buttons.add')}

src/components/KymaModules/index.tsx

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,3 @@ export const ResourceDescription = (
1717
}
1818
/>
1919
);
20-
21-
export const ReleaseChannelDescription = (
22-
<Description
23-
i18nKey={'kyma-modules.release-channel-description'}
24-
url={
25-
'https://help.sap.com/docs/btp/sap-business-technology-platform/kyma-s-modular-approach?locale=en-US#kyma-release-channels'
26-
}
27-
/>
28-
);
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { configFeaturesNames, NavNode } from 'state/types';
1+
import { NavNode } from 'state/types';
22

33
export const kymaModulesNavNode: NavNode = {
44
category: 'Configuration',
@@ -7,7 +7,7 @@ export const kymaModulesNavNode: NavNode = {
77
pathSegment: 'kymamodules',
88
label: 'Modules',
99
namespaced: false,
10-
requiredFeatures: [configFeaturesNames.EXTENSIBILITY],
10+
requiredFeatures: [],
1111
apiGroup: '',
1212
apiVersion: 'v1',
1313
};

0 commit comments

Comments
 (0)