UNPKG

fastlion-amis

Version:

一种MIS页面生成工具

963 lines 121 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TableRenderer = void 0; var tslib_1 = require("tslib"); var react_1 = (0, tslib_1.__importDefault)(require("react")); var react_dom_1 = require("react-dom"); var factory_1 = require("../../factory"); var forEach_1 = (0, tslib_1.__importDefault)(require("lodash/forEach")); var tpl_1 = require("../../utils/tpl"); require("./ColumnToggler"); var Checkbox_1 = (0, tslib_1.__importDefault)(require("../../components/Checkbox")); var Button_1 = (0, tslib_1.__importDefault)(require("../../components/Button")); var table_1 = require("../../store/table"); var file_saver_1 = require("file-saver"); var helper_1 = require("../../utils/helper"); var tpl_builtin_1 = require("../../utils/tpl-builtin"); var debounce_1 = (0, tslib_1.__importDefault)(require("lodash/debounce")); var sortablejs_1 = (0, tslib_1.__importDefault)(require("sortablejs")); var resize_sensor_1 = require("../../utils/resize-sensor"); var find_1 = (0, tslib_1.__importDefault)(require("lodash/find")); var icons_1 = require("../../components/icons"); var HeadCellFilterDropdown_1 = require("./HeadCellFilterDropdown"); var HeadCellSearchDropdown_1 = require("./HeadCellSearchDropdown"); var HeadCellBatchEditDropdown_1 = require("./HeadCellBatchEditDropdown"); var TableContent_1 = require("./TableContent"); var image_1 = require("../../utils/image"); var mobx_state_tree_1 = require("mobx-state-tree"); var ColumnToggler_1 = (0, tslib_1.__importDefault)(require("./ColumnToggler")); var offset_1 = (0, tslib_1.__importDefault)(require("../../utils/offset")); var cloneDeep_1 = (0, tslib_1.__importDefault)(require("lodash/cloneDeep")); var LionContextMenu_1 = require("../Lion/components/LionContextMenu"); var isEqual_1 = (0, tslib_1.__importDefault)(require("lodash/isEqual")); var tooltip_1 = (0, tslib_1.__importDefault)(require("antd/lib/tooltip")); var antd_1 = require("antd"); var shell_1 = require("../../utils/shell"); var tools_1 = require("../../utils/shell/tools"); var utils_1 = require("../../utils/utils"); var throttle_1 = (0, tslib_1.__importDefault)(require("lodash/throttle")); var sub_1 = require("../../utils/sub"); /** * 将 url 转成绝对地址 */ var getAbsoluteUrl = (function () { var link; return function (url) { if (!link) link = document.createElement('a'); link.href = url; return link.href; }; })(); var Table = /** @class */ (function (_super) { (0, tslib_1.__extends)(Table, _super); function Table(props) { var _a, _b, _c, _d; var _this = _super.call(this, props) || this; _this.lastScrollLeft = -1; _this.totalWidth = 0; _this.totalHeight = 0; _this.outterWidth = 0; _this.outterHeight = 0; _this.widths = {}; _this.widths2 = {}; _this.heights = {}; _this.renderedToolbars = []; _this.subForms = {}; _this.scrollPingBox = function () { if (!_this.table) return; var ns = _this.props.classPrefix; var table = (0, react_dom_1.findDOMNode)(_this); var container = table.querySelector("." + ns + "Table-contentWrap"); var scrollLeft = container.scrollLeft; var scrollWidth = container.scrollWidth; var clientWidth = container.clientWidth; // 判断是否滚动到最左侧 if (scrollLeft === 0) { container.classList.remove('table-ping-left'); } else { container.classList.add('table-ping-left'); } // 判断是否滚动到最右侧 if (Math.abs(scrollLeft + clientWidth - scrollWidth) <= 1) { container.classList.remove('table-ping-right'); } else { container.classList.add('table-ping-right'); } }; //进入编辑前的行数据 _this.beforeData = null; //移动端点击行进入编辑 _this.getFieldsBody = function () { var _a = _this.props, store = _a.store, items = _a.items, editIndex = _a.editIndex; return store.filteredColumns.filter(function (item) { return !['operation', '__checkme', '__dragme', '__expandme'].includes(item.pristine.type); }).map(function (item) { var _a, _b, _c, _d, _e, _f, _g, _h; var newType = ((_a = item.pristine.quickEdit) === null || _a === void 0 ? void 0 : _a.type) || item.pristine.type; return (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, item.pristine), (item.pristine.quickEdit || {})), { type: (0, utils_1.exchangeType)(newType), staticShow: item.pristine.type === 'number' ? (item.pristine.quickEdit ? false : true) : undefined, quickEdit: false, value: editIndex === -1 ? items[items.length - 1][(item === null || item === void 0 ? void 0 : item.name) || ''] : (_b = store.rows[editIndex]) === null || _b === void 0 ? void 0 : _b.data[(item === null || item === void 0 ? void 0 : item.name) || ''], hiddenOn: ((_d = (_c = item.pristine) === null || _c === void 0 ? void 0 : _c.quickEdit) === null || _d === void 0 ? void 0 : _d.columnHiddenOn) || ((_e = item.pristine) === null || _e === void 0 ? void 0 : _e.columnHiddenOn) || ((_g = (_f = item.pristine) === null || _f === void 0 ? void 0 : _f.quickEdit) === null || _g === void 0 ? void 0 : _g.hiddenOn) || ((_h = item.pristine) === null || _h === void 0 ? void 0 : _h.hiddenOn) || undefined, defaultOpen: false, remark: null, classNameExpr: undefined }); }); }; _this.handleComfirm = function () { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var _a, items, startRowEdit, env, data, editIndex, setEditIndex, updateApi, addApi, reloadApi, res, dealNex, ctx, payload, reloadData, ctx, payload, reloadData; var _this = this; return (0, tslib_1.__generator)(this, function (_b) { switch (_b.label) { case 0: _a = this.props, items = _a.items, startRowEdit = _a.startRowEdit, env = _a.env, data = _a.data, editIndex = _a.editIndex, setEditIndex = _a.setEditIndex, updateApi = _a.updateApi, addApi = _a.addApi, reloadApi = _a.reloadApi; return [4 /*yield*/, this.formInstance.validate()]; case 1: res = _b.sent(); if (!res) return [3 /*break*/, 16]; dealNex = function () { startRowEdit(false); setEditIndex(-1); _this.setState({ rowEditData: null }); }; if (!(editIndex === -1 && addApi)) return [3 /*break*/, 8]; this.setState({ editLoading: true }); ctx = (0, helper_1.createObject)(data, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, items[items.length - 1]), this.lastChangeValue)); return [4 /*yield*/, env.fetcher(addApi, ctx)]; case 2: payload = _b.sent(); if (!payload.ok) return [3 /*break*/, 6]; if (!reloadApi) return [3 /*break*/, 4]; return [4 /*yield*/, env.fetcher(reloadApi, data)]; case 3: reloadData = _b.sent(); if (reloadData.ok) { this.handleSave(reloadData.data); dealNex(); antd_1.message.success('操作成功!'); } else { antd_1.message.error(reloadData.msg); } return [3 /*break*/, 5]; case 4: dealNex(); antd_1.message.success('操作成功!'); _b.label = 5; case 5: return [3 /*break*/, 7]; case 6: antd_1.message.error(payload.msg); _b.label = 7; case 7: this.setState({ editLoading: false }); return [3 /*break*/, 16]; case 8: if (!(editIndex !== -1 && updateApi)) return [3 /*break*/, 15]; this.setState({ editLoading: true }); ctx = (0, helper_1.createObject)(data, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, items[editIndex]), this.lastChangeValue)); return [4 /*yield*/, env.fetcher(updateApi, ctx)]; case 9: payload = _b.sent(); if (!payload.ok) return [3 /*break*/, 13]; if (!reloadApi) return [3 /*break*/, 11]; return [4 /*yield*/, env.fetcher(reloadApi, data)]; case 10: reloadData = _b.sent(); if (reloadData.ok) { this.handleSave(reloadData.data); dealNex(); } else { antd_1.message.warn(reloadData.msg); } return [3 /*break*/, 12]; case 11: dealNex(); _b.label = 12; case 12: return [3 /*break*/, 14]; case 13: antd_1.message.warn(payload.msg); _b.label = 14; case 14: this.setState({ editLoading: false }); return [3 /*break*/, 16]; case 15: dealNex(); _b.label = 16; case 16: return [2 /*return*/]; } }); }); }; _this.rowEditModal = function () { var _a = _this.props, labelName = _a.labelName, items = _a.items, editIndex = _a.editIndex, editStatus = _a.editStatus, __ = _a.translate; var fieldTitle = labelName || ''; fieldTitle = fieldTitle.includes('</font>') ? fieldTitle.replace("<font color='red'>*</font>", '') : fieldTitle; fieldTitle = (fieldTitle ? fieldTitle + '-' : '') + (editIndex === -1 ? items.length : editIndex + 1); return (0, helper_1.isMobile)() ? react_1.default.createElement(antd_1.Drawer, { placement: "bottom", height: "auto", mask: true, className: "columns-toggler-drawer field-table-drawer " + (tools_1.tools.isIOS && !shell_1.Shell.hasShell() ? 'ios-device' : ''), title: __(editIndex == -1 ? 'Combo.add' : 'Combo.edit') + ':' + fieldTitle, closable: false, zIndex: 1011, destroyOnClose: true, getContainer: _this.props.env.getModalContainer, footer: _this.editFooter(), visible: editStatus }, _this.editBody()) : react_1.default.createElement(antd_1.Modal, { closable: false, width: 700, zIndex: 10000, destroyOnClose: true, className: 'row-edit-drawer ant-modal-adaptation-style', getContainer: false, title: _this.editHeader(fieldTitle), footer: _this.editFooter(), visible: editStatus }, _this.editBody()); }; _this.handleCloseFiled = function () { var _a = _this.props, items = _a.items, startRowEdit = _a.startRowEdit, editIndex = _a.editIndex, setEditIndex = _a.setEditIndex, store = _a.store, originPrinstine = _a.originPrinstine, markoperationType = _a.markoperationType, removeItem = _a.removeItem; if (_this.hasEdited) { antd_1.Modal.confirm({ content: '新的修改没有保存,确认要离开?', okText: '确定', okType: 'primary', cancelText: '取消', className: 'ant-modal-adaptation-style', zIndex: 1011, onOk: function () { if (editIndex !== -1) { markoperationType(undefined); setEditIndex(-1); setTimeout(function () { _this.handleQuickChange(store.rows[editIndex], _this.beforeData || originPrinstine[editIndex]); startRowEdit(false); _this.beforeData = null; }); } else { startRowEdit(false); markoperationType('delete'); removeItem(editIndex === -1 ? items.length - 1 : editIndex); setEditIndex(-1); } _this.setState({ rowEditData: null }); } }); } else { if (editIndex !== -1) { _this.beforeData = null; markoperationType(undefined); setEditIndex(-1); startRowEdit(false); } else { startRowEdit(false); markoperationType('delete'); setTimeout(function () { removeItem(editIndex === -1 ? items.length - 1 : editIndex); setEditIndex(-1); }); } _this.setState({ rowEditData: null }); } }; _this.editHeader = function (fieldTitle) { return react_1.default.createElement("div", { className: 'edit-row-header' }, react_1.default.createElement("div", null, fieldTitle), react_1.default.createElement("span", { style: { top: '-3px', left: '12px' }, className: 'close-edit', onClick: _this.handleCloseFiled }, react_1.default.createElement(icons_1.Icon, { icon: (0, helper_1.isMobile)() ? 'title-left' : 'close', className: "icon", style: { width: (0, helper_1.isMobile)() ? '16px' : '12px', height: (0, helper_1.isMobile)() ? '16px' : '12px' } }))); }; _this.editFooter = function () { return (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(antd_1.Button, { onClick: _this.handleCloseFiled, loading: _this.state.editLoading }, "\u53D6\u6D88"), react_1.default.createElement(antd_1.Button, { type: 'primary', onClick: _this.handleComfirm, loading: _this.state.editLoading }, "\u786E\u5B9A"))); }; _this.hasEdited = false; _this.lastChangeValue = {}; _this.editBody = function () { var _a; var _b = _this.props, render = _b.render, store = _b.store, editIndex = _b.editIndex, items = _b.items, data = _b.data, moneyParser = _b.moneyParser; var formData = (0, helper_1.createObject)(data, editIndex === -1 ? items[items.length - 1] : (_a = store.rows[editIndex]) === null || _a === void 0 ? void 0 : _a.data); return render('form-edit', _this.handleEditRow(), { className: 'row-edit-form', mode: 'horizontal', store: store, addApi: undefined, deleteApi: undefined, data: (0, tslib_1.__assign)((0, tslib_1.__assign)({}, formData), _this.state.rowEditData), removable: undefined, editable: undefined, getFormInstance: function (form) { if (!_this.formInstance) { _this.formInstance = form; } }, onChange: function (value, name, submit, changePristine) { var _a = _this.props, editIndex = _a.editIndex, items = _a.items, store = _a.store; _this.hasEdited = true; _this.handleQuickChange(editIndex === -1 ? store.rows[items.length - 1] : store.rows[editIndex], moneyParser(name, _this.getFieldsBody(), 'line'), true); _this.setState({ rowEditData: (0, tslib_1.__assign)((0, tslib_1.__assign)({}, value), moneyParser(name, _this.getFieldsBody(), 'line')) }); _this.lastChangeValue = (0, tslib_1.__assign)({}, name); }, formMobileHorizontal: true }); }; _this.handleTableRotate = function () { var tableRotate = _this.state.tableRotate; _this.setState({ tableRotate: !tableRotate }); }; _this.handleOutterScroll = _this.handleOutterScroll.bind(_this); _this.affixDetect = _this.affixDetect.bind(_this); _this.updateTableInfoLazy = (0, debounce_1.default)(_this.updateTableInfo.bind(_this), 250, { trailing: true, leading: true }); _this.tableRef = _this.tableRef.bind(_this); _this.affixedTableRef = _this.affixedTableRef.bind(_this); _this.handleAction = _this.handleAction.bind(_this); _this.handleCheck = _this.handleCheck.bind(_this); _this.handleCheckAll = _this.handleCheckAll.bind(_this); _this.handleQuickChange = _this.handleQuickChange.bind(_this); _this.handleSave = _this.handleSave.bind(_this); _this.handleSaveOrder = _this.handleSaveOrder.bind(_this); _this.reset = _this.reset.bind(_this); _this.dragTipRef = _this.dragTipRef.bind(_this); _this.getPopOverContainer = _this.getPopOverContainer.bind(_this); _this.renderCell = _this.renderCell.bind(_this); _this.renderHeadCell = _this.renderHeadCell.bind(_this); _this.renderToolbar = _this.renderToolbar.bind(_this); _this.renderStatistics = _this.renderStatistics.bind(_this); _this.handleMouseMove = _this.handleMouseMove.bind(_this); _this.handleMouseLeave = _this.handleMouseLeave.bind(_this); _this.subFormRef = _this.subFormRef.bind(_this); _this.handleColumnToggle = _this.handleColumnToggle.bind(_this); _this.renderAutoFilterForm = _this.renderAutoFilterForm.bind(_this); _this.updateAutoFillHeight = _this.updateAutoFillHeight.bind(_this); _this.handleColumns.bind(_this); _this.handleMultiColumnSort = _this.handleMultiColumnSort.bind(_this); (_b = (_a = _this.props).getTableStore) === null || _b === void 0 ? void 0 : _b.call(_a, _this.props.store); (_d = (_c = _this.props).getTableInstance) === null || _d === void 0 ? void 0 : _d.call(_c, _this); _this.showContextMenu = _this.showContextMenu.bind(_this); _this.handleEditRow = _this.handleEditRow.bind(_this); _this.handleComfirm = (0, throttle_1.default)(_this.handleComfirm.bind(_this), 1000, { leading: true, trailing: false }); _this.state = { position: [0, ''], contextMenuVisible: false, rowEditData: null, tableRotate: false, editLoading: false }; var store = props.store, columns = props.columns, selectable = props.selectable, columnsTogglable = props.columnsTogglable, draggable = props.draggable, orderBy = props.orderBy, orderDir = props.orderDir, multiple = props.multiple, footable = props.footable, primaryField = props.primaryField, itemCheckableOn = props.itemCheckableOn, itemDraggableOn = props.itemDraggableOn, hideCheckToggler = props.hideCheckToggler, combineFromIndex = props.combineFromIndex, expandConfig = props.expandConfig, formItem = props.formItem, keepItemSelectionOnPageChange = props.keepItemSelectionOnPageChange, useMobileUI = props.useMobileUI, //Aug maxKeepItemSelectionLength = props.maxKeepItemSelectionLength, isPick = props.isPick, tableLayout = props.tableLayout, showIndex = props.showIndex; var combineNum = props.combineNum; if (typeof combineNum === 'string') { combineNum = parseInt((0, tpl_builtin_1.resolveVariableAndFilter)(combineNum, props.data, '| raw'), 10); } // Aug var mobileUI = (0, helper_1.isMobile)() && useMobileUI; // Aug 移动端默认只展示6项 var _columns = columns || []; _this.sortCols = _this.handleColumns(_columns, {}); store.update({ selectable: selectable, draggable: draggable, columns: _this.sortCols, rawColumns: _this.handleColumns(_columns, { sort: false, }), columnsTogglable: columnsTogglable, orderBy: orderBy, orderDir: orderDir, multiple: multiple, showIndex: showIndex, footable: footable, expandConfig: expandConfig, primaryField: primaryField, itemCheckableOn: itemCheckableOn, itemDraggableOn: itemDraggableOn, hideCheckToggler: (0, helper_1.isMobile)() && isPick ? false : hideCheckToggler, combineNum: combineNum, combineFromIndex: combineFromIndex, keepItemSelectionOnPageChange: keepItemSelectionOnPageChange, maxKeepItemSelectionLength: maxKeepItemSelectionLength, mobileUI: mobileUI, orderColumns: new Map(), tableLayout: tableLayout }); formItem && (0, mobx_state_tree_1.isAlive)(formItem) && formItem.setSubStore(store); Table.syncRows(store, _this.props, undefined) && _this.syncSelected(); return _this; } // Jay Table.prototype.handleColumns = function (columns, options) { var _a = (options || {}).sort, sort = _a === void 0 ? true : _a; var handleCols = (0, cloneDeep_1.default)(columns); var columnInfo = this.props.columnInfo; // columns的长度比columnInfo的长度大时,不进行排序 // const flag = columnInfo && (Object.keys(columnInfo).length <= handleCols.length) if (columnInfo && Object.keys(columnInfo).length && sort) { var tempArr_1 = []; var tempArrNofixed_1 = []; var tempArrFixedLeft_1 = []; var tempArrFixedRight_1 = []; handleCols.forEach(function (col) { var _a, _b, _c; // 如果column的hidden是true,则不允许被设置 if (col === null || col === void 0 ? void 0 : col.hidden) col.canSet = false; if (col.name && columnInfo[col.name]) { if (((_a = columnInfo[col.name]) === null || _a === void 0 ? void 0 : _a.hidden) === 0) { col.hidden = (_b = col === null || col === void 0 ? void 0 : col.hidden) !== null && _b !== void 0 ? _b : false; } else { col.hidden = (_c = col === null || col === void 0 ? void 0 : col.hidden) !== null && _c !== void 0 ? _c : true; } tempArr_1[columnInfo[col.name].index] = col; } else { if (col.fixed === 'left') { tempArrFixedLeft_1.push(col); } else if (col.fixed === 'right') { tempArrFixedRight_1.push(col); } else { tempArrNofixed_1.push(col); } } }); tempArr_1 = tempArr_1.filter(Boolean); var fixedRightBefore = tempArr_1.length; for (var i = tempArr_1.length - 1; i >= 0; i--) { if (tempArr_1[i].fixed !== 'right') { fixedRightBefore = i + 1; break; } } tempArr_1.splice.apply(tempArr_1, (0, tslib_1.__spreadArray)([fixedRightBefore, 0], tempArrNofixed_1, false)); tempArr_1 = tempArrFixedLeft_1.concat(tempArr_1.concat(tempArrFixedRight_1)); handleCols = tempArr_1; } else { handleCols.forEach(function (col) { // 如果column的hidden是true,则不允许被设置 if (col === null || col === void 0 ? void 0 : col.hidden) col.canSet = false; }); } return handleCols; }; Table.syncRows = function (store, props, prevProps) { var source = props.source; var value = props.value || props.items; var rows = []; var updateRows = false; if (Array.isArray(value) && (!prevProps || (prevProps.value || prevProps.items) !== value)) { updateRows = true; rows = value; } else if (typeof source === 'string') { var resolved = (0, tpl_builtin_1.resolveVariableAndFilter)(source, props.data, '| raw'); var prev = prevProps ? (0, tpl_builtin_1.resolveVariableAndFilter)(source, prevProps.data, '| raw') : null; if (prev && prev === resolved) { updateRows = false; } else if (Array.isArray(resolved)) { updateRows = true; rows = resolved; } } updateRows && store.initRows(rows, props.getEntryId, props.reUseRow); typeof props.selected !== 'undefined' && store.updateSelected(props.selected, props.valueField); return updateRows; }; Table.prototype.componentDidMount = function () { var _this = this; var parent = (0, helper_1.getScrollParent)((0, react_dom_1.findDOMNode)(this)); if (!parent || parent === document.body) { parent = window; } this.parentNode = parent; this.updateTableInfo(); var dom = (0, react_dom_1.findDOMNode)(this); if (dom.closest('.modal-body')) { return; } var ns = this.props.classPrefix; var tableContentWrap = dom.querySelector("." + ns + "Table-contentWrap"); tableContentWrap.addEventListener('scroll', this.scrollPingBox); this.affixDetect(); parent.addEventListener('scroll', this.affixDetect); window.addEventListener('resize', this.affixDetect); this.updateAutoFillHeight(); window.addEventListener('resize', this.updateAutoFillHeight); sub_1.EventSub.on(sub_1.EventEnum.DomPrint, function (formName, cb) { cb({ name: _this.props.tableName, label: _this.props.labelName, columns: _this.props.columns }); }); }; Table.prototype.updateAutoFillHeight = function () { var _a = this.props, autoFillHeight = _a.autoFillHeight, ns = _a.classPrefix; if (!this.table) return; var table = (0, react_dom_1.findDOMNode)(this); var tableHeight = document.body.clientHeight - (0, offset_1.default)(table).top; if (autoFillHeight && tableHeight >= 350) { table.style.height = tableHeight + 'px'; } }; Table.prototype.componentDidUpdate = function (prevProps) { var _a, _b; var props = this.props; var store = props.store; if ((0, helper_1.anyChanged)([ 'selectable', 'columnsTogglable', 'draggable', 'orderBy', 'orderDir', 'multiple', 'footable', 'primaryField', 'itemCheckableOn', 'itemDraggableOn', 'hideCheckToggler', 'combineNum', 'combineFromIndex', 'expandConfig' ], prevProps, props)) { var combineNum = props.combineNum; if (typeof combineNum === 'string') { combineNum = parseInt((0, tpl_builtin_1.resolveVariableAndFilter)(combineNum, props.data, '| raw'), 10); } store.update({ selectable: props.selectable, columnsTogglable: props.columnsTogglable, draggable: props.draggable, orderBy: props.orderBy, orderDir: props.orderDir, multiple: props.multiple, showIndex: props.showIndex, primaryField: props.primaryField, footable: props.footable, itemCheckableOn: props.itemCheckableOn, itemDraggableOn: props.itemDraggableOn, hideCheckToggler: props.hideCheckToggler, combineNum: combineNum, combineFromIndex: props.combineFromIndex, expandConfig: props.expandConfig }); } if (prevProps.columns !== props.columns) { // Jay this.sortCols = this.handleColumns(props.columns || [], {}); store.update({ columns: this.sortCols, rawColumns: this.handleColumns(props.columns || [], { sort: false }), }); } if (prevProps.foldColumns !== props.foldColumns) { store.updateOperation(props.foldColumns); } if ((0, helper_1.anyChanged)(['source', 'value', 'items'], prevProps, props) || (!props.value && !props.items && (props.data !== prevProps.data || (typeof props.source === 'string' && (0, tpl_builtin_1.isPureVariable)(props.source))))) { Table.syncRows(store, props, prevProps) && this.syncSelected(); } else if ((0, helper_1.isArrayChildrenModified)(prevProps.selected, props.selected)) { var prevSelectedRows = store.selectedRows .map(function (item) { return item.id; }) .join(','); store.updateSelected(props.selected || [], props.valueField); var selectedRows = store.selectedRows.map(function (item) { return item.id; }).join(','); prevSelectedRows !== selectedRows && this.syncSelected(); } this.updateTableInfoLazy(); //状态改变时,记录原先的数据 if (prevProps.editStatus !== props.editStatus) { if (props.editIndex !== -1) props.editStatus ? this.beforeData = (_b = (_a = store.rows) === null || _a === void 0 ? void 0 : _a[props.editIndex]) === null || _b === void 0 ? void 0 : _b.data : this.beforeData = null; if (!props.editStatus) { this.hasEdited = false; this.formInstance = null; } } }; Table.prototype.componentWillUnmount = function () { var _a = this.props, formItem = _a.formItem, store = _a.store, ns = _a.classPrefix; var parent = this.parentNode; var dom = (0, react_dom_1.findDOMNode)(this); var tableContentWrap = dom.querySelector("." + ns + "Table-contentWrap"); tableContentWrap.addEventListener('scroll', this.scrollPingBox); parent && parent.removeEventListener('scroll', this.affixDetect); window.removeEventListener('resize', this.affixDetect); window.removeEventListener('resize', this.updateAutoFillHeight); this.updateTableInfoLazy.cancel(); this.unSensor && this.unSensor(); formItem && (0, mobx_state_tree_1.isAlive)(formItem) && formItem.setSubStore(null); sub_1.EventSub.off(sub_1.EventEnum.DomPrint); try { store.orderColumns.clear(); } catch (_b) { } }; Table.prototype.subFormRef = function (form, x, y) { var quickEditFormRef = this.props.quickEditFormRef; quickEditFormRef && quickEditFormRef(form, x, y); this.subForms[x + "-" + y] = form; form && this.props.store.addForm(form.props.store, y); }; Table.prototype.handleAction = function (e, action, ctx) { var onAction = this.props.onAction; // todo onAction(e, action, ctx); }; Table.prototype.handleCheck = function (item, value, shift) { var store = this.props.store; if (shift) { store.toggleShift(item); } else { item.toggle(); } this.syncSelected(); }; // 0全选 1反选 2不选 Table.prototype.handleCheckAll = function (type) { var store = this.props.store; switch (type) { case 0: store.checkAll(); break; case 1: store.checkReverse(); break; case 2: store.clear(); break; case 3: store.toggleAll(); break; default: return; } this.syncSelected(); }; Table.prototype.handleQuickChange = function (item, values, saveImmediately, savePristine, resetOnFailed) { if (saveImmediately === void 0) { saveImmediately = false; } if (!(0, mobx_state_tree_1.isAlive)(item)) { return; } var _a = this.props, onSave = _a.onSave, onPristineChange = _a.onPristineChange, propsSaveImmediately = _a.saveImmediately, primaryField = _a.primaryField; item.change(values, savePristine); // 值发生变化了,需要通过 onSelect 通知到外面,否则会出现数据不同步的问题 item.modified && this.syncSelected(); if (savePristine) { onPristineChange === null || onPristineChange === void 0 ? void 0 : onPristineChange(item.data, item.path); return; } else if (!saveImmediately && !propsSaveImmediately) { return; } if (saveImmediately && saveImmediately.api) { this.props.onAction(null, { actionType: 'ajax', api: saveImmediately.api }, values); return; } if (!onSave) { return; } onSave(item.data, (0, helper_1.difference)(item.data, item.pristine, ['id', primaryField]), item.path, undefined, item.pristine, resetOnFailed); }; Table.prototype.handleSave = function (newRows) { var _a = this.props, onSave = _a.onSave, primaryField = _a.primaryField; var rows = newRows.map(function (item) { return ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { isOrigin: true, isAdd: false, isUpdate: false })); }); var rowIndexes = newRows.map(function (item, index) { return String(index); }); var diff = rows.map(function (item) { var obj = {}; Object.keys(item).forEach(function (k) { var _a; if (k !== primaryField) { obj = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, obj), (_a = {}, _a[k] = item[k], _a)); } }); return obj; }); onSave === null || onSave === void 0 ? void 0 : onSave(rows, diff, rowIndexes); }; Table.prototype.handleSaveOrder = function () { var _a = this.props, store = _a.store, onSaveOrder = _a.onSaveOrder; if (!onSaveOrder || !store.movedRows.length) { return; } onSaveOrder(store.movedRows.map(function (item) { return item.data; }), store.rows.map(function (item) { return item.getDataWithModifiedChilden(); })); }; Table.prototype.syncSelected = function () { var _a = this.props, store = _a.store, onSelect = _a.onSelect; onSelect && onSelect(store.selectedRows.map(function (item) { return item.data; }), store.unSelectedRows.map(function (item) { return item.data; })); }; Table.prototype.reset = function () { var _this = this; var store = this.props.store; store.reset(); var subForms = []; Object.keys(this.subForms).forEach(function (key) { return _this.subForms[key] && subForms.push(_this.subForms[key]); }); subForms.forEach(function (item) { return item.clearErrors(); }); }; Table.prototype.bulkUpdate = function (value, items) { var _a = this.props, store = _a.store, primaryField = _a.primaryField; if (primaryField && value.ids) { var ids_1 = value.ids.split(','); var rows = store.rows.filter(function (item) { return (0, find_1.default)(ids_1, function (id) { return id && id == item.data[primaryField]; }); }); var newValue_1 = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, value), { ids: undefined }); rows.forEach(function (row) { return row.change(newValue_1); }); } else { var rows = store.rows.filter(function (item) { return ~items.indexOf(item.pristine); }); rows.forEach(function (row) { return row.change(value); }); } }; Table.prototype.getSelected = function () { var store = this.props.store; return store.selectedRows.map(function (item) { return item.data; }); }; Table.prototype.affixDetect = function () { var _a, _b, _c, _d; var _e = this.props.autoFillHeight, autoFillHeight = _e === void 0 ? true : _e; if (!this.props.affixHeader || !this.table || autoFillHeight) { return; } var ns = this.props.classPrefix; var dom = (0, react_dom_1.findDOMNode)(this); var clip = this.table.getBoundingClientRect(); var offsetY = (_b = (_a = this.props.affixOffsetTop) !== null && _a !== void 0 ? _a : this.props.env.affixOffsetTop) !== null && _b !== void 0 ? _b : 0; var headingHeight = ((_c = dom.querySelector("." + ns + "Table-heading")) === null || _c === void 0 ? void 0 : _c.getBoundingClientRect().height) || 0; var headerHeight = ((_d = dom.querySelector("." + ns + "Table-headToolbar")) === null || _d === void 0 ? void 0 : _d.getBoundingClientRect().height) || 0; var affixed = clip.top - headerHeight - headingHeight < offsetY && clip.top + clip.height - 40 > offsetY; var affixedDom = dom.querySelector("." + ns + "Table-fixedTop"); affixedDom.style.cssText += "top: " + offsetY + "px;width: " + this.table.parentNode.offsetWidth + "px"; affixed ? affixedDom.classList.add('in') : affixedDom.classList.remove('in'); // store.markHeaderAffix(clip.top < offsetY && (clip.top + clip.height - 40) > offsetY); }; Table.prototype.updateTableInfo = function () { var _a, _b; if (!this.table) { return; } var table = this.table; var outter = table.parentNode; var ns = this.props.classPrefix; // 完成宽高都没有变化就直接跳过了。 // if (this.totalWidth === table.scrollWidth && this.totalHeight === table.scrollHeight) { // return; // } this.totalWidth = table.scrollWidth; this.totalHeight = table.scrollHeight; this.outterWidth = outter.offsetWidth; this.outterHeight = outter.offsetHeight; var widths = (this.widths = {}); var widths2 = (this.widths2 = {}); var heights = (this.heights = {}); // heights.header = table // .querySelector('thead>tr:last-child')! // .getBoundingClientRect().height; // heights.header2 = table // .querySelector('thead>tr:first-child')! // .getBoundingClientRect().height; // Aug heights.header = ((_a = table.querySelector('thead>tr:last-child')) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().height) || 0; heights.header2 = ((_b = table.querySelector('thead>tr:first-child')) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect().height) || 0; (0, forEach_1.default)(table.querySelectorAll('thead>tr:last-child>th'), function (item) { widths[item.getAttribute('data-index')] = item.getBoundingClientRect().width; }); (0, forEach_1.default)(table.querySelectorAll('thead>tr:first-child>th'), function (item) { widths2[item.getAttribute('data-index')] = item.getBoundingClientRect().width; }); (0, forEach_1.default)(table.querySelectorAll('tbody>tr>*:last-child'), function (item, index) { return (heights[index] = item.getBoundingClientRect().height); }); // 让 react 去更新非常慢,还是手动更新吧。 var dom = (0, react_dom_1.findDOMNode)(this); (0, forEach_1.default)( // 折叠 footTable 不需要改变 dom.querySelectorAll("." + ns + "Table-fixedTop table, ." + ns + "Table-fixedLeft>table, ." + ns + "Table-fixedRight>table"), function (table) { var totalWidth = 0; var totalWidth2 = 0; (0, forEach_1.default)(table.querySelectorAll('thead>tr:last-child>th'), function (item) { var width = widths[item.getAttribute('data-index')]; item.style.cssText += "width: " + width + "px; height: " + heights.header + "px"; totalWidth += width; }); (0, forEach_1.default)(table.querySelectorAll('thead>tr:first-child>th'), function (item) { var width = widths2[item.getAttribute('data-index')]; item.style.cssText += "width: " + width + "px; height: " + heights.header2 + "px"; totalWidth2 += width; }); (0, forEach_1.default)(table.querySelectorAll('colgroup>col'), function (item) { var width = widths[item.getAttribute('data-index')]; item.setAttribute('width', "" + width); }); (0, forEach_1.default)(table.querySelectorAll('tbody>tr'), function (item, index) { item.style.cssText += "height: " + heights[index] + "px"; }); table.style.cssText += "width: " + Math.max(totalWidth, totalWidth2) + "px;table-layout: auto;"; }); this.lastScrollLeft = -1; this.handleOutterScroll(); }; Table.prototype.handleOutterScroll = function () { var _a, _b, _c, _d, _e; var outter = this.table.parentNode; var scrollLeft = outter.scrollLeft; if (scrollLeft === this.lastScrollLeft) { return; } this.lastScrollLeft = scrollLeft; var leading = scrollLeft === 0; var trailing = Math.ceil(scrollLeft) + this.outterWidth >= this.totalWidth; var ns = this.props.classPrefix; var dom = (0, react_dom_1.findDOMNode)(this); var fixedLeft = dom.querySelectorAll("." + ns + "Table-fixedLeft"); if (fixedLeft && fixedLeft.length) { for (var i = 0, len = fixedLeft.length; i < len; i++) { var node = fixedLeft[i]; leading ? node.classList.remove('in') : node.classList.add('in'); } } var fixedRight = dom.querySelectorAll("." + ns + "Table-fixedRight"); if (fixedRight && fixedRight.length) { for (var i = 0, len = fixedRight.length; i < len; i++) { var node = fixedRight[i]; trailing ? node.classList.remove('in') : node.classList.add('in'); } } var table = this.affixedTable; if (table) { table.style.cssText += "transform: translateX(-" + scrollLeft + "px)"; } // Jay var store = this.props.store; var leftFixedColumns = store.leftFixedColumns; var lastLeftFixedIndex = (_a = leftFixedColumns[leftFixedColumns.length - 1]) === null || _a === void 0 ? void 0 : _a.index; // 给table添加类名 var fixedLeftLastEl = dom.querySelector('.fixed-left-last'); if (fixedLeftLastEl) { var fixedLeftLastElRelativeLeft = fixedLeftLastEl.getBoundingClientRect().left - dom.getBoundingClientRect().left; if (leading || (fixedLeftLastElRelativeLeft > store.stickyWidths[lastLeftFixedIndex])) { dom.classList.remove('fix-left'); } else if (fixedLeftLastElRelativeLeft <= store.stickyWidths[lastLeftFixedIndex]) { // 左边要固定的列相对于表格的水平距离小于等于其 sticky left dom.classList.add('fix-left'); } } if (trailing) { dom.classList.remove('fix-right'); } else { dom.classList.add('fix-right'); } var isNaN = false; var rightFixedColumns = (0, cloneDeep_1.default)(store.rightFixedColumns); var rightFixedColumnsReverse = rightFixedColumns === null || rightFixedColumns === void 0 ? void 0 : rightFixedColumns.reverse(); var columnWidths = {}; (_b = this.table) === null || _b === void 0 ? void 0 : _b.querySelectorAll('thead>tr:nth-child(1)>th').forEach(function (item) { columnWidths[item.getAttribute('data-index')] = item.scrollWidth; }); (_c = this.table) === null || _c === void 0 ? void 0 : _c.querySelectorAll('thead>tr:nth-child(2)>th').forEach(function (item) { columnWidths[item.getAttribute('data-index')] = item.scrollWidth; }); var stickyWidths = {}; if ((_d = leftFixedColumns[0]) === null || _d === void 0 ? void 0 : _d.index) { stickyWidths["" + leftFixedColumns[0].index] = columnWidths["" + leftFixedColumns[0].index]; } if ((_e = rightFixedColumnsReverse === null || rightFixedColumnsReverse === void 0 ? void 0 : rightFixedColumnsReverse[0]) === null || _e === void 0 ? void 0 : _e.index) { stickyWidths["" + rightFixedColumnsReverse[0].index] = columnWidths["" + rightFixedColumns[0].index]; } leftFixedColumns === null || leftFixedColumns === void 0 ? void 0 : leftFixedColumns.reduce(function (acc, cv, ci, arr) { var a = acc; if (ci !== 0) { a = acc + columnWidths[arr[ci - 1].index]; } a !== a && (isNaN = true); stickyWidths["" + cv.index] = a; return a; }, 0); rightFixedColumnsReverse === null || rightFixedColumnsReverse === void 0 ? void 0 : rightFixedColumnsReverse.reduce(function (acc, cv, ci, arr) { var a = acc; if (ci !== 0) { a = acc + columnWidths[arr[ci - 1].index]; } a !== a && (isNaN = true); stickyWidths["" + cv.index] = a; return a; }, -2); var equal = (0, isEqual_1.default)(stickyWidths, store.stickyWidths); // 避免重复render组件,提高性能 if (!isNaN && !equal) { store.setStickyWidths(stickyWidths); } }; Table.prototype.tableRef = function (ref) { this.table = ref; if (ref) { this.unSensor = (0, resize_sensor_1.resizeSensor)(ref.parentNode, this.updateTableInfoLazy); } else { this.unSensor && this.unSensor(); delete this.unSensor; } }; Table.prototype.dragTipRef = function (ref) { if (!this.dragTip && ref) { this.initDragging(); } else if (this.dragTip && !ref) { this.destroyDragging(); } this.dragTip = ref; }; Table.prototype.affixedTableRef = function (ref) { this.affixedTable = ref; }; Table.prototype.initDragging = function () { var store = this.props.store; var ns = this.props.classPrefix; this.sortable = new sortablejs_1.default(this.table.querySelector('tbody'), { group: 'table', animation: 150, handle: "." + ns + "Table-dragCell", filter: "." + ns + "Table-dragCell.is-dragDisabled", ghostClass: 'is-dragging', onEnd: function (e) { // 没有移动 if (e.newIndex === e.oldIndex) { return; } var parent = e.to; if (e.oldIndex < parent.childNodes.length - 1) { parent.insertBefore(e.item, parent.childNodes[e.oldIndex]); } else { parent.appendChild(e.item); } store.exchange(e.oldIndex, e.newIndex); } }); }; Table.prototype.destroyDragging = function () { this.sortable && this.sortable.destroy(); }; Table.prototype.getPopOverContainer = function () { return (0, react_dom_1.findDOMNode)(this); }; Table.prototype.handleMouseMove = function (e) { var tr = e.target.closest('tr[data-id]'); if (!tr) { return; } var _a = this.props, store = _a.store, affixColumns = _a.affixColumns, itemActions = _a.itemActions; if ((affixColumns === false || (store.leftFixedColumns.length === 0 && store.rightFixedColumns.length === 0)) && (!itemActions || !itemActions.filter(function (item) { return !item.hiddenOnHover; }).length)) { return; } var id = tr.getAttribute('data-id'); var row = store.hoverRow; if ((row === null || ro