Merge pull request #349 from algairim/improvements/catalog-saver

Catalog-saver improvements
diff --git a/ui-modules/app-inspector/app/components/stream/stream.directive.js b/ui-modules/app-inspector/app/components/stream/stream.directive.js
index 6d17d24..60fe549 100644
--- a/ui-modules/app-inspector/app/components/stream/stream.directive.js
+++ b/ui-modules/app-inspector/app/components/stream/stream.directive.js
@@ -123,7 +123,7 @@
                 }
 
                 // 2. Update the stream data holder in this directive.
-                $scope.stream = response.data;
+                $scope.stream = typeof response.data === 'object' ? JSON.stringify(response.data, null, 2) : response.data;
 
                 // Check if to drop filters, because of `ng-repeat` performance limits.
                 if ($scope.cliXmlIdentified && !$scope.cliXml && !$scope.filteredStream.length && $scope.stream.length > 99999) {
diff --git a/ui-modules/app-inspector/app/views/main/inspect/activities/detail/detail.controller.js b/ui-modules/app-inspector/app/views/main/inspect/activities/detail/detail.controller.js
index 5efaff3..92549d5 100644
--- a/ui-modules/app-inspector/app/views/main/inspect/activities/detail/detail.controller.js
+++ b/ui-modules/app-inspector/app/views/main/inspect/activities/detail/detail.controller.js
@@ -77,8 +77,8 @@
             $log.warn('Error loading activity for '+activityId, error);
             // prefer this simpler error message over the specific ones below
             vm.errorBasic = true;
-            vm.error = $sce.trustAsHtml('Cannot load activity with ID: <b>' + _.escape(activityId+' <i>x</i>') + '</b> <br/><br/>' +
-                'Task may have completed and been cleared from memory. Details may be available in logs.');
+            vm.error = $sce.trustAsHtml('Cannot load activity with ID: <b>' + _.escape(activityId) + '</b> <br/><br/>' +
+                'Task may have completed and been cleared from memory, or may not have been run. Details may be available in logs.');
         });
 
         activityApi.activityChildren(activityId).then((response)=> {
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 9bebe04..4307b4d 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
@@ -487,7 +487,7 @@
                         }
                         break;
                     case 'regex':
-                        if (isSet() && !(new RegExp(args).test(val))) {
+                        if (isSet() && !(new RegExp(args).test(val()))) {
                             message = `<samp>${config.name}</samp> does not match the required format: <samp>${args}</samp>`;
                         }
                         break;
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 5d88aaf..7fd80c9 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
@@ -754,7 +754,7 @@
             delete paramMapped['default'];
         }
         // making sure we assign to empty object to avoid conflicts with config items' properties like `type`
-        allConfig[key] = Object.assign({}, configDef, paramMapped, overwrite ? null : configDef);
+        allConfig[key] = Object.assign({}, configDef, paramMapped, overwrite ? configDef: null);
     }
     if (!skipUpdatesDuringBatch) {
         this.miscData.set('config', Object.values(allConfig));
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 06251c9..c84d32c 100644
--- a/ui-modules/catalog/app/views/bundle/type/type.state.js
+++ b/ui-modules/catalog/app/views/bundle/type/type.state.js
@@ -185,7 +185,7 @@
         field: 'description',
         width: 150,
         colspan: 6,
-        template: '<div class="mozilla-td-scroll-fix"><md-field raw-data="::item[column.field]"></md-field></div>',
+        template: '<div class="mozilla-td-scroll-fix"><md-field raw-data="item[column.field]"></md-field></div>',
         tdClass: 'column-for-description',
     });
 
diff --git a/ui-modules/utils/md-helper/index.js b/ui-modules/utils/md-helper/index.js
index a8f077a..46cdc6b 100644
--- a/ui-modules/utils/md-helper/index.js
+++ b/ui-modules/utils/md-helper/index.js
@@ -35,9 +35,9 @@
     return {
         restrict: 'E',
         scope: {
-            data: '<',
-            rawData: '<',
-            rawItem: '<',
+            data: '=?',
+            rawData: '=?',
+            rawItem: '=?',
         },
         controller: ['$scope', populateData],
         template: `
@@ -54,9 +54,9 @@
     return {
         restrict: 'E',
         scope: {
-            data: '<',
-            rawData: '<',
-            rawItem: '<',
+            data: '=?',
+            rawData: '=?',
+            rawItem: '=?',
         },
         controller: ['$scope', populateData],
         template: `
@@ -70,9 +70,9 @@
     return {
         restrict: 'E',
         scope: {
-            data: '<',
-            rawData: '<',
-            rawItem: '<',
+            data: '=?',
+            rawData: '=?',
+            rawItem: '=?',
         },
         controller: ['$scope', populateData],
         template: `
@@ -89,9 +89,9 @@
     return {
         restrict: 'E',
         scope: {
-            data: '<',
-            rawData: '<',
-            rawItem: '<',
+            data: '=?',
+            rawData: '=?',
+            rawItem: '=?',
         },
         controller: ['$scope', populateData],
         // for multiline, collapse margin from children eg an <h1> first element, inserting then removing a 24px margin
@@ -114,7 +114,10 @@
         if (!$scope.rawData && $scope.rawItem) {
             $scope.rawData = $scope.rawItem.description;
         }
-        $scope.data = analyze($scope.rawData, nameFieldValues($scope.rawItem));
+        const updateData = () => $scope.data = analyze($scope.rawData, nameFieldValues($scope.rawItem));
+        $scope.$watch('rawData', updateData);
+        $scope.$watch('rawItem', updateData);
+        updateData();
     }
 }