diff options
Diffstat (limited to 'gui-clamp/ui-react/src/components/dialogs/ControlLoop/utils')
-rw-r--r-- | gui-clamp/ui-react/src/components/dialogs/ControlLoop/utils/CommissioningUtils.js | 178 | ||||
-rw-r--r-- | gui-clamp/ui-react/src/components/dialogs/ControlLoop/utils/CommissioningUtils.test.js | 94 |
2 files changed, 272 insertions, 0 deletions
diff --git a/gui-clamp/ui-react/src/components/dialogs/ControlLoop/utils/CommissioningUtils.js b/gui-clamp/ui-react/src/components/dialogs/ControlLoop/utils/CommissioningUtils.js new file mode 100644 index 0000000..2d98598 --- /dev/null +++ b/gui-clamp/ui-react/src/components/dialogs/ControlLoop/utils/CommissioningUtils.js @@ -0,0 +1,178 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +import { JSONEditor } from "@json-editor/json-editor"; +import { Alert } from "react-bootstrap"; +import React from "react"; + +const CommissioningUtils = { + makeSchemaForCommonProperties: (commonProps) => { + const commonPropsArr = Object.entries(commonProps) + + const newSchemaObject = {} + + newSchemaObject.title = "CommonProperties" + newSchemaObject.type = "object" + newSchemaObject.properties = {} + + commonPropsArr.forEach(([templateKey, template]) => { + + const propertiesObject = {} + Object.entries(template.properties).forEach(([propKey, prop]) => { + + propertiesObject[propKey] = { + type: CommissioningUtils.getType(prop.type) + } + + }) + newSchemaObject.properties[templateKey] = { + options: { + "collapsed": true + }, + properties: propertiesObject + } + }) + + return newSchemaObject + }, + getType: (propertyType) => { + switch (propertyType) + { + case "string": + return "string" + case "integer": + return "integer" + case "list": + return "array" + case "object": + return "object" + default: + return "object" + } + }, + createJsonEditor: (toscaModel, editorData) => { + JSONEditor.defaults.options.collapse = false; + + return new JSONEditor(document.getElementById("editor"), + { + schema: toscaModel, + startval: editorData, + theme: 'bootstrap4', + iconlib: 'fontawesome5', + object_layout: 'normal', + disable_properties: false, + disable_edit_json: true, + disable_array_reorder: true, + disable_array_delete_last_row: true, + disable_array_delete_all_rows: false, + array_controls_top: true, + keep_oneof_values: false, + collapsed: false, + show_errors: 'always', + display_required_only: false, + show_opt_in: false, + prompt_before_delete: true, + required_by_default: false, + }) + }, + renderJsonEditor: async (template, commonProps) => { + + const fullTemplate = await template.json() + + let toscaInitialValues + const allNodeTemplates = fullTemplate.topology_template.node_templates + const shortenedNodeTemplatesObjectStartValues = {} + // Get the common properties to construct a schema + // Get valid start values at the same time + const commonNodeTemplatesJson = await commonProps.json().then(data => { + const nodeTemplatesArray = Object.entries(data) + const shortenedNodeTemplatesObject = {} + nodeTemplatesArray.forEach(([key, temp]) => { + const currentNodeTemplate = allNodeTemplates[key] + const propertiesObject = { + properties: temp.properties + } + + shortenedNodeTemplatesObject[key] = propertiesObject + + const propertiesStartValues = {} + + // Get all the existing start values to populate the properties in the schema + Object.entries(propertiesObject.properties).forEach(([propKey, prop]) => { + propertiesStartValues[propKey] = currentNodeTemplate.properties[propKey] + }) + + shortenedNodeTemplatesObjectStartValues[key] = propertiesStartValues + + }) + + toscaInitialValues = shortenedNodeTemplatesObjectStartValues; + return shortenedNodeTemplatesObject; + }) + + const propertySchema = CommissioningUtils.makeSchemaForCommonProperties(commonNodeTemplatesJson); + + const editorTemp = CommissioningUtils.createJsonEditor(propertySchema, shortenedNodeTemplatesObjectStartValues); + + return { + fullTemplate: fullTemplate, + propertySchema: propertySchema, + editorTemp: editorTemp, + toscaInitialValues: toscaInitialValues + } + }, + getAlertMessages: async (response) => { + if (response.ok) { + return(<Alert variant="success"> + <Alert.Heading>Commissioning Success</Alert.Heading> + <p>Altered Template was Successfully Uploaded</p> + <hr/> + </Alert>); + } + else { + return(<Alert variant="danger"> + <Alert.Heading>Commissioning Failure</Alert.Heading> + <p>Updated Template Failed to Upload</p> + <p>Status code: { await response.status }: { response.statusText }</p> + <p>Response Text: { await response.text() }</p> + <hr/> + </Alert>); + } + }, + + updateTemplate: async (userAddedCommonPropValues, fullToscaTemplate) => { + const nodeTemplates = fullToscaTemplate.topology_template.node_templates + const commonPropertyDataEntries = Object.entries(userAddedCommonPropValues) + + // This replaces the values for properties in the full tosca template + // that will be sent up to the api with the entries the user provided. + commonPropertyDataEntries.forEach(([templateKey, values]) => { + Object.entries(values).forEach(([propKey, propVal]) => { + nodeTemplates[templateKey].properties[propKey] = propVal + }) + }) + + fullToscaTemplate.topology_template.node_templates = nodeTemplates + + alert('Changes saved. Commission When Ready...') + return fullToscaTemplate + } +} + +export default CommissioningUtils; diff --git a/gui-clamp/ui-react/src/components/dialogs/ControlLoop/utils/CommissioningUtils.test.js b/gui-clamp/ui-react/src/components/dialogs/ControlLoop/utils/CommissioningUtils.test.js new file mode 100644 index 0000000..8304ecb --- /dev/null +++ b/gui-clamp/ui-react/src/components/dialogs/ControlLoop/utils/CommissioningUtils.test.js @@ -0,0 +1,94 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +import commonProps from "../testFiles/commonProps.json"; +import fullTemp from "../testFiles/fullTemplate.json"; +import CommissioningUtils from "./CommissioningUtils"; +import React from "react"; + +const commonProperties = JSON.parse(JSON.stringify(commonProps)) +const fullTemplate = JSON.parse(JSON.stringify(fullTemp)) + +describe('Verify CommissioningUtils', () => { + + const fullTemplatePromise = { + ok: true, + status: 200, + text: () => "OK", + json: () => { + return Promise.resolve(fullTemplate) + } + } + + const commonPropertiesPromise = { + ok: true, + status: 200, + text: () => "OK", + json: () => { + return Promise.resolve(commonProperties) + } + } + + it('test renderJsonEditor output is correct', async () => { + // Have to mock "editor" dom element for json editor to work in testing + document.body.innerHTML = '<div id="editor"></div>'; + + await expect((await CommissioningUtils.renderJsonEditor(fullTemplatePromise, commonPropertiesPromise)).editorTemp).toBeTruthy() + await expect((await CommissioningUtils.renderJsonEditor(fullTemplatePromise, commonPropertiesPromise)).fullTemplate).toBeTruthy() + await expect((await CommissioningUtils.renderJsonEditor(fullTemplatePromise, commonPropertiesPromise)).propertySchema).toBeTruthy() + await expect((await CommissioningUtils.renderJsonEditor(fullTemplatePromise, commonPropertiesPromise)).toscaInitialValues).toBeTruthy() + }) + + it('test the getType method object type', () => { + expect(CommissioningUtils.getType("object")).toBe("object") + }) + + it('test getAlertMessages with response ok', async () => { + const response = { + ok: true, + status: 200, + text: () => { + return Promise.resolve("OK") + }, + json: () => { + return Promise.resolve("{}") + } + } + + await expect(JSON.stringify(await CommissioningUtils.getAlertMessages(response))).toContain("Commissioning Success") + }) + + it('test getAlertMessages with response not ok', async () => { + const response = { + ok: false, + status: 200, + text: () => { + return Promise.resolve("Error") + }, + json: () => { + return Promise.resolve("{}") + } + } + + await expect(JSON.stringify(await CommissioningUtils.getAlertMessages(response))).toContain("Commissioning Failure") + }) + + + } +) |