UNPKG

@fe6/water-pro

Version:

An enterprise-class UI design language and Vue-based implementation

823 lines (725 loc) 30.2 kB
import { resolveDirective as _resolveDirective, createVNode as _createVNode } from "vue"; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } import _regeneratorRuntime from "@babel/runtime/regenerator"; function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_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"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } import { __awaiter } from "tslib"; import { defineComponent, watch, computed, onMounted, unref, ref } from 'vue'; import { LoadingOutlined, CloseOutlined } from '@ant-design/icons-vue'; import { clone, hasOwn, isNumber, isUndefined } from '@fe6/shared'; import flatten from 'lodash-es/flatten'; import uniq from 'lodash-es/uniq'; import isEqual from 'lodash-es/isEqual'; import { ModalPro, useModal } from '../../modal-pro'; import { BasicArrow } from '../../basic-arrow'; import Tree from '../../tree'; import { Row, Col } from '../../grid'; import Divider from '../../divider'; import Input from '../../input'; import ContainerScroll from '../../container-scroll'; import Checkbox from '../../checkbox'; import Radio from '../../radio'; import Space from '../../space'; import Typography from '../../typography'; import TagGroup from '../../tag-group'; import Tooltip from '../../tooltip'; import PropTypes from '../../_util/vue-types'; import { useRuleFormItem } from '../../_util/hooks/use-form-item'; import useConfigInject from '../../_util/hooks/useConfigInject'; import { tuple } from '../../_util/type'; import WTitleRender from '../../_util/render'; import useFetch from '../../_util/hooks/use-fetch'; import { getClassName } from '../../_util/classNames'; import { convertTreeToEntities } from '../../vc-tree/src/util'; import { getSlot } from '../../_util/tsx'; import { renderTreeNodes, rendetUser, defaultFields } from './utils'; import zhCn from '../locale/zh_CN'; export default defineComponent({ name: 'AModalUser', props: { value: Array, fieldNames: PropTypes.object.def(clone(defaultFields)), maxTagTextLength: PropTypes.number.def(8), maxTagCount: PropTypes.number.def(2), closable: PropTypes.bool.def(true), size: PropTypes.oneOf(tuple('small', 'large', 'default')), placeholder: PropTypes.string, searchPlaceholder: PropTypes.string, type: PropTypes.oneOf(['select', '']).def('select'), prefixCls: PropTypes.string, modalTitle: PropTypes.string, modalRightTitle: PropTypes.string, titleRightRender: PropTypes.func, api: { type: Function, default: null }, apiParams: PropTypes.object.def({}), beforeOk: { type: Function, default: function _default(_ref) { var success = _ref.success; return new Promise(function (reslove) { success(); reslove(true); }); } }, options: PropTypes.array.def([]), disabled: PropTypes.bool, scrollName: PropTypes.string.def(''), modalProps: PropTypes.object.def({}), showAlias: PropTypes.bool.def(true), mode: PropTypes.oneOf(['checkbox', 'radio']).def('checkbox') }, emits: ['update:value', 'change', 'ok', 'cancel'], setup: function setup(props, _ref2) { var _this = this; var emit = _ref2.emit; var theFields = computed(function () { return _extends(_extends({}, defaultFields), props.fieldNames); }); var _useConfigInject = useConfigInject('modal-user', props), prefixClsNew = _useConfigInject.prefixCls, configProvider = _useConfigInject.configProvider; var _useRuleFormItem = useRuleFormItem(props), _useRuleFormItem2 = _slicedToArray(_useRuleFormItem, 1), state = _useRuleFormItem2[0]; var _useModal = useModal(), registerModal = _useModal.register, modalMethods = _useModal.methods; var openModal = modalMethods.openModal, getVisible = modalMethods.getVisible; var loading = ref(false); var keyList = ref([]); // 用于选中树形组件 var keyOldList = ref([]); // 取消时候的恢复 var userList = ref([]); // 所有不重复的用户列表,用于搜索 // 原始数据 var treeAllList = ref([]); var emitValue = function emitValue(newVal) { if (newVal) { keyList.value = newVal.slice(); } emit('update:value', keyList.value); emit('change', keyList.value, { value: keyList.value, eventType: 'change', datas: treeAllList.value, userList: userList.value }); }; var searchValue = ref(''); var searchChange = function searchChange(ev) { searchValue.value = ev.target.value; }; var searchCheckboxChange = function searchCheckboxChange(checkItem) { var uId = checkItem[theFields.value.value]; var kIdx = keyList.value.findIndex(function (kItem) { return kItem === uId; }); if (kIdx > -1) { keyList.value.splice(kIdx, 1); } else { if (props.mode === 'checkbox') { keyList.value.push(uId); } else { keyList.value = [uId]; } } }; var closeTagGroupClick = function closeTagGroupClick(tagRemoveItem, keyEntities) { searchCheckboxChange(tagRemoveItem); emitValue(keyList.value); var selectNodes = keyList.value.map(function (kItem) { return keyEntities.get(kItem); }); emit('ok', { value: keyList.value, selectNodes: selectNodes, eventType: 'tag-close', datas: treeAllList.value, userList: userList.value }); }; var copyCheckData = function copyCheckData() { keyOldList.value = keyList.value.slice(); }; var resetCheckData = function resetCheckData() { keyList.value = keyOldList.value.slice(); }; var emptyCheckData = function emptyCheckData() { keyList.value = []; }; var emptyClick = function emptyClick() { emptyCheckData(); emitValue(keyList.value); }; var getOneLevelUserList = function getOneLevelUserList(targetUsers) { targetUsers.forEach(function (treeItem) { if (hasOwn(treeItem, theFields.value.users) && treeItem[theFields.value.users].length) { treeItem[theFields.value.users].forEach(function (userItem) { var uItem = userList.value.find(function (uItem) { return userItem[theFields.value.unionid] === uItem[theFields.value.unionid]; }); if (!uItem) { userList.value.push(userItem); } }); } if (hasOwn(treeItem, theFields.value.children) && treeItem[theFields.value.children].length) { getOneLevelUserList(treeItem[theFields.value.children]); } }); }; var afterGetOptions = function afterGetOptions(newOptions, isInit) { treeAllList.value = newOptions; getOneLevelUserList(treeAllList.value); loading.value = false; if (!isInit) { copyCheckData(); openModal(); } }; var getTagDatas = function getTagDatas(isInit) { return __awaiter(_this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { var _useFetch, fetch; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!loading.value) { loading.value = true; if (props.api) { _useFetch = useFetch(props.api), fetch = _useFetch.fetch; fetch({ success: function success(res) { loading.value = false; afterGetOptions(res, isInit); }, error: function error() { loading.value = false; }, params: props.apiParams }); } else { afterGetOptions(props.options, isInit); } } case 1: case "end": return _context.stop(); } } }, _callee); })); }; var getTreeList = function getTreeList(isInit) { return __awaiter(_this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() { return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (treeAllList.value.length) { _context2.next = 5; break; } _context2.next = 3; return getTagDatas(isInit); case 3: _context2.next = 6; break; case 5: if (!isInit) { copyCheckData(); openModal(); } case 6: case "end": return _context2.stop(); } } }, _callee2); })); }; var showModal = function showModal() { return __awaiter(_this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() { return _regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: if (props.disabled) { _context3.next = 3; break; } _context3.next = 3; return getTreeList(); case 3: case "end": return _context3.stop(); } } }, _callee3); })); }; var selectOne = function selectOne(params, oneEv) { var checked = oneEv.checked, _oneEv$node = oneEv.node, halfChecked = _oneEv$node.halfChecked, eventKey = _oneEv$node.eventKey, value = _oneEv$node.value; if (props.mode === 'checkbox') { if (isNumber(eventKey)) { // 如果半选,就选中所有,否则就反选 if (checked || halfChecked) { // FIX 之所以这样 concat 是因为点击中间的半选,父级已经选择了的用户就没了 keyList.value = uniq([].concat(keyList.value, value.slice())); } else { value.forEach(function (vItem) { var checkIdx = keyList.value.findIndex(function (kItem) { return kItem === vItem; }); if (checkIdx > -1) { keyList.value.splice(checkIdx, 1); } }); } } else { var _checked = params.checked; var newUserIdList = _checked.filter(function (key) { return !isNumber(key); }); keyList.value = newUserIdList.slice(); } emitValue(keyList.value); } }; var radioSelectOne = function radioSelectOne(userItem) { if (props.mode === 'radio') { keyList.value = [userItem[theFields.value.value]]; emitValue(keyList.value); } }; var cancelModal = function cancelModal(keyEntities) { resetCheckData(); emitValue(); var selectNodes = keyList.value.map(function (kItem) { return keyEntities.get(kItem); }); emit('cancel', { value: keyList.value, selectNodes: selectNodes, eventType: 'modal-cancel', datas: treeAllList.value, userList: userList.value }); }; var submitModal = function submitModal(keyEntities) { if (!loading.value) { loading.value = true; props.beforeOk({ params: { keyList: keyList.value }, success: function success() { loading.value = false; emitValue(keyList.value); var selectNodes = keyList.value.map(function (kItem) { return keyEntities.get(kItem); }); emit('ok', { value: keyList.value, selectNodes: selectNodes, eventType: 'modal-ok', datas: treeAllList.value, userList: userList.value }); openModal(false); }, error: function error() { resetCheckData(); loading.value = false; } }); } }; var syncState = function syncState() { return __awaiter(_this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() { var myState; return _regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: myState = unref(state); if (!myState) { _context4.next = 7; break; } keyList.value = myState; // fix: 弹框中不按顺序选择,并不按顺序取消选择高亮问题 keyList.value = keyList.value.sort(function (prev, next) { return prev - next; }); if (!keyList.value.length) { _context4.next = 7; break; } _context4.next = 7; return getTreeList(true); case 7: case "end": return _context4.stop(); } } }, _callee4); })); }; watch(function () { return props.value; }, function (newValue, oldValue) { return __awaiter(_this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee5() { return _regeneratorRuntime.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: if (!isUndefined(newValue)) { _context5.next = 5; break; } keyList.value = []; emptyCheckData(); _context5.next = 8; break; case 5: if (isEqual(newValue, oldValue)) { _context5.next = 8; break; } _context5.next = 8; return syncState(); case 8: case "end": return _context5.stop(); } } }, _callee5); })); }); onMounted(function () { return __awaiter(_this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee6() { return _regeneratorRuntime.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: _context6.next = 2; return syncState(); case 2: case "end": return _context6.stop(); } } }, _callee6); })); }); return { theFields: theFields, prefixClsNew: prefixClsNew, boxClass: getClassName("".concat(prefixClsNew.value, "-select-box"), props.size), selectClass: getClassName("".concat(prefixClsNew.value, "-select"), props.size), selectTagClass: getClassName("".concat(prefixClsNew.value, "-select-tag"), props.size), registerModal: registerModal, getVisible: getVisible, treeAllList: treeAllList, userList: userList, keyList: keyList, searchValue: searchValue, searchChange: searchChange, searchCheckboxChange: searchCheckboxChange, closeTagGroupClick: closeTagGroupClick, emptyClick: emptyClick, cancelModal: cancelModal, submitModal: submitModal, showModal: showModal, selectOne: selectOne, radioSelectOne: radioSelectOne, loading: loading, configProvider: configProvider }; }, render: function render() { var _this2 = this; var btnNode; var theLocal = this.configProvider && this.configProvider.locale && this.configProvider.locale.ModalUser ? this.configProvider.locale.ModalUser : zhCn; var modalTitleNode = this.modalTitle || theLocal.select; var selectNodes = null; var checkedNodes = []; var checkedUserList = []; // 选中节点 var checkNodeIdList = []; // 半选中的节点 var checkHalfIdList = []; var treeValue = this.keyList.slice(); var allKeysEntities; // 有数据才会渲染,避免重复加载耗费性能 if (this.treeAllList.length > 0 && this.userList.length > 0) { var treeChildNode = renderTreeNodes(this.showAlias, this.treeAllList, this.theFields, this.prefixClsNew, this.mode, this.radioSelectOne, theLocal); var _convertTreeToEntitie = convertTreeToEntities(treeChildNode), keyEntities = _convertTreeToEntitie.keyEntities; allKeysEntities = keyEntities; if (this.searchValue) { selectNodes = this.userList.filter(function (uItem) { return uItem[_this2.theFields.title].includes(_this2.searchValue); }).map(function (uItem) { return _createVNode("div", { "class": "".concat(_this2.prefixClsNew, "-user-box") }, [rendetUser(_this2.showAlias, _this2.prefixClsNew, _this2.theFields, uItem, function () { return _this2.mode === 'checkbox' ? _createVNode(Checkbox, { "checked": _this2.keyList.includes(uItem[_this2.theFields.value]) }, null) : _createVNode(Radio, { "checked": _this2.keyList.includes(uItem[_this2.theFields.value]) }, null); }, function () {}, function () { _this2.searchCheckboxChange(uItem); })()]); }); } else { selectNodes = _createVNode(Tree, { "defaultExpandAll": true, "checkable": true, "checkStrictly": true, "checkedKeys": this.mode === 'checkbox' ? { checked: treeValue, halfChecked: checkHalfIdList } : {}, "selectedKeys": this.mode === 'checkbox' ? [] : treeValue, "class": "".concat(this.prefixClsNew, "-tree"), "onCheck": this.selectOne }, { default: function _default() { return [treeChildNode]; } }); } if (this.keyList.length) { checkedUserList = this.userList.filter(function (uItem) { return _this2.keyList.includes(uItem[_this2.theFields.value]); }); checkedNodes = checkedUserList.map(function (uItem) { return _createVNode("div", { "class": "".concat(_this2.prefixClsNew, "-user-box") }, [rendetUser(_this2.showAlias, _this2.prefixClsNew, _this2.theFields, uItem, function () {}, function () { return _createVNode(Tooltip, { "title": theLocal.remove }, { default: function _default() { return [_createVNode("div", { "class": "".concat(_this2.prefixClsNew, "-user-close"), "onClick": function onClick() { return _this2.searchCheckboxChange(uItem); } }, [_createVNode(CloseOutlined, null, null)])]; } }); })()]); }); // 选中节点 checkNodeIdList = uniq(flatten(checkedUserList.map(function (uItem) { return uItem[_this2.theFields.nodeId]; }))); // 半选中 checkHalfIdList // 通过节点匹配,找到里面没有匹配的,删掉添加到半匹配中 allKeysEntities.forEach(function (value) { var _value$node$props = value.node.props, userId = _value$node$props.userId, key = _value$node$props.key; if (userId) { var hasAllKey = userId.length > 1 ? userId.every(function (uItem) { return _this2.keyList.find(function (kItem) { return kItem === uItem; }); }) : true; // FIX 当数据只有一条的时候,节点选不中 if (hasAllKey && userId.length > 0) { var hasKey = _this2.keyList.find(function (kItem) { return kItem === userId[0]; }); if (hasKey) { treeValue.push(key); } } if (!hasAllKey) { var noIdx = checkNodeIdList.findIndex(function (nId) { return nId === key; }); if (noIdx > -1) { checkNodeIdList.splice(noIdx, 1); checkHalfIdList.push(key); } } } }); treeValue = _toConsumableArray(new Set([].concat(treeValue, checkNodeIdList))); if (this.titleRightRender) { modalTitleNode = _createVNode("div", { "class": "".concat(this.prefixClsNew, "-title") }, [_createVNode("span", null, [this.modalTitle]), _createVNode("div", null, [_createVNode(WTitleRender, { "render": this.titleRightRender }, null)])]); } } } var children = getSlot(this.$slots); if (!children && this.type === 'select') { var btnInnerNode = _createVNode("div", { "class": "".concat(this.prefixClsNew, "-select-placeholder") }, [this.placeholder || theLocal.add]); if (checkedUserList.length) { btnInnerNode = _createVNode("div", { "class": "".concat(this.prefixClsNew, "-select-tags") }, [_createVNode(TagGroup, { "class-name": this.selectTagClass, "value": checkedUserList, "value-label": this.theFields.value, "name-label": this.theFields.title, "max-tag-text-length": this.maxTagTextLength, "max-tag-count": this.maxTagCount, "createable": false, "color": "", "closable": this.closable, "create-inputable": false, "create-loading": this.loading, "onCloseClick": function onCloseClick(cItem) { return _this2.closeTagGroupClick(cItem, allKeysEntities); }, "disabled": this.disabled, "class": "".concat(this.prefixClsNew, "-tags") }, { more: function more() { return "+".concat(_this2.keyList.length - _this2.maxTagCount); } })]); } var iconNode = null; if (this.loading) { iconNode = _createVNode(LoadingOutlined, { "class": "".concat(this.prefixClsNew, "-select-arrow") }, null); } else { iconNode = _createVNode(BasicArrow, { "class": "".concat(this.prefixClsNew, "-select-arrow"), "expand": !this.getVisible, "top": this.getVisible }, null); } btnNode = _createVNode("div", { "class": [this.selectClass, _defineProperty({}, "".concat(this.prefixClsNew, "-select-disabled"), this.disabled)], "onClick": this.showModal }, [_createVNode("div", { "class": this.boxClass }, [btnInnerNode]), iconNode]); } if (children && children.length) { btnNode = _createVNode("div", { "onClick": this.showModal }, [children]); } return _createVNode("div", { "class": this.type ? ["".concat(this.prefixClsNew, "-select-warp")] : '' }, [btnNode, _createVNode(ModalPro, _objectSpread({ "width": "1000px", "body-style": { padding: '0' }, "scroll-style": { padding: '8px 16px 0' }, "onRegister": this.registerModal, "onOk": function onOk() { return _this2.submitModal(allKeysEntities); }, "ok-button-props": { loading: this.loading }, "onCancel": function onCancel() { return _this2.cancelModal(allKeysEntities); } }, this.modalProps), { default: function _default() { return [_createVNode(Row, { "class": "".concat(_this2.prefixClsNew, "-modal") }, { default: function _default() { return [_createVNode(Col, { "span": 11 }, { default: function _default() { return [_createVNode("div", null, [_createVNode(Input.Search, { "value": _this2.searchValue, "style": "margin-bottom: 8px", "allowClear": true, "placeholder": _this2.searchPlaceholder || theLocal.pleaseholder, "onChange": _this2.searchChange }, null), _createVNode(ContainerScroll, { "class": _this2.scrollName, "showHorizontal": true, "style": "height: 353px" }, { default: function _default() { return [selectNodes]; } })])]; } }), _createVNode(Col, { "span": 2 }, { default: function _default() { return [_createVNode(Divider, { "class": "".concat(_this2.prefixClsNew, "-divider"), "type": "vertical" }, null)]; } }), _createVNode(Col, { "span": 11 }, { default: function _default() { return [_createVNode("div", null, [_createVNode(Space, { "size": 0, "align": "center", "class": "".concat(_this2.prefixClsNew, "-empty") }, { default: function _default() { return [_createVNode(Typography.Text, null, { default: function _default() { return [_this2.modalRightTitle || theLocal.selected]; } }), _createVNode(Typography.Link, { "onClick": _this2.emptyClick }, { default: function _default() { return [theLocal.clear]; } })]; } }), _createVNode(ContainerScroll, { "class": _this2.scrollName, "showHorizontal": true, "style": "height: 353px" }, { default: function _default() { return [checkedNodes]; } })])]; } })]; } })]; }, header: function header() { return modalTitleNode; } })]); } });