@cognitive-class/jupyterlab-cde-plugin
Version:
Drop-in Cognos Dashboard Embedded plugin for Jupyterlab
232 lines (200 loc) • 19.5 kB
JavaScript
import _extends from 'babel-runtime/helpers/extends';
import _regeneratorRuntime from 'babel-runtime/regenerator';
import _toConsumableArray from 'babel-runtime/helpers/toConsumableArray';
import _asyncToGenerator from 'babel-runtime/helpers/asyncToGenerator';
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 React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
import Tree from 'antd/lib/tree';
import Spin from 'antd/lib/spin';
import Form from 'antd/lib/form';
import Input from 'antd/lib/input';
import Dialog from './dialog';
require('antd/lib/tree/style/index.css');
require('antd/lib/spin/style/index.css');
require('./preference-dialog.scss');
var TreeNode = Tree.TreeNode,
DirectoryTree = Tree.DirectoryTree;
var FormItem = Form.Item;
var transformFileListToTreeData = function transformFileListToTreeData(fileList) {
var treeData = [];
fileList.forEach(function (_ref) {
var type = _ref.type,
name = _ref.name,
path = _ref.path,
mimetype = _ref.mimetype;
if (type === 'file') {
treeData.push({
title: name, key: path, mimetype: mimetype, isLeaf: true
});
} else if (type === 'directory') {
treeData.unshift({
title: name, key: path, mimetype: mimetype, isLeaf: false
});
}
});
return treeData;
};
var PreferenceDialog = function (_PureComponent) {
_inherits(PreferenceDialog, _PureComponent);
function PreferenceDialog() {
var _ref2,
_this2 = this;
var _temp, _this, _ret;
_classCallCheck(this, PreferenceDialog);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref2 = PreferenceDialog.__proto__ || _Object$getPrototypeOf(PreferenceDialog)).call.apply(_ref2, [this].concat(args))), _this), _this.state = {
treeData: [],
selectedFiles: []
}, _this.onLoadData = function () {
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref4) {
var _ref4$props = _ref4.props,
dataRef = _ref4$props.dataRef,
eventKey = _ref4$props.eventKey,
children = _ref4$props.children;
var resp, _ref5, content, treeData;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!children) {
_context.next = 2;
break;
}
return _context.abrupt('return');
case 2:
_context.next = 4;
return fetch('/user-redirect/api/contents/' + eventKey, { cache: 'no-cache', mode: 'cors', credentials: 'include' });
case 4:
resp = _context.sent;
_context.next = 7;
return resp.json();
case 7:
_ref5 = _context.sent;
content = _ref5.content;
// eslint-disable-next-line no-param-reassign
dataRef.children = transformFileListToTreeData(content);
treeData = _this.state.treeData;
_this.setState({
treeData: [].concat(_toConsumableArray(treeData))
});
case 12:
case 'end':
return _context.stop();
}
}
}, _callee, _this2);
}));
return function (_x) {
return _ref3.apply(this, arguments);
};
}(), _this.handleSelect = function (selectedKeys, e) {
var selectedNodes = e.selectedNodes;
var selectedFiles = selectedNodes.filter(function (_ref6) {
var _ref6$props$isLeaf = _ref6.props.isLeaf,
isLeaf = _ref6$props$isLeaf === undefined ? false : _ref6$props$isLeaf;
return isLeaf;
}).map(function (_ref7) {
var key = _ref7.key;
return key;
});
_this.setState({ selectedFiles: selectedFiles });
}, _this.handleSubmit = function (e) {
e.preventDefault();
var selectedFiles = _this.state.selectedFiles;
var onSave = _this.props.onSave;
onSave(selectedFiles);
}, _this.renderTreeNodes = function (data) {
return data.map(function (item) {
if (item.children) {
return React.createElement(
TreeNode,
{ title: item.title, key: item.key, dataRef: item, mimetype: item.mimetype, disabled: true },
_this.renderTreeNodes(item.children)
);
}
return React.createElement(TreeNode, _extends({}, item, { dataRef: item, mimetype: item.mimetype, selectable: item.mimetype === 'text/csv' }));
});
}, _temp), _possibleConstructorReturn(_this, _ret);
}
_createClass(PreferenceDialog, [{
key: 'componentDidMount',
value: function componentDidMount() {
var _this3 = this;
fetch('/user-redirect/api/contents', { cache: 'no-cache', mode: 'cors', credentials: 'include' }).then(function (resp) {
return resp.json();
}).then(function (_ref8) {
var content = _ref8.content;
var treeData = transformFileListToTreeData(content);
_this3.setState({ treeData: treeData });
});
}
}, {
key: 'render',
value: function render() {
var _props = this.props,
innerRef = _props.innerRef,
onCancel = _props.onCancel,
title = _props.title,
content = _props.content,
handleChange = _props.handleChange,
username = _props.username;
var treeData = this.state.treeData;
return React.createElement(
Dialog,
{
innerRef: innerRef,
title: title,
onCancel: onCancel,
onSubmit: this.handleSubmit,
okText: 'Next'
},
content,
React.createElement(
Form,
{ layout: 'horizontal' },
React.createElement(
FormItem,
{ label: 'CSV File URL' },
React.createElement(Input, { placeholder: 'https://gist.github.com/username/file.csv', name: 'csvUrl', onChange: handleChange })
),
React.createElement(
FormItem,
{ label: 'Or select a file from public folder below' },
React.createElement(Input, { placeholder: 'Your CC Labs Username', name: 'username', value: username, disabled: true })
)
),
treeData.length ? React.createElement(
DirectoryTree,
{
onSelect: this.handleSelect,
loadData: this.onLoadData
},
this.renderTreeNodes(treeData)
) : React.createElement(
'div',
{ className: 'spin' },
React.createElement(Spin, null)
)
);
}
}]);
return PreferenceDialog;
}(PureComponent);
PreferenceDialog.displayName = 'PreferenceDialog';
PreferenceDialog.propTypes = {
innerRef: PropTypes.func.isRequired,
onCancel: PropTypes.func.isRequired,
onSave: PropTypes.func.isRequired,
title: PropTypes.node.isRequired,
content: PropTypes.node.isRequired,
handleChange: PropTypes.func.isRequired
};
export default PreferenceDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zb3VyY2UtbWFuYWdlci9wcmVmZXJlbmNlLWRpYWxvZy5qcyJdLCJuYW1lcyI6WyJSZWFjdCIsIlB1cmVDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJUcmVlIiwiU3BpbiIsIkZvcm0iLCJJbnB1dCIsIkRpYWxvZyIsInJlcXVpcmUiLCJUcmVlTm9kZSIsIkRpcmVjdG9yeVRyZWUiLCJGb3JtSXRlbSIsIkl0ZW0iLCJ0cmFuc2Zvcm1GaWxlTGlzdFRvVHJlZURhdGEiLCJmaWxlTGlzdCIsInRyZWVEYXRhIiwiZm9yRWFjaCIsInR5cGUiLCJuYW1lIiwicGF0aCIsIm1pbWV0eXBlIiwicHVzaCIsInRpdGxlIiwia2V5IiwiaXNMZWFmIiwidW5zaGlmdCIsIlByZWZlcmVuY2VEaWFsb2ciLCJzdGF0ZSIsInNlbGVjdGVkRmlsZXMiLCJvbkxvYWREYXRhIiwicHJvcHMiLCJkYXRhUmVmIiwiZXZlbnRLZXkiLCJjaGlsZHJlbiIsImZldGNoIiwiY2FjaGUiLCJtb2RlIiwiY3JlZGVudGlhbHMiLCJyZXNwIiwianNvbiIsImNvbnRlbnQiLCJzZXRTdGF0ZSIsImhhbmRsZVNlbGVjdCIsInNlbGVjdGVkS2V5cyIsImUiLCJzZWxlY3RlZE5vZGVzIiwiZmlsdGVyIiwibWFwIiwiaGFuZGxlU3VibWl0IiwicHJldmVudERlZmF1bHQiLCJvblNhdmUiLCJyZW5kZXJUcmVlTm9kZXMiLCJkYXRhIiwiaXRlbSIsInRoZW4iLCJpbm5lclJlZiIsIm9uQ2FuY2VsIiwiaGFuZGxlQ2hhbmdlIiwidXNlcm5hbWUiLCJsZW5ndGgiLCJkaXNwbGF5TmFtZSIsInByb3BUeXBlcyIsImZ1bmMiLCJpc1JlcXVpcmVkIiwibm9kZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBT0EsS0FBUCxJQUFnQkMsYUFBaEIsUUFBcUMsT0FBckM7QUFDQSxPQUFPQyxTQUFQLE1BQXNCLFlBQXRCO0FBQ0EsT0FBT0MsSUFBUCxNQUFpQixlQUFqQjtBQUNBLE9BQU9DLElB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QUFRaEQsVUFBVTRELElBQVYsQ0FBZUMsVUFITjtBQUlqQnpDLFNBQU9wQixVQUFVOEQsSUFBVixDQUFlRCxVQUpMO0FBS2pCdkIsV0FBU3RDLFVBQVU4RCxJQUFWLENBQWVELFVBTFA7QUFNakJOLGdCQUFjdkQsVUFBVTRELElBQVYsQ0FBZUM7QUFOWixDO2VBSEFyQyxnQiIsImZpbGUiOiJwcmVmZXJlbmNlLWRpYWxvZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnXG5pbXBvcnQgVHJlZSBmcm9tICdhbnRkL2xpYi90cmVlJ1xuaW1wb3J0IFNwaW4gZnJvbSAnYW50ZC9saWIvc3BpbidcbmltcG9ydCBGb3JtIGZyb20gJ2FudGQvbGliL2Zvcm0nXG5pbXBvcnQgSW5wdXQgZnJvbSAnYW50ZC9saWIvaW5wdXQnXG5pbXBvcnQgRGlhbG9nIGZyb20gJy4vZGlhbG9nJ1xuXG5yZXF1aXJlKCdhbnRkL2xpYi90cmVlL3N0eWxlL2luZGV4LmNzcycpXG5yZXF1aXJlKCdhbnRkL2xpYi9zcGluL3N0eWxlL2luZGV4LmNzcycpXG5yZXF1aXJlKCcuL3ByZWZlcmVuY2UtZGlhbG9nLnNjc3MnKVxuXG5jb25zdCB7IFRyZWVOb2RlLCBEaXJlY3RvcnlUcmVlIH0gPSBUcmVlXG5cbmNvbnN0IEZvcm1JdGVtID0gRm9ybS5JdGVtXG5cbmNvbnN0IHRyYW5zZm9ybUZpbGVMaXN0VG9UcmVlRGF0YSA9IChmaWxlTGlzdCkgPT4ge1xuICBjb25zdCB0cmVlRGF0YSA9IFtdXG4gIGZpbGVMaXN0LmZvckVhY2goKHtcbiAgICB0eXBlLCBuYW1lLCBwYXRoLCBtaW1ldHlwZSxcbiAgfSkgPT4ge1xuICAgIGlmICh0eXBlID09PSAnZmlsZScpIHtcbiAgICAgIHRyZWVEYXRhLnB1c2goe1xuICAgICAgICB0aXRsZTogbmFtZSwga2V5OiBwYXRoLCBtaW1ldHlwZSwgaXNMZWFmOiB0cnVlLFxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdkaXJlY3RvcnknKSB7XG4gICAgICB0cmVlRGF0YS51bnNoaWZ0KHtcbiAgICAgICAgdGl0bGU6IG5hbWUsIGtleTogcGF0aCwgbWltZXR5cGUsIGlzTGVhZjogZmFsc2UsXG4gICAgICB9KVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIHRyZWVEYXRhXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByZWZlcmVuY2VEaWFsb2cgZXh0ZW5kcyBQdXJlQ29tcG9uZW50IHtcbiAgc3RhdGljIGRpc3BsYXlOYW1lID0gJ1ByZWZlcmVuY2VEaWFsb2cnXG5cbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBpbm5lclJlZjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvbkNhbmNlbDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvblNhdmU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgdGl0bGU6IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG4gICAgY29udGVudDogUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZCxcbiAgICBoYW5kbGVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIH1cblxuICBzdGF0ZSA9IHtcbiAgICB0cmVlRGF0YTogW10sXG4gICAgc2VsZWN0ZWRGaWxlczogW10sXG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBmZXRjaCgnL3VzZXItcmVkaXJlY3QvYXBpL2NvbnRlbnRzJywgeyBjYWNoZTogJ25vLWNhY2hlJywgbW9kZTogJ2NvcnMnLCBjcmVkZW50aWFsczogJ2luY2x1ZGUnIH0pXG4gICAgICAudGhlbihyZXNwID0+IHJlc3AuanNvbigpKVxuICAgICAgLnRoZW4oKHsgY29udGVudCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHRyZWVEYXRhID0gdHJhbnNmb3JtRmlsZUxpc3RUb1RyZWVEYXRhKGNvbnRlbnQpXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB0cmVlRGF0YSB9KVxuICAgICAgfSlcbiAgfVxuXG4gIG9uTG9hZERhdGEgPSBhc3luYyAoe1xuICAgIHByb3BzOiB7XG4gICAgICBkYXRhUmVmLCBldmVudEtleSwgY2hpbGRyZW4sXG4gICAgfSxcbiAgfSkgPT4ge1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaChgL3VzZXItcmVkaXJlY3QvYXBpL2NvbnRlbnRzLyR7ZXZlbnRLZXl9YCwgeyBjYWNoZTogJ25vLWNhY2hlJywgbW9kZTogJ2NvcnMnLCBjcmVkZW50aWFsczogJ2luY2x1ZGUnIH0pXG4gICAgY29uc3QgeyBjb250ZW50IH0gPSBhd2FpdCByZXNwLmpzb24oKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIGRhdGFSZWYuY2hpbGRyZW4gPSB0cmFuc2Zvcm1GaWxlTGlzdFRvVHJlZURhdGEoY29udGVudClcbiAgICBjb25zdCB7IHRyZWVEYXRhIH0gPSB0aGlzLnN0YXRlXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICB0cmVlRGF0YTogWy4uLnRyZWVEYXRhXSxcbiAgICB9KVxuICB9XG5cbiAgaGFuZGxlU2VsZWN0ID0gKHNlbGVjdGVkS2V5cywgZSkgPT4ge1xuICAgIGNvbnN0IHsgc2VsZWN0ZWROb2RlcyB9ID0gZVxuICAgIGNvbnN0IHNlbGVjdGVkRmlsZXMgPSBzZWxlY3RlZE5vZGVzLmZpbHRlcigoeyBwcm9wczogeyBpc0xlYWYgPSBmYWxzZSB9IH0pID0+IGlzTGVhZikubWFwKCh7IGtleSB9KSA9PiBrZXkpXG4gICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdGVkRmlsZXMgfSlcbiAgfVxuXG4gIGhhbmRsZVN1Ym1pdCA9IChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICBjb25zdCB7IHNlbGVjdGVkRmlsZXMgfSA9IHRoaXMuc3RhdGVcbiAgICBjb25zdCB7IG9uU2F2ZSB9ID0gdGhpcy5wcm9wc1xuICAgIG9uU2F2ZShzZWxlY3RlZEZpbGVzKVxuICB9XG5cbiAgcmVuZGVyVHJlZU5vZGVzID0gZGF0YSA9PiBkYXRhLm1hcCgoaXRlbSkgPT4ge1xuICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8VHJlZU5vZGUgdGl0bGU9e2l0ZW0udGl0bGV9IGtleT17aXRlbS5rZXl9IGRhdGFSZWY9e2l0ZW19IG1pbWV0eXBlPXtpdGVtLm1pbWV0eXBlfSBkaXNhYmxlZD5cbiAgICAgICAgICB7dGhpcy5yZW5kZXJUcmVlTm9kZXMoaXRlbS5jaGlsZHJlbil9XG4gICAgICAgIDwvVHJlZU5vZGU+XG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiA8VHJlZU5vZGUgey4uLml0ZW19IGRhdGFSZWY9e2l0ZW19IG1pbWV0eXBlPXtpdGVtLm1pbWV0eXBlfSBzZWxlY3RhYmxlPXtpdGVtLm1pbWV0eXBlID09PSAndGV4dC9jc3YnfSAvPlxuICB9KVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBpbm5lclJlZixcbiAgICAgIG9uQ2FuY2VsLFxuICAgICAgdGl0bGUsXG4gICAgICBjb250ZW50LFxuICAgICAgaGFuZGxlQ2hhbmdlLFxuICAgICAgdXNlcm5hbWUsXG4gICAgfSA9IHRoaXMucHJvcHNcblxuICAgIGNvbnN0IHsgdHJlZURhdGEgfSA9IHRoaXMuc3RhdGVcblxuICAgIHJldHVybiAoXG4gICAgICA8RGlhbG9nXG4gICAgICAgIGlubmVyUmVmPXtpbm5lclJlZn1cbiAgICAgICAgdGl0bGU9e3RpdGxlfVxuICAgICAgICBvbkNhbmNlbD17b25DYW5jZWx9XG4gICAgICAgIG9uU3VibWl0PXt0aGlzLmhhbmRsZVN1Ym1pdH1cbiAgICAgICAgb2tUZXh0PVwiTmV4dFwiXG4gICAgICA+XG4gICAgICAgIHtjb250ZW50fVxuICAgICAgICA8Rm9ybSBsYXlvdXQ9XCJob3Jpem9udGFsXCI+XG4gICAgICAgICAgPEZvcm1JdGVtIGxhYmVsPVwiQ1NWIEZpbGUgVVJMXCI+XG4gICAgICAgICAgICA8SW5wdXQgcGxhY2Vob2xkZXI9XCJodHRwczovL2dpc3QuZ2l0aHViLmNvbS91c2VybmFtZS9maWxlLmNzdlwiIG5hbWU9XCJjc3ZVcmxcIiBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfSAvPlxuICAgICAgICAgIDwvRm9ybUl0ZW0+XG4gICAgICAgICAgPEZvcm1JdGVtIGxhYmVsPVwiT3Igc2VsZWN0IGEgZmlsZSBmcm9tIHB1YmxpYyBmb2xkZXIgYmVsb3dcIj5cbiAgICAgICAgICAgIDxJbnB1dCBwbGFjZWhvbGRlcj1cIllvdXIgQ0MgTGFicyBVc2VybmFtZVwiIG5hbWU9XCJ1c2VybmFtZVwiIHZhbHVlPXt1c2VybmFtZX0gZGlzYWJsZWQgLz5cbiAgICAgICAgICA8L0Zvcm1JdGVtPlxuICAgICAgICA8L0Zvcm0+XG4gICAgICAgIHt0cmVlRGF0YS5sZW5ndGhcbiAgICAgICAgICA/IChcbiAgICAgICAgICAgIDxEaXJlY3RvcnlUcmVlXG4gICAgICAgICAgICAgIG9uU2VsZWN0PXt0aGlzLmhhbmRsZVNlbGVjdH1cbiAgICAgICAgICAgICAgbG9hZERhdGE9e3RoaXMub25Mb2FkRGF0YX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3RoaXMucmVuZGVyVHJlZU5vZGVzKHRyZWVEYXRhKX1cbiAgICAgICAgICAgIDwvRGlyZWN0b3J5VHJlZT4pXG4gICAgICAgICAgOiA8ZGl2IGNsYXNzTmFtZT1cInNwaW5cIj48U3BpbiAvPjwvZGl2Pn1cbiAgICAgIDwvRGlhbG9nPlxuICAgIClcbiAgfVxufVxuIl19