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


The following commit(s) were added to refs/heads/master by this push:
     new 2b74b104 Disambiguate parameter default and template default in 
catalog config table and blueprint composer
2b74b104 is described below

commit 2b74b104e55fb470066e1ee77f08f0b9d9324db5
Author: Alex Heneveld <[email protected]>
AuthorDate: Thu Feb 13 00:11:34 2025 +0000

    Disambiguate parameter default and template default in catalog config table 
and blueprint composer
    
    If you define a parameter with default value 1, and then in your blueprint 
explicitly set the config value 2, then reference that template, "2" should be 
the effective default (but "1" might still be interesting).
---
 .../app/components/designer/designer.spec.js       |  2 ++
 .../providers/blueprint-service.provider.js        | 30 +++++++++++++++---
 .../providers/blueprint-service.provider.spec.js   |  2 ++
 .../providers/dsl-service.provider.spec.js         |  2 ++
 .../app/components/spec-editor/spec-editor.spec.js |  2 ++
 ui-modules/blueprint-composer/app/index.js         |  3 +-
 .../catalog/app/views/bundle/type/type.state.js    | 28 ++++++++++++----
 .../providers/quick-launch-overrides.provider.js   | 37 ++++++++++++++++++++--
 ui-modules/utils/quick-launch/quick-launch.js      | 23 ++------------
 9 files changed, 94 insertions(+), 35 deletions(-)

diff --git 
a/ui-modules/blueprint-composer/app/components/designer/designer.spec.js 
b/ui-modules/blueprint-composer/app/components/designer/designer.spec.js
index 8ccad6e7..67529cc4 100644
--- a/ui-modules/blueprint-composer/app/components/designer/designer.spec.js
+++ b/ui-modules/blueprint-composer/app/components/designer/designer.spec.js
@@ -27,6 +27,7 @@ import {dslServiceProvider} from 
'../providers/dsl-service.provider';
 import {blueprintServiceProvider} from 
'../providers/blueprint-service.provider';
 import {paletteDragAndDropServiceProvider} from 
'../providers/palette-dragndrop.provider';
 import {Entity} from "../util/model/entity.model";
