You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2021/04/27 15:12:55 UTC

[brooklyn-ui] 13/15: update miscData.config on parameter refresh, and do validation after quick fixes

This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-ui.git

commit e189b375524677ed86f5863d784ffbd9397901d5
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Tue Apr 27 12:57:29 2021 +0100

    update miscData.config on parameter refresh, and do validation after quick fixes
    
    validation pathway working nicely now
---
 .../providers/blueprint-service.provider.js        | 35 +++++------
 .../app/components/quick-fix/quick-fix.js          |  1 -
 .../spec-editor/spec-editor.directive.js           |  2 +
 .../app/components/util/model/entity.model.js      | 71 ++++++++++++----------
 4 files changed, 57 insertions(+), 52 deletions(-)

diff --git a/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.js b/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.js
index 0132a85..47e7fa3 100644
--- a/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.js
+++ b/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.js
@@ -297,19 +297,23 @@ function BlueprintService($log, $q, $sce, paletteApi, iconGenerator, dslService)
             }).catch(function (error) {
                 deferred.resolve(populateEntityFromApiError(entity, error));
             });
-        } else if (entity.parent) {
-            entity.clearIssues({group: 'type'}).addIssue(Issue.builder().group('type').message('Entity needs a type').level(ISSUE_LEVEL.WARN).build());
-            entity.miscData.set('sensors', []);
-            entity.miscData.set('traits', []);
-            deferred.resolve(entity);
-            addUnlistedConfigKeysDefinitions(entity);
-            addUnlistedParameterDefinitions(entity);
         } else {
+            if (entity.parent) {
+                entity.clearIssues({group: 'type'}).addIssue(Issue.builder().group('type').message('Entity needs a type').level(ISSUE_LEVEL.WARN).build());
+            }
             entity.miscData.set('sensors', []);
             entity.miscData.set('traits', []);
-            deferred.resolve(entity);
+
+            entity.clearIssues({group: 'config'});
+            entity.miscData.set('config', []);
+            entity.miscData.set('configMap', {});
+            entity.miscData.set('parameters', []);
+            entity.miscData.set('parametersMap', {});
+
             addUnlistedConfigKeysDefinitions(entity);
             addUnlistedParameterDefinitions(entity);
+
+            deferred.resolve(entity);
         }
 
         return deferred.promise;
@@ -585,7 +589,6 @@ function BlueprintService($log, $q, $sce, paletteApi, iconGenerator, dslService)
     }
 
     function addConfigKeyDefinition(entity, key) {
-        // TODO return type, and below
         entity.addConfigKeyDefinition(key, false);
     }
 
@@ -597,24 +600,18 @@ function BlueprintService($log, $q, $sce, paletteApi, iconGenerator, dslService)
         // copy config key definitions set on this entity into the miscData aggregated view
         let allConfig = entity.miscDataOrDefault('configMap', {});
         entity.config.forEach((value, key) => {
-            if (!allConfig[key]) {
-                entity.addConfigKeyDefinition(key);
-            }
+            entity.addConfigKeyDefinition(key, false, true);
         });
