UNPKG

fastlion-amis

Version:

一种MIS页面生成工具

390 lines (389 loc) 21.4 kB
"use strict"; /** * @file scoped.jsx. * @author fex */ Object.defineProperty(exports, "__esModule", { value: true }); exports.HocQuickEdit = void 0; var tslib_1 = require("tslib"); var react_1 = (0, tslib_1.__importDefault)(require("react")); var react_dom_1 = require("react-dom"); var hoist_non_react_statics_1 = (0, tslib_1.__importDefault)(require("hoist-non-react-statics")); var keycode_1 = (0, tslib_1.__importDefault)(require("keycode")); var Overlay_1 = (0, tslib_1.__importDefault)(require("../components/Overlay")); var PopOver_1 = (0, tslib_1.__importDefault)(require("../components/PopOver")); var icons_1 = require("../components/icons"); var inited = false; var currentOpened; var HocQuickEdit = function (config) { if (config === void 0) { config = {}; } return function (Component) { var QuickEditComponent = /** @class */ (function (_super) { (0, tslib_1.__extends)(QuickEditComponent, _super); function QuickEditComponent(props) { var _this = _super.call(this, props) || this; _this.openQuickEdit = _this.openQuickEdit.bind(_this); _this.closeQuickEdit = _this.closeQuickEdit.bind(_this); _this.handleAction = _this.handleAction.bind(_this); _this.handleSubmit = _this.handleSubmit.bind(_this); _this.handleKeyUp = _this.handleKeyUp.bind(_this); _this.overlayRef = _this.overlayRef.bind(_this); _this.handleWindowKeyPress = _this.handleWindowKeyPress.bind(_this); _this.handleWindowKeyDown = _this.handleWindowKeyDown.bind(_this); _this.formRef = _this.formRef.bind(_this); _this.handleInit = _this.handleInit.bind(_this); _this.handleChange = _this.handleChange.bind(_this); _this.state = { isOpened: false }; return _this; } QuickEditComponent.prototype.componentWillUnmount = function () { inited = false; this.overlay = null; this.target = null; document.body.removeEventListener('keypress', this.handleWindowKeyPress); document.body.removeEventListener('keydown', this.handleWindowKeyDown); }; QuickEditComponent.prototype.componentDidMount = function () { this.target = (0, react_dom_1.findDOMNode)(this); if (inited) { return; } inited = true; document.body.addEventListener('keypress', this.handleWindowKeyPress); document.body.addEventListener('keydown', this.handleWindowKeyDown); }; QuickEditComponent.prototype.formRef = function (ref) { var _a = this.props, quickEditFormRef = _a.quickEditFormRef, rowIndex = _a.rowIndex, colIndex = _a.colIndex; if (quickEditFormRef) { while (ref && ref.getWrappedInstance) { ref = ref.getWrappedInstance(); } quickEditFormRef(ref, colIndex, rowIndex); } }; QuickEditComponent.prototype.handleWindowKeyPress = function (e) { var ns = this.props.classPrefix; var el = e.target.closest("." + ns + "Field--quickEditable"); if (!el) { return; } var table = el.closest('table'); if (!table) { return; } if ((0, keycode_1.default)(e) === 'space' && !~['INPUT', 'TEXTAREA'].indexOf(el.tagName)) { e.preventDefault(); e.stopPropagation(); } }; QuickEditComponent.prototype.handleWindowKeyDown = function (e) { var _a, _b, _c, _d, _e, _f, _g, _h; var code = (0, keycode_1.default)(e); if (code === 'esc' && currentOpened) { currentOpened.closeQuickEdit(true); } else if (~['INPUT', 'TEXTAREA'].indexOf(e.target.tagName) || e.target.contentEditable === 'true' || !~['up', 'down', 'left', 'right', 'enter'].indexOf(code)) { return; } e.stopPropagation(); e.preventDefault(); var ns = this.props.classPrefix; var el = e.target.closest("." + ns + "Field--quickEditable") || document.querySelector("." + ns + "Field--quickEditable"); if (!el) { return; } var table = el.closest('table'); if (!table) { return; } var current = table.querySelector("." + ns + "Field--quickEditable:focus"); if (!current) { var dom = table.querySelector("." + ns + "Field--quickEditable[tabindex]"); dom && dom.focus(); } else { var prevTr = void 0, nextTr = void 0, prevTd = void 0, nextTd = void 0; // 获取下一个可以编辑的 var findNextQuickEditable_1 = function (_currentParent, dir) { var _a, _b, _c, _d; var curParent; if (!_currentParent) return _currentParent; // 如果没有找到对应的返回自身 switch (code) { case 'up': curParent = _currentParent.previousSibling; break; case 'down': curParent = _currentParent.nextSibling; break; } if (!curParent) return _currentParent; // 如果没有找到对应的返回自身 // 如果对应的表格行的对应项有对应的编辑项 返回 if ((_d = (_c = (_b = (_a = curParent) === null || _a === void 0 ? void 0 : _a.children) === null || _b === void 0 ? void 0 : _b[current.cellIndex]) === null || _c === void 0 ? void 0 : _c.className) === null || _d === void 0 ? void 0 : _d.includes(ns + "Field--quickEditable")) return curParent; else return findNextQuickEditable_1(curParent, dir); }; switch (code) { case 'up': prevTr = findNextQuickEditable_1(current.parentNode, code); if (prevTr) { var index = current.cellIndex; if (prevTr.children[index]) (_a = prevTr.children[index]) === null || _a === void 0 ? void 0 : _a.focus(); } break; case 'down': nextTr = findNextQuickEditable_1(current.parentNode, code); if (nextTr) { var index = current.cellIndex; if (nextTr.children[index]) (_b = nextTr.children[index]) === null || _b === void 0 ? void 0 : _b.focus(); } break; case 'left': prevTd = current.previousElementSibling; while (prevTd) { if (prevTd.matches("." + ns + "Field--quickEditable[tabindex]")) { break; } prevTd = prevTd.previousElementSibling; } if (prevTd) { (_c = prevTd) === null || _c === void 0 ? void 0 : _c.focus(); } else if (current.parentNode.previousSibling) { var tds = current.parentNode .previousSibling.querySelectorAll("." + ns + "Field--quickEditable[tabindex]"); if (tds.length) { (_d = tds[tds.length - 1]) === null || _d === void 0 ? void 0 : _d.focus(); } } break; case 'right': nextTd = current.nextSibling; while (nextTd) { if (nextTd.matches("." + ns + "Field--quickEditable[tabindex]")) { break; } nextTd = nextTd.nextSibling; } if (nextTd) { (_e = nextTd) === null || _e === void 0 ? void 0 : _e.focus(); } else if (current.parentNode.nextSibling) { nextTd = current.parentNode.nextSibling.querySelector("." + ns + "Field--quickEditable[tabindex]"); if (nextTd) { (_f = nextTd) === null || _f === void 0 ? void 0 : _f.focus(); } } break; case 'enter': currentOpened === null || currentOpened === void 0 ? void 0 : currentOpened.closeQuickEdit(); // 如果有其他的先关闭其他的 (_h = (_g = current.querySelector('[class*="quickEditBtn"]')) === null || _g === void 0 ? void 0 : _g.click) === null || _h === void 0 ? void 0 : _h.call(_g); break; } } }; // handleClickOutside() { // this.closeQuickEdit(); // } QuickEditComponent.prototype.overlayRef = function (ref) { this.overlay = ref; }; QuickEditComponent.prototype.handleAction = function (e, action, ctx) { var onAction = this.props.onAction; if (action.actionType === 'cancel' || action.actionType === 'close') { this.closeQuickEdit(true); return; } onAction && onAction(e, action, ctx); }; QuickEditComponent.prototype.handleSubmit = function (values) { var _a = this.props, onQuickChange = _a.onQuickChange, quickEdit = _a.quickEdit; this.closeQuickEdit(true); onQuickChange(values, quickEdit.saveImmediately, false, quickEdit.resetOnFailed); return false; }; QuickEditComponent.prototype.handleInit = function (values) { var onQuickChange = this.props.onQuickChange; onQuickChange(values, false, false); }; QuickEditComponent.prototype.handleChange = function (values) { var _a = this.props, onQuickChange = _a.onQuickChange, quickEdit = _a.quickEdit; onQuickChange(values, quickEdit.saveImmediately, false, quickEdit.resetOnFailed); }; QuickEditComponent.prototype.openQuickEdit = function () { currentOpened = this; this.setState({ isOpened: true }); }; QuickEditComponent.prototype.closeQuickEdit = function (e) { var _this = this; if (!this.state.isOpened) { return; } currentOpened = null; var ns = this.props.classPrefix; this.setState({ isOpened: false }, function () { // 如果是手动点击的自动聚焦回去 if (e) { var el = (0, react_dom_1.findDOMNode)(_this); var table = el.closest('table'); ((table && table.querySelectorAll("td." + ns + "Field--quickEditable:focus") .length) || el) && el.focus(); } }); }; QuickEditComponent.prototype.buildSchema = function () { var _a = this.props, quickEdit = _a.quickEdit, name = _a.name, label = _a.label, __ = _a.translate, defaultOpen = _a.defaultOpen, column = _a.column, data = _a.data; var schema; var domicile = { column: column, label: label, data: data }; if (quickEdit === true) { schema = { type: 'form', title: '', autoFocus: true, body: [ { type: 'input-text', name: name, placeholder: label, label: false, defaultOpen: defaultOpen, domicile: domicile } ] }; } else if (quickEdit) { if (quickEdit.body && !~['combo', 'group', 'panel', 'fieldSet', 'fieldset'].indexOf(quickEdit.type)) { schema = (0, tslib_1.__assign)((0, tslib_1.__assign)({ title: '', autoFocus: quickEdit.mode !== 'inline' }, quickEdit), { mode: 'normal', type: 'form' }); } else { schema = { title: '', className: quickEdit.formClassName, type: 'form', autoFocus: quickEdit.mode !== 'inline', mode: 'normal', body: [ (0, tslib_1.__assign)((0, tslib_1.__assign)({ type: quickEdit.type || 'input-text', name: quickEdit.name || name }, quickEdit), { mode: undefined, defaultOpen: defaultOpen, domicile: domicile }) ] }; } } if (schema) { schema = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, schema), { wrapWithPanel: quickEdit.mode !== 'inline', actions: quickEdit.mode === 'inline' ? [] : [ { type: 'button', label: __('cancel'), actionType: 'cancel' }, { label: __('confirm'), type: 'submit', primary: true } ] }); } return schema || 'error'; }; QuickEditComponent.prototype.handleKeyUp = function (e) { var code = (0, keycode_1.default)(e); if (code === 'space' && !~['INPUT', 'TEXTAREA'].indexOf(e.target.tagName)) { e.preventDefault(); e.stopPropagation(); this.openQuickEdit(); } }; QuickEditComponent.prototype.renderPopOver = function () { var _this = this; var _a = this.props, quickEdit = _a.quickEdit, render = _a.render, popOverContainer = _a.popOverContainer, ns = _a.classPrefix, cx = _a.classnames, canAccessSuperData = _a.canAccessSuperData; var content = (react_1.default.createElement("div", { ref: this.overlayRef, className: cx(quickEdit.className) }, render('quick-edit-form', this.buildSchema(), { value: undefined, onSubmit: this.handleSubmit, onAction: this.handleAction, onChange: null, formLazyChange: false, ref: this.formRef, popOverContainer: function () { return _this.overlay; }, canAccessSuperData: canAccessSuperData, formStore: undefined }))); popOverContainer = popOverContainer || (function () { return (0, react_dom_1.findDOMNode)(_this); }); return (react_1.default.createElement(Overlay_1.default, { container: function () { return (0, react_dom_1.findDOMNode)(_this); }, target: function () { return _this.target; }, onHide: function () { _this.closeQuickEdit(true); }, placement: "left-top right-top left-bottom right-bottom left-top", show: true }, react_1.default.createElement(PopOver_1.default, { classPrefix: ns, className: cx(ns + "QuickEdit-popover", quickEdit.popOverClassName), onHide: function () { _this.closeQuickEdit(true); }, overlay: true }, content))); }; QuickEditComponent.prototype.render = function () { var _a = this.props, onQuickChange = _a.onQuickChange, quickEdit = _a.quickEdit, quickEditEnabled = _a.quickEditEnabled, className = _a.className, cx = _a.classnames, render = _a.render, noHoc = _a.noHoc, canAccessSuperData = _a.canAccessSuperData, disabled = _a.disabled, prefix = _a.prefix; if (!quickEdit || !onQuickChange || quickEditEnabled === false || noHoc || disabled) { return react_1.default.createElement(Component, (0, tslib_1.__assign)({}, this.props)); } if (quickEdit.mode === 'inline') { return (react_1.default.createElement(Component, (0, tslib_1.__assign)({}, this.props), render('inline-form', this.buildSchema(), { value: undefined, wrapperComponent: 'div', className: cx('Form--quickEdit'), ref: this.formRef, prefix: prefix !== null && prefix !== void 0 ? prefix : quickEdit.prefix, simpleMode: true, onInit: this.handleInit, onChange: this.handleChange, formLazyChange: false, quickEditForm: true, canAccessSuperData: canAccessSuperData }))); } else { return (react_1.default.createElement(Component, (0, tslib_1.__assign)({}, this.props, { className: cx("Field--quickEditable", className, { in: this.state.isOpened }), tabIndex: quickEdit.focusable === false ? undefined : '0', onKeyUp: this.handleKeyUp }), react_1.default.createElement("div", { style: { display: 'flex' } }, react_1.default.createElement(Component, (0, tslib_1.__assign)({}, this.props, { wrapperComponent: '', noHoc: true })), react_1.default.createElement("span", { key: "edit-btn", className: cx('Field-quickEditBtn'), onClick: this.openQuickEdit }, react_1.default.createElement(icons_1.Icon, { icon: "pencil", className: "icon" })), this.state.isOpened ? this.renderPopOver() : null))); } }; QuickEditComponent.ComposedComponent = Component; return QuickEditComponent; }(react_1.default.PureComponent)); (0, hoist_non_react_statics_1.default)(QuickEditComponent, Component); return QuickEditComponent; }; }; exports.HocQuickEdit = HocQuickEdit; exports.default = exports.HocQuickEdit; //# sourceMappingURL=./renderers/QuickEdit.js.map