UNPKG

@cognitive-class/jupyterlab-cde-plugin

Version:

Drop-in Cognos Dashboard Embedded plugin for Jupyterlab

286 lines (221 loc) 20.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _tree = require('antd/lib/tree'); var _tree2 = _interopRequireDefault(_tree); var _spin = require('antd/lib/spin'); var _spin2 = _interopRequireDefault(_spin); var _form = require('antd/lib/form'); var _form2 = _interopRequireDefault(_form); var _input = require('antd/lib/input'); var _input2 = _interopRequireDefault(_input); var _dialog = require('./dialog'); var _dialog2 = _interopRequireDefault(_dialog); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } require('antd/lib/tree/style/index.css'); require('antd/lib/spin/style/index.css'); require('./preference-dialog.scss'); var TreeNode = _tree2.default.TreeNode, DirectoryTree = _tree2.default.DirectoryTree; var FormItem = _form2.default.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) { (0, _inherits3.default)(PreferenceDialog, _PureComponent); function PreferenceDialog() { var _ref2, _this2 = this; var _temp, _this, _ret; (0, _classCallCheck3.default)(this, PreferenceDialog); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref2 = PreferenceDialog.__proto__ || (0, _getPrototypeOf2.default)(PreferenceDialog)).call.apply(_ref2, [this].concat(args))), _this), _this.state = { treeData: [], selectedFiles: [] }, _this.onLoadData = function () { var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.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 _regenerator2.default.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((0, _toConsumableArray3.default)(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 _react2.default.createElement( TreeNode, { title: item.title, key: item.key, dataRef: item, mimetype: item.mimetype, disabled: true }, _this.renderTreeNodes(item.children) ); } return _react2.default.createElement(TreeNode, (0, _extends3.default)({}, item, { dataRef: item, mimetype: item.mimetype, selectable: item.mimetype === 'text/csv' })); }); }, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret); } (0, _createClass3.default)(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 _react2.default.createElement( _dialog2.default, { innerRef: innerRef, title: title, onCancel: onCancel, onSubmit: this.handleSubmit, okText: 'Next' }, content, _react2.default.createElement( _form2.default, { layout: 'horizontal' }, _react2.default.createElement( FormItem, { label: 'CSV File URL' }, _react2.default.createElement(_input2.default, { placeholder: 'https://gist.github.com/username/file.csv', name: 'csvUrl', onChange: handleChange }) ), _react2.default.createElement( FormItem, { label: 'Or select a file from public folder below' }, _react2.default.createElement(_input2.default, { placeholder: 'Your CC Labs Username', name: 'username', value: username, disabled: true }) ) ), treeData.length ? _react2.default.createElement( DirectoryTree, { onSelect: this.handleSelect, loadData: this.onLoadData }, this.renderTreeNodes(treeData) ) : _react2.default.createElement( 'div', { className: 'spin' }, _react2.default.createElement(_spin2.default, null) ) ); } }]); return PreferenceDialog; }(_react.PureComponent); PreferenceDialog.displayName = 'PreferenceDialog'; PreferenceDialog.propTypes = { innerRef: _propTypes2.default.func.isRequired, onCancel: _propTypes2.default.func.isRequired, onSave: _propTypes2.default.func.isRequired, title: _propTypes2.default.node.isRequired, content: _propTypes2.default.node.isRequired, handleChange: _propTypes2.default.func.isRequired }; exports.default = PreferenceDialog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zb3VyY2UtbWFuYWdlci9wcmVmZXJlbmNlLWRpYWxvZy5qcyJdLCJuYW1lcyI6WyJyZXF1aXJlIiwiVHJlZU5vZGUiLCJUcmVlIiwiRGlyZWN0b3J5VHJlZSIsIkZvcm1JdGVtIiwiRm9ybSIsIkl0ZW0iLCJ0cmFuc2Zvcm1GaWxlTGlzdFRvVHJlZURhdGEiLCJmaWxlTGlzdCIsInRyZWVEYXRhIiwiZm9yRWFjaCIsInR5cGUiLCJuYW1lIiwicGF0aCIsIm1pbWV0eXBlIiwicHVzaCIsInRpdGxlIiwia2V5IiwiaXNMZWFmIiwidW5zaGlmdCIsIlByZWZlcmVuY2VEaWFsb2ciLCJzdGF0ZSIsInNlbGVjdGVkRmlsZXMiLCJvbkxvYWREYXRhIiwicHJvcHMiLCJkYXRhUmVmIiwiZXZlbnRLZXkiLCJjaGlsZHJlbiIsImZldGNoIiwiY2FjaGUiLCJtb2RlIiwiY3JlZGVudGlhbHMiLCJyZXNwIiwianNvbiIsImNvbnRlbnQiLCJzZXRTdGF0ZSIsImhhbmRsZVNlbGVjdCIsInNlbGVjdGVkS2V5cyIsImUiLCJzZWxlY3RlZE5vZGVzIiwiZmlsdGVyIiwibWFwIiwiaGFuZGxlU3VibWl0IiwicHJldmVudERlZmF1bHQiLCJvblNhdmUiLCJyZW5kZXJUcmVlTm9kZXMiLCJkYXRhIiwiaXRlbSIsInRoZW4iLCJpbm5lclJlZiIsIm9uQ2FuY2VsIiwiaGFuZGxlQ2hhbmdlIiwidXNlcm5hbWUiLCJsZW5ndGgiLCJQdXJlQ29tcG9uZW50IiwiZGlzcGxheU5hbWUiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJmdW5jIiwiaXNSZXF1aXJlZCIsIm5vZGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7QUFFQUEsUUFBUSwrQkFBUjtBQUNBQSxRQUFRLCtCQUFSO0FBQ0FBLFFBQVEsMEJBQVI7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LGdCIiwiZmlsZSI6InByZWZlcmVuY2UtZGlhbG9nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcydcbmltcG9ydCBUcmVlIGZyb20gJ2FudGQvbGliL3RyZWUnXG5pbXBvcnQgU3BpbiBmcm9tICdhbnRkL2xpYi9zcGluJ1xuaW1wb3J0IEZvcm0gZnJvbSAnYW50ZC9saWIvZm9ybSdcbmltcG9ydCBJbnB1dCBmcm9tICdhbnRkL2xpYi9pbnB1dCdcbmltcG9ydCBEaWFsb2cgZnJvbSAnLi9kaWFsb2cnXG5cbnJlcXVpcmUoJ2FudGQvbGliL3RyZWUvc3R5bGUvaW5kZXguY3NzJylcbnJlcXVpcmUoJ2FudGQvbGliL3NwaW4vc3R5bGUvaW5kZXguY3NzJylcbnJlcXVpcmUoJy4vcHJlZmVyZW5jZS1kaWFsb2cuc2NzcycpXG5cbmNvbnN0IHsgVHJlZU5vZGUsIERpcmVjdG9yeVRyZWUgfSA9IFRyZWVcblxuY29uc3QgRm9ybUl0ZW0gPSBGb3JtLkl0ZW1cblxuY29uc3QgdHJhbnNmb3JtRmlsZUxpc3RUb1RyZWVEYXRhID0gKGZpbGVMaXN0KSA9PiB7XG4gIGNvbnN0IHRyZWVEYXRhID0gW11cbiAgZmlsZUxpc3QuZm9yRWFjaCgoe1xuICAgIHR5cGUsIG5hbWUsIHBhdGgsIG1pbWV0eXBlLFxuICB9KSA9PiB7XG4gICAgaWYgKHR5cGUgPT09ICdmaWxlJykge1xuICAgICAgdHJlZURhdGEucHVzaCh7XG4gICAgICAgIHRpdGxlOiBuYW1lLCBrZXk6IHBhdGgsIG1pbWV0eXBlLCBpc0xlYWY6IHRydWUsXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RpcmVjdG9yeScpIHtcbiAgICAgIHRyZWVEYXRhLnVuc2hpZnQoe1xuICAgICAgICB0aXRsZTogbmFtZSwga2V5OiBwYXRoLCBtaW1ldHlwZSwgaXNMZWFmOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfVxuICB9KVxuICByZXR1cm4gdHJlZURhdGFcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJlZmVyZW5jZURpYWxvZyBleHRlbmRzIFB1cmVDb21wb25lbnQge1xuICBzdGF0aWMgZGlzcGxheU5hbWUgPSAnUHJlZmVyZW5jZURpYWxvZydcblxuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGlubmVyUmVmOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIG9uQ2FuY2VsOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIG9uU2F2ZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICB0aXRsZTogUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZCxcbiAgICBjb250ZW50OiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuICAgIGhhbmRsZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgfVxuXG4gIHN0YXRlID0ge1xuICAgIHRyZWVEYXRhOiBbXSxcbiAgICBzZWxlY3RlZEZpbGVzOiBbXSxcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGZldGNoKCcvdXNlci1yZWRpcmVjdC9hcGkvY29udGVudHMnLCB7IGNhY2hlOiAnbm8tY2FjaGUnLCBtb2RlOiAnY29ycycsIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScgfSlcbiAgICAgIC50aGVuKHJlc3AgPT4gcmVzcC5qc29uKCkpXG4gICAgICAudGhlbigoeyBjb250ZW50IH0pID0+IHtcbiAgICAgICAgY29uc3QgdHJlZURhdGEgPSB0cmFuc2Zvcm1GaWxlTGlzdFRvVHJlZURhdGEoY29udGVudClcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHRyZWVEYXRhIH0pXG4gICAgICB9KVxuICB9XG5cbiAgb25Mb2FkRGF0YSA9IGFzeW5jICh7XG4gICAgcHJvcHM6IHtcbiAgICAgIGRhdGFSZWYsIGV2ZW50S2V5LCBjaGlsZHJlbixcbiAgICB9LFxuICB9KSA9PiB7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKGAvdXNlci1yZWRpcmVjdC9hcGkvY29udGVudHMvJHtldmVudEtleX1gLCB7IGNhY2hlOiAnbm8tY2FjaGUnLCBtb2RlOiAnY29ycycsIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScgfSlcbiAgICBjb25zdCB7IGNvbnRlbnQgfSA9IGF3YWl0IHJlc3AuanNvbigpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgZGF0YVJlZi5jaGlsZHJlbiA9IHRyYW5zZm9ybUZpbGVMaXN0VG9UcmVlRGF0YShjb250ZW50KVxuICAgIGNvbnN0IHsgdHJlZURhdGEgfSA9IHRoaXMuc3RhdGVcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHRyZWVEYXRhOiBbLi4udHJlZURhdGFdLFxuICAgIH0pXG4gIH1cblxuICBoYW5kbGVTZWxlY3QgPSAoc2VsZWN0ZWRLZXlzLCBlKSA9PiB7XG4gICAgY29uc3QgeyBzZWxlY3RlZE5vZGVzIH0gPSBlXG4gICAgY29uc3Qgc2VsZWN0ZWRGaWxlcyA9IHNlbGVjdGVkTm9kZXMuZmlsdGVyKCh7IHByb3BzOiB7IGlzTGVhZiA9IGZhbHNlIH0gfSkgPT4gaXNMZWFmKS5tYXAoKHsga2V5IH0pID0+IGtleSlcbiAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWRGaWxlcyB9KVxuICB9XG5cbiAgaGFuZGxlU3VibWl0ID0gKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KClcblxuICAgIGNvbnN0IHsgc2VsZWN0ZWRGaWxlcyB9ID0gdGhpcy5zdGF0ZVxuICAgIGNvbnN0IHsgb25TYXZlIH0gPSB0aGlzLnByb3BzXG4gICAgb25TYXZlKHNlbGVjdGVkRmlsZXMpXG4gIH1cblxuICByZW5kZXJUcmVlTm9kZXMgPSBkYXRhID0+IGRhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxUcmVlTm9kZSB0aXRsZT17aXRlbS50aXRsZX0ga2V5PXtpdGVtLmtleX0gZGF0YVJlZj17aXRlbX0gbWltZXR5cGU9e2l0ZW0ubWltZXR5cGV9IGRpc2FibGVkPlxuICAgICAgICAgIHt0aGlzLnJlbmRlclRyZWVOb2RlcyhpdGVtLmNoaWxkcmVuKX1cbiAgICAgICAgPC9UcmVlTm9kZT5cbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIDxUcmVlTm9kZSB7Li4uaXRlbX0gZGF0YVJlZj17aXRlbX0gbWltZXR5cGU9e2l0ZW0ubWltZXR5cGV9IHNlbGVjdGFibGU9e2l0ZW0ubWltZXR5cGUgPT09ICd0ZXh0L2Nzdid9IC8+XG4gIH0pXG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlubmVyUmVmLFxuICAgICAgb25DYW5jZWwsXG4gICAgICB0aXRsZSxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBoYW5kbGVDaGFuZ2UsXG4gICAgICB1c2VybmFtZSxcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgY29uc3QgeyB0cmVlRGF0YSB9ID0gdGhpcy5zdGF0ZVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxEaWFsb2dcbiAgICAgICAgaW5uZXJSZWY9e2lubmVyUmVmfVxuICAgICAgICB0aXRsZT17dGl0bGV9XG4gICAgICAgIG9uQ2FuY2VsPXtvbkNhbmNlbH1cbiAgICAgICAgb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fVxuICAgICAgICBva1RleHQ9XCJOZXh0XCJcbiAgICAgID5cbiAgICAgICAge2NvbnRlbnR9XG4gICAgICAgIDxGb3JtIGxheW91dD1cImhvcml6b250YWxcIj5cbiAgICAgICAgICA8Rm9ybUl0ZW0gbGFiZWw9XCJDU1YgRmlsZSBVUkxcIj5cbiAgICAgICAgICAgIDxJbnB1dCBwbGFjZWhvbGRlcj1cImh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3VzZXJuYW1lL2ZpbGUuY3N2XCIgbmFtZT1cImNzdlVybFwiIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9IC8+XG4gICAgICAgICAgPC9Gb3JtSXRlbT5cbiAgICAgICAgICA8Rm9ybUl0ZW0gbGFiZWw9XCJPciBzZWxlY3QgYSBmaWxlIGZyb20gcHVibGljIGZvbGRlciBiZWxvd1wiPlxuICAgICAgICAgICAgPElucHV0IHBsYWNlaG9sZGVyPVwiWW91ciBDQyBMYWJzIFVzZXJuYW1lXCIgbmFtZT1cInVzZXJuYW1lXCIgdmFsdWU9e3VzZXJuYW1lfSBkaXNhYmxlZCAvPlxuICAgICAgICAgIDwvRm9ybUl0ZW0+XG4gICAgICAgIDwvRm9ybT5cbiAgICAgICAge3RyZWVEYXRhLmxlbmd0aFxuICAgICAgICAgID8gKFxuICAgICAgICAgICAgPERpcmVjdG9yeVRyZWVcbiAgICAgICAgICAgICAgb25TZWxlY3Q9e3RoaXMuaGFuZGxlU2VsZWN0fVxuICAgICAgICAgICAgICBsb2FkRGF0YT17dGhpcy5vbkxvYWREYXRhfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJUcmVlTm9kZXModHJlZURhdGEpfVxuICAgICAgICAgICAgPC9EaXJlY3RvcnlUcmVlPilcbiAgICAgICAgICA6IDxkaXYgY2xhc3NOYW1lPVwic3BpblwiPjxTcGluIC8+PC9kaXY+fVxuICAgICAgPC9EaWFsb2c+XG4gICAgKVxuICB9XG59XG4iXX0=