From 777d1457e6f24ef187612d0150a5415002550cee Mon Sep 17 00:00:00 2001 From: brunomilitzer Date: Thu, 5 May 2022 14:19:39 +0100 Subject: Added Edit Button Functionality Issue-ID: POLICY-4094 Change-Id: I7e83e1c194272f274f351bc1ee34761fcc7353a4 Signed-off-by: brunomilitzer --- gui-clamp/ui-react/src/api/ACMService.js | 54 ++++++++++--- .../components/dialogs/ACM/CommissioningModal.js | 9 +-- .../dialogs/ACM/InstancePropertiesModal.js | 93 +++++++++++++++++++--- .../dialogs/ACM/InstantiationManagementModal.js | 10 ++- .../InstancePropertiesModal.test.js.snap | 10 ++- .../dialogs/ACM/utils/InstantiationUtils.js | 5 +- 6 files changed, 145 insertions(+), 36 deletions(-) diff --git a/gui-clamp/ui-react/src/api/ACMService.js b/gui-clamp/ui-react/src/api/ACMService.js index 393741f..722a571 100644 --- a/gui-clamp/ui-react/src/api/ACMService.js +++ b/gui-clamp/ui-react/src/api/ACMService.js @@ -42,6 +42,25 @@ export default class ACMService { return response } + static async updateInstanceProperties(instanceName, version, instancePropertiesTemplate) { + const params = { + name: instanceName, + version: version + } + + const response = await fetch(window.location.pathname + + 'restservices/clds/v2/acm/putToscaInstanceProperties?' + (new URLSearchParams(params)), { + method: 'PUT', + headers: { + "Content-Type": "application/json" + }, + credentials: 'same-origin', + body: JSON.stringify(instancePropertiesTemplate), + }); + + return response + } + static async deleteInstantiation(name, version) { const params = { name: name, @@ -86,11 +105,17 @@ export default class ACMService { return response } - static async getToscaTemplate(name, version) { - const params = { - name: name, - version: version - } + static async getToscaTemplate(name, version, instanceName) { + const params = instanceName != null ? + { + name: name, + version: version, + instanceName: instanceName + } : + { + name: name, + version: version + } const response = await fetch(window.location.pathname + 'restservices/clds/v2/acm/getToscaTemplate' + '?' + (new URLSearchParams(params))); @@ -132,12 +157,19 @@ export default class ACMService { return data; } - static async getCommonOrInstanceProperties(name, version, isCommon) { - const params = { - name: name, - version: version, - common: isCommon - } + static async getCommonOrInstanceProperties(name, version, instanceName, isCommon) { + const params = instanceName != null ? + { + name: name, + version: version, + instanceName: instanceName, + common: isCommon + } : + { + name: name, + version: version, + common: isCommon + } const response = await fetch(window.location.pathname + 'restservices/clds/v2/acm/getCommonOrInstanceProperties' + '?' + (new URLSearchParams(params))); diff --git a/gui-clamp/ui-react/src/components/dialogs/ACM/CommissioningModal.js b/gui-clamp/ui-react/src/components/dialogs/ACM/CommissioningModal.js index db71cd9..d120def 100644 --- a/gui-clamp/ui-react/src/components/dialogs/ACM/CommissioningModal.js +++ b/gui-clamp/ui-react/src/components/dialogs/ACM/CommissioningModal.js @@ -48,9 +48,7 @@ const AlertStyled = styled(Alert)` const CommissioningModal = (props) => { const [fullToscaTemplate, setFullToscaTemplate] = useState({}); - const [toscaInitialValues, setToscaInitialValues] = useState({}); const [commonProperties, setCommonProperties] = useState({}) - const [toscaJsonSchema, setToscaJsonSchema] = useState({}); const [jsonEditor, setJsonEditor] = useState(null); const [show, setShow] = useState(true); const [alertMessages, setAlertMessages] = useState(); @@ -60,14 +58,13 @@ const CommissioningModal = (props) => { const version = '1.0.0'; useEffect(async () => { - const toscaTemplateResponse = await ACMService.getToscaTemplate(name, version) + const toscaTemplateResponse = await ACMService.getToscaTemplate(name, version, null) .catch(error => error.message); - const toscaCommonProperties = await ACMService.getCommonOrInstanceProperties(name, version, true) + const toscaCommonProperties = await ACMService.getCommonOrInstanceProperties(name, version, null, true) .catch(error => error.message); if (!toscaCommonProperties.ok) { const errorResponse = await toscaCommonProperties.json() - console.log(errorResponse) setCommonProperties(errorResponse) setCommonPropertiesResponseOk(false); } @@ -82,9 +79,7 @@ const CommissioningModal = (props) => { if (toscaTemplateResponse.ok && toscaCommonProperties.ok) { const renderedEditorObjects = CommissioningUtils.renderJsonEditor(toscaTemplateResponse, toscaCommonProperties) setFullToscaTemplate((await renderedEditorObjects).fullTemplate) - setToscaJsonSchema((await renderedEditorObjects).propertySchema) setJsonEditor((await renderedEditorObjects).editorTemp) - setToscaInitialValues((await renderedEditorObjects).toscaInitialValues) } diff --git a/gui-clamp/ui-react/src/components/dialogs/ACM/InstancePropertiesModal.js b/gui-clamp/ui-react/src/components/dialogs/ACM/InstancePropertiesModal.js index 5181b64..1c152ff 100644 --- a/gui-clamp/ui-react/src/components/dialogs/ACM/InstancePropertiesModal.js +++ b/gui-clamp/ui-react/src/components/dialogs/ACM/InstancePropertiesModal.js @@ -56,24 +56,49 @@ function Fragment(props) { return null; } -Fragment.propTypes = { children: PropTypes.node }; +const specialCharacter = /[ `!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?~]/; + +Fragment.propTypes = {children: PropTypes.node}; const InstancePropertiesModal = (props) => { const [show, setShow] = useState(true); const [toscaFullTemplate, setToscaFullTemplate] = useState({}); const [jsonEditor, setJsonEditor] = useState(null); const [alertMessage, setAlertMessage] = useState(null); + const [clearButton, setClearButton] = useState(null); const [instancePropertiesGlobal, setInstancePropertiesGlobal] = useState({}); const [serviceTemplateResponseOk, setServiceTemplateResponseOk] = useState(true); const [instancePropertiesResponseOk, setInstancePropertiesResponseOk] = useState(true); const [instanceName, setInstanceName] = useState(''); + const [instanceVersion, setInstanceVersion] = useState(''); + const [oldInstanceName, setOldInstanceName] = useState(''); + const [tempInstanceName, setTempInstanceName] = useState(''); + const [validated, setValidated] = useState(false); + const [editMode, setEditMode] = useState(false); useEffect(async () => { - const toscaTemplateResponse = await ACMService.getToscaTemplate(templateName, templateVersion) + let isEditMode = false; + + if (props.location.instantiationName !== undefined) { + isEditMode = true; + setEditMode(true); + setInstanceName(props.location.instantiationName); + setInstanceVersion(props.location.instantiationVersion); + } + + const instantiationName = isEditMode ? props.location.instantiationName : null; + console.log(instantiationName); + + const toscaTemplateResponse = await ACMService.getToscaTemplate(templateName, templateVersion, instantiationName) .catch(error => error.message); - const toscaInstanceProperties = await ACMService.getCommonOrInstanceProperties(templateName, templateVersion, false) + const toscaInstanceProperties = await ACMService.getCommonOrInstanceProperties(templateName, templateVersion, instantiationName, false) .catch(error => error.message); + if (toscaInstanceProperties == null || toscaTemplateResponse == null) { + await warningAlert('Tosca service template is empty') + return; + } + if (!toscaInstanceProperties.ok) { const errorResponse = await toscaInstanceProperties.json(); console.log(errorResponse); @@ -96,6 +121,30 @@ const InstancePropertiesModal = (props) => { }, []); + useEffect(async () => { + + await validateInstanceName(); + + }, [instanceName]) + + const validateInstanceName = async () => { + console.log('validateInstanceName called'); + + if (specialCharacter.test(instanceName)) { + await warningAlert('Instance name cannot contain special characters'); + } else if (alertMessage) { + clearWarning(); + } + + if (instanceName.length > 2 && !specialCharacter.test(instanceName)) { + console.log('validated'); + setOldInstanceName(tempInstanceName); + setValidated(true); + } else { + setValidated(false); + } + } + const handleClose = () => { console.log('handleClose called'); setShow(false); @@ -105,7 +154,11 @@ const InstancePropertiesModal = (props) => { const handleInstanceName = (event) => { console.log('handleInstanceName called'); + setTempInstanceName(instanceName); setInstanceName(event.target.value); + + validateInstanceName().then(() => { + }); } const handleSave = async () => { @@ -118,8 +171,15 @@ const InstancePropertiesModal = (props) => { setToscaFullTemplate(InstantiationUtils.updateTemplate(instanceName, jsonEditor.getValue(), toscaFullTemplate)); } - const response = await ACMService.createInstanceProperties(toscaFullTemplate) - .catch(error => error.message); + let response = null; + + if (editMode) { + response = await ACMService.updateInstanceProperties(oldInstanceName, instanceVersion, toscaFullTemplate) + .catch(error => error.message); + } else { + response = await ACMService.createInstanceProperties(toscaFullTemplate) + .catch(error => error.message); + } if (response.ok) { successAlert(); @@ -127,15 +187,16 @@ const InstancePropertiesModal = (props) => { await errorAlert(response); } } else { - await warningAlert(); + await warningAlert('Instance name cannot be empty'); } } - const warningAlert = async () => { + const warningAlert = async (message) => { console.log("warningAlert called"); + setAlertMessage( Instantiation Properties Warning -

Instance name cannot be empty

+

{message}


); } @@ -160,6 +221,17 @@ const InstancePropertiesModal = (props) => { ); } + const clearWarning = () => { + console.log("clearWarning called"); + + if (specialCharacter.test(instanceName)) { + return; + } + + setClearButton(null); + setAlertMessage(null); + } + return ( { backdrop="static" keyboard={ false }> - Create Tosca Instance Properties + { editMode ? 'Edit' : 'Create' } Tosca Instance Properties
@@ -189,7 +261,8 @@ const InstancePropertiesModal = (props) => {
- + { clearButton } +
diff --git a/gui-clamp/ui-react/src/components/dialogs/ACM/InstantiationManagementModal.js b/gui-clamp/ui-react/src/components/dialogs/ACM/InstantiationManagementModal.js index 4b97748..2d87119 100644 --- a/gui-clamp/ui-react/src/components/dialogs/ACM/InstantiationManagementModal.js +++ b/gui-clamp/ui-react/src/components/dialogs/ACM/InstantiationManagementModal.js @@ -172,10 +172,12 @@ const InstantiationManagementModal = (props) => { - + instantiationName: instantiation.name, + instantiationVersion: instantiation.version + } }> + diff --git a/gui-clamp/ui-react/src/components/dialogs/ACM/__snapshots__/InstancePropertiesModal.test.js.snap b/gui-clamp/ui-react/src/components/dialogs/ACM/__snapshots__/InstancePropertiesModal.test.js.snap index a4fea2a..4791083 100644 --- a/gui-clamp/ui-react/src/components/dialogs/ACM/__snapshots__/InstancePropertiesModal.test.js.snap +++ b/gui-clamp/ui-react/src/components/dialogs/ACM/__snapshots__/InstancePropertiesModal.test.js.snap @@ -13,7 +13,8 @@ exports[`Verify InstancePropertiesModal renders correctly 1`] = ` closeLabel="Close" > - Create Tosca Instance Properties + Create + Tosca Instance Properties