@cognitive-class/jupyterlab-cde-plugin
Version:
Drop-in Cognos Dashboard Embedded plugin for Jupyterlab
286 lines (221 loc) • 20.8 kB
JavaScript
'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=