diff --git a/client/dist/bundle.min.js b/client/dist/bundle.min.js index dc6b836..cf72b55 100644 --- a/client/dist/bundle.min.js +++ b/client/dist/bundle.min.js @@ -47,7 +47,8 @@ 'use strict'; __webpack_require__(1); - __webpack_require__(14); + __webpack_require__(7); + __webpack_require__(8); /***/ }), /* 1 */ @@ -71,29 +72,10 @@ var _Injector = __webpack_require__(6); - var _InsertEmbedModal = __webpack_require__(7); - - var _InsertEmbedModal2 = _interopRequireDefault(_InsertEmbedModal); - - var _MarkdownEmbedModal = __webpack_require__(13); - - var _MarkdownEmbedModal2 = _interopRequireDefault(_MarkdownEmbedModal); - - var _FormBuilderModal = __webpack_require__(11); - - var _FormBuilderModal2 = _interopRequireDefault(_FormBuilderModal); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // import { ApolloProvider } from 'react-apollo'; - console.log(window.InsertEmbedModal); - // import InsertEmbedModal from 'components/InsertEmbedModal/InsertEmbedModal'; + var InjectableInsertEmbedModal = (0, _Injector.provideInjector)(window.InsertEmbedModal.default); - console.log(_InsertEmbedModal2.default); - var InjectableInsertEmbedModal = (0, _Injector.provideInjector)(_InsertEmbedModal2.default); - var filter = 'div[data-shortcode="embed"]'; - - console.log(InjectableInsertEmbedModal); _jquery2.default.entwine('ss', function ($) { $('#insert-md-embed-react__dialog-wrapper').entwine({ @@ -127,15 +109,12 @@ _renderModal: function _renderModal(show) { var _this = this; - // alert('test'); var handleHide = function handleHide() { return _this.close(); }; - // Inserts embed into page var handleInsert = function handleInsert() { return _this._handleInsert.apply(_this, arguments); }; - // Create edit form from url var handleCreate = function handleCreate() { return _this._handleCreate.apply(_this, arguments); }; @@ -152,7 +131,6 @@ { store: store, client: client }, _react2.default.createElement(InjectableInsertEmbedModal, { show: show, - type: 'insert-media', onCreate: handleCreate, onInsert: handleInsert, onHide: handleHide, @@ -246,7 +224,12 @@ var pos = $field.codemirror.getCursor(); $field.codemirror.setSelection(pos, pos); $field.codemirror.replaceSelection("\n" + $('
').append(base.clone()).html() + "\n"); + updateTextarea(); return true; + }, + updateTextarea: function updateTextarea() { + var $field = this.getElement(); + $($field.element).closest('.js-markdown-holder').find('textarea.markdowneditor').val($field.value()); } }); }); @@ -287,478 +270,252 @@ 'use strict'; - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.InsertEmbedModal = undefined; - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _i18n = __webpack_require__(8); + var _jquery = __webpack_require__(2); - var _i18n2 = _interopRequireDefault(_i18n); + var _jquery2 = _interopRequireDefault(_jquery); var _react = __webpack_require__(3); var _react2 = _interopRequireDefault(_react); - var _redux = __webpack_require__(9); - - var _reactRedux = __webpack_require__(10); - - var _FormBuilderModal = __webpack_require__(11); - - var _FormBuilderModal2 = _interopRequireDefault(_FormBuilderModal); + var _reactDom = __webpack_require__(4); - var _SchemaActions = __webpack_require__(12); + var _reactDom2 = _interopRequireDefault(_reactDom); - var schemaActions = _interopRequireWildcard(_SchemaActions); + var _reactApollo = __webpack_require__(5); - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + var _Injector = __webpack_require__(6); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var sectionConfigKey = 'SilverStripe\\AssetAdmin\\Controller\\AssetAdmin'; - - var InsertEmbedModal = function (_Component) { - _inherits(InsertEmbedModal, _Component); - - function InsertEmbedModal(props) { - _classCallCheck(this, InsertEmbedModal); - - var _this = _possibleConstructorReturn(this, (InsertEmbedModal.__proto__ || Object.getPrototypeOf(InsertEmbedModal)).call(this, props)); - - _this.handleSubmit = _this.handleSubmit.bind(_this); - return _this; - } - - _createClass(InsertEmbedModal, [{ - key: 'componentWillMount', - value: function componentWillMount() { - this.setOverrides(this.props); - } - }, { - key: 'componentWillReceiveProps', - value: function componentWillReceiveProps(props) { - if (props.show && !this.props.show) { - this.setOverrides(props); - } - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - this.clearOverrides(); - } - - /** - * Compares the current properties with received properties and determines if overrides need to be - * cleared or added. - * - * @param {object} props - */ - - }, { - key: 'setOverrides', - value: function setOverrides(props) { - if (this.props.schemaUrl !== props.schemaUrl) { - this.clearOverrides(); - } - if (props.schemaUrl) { - var attrs = Object.assign({}, props.fileAttributes); - delete attrs.ID; - - var overrides = { - fields: Object.entries(attrs).map(function (field) { - var _field = _slicedToArray(field, 2), - name = _field[0], - value = _field[1]; - - return { name: name, value: value }; - }) - }; - // set overrides into redux store, so that it can be accessed by FormBuilder with the same - // schemaUrl. - this.props.actions.schema.setSchemaStateOverrides(props.schemaUrl, overrides); - } - } - - /** - * Generates the properties for the modal - * - * @returns {object} - */ - - }, { - key: 'getModalProps', - value: function getModalProps() { - var props = Object.assign({ - handleSubmit: this.handleSubmit, - onLoadingError: this.handleLoadingError, - showErrorMessage: true, - responseClassBad: 'alert alert-danger', - identifier: 'AssetAdmin.InsertEmbedModal' - }, this.props, { - className: 'insert-embed-modal ' + this.props.className, - bsSize: 'lg', - handleHide: this.props.onHide, - title: this.props.targetUrl ? _i18n2.default._t('AssetAdmin.EditTitle', 'Media from the web') : _i18n2.default._t('AssetAdmin.CreateTitle', 'Insert new media from the web') - }); - delete props.onHide; - delete props.sectionConfig; - delete props.onInsert; - delete props.fileAttributes; - - return props; - } - - /** - * Clear any overrides that may be in place - */ - - }, { - key: 'clearOverrides', - value: function clearOverrides() { - this.props.actions.schema.setSchemaStateOverrides(this.props.schemaUrl, null); - } - - /** - * Handler for when loading the form returns an error - * - * @param error - */ - - }, { - key: 'handleLoadingError', - value: function handleLoadingError(error) { - if (typeof this.props.onLoadingError === 'function') { - this.props.onLoadingError(error); - } - } - - /** - * Capture submission in the form and stop the default submit behaviour - * - * @param data - * @param action - * @returns {Promise} - */ - - }, { - key: 'handleSubmit', - value: function handleSubmit(data, action) { - switch (action) { - case 'action_addmedia': - { - this.props.onCreate(data); - break; - } - case 'action_insertmedia': - { - this.props.onInsert(data); - break; - } - case 'action_cancel': - { - this.props.onHide(); - break; - } - default: - { - // noop - } - } - - return Promise.resolve(); - } - }, { - key: 'render', - value: function render() { - return _react2.default.createElement(_FormBuilderModal2.default, this.getModalProps()); - } - }]); - - return InsertEmbedModal; - }(_react.Component); - - InsertEmbedModal.propTypes = { - sectionConfig: _react.PropTypes.shape({ - url: _react.PropTypes.string, - form: _react.PropTypes.object - }), - show: _react.PropTypes.bool, - onInsert: _react.PropTypes.func.isRequired, - onCreate: _react.PropTypes.func.isRequired, - fileAttributes: _react.PropTypes.shape({ - Url: _react.PropTypes.string, - CaptionText: _react.PropTypes.string, - PreviewUrl: _react.PropTypes.string, - Placement: _react.PropTypes.string, - Width: _react.PropTypes.number, - Height: _react.PropTypes.number - }), - onHide: _react.PropTypes.func.isRequired, - className: _react.PropTypes.string, - actions: _react.PropTypes.object, - schemaUrl: _react.PropTypes.string.isRequired, - targetUrl: _react.PropTypes.string, - onLoadingError: _react.PropTypes.func - }; - - InsertEmbedModal.defaultProps = { - className: '', - fileAttributes: {} - }; - - function mapStateToProps(state, ownProps) { - var sectionConfig = state.config.sections.find(function (section) { - return section.name === sectionConfigKey; - }); - - // get the schemaUrl to use as a key for overrides - var targetUrl = ownProps.fileAttributes ? ownProps.fileAttributes.Url : ''; - var baseEditUrl = sectionConfig.form.remoteEditForm.schemaUrl; - - var editUrl = targetUrl && baseEditUrl + '/?embedurl=' + encodeURIComponent(targetUrl); - var createUrl = sectionConfig.form.remoteCreateForm.schemaUrl; + var InjectableInsertMediaModal = (0, _Injector.provideInjector)(window.InsertMediaModal.default); - var schemaUrl = editUrl || createUrl; - - return { - sectionConfig: sectionConfig, - schemaUrl: schemaUrl, - targetUrl: targetUrl - }; - } - - function mapDispatchToProps(dispatch) { - return { - actions: { - schema: (0, _redux.bindActionCreators)(schemaActions, dispatch) - } - }; - } - - exports.InsertEmbedModal = InsertEmbedModal; - exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(InsertEmbedModal); - -/***/ }), -/* 8 */ -/***/ (function(module, exports) { - - module.exports = i18n; - -/***/ }), -/* 9 */ -/***/ (function(module, exports) { - - module.exports = Redux; - -/***/ }), -/* 10 */ -/***/ (function(module, exports) { - - module.exports = ReactRedux; - -/***/ }), -/* 11 */ -/***/ (function(module, exports) { + _jquery2.default.entwine('ss', function ($) { - module.exports = FormBuilderModal; + $('#insert-md-media-react__dialog-wrapper').entwine({ -/***/ }), -/* 12 */ -/***/ (function(module, exports) { + Element: null, + Data: {}, + onunmatch: function onunmatch() { + // solves errors given by ReactDOM "no matched root found" error. + this._clearModal(); + }, + _clearModal: function _clearModal() { + _reactDom2.default.unmountComponentAtNode(this[0]); + }, + open: function open() { + this._renderModal(true); + }, + close: function close() { + this._renderModal(false); + }, - module.exports = SchemaActions; -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { + /** + * Renders the react modal component + * + * @param {boolean} show + * @private + */ + _renderModal: function _renderModal(show) { + var _this = this; - 'use strict'; + var handleHide = function handleHide() { + return _this.close(); + }; + var handleInsert = function handleInsert() { + return _this._handleInsert.apply(_this, arguments); + }; + var store = window.ss.store; + var client = window.ss.apolloClient; + var attrs = this.getOriginalAttributes(); - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.MarkdownEmbedModal = undefined; + delete attrs.url; - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + // create/update the react component + _reactDom2.default.render(_react2.default.createElement( + _reactApollo.ApolloProvider, + { store: store, client: client }, + _react2.default.createElement(InjectableInsertMediaModal, { + title: false, + type: 'insert-media', + show: show, + onInsert: handleInsert, + onHide: handleHide, + bodyClassName: 'modal__dialog', + className: 'insert-media-react__dialog-wrapper', + requireLinkText: false, + fileAttributes: attrs + }) + ), this[0]); + }, - var _i18n = __webpack_require__(8); - var _i18n2 = _interopRequireDefault(_i18n); + /** + * Handles inserting the selected file in the modal + * + * @param {object} data + * @param {object} file + * @returns {Promise} + * @private + */ + _handleInsert: function _handleInsert(data, file) { + var result = false; + this.setData(Object.assign({}, data, file)); + + // Sometimes AssetAdmin.js handleSubmitEditor() can't find the file + // @todo Ensure that we always return a file for any valid ID + + // in case of any errors, better to catch them than let them go silent + try { + var category = null; + if (file) { + category = file.category; + } else { + category = 'image'; + } + switch (category) { + case 'image': + result = this.insertImage(); + break; + default: + result = this.insertFile(); + } + } catch (e) { + this.statusMessage(e, 'bad'); + } - var _react = __webpack_require__(3); + if (result) { + this.close(); + } + return Promise.resolve(); + }, - var _react2 = _interopRequireDefault(_react); - var _redux = __webpack_require__(9); + /** + * Find the selected node and get attributes associated to attach the data to the form + * + * @returns {object} + */ + getOriginalAttributes: function getOriginalAttributes() { + return {}; + }, - var _reactRedux = __webpack_require__(10); - var _FormBuilderModal = __webpack_require__(11); + /** + * Calculate placement from css class + */ + findPosition: function findPosition(cssClass) { + var alignments = ['leftAlone', 'center', 'rightAlone', 'left', 'right']; + return alignments.find(function (alignment) { + var expr = new RegExp('\\b' + alignment + '\\b'); + return expr.test(cssClass); + }); + }, - var _FormBuilderModal2 = _interopRequireDefault(_FormBuilderModal); - var _SchemaActions = __webpack_require__(12); + /** + * Get html attributes from the Form data + * + * @returns {object} + */ + getAttributes: function getAttributes() { + var data = this.getData(); - var schemaActions = _interopRequireWildcard(_SchemaActions); + return { + src: data.url, + alt: data.AltText, + width: data.InsertWidth, + height: data.InsertHeight, + title: data.TitleTooltip, + class: data.Alignment, + 'data-id': data.ID, + 'data-shortcode': 'image' + }; + }, - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** + * Get extra data not part of the actual element we're adding/modifying (e.g. Caption) + * @returns {object} + */ + getExtraData: function getExtraData() { + var data = this.getData(); + return { + CaptionText: data && data.Caption + }; + }, - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + /** + * Generic handler for inserting a file + * + * NOTE: currently not supported + * + * @returns {boolean} success + */ + insertFile: function insertFile() { + var $field = this.getElement(); + var data = this.getData(); + var linkText = data.title || data.filename; + var markdown = '[' + linkText + '](' + data.url + ')'; - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + var pos = $field.codemirror.getCursor(); + $field.codemirror.setSelection(pos, pos); + $field.codemirror.replaceSelection("\n" + markdown + "\n"); + this.updateTextarea(); + return true; + }, - var sectionConfigKey = 'SilverStripe\\AssetAdmin\\Controller\\AssetAdmin'; - var MarkdownEmbedModal = function (_Component) { - _inherits(MarkdownEmbedModal, _Component); + /** + * Handler for inserting an image + * + * @returns {boolean} success + */ + insertImage: function insertImage() { + var $field = this.getElement(); + if (!$field) { + return false; + } - function MarkdownEmbedModal(props) { - _classCallCheck(this, MarkdownEmbedModal); + var attrs = this.getAttributes(); + var extraData = this.getExtraData(); - return _possibleConstructorReturn(this, (MarkdownEmbedModal.__proto__ || Object.getPrototypeOf(MarkdownEmbedModal)).call(this, props)); + var markdown = '![' + (extraData.CaptionText ? extraData.CaptionText : attrs.title) + '](' + attrs.src + ' "' + attrs.title + '")'; - //this.handleSubmit = this.handleSubmit.bind(this); - } + var pos = $field.codemirror.getCursor(); + $field.codemirror.setSelection(pos, pos); + $field.codemirror.replaceSelection("\n" + markdown + "\n"); + this.updateTextarea(); + return true; + }, - _createClass(MarkdownEmbedModal, [{ - key: 'getModalProps', - value: function getModalProps() { - var props = Object.assign({ - handleSubmit: this.handleSubmit, - onLoadingError: this.handleLoadingError, - showErrorMessage: true, - responseClassBad: 'alert alert-danger', - identifier: 'AssetAdmin.InsertEmbedModal' - }, this.props, { - className: 'insert-media-modal ' + this.props.className, - bsSize: 'lg', - handleHide: this.props.onHide, - title: this.props.targetUrl ? _i18n2.default._t('AssetAdmin.EditTitle', 'Media from the web') : _i18n2.default._t('AssetAdmin.CreateTitle', 'Insert new media from the web') + /** + * Pop up a status message if required to notify the user what is happening + * + * @param text + * @param type + */ + statusMessage: function statusMessage(text, type) { + var content = $('
').text(text).html(); // Escape HTML entities in text + $.noticeAdd({ + text: content, + type: type, + stayTime: 5000, + inEffect: { left: '0', opacity: 'show' } }); - - delete props.onHide; - delete props.sectionConfig; - delete props.onInsert; - delete props.fileAttributes; - - return props; - } - }, { - key: 'handleSubmit', - value: function handleSubmit(data, action) { - switch (action) { - case 'action_addmedia': - { - //this.props.onCreate(data); - break; - } - case 'action_insertmedia': - { - //this.props.onInsert(data); - break; - } - case 'action_cancel': - { - //this.props.onHide(); - break; - } - default: - { - // noop - } - } - - return Promise.resolve(); - } - }, { - key: 'render', - value: function render() { - return _react2.default.createElement(_FormBuilderModal2.default, this.getModalProps()); + }, + updateTextarea: function updateTextarea() { + var $field = this.getElement(); + $($field.element).closest('.js-markdown-holder').find('textarea.markdowneditor').val($field.value()); } - }]); - - return MarkdownEmbedModal; - }(_react.Component); - - MarkdownEmbedModal.propTypes = { - sectionConfig: _react.PropTypes.shape({ - url: _react.PropTypes.string, - form: _react.PropTypes.object - }), - show: _react.PropTypes.bool, - onInsert: _react.PropTypes.func.isRequired, - onCreate: _react.PropTypes.func.isRequired, - fileAttributes: _react.PropTypes.shape({ - Url: _react.PropTypes.string, - CaptionText: _react.PropTypes.string, - PreviewUrl: _react.PropTypes.string, - Placement: _react.PropTypes.string, - Width: _react.PropTypes.number, - Height: _react.PropTypes.number - }), - onHide: _react.PropTypes.func.isRequired, - className: _react.PropTypes.string, - actions: _react.PropTypes.object, - schemaUrl: _react.PropTypes.string.isRequired, - targetUrl: _react.PropTypes.string, - onLoadingError: _react.PropTypes.func - }; - - MarkdownEmbedModal.defaultProps = { - className: '', - fileAttributes: {} - }; - - function mapStateToProps(state, ownProps) { - var sectionConfig = state.config.sections.find(function (section) { - return section.name === sectionConfigKey; }); - - // get the schemaUrl to use as a key for overrides - var targetUrl = ownProps.fileAttributes ? ownProps.fileAttributes.Url : ''; - var baseEditUrl = sectionConfig.form.remoteEditForm.schemaUrl; - - var editUrl = targetUrl && baseEditUrl + '/?embedurl=' + encodeURIComponent(targetUrl); - var createUrl = sectionConfig.form.remoteCreateForm.schemaUrl; - - var schemaUrl = editUrl || createUrl; - - return { - sectionConfig: sectionConfig, - //schemaUrl, - targetUrl: targetUrl - }; - } - - function mapDispatchToProps(dispatch) { - return { - actions: { - schema: (0, _redux.bindActionCreators)(schemaActions, dispatch) - } - }; - } - - exports.MarkdownEmbedModal = MarkdownEmbedModal; - exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(MarkdownEmbedModal); + }); /***/ }), -/* 14 */ +/* 8 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -777,7 +534,7 @@ var _reactDom2 = _interopRequireDefault(_reactDom); - var _reactSimplemdeEditor = __webpack_require__(15); + var _reactSimplemdeEditor = __webpack_require__(9); var _reactSimplemdeEditor2 = _interopRequireDefault(_reactSimplemdeEditor); @@ -795,7 +552,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - var SimpleMDE = __webpack_require__(20); + var SimpleMDE = __webpack_require__(14); var markdownConfigs = {}; @@ -842,19 +599,19 @@ action: SimpleMDE.drawLink, /* action: function() { - let dialog = jQuery('#insert-link-markdown-react__dialog-wrapper'); - if (!dialog.length) { + let dialog = jQuery('#insert-link-markdown-react__dialog-wrapper'); + if (!dialog.length) { dialog = jQuery('