Parcourir la source

Trying to make progres on persisting selection state, restoring selection state for new multi variable dropdown, proving to be really complex

Torkel Ödegaard il y a 10 ans
Parent
commit
b5a846154a

+ 43 - 45
public/app/directives/variableValueSelect.js

@@ -13,24 +13,20 @@ function (angular, app, _) {
       var vm = this;
       var vm = this;
 
 
       vm.show = function() {
       vm.show = function() {
-        vm.oldLinkText = vm.variable.current.text;
+        vm.oldVariableText = vm.variable.current.text;
         vm.highlightIndex = -1;
         vm.highlightIndex = -1;
 
 
         var currentValues = vm.variable.current.value;
         var currentValues = vm.variable.current.value;
-
         if (_.isString(currentValues)) {
         if (_.isString(currentValues)) {
           currentValues  = [currentValues];
           currentValues  = [currentValues];
         }
         }
 
 
         vm.options = _.map(vm.variable.options, function(option) {
         vm.options = _.map(vm.variable.options, function(option) {
-          if (_.indexOf(currentValues, option.value) >= 0) {
-            option.selected = true;
-          }
+          if (_.indexOf(currentValues, option.value) >= 0) { option.selected = true; }
           return option;
           return option;
         });
         });
 
 
-        vm.search = {query: '', options: vm.options};
-        vm.selectedValuesCount = currentValues.length;
+        vm.selectedValues = _.filter(vm.options, {selected: true});
         vm.selectedTags = vm.selectedTags || [];
         vm.selectedTags = vm.selectedTags || [];
 
 
         if (!vm.tags) {
         if (!vm.tags) {
@@ -39,14 +35,26 @@ function (angular, app, _) {
           });
           });
         }
         }
 
 
