Browse Source

AMBARI-13481. Ranger User Info tab: All subsequent subsection and their configs should be hidden if Ranger Usersync is disabled. (jaimin)

Jaimin Jetly 9 years ago
parent
commit
34a03533b1

+ 52 - 10
ambari-web/app/mappers/configs/themes_mapper.js

@@ -22,7 +22,7 @@ App.themesMapper = App.QuickDataMapper.create({
   sectionModel: App.Section,
   subSectionModel: App.SubSection,
   subSectionTabModel: App.SubSectionTab,
-  configConditionModel: App.ConfigCondition,
+  themeConditionModel: App.ThemeCondition,
 
   tabConfig: {
     "id": "name",
@@ -107,27 +107,40 @@ App.themesMapper = App.QuickDataMapper.create({
 
               if (section.subsections) {
                 var subSections = [];
+                var subSectionConditions = [];
                 section.subsections.forEach(function(subSection) {
                   var parsedSubSection = this.parseIt(subSection, this.get("subSectionConfig"));
                   parsedSubSection.section_id = parsedSection.id;
 
                   if (subSection['subsection-tabs']) {
                     var subSectionTabs = [];
+                    var subSectionTabConditions = [];
 
                     subSection['subsection-tabs'].forEach(function (subSectionTab) {
                       var parsedSubSectionTab = this.parseIt(subSectionTab, this.get("subSectionTabConfig"));
                       parsedSubSectionTab.sub_section_id = parsedSubSection.id;
-
+                      if (parsedSubSectionTab['depends_on']) {
+                        subSectionTabConditions.push(parsedSubSectionTab);
+                      }
                       subSectionTabs.push(parsedSubSectionTab);
                     }, this);
                     subSectionTabs[0].is_active = true;
-
+                    if (subSectionTabConditions.length) {
+                      var type = 'subsectionTab';
+                      this.mapThemeConditions(subSectionTabConditions, type);
+                    }
                     App.store.loadMany(this.get("subSectionTabModel"), subSectionTabs);
                     parsedSubSection.sub_section_tabs = subSectionTabs.mapProperty("id");
                   }
-
+                  if (parsedSubSection['depends_on']) {
+                    subSectionConditions.push(parsedSubSection);
+                  }
                   subSections.push(parsedSubSection);
                 }, this);
+                if (subSectionConditions.length) {
+                  var type = 'subsection';
+                  this.mapThemeConditions(subSectionConditions, type);
+                }
                 App.store.loadMany(this.get("subSectionModel"), subSections);
                 parsedSection.sub_sections = subSections.mapProperty("id");
               }
@@ -159,15 +172,12 @@ App.themesMapper = App.QuickDataMapper.create({
       var subSectionTabId = configLink["subsection-tab-name"];
       if (subSectionTabId) {
         var subSectionTab = App.SubSectionTab.find(subSectionTabId);
-        var subSectionTabDependsOnConfigs = subSectionTab.get('dependsOn');
       } else if (subSectionId) {
         var subSection = App.SubSection.find(subSectionId);
-        var subSectionDependsOnConfigs = subSection.get('dependsOn');
       }
       var configProperty = App.StackConfigProperty.find(configId);
 
-      var configDependsOnOtherConfigs = configLink["depends-on"] || [];
-      var dependsOnConfigs = configDependsOnOtherConfigs.concat(subSectionDependsOnConfigs || []).concat(subSectionTabDependsOnConfigs || []);
+      var dependsOnConfigs = configLink["depends-on"] || [];
 
       if (configProperty.get('id') && subSection) {
         subSection.get('configProperties').pushObject(configProperty);
@@ -181,7 +191,7 @@ App.themesMapper = App.QuickDataMapper.create({
         if (valueAttributes) {
           var isUiOnlyProperty = valueAttributes["ui_only_property"];
           // UI only configs are mentioned in the themes for supporting widgets that is not intended for setting a value
-          // And thus is affiliated witha fake config peperty termed as ui only config property
+          // And thus is affiliated with fake config property termed as ui only config property
           if (isUiOnlyProperty && subSection) {
             var split = configLink.config.split("/");
             var fileName =  split[0] + '.xml';
@@ -237,11 +247,43 @@ App.themesMapper = App.QuickDataMapper.create({
       }
 
       configCondition.resource = _configCondition.resource || 'config';
+      configCondition.type = _configCondition.type || 'config';
 
       configConditionsCopy.pushObject(configCondition);
     }, this);
 
-    App.store.loadMany(this.get("configConditionModel"), configConditionsCopy);
+    App.store.loadMany(this.get("themeConditionModel"), configConditionsCopy);
+    App.store.commit();
+  },
+
+  /**
+   *
+   * @param subSections: Array
+   * @param type: {String} possible values: `subsection` or `subsectionTab`
+   */
+  mapThemeConditions: function(subSections, type) {
+    var subSectionConditionsCopy = [];
+    subSections.forEach(function(_subSection){
+      var subSectionConditions = _subSection['depends_on'];
+      subSectionConditions.forEach(function(_subSectionCondition, index){
+        var subSectionCondition = $.extend({},_subSectionCondition);
+        subSectionCondition.id = _subSection.id + '_' + index;
+        subSectionCondition.name = _subSection.name;
+        if (_subSectionCondition.configs && _subSectionCondition.configs.length) {
+          subSectionCondition.configs = _subSectionCondition.configs.map(function (item) {
+            var result = {};
+            result.fileName = item.split('/')[0] + '.xml';
+            result.configName = item.split('/')[1];
+            return result;
+          });
+        }
+
+        subSectionCondition.resource = _subSectionCondition.resource || 'config';
+        subSectionCondition.type = _subSectionCondition.type || type;
+        subSectionConditionsCopy.pushObject(subSectionCondition);
+      }, this);
+    }, this);
+    App.store.loadMany(this.get("themeConditionModel"), subSectionConditionsCopy);
     App.store.commit();
   },
 

+ 1 - 1
ambari-web/app/models.js

@@ -60,7 +60,7 @@ require('models/master_component');
 require('models/host_stack_version');
 require('models/root_service');
 require('models/upgrade_entity');
-require('models/configs/config_condition');
+require('models/configs/theme/theme_condition');
 require('models/configs/service_config_version');
 require('models/configs/stack_config_property');
 require('models/configs/config_group');

+ 7 - 2
ambari-web/app/models/configs/theme/sub_section.js

@@ -171,6 +171,11 @@ App.SubSection = DS.Model.extend({
     return this.get('columnIndex') + this.get('columnSpan') == this.get('section.sectionColumns');
   }.property('columnIndex', 'columnSpan', 'section.sectionColumns'),
 
+  /**
+   * If the visibility of subsection is dependent on a value of some config
+   */
+  isHiddenByConfig: false,
+
   /**
    * Determines if subsection is filtered by checking it own configs
    * If there is no configs, subsection can't be hidden
@@ -186,8 +191,8 @@ App.SubSection = DS.Model.extend({
    * @type {boolean}
    */
   isSectionVisible: function () {
-    return !this.get('isHiddenByFilter') && this.get('configs').someProperty('isVisible', true);
-  }.property('isHiddenByFilter', 'configs.@each.isVisible')
+    return !this.get('isHiddenByFilter') && !this.get('isHiddenByConfig') && this.get('configs').someProperty('isVisible', true);
+  }.property('isHiddenByFilter', 'configs.@each.isVisible', 'isHiddenByConfig')
 });
 
 

+ 7 - 2
ambari-web/app/models/configs/theme/sub_section_tab.js

@@ -65,6 +65,11 @@ App.SubSectionTab = DS.Model.extend({
     }).length;
   }.property('configs.@each.isVisible', 'configs.@each.isValid', 'configs.@each.overrideErrorTrigger'),
 
+  /**
+   * If the visibility of subsection is dependent on a value of some config
+   */
+  isHiddenByConfig: false,
+
   /**
    * Determines if subsection is filtered by checking it own configs
    * If there is no configs, subsection can't be hidden
@@ -80,8 +85,8 @@ App.SubSectionTab = DS.Model.extend({
    * @type {boolean}
    */
   isVisible: function () {
-    return !this.get('isHiddenByFilter') && this.get('configs').someProperty('isVisible', true);
-  }.property('isHiddenByFilter', 'configs.@each.isVisible')
+    return !this.get('isHiddenByFilter') && !this.get('isHiddenByConfig') && this.get('configs').someProperty('isVisible', true);
+  }.property('isHiddenByFilter', 'isHiddenByConfig', 'configs.@each.isVisible')
 });
 
 

+ 13 - 2
ambari-web/app/models/configs/config_condition.js → ambari-web/app/models/configs/theme/theme_condition.js

@@ -23,13 +23,24 @@
 
 var App = require('app');
 
-App.ConfigCondition = DS.Model.extend({
+App.ThemeCondition = DS.Model.extend({
   /**
    * unique id generated as <code>config_name<code><code>filename<code>
    * @property {string}
    */
   id: DS.attr('string'),
 
+  /**
+   *  type can be `config`, `service`
+   */
+  type: DS.attr('string'),
+
+  /**
+   * This is specific to subsection and subsectionTab type
+   */
+
+  name: DS.attr('string'),
+
   /**
    * Name of the config that is being affected with the condition
    */
@@ -62,4 +73,4 @@ App.ConfigCondition = DS.Model.extend({
 
 });
 
-App.ConfigCondition.FIXTURES = [];
+App.ThemeCondition.FIXTURES = [];

+ 1 - 2
ambari-web/app/views/common/configs/service_config_layout_tab_view.js

@@ -119,8 +119,7 @@ App.ServiceConfigLayoutTabView = Em.View.extend(App.ConfigOverridable, {
         stackConfigProperty: config
       };
 
-
-      var configConditions = App.ConfigCondition.find().filter(function (_configCondition) {
+      var configConditions = App.ThemeCondition.find().filter(function (_configCondition) {
         // Filter config condition depending on the value of another config
         var conditionalConfigs = (_configCondition.get('configs')||[]).filterProperty('fileName', config.get('filename')).filterProperty('configName', config.get('name'));
         // Filter config condition depending on the service existence or service state

+ 28 - 2
ambari-web/app/views/common/configs/widgets/config_widget_view.js

@@ -430,7 +430,11 @@ App.ConfigWidgetView = Em.View.extend(App.SupportsDependentConfigs, App.WidgetPo
           }
         }, this);
         isConditionTrue = window.eval(allConditionResult.join(''));
-        this.changeConfigAttribute(configCondition, isConditionTrue);
+        if (configCondition.get("type") === 'subsection' || configCondition.get("type") === 'subsectionTab') {
+          this.changeSubsectionAttribute(configCondition, isConditionTrue);
+        } else {
+          this.changeConfigAttribute(configCondition, isConditionTrue);
+        }
       } else if (configCondition.get("resource") === 'service') {
         var service = App.Service.find().findProperty('serviceName', ifStatement);
         var serviceName;
@@ -449,7 +453,7 @@ App.ConfigWidgetView = Em.View.extend(App.SupportsDependentConfigs, App.WidgetPo
 
   /**
    *
-   * @param configCondition {App.ConfigCondition}
+   * @param configCondition {App.ThemeCondition}
    * @param isConditionTrue {boolean}
    */
   changeConfigAttribute: function(configCondition, isConditionTrue) {
@@ -470,6 +474,28 @@ App.ConfigWidgetView = Em.View.extend(App.SupportsDependentConfigs, App.WidgetPo
     }
   },
 
+  /**
+   *
+   * @param subsectionCondition {App.ThemeCondition}
+   * @param isConditionTrue {boolean}
+   */
+  changeSubsectionAttribute: function(subsectionCondition, isConditionTrue) {
+    var subsectionConditionName = subsectionCondition.get('name');
+    var action = isConditionTrue ? subsectionCondition.get("then") : subsectionCondition.get("else");
+    if (subsectionCondition.get('id')) {
+      var valueAttributes = action.property_value_attributes;
+      if (valueAttributes && !Em.none(valueAttributes['visible'])) {
+        var themeResource;
+        if (subsectionCondition.get('type') === 'subsection') {
+          themeResource = App.SubSection.find().findProperty('name', subsectionConditionName);
+        } else if (subsectionCondition.get('type') === 'subsectionTab') {
+          themeResource = App.SubSectionTab.find().findProperty('name', subsectionConditionName);
+        }
+        themeResource.set('isHiddenByConfig', !valueAttributes['visible']);
+      }
+    }
+  },
+
 
 
   /**