gethue
Version:
Hue is an Open source SQL Query Editor for Databases/Warehouses
153 lines (137 loc) • 6.06 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 apiHelper from '../../../api/apiHelper';
import huePubSub from '../../../utils/huePubSub';
import { ASSIST_DOC_HIGHLIGHT_EVENT } from '../../../ko/components/assist/events';
const TEMPLATE_NAME = 'context-document-details';
// prettier-ignore
export const DOCUMENT_CONTEXT_TEMPLATE = `
<script type="text/html" id="${ TEMPLATE_NAME }">
<div class="context-popover-flex-fill" style="overflow: auto;">
<div class="context-popover-inner-content">
<div style="position: absolute; right: 6px; top: 8px;">
<a class="pointer inactive-action" data-bind="visible: !$parent.closeDisabled, click: function () { $parent.close() }"><i class="fa fa-fw fa-times"></i></a>
</div>
<!-- ko if: typeof documentContents() !== 'undefined' && typeof documentContents().snippets !== 'undefined' -->
<!-- ko with: details -->
<div class="context-popover-doc-header-link" ><a href="javascript:void(0)" data-bind="hueLink: link, click: function () { $parents[1].close(); }"><!-- ko template: { name: 'document-icon-template', data: { document: $data, showShareAddon: false } } --><!-- /ko --> <span data-bind="text:name"></span></a></div>
<!-- ko if: description -->
<div class="context-popover-doc-description" data-bind="toggleOverflow: { height: 60 }"><div data-bind="text: description"></div></div>
<!-- /ko -->
<!-- /ko -->
<!-- ko with: documentContents -->
<!-- ko foreach: snippets -->
<div class="context-popover-doc-contents" data-bind="highlight: { value: statement_raw, formatted: true, dialect: type }"></div>
<!-- /ko -->
<!-- /ko -->
<!-- /ko -->
<!-- ko if: typeof documentContents() === 'undefined' || typeof documentContents().snippets === 'undefined' -->
<div style="width: 100%;" data-bind="template: { name: 'generic-document-context-template', data: details }"></div>
<!-- /ko -->
</div>
</div>
</script>
<script type="text/html" id="generic-document-context-template">
<div style="width:100%; text-align: center; margin-top: 40px; font-size: 100px; color: #787878;" data-bind="template: { name: 'document-icon-template', data: { document: { isDirectory: type === 'directory', definition: function() { return $data } } } }"></div>
<div style="width: 100%; margin-top: 20px; text-align:center">
<!-- ko if: type === 'directory' -->
<a style="font-size: 20px;" href="javascript:void(0)" data-bind="text: name, publish: 'context.popover.show.in.assist'"></a>
<!-- /ko -->
<!-- ko if: type !== 'directory' -->
<a style="font-size: 20px;" href="javascript:void(0)" data-bind="text: name, hueLink: link, click: function () { $parents[1].close(); }"></a>
<!-- /ko -->
<br/>
<span data-bind="text: window.DOCUMENT_TYPE_I18n[type] || type"></span>
<!-- ko if: description -->
<div class="context-popover-doc-description" data-bind="text: description"></div>
<!-- /ko -->
</div>
</script>
`;
class DocumentContext {
constructor(data) {
const self = this;
self.disposals = [];
// Adapt some details to a common format, the global search endpoint has different structure than the docs one
self.details = {
type: data.doc_type || data.type,
name: data.originalName || data.name || data.hue_name,
link: data.absoluteUrl || data.link,
description: data.description || data.hue_description,
isDirectory: data.doc_type === 'directory' || data.type === 'directory',
definition: ko.observable({
type: data.doc_type || data.type
})
};
self.data = data;
self.loading = ko.observable(true);
self.hasErrors = ko.observable(false);
self.errorText = ko.observable();
self.template = TEMPLATE_NAME;
self.documentId = ko.observable();
self.documentContents = ko.observable();
self.loadDocument();
const showInAssistPubSub = huePubSub.subscribe('context.popover.show.in.assist', () => {
huePubSub.publish(ASSIST_DOC_HIGHLIGHT_EVENT, {
parentUuid: self.data.parentUuid,
docUuid: self.data.uuid
});
});
self.disposals.push(() => {
showInAssistPubSub.remove();
});
}
download() {
if (this.documentId()) {
window.location.href = `${
window.HUE_BASE_URL
}/desktop/api2/doc/export?documents=[${this.documentId()}]`;
}
}
open(entry) {
huePubSub.publish('open.link', entry.details.link);
huePubSub.publish('context.popover.hide');
huePubSub.publish('global.search.close');
}
dispose() {
const self = this;
while (self.disposals.length) {
self.disposals.pop()();
}
}
loadDocument() {
const self = this;
self.hasErrors(false);
self.loading(true);
apiHelper
.fetchDocument({
uuid: self.data.uuid,
fetchContents: true,
silenceErrors: true
})
.done(response => {
this.documentId(response.document?.id);
self.documentContents(response.data);
self.loading(false);
})
.fail(() => {
self.loading(false);
self.hasErrors(false); // Allows us to revert to a generic document panel in case it can't fetch it.
});
}
}
export default DocumentContext;