+        vm.search = {query: '', options: vm.options};
         vm.dropdownVisible = true;
         vm.dropdownVisible = true;
       };
       };
 
 
       vm.updateLinkText = function() {
       vm.updateLinkText = function() {
+        // var currentValues = vm.variable.current.text;
+        //
+        // if (vm.variable.current.tags) {
+        //   selectedOptions = _.filter(selectedOptions, function(test) {
+        //     for (var i = 0; i < vm.variable.current.tags; i++) {
+        //       var tag = vm.selectedTags[i];
+        //       if (_.indexOf(tag.values, test.text) !== -1) {
+        //         return false;
+        //       }
+        //     }
+        //     return true;
+        //   });
+        // }
+        //
         vm.linkText = vm.variable.current.text;
         vm.linkText = vm.variable.current.text;
-        if (vm.oldLinkText && vm.oldLinkText !== vm.linkText) {
-          vm.onUpdated();
-        }
       };
       };
 
 
       vm.clearSelections = function() {
       vm.clearSelections = function() {
@@ -62,17 +70,13 @@ function (angular, app, _) {
         var tagValuesPromise;
         var tagValuesPromise;
         if (!tag.values) {
         if (!tag.values) {
           tagValuesPromise = vm.getValuesForTag({tagKey: tag.text});
           tagValuesPromise = vm.getValuesForTag({tagKey: tag.text});
-          // if (tag.text === 'backend') {
-          //   tag.values = ['backend_01', 'backend_02', 'backend_03', 'backend_04'];
-          // } else {
-          //   tag.values = ['web_server_01', 'web_server_02', 'web_server_03', 'web_server_04'];
-          // }
         } else {
         } else {
           tagValuesPromise = $q.when(tag.values);
           tagValuesPromise = $q.when(tag.values);
         }
         }
 
 
         tagValuesPromise.then(function(values) {
         tagValuesPromise.then(function(values) {
           tag.values = values;
           tag.values = values;
+          tag.valuesText = values.join(', ');
           _.each(vm.options, function(option) {
           _.each(vm.options, function(option) {
             if (_.indexOf(tag.values, option.value) !== -1) {
             if (_.indexOf(tag.values, option.value) !== -1) {
               option.selected = tag.selected;
               option.selected = tag.selected;
@@ -105,7 +109,7 @@ function (angular, app, _) {
         vm.highlightIndex = (vm.highlightIndex + direction) % vm.search.options.length;
         vm.highlightIndex = (vm.highlightIndex + direction) % vm.search.options.length;
       };
       };
 
 
-      vm.optionSelected = function(option, event, commitChange, excludeOthers) {
+      vm.selectValue = function(option, event, commitChange, excludeOthers) {
         if (!option) { return; }
         if (!option) { return; }
 
 
         option.selected = !option.selected;
         option.selected = !option.selected;
@@ -140,43 +144,34 @@ function (angular, app, _) {
       };
       };
 
 
       vm.selectionsChanged = function(commitChange) {
       vm.selectionsChanged = function(commitChange) {
-        var selected = _.filter(vm.options, {selected: true});
+        vm.selectedValues = _.filter(vm.options, {selected: true});
 
 
-        if (selected.length > 1 && selected.length !== vm.options.length) {
-          if (selected[0].text === 'All') {
-            selected[0].selected = false;
-            selected = selected.slice(1, selected.length);
+        if (vm.selectedValues.length > 1 && vm.selectedValues.length !== vm.options.length) {
+          if (vm.selectedValues[0].text === 'All') {
+            vm.selectedValues[0].selected = false;
+            vm.selectedValues = vm.selectedValues.slice(1, vm.selectedValues.length);
           }
           }
         }
         }
 
 
         // validate selected tags
         // validate selected tags
-        _.each(vm.selectedTags, function(tag) {
-          _.each(tag.values, function(value) {
-            if (!_.findWhere(selected, {value: value})) {
-              tag.selected = false;
-            }
-          });
-        });
-
-        vm.selectedTags = _.filter(vm.tags, {selected: true});
-
-        var valuesNotInTag = _.filter(selected, function(test) {
-          for (var i = 0; i < vm.selectedTags.length; i++) {
-            var tag = vm.selectedTags[i];
-            if (_.indexOf(tag.values, test.value) !== -1) {
-              return false;
-            }
+        _.each(vm.tags, function(tag) {
+          if (tag.selected)  {
+            _.each(tag.values, function(value) {
+              if (!_.findWhere(vm.selectedValues, {value: value})) {
+                tag.selected = false;
+              }
+            });
           }
           }
-          return true;
         });
         });
 
 
-        vm.variable.current.value = _.pluck(selected, 'value');
-        vm.variable.current.text = _.pluck(valuesNotInTag, 'text').join(', ');
-        vm.selectedValuesCount = selected.length;
+        vm.selectedTags = _.filter(vm.tags, {selected: true});
+        vm.variable.current.value = _.pluck(vm.selectedValues, 'value');
+        vm.variable.current.text = _.pluck(vm.selectedValues, 'text').join(' + ');
+        vm.variable.current.tags = vm.selectedTags;
 
 
         // only single value
         // only single value
-        if (vm.selectedValuesCount === 1) {
-          vm.variable.current.value = selected[0].value;
+        if (vm.selectedValues.length === 1) {
+          vm.variable.current.value = vm.selectedValues[0].value;
         }
         }
 
 
         if (commitChange) {
         if (commitChange) {
@@ -186,14 +181,17 @@ function (angular, app, _) {
 
 
       vm.commitChanges = function() {
       vm.commitChanges = function() {
         // make sure one option is selected
         // make sure one option is selected
-        var selected = _.filter(vm.options, {selected: true});
-        if (selected.length === 0) {
+        if (vm.selectedValues.length === 0) {
           vm.options[0].selected = true;
           vm.options[0].selected = true;
           vm.selectionsChanged(false);
           vm.selectionsChanged(false);
         }
         }
 
 
         vm.dropdownVisible = false;
         vm.dropdownVisible = false;
         vm.updateLinkText();
         vm.updateLinkText();
+
+        if (vm.variable.current.text !== vm.oldVariableText) {
+          vm.onUpdated();
+        }
       };
       };
 
 
       vm.queryChanged = function() {
       vm.queryChanged = function() {

+ 2 - 2
public/app/features/dashboard/partials/variableValueSelect.html

@@ -15,9 +15,9 @@
 			<div class="variable-options-column">
 			<div class="variable-options-column">
 				<a class="variable-options-column-header" ng-if="vm.variable.multi" ng-class="{'many-selected': vm.selectedValuesCount > 1}" bs-tooltip="'Clear selections'" data-placement="top" ng-click="vm.clearSelections()">
 				<a class="variable-options-column-header" ng-if="vm.variable.multi" ng-class="{'many-selected': vm.selectedValuesCount > 1}" bs-tooltip="'Clear selections'" data-placement="top" ng-click="vm.clearSelections()">
 					<span class="variable-option-icon"></span>
 					<span class="variable-option-icon"></span>
-					Selected ({{vm.selectedValuesCount}})
+					Selected ({{vm.selectedValues.length}})
 				</a>
 				</a>
-				<a class="variable-option pointer" bindonce ng-repeat="option in vm.search.options" ng-class="{'selected': option.selected, 'highlighted': $index === vm.highlightIndex}" ng-click="vm.optionSelected(option, $event)">
+				<a class="variable-option pointer" bindonce ng-repeat="option in vm.search.options" ng-class="{'selected': option.selected, 'highlighted': $index === vm.highlightIndex}" ng-click="vm.selectValue(option, $event)">
 					<span class="variable-option-icon"></span>
 					<span class="variable-option-icon"></span>
 					<span>{{option.text}}</span>
 					<span>{{option.text}}</span>
 				</a>
 				</a>

+ 4 - 0
public/app/features/templating/templateValuesSrv.js

@@ -130,6 +130,10 @@ function (angular, _, kbn) {
           // if parameter has current value
           // if parameter has current value
           // if it exists in options array keep value
           // if it exists in options array keep value
           if (variable.current) {
           if (variable.current) {
+            // if current value is an array do not do anything
+            if (_.isArray(variable.current.value)) {
+              return $q.when([]);
+            }
             var currentOption = _.findWhere(variable.options, { text: variable.current.text });
             var currentOption = _.findWhere(variable.options, { text: variable.current.text });
             if (currentOption) {
             if (currentOption) {
               return self.setVariableValue(variable, currentOption);
               return self.setVariableValue(variable, currentOption);

+ 30 - 3
public/test/specs/selectDropdownCtrl-specs.js

@@ -19,6 +19,7 @@ function () {
       ctrl.getValuesForTag = function(obj) {
       ctrl.getValuesForTag = function(obj) {
         return $q.when(tagValuesMap[obj.tagKey]);
         return $q.when(tagValuesMap[obj.tagKey]);
       };
       };
+      ctrl.onUpdated = sinon.spy();
     }));
     }));
 
 
     describe("Given simple variable", function() {
     describe("Given simple variable", function() {
@@ -35,13 +36,14 @@ function () {
     describe("Given variable with tags and dropdown is opened", function() {
     describe("Given variable with tags and dropdown is opened", function() {
       beforeEach(function() {
       beforeEach(function() {
         ctrl.variable = {
         ctrl.variable = {
-          current: {text: 'hej', value: 'hej'},
+          current: {text: 'server-1', value: 'server-1'},
           options: [
           options: [
             {text: 'server-1', value: 'server-1'},
             {text: 'server-1', value: 'server-1'},
             {text: 'server-2', value: 'server-2'},
             {text: 'server-2', value: 'server-2'},
             {text: 'server-3', value: 'server-3'},
             {text: 'server-3', value: 'server-3'},
           ],
           ],
-          tags: ["key1", "key2", "key3"]
+          tags: ["key1", "key2", "key3"],
+          multi: true
         };
         };
         tagValuesMap.key1 = ['server-1', 'server-3'];
         tagValuesMap.key1 = ['server-1', 'server-3'];
         tagValuesMap.key2 = ['server-2', 'server-3'];
         tagValuesMap.key2 = ['server-2', 'server-3'];
@@ -59,10 +61,30 @@ function () {
         expect(ctrl.options.length).to.be(3);
         expect(ctrl.options.length).to.be(3);
       });
       });
 
 
+      it("should init selected values array", function() {
+        expect(ctrl.selectedValues.length).to.be(1);
+      });
+
+      it("should set linkText", function() {
+        expect(ctrl.linkText).to.be('server-1');
+      });
+
+      describe('after adititional value is selected', function() {
+        beforeEach(function() {
+          ctrl.selectValue(ctrl.options[2], {});
+          ctrl.commitChanges();
+        });
+
+        it('should update link text', function() {
+          expect(ctrl.linkText).to.be('server-1 + server-3');
+        });
+      });
+
       describe('When tag is selected', function() {
       describe('When tag is selected', function() {
         beforeEach(function() {
         beforeEach(function() {
           ctrl.selectTag(ctrl.tags[0]);
           ctrl.selectTag(ctrl.tags[0]);
           rootScope.$digest();
           rootScope.$digest();
+          ctrl.commitChanges();
         });
         });
 
 
         it("should select tag", function() {
         it("should select tag", function() {
@@ -72,6 +94,11 @@ function () {
         it("should select values", function() {
         it("should select values", function() {
           expect(ctrl.options[0].selected).to.be(true);
           expect(ctrl.options[0].selected).to.be(true);
           expect(ctrl.options[2].selected).to.be(true);
           expect(ctrl.options[2].selected).to.be(true);
+          expect(ctrl.linkText).to.be('server-1 + server-2');
+        });
+
+        it("link text should not include tag values", function() {
+          expect(ctrl.linkText).to.not.contain('server-1');
         });
         });
 
 
         describe('and then dropdown is opened and closed without changes', function() {
         describe('and then dropdown is opened and closed without changes', function() {
@@ -99,7 +126,7 @@ function () {
 
 
         describe('and then value is unselected', function() {
         describe('and then value is unselected', function() {
           beforeEach(function() {
           beforeEach(function() {
-            ctrl.optionSelected(ctrl.options[0]);
+            ctrl.selectValue(ctrl.options[0], {});
           });
           });
 
 
           it("should deselect tag", function() {
           it("should deselect tag", function() {