-        entity.miscData.set('config', Object.values(allConfig));
-
+        entity.addConfigKeyDefinition(null, false, false);
     }
 
     function addUnlistedParameterDefinitions(entity) {
         // copy parameter definitions set on this entity into the miscData aggregated view;
         // see discussions in PR 112 about whether this is necessary and/or there is a better way; but note, this is much updated since
-        let allParams = entity.miscDataOrDefault('parametersMap', {});
         entity.parameters.forEach((param) => {
-            if (!allParams[param.name]) {
-                allParams[param.name] = param;
-            }
+            entity.addParameterDefinition(param, false, true);
         });
-        entity.miscData.set('parameters', Object.values(allParams));
+        entity.addParameterDefinition(null, false, false);
     }
 
     function populateEntityFromApiSuccess(entity, data) {
diff --git a/ui-modules/blueprint-composer/app/components/quick-fix/quick-fix.js b/ui-modules/blueprint-composer/app/components/quick-fix/quick-fix.js
index ffcaa60..5204052 100644
--- a/ui-modules/blueprint-composer/app/components/quick-fix/quick-fix.js
+++ b/ui-modules/blueprint-composer/app/components/quick-fix/quick-fix.js
@@ -124,7 +124,6 @@ function proposeSetFrom() {
 
         let createable = qfdef['source-key-createable'];
 
-        // TODO if root param is required, show error
         // TODO make default id contain type name
         // TODO show default id if no id present
 
diff --git a/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.directive.js b/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.directive.js
index b1e556f..1f71e62 100644
--- a/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.directive.js
+++ b/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.directive.js
@@ -268,6 +268,7 @@ export function specEditorDirective($rootScope, $templateCache, $injector, $sani
 
         scope.applyQuickFix = (issue, fix) => {
             fix.apply(issue, scope.model);
+            blueprintService.refreshBlueprintMetadata();
         }
 
         scope.getObjectSize = (object) => {
@@ -1217,6 +1218,7 @@ export function specEditorDirective($rootScope, $templateCache, $injector, $sani
             if (scope.state.parameters.focus === name) {
                 scope.state.parameters.focus = '';
             }
+            blueprintService.refreshBlueprintMetadata(scope.model);
         }
     }
 }
diff --git a/ui-modules/blueprint-composer/app/components/util/model/entity.model.js b/ui-modules/blueprint-composer/app/components/util/model/entity.model.js
index 1eb2343..71a5912 100644
--- a/ui-modules/blueprint-composer/app/components/util/model/entity.model.js
+++ b/ui-modules/blueprint-composer/app/components/util/model/entity.model.js
@@ -653,46 +653,53 @@ function addConfig(key, value) {
     }
 }
 
-function addConfigKeyDefinition(param, overwrite) {
-    if (typeof param === 'string') {
-        param = {
-            "name": param,
-            "label": param,
-            "description": "",
-            "priority": 1,
-            "pinned": true,
-            "type": "java.lang.String",
-            "constraints": [],
-        };
-        overwrite = false;
-    }
-    let key = (param || {}).name;
-    if (!key) throw new Error("'name' field must be included when adding parameter; was", param);
-
+function addConfigKeyDefinition(param, overwrite, skipUpdatesDuringBatch) {
     let allConfig = this.miscDataOrDefault('configMap', {});
-    allConfig[key] = Object.assign(allConfig[key] || {}, param, overwrite ? null : allConfig[key]);
-    this.miscData.set('config', Object.values(allConfig));
+    if (param) {
+        if (typeof param === 'string') {
+            param = {
+                "name": param,
+                "label": param,
+                "description": "",
+                "priority": 1,
+                "pinned": true,
+                "type": "java.lang.String",
+                "constraints": [],
+            };
+            overwrite = false;
+        }
+        let key = (param || {}).name;
+        if (!key) throw new Error("'name' field must be included when adding parameter; was", param);
+
+        allConfig[key] = Object.assign(allConfig[key] || {}, param, overwrite ? null : allConfig[key]);
+    }
+    if (!skipUpdatesDuringBatch) {
+        this.miscData.set('config', Object.values(allConfig));
+    }
 
     this.touch();
     return this;
 }
 
-function addParameterDefinition(param, overwrite) {
-    if (typeof param === 'string') {
-        param = {name: key, type: 'string'};
-        overwrite = false;
-    }
-    let key = (param || {}).name;
-    if (!key) throw new Error("'name' field must be included when adding parameter");
-
+function addParameterDefinition(param, overwrite, skipUpdatesDuringBatch) {
     let allParams = this.miscDataOrDefault('parametersMap', {});
-    allParams[key] = Object.assign(allParams[key] || {}, param, overwrite ? null : allParams[key]);
-    this.miscData.set('parameters', Object.values(allParams));
+    if (param) {
+        if (typeof param === 'string') {
+            param = {name: key, type: 'string'};
+            overwrite = false;
+        }
+        let key = (param || {}).name;
+        if (!key) throw new Error("'name' field must be included when adding parameter");
+
+        param = allParams[key] = Object.assign(allParams[key] || {}, param, overwrite ? null : allParams[key]);
 
-    let eps = PARAMETERS.get(this);
-    this.updateParameter(key, allParams[key], true);
+        this.updateParameter(key, param, true);
+    }
+    if (!skipUpdatesDuringBatch) {
+        this.miscData.set('parameters', Object.values(allParams));
+    }
 
-    this.addConfigKeyDefinition(allParams[key], overwrite);
+    this.addConfigKeyDefinition(param, overwrite, skipUpdatesDuringBatch);
 
     this.touch();
     return this;
@@ -721,7 +728,7 @@ function removeConfig(key) {
 }
 
 /**
- * Remove an entry from brooklyn.parameters
+ * Remove an entry from brooklyn.parameters; note the model needs an update after this
  * @param {string} name
  * @returns {Entity}
  */