+import {quickLaunchOverridesProvider} from 
"brooklyn-ui-utils/providers/quick-launch-overrides.provider";
 
 /**
  * Tests for the designer directive.
@@ -58,6 +59,7 @@ describe('Designer', () => {
 
         // Dependencies of the designer.
         $provide.provider('$state', {$get: () => {}}); // Produces 
'undefined', not needed just now.
+        $provide.provider('quickLaunchOverrides', 
quickLaunchOverridesProvider);
         $provide.provider('blueprintService', blueprintServiceProvider);
         $provide.provider('paletteDragAndDropService', 
paletteDragAndDropServiceProvider);
         $provide.factory('brSnackbar', brSnackbar);
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 33ab8b11..9d76f47f 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
@@ -45,14 +45,17 @@ export const COMMON_HINTS = {
 
 export function blueprintServiceProvider() {
     return {
-        $get: ['$log', '$q', '$sce', 'paletteApi', 'iconGenerator', 
'dslService', 'brBrandInfo',
+        $get: ['$log', '$q', '$sce', 'paletteApi', 'iconGenerator', 
'dslService', 'quickLaunchOverrides', 'brBrandInfo',
             function ($log, $q, $sce, paletteApi, iconGenerator, dslService, 
brBrandInfo) {
                 return new BlueprintService($log, $q, $sce, paletteApi, 
iconGenerator, dslService, brBrandInfo);
             }]
     }
 }
 
-function BlueprintService($log, $q, $sce, paletteApi, iconGenerator, 
dslService, brBrandInfo) {
+function BlueprintService($log, $q, $sce, paletteApi, iconGenerator, 
dslService, quickLaunchOverrides, brBrandInfo) {
+    const quickLaunchUtils = {}
+    quickLaunchOverrides.configureQuickLaunch(quickLaunchUtils);
+
     let blueprint = new Entity();
     let entityRelationshipProviders = {};
 
@@ -369,7 +372,12 @@ function BlueprintService($log, $q, $sce, paletteApi, 
iconGenerator, dslService,
                 : paletteApi.getType(entity.type, entity.version, 
entity.config);
 
             promise.then((data)=> {
-                deferred.resolve(populateEntityFromApiSuccess(entity, data));
+                
quickLaunchUtils.getAsCampPlan(data.plan).then(({parsedPlan})=>{
+                    deferred.resolve(populateEntityFromApiSuccess(entity, 
data, parsedPlan));
+                }).catch(function (error) {
+                    console.debug("No parsed plan available", error, data);
+                    deferred.resolve(populateEntityFromApiSuccess(entity, 
data));
+                })
             }).catch(function (error) {
                 deferred.resolve(populateEntityFromApiError(entity, error));
             });
@@ -740,7 +748,7 @@ function BlueprintService($log, $q, $sce, paletteApi, 
iconGenerator, dslService,
         entity.addParameterDefinition(null, false, false);
     }
 
-    function populateEntityFromApiSuccess(entity, data) {
+    function populateEntityFromApiSuccess(entity, data, parsedPlan) {
         function mapped(list, field) {
             let result = {};
             if (list) {
@@ -770,6 +778,20 @@ function BlueprintService($log, $q, $sce, paletteApi, 
iconGenerator, dslService,
 
         entity.miscData.set('config', data.config || []);
         entity.miscData.set('configMap', mapped(data.config, 'name'));
+        // if a template sets an explicit value for a parameter, use that as 
the default everywhere
+        const configTemplateDefaults =
+                (parsedPlan && parsedPlan['brooklyn.config']) ||
+                (parsedPlan && parsedPlan.services && 
parsedPlan.services.length==1 && parsedPlan.services[0]['brooklyn.config']) ||
+                {};
+        entity.miscData.set('configTemplateDefaults', configTemplateDefaults);
+        (data.config || []).forEach(item => {
+            const override = configTemplateDefaults[item.name];
+            if (typeof override !== 'undefined') {
+                item.defaultValueParameter = item.defaultValue;
+                item.defaultValueTemplate = override;
+                item.defaultValue = override;
+            }
+        });
         entity.miscData.set('parameters', data.parameters || []);
         entity.miscData.set('parametersMap', mapped(data.parameters, 'name'));
 
diff --git 
a/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.spec.js
 
b/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.spec.js
index a218fe1c..19e3b08d 100644
--- 
a/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.spec.js
+++ 
b/ui-modules/blueprint-composer/app/components/providers/blueprint-service.provider.spec.js
@@ -23,6 +23,7 @@ import {locationApiProvider} from 
"brooklyn-ui-utils/providers/location-api.prov
 import {iconGeneratorProvider} from 
"brooklyn-ui-utils/icon-generator/icon-generator";
 import {Entity} from "../util/model/entity.model";
 import {paletteApiProvider} from './palette-api.provider';
+import {quickLaunchOverridesProvider} from 
"brooklyn-ui-utils/providers/quick-launch-overrides.provider";
 
 
 describe('Blueprint Service', ()=> {
@@ -34,6 +35,7 @@ describe('Blueprint Service', ()=> {
         $provide.provider('paletteApi', paletteApiProvider);
         $provide.provider('iconGenerator', iconGeneratorProvider);
         $provide.provider('dslService', dslServiceProvider);
+        $provide.provider('quickLaunchOverrides', 
quickLaunchOverridesProvider);
         $provide.provider('blueprintService', blueprintServiceProvider);
         $provide.provider('brBrandInfo', {$get: () => {}});
     }));
diff --git 
a/ui-modules/blueprint-composer/app/components/providers/dsl-service.provider.spec.js
 
b/ui-modules/blueprint-composer/app/components/providers/dsl-service.provider.spec.js
index aaa0063a..dd2a932f 100644
--- 
a/ui-modules/blueprint-composer/app/components/providers/dsl-service.provider.spec.js
+++ 
b/ui-modules/blueprint-composer/app/components/providers/dsl-service.provider.spec.js
@@ -23,6 +23,7 @@ import {blueprintServiceProvider} from 
"./blueprint-service.provider";
 import {catalogApiProvider} from 
"brooklyn-ui-utils/providers/catalog-api.provider";
 import {locationApiProvider} from 
"brooklyn-ui-utils/providers/location-api.provider";
 import {iconGeneratorProvider} from 
"brooklyn-ui-utils/icon-generator/icon-generator";
+import {quickLaunchOverridesProvider} from 
"brooklyn-ui-utils/providers/quick-launch-overrides.provider";
 
 
 describe('Dsl Service', ()=> {
@@ -32,6 +33,7 @@ describe('Dsl Service', ()=> {
         $provide.provider('catalogApi', catalogApiProvider);
         $provide.provider('locationApi', locationApiProvider);
         $provide.provider('iconGenerator', iconGeneratorProvider);
+        $provide.provider('quickLaunchOverrides', 
quickLaunchOverridesProvider);
         $provide.provider('blueprintService', blueprintServiceProvider);
         $provide.provider('dslService', dslServiceProvider);
     }));
diff --git 
a/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.spec.js 
b/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.spec.js
index 03aaab54..27e20a4b 100644
--- 
a/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.spec.js
+++ 
b/ui-modules/blueprint-composer/app/components/spec-editor/spec-editor.spec.js
@@ -25,6 +25,7 @@ import {Entity} from '../util/model/entity.model';
 import {paletteApiProvider} from '../providers/palette-api.provider';
 import {dslServiceProvider} from '../providers/dsl-service.provider';
 import {blueprintServiceProvider} from 
'../providers/blueprint-service.provider';
+import {quickLaunchOverridesProvider} from 
"brooklyn-ui-utils/providers/quick-launch-overrides.provider";
 
 /**
  * Tests for the spec-editor directive.
@@ -69,6 +70,7 @@ describe('Spec Editor', () => {
         $provide.provider('brBrandInfo', {$get: () => {}});
 
         // Dependencies of the spec-editor.
+        $provide.provider('quickLaunchOverrides', 
quickLaunchOverridesProvider);
         $provide.provider('blueprintService', blueprintServiceProvider);
         $provide.provider('$state', {$get: () => {return {}}}); // Produces 
'Object {}'.
         $provide.factory('mdHelper', mdHelperFactory);
diff --git a/ui-modules/blueprint-composer/app/index.js 
b/ui-modules/blueprint-composer/app/index.js
index 2b763d1b..a2629595 100755
--- a/ui-modules/blueprint-composer/app/index.js
+++ b/ui-modules/blueprint-composer/app/index.js
@@ -75,6 +75,7 @@ import bottomSheet from 
"brooklyn-ui-utils/bottom-sheet/bottom-sheet";
 import stackViewer from 'angular-java-stack-viewer';
 import {EntityFamily} from "./components/util/model/entity.model";
 import scriptTagDecorator from 
'brooklyn-ui-utils/script-tag-non-overwrite/script-tag-non-overwrite';
+import quickLaunchOverrides from 
'brooklyn-ui-utils/providers/quick-launch-overrides.provider';
 
 import brandAngularJs from 'brand-angular-js';
 
@@ -85,7 +86,7 @@ angular.module('brooklynBlueprintComposer', [ngAnimate, 
ngResource, ngCookies, n
     brYamlEditor, brUtils, brSpecEditor, brooklynCatalogSaver, brooklynApi, 
bottomSheet, stackViewer, brDragndrop, mdHelper,
     customActionDirective, customConfigSuggestionDropdown, paletteApiProvider, 
paletteServiceProvider, blueprintLoaderApiProvider,
     breadcrumbs, catalogSelector, designer, objectCache, entityFilters, 
locationFilter, actionService, tabService, composerOverrides, quickFix, 
blueprintService,
-    dslService, paletteDragAndDropService, recentlyUsedService, 
scriptTagDecorator, brandAngularJs])
+    dslService, paletteDragAndDropService, recentlyUsedService, 
scriptTagDecorator, quickLaunchOverrides, brandAngularJs])
     .provider('catalogApi', catalogApiProvider)
     .filter('dslParamLabel', ['$filter', dslParamLabelFilter])
     .config(['$urlRouterProvider', '$stateProvider', '$logProvider', 
'$compileProvider', applicationConfig])
diff --git a/ui-modules/catalog/app/views/bundle/type/type.state.js 
b/ui-modules/catalog/app/views/bundle/type/type.state.js
index dc2eb12b..c91da24d 100644
--- a/ui-modules/catalog/app/views/bundle/type/type.state.js
+++ b/ui-modules/catalog/app/views/bundle/type/type.state.js
@@ -32,8 +32,7 @@ import {HIDE_INTERSTITIAL_SPINNER_EVENT} from 
'brooklyn-ui-utils/interstitial-sp
 
 const MODULE_NAME = 'type.state';
 
-angular.module(MODULE_NAME, [ngSanitize, brooklynCatalogApi, 
brooklynQuickLaunch, brooklynTypeItem, brUtils,
-    brTable, mdHelper])
+angular.module(MODULE_NAME, [ngSanitize, brooklynCatalogApi, 
brooklynQuickLaunch, brooklynTypeItem, brUtils, brTable, mdHelper])
     .provider('locationApi', locationApiProvider)
     .config(['$stateProvider', typeStateConfig]);
 
@@ -43,7 +42,8 @@ export const bundleState = {
     name: 'bundle.type',
     url: '/types/:typeId/:typeVersion',
     template: template,
-    controller: ['$scope', '$state', '$stateParams', '$q', '$uibModal', 
'brBrandInfo', 'brUtilsGeneral', 'brSnackbar', 'catalogApi', 'mdHelper', 
typeController],
+    controller: ['$scope', '$state', '$stateParams', '$q', '$uibModal', 
'brBrandInfo', 'brUtilsGeneral', 'brSnackbar', 'catalogApi', 'mdHelper', 
'quickLaunchOverrides',
+        typeController],
     controllerAs: 'ctrl'
 };
 
@@ -51,7 +51,10 @@ export function typeStateConfig($stateProvider) {
     $stateProvider.state(bundleState);
 }
 
-export function typeController($scope, $state, $stateParams, $q, $uibModal, 
brBrandInfo, brUtilsGeneral, brSnackbar, catalogApi, mdHelper) {
+export function typeController($scope, $state, $stateParams, $q, $uibModal, 
brBrandInfo, brUtilsGeneral, brSnackbar, catalogApi, mdHelper, 
quickLaunchOverrides) {
+    const quickLaunchHelper = {}
+    quickLaunchOverrides.configureQuickLaunch(quickLaunchHelper, $scope);
+
     $scope.state = {
         default: 2,
         limit: 2
@@ -69,6 +72,7 @@ export function typeController($scope, $state, $stateParams, 
$q, $uibModal, brBr
         );
     };
 
+    $scope.isNonNull = (o) => typeof o !== 'undefined' && o!=null;
     $scope.isNonEmpty = (o) => brUtilsGeneral.isNonEmpty(o);
 
     $scope.composerUrl = brBrandInfo.blueprintComposerBaseUrl;
@@ -122,7 +126,7 @@ export function typeController($scope, $state, 
$stateParams, $q, $uibModal, brBr
         catalogApi.getBundleType($stateParams.bundleId, 
$stateParams.bundleVersion, $stateParams.typeId, $stateParams.typeVersion),
         catalogApi.getTypeVersions($stateParams.typeId),
     ])
-    .then(responses => {
+    .then(async responses => {
         $scope.bundle = responses[0];
         $scope.type = responses[1];
 
@@ -133,6 +137,12 @@ export function typeController($scope, $state, 
$stateParams, $q, $uibModal, brBr
         // then we should replace the low-level implementation plan (probably 
auto-generated) with 
         // the first spec list item (which is what the user created)
         var preferredContents = entitySpec.plan && entitySpec.plan.data;
+        const { parsedPlan } = await 
quickLaunchHelper.getAsCampPlan(entitySpec.plan);
+        $scope.templateConfigValues =
+            (parsedPlan && parsedPlan['brooklyn.config']) ||
+            (parsedPlan && parsedPlan.services && 
parsedPlan.services.length==1 && parsedPlan.services[0]['brooklyn.config']) ||
+            {};
+
         var preferredFormat = entitySpec.plan && entitySpec.plan.format;
         if (!preferredFormat) {
           if (specItem && specItem.format && specItem.contents) {
@@ -213,8 +223,12 @@ export function typeController($scope, $state, 
$stateParams, $q, $uibModal, brBr
     addColumn({
         config: {
             field: 'defaultValue',
-            colspan: 3,
-            template: '<div class="mozilla-td-scroll-fix"><samp>{{ 
item.defaultValue }}</samp></div>',
+            colspan: 5,
+            template: '<div class="mozilla-td-scroll-fix">' +
+                '<p 
ng-if="isNonNull(templateConfigValues[item.name])"><samp>{{ 
templateConfigValues[item.name] }}</samp>' +
+                    '<span class="label-color oneline label label-info" 
style="margin-left: 1em;">template</span></p>' +
+                '<p ng-if="isNonNull(item.defaultValue)"><samp>{{ 
item.defaultValue }}</samp></span>' +
+                    '<span ng-if="isNonNull(templateConfigValues[item.name])" 
class="label-color oneline label label-supertype" style="margin-left: 
1em;">parameter</span></div>',
         },
     });
 
diff --git a/ui-modules/utils/providers/quick-launch-overrides.provider.js 
b/ui-modules/utils/providers/quick-launch-overrides.provider.js
index 6af02d76..d0b46e45 100644
--- a/ui-modules/utils/providers/quick-launch-overrides.provider.js
+++ b/ui-modules/utils/providers/quick-launch-overrides.provider.js
@@ -17,6 +17,7 @@
  * under the License.
  */
 import angular from 'angular';
