UNPKG

fastlion-amis

Version:

一种MIS页面生成工具

329 lines (328 loc) 22.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RichTextControlRenderer = void 0; var tslib_1 = require("tslib"); var react_1 = (0, tslib_1.__importDefault)(require("react")); var Item_1 = require("./Item"); var classnames_1 = (0, tslib_1.__importDefault)(require("classnames")); var LazyComponent_1 = (0, tslib_1.__importDefault)(require("../../components/LazyComponent")); var tpl_builtin_1 = require("../../utils/tpl-builtin"); var api_1 = require("../../utils/api"); var helper_1 = require("../../utils/helper"); var popover_1 = (0, tslib_1.__importDefault)(require("antd/lib/popover")); var button_1 = (0, tslib_1.__importDefault)(require("antd/lib/button")); var icons_1 = require("../../components/icons"); var icons_2 = require("@ant-design/icons"); var antdCompoentsProxy_1 = require("../../components/antdCompoentsProxy"); var tools_1 = require("../../utils/shell/tools"); var lodash_1 = require("lodash"); function loadRichText( // Jay // type: 'tinymce' | 'froala' = 'froala' type) { if (type === void 0) { type = 'wangEditor'; } return function () { return type === 'wangEditor' ? Promise.resolve().then(function () { return new Promise(function(resolve){require(['../../components/WangEditor'], function(ret) {resolve(tslib_1.__importStar(ret));})}); }).then(function (item) { return item.default; }) : type === 'tinymce' ? Promise.resolve().then(function () { return new Promise(function(resolve){require(['../../components/Tinymce'], function(ret) {resolve(tslib_1.__importStar(ret));})}); }).then(function (item) { return item.default; }) : Promise.resolve().then(function () { return new Promise(function(resolve){require(['../../components/RichText'], function(ret) {resolve(tslib_1.__importStar(ret));})}); }).then(function (item) { return item.default; }); }; } var RichTextControl = /** @class */ (function (_super) { (0, tslib_1.__extends)(RichTextControl, _super); function RichTextControl(props) { var _this = _super.call(this, props) || this; _this.state = { focused: false, popoverVisibleDefault: false, inputValue: null, openRich: false, }; _this.config = null; _this.removeHtmlTags = function (html) { if (!html) return ""; var tempDiv = document.createElement("div"); tempDiv.innerHTML = html; return tempDiv.textContent || tempDiv.innerText || ""; }; _this.popoverRef = function (dom) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var _a, ns, name, textControlHtml, style, popoverContent, tplPopTop, tplPopRight, tplPopLeft, tplPopBottom; return (0, tslib_1.__generator)(this, function (_b) { _a = this.props, ns = _a.classPrefix, name = _a.name; this.popover = dom; if (this.popover) { if (localStorage.getItem('textControlHtml') && typeof localStorage.getItem('textControlHtml') == 'string') { textControlHtml = JSON.parse(localStorage.getItem('textControlHtml')); if (Array.isArray(textControlHtml) && textControlHtml.some(function (item) { return item.name == name; })) { style = textControlHtml.find(function (item) { return item.name == name; }).style; popoverContent = this.popover.parentElement; popoverContent.style.width = style.width + 'px'; } } tplPopTop = this.popover.querySelector("." + ns + "Footer-tplPop-top"); tplPopRight = this.popover.querySelector("." + ns + "Footer-tplPop-right"); tplPopLeft = this.popover.querySelector("." + ns + "Footer-tplPop-left"); tplPopBottom = this.popover.querySelector("." + ns + "Footer-tplPop-bottom"); tplPopTop.addEventListener('mousedown', this.onMousedown); tplPopRight.addEventListener('mousedown', this.onMousedown); tplPopLeft.addEventListener('mousedown', this.onMousedown); tplPopBottom.addEventListener('mousedown', this.onMousedown); } return [2 /*return*/]; }); }); }; _this.onMousedown = function (e) { e.stopPropagation(); e.preventDefault(); var name = _this.props.name; if (!_this.popover || !document.defaultView) return; var popoverContent = _this.popover.parentElement; var htmlContainer = _this.popover.querySelector(".w-e-text-container"); var upErDown = e.target.className.includes('top') || e.target.className.includes('bottom'); var about = e.target.className.includes('left') || e.target.className.includes('right'); var textControlHtml = []; if (localStorage.getItem('textControlHtml')) { textControlHtml = JSON.parse(localStorage.getItem('textControlHtml')); if (!Array.isArray(textControlHtml)) { textControlHtml = []; } } if (e.target.tagName.toLowerCase() === 'div') { // 记录初始鼠标位置和弹窗初始宽高 var startX_1 = e.clientX; var startY_1 = e.clientY; var startWidth_1 = parseInt(document === null || document === void 0 ? void 0 : document.defaultView.getComputedStyle(popoverContent).width, 10); var startHeight_1 = parseInt(document === null || document === void 0 ? void 0 : document.defaultView.getComputedStyle(htmlContainer).height, 10); // 设置鼠标移动事件 document.addEventListener('mousemove', resizeElement); // 设置鼠标松开事件 document.addEventListener('mouseup', function () { document.removeEventListener('mousemove', resizeElement); }); // 调整元素大小函数 function resizeElement(e) { var newWidth = startWidth_1 + e.clientX - startX_1; var newHeight = startHeight_1 + e.clientY - startY_1; if (newWidth < 250) return; if (newHeight < 80) return; if (upErDown) { htmlContainer.style.height = newHeight + 'px'; } if (about) { popoverContent.style.width = newWidth + 'px'; } if (textControlHtml.some(function (item) { return item.name == name; })) { var content = { name: name, style: { width: newWidth, height: newHeight, } }; textControlHtml = (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], textControlHtml.filter(function (item) { return item.name !== name; }), true), [content], false); } else { var content = { name: name, style: { width: newWidth, height: newHeight, } }; textControlHtml = (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], textControlHtml, true), [content], false); } localStorage.setItem('textControlHtml', JSON.stringify(textControlHtml)); } } }; var finnalVendor = props.vendor || (props.env.richTextToken ? 'froala' : 'tinymce'); _this.handleFocus = _this.handleFocus.bind(_this); _this.handleBlur = _this.handleBlur.bind(_this); _this.handleChange = _this.handleChange.bind(_this); if (finnalVendor === 'froala') { _this.config = (0, tslib_1.__assign)((0, tslib_1.__assign)({ imageAllowedTypes: ['jpeg', 'jpg', 'png', 'gif'], imageDefaultAlign: 'left', imageEditButtons: props.imageEditable ? [ 'imageReplace', 'imageAlign', 'imageRemove', '|', 'imageLink', 'linkOpen', 'linkEdit', 'linkRemove', '-', 'imageDisplay', 'imageStyle', 'imageAlt', 'imageSize' ] : [], key: props.env.richTextToken, attribution: false }, props.options), { editorClass: props.editorClass, placeholderText: props.translate(props.placeholder), imageUploadURL: (0, tpl_builtin_1.tokenize)(props.receiver, props.data), imageUploadParams: { from: 'rich-text' }, videoUploadURL: (0, tpl_builtin_1.tokenize)(props.videoReceiver, props.data), videoUploadParams: { from: 'rich-text' }, events: (0, tslib_1.__assign)((0, tslib_1.__assign)({}, (props.options && props.options.events)), { focus: _this.handleFocus, blur: _this.handleBlur }), language: !_this.props.locale || _this.props.locale === 'zh-CN' ? 'zh_cn' : '' }); if (props.buttons) { _this.config.toolbarButtons = props.buttons; } } else { var fetcher_1 = props.env.fetcher; _this.config = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, props.options), { images_upload_handler: function (blobInfo, ok, fail) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var formData, receiver, response, location, e_1; var _a, _b, _c, _d, _e, _f, _g, _h, _j; return (0, tslib_1.__generator)(this, function (_k) { switch (_k.label) { case 0: formData = new FormData(); formData.append(props.fileField, blobInfo.blob(), blobInfo.filename()); _k.label = 1; case 1: _k.trys.push([1, 3, , 4]); receiver = (0, tslib_1.__assign)({ adaptor: function (payload) { return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, payload), { data: payload }); } }, (0, api_1.normalizeApi)(props.receiver, 'post')); return [4 /*yield*/, fetcher_1(receiver, formData, { method: 'post' })]; case 2: response = _k.sent(); if (response.ok) { location = ((_a = response.data) === null || _a === void 0 ? void 0 : _a.link) || ((_b = response.data) === null || _b === void 0 ? void 0 : _b.url) || ((_c = response.data) === null || _c === void 0 ? void 0 : _c.value) || ((_e = (_d = response.data) === null || _d === void 0 ? void 0 : _d.data) === null || _e === void 0 ? void 0 : _e.link) || ((_g = (_f = response.data) === null || _f === void 0 ? void 0 : _f.data) === null || _g === void 0 ? void 0 : _g.url) || ((_j = (_h = response.data) === null || _h === void 0 ? void 0 : _h.data) === null || _j === void 0 ? void 0 : _j.value); if (location) { ok(location); } else { console.warn('must have return value'); } } return [3 /*break*/, 4]; case 3: e_1 = _k.sent(); fail(e_1); return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); } }); } return _this; } RichTextControl.prototype.handleFocus = function () { this.setState({ focused: true }); }; RichTextControl.prototype.handleBlur = function () { this.setState({ focused: false }); }; RichTextControl.prototype.handleChange = function (value, submitOnChange, changeImmediately) { var _a = this.props, onChange = _a.onChange, disabled = _a.disabled; if (disabled) { return; } onChange === null || onChange === void 0 ? void 0 : onChange(value, submitOnChange, changeImmediately); }; RichTextControl.prototype.render = function () { var _a; var _this = this; var _b, _c, _d; var _e = this.props, className = _e.className, ns = _e.classPrefix, value = _e.value, disabled = _e.disabled, vendor = _e.vendor, env = _e.env, locale = _e.locale, translate = _e.translate, borderMode = _e.borderMode, popOverContainer = _e.popOverContainer, placeholder = _e.placeholder, defaultOpen = _e.defaultOpen, name = _e.name, domicile = _e.domicile, rich = _e.rich; var _f = this.state, popoverVisibleDefault = _f.popoverVisibleDefault, inputValue = _f.inputValue, openRich = _f.openRich; var primaryField = (_b = this.props.store) === null || _b === void 0 ? void 0 : _b.primaryField; var primaryVlaue = domicile ? (_d = (_c = domicile === null || domicile === void 0 ? void 0 : domicile.data) === null || _c === void 0 ? void 0 : _c[primaryField]) !== null && _d !== void 0 ? _d : '' : ''; var primarylable = domicile ? domicile.label : ''; var finnalVendor = vendor || (env.richTextToken ? 'froala' : 'wangEditor'); // Jay 默认使用 wangEditor var placement = !(0, helper_1.isMobile)() ? 'rightTop' : 'bottomRight'; var popDefaultOpen = (react_1.default.createElement(popover_1.default, { visible: popoverVisibleDefault, trigger: 'click', overlayClassName: (0, classnames_1.default)(ns + "TplPop", ns + "PopRichText"), getPopupContainer: popOverContainer, onVisibleChange: function (visible) { _this.setState({ popoverVisibleDefault: visible }); }, autoAdjustOverflow: true, arrowPointAtCenter: true, destroyTooltipOnHide: true, placement: placement, content: (react_1.default.createElement("div", { className: (0, classnames_1.default)(ns + "popoverRichText"), ref: this.popoverRef }, react_1.default.createElement(LazyComponent_1.default, { getComponent: loadRichText(finnalVendor), model: value, onModelChange: function (value) { return _this.setState({ inputValue: value }); }, onFocus: this.handleFocus, onBlur: this.handleBlur, config: this.config, disabled: disabled, name: name, locale: locale, translate: translate }), react_1.default.createElement("div", { className: (0, classnames_1.default)(ns + "Footer-tplPop") }, react_1.default.createElement(button_1.default, { size: "small", style: { marginRight: 10, borderRadius: 5 }, onClick: function () { _this.setState({ popoverVisibleDefault: false }); } }, this.props.translate('Dialog.close')), react_1.default.createElement(button_1.default, { size: "small", style: { borderRadius: 5 }, type: "primary", onClick: function () { _this.handleChange(inputValue); _this.setState({ popoverVisibleDefault: false }); } }, this.props.translate('confirm'))), react_1.default.createElement("div", { className: (0, classnames_1.default)(ns + "Footer-tplPop-top") }), react_1.default.createElement("div", { className: (0, classnames_1.default)(ns + "Footer-tplPop-bottom") }), react_1.default.createElement("div", { className: (0, classnames_1.default)(ns + "Footer-tplPop-left") }), react_1.default.createElement("div", { className: (0, classnames_1.default)(ns + "Footer-tplPop-right") }))), title: (react_1.default.createElement("div", { className: (0, classnames_1.default)(ns + "Title-tplPop") }, react_1.default.createElement("div", null, primarylable + ": " + ((0, lodash_1.isNil)(primaryVlaue) ? '' : primaryVlaue)))) }, react_1.default.createElement(icons_2.EditOutlined, { style: { fontSize: '0.875rem', minWidth: "12px" } }))); return (react_1.default.createElement("div", { className: (0, classnames_1.default)(ns + "RichTextControl", className, (_a = { 'is-focused': !rich && this.state.focused, 'is-disabled': disabled }, _a[ns + "RichTextControl--border" + (0, helper_1.ucFirst)(borderMode)] = borderMode, _a['is-defaultOpen'] = defaultOpen, _a)), onKeyDown: function (e) { return e.stopPropagation(); } }, (0, helper_1.isMobile)() ? react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement("div", { className: (0, classnames_1.default)(ns + "RichTextControl-Rich"), onClick: function () { _this.setState({ openRich: true }); } }, react_1.default.createElement("div", { className: (0, classnames_1.default)(ns + "RichTextControl-RichValue") }, !!!value ? react_1.default.createElement("div", { className: (0, classnames_1.default)(ns + "RichTextControl-placeholder") }, placeholder !== null && placeholder !== void 0 ? placeholder : '请输入') : this.removeHtmlTags(value)), react_1.default.createElement("a", { className: (0, classnames_1.default)(ns + "Table-expandBtn") }, react_1.default.createElement(icons_1.Icon, { icon: "right-arrow-bold", className: "icon" }))), react_1.default.createElement(antdCompoentsProxy_1.Drawer, { visible: openRich, width: "100%", className: "textarea-drawer textarea-drawer-rich " + (tools_1.tools.isIOS ? 'textarea-drawer-rich-ios' : ''), closeIcon: react_1.default.createElement(icons_1.Icon, { icon: 'title-left', className: "icon", style: { width: '16px', height: '16px' } }), onClose: function () { _this.setState({ openRich: false }); }, destroyOnClose: true, mask: false, getContainer: this.props.env.getModalContainer, zIndex: 1011, title: (!disabled ? '修改' : "") + this.props.label, extra: react_1.default.createElement(button_1.default, { danger: true, size: 'small', type: "text" }), footer: react_1.default.createElement("div", { className: 'textarea-drawer-footer' }, react_1.default.createElement(button_1.default, { type: "primary", onClick: function () { return _this.setState({ openRich: false }); } }, "\u5B8C\u6210")) }, react_1.default.createElement(LazyComponent_1.default, { getComponent: loadRichText('tinymce'), model: value, onModelChange: this.handleChange, onFocus: this.handleFocus, onBlur: this.handleBlur, config: this.config, disabled: disabled, locale: locale, name: name, translate: translate }))) : react_1.default.createElement(react_1.default.Fragment, null, !defaultOpen ? react_1.default.createElement(LazyComponent_1.default, { getComponent: loadRichText(finnalVendor), model: value, onModelChange: this.handleChange, onFocus: this.handleFocus, onBlur: this.handleBlur, config: this.config, name: name, disabled: disabled, locale: locale, translate: translate }) : react_1.default.createElement("div", { className: (0, classnames_1.default)(ns + "RichTextControl-value") }, react_1.default.createElement("div", { className: (0, classnames_1.default)(ns + "RichTextControl-content") }, this.removeHtmlTags(value)), popDefaultOpen)))); }; RichTextControl.defaultProps = { imageEditable: true, receiver: '/api/upload/image', videoReceiver: '/api/upload/video', fileField: 'file', placeholder: '请输入', options: { toolbarButtons: [ 'undo', 'redo', 'paragraphFormat', 'textColor', 'backgroundColor', 'bold', 'underline', 'strikeThrough', 'formatOL', 'formatUL', 'align', 'quote', 'insertLink', 'insertImage', 'insertEmotion', 'insertTable', 'html' ] } }; return RichTextControl; }(react_1.default.Component)); exports.default = RichTextControl; var RichTextControlRenderer = /** @class */ (function (_super) { (0, tslib_1.__extends)(RichTextControlRenderer, _super); function RichTextControlRenderer() { return _super !== null && _super.apply(this, arguments) || this; } RichTextControlRenderer = (0, tslib_1.__decorate)([ (0, Item_1.FormItem)({ type: 'input-rich-text', sizeMutable: false }) ], RichTextControlRenderer); return RichTextControlRenderer; }(RichTextControl)); exports.RichTextControlRenderer = RichTextControlRenderer; //# sourceMappingURL=./renderers/Form/InputRichText.js.map