gethue
Version:
Hue is an Open source SQL Query Editor for Databases/Warehouses
112 lines (102 loc) • 4.09 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 { hueLocalStorage } from '../../../utils/storageUtils';
ko.bindingHandlers.aceResizer = {
init: function (element, valueAccessor) {
const options = ko.unwrap(valueAccessor());
const ace = options.snippet.ace.bind(options.snippet);
const $target = $(options.target);
const $resizer = $(element);
const $contentPanel = $('.content-panel');
const $execStatus = $resizer.prev('.snippet-execution-status');
const $variables = $resizer.siblings('.snippet-row').find('.variables');
let lastEditorSize = hueLocalStorage('hue.editor.editor.size') || 131;
let editorHeight = Math.floor(lastEditorSize / 16);
$target.height(lastEditorSize);
let autoExpand =
typeof options.snippet.aceAutoExpand !== 'undefined' ? options.snippet.aceAutoExpand : true;
let draggedOnce = false;
function throttleChange() {
if (autoExpand && !draggedOnce) {
const maxAutoLines = Math.floor(($(window).height() - 80) / 2 / 16);
let resized = false;
if (ace().session.getLength() > editorHeight) {
if (ace().session.getLength() < maxAutoLines) {
$target.height(ace().session.getLength() * 16);
} else {
$target.height(maxAutoLines * 16); // height of maxAutoLines
}
resized = true;
} else {
$target.height(
Math.max(
ace().session.getLength() * 16,
hueLocalStorage('hue.editor.editor.size') || 131
)
);
resized = true;
}
if (ace().session.getLength() === editorHeight) {
resized = false;
}
if (resized && $target.height() !== lastEditorSize) {
ace().resize();
editorHeight = Math.min(maxAutoLines, ace().session.getLength());
lastEditorSize = $target.height();
huePubSub.publish('redraw.fixed.headers');
}
}
}
let changeTimeout = -1;
ace().on('change', () => {
window.clearTimeout(changeTimeout);
changeTimeout = window.setTimeout(throttleChange, 10);
});
const setAutoExpandSubscription = huePubSub.subscribe('ace.set.autoexpand', options => {
if (ace().container.id === options.snippet.id()) {
autoExpand = options.autoExpand;
}
});
$resizer.draggable({
axis: 'y',
start: options.onStart ? options.onStart : function () {},
drag: function (event, ui) {
draggedOnce = true;
const currentHeight =
ui.offset.top +
$contentPanel.scrollTop() -
(125 + $execStatus.outerHeight(true) + $variables.outerHeight(true));
$target.css('height', currentHeight + 'px');
ace().resize();
ui.offset.top = 0;
ui.position.top = 0;
},
stop: function (event, ui) {
ui.offset.top = 0;
ui.position.top = 0;
hueLocalStorage('hue.editor.editor.size', $target.height());
huePubSub.publish('redraw.fixed.headers');
$(document).trigger('editorSizeChanged');
}
});
ko.utils.domNodeDisposal.addDisposeCallback(element, () => {
setAutoExpandSubscription.remove();
});
}
};