aboutsummaryrefslogtreecommitdiffstats
path: root/gui-clamp/ui-react/src/components/dialogs/ControlLoop/utils
diff options
context:
space:
mode:
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.js178
-rw-r--r--gui-clamp/ui-react/src/components/dialogs/ControlLoop/utils/CommissioningUtils.test.js94
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")
+ })
+
+
+ }
+)