You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sr...@apache.org on 2015/04/02 23:28:45 UTC

ambari git commit: AMBARI-10298. YARN service configs should be displayed in the new format (onechiporenko via srimanth)

Repository: ambari
Updated Branches:
  refs/heads/trunk 7d39d63ff -> 1272108d9


AMBARI-10298. YARN service configs should be displayed in the new format (onechiporenko via srimanth)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/1272108d
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/1272108d
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/1272108d

Branch: refs/heads/trunk
Commit: 1272108d97e60a0f927ef92d553bda2a87ca0d90
Parents: 7d39d63
Author: Srimanth Gunturi <sg...@hortonworks.com>
Authored: Thu Apr 2 13:56:09 2015 -0700
Committer: Srimanth Gunturi <sg...@hortonworks.com>
Committed: Thu Apr 2 14:25:12 2015 -0700

----------------------------------------------------------------------
 ambari-web/app/assets/img/icons.png             | Bin 0 -> 1896 bytes
 ambari-web/app/assets/licenses/NOTICE.txt       |   3 +
 ambari-web/app/styles/application.less          |  12 +-
 ambari-web/app/styles/widgets.less              |  26 +-
 .../configs/widgets/checkbox_config_widget.hbs  |  54 +++-
 .../checkbox_config_widget_comparison.hbs       |  34 +++
 .../configs/widgets/list_config_widget.hbs      |   2 +-
 .../checkbox_config_widget_override.hbs         |  61 +++++
 .../overrides/slider_config_widget_override.hbs |  63 +++--
 .../configs/widgets/slider_config_widget.hbs    |   4 +-
 ambari-web/app/views.js                         |   2 +
 .../widgets/checkbox_config_widget_view.js      |  26 +-
 .../checkbox_config_widget_comparison_view.js   |  24 ++
 .../configs/widgets/config_widget_view.js       |  19 ++
 .../checkbox_config_widget_override_view.js     |  25 ++
 ambari-web/config.coffee                        |   2 +
 ambari-web/vendor/scripts/bootstrap-checkbox.js | 274 +++++++++++++++++++
 ambari-web/vendor/styles/bootstrap-checkbox.css | 116 ++++++++
 18 files changed, 702 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/assets/img/icons.png
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/img/icons.png b/ambari-web/app/assets/img/icons.png
new file mode 100644
index 0000000..1663a0b
Binary files /dev/null and b/ambari-web/app/assets/img/icons.png differ

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/assets/licenses/NOTICE.txt
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/licenses/NOTICE.txt b/ambari-web/app/assets/licenses/NOTICE.txt
index 7c00e58..9d6c66b 100644
--- a/ambari-web/app/assets/licenses/NOTICE.txt
+++ b/ambari-web/app/assets/licenses/NOTICE.txt
@@ -51,3 +51,6 @@ Copyright (C) 2015 by Kyle Kemp, Rohit Kalkur, and contributors
 
 This product includes bootstrap-slider 3.3.2 (https://github.com/nostalgiaz/bootstrap-switch - Apache License, Version 2.0)
 Copyright (C) 2015 by Mattia Larentis (mattia [at] larentis [*dot*] eu)
+
+This product includes bootstrap-checkbox v.1.0.1 (https://github.com/montrezorro/bootstrap-checkbox - Apache License, Version 2.0)
+Copyright (C) 2014 Roberto Montresor (info [at] robertomontresor [*dot*] it)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less
index 8993e21..bfed2d9 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -483,7 +483,10 @@ h1 {
 .hide {
   visibility: hidden;
 }
-
+// some where in the vendor.css "display: none;" is added to ".hide"
+.not-show {
+  visibility: hidden;
+}
 .show {
   visibility: visible;
 }
@@ -5576,6 +5579,13 @@ input[type="checkbox"].align-checkbox {
       .config-section {
         padding: 10px;
         border: 1px solid #aaa;
+        vertical-align: top;
+
+        h4 {
+          font-size: 22px;
+          font-weight: 400;
+        }
+
         td:not(:first-of-type) {
           border-left: 2px solid #ccc; // horizontal splitter
           padding-left: 20px;

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/styles/widgets.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/widgets.less b/ambari-web/app/styles/widgets.less
index 8088bef..ac5b45e 100644
--- a/ambari-web/app/styles/widgets.less
+++ b/ambari-web/app/styles/widgets.less
@@ -20,11 +20,9 @@
 @undo-btn-margin: 10px;
 @combo-widget-width: 100px;
 
-.widget {
+.widget-config {
 
-  margin-bottom: 30px;
-
-  .widget {
+  .widget-config {
     margin-bottom: 0;
   }
 
@@ -77,6 +75,7 @@
     border: 1px solid @slider-widget-border-color;
   }
   .slider-tick-label {
+    color: #aaa;
     font-size: 10px;
   }
   .slider-selection {
@@ -93,12 +92,18 @@
       margin-right: 10px;
     }
     .ui-slider-label {
+      color: #aaa;
       line-height: 35px;
     }
   }
 
 }
 .slider-disabled {
+  .slider-track-high {
+    background-color: #ccc;
+    border-bottom-right-radius: 12px;
+    border-top-right-radius: 12px;
+  }
   .slider-selection {
     background-color: @gray-blue;
   }
@@ -183,4 +188,17 @@
   .widget-config-label {
     margin-left: 10px;
   }
+
+  .bootstrap-checkbox {
+    &>button.btn {
+      padding: 0;
+      margin-top: -7px;
+      &:focus {
+        border-color: none;
+        box-shadow: 0;
+        outline: 0 none;
+      }
+    }
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/templates/common/configs/widgets/checkbox_config_widget.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/configs/widgets/checkbox_config_widget.hbs b/ambari-web/app/templates/common/configs/widgets/checkbox_config_widget.hbs
index 9d19223..d68b02e 100644
--- a/ambari-web/app/templates/common/configs/widgets/checkbox_config_widget.hbs
+++ b/ambari-web/app/templates/common/configs/widgets/checkbox_config_widget.hbs
@@ -16,9 +16,51 @@
 * limitations under the License.
 }}
 
-<label class="pull-left">
-  {{view view.configView class="pull-left"}}
-  <span class="widget-config-label">{{view.configLabel}}</span>
-</label>
-{{view App.RestoreConfigView}}
-<div class="clearfix"></div>
+<div>
+  <label>
+    {{view view.configView class="pull-left"}}
+    {{#if view.isOriginalSCP}}
+      <span class="widget-config-label">{{view.configLabel}}</span>
+    {{/if}}
+  </label>
+</div>
+<div {{bindAttr class="view.isHover:show:not-show :clearfix"}}>
+  {{#if view.isOriginalSCP}}
+    {{view App.RestoreConfigView visibleBinding="view.undoAllowed"}}
+  {{/if}}
+  {{#if view.overrideAllowed}}
+    {{#isAccessible ADMIN}}
+      <div class="pull-left action-button">
+        <a class="btn btn-small" href="#" data-toggle="tooltip"
+          {{action "createOverrideProperty" view.config target="view.parentView"}}
+          {{translateAttr data-original-title="common.override"}}>
+          <i class="icon-plus-sign"></i>
+        </a>
+      </div>
+    {{/isAccessible}}
+  {{/if}}
+</div>
+
+{{#if view.isComparison}}
+  {{#if controller.selectedConfigGroup.isDefault}}
+    <span
+        class="label label-info">{{t dashboard.configHistory.table.version.prefix}}{{controller.selectedVersion}}</span>
+    {{#if controller.isCurrentSelected}}
+      <span class="label label-success">{{t common.current}}</span>
+    {{/if}}
+  {{else}}
+    <span class="label label-info">{{t common.default}}
+      &nbsp;{{t services.service.config.configHistory.configGroup}}</span>
+  {{/if}}
+{{/if}}
+
+{{#if view.isOriginalSCP}}
+  {{view App.CheckboxConfigWidgetOverrideView
+  serviceConfigPropertyBinding="view.config"
+  isDefaultGroupSelectedBinding="controller.selectedConfigGroup.isDefault"
+  }}
+{{/if}}
+
+{{#if view.isComparison}}
+  {{view App.CheckboxConfigWidgetComparisonView serviceConfigPropertyBinding="view.config"}}
+{{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/templates/common/configs/widgets/comparison/checkbox_config_widget_comparison.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/configs/widgets/comparison/checkbox_config_widget_comparison.hbs b/ambari-web/app/templates/common/configs/widgets/comparison/checkbox_config_widget_comparison.hbs
new file mode 100644
index 0000000..67e06c9
--- /dev/null
+++ b/ambari-web/app/templates/common/configs/widgets/comparison/checkbox_config_widget_comparison.hbs
@@ -0,0 +1,34 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{#each compareConfig in view.serviceConfigProperty.compareConfigs}}
+  <div {{bindAttr class=":control-group :overrideField"}}>
+    {{view App.CheckboxConfigWidgetView configBinding="compareConfig" categoryConfigsAllBinding="view.parentView.categoryConfigsAll" isPopoverEnabled="false"}}
+      <span class="label label-info">{{compareConfig.serviceVersion.versionText}}</span>
+      {{#if compareConfig.serviceVersion.isCurrent}}
+        <span class="label label-success">{{t common.current}}</span>
+      {{/if}}
+      {{#unless compareConfig.isMock}}
+        {{#if compareConfig.supportsFinal}}
+          <a disabled="disabled" {{bindAttr class=":btn :btn-small :btn-final compareConfig.isFinal:active compareConfig.hideFinalIcon:hidden" }}>
+            <i class="icon-lock"></i>
+          </a>
+        {{/if}}
+      {{/unless}}
+  </div>
+{{/each}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/templates/common/configs/widgets/list_config_widget.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/configs/widgets/list_config_widget.hbs b/ambari-web/app/templates/common/configs/widgets/list_config_widget.hbs
index 9268b24..e8e2aa2 100644
--- a/ambari-web/app/templates/common/configs/widgets/list_config_widget.hbs
+++ b/ambari-web/app/templates/common/configs/widgets/list_config_widget.hbs
@@ -16,7 +16,7 @@
 * limitations under the License.
 }}
 
-<div {{bindAttr class="view.config.isHiddenByFilter:hide :widget :list-widget"}}>
+<div {{bindAttr class="view.config.isHiddenByFilter:hide :widget-config :list-widget"}}>
   <p class="widget-config-label">{{view.configLabel}}</p>
   <div class="btn-group">
     <a class="btn dropdown-toggle" data-toggle="dropdown">{{view.displayVal}} <span class="caret"></span></a>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/templates/common/configs/widgets/overrides/checkbox_config_widget_override.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/configs/widgets/overrides/checkbox_config_widget_override.hbs b/ambari-web/app/templates/common/configs/widgets/overrides/checkbox_config_widget_override.hbs
new file mode 100644
index 0000000..1b77cba
--- /dev/null
+++ b/ambari-web/app/templates/common/configs/widgets/overrides/checkbox_config_widget_override.hbs
@@ -0,0 +1,61 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+{{#each overriddenSCP in view.serviceConfigProperty.overrides}}
+{{! Here serviceConfigBinding should ideally be serviceConfigPropertyBinding }}
+  <div {{bindAttr class="overriddenSCP.errorMessage:error: :control-group :overrideField"}}>
+    {{view App.CheckboxConfigWidgetView configBinding="overriddenSCP" isPopoverEnabled="false"}}
+    <div {{bindAttr class="view.parentView.isHover:show:not-show"}}>
+      {{#if overriddenSCP.supportsFinal}}
+        <a href="#" data-toggle="tooltip"
+          {{bindAttr class=":btn :btn-small :btn-final overriddenSCP.isFinal:active overriddenSCP.hideFinalIcon:hidden" disabled="overriddenSCP.isNotEditable"}}
+          {{action "toggleFinalFlag" overriddenSCP target="view"}}
+          {{translateAttr data-original-title="services.service.config.final"}}>
+          <i class="icon-lock"></i>
+        </a>
+      {{/if}}
+      {{#if view.isDefaultGroupSelected}}
+        {{#if overriddenSCP.group}}
+          <a href="#" data-toggle="tooltip" {{bindAttr data-original-title="overriddenSCP.group.switchGroupTextFull" }}
+             class="action" {{action selectConfigGroup overriddenSCP.group target="controller"}}>
+            {{overriddenSCP.group.switchGroupTextShort}}
+          </a>
+        {{/if}}
+      {{else}}
+        {{#if overriddenSCP.isEditable}}
+          {{#if isNotDefaultValue}}
+            <a class="btn btn-small" href="#" data-toggle="tooltip"
+              {{action "doRestoreDefaultValue" overriddenSCP target="view"}}
+              {{translateAttr data-original-title="common.undo"}}>
+              <i class="icon-undo"></i>
+            </a>
+          {{/if}}
+          {{#isAccessible ADMIN}}
+            <a class="btn btn-small" href="#" data-toggle="tooltip"
+              {{action "removeOverride" overriddenSCP target="view"}}
+              {{translateAttr data-original-title="common.remove"}}>
+              <i class="icon-minus-sign"></i>
+            </a>
+          {{/isAccessible}}
+          <span class="help-inline">{{overriddenSCP.errorMessage}}</span>
+        {{else}}
+          <a class="action">{{overriddenSCP.group.switchGroupTextShort}}</a> <i class="icon-spinner"></i>
+        {{/if}}
+      {{/if}}
+    </div>
+  </div>
+{{/each}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/templates/common/configs/widgets/overrides/slider_config_widget_override.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/configs/widgets/overrides/slider_config_widget_override.hbs b/ambari-web/app/templates/common/configs/widgets/overrides/slider_config_widget_override.hbs
index 1ea0404..565e305 100644
--- a/ambari-web/app/templates/common/configs/widgets/overrides/slider_config_widget_override.hbs
+++ b/ambari-web/app/templates/common/configs/widgets/overrides/slider_config_widget_override.hbs
@@ -19,40 +19,43 @@
 {{! Here serviceConfigBinding should ideally be serviceConfigPropertyBinding }}
   <div {{bindAttr class="overriddenSCP.errorMessage:error: :control-group :overrideField"}}>
     {{view App.SliderConfigWidgetView configBinding="overriddenSCP" isPopoverEnabled="false"}}
-    {{#if overriddenSCP.supportsFinal}}
-      <a href="#" data-toggle="tooltip"
-        {{bindAttr class=":btn :btn-small :btn-final overriddenSCP.isFinal:active overriddenSCP.hideFinalIcon:hidden" disabled="overriddenSCP.isNotEditable"}}
-        {{action "toggleFinalFlag" overriddenSCP target="view"}}
-        {{translateAttr data-original-title="services.service.config.final"}}>
-        <i class="icon-lock"></i>
-      </a>
-    {{/if}}
-    {{#if view.isDefaultGroupSelected}}
-      {{#if overriddenSCP.group}}
-        <a href="#" data-toggle="tooltip" {{bindAttr data-original-title="overriddenSCP.group.switchGroupTextFull" }} class="action" {{action selectConfigGroup overriddenSCP.group target="controller"}}>
-          {{overriddenSCP.group.switchGroupTextShort}}
+    <div {{bindAttr class="view.parentView.isHover:show:not-show"}}>
+      {{#if overriddenSCP.supportsFinal}}
+        <a href="#" data-toggle="tooltip"
+          {{bindAttr class=":btn :btn-small :btn-final overriddenSCP.isFinal:active overriddenSCP.hideFinalIcon:hidden" disabled="overriddenSCP.isNotEditable"}}
+          {{action "toggleFinalFlag" overriddenSCP target="view"}}
+          {{translateAttr data-original-title="services.service.config.final"}}>
+          <i class="icon-lock"></i>
         </a>
       {{/if}}
-    {{else}}
-      {{#if overriddenSCP.isEditable}}
-        {{#if isNotDefaultValue}}
-          <a class="btn btn-small" href="#" data-toggle="tooltip"
-            {{action "doRestoreDefaultValue" overriddenSCP target="view"}}
-            {{translateAttr data-original-title="common.undo"}}>
-            <i class="icon-undo"></i>
+      {{#if view.isDefaultGroupSelected}}
+        {{#if overriddenSCP.group}}
+          <a href="#" data-toggle="tooltip" {{bindAttr data-original-title="overriddenSCP.group.switchGroupTextFull" }}
+             class="action" {{action selectConfigGroup overriddenSCP.group target="controller"}}>
+            {{overriddenSCP.group.switchGroupTextShort}}
           </a>
         {{/if}}
-        {{#isAccessible ADMIN}}
-          <a class="btn btn-small" href="#" data-toggle="tooltip"
-            {{action "removeOverride" overriddenSCP target="view"}}
-            {{translateAttr data-original-title="common.remove"}}>
-            <i class="icon-minus-sign"></i>
-          </a>
-        {{/isAccessible}}
-        <span class="help-inline">{{overriddenSCP.errorMessage}}</span>
       {{else}}
-        <a class="action">{{overriddenSCP.group.switchGroupTextShort}}</a> <i class="icon-spinner"></i>
+        {{#if overriddenSCP.isEditable}}
+          {{#if isNotDefaultValue}}
+            <a class="btn btn-small" href="#" data-toggle="tooltip"
+              {{action "doRestoreDefaultValue" overriddenSCP target="view"}}
+              {{translateAttr data-original-title="common.undo"}}>
+              <i class="icon-undo"></i>
+            </a>
+          {{/if}}
+          {{#isAccessible ADMIN}}
+            <a class="btn btn-small" href="#" data-toggle="tooltip"
+              {{action "removeOverride" overriddenSCP target="view"}}
+              {{translateAttr data-original-title="common.remove"}}>
+              <i class="icon-minus-sign"></i>
+            </a>
+          {{/isAccessible}}
+          <span class="help-inline">{{overriddenSCP.errorMessage}}</span>
+        {{else}}
+          <a class="action">{{overriddenSCP.group.switchGroupTextShort}}</a> <i class="icon-spinner"></i>
+        {{/if}}
       {{/if}}
-    {{/if}}
+    </div>
   </div>
-{{/each}}
+{{/each}}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/templates/common/configs/widgets/slider_config_widget.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/configs/widgets/slider_config_widget.hbs b/ambari-web/app/templates/common/configs/widgets/slider_config_widget.hbs
index dbcf076..57c10c6 100644
--- a/ambari-web/app/templates/common/configs/widgets/slider_config_widget.hbs
+++ b/ambari-web/app/templates/common/configs/widgets/slider_config_widget.hbs
@@ -17,7 +17,7 @@
 }}
 
 
-<div {{bindAttr class="view.config.isHiddenByFilter:hide :widget :slider-widget"}}>
+<div {{bindAttr class="view.config.isHiddenByFilter:hide :widget-config :slider-widget"}}>
   {{#if view.isOriginalSCP}}
     <p class="widget-config-label">{{formatWordBreak view.configLabel}}</p>
   {{/if}}
@@ -25,7 +25,7 @@
     <div class="pull-left ui-slider-wrapper-inner">{{view Ember.TextField valueBinding="view.config.value" class="input-mini slider-input"}}</div>
     <div class="pull-right ui-slider-label">{{view.mirrorValue}} {{view.config.stackConfigProperty.valueAttributes.unit}}</div>
   </div>
-  <div class="clearfix">
+  <div {{bindAttr class="view.isHover:show:not-show :clearfix"}}>
       {{#if view.isOriginalSCP}}
         {{view App.RestoreConfigView visibleBinding="view.undoAllowed"}}
       {{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/views.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views.js b/ambari-web/app/views.js
index f4e83de..78daf4f 100644
--- a/ambari-web/app/views.js
+++ b/ambari-web/app/views.js
@@ -65,7 +65,9 @@ require('views/common/configs/widgets/slider_config_widget_view');
 require('views/common/configs/widgets/string_config_widget_view');
 require('views/common/configs/widgets/time_interval_spinner_view');
 require('views/common/configs/widgets/toggle_config_widget_view');
+require('views/common/configs/widgets/overrides/checkbox_config_widget_override_view');
 require('views/common/configs/widgets/overrides/slider_config_widget_override_view');
+require('views/common/configs/widgets/comparison/checkbox_config_widget_comparison_view');
 require('views/common/configs/widgets/comparison/slider_config_widget_comparison_view');
 require('views/common/configs/service_config_layout_tab_view');
 require('views/common/filter_combobox');

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/views/common/configs/widgets/checkbox_config_widget_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/widgets/checkbox_config_widget_view.js b/ambari-web/app/views/common/configs/widgets/checkbox_config_widget_view.js
index a0d928a..326ad2f 100644
--- a/ambari-web/app/views/common/configs/widgets/checkbox_config_widget_view.js
+++ b/ambari-web/app/views/common/configs/widgets/checkbox_config_widget_view.js
@@ -27,9 +27,33 @@ App.CheckboxConfigWidgetView = App.ConfigWidgetView.extend({
   templateName: require('templates/common/configs/widgets/checkbox_config_widget'),
   classNames: ['widget-config', 'checkbox-widget'],
 
+  didInsertElement: function () {
+    var self = this;
+    this._super(arguments);
+    Em.run.next(function () {
+      if (self.$())
+      self.$('input[type="checkbox"]:eq(0)').checkbox({
+        defaultState: self.get('config.value'),
+        buttonStyle: 'btn-link btn-large',
+        checkedClass: 'icon-check',
+        uncheckedClass: 'icon-check-empty'
+      });
+    });
+  },
+
   configView: App.ServiceConfigCheckbox.extend({
     serviceConfigBinding: 'parentView.config',
     // @TODO maybe find use case of this method for widget
     focusIn: function() {}
-  })
+  }),
+
+  /**
+   * Manually reset bootstrap-checkbox
+   * @method restoreValue
+   */
+  restoreValue: function () {
+    this.$('input[type="checkbox"]:eq(0)').checkbox('click');
+    this._super();
+  }
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/views/common/configs/widgets/comparison/checkbox_config_widget_comparison_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/widgets/comparison/checkbox_config_widget_comparison_view.js b/ambari-web/app/views/common/configs/widgets/comparison/checkbox_config_widget_comparison_view.js
new file mode 100644
index 0000000..62a0351
--- /dev/null
+++ b/ambari-web/app/views/common/configs/widgets/comparison/checkbox_config_widget_comparison_view.js
@@ -0,0 +1,24 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+var App = require('app');
+
+App.CheckboxConfigWidgetComparisonView = App.ServiceConfigView.SCPComparisonRowsView.extend({
+
+  templateName: require('templates/common/configs/widgets/comparison/checkbox_config_widget_comparison')
+
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/views/common/configs/widgets/config_widget_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/widgets/config_widget_view.js b/ambari-web/app/views/common/configs/widgets/config_widget_view.js
index 03d25e9..ba441b5 100644
--- a/ambari-web/app/views/common/configs/widgets/config_widget_view.js
+++ b/ambari-web/app/views/common/configs/widgets/config_widget_view.js
@@ -30,6 +30,12 @@ App.ConfigWidgetView = Em.View.extend(App.SupportsDependentConfigs, App.WidgetPo
   config: null,
 
   /**
+   * Determines if user hover on widget-view
+   * @type {boolean}
+   */
+  isHover: false,
+
+  /**
    * Alias to <code>config.isOriginalSCP</code>
    * Should be used in the templates
    * Don't use original <code>config.isOriginalSCP</code> in the widget-templates!!!
@@ -101,11 +107,24 @@ App.ConfigWidgetView = Em.View.extend(App.SupportsDependentConfigs, App.WidgetPo
   /**
    * sync widget value with config value when dependent properties
    * have been loaded or changed
+   * @method syncValueWithConfig
    */
   syncValueWithConfig: function() {
     this.setValue(this.get('config.value'));
   }.observes('controller.recommendationTimeStamp'),
 
+  didInsertElement: function () {
+    var self = this;
+    var element = this.$();
+    if (element) {
+      element.hover(function() {
+        self.set('isHover', true);
+      }, function() {
+        self.set('isHover', false);
+      });
+    }
+  },
+
   /**
    * set widget value same as config value
    * useful for widgets that work with intermediate config value, not original

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/app/views/common/configs/widgets/overrides/checkbox_config_widget_override_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/widgets/overrides/checkbox_config_widget_override_view.js b/ambari-web/app/views/common/configs/widgets/overrides/checkbox_config_widget_override_view.js
new file mode 100644
index 0000000..93e7f75
--- /dev/null
+++ b/ambari-web/app/views/common/configs/widgets/overrides/checkbox_config_widget_override_view.js
@@ -0,0 +1,25 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var App = require('app');
+
+App.CheckboxConfigWidgetOverrideView = App.ServiceConfigView.SCPOverriddenRowsView.extend({
+
+  templateName: require('templates/common/configs/widgets/overrides/checkbox_config_widget_override')
+
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/config.coffee
----------------------------------------------------------------------
diff --git a/ambari-web/config.coffee b/ambari-web/config.coffee
index 25e1766..ec10ade 100644
--- a/ambari-web/config.coffee
+++ b/ambari-web/config.coffee
@@ -40,6 +40,7 @@ exports.config =
           'vendor/scripts/ember-i18n-1.4.1.js',
           'vendor/scripts/bootstrap.js',
           'vendor/scripts/bootstrap-combobox.js',
+          'vendor/scripts/bootstrap-checkbox.js',
           'vendor/scripts/bootstrap-slider.min.js',
           'vendor/scripts/d3.v2.js',
           'vendor/scripts/cubism.v1.js',
@@ -76,6 +77,7 @@ exports.config =
           'vendor/styles/cubism.css',
           'vendor/styles/rickshaw.css'
           'vendor/styles/bootstrap-combobox.css',
+          'vendor/styles/bootstrap-checkbox.css',
           'vendor/styles/bootstrap-slider.min.css'
         ]
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/vendor/scripts/bootstrap-checkbox.js
----------------------------------------------------------------------
diff --git a/ambari-web/vendor/scripts/bootstrap-checkbox.js b/ambari-web/vendor/scripts/bootstrap-checkbox.js
new file mode 100644
index 0000000..3399fc1
--- /dev/null
+++ b/ambari-web/vendor/scripts/bootstrap-checkbox.js
@@ -0,0 +1,274 @@
+/* ===========================================================
+ * bootstrap-checkbox - v.1.0.1
+ * ===========================================================
+ * Copyright 2014 Roberto Montresor
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+!function($) {
+  var Checkbox = function(element, options, e) {
+    if (e) {
+      e.stopPropagation();
+      e.preventDefault();
+    }
+    this.$element = $(element);
+    this.$newElement = null;
+    this.button = null;
+    this.label = null;
+    this.labelPrepend = null;
+    this.options = $.extend({}, $.fn.checkbox.defaults, this.$element.data(), typeof options == 'object' && options);
+    this.init();
+  };
+
+  Checkbox.prototype = {
+
+    constructor: Checkbox,
+
+    init: function (e) {
+      this.$element.hide();
+      this.$element.attr('autocomplete', 'off');
+
+      this._createButtons();
+    },
+
+    _createButtons: function(){
+      var classList = this.$element.attr('class') !== undefined ? this.$element.attr('class').split(/\s+/) : '';
+      var template = this.getTemplate();
+      this.$element.after(template);
+      this.$newElement = this.$element.next('.bootstrap-checkbox');
+      this.button = this.$newElement.find('button');
+      this.label = this.$newElement.find('span.label-checkbox');
+      this.labelPrepend = this.$newElement.find('span.label-prepend-checkbox');
+      for (var i = 0; i < classList.length; i++) {
+        if(classList[i] != 'checkbox') {
+          this.$newElement.addClass(classList[i]);
+        }
+      }
+      this.button.addClass(this.options.buttonStyle);
+
+      if (this.$element.data('default-state') != undefined){
+        this.options.defaultState = this.$element.data('default-state');
+      }
+      if (this.$element.data('default-enabled') != undefined){
+        this.options.defaultEnabled = this.$element.data('default-enabled');
+      }
+      if (this.$element.data('display-as-button') != undefined){
+        this.options.displayAsButton = this.$element.data('display-as-button');
+      }
+
+      if (this.options.indeterminate)
+        this.$element.prop('indeterminate', true);
+
+      this.checkEnabled();
+      this.checkChecked();
+      this.checkTabIndex();
+      this.clickListener();
+    },
+
+    getTemplate: function() {
+      var additionalButtonStyle = this.options.displayAsButton ? ' displayAsButton' : '',
+        label = this.$element.data('label') ? '<span class="label-checkbox">'+this.$element.data('label')+'</span>' : '',
+        labelPrepend = this.$element.data('label-prepend') ? '<span class="label-prepend-checkbox">'+this.$element.data('label-prepend')+'</span>' : '';
+
+      var template =
+        '<span class="button-checkbox bootstrap-checkbox">' +
+          '<button type="button" class="btn clearfix'+additionalButtonStyle+'">' +
+          ((this.$element.data('label-prepend') && this.options.displayAsButton) ? labelPrepend : '')+
+          '<span class="icon '+this.options.checkedClass+'" style="display:none;"></span>' +
+          '<span class="icon '+this.options.uncheckedClass+'"></span>' +
+          '<span class="icon '+this.options.indeterminateClass+'" style="display:none;"></span>' +
+          ((this.$element.data('label') && this.options.displayAsButton) ? label : '')+
+          '</button>' +
+          '</span>';
+
+      if (!this.options.displayAsButton && (this.$element.data('label') || this.$element.data('label-prepend'))) {
+        template =
+          '<label class="'+this.options.labelClass+'">' +
+            labelPrepend + template + label+
+            '</label>';
+      }
+      return template;
+    },
+
+    checkEnabled: function() {
+      this.button.attr('disabled', this.$element.is(':disabled'));
+      this.$newElement.toggleClass('disabled', this.$element.is(':disabled'));
+    },
+
+    checkTabIndex: function() {
+      if (this.$element.is('[tabindex]')) {
+        var tabindex = this.$element.attr("tabindex");
+        this.button.attr('tabindex', tabindex);
+      }
+    },
+
+    checkChecked: function() {
+      var whitePattern = /\s/g, replaceChar = '.';
+      if (this.$element.prop('indeterminate') == true){
+        this.button.find('span.'+this.options.checkedClass.replace(whitePattern, replaceChar)).hide();
+        this.button.find('span.'+this.options.uncheckedClass.replace(whitePattern, replaceChar)).hide();
+        this.button.find('span.'+this.options.indeterminateClass.replace(whitePattern, replaceChar)).show();
+      } else {
+        if (this.$element.is(':checked')) {
+          this.button.find('span.'+this.options.checkedClass.replace(whitePattern, replaceChar)).show();
+          this.button.find('span.'+this.options.uncheckedClass.replace(whitePattern, replaceChar)).hide();
+        } else {
+          this.button.find('span.'+this.options.checkedClass.replace(whitePattern, replaceChar)).hide();
+          this.button.find('span.'+this.options.uncheckedClass.replace(whitePattern, replaceChar)).show();
+        }
+        this.button.find('span.'+this.options.indeterminateClass.replace(whitePattern, replaceChar)).hide();
+      }
+
+      if (this.$element.is(':checked')) {
+        if (this.options.buttonStyleChecked){
+          this.button.removeClass(this.options.buttonStyle);
+          this.button.addClass(this.options.buttonStyleChecked);
+        }
+      } else {
+        if (this.options.buttonStyleChecked){
+          this.button.removeClass(this.options.buttonStyleChecked);
+          this.button.addClass(this.options.buttonStyle);
+        }
+      }
+
+      if (this.$element.is(':checked')) {
+        if (this.options.labelClassChecked){
+          $(this.$element).next("label").addClass(this.options.labelClassChecked);
+        }
+      } else {
+        if (this.options.labelClassChecked){
+          $(this.$element).next("label").removeClass(this.options.labelClassChecked);
+        }
+      }
+    },
+
+    clickListener: function() {
+      var _this = this;
+      this.button.on('click', function(e){
+        e.preventDefault();
+        _this.$element.prop("indeterminate", false);
+        _this.$element[0].click();
+        _this.checkChecked();
+      });
+      this.$element.on('change', function(e) {
+        _this.checkChecked();
+      });
+      this.$element.parents('form').on('reset', function(e) {
+        if (_this.options.defaultState == null){
+          _this.$element.prop('indeterminate', true);
+        } else {
+          _this.$element.prop('checked', _this.options.defaultState);
+        }
+        _this.$element.prop('disabled', !_this.options.defaultEnabled);
+        _this.checkEnabled();
+        _this.checkChecked();
+        e.preventDefault();
+      });
+    },
+
+    setOptions: function(option, event){
+      if (option.checked != undefined) {
+        this.setChecked(option.checked);
+      }
+      if (option.enabled != undefined) {
+        this.setEnabled(option.enabled);
+      }
+      if (option.indeterminate != undefined) {
+        this.setIndeterminate(option.indeterminate);
+      }
+    },
+
+    setChecked: function(checked){
+      this.$element.prop("checked", checked);
+      this.$element.prop("indeterminate", false);
+      this.checkChecked();
+    },
+
+    setIndeterminate: function(indeterminate){
+      this.$element.prop("indeterminate", indeterminate);
+      this.checkChecked();
+    },
+
+
+    click: function(event){
+      this.$element.prop("indeterminate", false);
+      this.$element[0].click();
+      this.checkChecked();
+    },
+
+    change: function(event){
+      this.$element.change();
+    },
+
+    setEnabled: function(enabled){
+      this.$element.attr('disabled', !enabled);
+      this.checkEnabled();
+    },
+
+    toggleEnabled: function(event){
+      this.$element.attr('disabled', !this.$element.is(':disabled'));
+      this.checkEnabled();
+    },
+
+    refresh: function(event){
+      this.checkEnabled();
+      this.checkChecked();
+    },
+
+    update: function(options){
+      if (!this.$element.next().find('.bootstrap-checkbox'))
+        return;
+
+      this.options = $.extend({}, this.options, options);
+      this.$element.next().remove();
+      this._createButtons();
+    }
+  };
+
+  $.fn.checkbox = function(option, event) {
+    return this.each(function () {
+      var $this = $(this),
+        data = $this.data('checkbox'),
+        options = typeof option == 'object' && option;
+      if (!data) {
+        $this.data('checkbox', (data = new Checkbox(this, options, event)));
+        if (data.options.constructorCallback != undefined){
+          data.options.constructorCallback(data.$element, data.button, data.label, data.labelPrepend);
+        }
+      } else {
+        if (typeof option == 'string') {
+          data[option](event);
+        } else if (typeof option != 'undefined') {
+          data.setOptions(option, event);
+        }
+      }
+    });
+  };
+
+  $.fn.checkbox.defaults = {
+    displayAsButton: false,
+    indeterminate: false,
+    buttonStyle: 'btn-link',
+    buttonStyleChecked: null,
+    checkedClass: 'cb-icon-check',
+    uncheckedClass: 'cb-icon-check-empty',
+    indeterminateClass: 'cb-icon-check-indeterminate',
+    defaultState: false,
+    defaultEnabled: true,
+    constructorCallback: null,
+    labelClass: "checkbox bootstrap-checkbox",
+    labelClassChecked: "active"
+  };
+
+}(window.jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/1272108d/ambari-web/vendor/styles/bootstrap-checkbox.css
----------------------------------------------------------------------
diff --git a/ambari-web/vendor/styles/bootstrap-checkbox.css b/ambari-web/vendor/styles/bootstrap-checkbox.css
new file mode 100644
index 0000000..2ed0bcc
--- /dev/null
+++ b/ambari-web/vendor/styles/bootstrap-checkbox.css
@@ -0,0 +1,116 @@
+/* ===========================================================
+ * bootstrap-checkbox - v.1.0.1
+ * ===========================================================
+ * Copyright 2014 Roberto Montresor
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+@CHARSET "ISO-8859-1";
+
+.bootstrap-checkbox > button.btn{
+    padding:7px 0 4px 2px;
+    width:28px;
+}
+.bootstrap-checkbox > button.btn.displayAsButton{
+    width:auto;
+}
+.bootstrap-checkbox > button.btn.displayAsButton > span.label-checkbox{
+    padding:0 8px 0 4px;
+}
+.bootstrap-checkbox > button.btn.displayAsButton > span.icon{
+    margin: 2px 4px;
+}
+.bootstrap-checkbox > button.btn.displayAsButton > span.label-prepend-checkbox{
+    padding:0 4px 0 8px;
+}
+.bootstrap-checkbox > button.btn.btn-large{
+    padding:10px 0 6px 2px;
+    width:36px;
+}
+.bootstrap-checkbox > button.btn.btn-small{
+    padding:5px 0 3px 1px;
+    width:24px;
+}
+.bootstrap-checkbox > button.btn.btn-mini{
+    padding:4px 0 1px 1px;
+    width:20px;
+}
+
+.bootstrap-checkbox > .btn.btn-link{
+    text-decoration:none;
+}
+
+label.bootstrap-checkbox.disabled{
+    cursor:default;
+    color:#666;
+}
+
+.bootstrap-checkbox > .label-prepend-checkbox{
+    padding-right:4px;
+}
+
+.bootstrap-checkbox > .label-checkbox{
+    padding-left:4px;
+}
+
+.bootstrap-checkbox.disabled > [class^="label-"],
+.bootstrap-checkbox > .btn[disabled]{
+    cursor:not-allowed;
+}
+
+[class^="cb-icon-"],
+[class*=" cb-icon-"] {
+    display: inline-block;
+    width: 14px;
+    height: 14px;
+    margin-top: 1px;
+    *margin-right: .3em;
+    line-height: 14px;
+    vertical-align: text-top;
+    background-image: url("../img/icons.png");
+    background-position: 14px 14px;
+    background-repeat: no-repeat;
+}
+
+.bootstrap-checkbox button.btn > span.cb-icon-check,
+.bootstrap-checkbox.disabled button.btn:hover > span.cb-icon-check,
+.bootstrap-checkbox.disabled button.btn:active > span.cb-icon-check{
+    background-position: 0 -1px;
+}
+.bootstrap-checkbox button.btn:hover > span.cb-icon-check,
+.bootstrap-checkbox button.btn:focus > span.cb-icon-check,
+.bootstrap-checkbox button.btn:active > span.cb-icon-check{
+    background-position: 0 -25px;
+}
+.bootstrap-checkbox button.btn > span.cb-icon-check-empty,
+.bootstrap-checkbox.disabled button.btn:hover > span.cb-icon-check-empty,
+.bootstrap-checkbox.disabled button.btn:active > span.cb-icon-check-empty{
+    background-position: -24px -1px;
+}
+.bootstrap-checkbox button.btn:hover > span.cb-icon-check-empty,
+.bootstrap-checkbox button.btn:focus > span.cb-icon-check-empty,
+.bootstrap-checkbox button.btn:active > span.cb-icon-check-empty{
+    background-position: -24px -25px;
+}
+
+.bootstrap-checkbox button.btn > span.cb-icon-check-indeterminate,
+.bootstrap-checkbox.disabled button.btn:hover > span.cb-icon-check-indeterminate,
+.bootstrap-checkbox.disabled button.btn:active > span.cb-icon-check-indeterminate{
+    background-position: -48px -1px;
+}
+.bootstrap-checkbox button.btn:hover > span.cb-icon-check-indeterminate,
+.bootstrap-checkbox button.btn:focus > span.cb-icon-check-indeterminate,
+.bootstrap-checkbox button.btn:active > span.cb-icon-check-indeterminate{
+    background-position: -48px -25px;
+}
\ No newline at end of file