gethue
Version:
Hue is an Open source SQL Query Editor for Databases/Warehouses
206 lines (186 loc) • 7.47 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 * as ko from 'knockout';
import AssistHBaseEntry from '../../../ko/components/assist/assistHBaseEntry';
import componentUtils from '../../../ko/components/componentUtils';
import huePubSub from '../../../utils/huePubSub';
import I18n from '../../../utils/i18n';
import { getFromLocalStorage, setInLocalStorage } from '../../../utils/storageUtils';
const TEMPLATE = `
<script type="text/html" id="hbase-context-items">
<!-- ko if: definition.host -->
<li><a href="javascript: void(0);" data-bind="click: open"><i class="fa fa-fw fa-folder-open-o"></i> ${I18n(
'Open cluster'
)}</a></li>
<!-- /ko -->
<!-- ko ifnot: definition.host -->
<li><a href="javascript: void(0);" data-bind="click: open"><!-- ko template: { name: 'app-icon-template', data: { icon: 'hbase' } } --><!-- /ko --> ${I18n(
'Open in HBase'
)}</a></li>
<!-- /ko -->
</script>
<script type="text/html" id="assist-hbase-header-actions">
<div class="assist-db-header-actions">
<a class="inactive-action" href="javascript:void(0)" data-bind="click: function () { huePubSub.publish('assist.hbase.refresh'); }"><i class="pointer fa fa-refresh" data-bind="css: { 'fa-spin blue' : loading }" title="${I18n(
'Manual refresh'
)}"></i></a>
</div>
</script>
<!-- ko with: selectedHBaseEntry -->
<div class="assist-inner-header assist-breadcrumb" >
<!-- ko if: definition.host !== '' -->
<a href="javascript: void(0);" data-bind="click: function () { huePubSub.publish('assist.clickHBaseRootItem'); }">
<i class="fa fa-fw fa-chevron-left"></i>
<i class="fa fa-fw fa-th-large"></i>
<span data-bind="text: definition.name"></span>
</a>
<!-- /ko -->
<!-- ko if: definition.host === '' -->
${I18n('Clusters')}
<!-- /ko -->
<!-- ko template: 'assist-hbase-header-actions' --><!-- /ko -->
</div>
<div class="assist-flex-fill assist-hbase-scrollable" data-bind="delayedOverflow">
<div data-bind="visible: ! loading() && ! hasErrors()" style="position: relative;">
<ul class="assist-tables" data-bind="foreachVisible: { data: entries, minHeight: 22, container: '.assist-hbase-scrollable' }">
<li class="assist-entry assist-table-link" style="position: relative;" data-bind="appAwareTemplateContextMenu: { template: 'hbase-context-items', scrollContainer: '.assist-hbase-scrollable' }, visibleOnHover: { 'selector': '.assist-actions' }">
<a href="javascript:void(0)" class="assist-entry assist-table-link" data-bind="multiClick: { click: click, dblClick: dblClick }, attr: {'title': definition.name }">
<!-- ko if: definition.host -->
<i class="fa fa-fw fa-th-large muted valign-middle"></i>
<!-- /ko -->
<!-- ko ifnot: definition.host -->
<i class="fa fa-fw fa-th muted valign-middle"></i>
<!-- /ko -->
<span draggable="true" data-bind="text: definition.name, draggableText: { text: '\\'' + definition.name + '\\'', meta: {'type': 'collection', 'definition': definition} }"></span>
</a>
</li>
</ul>
<!-- ko if: !loading() && entries().length === 0 -->
<ul class="assist-tables">
<li class="assist-entry">
<span class="assist-no-entries">
<!-- ko if: definition.host === '' -->
${I18n('No clusters available.')}
<!-- /ko -->
<!-- ko if: definition.host !== '' -->
${I18n('No tables available.')}
<!-- /ko -->
</span>
</li>
</ul>
<!-- /ko -->
</div>
<!-- ko hueSpinner: { spin: loading, center: true, size: 'large' } --><!-- /ko -->
<div class="assist-errors" data-bind="visible: ! loading() && hasErrors()">
<span>${I18n('Error loading contents.')}</span>
</div>
</div>
<!-- /ko -->
`;
class AssistHBasePanel {
/**
* @param {Object} options
* @constructor
**/
constructor(options) {
const self = this;
self.initialized = false;
const root = new AssistHBaseEntry({
definition: {
host: '',
name: '',
port: 0
}
});
self.selectedHBaseEntry = ko.observable();
self.reload = () => {
self.selectedHBaseEntry(root);
root.loadEntries(() => {
const lastOpenendPath = getFromLocalStorage('assist.last.opened.hbase.entry');
if (lastOpenendPath) {
root.entries().every(entry => {
if (entry.path === lastOpenendPath) {
entry.open();
return false;
}
return true;
});
}
});
};
self.selectedHBaseEntry.subscribe(newEntry => {
if (newEntry !== root || (newEntry === root && newEntry.loaded)) {
setInLocalStorage('assist.last.opened.hbase.entry', newEntry.path);
}
});
huePubSub.subscribe('assist.clickHBaseItem', entry => {
if (entry.definition.host) {
entry.loadEntries();
self.selectedHBaseEntry(entry);
} else {
huePubSub.publish('assist.dblClickHBaseItem', entry);
}
});
huePubSub.subscribe('assist.clickHBaseRootItem', () => {
self.reload();
});
const delayChangeHash = hash => {
window.setTimeout(() => {
window.location.hash = hash;
}, 0);
};
self.lastClickeHBaseEntry = null;
self.HBaseLoaded = false;
huePubSub.subscribeOnce('hbase.app.loaded', () => {
if (self.selectedHBaseEntry() && self.lastClickeHBaseEntry) {
delayChangeHash(
self.selectedHBaseEntry().definition.name +
'/' +
self.lastClickeHBaseEntry.definition.name
);
}
self.HBaseLoaded = true;
});
huePubSub.subscribe('assist.dblClickHBaseItem', entry => {
const hash = self.selectedHBaseEntry().definition.name + '/' + entry.definition.name;
if (window.location.pathname.startsWith('/hue/hbase')) {
window.location.hash = hash;
} else {
self.lastClickeHBaseEntry = entry;
huePubSub.subscribeOnce('app.gained.focus', app => {
if (app === 'hbase' && self.HBaseLoaded) {
delayChangeHash(hash);
}
});
huePubSub.publish('open.link', '/hbase');
}
});
huePubSub.subscribe('assist.hbase.refresh', () => {
huePubSub.publish('assist.clear.hbase.cache');
self.reload();
});
self.init();
}
init() {
const self = this;
if (self.initialized) {
return;
}
self.reload();
self.initialized = true;
}
}
componentUtils.registerStaticComponent('hue-assist-hbase-panel', AssistHBasePanel, TEMPLATE);