Repository: ambari Updated Branches: refs/heads/trunk fb3bad867 -> 175e78472
AMBARI-10935. Version bar moves too fast to top when scrolling down (onechiporenko) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/175e7847 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/175e7847 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/175e7847 Branch: refs/heads/trunk Commit: 175e78472452746141bf2caaa4f03374344b5a59 Parents: fb3bad8 Author: Oleg Nechiporenko <onechipore...@apache.org> Authored: Tue May 5 19:09:39 2015 +0300 Committer: Oleg Nechiporenko <onechipore...@apache.org> Committed: Tue May 5 19:09:39 2015 +0300 ---------------------------------------------------------------------- ambari-web/app/assets/licenses/NOTICE.txt | 5 +- .../mixins/common/configs/enhanced_configs.js | 30 ++++--- ambari-web/app/styles/application.less | 7 +- ambari-web/app/styles/config_history_flow.less | 13 +-- ambari-web/app/utils/pages/scroll_manager.js | 91 -------------------- .../views/common/configs/config_history_flow.js | 13 +-- .../app/views/main/service/info/configs.js | 21 ++--- ambari-web/config.coffee | 1 + ambari-web/vendor/scripts/jquery.sticky-kit.js | 10 +++ 9 files changed, 55 insertions(+), 136 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/175e7847/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 9d6c66b..bc29209 100644 --- a/ambari-web/app/assets/licenses/NOTICE.txt +++ b/ambari-web/app/assets/licenses/NOTICE.txt @@ -53,4 +53,7 @@ This product includes bootstrap-slider 3.3.2 (https://github.com/nostalgiaz/boot 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 +Copyright (C) 2014 Roberto Montresor (info [at] robertomontresor [*dot*] it) + +This product includes sticky-kit v.1.1.2 (https://github.com/leafo/sticky-kit - MIT License) +Copyright (C) 2015 Leaf Corcoran (leafot [at] gmail [*dot*] com) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/175e7847/ambari-web/app/mixins/common/configs/enhanced_configs.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mixins/common/configs/enhanced_configs.js b/ambari-web/app/mixins/common/configs/enhanced_configs.js index d159cf5..c638439 100644 --- a/ambari-web/app/mixins/common/configs/enhanced_configs.js +++ b/ambari-web/app/mixins/common/configs/enhanced_configs.js @@ -577,9 +577,11 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ } this.addOverrideProperty(cp, selectedGroup, Em.get(propertyToAdd, 'recommendedValue'), !Em.get(propertyToAdd, 'isDeleted')); } - Em.set(propertyToAdd, 'isDeleted', false); - Em.set(propertyToAdd, 'toAdd', false); - Em.set(propertyToAdd, 'toDelete', false); + Em.setProperties(propertyToAdd, { + isDeleted: false, + toAdd: false, + toDelete: false + }); }, this); } }, @@ -606,19 +608,21 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ Em.set(propertyToDelete, 'isDeleted', true); } } else { - var overridenConfig = cp.get('overrides') && cp.get('overrides').findProperty('group.name', selectedGroup.get('name')); - if (overridenConfig) { - if (overridenConfig.get('isNotSaved')) { + var overriddenConfig = cp.get('overrides') && cp.get('overrides').findProperty('group.name', selectedGroup.get('name')); + if (overriddenConfig) { + if (overriddenConfig.get('isNotSaved')) { this.get('_dependentConfigValues').removeObject(propertyToDelete); } - cp.removeObject(overridenConfig); - if (!overridenConfig.get('isNotSaved')) { + cp.removeObject(overriddenConfig); + if (!overriddenConfig.get('isNotSaved')) { Em.set(propertyToDelete, 'isDeleted', true); } } } - Em.set(propertyToDelete, 'toAdd', false); - Em.set(propertyToDelete, 'toDelete', false); + Em.setProperties(propertyToDelete, { + toAdd: false, + toDelete: false + }); } }, this); } @@ -645,9 +649,9 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ if (stepConfigs.get('serviceName') !== this.get('content.serviceName')) { cp.set('value', cp.get('defaultValue')); } - var overridenConfig = cp.get('overrides') && cp.get('overrides').findProperty('group.name', selectedGroup.get('name')); - if (overridenConfig) { - overridenConfig.set('value', valueToSave); + var overriddenConfig = cp.get('overrides') && cp.get('overrides').findProperty('group.name', selectedGroup.get('name')); + if (overriddenConfig) { + overriddenConfig.set('value', valueToSave); } } } http://git-wip-us.apache.org/repos/asf/ambari/blob/175e7847/ambari-web/app/styles/application.less ---------------------------------------------------------------------- diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less index a4df22a..9d23047 100644 --- a/ambari-web/app/styles/application.less +++ b/ambari-web/app/styles/application.less @@ -626,6 +626,11 @@ h1 { background-color: #fff; } + + .mbm { + margin-top: 0; + } + .nav-header { font-size: 13px; padding-left: 0; @@ -5351,7 +5356,7 @@ input[type="radio"].align-checkbox, input[type="checkbox"].align-checkbox { margin-top: @space-m; } -.mbm { margin-bottom: @space-m; } +.mbm { margin-bottom: @space-m; margin-top: -55px; } .mll { margin-left: @space-l; http://git-wip-us.apache.org/repos/asf/ambari/blob/175e7847/ambari-web/app/styles/config_history_flow.less ---------------------------------------------------------------------- diff --git a/ambari-web/app/styles/config_history_flow.less b/ambari-web/app/styles/config_history_flow.less index 5ed6e67..28f79c6 100644 --- a/ambari-web/app/styles/config_history_flow.less +++ b/ambari-web/app/styles/config_history_flow.less @@ -34,12 +34,13 @@ } .dependencies-info { - margin-bottom: 110px; + margin-top: -55px; + margin-bottom: 65px; } .dependencies-info-bar-wrapper { - position: fixed; z-index: 2; + margin: 0; width: 757px; } @media (min-width: 1200px) { @@ -74,11 +75,11 @@ font-size: 11px; .top-label { min-width: 20px; - padding: 0px 2px; + padding: 0 2px; } .author, .content { - padding: 0px 2px; + padding: 0 2px; text-align: center; color: #555555; display: block; @@ -168,7 +169,7 @@ } .first { width: 14%; - margin-left: 0px; + margin-left: 0; .arrow-box { display: none; } @@ -195,7 +196,7 @@ } } .version-info-bar-wrapper { - position: fixed; + margin: 0; z-index: 3; width: 747px; } http://git-wip-us.apache.org/repos/asf/ambari/blob/175e7847/ambari-web/app/utils/pages/scroll_manager.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/pages/scroll_manager.js b/ambari-web/app/utils/pages/scroll_manager.js deleted file mode 100644 index 9f9f48b8..0000000 --- a/ambari-web/app/utils/pages/scroll_manager.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * 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'); - -function calculatePosition(movedTop, defaultTop, scrollTop, defaultLeft, scrollLeft) { - var css = { - top: 'auto', - left: 'auto' - }; - if (scrollTop >= defaultTop) { - css.top = movedTop; - } else if (scrollTop > 0) { - css.top = (defaultTop - scrollTop) + 'px'; - } - //if (css.top == '0px') debugger; - if (scrollLeft > 0) { - css.left = defaultLeft; - } - return css; -} - -/** - * - * @type {Em.Object} - */ -App.ScrollManager = Em.Object.create({ - - /** - @typedef FixedElement - @type {object} - @property {string} id - identifier for element (not css-id). used to determine if element already exists in the list !IMPORTANT - don't push same element two times! - @property {string} updatedElementSelector - css-selector for element that should be replaced - @property {string} elementForLeftOffsetSelector - css-selector for element which is used to determine left-offset for <code>updatedElementSelector</code>-element - @property {number} defaultTop - value for top-offset when user scrolls not under the <code>updatedElementSelector</code>-element - @property {number} movedTop - value for top-offset when user scrolls under the <code>updatedElementSelector</code>-element - */ - - - /** - * List of elements that should be placed on the top of the page - * @type {FixedElement[]} - */ - elements: [], - - /** - * Recalculate position for each elements of the <code>elements</code> - * Should be called from some view - * - * @method updatePositionForElements - */ - updatePositionForElements: function () { - var self = this; - //reset defaultTop value in closure - $(window).unbind('scroll'); - - $(window).on('scroll', function () { - self.get('elements').forEach(function (element) { - var defaultTop, defaultLeft; - var infoBar = $(Em.get(element, 'updatedElementSelector')); - var elementForLeftOffset = $(Em.get(element, 'elementForLeftOffsetSelector')); - var scrollTop = $(window).scrollTop(); - var scrollLeft = $(window).scrollLeft(); - if (!infoBar.length) { - return; - } - defaultTop = (infoBar.get(0).getBoundingClientRect() && infoBar.get(0).getBoundingClientRect().top) || Em.get(element, 'defaultTop'); - // keep the version info bar always aligned to version slider - defaultLeft = elementForLeftOffset.get(0) && elementForLeftOffset.get(0).getBoundingClientRect() && elementForLeftOffset.get(0).getBoundingClientRect().left; - infoBar.css(calculatePosition(Em.get(element, 'movedTop'), defaultTop, scrollTop, defaultLeft, scrollLeft)); - }); - }); - - } - -}); http://git-wip-us.apache.org/repos/asf/ambari/blob/175e7847/ambari-web/app/views/common/configs/config_history_flow.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/common/configs/config_history_flow.js b/ambari-web/app/views/common/configs/config_history_flow.js index 7e407e5..0e4c07b 100644 --- a/ambari-web/app/views/common/configs/config_history_flow.js +++ b/ambari-web/app/views/common/configs/config_history_flow.js @@ -17,7 +17,6 @@ */ var App = require('app'); -require('utils/pages/scroll_manager'); App.ConfigHistoryFlowView = Em.View.extend({ templateName: require('templates/common/configs/config_history_flow'), @@ -164,6 +163,7 @@ App.ConfigHistoryFlowView = Em.View.extend({ App.tooltip(this.$('[data-toggle=arrow-tooltip]'),{ placement: 'top' }); + $(".version-info-bar-wrapper").stick_in_parent({parent: '#serviceConfig', offset_top: 10}); }, serviceVersionBox: Em.View.extend({ @@ -212,16 +212,6 @@ App.ConfigHistoryFlowView = Em.View.extend({ } this.set('startIndex', startIndex); this.adjustFlowView(); - if (!App.ScrollManager.get('elements').someProperty('id', 'configsManagePanel')) { - App.ScrollManager.get('elements').pushObject({ - id: 'configsManagePanel', - updatedElementSelector: '#config_history_flow>.version-info-bar-wrapper', - elementForLeftOffsetSelector: '#config_history_flow>.version-slider', - defaultTop: 290, - movedTop: 10 - }); - } - App.ScrollManager.updatePositionForElements(); }, onChangeConfigGroup: function () { @@ -267,7 +257,6 @@ App.ConfigHistoryFlowView = Em.View.extend({ } this.set('startIndex', startIndex); this.adjustFlowView(); - App.ScrollManager.updatePositionForElements(); }.observes('controller.selectedConfigGroup.name'), /** http://git-wip-us.apache.org/repos/asf/ambari/blob/175e7847/ambari-web/app/views/main/service/info/configs.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/service/info/configs.js b/ambari-web/app/views/main/service/info/configs.js index 998f3fe..c623c4e 100644 --- a/ambari-web/app/views/main/service/info/configs.js +++ b/ambari-web/app/views/main/service/info/configs.js @@ -18,23 +18,12 @@ var App = require('app'); var batchUtils = require('utils/batch_scheduled_requests'); -require('utils/pages/scroll_manager'); App.MainServiceInfoConfigsView = Em.View.extend({ templateName: require('templates/main/service/info/configs'), didInsertElement: function () { var controller = this.get('controller'); controller.loadStep(); - if (!App.ScrollManager.get('elements').someProperty('id', 'dependedConfigs')) { - App.ScrollManager.get('elements').pushObject({ - id: 'dependedConfigs', - updatedElementSelector: '.dependencies-info-bar-wrapper', - elementForLeftOffsetSelector: '#config_history_flow>.version-slider', - defaultTop: 370, - movedTop: 70 - }); - } - App.ScrollManager.updatePositionForElements(); }, componentsCount: null, @@ -70,7 +59,15 @@ App.MainServiceInfoConfigsView = Em.View.extend({ * @method onHasChangedDependenciesUpdated */ onHasChangedDependenciesUpdated: function () { - App.ScrollManager.updatePositionForElements(); + if (this.get('controller.hasChangedDependencies')) { + $(".dependencies-info-bar-wrapper").stick_in_parent({parent: '#serviceConfig', offset_top: 60}); + Em.run.next(function () { + $(window).scrollTop(window.scrollY + 1); // '.dependencies-info-bar-wrapper' position should be recalculated + }); + } + else { + $(".dependencies-info-bar-wrapper").trigger("sticky_kit:detach"); + } }.observes('controller.hasChangedDependencies') }); http://git-wip-us.apache.org/repos/asf/ambari/blob/175e7847/ambari-web/config.coffee ---------------------------------------------------------------------- diff --git a/ambari-web/config.coffee b/ambari-web/config.coffee index ec10ade..580f05a 100644 --- a/ambari-web/config.coffee +++ b/ambari-web/config.coffee @@ -54,6 +54,7 @@ exports.config = 'vendor/scripts/jquery.ui.custom-effects.js', 'vendor/scripts/jquery.timeago.js', 'vendor/scripts/jquery.ajax-retry.js', + 'vendor/scripts/jquery.sticky-kit.js', 'vendor/scripts/moment.js', 'vendor/scripts/workflow_visualization.js', 'vendor/scripts/rickshaw.js', http://git-wip-us.apache.org/repos/asf/ambari/blob/175e7847/ambari-web/vendor/scripts/jquery.sticky-kit.js ---------------------------------------------------------------------- diff --git a/ambari-web/vendor/scripts/jquery.sticky-kit.js b/ambari-web/vendor/scripts/jquery.sticky-kit.js new file mode 100644 index 0000000..5f9f803 --- /dev/null +++ b/ambari-web/vendor/scripts/jquery.sticky-kit.js @@ -0,0 +1,10 @@ +/* + Sticky-kit v1.1.2 | WTFPL | Leaf Corcoran 2015 | http://leafo.net + */ +(function(){var c,f;c=this.jQuery||window.jQuery;f=c(window);c.fn.stick_in_parent=function(b){var A,w,J,n,B,K,p,q,L,k,E,t;null==b&&(b={});t=b.sticky_class;B=b.inner_scrolling;E=b.recalc_every;k=b.parent;q=b.offset_top;p=b.spacer;w=b.bottoming;null==q&&(q=0);null==k&&(k=void 0);null==B&&(B=!0);null==t&&(t="is_stuck");A=c(document);null==w&&(w=!0);L=function(a){var b;return window.getComputedStyle?(a=window.getComputedStyle(a[0]),b=parseFloat(a.getPropertyValue("width"))+parseFloat(a.getPropertyValue("margin-left"))+ +parseFloat(a.getPropertyValue("margin-right")),"border-box"!==a.getPropertyValue("box-sizing")&&(b+=parseFloat(a.getPropertyValue("border-left-width"))+parseFloat(a.getPropertyValue("border-right-width"))+parseFloat(a.getPropertyValue("padding-left"))+parseFloat(a.getPropertyValue("padding-right"))),b):a.outerWidth(!0)};J=function(a,b,n,C,F,u,r,G){var v,H,m,D,I,d,g,x,y,z,h,l;if(!a.data("sticky_kit")){a.data("sticky_kit",!0);I=A.height();g=a.parent();null!=k&&(g=g.closest(k));if(!g.length)throw"failed to find stick parent"; + v=m=!1;(h=null!=p?p&&a.closest(p):c("<div />"))&&h.css("position",a.css("position"));x=function(){var d,f,e;if(!G&&(I=A.height(),d=parseInt(g.css("border-top-width"),10),f=parseInt(g.css("padding-top"),10),b=parseInt(g.css("padding-bottom"),10),n=g.offset().top+d+f,C=g.height(),m&&(v=m=!1,null==p&&(a.insertAfter(h),h.detach()),a.css({position:"",top:"",width:"",bottom:""}).removeClass(t),e=!0),F=a.offset().top-(parseInt(a.css("margin-top"),10)||0)-q,u=a.outerHeight(!0),r=a.css("float"),h&&h.css({width:L(a), + height:u,display:a.css("display"),"vertical-align":a.css("vertical-align"),"float":r}),e))return l()};x();if(u!==C)return D=void 0,d=q,z=E,l=function(){var c,l,e,k;if(!G&&(e=!1,null!=z&&(--z,0>=z&&(z=E,x(),e=!0)),e||A.height()===I||x(),e=f.scrollTop(),null!=D&&(l=e-D),D=e,m?(w&&(k=e+u+d>C+n,v&&!k&&(v=!1,a.css({position:"fixed",bottom:"",top:d}).trigger("sticky_kit:unbottom"))),e<F&&(m=!1,d=q,null==p&&("left"!==r&&"right"!==r||a.insertAfter(h),h.detach()),c={position:"",width:"",top:""},a.css(c).removeClass(t).trigger("sticky_kit:unstick")), + B&&(c=f.height(),u+q>c&&!v&&(d-=l,d=Math.max(c-u,d),d=Math.min(q,d),m&&a.css({top:d+"px"})))):e>F&&(m=!0,c={position:"fixed",top:d},c.width="border-box"===a.css("box-sizing")?a.outerWidth()+"px":a.width()+"px",a.css(c).addClass(t),null==p&&(a.after(h),"left"!==r&&"right"!==r||h.append(a)),a.trigger("sticky_kit:stick")),m&&w&&(null==k&&(k=e+u+d>C+n),!v&&k)))return v=!0,"static"===g.css("position")&&g.css({position:"relative"}),a.css({position:"absolute",bottom:b,top:"auto"}).trigger("sticky_kit:bottom")}, + y=function(){x();return l()},H=function(){G=!0;f.off("touchmove",l);f.off("scroll",l);f.off("resize",y);c(document.body).off("sticky_kit:recalc",y);a.off("sticky_kit:detach",H);a.removeData("sticky_kit");a.css({position:"",bottom:"",top:"",width:""});g.position("position","");if(m)return null==p&&("left"!==r&&"right"!==r||a.insertAfter(h),h.remove()),a.removeClass(t)},f.on("touchmove",l),f.on("scroll",l),f.on("resize",y),c(document.body).on("sticky_kit:recalc",y),a.on("sticky_kit:detach",H),setTimeout(l, + 0)}};n=0;for(K=this.length;n<K;n++)b=this[n],J(c(b));return this}}).call(this); \ No newline at end of file