UNPKG

fastlion-amis

Version:

一种MIS页面生成工具

436 lines (435 loc) 29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var icons_1 = require("@ant-design/icons"); var antd_1 = require("antd"); var lodash_1 = require("lodash"); var react_1 = tslib_1.__importStar(require("react")); var icons_2 = require("../components/icons"); var factory_1 = require("../factory"); var helper_1 = require("../utils/helper"); var utils_1 = require("../utils/utils"); var font_1 = (0, tslib_1.__importDefault)(require("../icons/font")); var Button_1 = (0, tslib_1.__importDefault)(require("../components/Button")); var launchDataMap = new Map(); var QuickLaunch = function (props) { var _a, _b; var env = props.env, launchDataApi = props.launchDataApi, launchAddApi = props.launchAddApi, launchListApi = props.launchListApi, launchTreeApi = props.launchTreeApi, launchDeleteApi = props.launchDeleteApi, cx = props.classnames, _c = props.title, title = _c === void 0 ? '快速发起' : _c; var _d = (0, react_1.useState)([]), launchList = _d[0], setLaunchList = _d[1]; var _e = (0, react_1.useState)(false), visible = _e[0], setVisible = _e[1]; var _f = (0, react_1.useState)([]), appList = _f[0], setAppList = _f[1]; var _g = (0, react_1.useState)(''), selectedId = _g[0], setSelectedId = _g[1]; var _h = (0, react_1.useState)([]), launchGroup = _h[0], setLaunchGroup = _h[1]; var _j = (0, react_1.useState)(), searchRes = _j[0], setSearchRes = _j[1]; var _k = (0, react_1.useState)(0), tempNum = _k[0], setTempNum = _k[1]; var _l = (0, react_1.useState)([]), selectList = _l[0], setSelectList = _l[1]; var _m = (0, react_1.useState)(['0']), expandedKeys = _m[0], setExpandedKeys = _m[1]; var _o = (0, react_1.useState)(['0']), selectedKeys = _o[0], setSelectedKeys = _o[1]; var _p = (0, react_1.useState)(false), editing = _p[0], setEditing = _p[1]; var bodyRef = (0, react_1.useRef)(null); var pageBodyRef = (0, react_1.useRef)(null); var defaultValue = (0, react_1.useRef)(''); (0, react_1.useEffect)(function () { //计算缺少的占位元素数量 if (bodyRef.current) { var colNum = Math.floor((bodyRef.current.clientWidth - 32) / (70 + 8)); //列数 var restNum = launchList.length % colNum; //最后一行数量 var num = colNum - restNum - 1; num > 0 && setTempNum(num); } }, [launchList]); (0, react_1.useEffect)(function () { var list = launchList.map(function (item) { if (item.firstPage) { return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { menuId: item.launchId, menuPath: item.menuPath, menuName: item.launchName, launchPath: undefined, menuType: item.launchType, menuIcon: item.launchIcon }); } return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { secMenuId: item.launchId, menuPath: item.menuPath, secMenuName: item.launchName, launchPath: undefined, menuType: item.launchType, menuIcon: item.launchIcon }); }); setSelectList(list); }, [launchList]); var initLaunchData = function () { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () { var _a, data, ok, msg; return (0, tslib_1.__generator)(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, env.fetcher(launchDataApi)]; case 1: _a = _b.sent(), data = _a.data, ok = _a.ok, msg = _a.msg; if (ok) { setLaunchList((0, lodash_1.isArray)(data) ? data.map(function (item) { var hashNum = (0, utils_1.getHashCode)(item.launchName + item.launchPath) % 54 || 0; var targetIcon = font_1.default[hashNum]; return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { launchIcon: (item.launchIcon || targetIcon.icon) }); }) : []); } else { antd_1.message.error(msg); } return [2 /*return*/]; } }); }); }; var initLaunchTreeData = function () { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () { var _a, data, ok, msg, rootNode, id, treeList; return (0, tslib_1.__generator)(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, env.fetcher(launchTreeApi)]; case 1: _a = _b.sent(), data = _a.data, ok = _a.ok, msg = _a.msg; if (ok) { if ((0, lodash_1.isArray)(data)) { rootNode = data; id = rootNode[0].appId; treeList = rootNode.map(function (item, index) { var children = item.firstMenuList.map(function (info, childIndex) { return ({ title: info.menuName, key: index + "-" + childIndex, icon: react_1.default.createElement(icons_2.Icon, { icon: '#' + info.menuIcon }), appId: item.appId, menuId: info.menuId }); }); return { title: item.appName, appId: item.appId, key: String(index), icon: '', children: children }; }); setSelectedId(id); setAppList(treeList); initLaunchGroup(id); } else { setAppList([data[0]]); } } else { antd_1.message.error(msg); } return [2 /*return*/]; } }); }); }; var initLaunchGroup = function (applicationId) { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () { var _a, data, ok, msg, list; return (0, tslib_1.__generator)(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, env.fetcher(launchListApi, { appId: applicationId })]; case 1: _a = _b.sent(), data = _a.data, ok = _a.ok, msg = _a.msg; if (ok) { if ((0, lodash_1.isArray)(data) && data.length > 0) { list = data.map(function (item) { if (item === null || item === void 0 ? void 0 : item.seconds) { return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { seconds: item.seconds.map(function (info) { return ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, info), { secondList: info.secondList.map(function (node) { return ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, node), { appId: applicationId })); }) })); }) }); } else { return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { appId: applicationId }); } }); !launchDataMap.has(applicationId) && launchDataMap.set(applicationId, list); setLaunchGroup(list); } else { setLaunchGroup([]); } } else { antd_1.message.error(msg); } return [2 /*return*/]; } }); }); }; var onSearch = function (e) { (0, lodash_1.debounce)(handleSearch, 500)(e.target.value); }; //搜索 var handleSearch = function (value) { defaultValue.current = value; if (!value) { setSearchRes(undefined); return; } var list = []; launchGroup.forEach(function (item) { if (item.seconds) { item.seconds.forEach(function (node) { var _a; (_a = node.secondList) === null || _a === void 0 ? void 0 : _a.forEach(function (info) { info.secMenuName.includes(value) && list.push(info); }); }); } else { item.menuName.includes(value) && list.push(item); } }); setSearchRes(list); }; var onExpand = function (expandedKeys, info) { setExpandedKeys(expandedKeys); }; var onSelect = function (selectedKeys, info) { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () { var dom; var _a; return (0, tslib_1.__generator)(this, function (_b) { switch (_b.label) { case 0: if (!(selectedId !== info.node.appId)) return [3 /*break*/, 3]; setSelectedId(info.node.appId); if (!launchDataMap.has(info.node.appId)) return [3 /*break*/, 1]; setLaunchGroup(launchDataMap.get(info.node.appId)); return [3 /*break*/, 3]; case 1: return [4 /*yield*/, initLaunchGroup(info.node.appId)]; case 2: _b.sent(); _b.label = 3; case 3: setSelectedKeys(selectedKeys); dom = (_a = pageBodyRef.current) === null || _a === void 0 ? void 0 : _a.querySelector('#' + info.node.menuId); if (dom) { dom.scrollIntoView({ behavior: 'smooth', block: 'start' }); } return [2 /*return*/]; } }); }); }; var handleClick = function (node) { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () { var _a, ok, msg, id; var _b; return (0, tslib_1.__generator)(this, function (_c) { switch (_c.label) { case 0: if (!editing) return [3 /*break*/, 2]; return [4 /*yield*/, env.fetcher(launchDeleteApi, { launchId: node.launchId, firstPage: node.firstPage })]; case 1: _a = _c.sent(), ok = _a.ok, msg = _a.msg; if (ok) { setLaunchList(launchList.filter(function (item) { return item.launchId !== node.launchId; })); } else { antd_1.message.error(msg); } return [3 /*break*/, 3]; case 2: if (node.launchPath) { id = 'Matrix' + (0, utils_1.getHashCode)(node.launchPath).toString(); (_b = env.onPageLink) === null || _b === void 0 ? void 0 : _b.call(env, id, id, node.launchName, node.launchPath, undefined); } _c.label = 3; case 3: return [2 /*return*/]; } }); }); }; //标记是否有操作,没操作点完成不需要提交请求 var shouldFetch = (0, react_1.useRef)(false); var handleSelect = function (node) { shouldFetch.current = true; //判断是选中还是取消选中 var isSelected = selectList.find(function (item) { if (node.secMenuId) return item.secMenuId === node.secMenuId; if (node.menuId) return item.menuId === node.menuId; return false; }); if (isSelected) { setSelectList(selectList.filter(function (item) { if (node.secMenuId) return item.secMenuId !== node.secMenuId; if (node.menuId) return item.menuId !== node.menuId; return true; })); } else { setSelectList((0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], selectList, true), [node], false)); } }; var handleOk = function () { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () { var _a, msg, ok; return (0, tslib_1.__generator)(this, function (_b) { switch (_b.label) { case 0: if (!shouldFetch.current) return [3 /*break*/, 4]; if (!selectList.length) return [3 /*break*/, 2]; return [4 /*yield*/, env.fetcher(launchAddApi, { launchParam: selectList.map(function (item) { return ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { launchId: item.secMenuId || item.menuId })); }) })]; case 1: _a = _b.sent(), msg = _a.msg, ok = _a.ok; if (ok) { setVisible(false); initLaunchData(); antd_1.message.info('更新成功'); } else { antd_1.message.error(msg); } return [3 /*break*/, 3]; case 2: antd_1.message.info('请勾选要添加的菜单'); _b.label = 3; case 3: return [3 /*break*/, 5]; case 4: setVisible(false); _b.label = 5; case 5: shouldFetch.current = false; return [2 /*return*/]; } }); }); }; var handleChange = function (value, option) { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () { return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: setSelectedId(value); if (!launchDataMap.has(value)) return [3 /*break*/, 1]; setLaunchGroup(launchDataMap.get(value)); return [3 /*break*/, 3]; case 1: return [4 /*yield*/, initLaunchGroup(value)]; case 2: _a.sent(); _a.label = 3; case 3: return [2 /*return*/]; } }); }); }; (0, react_1.useEffect)(function () { initLaunchData(); initLaunchTreeData(); }, []); (0, react_1.useEffect)(function () { if (visible && !launchGroup.length) { initLaunchGroup(selectedId); } }, [visible]); var selectedFields = (0, react_1.useMemo)(function () { return "\u5DF2\u9009\uFF08" + selectList.length + "\uFF09\uFF1A" + selectList.map(function (item) { return item.secMenuName || item.menuName; }).join('、'); }, [selectList]); var renderFooter = function () { return react_1.default.createElement("div", { className: 'quick-launch-modal-footer' }, react_1.default.createElement("div", { className: 'quick-launch-modal-footer-left' }, selectedFields), react_1.default.createElement("div", { className: 'quick-launch-modal-footer-right' }, react_1.default.createElement(Button_1.default, { onClick: function () { return setVisible(false); } }, "\u53D6\u6D88"), react_1.default.createElement(Button_1.default, { level: 'primary', onClick: handleOk }, "\u786E\u5B9A"))); }; var renderFlattenItem = function (item, index) { var k = index + "-" + (item.secMenuId || item.menuId); var hashNum = (0, utils_1.getHashCode)(k) % 54 || 0; var targetIcon = font_1.default[hashNum]; return react_1.default.createElement("div", { key: k, id: (searchRes === null || searchRes === void 0 ? void 0 : searchRes.length) ? '' : item.menuId, className: "quick-launch-modal-body-group-item", onClick: function () { return handleSelect(item); } }, react_1.default.createElement("div", { className: 'quick-launch-modal-body-group-item-icon-box' }, react_1.default.createElement("div", { className: 'quick-launch-modal-body-group-item-icon' }, react_1.default.createElement(icons_2.Icon, { icon: '#' + (item.menuIcon || targetIcon.icon) }))), react_1.default.createElement("div", { className: 'quick-launch-modal-body-group-item-name' }, item.secMenuName || item.menuName), selectList.find(function (node) { return node.secMenuId ? node.secMenuId === item.secMenuId : node.menuId === item.menuId; }) ? react_1.default.createElement(icons_1.CheckCircleFilled, { className: 'quick-launch-modal-body-group-item-sel', style: { fontSize: '18px' } }) : react_1.default.createElement("div", { className: 'quick-launch-modal-body-group-item-unsel' })); }; var renderItem = function () { if (searchRes) { return react_1.default.createElement("div", { className: 'quick-launch-modal-body-search-list' }, searchRes.map(function (item, index) { return renderFlattenItem(item, index); })); } return launchGroup.map(function (item, index) { if (item.seconds) { if (item.seconds.length) { return react_1.default.createElement("div", { id: item.menuId, key: item.menuId + index }, item.seconds.map(function (node, nodeIndex) { var _a, _b; return react_1.default.createElement("div", { key: (_a = node.groupName) !== null && _a !== void 0 ? _a : '' + index + '-' + nodeIndex, className: "quick-launch-modal-body-group" }, react_1.default.createElement("div", { className: "quick-launch-modal-body-group-title" }, node.groupName), react_1.default.createElement("div", { className: "quick-launch-modal-body-group-body" }, react_1.default.createElement("div", { className: "quick-launch-modal-body-group-body-container" }, (_b = node.secondList) === null || _b === void 0 ? void 0 : _b.map(function (info, secIndex) { var hashNum = (0, utils_1.getHashCode)(info.secMenuName + info.menuPath) % 54 || 0; var targetIcon = font_1.default[hashNum]; return react_1.default.createElement("div", { onClick: function () { return handleSelect(info); }, key: index + '-' + nodeIndex + '-' + secIndex + info.secMenuName + info.secMenuId, className: "quick-launch-modal-body-group-item" }, react_1.default.createElement("div", { className: 'quick-launch-modal-body-group-item-icon-box' }, react_1.default.createElement("div", { className: 'quick-launch-modal-body-group-item-icon' }, react_1.default.createElement(icons_2.Icon, { icon: '#' + (info.menuIcon || targetIcon.icon) }))), react_1.default.createElement("div", { className: 'quick-launch-modal-body-group-item-name' }, info.secMenuName), selectList.find(function (node) { return node.secMenuId === info.secMenuId; }) ? react_1.default.createElement(icons_1.CheckCircleFilled, { className: 'quick-launch-modal-body-group-item-sel', style: { fontSize: '18px' } }) : react_1.default.createElement("div", { className: 'quick-launch-modal-body-group-item-unsel' })); })))); })); } return null; } return renderFlattenItem(item, index); }); }; return (react_1.default.createElement("div", { className: cx('Quick-launch') }, react_1.default.createElement("div", { className: cx('Quick-launch-header') }, react_1.default.createElement("h3", { className: cx('Quick-launch-header-title') }, title), react_1.default.createElement("div", null, react_1.default.createElement(antd_1.Button, { size: 'small', type: 'link', onClick: function () { return setEditing(!editing); } }, editing ? '保存' : '编辑'))), react_1.default.createElement("div", { className: cx('Quick-launch-body'), ref: bodyRef }, react_1.default.createElement("div", { className: cx('Quick-launch-body-wrapper') }, launchList.map(function (item) { return (react_1.default.createElement("div", { className: cx('Quick-launch-body-wrapper-item'), key: item.launchId, onClick: function () { return handleClick(item); } }, react_1.default.createElement("div", { className: cx('Quick-launch-body-wrapper-item-icon') }, react_1.default.createElement("div", { className: cx('Quick-launch-body-wrapper-item-icon-box') }, item.launchIcon.includes('fa-') ? react_1.default.createElement("i", { className: item.launchIcon }) : react_1.default.createElement("div", { className: 'saas-icon-box' }, react_1.default.createElement(icons_2.Icon, { icon: '#' + item.launchIcon, className: "icon" })))), react_1.default.createElement("div", { className: cx('Quick-launch-body-wrapper-item-name') }, item.launchName), editing && react_1.default.createElement(icons_1.MinusCircleOutlined, { className: cx('Quick-launch-body-wrapper-item-close') }))); }), react_1.default.createElement("div", { className: cx('Quick-launch-body-wrapper-item', 'add-item'), key: 'plus', onClick: function () { return setVisible(true); } }, react_1.default.createElement("div", { className: cx('Quick-launch-body-wrapper-item-icon') }, react_1.default.createElement(icons_2.Icon, { icon: "plus", className: "icon", style: { fontSize: 32 } })), react_1.default.createElement("div", null)), tempNum > 0 ? Array.from({ length: tempNum }, function (_, i) { return (react_1.default.createElement("div", { className: cx('Quick-launch-body-wrapper-item placeholder-item'), style: { height: 0 }, key: i })); }) : null)), visible && !(0, helper_1.isMobile)() && react_1.default.createElement(antd_1.Modal, { open: visible, title: react_1.default.createElement("div", { className: 'dialog-title' }, react_1.default.createElement("div", { className: 'disabled-move-title' }, "\u5FEB\u901F\u53D1\u8D77\u7BA1\u7406")), width: 780, centered: true, className: 'quick-launch-modal common-modal-component', getContainer: function () { return document.getElementById('amis-modal-container') || document.body; }, footer: renderFooter(), onCancel: function () { return setVisible(false); } }, react_1.default.createElement("div", { className: 'quick-launch-modal-body' }, react_1.default.createElement("div", { className: 'quick-launch-modal-body-left' }, react_1.default.createElement("div", { className: 'quick-launch-modal-body-left-title' }, "\u7CFB\u7EDF\u83DC\u5355"), react_1.default.createElement("div", { className: 'quick-launch-modal-body-left-search' }, react_1.default.createElement(antd_1.Input, { placeholder: '\u641C\u7D22\u540D\u79F0', onChange: onSearch, defaultValue: defaultValue.current })), react_1.default.createElement("div", { className: 'quick-launch-modal-body-left-tree' }, react_1.default.createElement(antd_1.Tree, { showIcon: true, expandedKeys: expandedKeys, onExpand: onExpand, selectedKeys: selectedKeys, onSelect: onSelect, treeData: appList }))), react_1.default.createElement("div", { className: 'quick-launch-modal-body-right', ref: pageBodyRef }, renderItem()))), visible && (0, helper_1.isMobile)() && react_1.default.createElement(antd_1.Drawer, { open: visible, width: '100%', onClose: function () { setVisible(false); shouldFetch.current = false; }, getContainer: function () { return document.getElementById('amis-modal-container') || document.body; }, className: "quick-launch-modal" }, react_1.default.createElement("div", { className: 'quick-launch-drawer' }, react_1.default.createElement("div", { className: 'quick-launch-drawer-header' }, react_1.default.createElement("div", { className: 'quick-launch-drawer-header-close', onClick: function () { setVisible(false); shouldFetch.current = false; } }, react_1.default.createElement(icons_2.Icon, { icon: "title-left", style: { width: '16px', height: '16px' } })), react_1.default.createElement("div", { className: 'quick-launch-drawer-header-title' }, title)), react_1.default.createElement("div", { className: 'quick-launch-drawer-body' }, react_1.default.createElement("div", { className: 'quick-launch-drawer-body-top' }, props.render('select', { "clearable": true, "searchable": true, "selectMode": "select", "options": appList.map(function (item) { return ({ value: item.appId, label: item.title }); }), "type": "select", "name": "appName", "label": "应用名称", "size": "sm", value: selectedId }, { vallue: selectedId, onChange: handleChange })), react_1.default.createElement("div", { className: 'quick-launch-drawer-body-top-block' }), react_1.default.createElement("div", { className: 'quick-launch-drawer-header-search' }, react_1.default.createElement(antd_1.Input, { placeholder: '\u641C\u7D22\u540D\u79F0', onChange: onSearch, defaultValue: defaultValue.current })), react_1.default.createElement("div", { className: 'quick-launch-drawer-body-bot' }, react_1.default.createElement("div", { className: 'quick-launch-drawer-body-left' }, react_1.default.createElement("div", { className: 'quick-launch-drawer-body-left-list' }, (_b = (_a = appList.find(function (node) { return node.appId === selectedId; })) === null || _a === void 0 ? void 0 : _a.children) === null || _b === void 0 ? void 0 : _b.map(function (item) { return react_1.default.createElement("div", { key: item.key, className: "quick-launch-drawer-body-left-list-item " + (selectedKeys.includes(item.key) ? 'active-item' : ''), onClick: function () { var _a; setSelectedKeys([item.key]); var dom = (_a = pageBodyRef.current) === null || _a === void 0 ? void 0 : _a.querySelector('#' + item.menuId); if (dom) { dom.scrollIntoView({ behavior: 'smooth', block: 'start' }); } } }, item.title); }))), react_1.default.createElement("div", { className: 'quick-launch-drawer-body-right' }, react_1.default.createElement("div", { className: 'quick-launch-drawer-body-right-content', ref: pageBodyRef }, renderItem()))), react_1.default.createElement("div", { className: 'quick-launch-drawer-body-footer' }, react_1.default.createElement("div", null, "\u5DF2\u9009\u62E9\uFF1A", selectList.length, "\u4E2A\u8282\u70B9"), react_1.default.createElement(antd_1.Button, { type: 'primary', onClick: handleOk }, "\u5B8C\u6210"))))))); }; // 将组件注册到 amis 渲染器中 exports.default = (0, factory_1.Renderer)({ type: 'quick-launch' })(QuickLaunch); //# sourceMappingURL=./renderers/QuickLaunch.js.map