+import yaml from 'js-yaml';
 
 const MODULE_NAME = 'brooklyn.quick-launch-overrides-service';
 
@@ -25,10 +26,42 @@ angular.module(MODULE_NAME, [])
 
 export default MODULE_NAME;
 
-function quickLaunchOverridesProvider() {
+// visible for testing
+export function quickLaunchOverridesProvider() {
     // callers can do angular.config(['quickLaunchOverridesProvider', function 
(provider) { provider.add({ ... }) })
     // to set various configuration. to see what configuration is supported, 
grep for quickLaunchOverrides in this project.
-    var result = {};
+    var methods = {
+        convertPlanFromOriginalFormat: plan => plan,
+        convertPlanToPreferredFormat: plan => plan,
+    }
+    methods.actor = methods;
+    methods.getAsCampPlan = async (plan)=>{
+        let campPlanYaml;
+        let campPlanModified = false;
+        try {
+            campPlanYaml = (await 
methods.actor.convertPlanFromOriginalFormat(plan)).data;
+            campPlanModified = plan.data != campPlanYaml;
+        } catch (error) {
+            console.warn("Unable to restore CAMP format", error, plan);
+            campPlanYaml = plan.data;
+        }
+        let parsedPlan = null;
+        try {
+            parsedPlan = yaml.safeLoad(campPlanYaml);
+        } catch (e) {
+            console.log('Failed to parse YAML', e)
+        }
+        return { campPlanModified, campPlanYaml, parsedPlan };
+    };
+    const result = {}
+
+    result.configureQuickLaunchOverride = () => {}
+    result.configureQuickLaunch = (quickLaunch, scope, httpCaller) => {
+        methods.actor = quickLaunch;
+        Object.assign(quickLaunch, methods);
+        result.configureQuickLaunchOverride(quickLaunch, scope, httpCaller);
+    }
+
     return {
         $get: () => result,
         add: (props) => angular.extend(result, props),
diff --git a/ui-modules/utils/quick-launch/quick-launch.js 
b/ui-modules/utils/quick-launch/quick-launch.js
index e692c3ea..68d48384 100644
--- a/ui-modules/utils/quick-launch/quick-launch.js
+++ b/ui-modules/utils/quick-launch/quick-launch.js
@@ -86,8 +86,6 @@ export function quickLaunchDirective() {
                 }
             };
 
-        quickLaunch.convertPlanToPreferredFormat = 
convertPlanToPreferredFormat;
-        quickLaunch.convertPlanFromOriginalFormat = 
convertPlanFromOriginalFormat;
         quickLaunch.getComposerHref = getComposerHref;
         quickLaunch.getPlanObject = getPlanObject;
         quickLaunch.getCampPlanObjectFromForm = getCampPlanObjectFromForm;
@@ -182,21 +180,7 @@ export function quickLaunchDirective() {
             $scope.editorYaml = $scope.app.plan.data;
             $scope.editorFormat = quickLaunch.getOriginalPlanFormat();
 
-            let campPlanYaml;
-            let campPlanModified = false;
-            try {
-                campPlanYaml = (await 
quickLaunch.convertPlanFromOriginalFormat($scope.app.plan)).data;
-                campPlanModified = $scope.app.plan.data != campPlanYaml;
-            } catch (error) {
-                console.warn("Unable to restore CAMP format", error, 
$scope.app.plan);
-                campPlanYaml = $scope.app.plan.data;
-            }
-            let parsedPlan = null;
-            try {
-                parsedPlan = yaml.safeLoad(campPlanYaml);
-            } catch (e) {
-                console.log('Failed to parse YAML', e)
-            }
+            const {parsedPlan, campPlanModified} = await 
quickLaunch.getAsCampPlan($scope.app.plan);
 
             // enable wizard if it's parseble and doesn't specify a location
             // (if it's not parseable, or it specifies a location, then the 
YAML view is displayed)
@@ -292,7 +276,7 @@ export function quickLaunchDirective() {
         });
 
         // Configure this controller from outside. Customization
-        (quickLaunchOverrides.configureQuickLaunch || function () 
{})(quickLaunch, $scope, $http);
+        quickLaunchOverrides.configureQuickLaunch(quickLaunch, $scope, $http);
 
         // === Private members below ====================
 
@@ -559,9 +543,6 @@ export function quickLaunchDirective() {
                 });
         }
 
-        function convertPlanToPreferredFormat(plan) { return plan; }
-        function convertPlanFromOriginalFormat(plan) { return plan; }
-
         function getOriginalPlanFormat(scope) {
             scope = scope || $scope;
             return scope && scope.app && scope.app.plan && 
scope.app.plan.format;

Reply via email to