gethue
Version:
Hue is an Open source SQL Query Editor for Databases/Warehouses
89 lines (77 loc) • 2.96 kB
JavaScript
// Licensed to Cloudera, Inc. under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. Cloudera, Inc. 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.
import $ from 'jquery';
import * as ko from 'knockout';
import huePubSub from '../../utils/huePubSub';
import scrollbarWidth from '../../utils/screen/scrollbarWidth';
ko.bindingHandlers.dockable = {
init: function (element, valueAccessor) {
const options = valueAccessor() || {};
const scrollable = options.scrollable ? options.scrollable : window;
const triggerAdjust = options.triggerAdjust || 0;
const zIndex = options.zIndex || 1000;
$(element).addClass('dockable');
let initialTopPosition = -1;
let initialSize = {
w: $(element).width() - scrollbarWidth(),
h: $(element).outerHeight() + (options.jumpCorrection || 0)
};
const ghost = $('<div>')
.css({ display: 'none', height: initialSize.h })
.insertBefore($(element));
function dock() {
if (initialTopPosition === -1) {
initialTopPosition = $(element).position().top;
ghost.height($(element).outerHeight() + (options.jumpCorrection || 0));
}
if ($(scrollable).scrollTop() + triggerAdjust > initialTopPosition) {
$(element).attr(
'style',
'position: fixed!important; top: ' +
options.topSnap +
'; width: ' +
initialSize.w +
'px!important; z-index: ' +
zIndex
);
ghost.show();
} else {
$(element).removeAttr('style');
ghost.hide();
}
}
$(scrollable).on('scroll', dock);
const scrollOffSubscription = huePubSub.subscribe('scrollable.scroll.off', scrollElement => {
if (scrollElement === scrollable) {
$(scrollable).on('scroll', dock);
}
});
function resetInitialStyle() {
$(element).removeAttr('style');
initialSize = {
w: $(element).width() - scrollbarWidth(),
h: $(element).outerHeight() + (options.jumpCorrection || 0)
};
dock();
}
$(window).on('resize', resetInitialStyle);
ko.utils.domNodeDisposal.addDisposeCallback(element, () => {
$(window).off('resize', resetInitialStyle);
$(scrollable).off('scroll', dock);
scrollOffSubscription.remove();
});
}
};