UNPKG

ze-react-component-library

Version:
848 lines (742 loc) 23.4 kB
import "antd/es/space/style"; import _Space from "antd/es/space"; import "antd/es/drawer/style"; import _Drawer from "antd/es/drawer"; import "antd/es/radio/style"; import _Radio from "antd/es/radio"; import "antd/es/spin/style"; import _Spin from "antd/es/spin"; import "antd/es/button/style"; import _Button from "antd/es/button"; import "antd/es/popconfirm/style"; import _Popconfirm from "antd/es/popconfirm"; import "antd/es/message/style"; import _message from "antd/es/message"; var __assign = this && this.__assign || function () { __assign = Object.assign || function (t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } } return t; }; return __assign.apply(this, arguments); }; var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = this && this.__generator || function (thisArg, body) { var _ = { label: 0, sent: function sent() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) { try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; import React, { useState, useRef, useEffect } from "react"; import flatten from "flat"; import { getRoles, createRole, updateRole, deleteRole, getAccounts, createAccount, updateAccount, deleteAccount } from "../request"; import { getSchemas } from "zeroetp-api-sdk"; import { roleColumns, accountColumns } from "./constants"; import { useRequest } from "@umijs/hooks"; import useLocale from "../hooks/useLocale"; import ProTable from "@ant-design/pro-table"; import DefaultQueryHandler from "./DefaultQueryHandler"; import ZESchemaForm from "../ZESchemaForm"; import { getColumnSimpleSearchProps } from "../components/PropertyFilter/FilterComponents"; import { queryToTreeRules, treeRulesToDefaultQuery } from "../ZEUtil/rule.util"; import { usePageMenus } from "../ZEConfigProvider"; var types = [{ label: "角色", value: "role" }, { label: "账号", value: "account" }]; var loopRoles = function loopRoles(arr, source, level, currentRole, filter) { return arr.map(function (d) { var disabled = d.role === currentRole; var children = source.filter(function (a) { return a.parent === d.role; }); var restSource = source.filter(function (a) { return a.parent !== d.role; }); if (d.parent && level === 0) { return null; } if (disabled) { return null; } return { label: d.role, value: d.role, children: loopRoles(children, restSource, level + 1, currentRole, filter) }; }).filter(function (f) { return f && (filter ? filter(f) : true); }); }; var genDefaultQueryHandlerValue = function genDefaultQueryHandlerValue(schemas, editingRecord) { var permissions = {}; if (editingRecord === null || editingRecord === void 0 ? void 0 : editingRecord.resource) { var resources = editingRecord.resource.split("|"); var _loop_1 = function _loop_1(resource) { var _a = resource.split(":"), schema = _a[0], permission = _a[1]; if (schema === "*") { schemas.forEach(function (s) { permissions[s._id] = permission || "w"; }); } else { permissions[schema] = permission || "w"; } }; for (var _i = 0, resources_1 = resources; _i < resources_1.length; _i++) { var resource = resources_1[_i]; _loop_1(resource); } } var defaultQuery = editingRecord ? editingRecord.default_query : {}; var parsedQuery = {}; if (defaultQuery) { Object.keys(defaultQuery).forEach(function (k) { try { parsedQuery[k] = JSON.parse(defaultQuery[k]); } catch (error) { parsedQuery[k] = defaultQuery[k]; } }); } var ret = schemas === null || schemas === void 0 ? void 0 : schemas.map(function (s) { return { _id: s._id, schema: s, permission: permissions[s._id] || "n", rule: parsedQuery[s._id] ? [queryToTreeRules(parsedQuery[s._id])] : [{ id: "0" }] }; }); return ret; }; var ZEAuthEditor = function ZEAuthEditor() { var _a; var t = useLocale().t; var pageMenus = usePageMenus(); var _b = useState(false), drawerVisible = _b[0], setDrawerVisible = _b[1]; var _c = useState(), editingRecord = _c[0], _setEditingRecord = _c[1]; var formRef = useRef(); var _d = useState(false), saveLoading = _d[0], setSaveLoading = _d[1]; var _e = useState("edit"), mode = _e[0], setMode = _e[1]; var _f = useState("role"), type = _f[0], setType = _f[1]; var _g = useState(), accountRole = _g[0], setAccountRole = _g[1]; var typeName = (_a = types.find(function (d) { return d.value === type; })) === null || _a === void 0 ? void 0 : _a.label; var fetches = { getAllData: type === "role" ? getRoles : getAccounts, createData: type === "role" ? createRole : createAccount, updateData: type === "role" ? updateRole : updateAccount, deleteData: type === "role" ? deleteRole : deleteAccount }; var tableRef = useRef(); var getAllData = fetches.getAllData, createData = fetches.createData, updateData = fetches.updateData, deleteData = fetches.deleteData; var _h = useRequest(getRoles, { formatResult: function formatResult(res) { return (res === null || res === void 0 ? void 0 : res.roles) || []; }, manual: true }), _j = _h.data, roles = _j === void 0 ? [] : _j, loadRoles = _h.run; var _k = useRequest(type === "role" ? getAllData : function () { return Promise.resolve(null); }, { formatResult: function formatResult(res) { return (res === null || res === void 0 ? void 0 : res[type === "role" ? "roles" : "accounts"]) || []; }, refreshDeps: [type] }), _l = _k.data, data = _l === void 0 ? [] : _l, fetchData = _k.run, loading = _k.loading; var schemas = useRequest(getSchemas, { formatResult: function formatResult(res) { return (res === null || res === void 0 ? void 0 : res.schemas) || []; } }).data; var getInitialValues = function getInitialValues(record) { if (record === void 0) { record = editingRecord; } var isAdmin = type === "account" && (record === null || record === void 0 ? void 0 : record.role) === "admin"; var permissions = pageMenus === null || pageMenus === void 0 ? void 0 : pageMenus.map(function (_m) { var _a; _m.id = _m.path; var m = (_a = record === null || record === void 0 ? void 0 : record.menu_permissions) === null || _a === void 0 ? void 0 : _a.find(function (f) { return f.path === _m.path; }); if (!m) { m = __assign(__assign({}, _m), { menus: _m.menus.map(function (d) { return d.value; }) }); } var fm = flatten({ permissions: m }, { maxDepth: 2 }); return __assign({ id: m.id, permissions: m }, fm); }); return __assign(__assign({}, record), { permissions: isAdmin ? permissions : [], default_query: genDefaultQueryHandlerValue(schemas, record) }); }; var setEditingRecord = function setEditingRecord(v) { _setEditingRecord(v); setAccountRole(v === null || v === void 0 ? void 0 : v.role); }; var onCancel = function onCancel() { setMode("edit"); setDrawerVisible(false); setEditingRecord(null); }; var onFinish = function onFinish() { return __awaiter(void 0, void 0, void 0, function () { var formData, menu_permissions, promise, query, default_query_1, resources_2, payload; var _a, _b; return __generator(this, function (_c) { setSaveLoading(true); formData = ((_a = formRef.current) === null || _a === void 0 ? void 0 : _a.getFieldsValue()) || {}; menu_permissions = ((_b = formData.permissions) === null || _b === void 0 ? void 0 : _b.map(function (d) { var _a; delete d.id; delete d.permissions; return (_a = flatten.unflatten(d)) === null || _a === void 0 ? void 0 : _a.permissions; })) || []; // 删掉多余字段 if (formData.permissions) { delete formData.permissions; } try { promise = void 0; query = formData.default_query || []; default_query_1 = {}; resources_2 = []; query.forEach(function (d) { if (d.rule instanceof Array) { var schemaQuery = treeRulesToDefaultQuery(d.rule)[0]; if (schemaQuery) { default_query_1[d.schema._id] = schemaQuery; } } resources_2.push(d.schema._id + ":" + d.permission); }); payload = __assign(__assign({}, formData), { default_query: default_query_1, menu_permissions: menu_permissions, resource: resources_2.join("|") }); if (payload.default_query && Object.keys(payload.default_query).length === 0) { delete payload.default_query; } if (editingRecord) { delete payload._id; promise = updateData(editingRecord._id, payload); } else { promise = createData(payload); } promise.then(function () { var _a, _b; _message.success("保存成功"); onCancel(); if (type === "account") { editingRecord ? (_a = tableRef.current) === null || _a === void 0 ? void 0 : _a.reload() : (_b = tableRef.current) === null || _b === void 0 ? void 0 : _b.reloadAndRest(); } else { fetchData(); } }).finally(function () { setSaveLoading(false); }); } catch (error) { console.log(error); } return [2 /*return*/ ]; }); }); }; var onDelete = function onDelete(id) { return __awaiter(void 0, void 0, void 0, function () { var res; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!id) return [3 /*break*/ , 2]; return [4 /*yield*/ , deleteData(id)]; case 1: res = _a.sent(); if (res) { _message.success("删除成功"); fetchData(); } _a.label = 2; case 2: return [2 /*return*/ ]; } }); }); }; var columns = (type === "role" ? roleColumns : accountColumns).map(function (d) { var filterProps = getColumnSimpleSearchProps(d.dataIndex); return __assign(__assign(__assign({}, d), { width: 200, title: t(d.title) }), ["role", "username", "name"].includes(d.dataIndex) ? __assign(__assign({}, filterProps), { filterDropdown: function filterDropdown(args) { var _a; return (_a = filterProps === null || filterProps === void 0 ? void 0 : filterProps.filterDropdown) === null || _a === void 0 ? void 0 : _a.call(filterProps, __assign(__assign({}, args), { t: t })); } }) : {}); }).concat([{ title: t("action"), fixed: "right", width: 140, valueType: "option", render: function render(text, record) { return [/*#__PURE__*/React.createElement("a", { key: "edit", onClick: function onClick() { setMode("edit"); setDrawerVisible(true); setEditingRecord(record); } }, "\u7F16\u8F91"), /*#__PURE__*/React.createElement(_Popconfirm, { title: "\u662F\u5426\u786E\u5B9A\u5220\u9664", key: "delete", onConfirm: function onConfirm() { onDelete(record === null || record === void 0 ? void 0 : record._id); } }, /*#__PURE__*/React.createElement(_Button, { type: "link", danger: true, style: { padding: 0 } }, "\u5220\u9664"))]; } }]); var roleOptions = loopRoles(roles, roles, 0); useEffect(function () { var _a; if (type === "account") { (_a = tableRef.current) === null || _a === void 0 ? void 0 : _a.reloadAndRest(); } }, [type]); useEffect(function () { if (drawerVisible) { loadRoles(); } }, [drawerVisible]); useEffect(function () { var _a, _b; (_a = formRef.current) === null || _a === void 0 ? void 0 : _a.resetFields(); (_b = formRef === null || formRef === void 0 ? void 0 : formRef.current) === null || _b === void 0 ? void 0 : _b.setFieldsValue(getInitialValues()); }, [editingRecord, drawerVisible]); return /*#__PURE__*/React.createElement(_Spin, { spinning: loading }, /*#__PURE__*/React.createElement(ProTable, { key: type, actionRef: tableRef, toolBarRender: function toolBarRender() { return [/*#__PURE__*/React.createElement(_Radio.Group, { key: "type", options: types, onChange: function onChange(e) { setType(e.target.value); setAccountRole(undefined); }, value: type, optionType: "button" }), /*#__PURE__*/React.createElement(_Button, { key: "add", type: "primary", onClick: function onClick() { setMode("edit"); setDrawerVisible(true); setEditingRecord(null); } }, "\u65B0\u5EFA")]; }, rowKey: "_id", headerTitle: /*#__PURE__*/React.createElement(React.Fragment, null, typeName, "\u5217\u8868"), dataSource: type === "account" ? undefined : data, request: type === "account" ? function (params, sort, _filter) { return __awaiter(void 0, void 0, void 0, function () { var filter; return __generator(this, function (_a) { switch (_a.label) { case 0: filter = {}; Object.entries(_filter).map(function (_a) { var k = _a[0], v = _a[1]; if (v) { filter[k] = v; } }); return [4 /*yield*/ , fetches.getAllData(__assign(__assign({}, params), filter))]; case 1: return [2 /*return*/ , _a.sent()]; } }); }); } : undefined, columns: columns, search: false, options: false, scroll: { x: columns.reduce(function (p, c) { return p + c.width; }, 0) }, pagination: type === "account" ? { pageSize: 10 } : false }), /*#__PURE__*/React.createElement(_Drawer, { open: drawerVisible, width: 600, maskClosable: mode === "edit" ? false : true, onClose: onCancel, title: editingRecord ? "\u66F4\u65B0" + typeName : "\u65B0\u589E" + typeName, footer: mode === "edit" ? /*#__PURE__*/React.createElement("div", { style: { display: "flex", flexDirection: "row-reverse" } }, /*#__PURE__*/React.createElement(_Space, null, /*#__PURE__*/React.createElement(_Button, { onClick: onCancel }, "\u53D6\u6D88"), /*#__PURE__*/React.createElement(_Button, { type: "primary", onClick: function onClick() { var _a; (_a = formRef === null || formRef === void 0 ? void 0 : formRef.current) === null || _a === void 0 ? void 0 : _a.submit(); }, loading: saveLoading }, "\u786E\u5B9A"))) : false }, type === "role" ? /*#__PURE__*/React.createElement(ZESchemaForm, { schemaID: "role", formRef: formRef, columns: roleColumns.map(function (d) { if (d === null || d === void 0 ? void 0 : d.title) { d.title = t(d.title); } if (d.dataIndex === "role" && editingRecord) { return __assign(__assign({}, d), { readonly: true }); } if (d.dataIndex === "parent") { return __assign(__assign({}, d), { fieldProps: function fieldProps(form, config) { var currentRole = form.getFieldValue("role"); return { options: loopRoles(roles, roles, 0, currentRole, function (f) { return (f === null || f === void 0 ? void 0 : f.value) !== "admin"; }), treeDefaultExpandAll: true }; } }); } if (d.dataIndex === "default_query") { return __assign(__assign({}, d), { renderFormItem: function renderFormItem(_dom, config) { return /*#__PURE__*/React.createElement(DefaultQueryHandler, __assign({}, config, { type: "role" })); } }); } return d; }), isKeyPressSubmit: false, schema: { _id: "role", type: "entity", name: "角色", properties: [{ name: "role", primal_type: "string", type: "string", constraints: { required: true } }] }, submitter: false, onFinish: onFinish }) : /*#__PURE__*/React.createElement(ZESchemaForm, { schemaID: "account", formRef: formRef, initialValues: getInitialValues(), columns: accountColumns.map(function (d) { if (d === null || d === void 0 ? void 0 : d.title) { d.title = t(d.title); } if (d.dataIndex === "username" && editingRecord) { return __assign(__assign({}, d), { readonly: true }); } if (d.dataIndex === "role") { return __assign(__assign({}, d), { fieldProps: { options: roleOptions, treeDefaultExpandAll: true, onChange: function onChange(v) { var _a; setAccountRole(v); // 重置permissions (_a = formRef === null || formRef === void 0 ? void 0 : formRef.current) === null || _a === void 0 ? void 0 : _a.setFieldsValue({ permissions: getInitialValues({ role: v }).permissions }); } } }); } if (d.dataIndex === "default_query") { return __assign(__assign({}, d), { renderFormItem: function renderFormItem(_dom, config) { return /*#__PURE__*/React.createElement(DefaultQueryHandler, __assign({}, config, { type: "account" })); } }); } if (d.dataIndex === "permissions") { return __assign(__assign({}, d), { valueType: "table", hideInForm: accountRole !== "admin", fieldProps: { recordCreatorProps: { style: { display: "none" } } }, columns: [{ dataIndex: "permissions.page", title: "页面名称", editable: false, width: 120 }, { dataIndex: "permissions.path", title: "页面路径", editable: false, width: 120 }, { dataIndex: "permissions.menus", title: "显示菜单", valueType: "checkboxGroup", fieldProps: function fieldProps(_, _a) { var _b; var entity = _a.entity; var path = entity["permissions.path"]; return { options: (_b = pageMenus === null || pageMenus === void 0 ? void 0 : pageMenus.find(function (d) { return d.path === path; })) === null || _b === void 0 ? void 0 : _b.menus }; } }] }); } return d; }), isKeyPressSubmit: false, schema: { _id: "account", type: "entity", name: "账号", properties: [{ name: "username", primal_type: "string", type: "string", constraints: { required: true } }, { name: "name", primal_type: "string", type: "string", constraints: { required: true } }, { name: "password", primal_type: "string", type: "string", constraints: { required: editingRecord ? false : true } }, { name: "role", primal_type: "string", type: "string", constraints: { required: true } }] }, submitter: false, onFinish: onFinish }))); }; export default ZEAuthEditor;