Просмотр исходного кода

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

Torkel Ödegaard 10 лет назад
Родитель
Сommit
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() {