UNPKG

feeles-ide

Version:

The hackable and serializable IDE to make learning material

387 lines (328 loc) 12.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "SourceEditor", { enumerable: true, get: function get() { return _SourceEditor.default; } }); Object.defineProperty(exports, "Preview", { enumerable: true, get: function get() { return _Preview.default; } }); exports.default = exports.Tab = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _react = _interopRequireWildcard(require("react")); var _styles = require("@material-ui/core/styles"); var _propTypes = _interopRequireDefault(require("prop-types")); var _typestyle = require("typestyle"); var _Button = _interopRequireDefault(require("@material-ui/core/Button")); var _PlayCircleOutline = _interopRequireDefault(require("@material-ui/icons/PlayCircleOutline")); var _CardWindow = _interopRequireDefault(require("../CardWindow")); var _SourceEditor = _interopRequireDefault(require("./SourceEditor")); var _Preview = _interopRequireDefault(require("./Preview")); var _dec, _class, _class2, _temp; var cn = { largeIcon: (0, _typestyle.style)({ width: 40, height: 40 }), large: (0, _typestyle.style)({ width: 80, height: 80, padding: 20 }) }; var getCn = function getCn(props) { return { noFileBg: (0, _typestyle.style)({ flex: '1 1 auto', display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: props.theme.palette.primary.main }) }; }; var Tab = /*#__PURE__*/ function () { function Tab(_ref) { var label = _ref.label, filePath = _ref.filePath, iconUrl = _ref.iconUrl, tabs = _ref.tabs; (0, _classCallCheck2.default)(this, Tab); this.label = label; this.iconUrl = iconUrl; if (filePath) { this.filePath = filePath; } else if (tabs) { this.tabs = tabs.map(function (props) { return new Tab(props); }); } } (0, _createClass2.default)(Tab, null, [{ key: "find", value: function find(tabs, filePath) { var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = tabs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var tab = _step.value; if (tab.filePath === filePath) return tab; } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = tabs[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var _tab = _step2.value; if (Array.isArray(_tab.tabs)) { var found = Tab.find(_tab.tabs, filePath); if (found) return found; } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return != null) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } } }]); return Tab; }(); exports.Tab = Tab; var EditorCard = (_dec = (0, _styles.withTheme)(), _dec(_class = (_temp = _class2 = /*#__PURE__*/ function (_PureComponent) { (0, _inherits2.default)(EditorCard, _PureComponent); function EditorCard() { var _getPrototypeOf2; var _this; (0, _classCallCheck2.default)(this, EditorCard); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(EditorCard)).call.apply(_getPrototypeOf2, [this].concat(args))); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "state", { filePath: '', // 現在開いているファイルの名前. 空文字の場合は何も開いていない tabs: [], // プルダウンメニューの中で表示するファイルのリスト label: '', // このファイルの呼び名(アセットから取得する) iconUrl: '', // このファイルのアイコン(アセットから取得する) filePathToBack: '' // 最初に表示するファイルのパス. ホーム }); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "openFile", function (filePath) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (!filePath || filePath === _this.state.filePath) return; var file = _this.props.findFile(filePath); // file type を知るために探す if (!file) return; // ファイルが見つからなかった if (file.is('text')) { // テキストの場合は EditorCard で open var tabs = _this.state.tabs; var existTab = Tab.find(tabs, filePath); if (!existTab) { // 開こうとしているファイルを tabs の先頭に追加 var tab = new Tab({ filePath: filePath, label: file.plain + file.ext }); tabs = [tab].concat(tabs); } _this.setState({ filePath: filePath, tabs: tabs, label: options.label ? options.label + '' : existTab ? existTab.label : file.plain, iconUrl: options.iconUrl || '' }); _this.props.setCardVisibility('EditorCard', true); // タブの選択が変化したら EditorCard にスクロールする _this.props.scrollToCard('EditorCard'); } else { // BinaryFile の場合は別タブで開く try { window.open(file.blobURL, '_blank'); } catch (e) {// continue regardless of error } } }); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "setLocation", function (href) { _this.props.setLocation(href); _this.props.scrollToCard('MonitorCard'); }); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleEditor", function (event) { var _event$data = event.data, value = _event$data.value, options = _event$data.options; if (value) { // feeles.openEditor() _this.openFile(value, options); } else { // feeles.closeEditor() _this.props.setCardVisibility('EditorCard', false); } }); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "getFiles", function () { return _this.props.files; }); return _this; } (0, _createClass2.default)(EditorCard, [{ key: "componentDidMount", value: function componentDidMount() { var _this2 = this; var globalEvent = this.props.globalEvent; globalEvent.on('message.editor', this.handleEditor); // init.fileName があるとき Mount 後に開いておく try { var init = this.props.cardProps.EditorCard.init; if (init) { new Promise(function (resolve) { if (Array.isArray(init.tabs)) { var tabs = init.tabs.map(function (seed) { return new Tab(seed); }); _this2.setState({ tabs: tabs }, resolve); } else { resolve(); } }).then(function () { var filePath = init.filePath || init.fileName; // 後方互換性 _this2.setState({ filePathToBack: filePath }); // ホームに設定 _this2.openFile(filePath); }); } } catch (e) {// continue regardless of error } } }, { key: "renderBackground", value: function renderBackground(className) { var _this3 = this; return _react.default.createElement("div", { className: className }, _react.default.createElement(_Button.default, { variant: "contained", size: "large", onClick: function onClick() { return _this3.setLocation(); } }, "Feeles", _react.default.createElement(_PlayCircleOutline.default, { className: cn.largeIcon }))); } }, { key: "render", value: function render() { var filePath = this.state.filePath; var dcn = getCn(this.props); if (!filePath) { return _react.default.createElement(_CardWindow.default, (0, _extends2.default)({}, this.props.cardPropsBag, { fit: true }), this.renderBackground(dcn.noFileBg)); } var _this$props = this.props, putFile = _this$props.putFile, openFileDialog = _this$props.openFileDialog, localization = _this$props.localization, findFile = _this$props.findFile, getConfig = _this$props.getConfig, reboot = _this$props.reboot, cardPropsBag = _this$props.cardPropsBag; return _react.default.createElement(_CardWindow.default, (0, _extends2.default)({}, cardPropsBag, { fit: true, flexBasis: this.props.isExpandingEditorCard ? '75%' : '50%' }), _react.default.createElement(_SourceEditor.default, { fileView: this.props.fileView, filePath: filePath, files: this.props.files, getFiles: this.getFiles, setLocation: this.setLocation, href: this.props.href, getConfig: getConfig, loadConfig: this.props.loadConfig, findFile: findFile, localization: localization, reboot: reboot, openFileDialog: openFileDialog, putFile: putFile, tabs: this.state.tabs, label: this.state.label, iconUrl: this.state.iconUrl, filePathToBack: this.state.filePathToBack, globalEvent: this.props.globalEvent, asset: this.props.asset, isExpandingEditorCard: this.props.isExpandingEditorCard, setExpandingEditorCard: this.props.setExpandingEditorCard })); } }]); return EditorCard; }(_react.PureComponent), (0, _defineProperty2.default)(_class2, "propTypes", { theme: _propTypes.default.object.isRequired, fileView: _propTypes.default.object.isRequired, cardPropsBag: _propTypes.default.object.isRequired, files: _propTypes.default.array.isRequired, putFile: _propTypes.default.func.isRequired, setLocation: _propTypes.default.func.isRequired, openFileDialog: _propTypes.default.func.isRequired, localization: _propTypes.default.object.isRequired, findFile: _propTypes.default.func.isRequired, getConfig: _propTypes.default.func.isRequired, setConfig: _propTypes.default.func.isRequired, loadConfig: _propTypes.default.func.isRequired, reboot: _propTypes.default.bool.isRequired, href: _propTypes.default.string.isRequired, scrollToCard: _propTypes.default.func.isRequired, cardProps: _propTypes.default.object.isRequired, setCardVisibility: _propTypes.default.func.isRequired, globalEvent: _propTypes.default.object.isRequired, asset: _propTypes.default.object, isExpandingEditorCard: _propTypes.default.bool.isRequired, setExpandingEditorCard: _propTypes.default.func.isRequired }), _temp)) || _class); exports.default = EditorCard;