UNPKG

feeles-ide

Version:

The hackable and serializable IDE to make learning material

381 lines (338 loc) 13.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 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 _react = _interopRequireWildcard(require("react")); var _styles = require("@material-ui/core/styles"); var _colorManipulator = require("@material-ui/core/styles/colorManipulator"); var _propTypes = _interopRequireDefault(require("prop-types")); var _typestyle = require("typestyle"); var _csx = require("csx"); var _Popover = _interopRequireDefault(require("@material-ui/core/Popover")); var _Button = _interopRequireDefault(require("@material-ui/core/Button")); var _ButtonBase = _interopRequireDefault(require("@material-ui/core/ButtonBase")); var _Typography = _interopRequireDefault(require("@material-ui/core/Typography")); var _Add = _interopRequireDefault(require("@material-ui/icons/Add")); var _Description = _interopRequireDefault(require("@material-ui/icons/Description")); var _AssetPane = require("./AssetPane"); var _dec, _class, _class2, _temp; var iconSize = 48; var cn = { mainButton: (0, _typestyle.style)({ width: 80, height: 80, display: 'flex', flexDirection: 'column', alignItems: 'stretch' }), mainIcon: (0, _typestyle.style)({ flex: 1, backgroundSize: 'contain', backgroundPosition: '50% 50%', backgroundRepeat: 'no-repeat' }), actions: (0, _typestyle.style)({ display: 'flex', justifyContent: 'space-between', marginTop: 2 }), iconButton: (0, _typestyle.style)({ flex: 1, minWidth: 36 }), popoverClasses: { paper: (0, _typestyle.style)({ padding: 8, maxWidth: 500 }) }, label: (0, _typestyle.style)({ fontSize: 10, fontWeight: 600 }), blank: (0, _typestyle.style)({ display: 'inline-flex', width: 8 }), variationWrapper: (0, _typestyle.style)({ display: 'flex', flexWrap: 'nowrap', justifyContent: 'flex-start' }) }; var getCn = function getCn(_ref) { var theme = _ref.theme; return { root: (0, _typestyle.style)({ position: 'relative', margin: '8px 30px 0px 8px' }), button: (0, _typestyle.style)({ color: theme.palette.getContrastText(theme.palette.text.primary), transition: theme.transitions.create('background-color'), backgroundColor: (0, _colorManipulator.fade)(theme.palette.grey[600], 0.6), $nest: { '&:hover': { backgroundColor: theme.palette.grey[600] }, '&:disabled': { color: theme.palette.text.disabled } } }), variation: (0, _typestyle.style)({ maxWidth: iconSize, height: iconSize, boxSizing: 'content-box', borderStyle: 'solid', borderWidth: 2, borderColor: 'transparent', borderRadius: theme.shape.borderRadius, marginRight: theme.spacing.unit, marginBottom: theme.spacing.unit, cursor: 'pointer', backgroundColor: theme.palette.grey[200], $nest: { '&:hover': { backgroundColor: theme.palette.grey[400] }, '&>img': { maxWidth: iconSize, height: iconSize } } }), selected: (0, _typestyle.style)({ borderColor: '#4A90E2', backgroundColor: theme.palette.grey[400] }) }; }; var AssetButton = (_dec = (0, _styles.withTheme)(), _dec(_class = (_temp = _class2 = /*#__PURE__*/ function (_PureComponent) { (0, _inherits2.default)(AssetButton, _PureComponent); function AssetButton() { var _getPrototypeOf2; var _this; (0, _classCallCheck2.default)(this, AssetButton); 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)(AssetButton)).call.apply(_getPrototypeOf2, [this].concat(args))); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "state", { anchorEl: null, backgroundStyle: {}, selectedIndex: 0 // 選択中の variation }); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleOpen", function (event) { // リンクのみ表示なら「改造する」, そうでなければ Popover を開く if (_this.props.linkOnly) { _this.handleOpenFile(); } else { _this.setState({ anchorEl: event.currentTarget }); } }); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleClose", function () { _this.setState({ anchorEl: null }); }); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleInsertAsset", function () { var _this$props = _this.props, name = _this$props.name, insertCode = _this$props.insertCode; _this.handleClose(); _this.props.insertAsset({ name: name, insertCode: insertCode }); }); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleInsertAssetSelected", function () { _this.handleClose(); _this.props.insertAsset(_this.selected); }); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleOpenFile", function () { _this.handleClose(); _this.props.openFile({ name: _this.props.name, filePath: _this.filePathToOpen, iconUrl: _this.props.iconUrl }); }); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleOpenFileSelected", function () { _this.handleClose(); _this.props.openFile({ name: _this.selected.name, filePath: _this.filePathToOpenSelected, iconUrl: _this.selected.iconUrl }); }); return _this; } (0, _createClass2.default)(AssetButton, [{ key: "render", value: function render() { var _this2 = this; var dcn = getCn(this.props); var _this$props2 = this.props, localization = _this$props2.localization, variations = _this$props2.variations, linkOnly = _this$props2.linkOnly; var selectedIndex = this.state.selectedIndex; var selected = this.selected; // Popover の中は選択中のバリエーションに切り替わる return _react.default.createElement(_react.default.Fragment, null, _react.default.createElement("div", { className: dcn.root }, _react.default.createElement(_ButtonBase.default, { focusRipple: true, className: (0, _typestyle.classes)(dcn.button, cn.mainButton), onClick: this.handleOpen }, _react.default.createElement("div", { className: cn.mainIcon, style: this.state.backgroundStyle }), _react.default.createElement("span", { className: cn.label }, this.props.name)), linkOnly ? null : _react.default.createElement("div", { className: cn.actions }, _react.default.createElement(_ButtonBase.default, { focusRipple: true, disabled: !this.props.insertCode, className: (0, _typestyle.classes)(dcn.button, cn.iconButton), onClick: this.handleInsertAsset }, _react.default.createElement(_Add.default, null)), _react.default.createElement(_ButtonBase.default, { focusRipple: true, disabled: !this.filePathToOpen, className: (0, _typestyle.classes)(dcn.button, cn.iconButton), onClick: this.handleOpenFile }, _react.default.createElement(_Description.default, null)))), linkOnly ? null : _react.default.createElement(_Popover.default, { open: Boolean(this.state.anchorEl), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, anchorEl: this.state.anchorEl, classes: cn.popoverClasses, onClose: this.handleClose }, _react.default.createElement(_Typography.default, { variant: "h5" }, selected.name), _react.default.createElement(_Typography.default, { variant: "body1", gutterBottom: true }, selected.description), variations && _react.default.createElement("div", { className: cn.variationWrapper }, variations.map(function (child, i) { return _react.default.createElement("div", { key: i, className: (0, _typestyle.classes)(dcn.variation, selectedIndex === i && dcn.selected), onClick: function onClick() { return _this2.setState({ selectedIndex: i }); } }, _react.default.createElement("img", { src: child.iconUrl, alt: child.name })); })), _react.default.createElement("div", null, _react.default.createElement(_Button.default, { variant: "contained", color: "primary", disabled: !selected.insertCode, onClick: this.handleInsertAssetSelected }, _react.default.createElement(_Add.default, null), localization.editorCard.insert), _react.default.createElement("span", { className: cn.blank }), _react.default.createElement(_Button.default, { variant: "outlined", color: "primary", disabled: !this.filePathToOpenSelected, onClick: this.handleOpenFileSelected }, _react.default.createElement(_Description.default, null), localization.editorCard.edit(selected.name))))); } }, { key: "selected", get: function get() { var _this$props3 = this.props, name = _this$props3.name, description = _this$props3.description, iconUrl = _this$props3.iconUrl, insertCode = _this$props3.insertCode, moduleCode = _this$props3.moduleCode, filePath = _this$props3.filePath, variations = _this$props3.variations; return variations ? variations[this.state.selectedIndex] : { name: name, description: description, iconUrl: iconUrl, insertCode: insertCode, moduleCode: moduleCode, filePath: filePath }; } }, { key: "filePathToOpen", get: function get() { // 最初から存在するファイルにアクセス => filePath // 追加してからアクセス => asset.module[name] var _this$props4 = this.props, filePath = _this$props4.filePath, asset = _this$props4.asset, name = _this$props4.name; return filePath || (asset.module[name] ? "".concat(_AssetPane.pathToInstall, "/").concat(name, ".js") : null); } }, { key: "filePathToOpenSelected", get: function get() { // 最初から存在するファイルにアクセス => filePath // 追加してからアクセス => asset.module[name] var selected = this.selected; return selected.filePath || (this.props.asset.module[selected.name] ? "".concat(_AssetPane.pathToInstall, "/").concat(selected.name, ".js") : null); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, state) { if (props.iconUrl) { var backgroundImage = (0, _csx.url)(props.iconUrl); if (backgroundImage && backgroundImage !== state.backgroundStyle.backgroundImage) { return { backgroundStyle: { backgroundImage: backgroundImage } }; } } return null; } }]); return AssetButton; }(_react.PureComponent), (0, _defineProperty2.default)(_class2, "propTypes", { name: _propTypes.default.string, description: _propTypes.default.string, iconUrl: _propTypes.default.string, insertCode: _propTypes.default.string, moduleCode: _propTypes.default.string, filePath: _propTypes.default.string, variations: _propTypes.default.array, theme: _propTypes.default.object.isRequired, insertAsset: _propTypes.default.func.isRequired, openFile: _propTypes.default.func.isRequired, findFile: _propTypes.default.func.isRequired, localization: _propTypes.default.object.isRequired, globalEvent: _propTypes.default.object.isRequired, asset: _propTypes.default.object.isRequired, linkOnly: _propTypes.default.bool.isRequired }), (0, _defineProperty2.default)(_class2, "defaultProps", { name: '', description: '' }), _temp)) || _class); exports.default = AssetButton;