diff --git a/src/components/Extensibility/helpers/jsonataWrapper.ts b/src/components/Extensibility/helpers/jsonataWrapper.ts index b9cefac11e..8dd3dfdf56 100644 --- a/src/components/Extensibility/helpers/jsonataWrapper.ts +++ b/src/components/Extensibility/helpers/jsonataWrapper.ts @@ -66,12 +66,12 @@ export function jsonataWrapper(expression: string) { ); exp.registerFunction('getModuleState', resource => { - const { data: status } = useModuleStatus(resource); + const { data: status } = useModuleStatus(resource?.resource); return status?.state || 'Unknown'; }); exp.registerFunction('getModuleDescription', resource => { - const { data: status } = useModuleStatus(resource); + const { data: status } = useModuleStatus(resource?.resource); return status?.description; }); diff --git a/src/components/KymaModules/KymaModulesAddModule.js b/src/components/KymaModules/KymaModulesAddModule.js index 8f3c5c74c2..35f4c4ee28 100644 --- a/src/components/KymaModules/KymaModulesAddModule.js +++ b/src/components/KymaModules/KymaModulesAddModule.js @@ -11,6 +11,7 @@ import { } from './kymaModulesQueries'; import './KymaModulesAddModule.scss'; +import { findStatus } from './support'; export default function KymaModulesAddModule({ resourceName, @@ -188,38 +189,6 @@ export default function KymaModulesAddModule({ setSelectedModules(newSelectedModules); }; - const setChannel = (module, channel, index) => { - const modulesToUpdate = [...selectedModules]; - if ( - selectedModules.find( - selectedModule => selectedModule.name === module.name, - ) - ) { - if (channel === 'predefined') { - delete modulesToUpdate[index].channel; - } else modulesToUpdate[index].channel = channel; - } else { - modulesToUpdate.push({ - name: module.name, - }); - if (channel !== 'predefined') - modulesToUpdate[modulesToUpdate?.length - 1].channel = channel; - } - setSelectedModules(modulesToUpdate); - }; - - const findStatus = moduleName => { - return kymaResource?.status?.modules?.find( - module => moduleName === module.name, - ); - }; - - const findSpec = moduleName => { - return kymaResource?.spec.modules?.find( - module => moduleName === module.name, - ); - }; - const checkIfSelectedModuleIsBeta = moduleName => { return selectedModules.some(({ name, channel }) => { if (moduleName && name !== moduleName) { @@ -241,7 +210,7 @@ export default function KymaModulesAddModule({ ?.find(mod => mod.name === moduleName) ?.channels.some( ({ channel: ch, isBeta }) => - ch === findStatus(moduleName)?.channel || + ch === findStatus(kymaResource, moduleName)?.channel || (kymaResource.spec.channel && isBeta), ); }; @@ -262,9 +231,8 @@ export default function KymaModulesAddModule({ key={module.name} isChecked={isChecked} setCheckbox={setCheckbox} - setChannel={setChannel} - findStatus={findStatus} - findSpec={findSpec} + selectedModules={selectedModules} + setSelectedModules={setSelectedModules} checkIfStatusModuleIsBeta={checkIfStatusModuleIsBeta} /> ); diff --git a/src/components/KymaModules/KymaModulesCreate.js b/src/components/KymaModules/KymaModulesEdit.js similarity index 87% rename from src/components/KymaModules/KymaModulesCreate.js rename to src/components/KymaModules/KymaModulesEdit.js index cd423a473c..36d9e8cb98 100644 --- a/src/components/KymaModules/KymaModulesCreate.js +++ b/src/components/KymaModules/KymaModulesEdit.js @@ -35,8 +35,76 @@ import { useModulesReleaseQuery, useModuleTemplatesQuery, } from './kymaModulesQueries'; +import { findSpec, findStatus, setChannel } from './support'; -export default function KymaModulesCreate({ resource, ...props }) { +const addChannelsToModules = moduleReleaseMetas => { + return (acc, module) => { + const name = + module.metadata?.labels['operator.kyma-project.io/module-name']; + const existingModule = acc.find(item => item.name === name); + if (module.spec.channel) { + if (!existingModule) { + acc.push({ + name: name, + channels: [ + { + channel: module.spec.channel, + version: module.spec.descriptor.component.version, + isBeta: + module.metadata.labels['operator.kyma-project.io/beta'] === + 'true', + isMetaRelease: false, + }, + ], + docsUrl: + module.metadata.annotations['operator.kyma-project.io/doc-url'], + }); + } else if (existingModule) { + existingModule.channels?.push({ + channel: module.spec.channel, + version: module.spec.descriptor.component.version, + isBeta: + module.metadata.labels['operator.kyma-project.io/beta'] === 'true', + isMetaRelease: false, + }); + } + } else { + if (!existingModule) { + const moduleMetaRelase = moduleReleaseMetas?.items.find( + item => item.spec.moduleName === name, + ); + moduleMetaRelase?.spec.channels.forEach(channel => { + if (!acc.find(item => item.name === name)) { + acc.push({ + name: name, + channels: [ + { + channel: channel.channel, + version: channel.version, + isBeta: moduleMetaRelase.spec.beta ?? false, + isMetaRelease: true, + }, + ], + docsUrl: module.spec.info.documentation, + }); + } else { + acc + .find(item => item.name === name) + .channels.push({ + channel: channel.channel, + version: channel.version, + isBeta: moduleMetaRelase.spec.beta ?? false, + isMetaRelease: true, + }); + } + }); + } + } + return acc; + }; +}; + +export default function KymaModulesEdit({ resource, ...props }) { const { t } = useTranslation(); const [kymaResource, setKymaResource] = useState(cloneDeep(resource)); const [initialResource] = useState(resource); @@ -65,10 +133,12 @@ export default function KymaModulesCreate({ resource, ...props }) { const getRequest = useSingleGet(); const patchRequest = useUpdate(); - const [selectedModules] = useState( + const [selectedModules, setSelectedModules] = useState( cloneDeep(initialResource?.spec?.modules) ?? [], ); - const [isEdited, setIsEdited] = useState(false); + const [showChannelChangeWarning, setShowChannelChangeWarning] = useState( + false, + ); const [isManagedChanged, setIsManagedChanged] = useState(false); const [showMessageBox, setShowMessageBox] = useState({ isOpen: false, @@ -86,33 +156,6 @@ export default function KymaModulesCreate({ resource, ...props }) { ); } - const setChannel = (module, channel, index) => { - if ( - selectedModules.find( - selectedModule => selectedModule.name === module.name, - ) - ) { - if (channel === 'predefined') { - delete selectedModules[index].channel; - } else selectedModules[index].channel = channel; - } else { - selectedModules.push({ - name: module.name, - }); - if (channel !== 'predefined') - selectedModules[selectedModules.length - 1].channel = channel; - } - - setKymaResource({ - ...kymaResource, - spec: { - ...kymaResource.spec, - modules: selectedModules, - }, - }); - setIsEdited(true); - }; - const setManaged = (managed, index) => { selectedModules[index].managed = managed; @@ -137,83 +180,10 @@ export default function KymaModulesCreate({ resource, ...props }) { ); }); - const modulesEditData = (installedModules || []).reduce((acc, module) => { - const name = - module.metadata?.labels['operator.kyma-project.io/module-name']; - const existingModule = acc.find(item => item.name === name); - const moduleMetaRelase = moduleReleaseMetas?.items.find( - item => item.spec.moduleName === name, - ); - - if (module.spec.channel) { - if (!existingModule) { - acc.push({ - name: name, - channels: [ - { - channel: module.spec.channel, - version: module.spec.descriptor.component.version, - isBeta: - module.metadata.labels['operator.kyma-project.io/beta'] === - 'true', - isMetaRelease: false, - }, - ], - docsUrl: - module.metadata.annotations['operator.kyma-project.io/doc-url'], - }); - } else if (existingModule) { - existingModule.channels?.push({ - channel: module.spec.channel, - version: module.spec.descriptor.component.version, - isBeta: - module.metadata.labels['operator.kyma-project.io/beta'] === 'true', - isMetaRelease: false, - }); - } - } else { - if (!existingModule) { - moduleMetaRelase?.spec.channels.forEach(channel => { - if (!acc.find(item => item.name === name)) { - acc.push({ - name: name, - channels: [ - { - channel: channel.channel, - version: channel.version, - isBeta: moduleMetaRelase.spec.beta ?? false, - isMetaRelease: true, - }, - ], - docsUrl: module.spec.info.documentation, - }); - } else { - acc - .find(item => item.name === name) - .channels.push({ - channel: channel.channel, - version: channel.version, - isBeta: moduleMetaRelase.spec.beta ?? false, - isMetaRelease: true, - }); - } - }); - } - } - return acc; - }, []); - - const findStatus = moduleName => { - return kymaResource?.status?.modules?.find( - module => moduleName === module.name, - ); - }; - - const findSpec = moduleName => { - return kymaResource?.spec.modules?.find( - module => moduleName === module.name, - ); - }; + const modulesEditData = (installedModules || []).reduce( + addChannelsToModules(moduleReleaseMetas), + [], + ); const checkIfSelectedModuleIsBeta = moduleName => { return selectedModules.some(({ name, channel }) => { @@ -231,6 +201,18 @@ export default function KymaModulesCreate({ resource, ...props }) { }); }; + const onChange = (module, value, index) => { + setChannel(module, value, index, selectedModules, setSelectedModules); + setKymaResource({ + ...kymaResource, + spec: { + ...kymaResource.spec, + modules: selectedModules, + }, + }); + setShowChannelChangeWarning(true); + }; + const renderModules = () => { const modulesList = []; modulesEditData?.forEach((module, i) => { @@ -248,11 +230,11 @@ export default function KymaModulesCreate({ resource, ...props }) { { - setChannel(module, event.detail.selectedOption.value, index); + setChannel( + module, + event.detail.selectedOption.value, + index, + selectedModules, + setSelectedModules, + ); }} value={ - findSpec(module.name)?.channel || - findStatus(module.name)?.channel || + findSpec(kymaResource, module.name)?.channel || + findStatus(kymaResource, module.name)?.channel || 'predefined' } className="channel-select" @@ -122,7 +128,9 @@ export default function ModulesCard({ {module.channels?.map(channel => (