@cognitive-class/jupyterlab-cde-plugin
Version:
Drop-in Cognos Dashboard Embedded plugin for Jupyterlab
147 lines (130 loc) • 13.6 kB
JavaScript
import _defineProperty from 'babel-runtime/helpers/defineProperty';
import _Object$getPrototypeOf from 'babel-runtime/core-js/object/get-prototype-of';
import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
import _createClass from 'babel-runtime/helpers/createClass';
import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';
import _inherits from 'babel-runtime/helpers/inherits';
import EventEmitter from 'events';
import React, { PureComponent, Fragment } from 'react';
import PropTypes from 'prop-types';
import PreferenceDialog from './preference-dialog';
import SourceMetaDialog from './source-meta-dialog';
var emitter = new EventEmitter();
export function openDialog() {
emitter.emit('openDialog');
}
var Container = function (_PureComponent) {
_inherits(Container, _PureComponent);
function Container() {
var _ref;
var _temp, _this, _ret;
_classCallCheck(this, Container);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Container.__proto__ || _Object$getPrototypeOf(Container)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
isDialogOpen: false,
isSourceMetaDialogOpen: false,
selectedFiles: [],
csvUrl: null,
username: null
}, _this.openDialog = function () {
_this.setState({
selectedFiles: [],
csvUrl: null,
isDialogOpen: true
});
}, _this.closeDialog = function () {
_this.setState({
isDialogOpen: false
});
}, _this.handlePreferenceDialogRef = function (node) {
_this.preferenceDialog = node;
}, _this.handleSourceMetaDialogRef = function (node) {
_this.sourceMetaDialog = node;
}, _this.handleSave = function (selectedFiles) {
var _this$state = _this.state,
username = _this$state.username,
csvUrl = _this$state.csvUrl;
if (!csvUrl && !(username && selectedFiles.length > 0)) return;
_this.setState({
isDialogOpen: false,
isSourceMetaDialogOpen: true,
selectedFiles: selectedFiles
});
}, _this.handleSourceMetaSave = function () {
_this.setState({
isSourceMetaDialogOpen: false,
selectedFiles: []
});
}, _this.handleCancel = function () {
_this.setState({
isDialogOpen: false,
isSourceMetaDialogOpen: false
});
}, _this.handleCSVUrlChange = function (event) {
var target = event.target;
var value = target.type === 'checkbox' ? target.checked : target.value;
var name = target.name;
_this.setState(_defineProperty({}, name, value));
}, _temp), _possibleConstructorReturn(_this, _ret);
}
_createClass(Container, [{
key: 'componentDidMount',
value: function componentDidMount() {
emitter.on('openDialog', this.openDialog);
function readCookie(k) {
return (document.cookie.match('(^|; )' + k + '=([^;]*)') || 0)[2];
}
var username = readCookie('username');
this.setState({ username: username });
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
emitter.removeListener('openDialog', this.openDialog);
}
}, {
key: 'render',
value: function render() {
var _props = this.props,
preferencesDialogTitle = _props.preferencesDialogTitle,
preferencesDialogContent = _props.preferencesDialogContent;
var _state = this.state,
isDialogOpen = _state.isDialogOpen,
isSourceMetaDialogOpen = _state.isSourceMetaDialogOpen,
csvUrl = _state.csvUrl,
selectedFiles = _state.selectedFiles,
username = _state.username;
return React.createElement(
Fragment,
null,
isDialogOpen && React.createElement(PreferenceDialog, {
innerRef: this.handlePreferenceDialogRef,
onCancel: this.handleCancel,
onSave: this.handleSave,
title: preferencesDialogTitle,
content: preferencesDialogContent,
handleChange: this.handleCSVUrlChange,
username: username
}),
isSourceMetaDialogOpen && React.createElement(SourceMetaDialog, {
innerRef: this.handleSourceMetaDialogRef,
onCancel: this.handleCancel,
onSave: this.handleSourceMetaSave,
csvUrl: csvUrl,
selectedFiles: selectedFiles,
username: username
})
);
}
}]);
return Container;
}(PureComponent);
Container.displayName = 'Container';
Container.propTypes = {
preferencesDialogTitle: PropTypes.node.isRequired,
preferencesDialogContent: PropTypes.node.isRequired
};
export default Container;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zb3VyY2UtbWFuYWdlci9jb250YWluZXIuanMiXSwibmFtZXMiOlsiRXZlbnRFbWl0dGVyIiwiUmVhY3QiLCJQdXJlQ29tcG9uZW50IiwiRnJhZ21lbnQiLCJQcm9wVHlwZXMiLCJQcmVmZXJlbmNlRGlhbG9nIiwiU291cmNlTWV0YURpYWxvZyIsImVtaXR0ZXIiLCJvcGVuRGlhbG9nIiwiZW1pdCIsIkNvbnRhaW5lciIsInN0YXRlIiwiaXNEaWFsb2dPcGVuIiwiaXNTb3VyY2VNZXRhRGlhbG9nT3BlbiIsInNlbGVjdGVkRmlsZXMiLCJjc3ZVcmwiLCJ1c2VybmFtZSIsInNldFN0YXRlIiwiY2xvc2VEaWFsb2ciLCJoYW5kbGVQcmVmZXJlbmNlRGlhbG9nUmVmIiwibm9kZSIsInByZWZlcmVuY2VEaWFsb2ciLCJoYW5kbGVTb3VyY2VNZXRhRGlhbG9nUmVmIiwic291cmNlTWV0YURpYWxvZyIsImhhbmRsZVNhdmUiLCJsZW5ndGgiLCJoYW5kbGVTb3VyY2VNZXRhU2F2ZSIsImhhbmRsZUNhbmNlbCIsImhhbmRsZUNTVlVybENoYW5nZSIsImV2ZW50IiwidGFyZ2V0IiwidmFsdWUiLCJ0eXBlIiwiY2hlY2tlZCIsIm5hbWUiLCJvbiIsInJlYWRDb29raWUiLCJrIiwiZG9jdW1lbnQiLCJjb29raWUiLCJtYXRjaCIsInJlbW92ZUxpc3RlbmVyIiwicHJvcHMiLCJwcmVmZXJlbmNlc0RpYWxvZ1RpdGxlIiwicHJlZmVyZW5jZXNEaWFsb2dDb250ZW50IiwiZGlzcGxheU5hbWUiLCJwcm9wVHlwZXMiLCJpc1JlcXVpcmVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPQSxZQUFQLE1BQXlCLFFBQXpCO0FBQ0EsT0FBT0MsS0FBUCxJQUFnQkMsYUFBaEIsRUFBK0JDLFFBQS9CLFFBQStDLE9BQS9DO0FBQ0EsT0FBT0MsU0FBUCxNQUFzQixZQUF0QjtBQUNBLE9BQU9DLGdCQUFQLE1BQTZCLHFCQUE3QjtBQUNBLE9BQU9DLGdCQUFQLE1B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REUsUUFOeEQsVUFNd0RBLFFBTnhEOzs7QUFTUCxhQUNFO0FBQUMsZ0JBQUQ7QUFBQTtBQUNHSix3QkFDQyxvQkFBQyxnQkFBRDtBQUNFLG9CQUFVLEtBQUtPLHlCQURqQjtBQUVFLG9CQUFVLEtBQUtRLFlBRmpCO0FBR0Usa0JBQVEsS0FBS0gsVUFIZjtBQUlFLGlCQUFPbUIsc0JBSlQ7QUFLRSxtQkFBU0Msd0JBTFg7QUFNRSx3QkFBYyxLQUFLaEIsa0JBTnJCO0FBT0Usb0JBQVVaO0FBUFosVUFGSjtBQVlHSCxrQ0FDQyxvQkFBQyxnQkFBRDtBQUNFLG9CQUFVLEtBQUtTLHlCQURqQjtBQUVFLG9CQUFVLEtBQUtLLFlBRmpCO0FBR0Usa0JBQVEsS0FBS0Qsb0JBSGY7QUFJRSxrQkFBUVgsTUFKVjtBQUtFLHlCQUFlRCxhQUxqQjtBQU1FLG9CQUFVRTtBQU5aO0FBYkosT0FERjtBQXlCRDs7OztFQXJIb0NkLGE7O0FBQWxCUSxTLENBQ1ptQyxXLEdBQWMsVztBQURGbkMsUyxDQUdab0MsUyxHQUFZO0FBQ2pCSCwwQkFBd0J2QyxVQUFVZ0IsSUFBVixDQUFlMkIsVUFEdEI7QUFFakJILDRCQUEwQnhDLFVBQVVnQixJQUFWLENBQWUyQjtBQUZ4QixDO2VBSEFyQyxTIiwiZmlsZSI6ImNvbnRhaW5lci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJ1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQsIEZyYWdtZW50IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnXG5pbXBvcnQgUHJlZmVyZW5jZURpYWxvZyBmcm9tICcuL3ByZWZlcmVuY2UtZGlhbG9nJ1xuaW1wb3J0IFNvdXJjZU1ldGFEaWFsb2cgZnJvbSAnLi9zb3VyY2UtbWV0YS1kaWFsb2cnXG5cbmNvbnN0IGVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuZXhwb3J0IGZ1bmN0aW9uIG9wZW5EaWFsb2coKSB7XG4gIGVtaXR0ZXIuZW1pdCgnb3BlbkRpYWxvZycpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lciBleHRlbmRzIFB1cmVDb21wb25lbnQge1xuICBzdGF0aWMgZGlzcGxheU5hbWUgPSAnQ29udGFpbmVyJ1xuXG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgcHJlZmVyZW5jZXNEaWFsb2dUaXRsZTogUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZCxcbiAgICBwcmVmZXJlbmNlc0RpYWxvZ0NvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG4gIH1cblxuICBzdGF0ZSA9IHtcbiAgICBpc0RpYWxvZ09wZW46IGZhbHNlLFxuICAgIGlzU291cmNlTWV0YURpYWxvZ09wZW46IGZhbHNlLFxuICAgIHNlbGVjdGVkRmlsZXM6IFtdLFxuICAgIGNzdlVybDogbnVsbCxcbiAgICB1c2VybmFtZTogbnVsbCxcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGVtaXR0ZXIub24oJ29wZW5EaWFsb2cnLCB0aGlzLm9wZW5EaWFsb2cpXG4gICAgZnVuY3Rpb24gcmVhZENvb2tpZShrKSB7IHJldHVybiAoZG9jdW1lbnQuY29va2llLm1hdGNoKGAoXnw7ICkke2t9PShbXjtdKilgKSB8fCAwKVsyXSB9XG4gICAgY29uc3QgdXNlcm5hbWUgPSByZWFkQ29va2llKCd1c2VybmFtZScpXG4gICAgdGhpcy5zZXRTdGF0ZSh7IHVzZXJuYW1lIH0pXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKCdvcGVuRGlhbG9nJywgdGhpcy5vcGVuRGlhbG9nKVxuICB9XG5cbiAgb3BlbkRpYWxvZyA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRmlsZXM6IFtdLFxuICAgICAgY3N2VXJsOiBudWxsLFxuICAgICAgaXNEaWFsb2dPcGVuOiB0cnVlLFxuICAgIH0pXG4gIH1cblxuICBjbG9zZURpYWxvZyA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzRGlhbG9nT3BlbjogZmFsc2UsXG4gICAgfSlcbiAgfVxuXG4gIGhhbmRsZVByZWZlcmVuY2VEaWFsb2dSZWYgPSAobm9kZSkgPT4ge1xuICAgIHRoaXMucHJlZmVyZW5jZURpYWxvZyA9IG5vZGVcbiAgfVxuXG4gIGhhbmRsZVNvdXJjZU1ldGFEaWFsb2dSZWYgPSAobm9kZSkgPT4ge1xuICAgIHRoaXMuc291cmNlTWV0YURpYWxvZyA9IG5vZGVcbiAgfVxuXG4gIGhhbmRsZVNhdmUgPSAoc2VsZWN0ZWRGaWxlcykgPT4ge1xuICAgIGNvbnN0IHsgdXNlcm5hbWUsIGNzdlVybCB9ID0gdGhpcy5zdGF0ZVxuICAgIGlmICghY3N2VXJsICYmICEodXNlcm5hbWUgJiYgc2VsZWN0ZWRGaWxlcy5sZW5ndGggPiAwKSkgcmV0dXJuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpc0RpYWxvZ09wZW46IGZhbHNlLFxuICAgICAgaXNTb3VyY2VNZXRhRGlhbG9nT3BlbjogdHJ1ZSxcbiAgICAgIHNlbGVjdGVkRmlsZXMsXG4gICAgfSlcbiAgfVxuXG4gIGhhbmRsZVNvdXJjZU1ldGFTYXZlID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaXNTb3VyY2VNZXRhRGlhbG9nT3BlbjogZmFsc2UsXG4gICAgICBzZWxlY3RlZEZpbGVzOiBbXSxcbiAgICB9KVxuICB9XG5cbiAgaGFuZGxlQ2FuY2VsID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaXNEaWFsb2dPcGVuOiBmYWxzZSxcbiAgICAgIGlzU291cmNlTWV0YURpYWxvZ09wZW46IGZhbHNlLFxuICAgIH0pXG4gIH1cblxuICBoYW5kbGVDU1ZVcmxDaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB7IHRhcmdldCB9ID0gZXZlbnRcbiAgICBjb25zdCB2YWx1ZSA9IHRhcmdldC50eXBlID09PSAnY2hlY2tib3gnID8gdGFyZ2V0LmNoZWNrZWQgOiB0YXJnZXQudmFsdWVcbiAgICBjb25zdCB7IG5hbWUgfSA9IHRhcmdldFxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBbbmFtZV06IHZhbHVlLFxuICAgIH0pXG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJlZmVyZW5jZXNEaWFsb2dUaXRsZSxcbiAgICAgIHByZWZlcmVuY2VzRGlhbG9nQ29udGVudCxcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHtcbiAgICAgIGlzRGlhbG9nT3BlbiwgaXNTb3VyY2VNZXRhRGlhbG9nT3BlbiwgY3N2VXJsLCBzZWxlY3RlZEZpbGVzLCB1c2VybmFtZSxcbiAgICB9ID0gdGhpcy5zdGF0ZVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxGcmFnbWVudD5cbiAgICAgICAge2lzRGlhbG9nT3BlbiAmJiAoXG4gICAgICAgICAgPFByZWZlcmVuY2VEaWFsb2dcbiAgICAgICAgICAgIGlubmVyUmVmPXt0aGlzLmhhbmRsZVByZWZlcmVuY2VEaWFsb2dSZWZ9XG4gICAgICAgICAgICBvbkNhbmNlbD17dGhpcy5oYW5kbGVDYW5jZWx9XG4gICAgICAgICAgICBvblNhdmU9e3RoaXMuaGFuZGxlU2F2ZX1cbiAgICAgICAgICAgIHRpdGxlPXtwcmVmZXJlbmNlc0RpYWxvZ1RpdGxlfVxuICAgICAgICAgICAgY29udGVudD17cHJlZmVyZW5jZXNEaWFsb2dDb250ZW50fVxuICAgICAgICAgICAgaGFuZGxlQ2hhbmdlPXt0aGlzLmhhbmRsZUNTVlVybENoYW5nZX1cbiAgICAgICAgICAgIHVzZXJuYW1lPXt1c2VybmFtZX1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgICB7aXNTb3VyY2VNZXRhRGlhbG9nT3BlbiAmJiAoXG4gICAgICAgICAgPFNvdXJjZU1ldGFEaWFsb2dcbiAgICAgICAgICAgIGlubmVyUmVmPXt0aGlzLmhhbmRsZVNvdXJjZU1ldGFEaWFsb2dSZWZ9XG4gICAgICAgICAgICBvbkNhbmNlbD17dGhpcy5oYW5kbGVDYW5jZWx9XG4gICAgICAgICAgICBvblNhdmU9e3RoaXMuaGFuZGxlU291cmNlTWV0YVNhdmV9XG4gICAgICAgICAgICBjc3ZVcmw9e2NzdlVybH1cbiAgICAgICAgICAgIHNlbGVjdGVkRmlsZXM9e3NlbGVjdGVkRmlsZXN9XG4gICAgICAgICAgICB1c2VybmFtZT17dXNlcm5hbWV9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgIDwvRnJhZ21lbnQ+XG4gICAgKVxuICB9XG59XG4iXX0=