Unverified Commit 09a64ad8 authored by zhu-mingye's avatar zhu-mingye Committed by GitHub

[Feature][web] Realize the internationalization of the authentication center (#1098)

* AuthenticationCenter internationalization(us)

* AuthenticationCenter internationalization(zh)
parent 89153c7c
......@@ -22,4 +22,26 @@ export default {
'button.close': 'Close',
'button.confirm': 'Confirm',
'button.cancel': 'Cancel',
'button.finish': 'Finish',
'button.save': 'Save',
'button.delete': 'Delete',
'button.batchDelete': 'Batch Delete',
'button.batchEnable': 'Batch Enable',
'button.batchDisable': 'Batch Disable',
'button.more': 'More',
'button.config': 'Config',
'button.edit': 'Edit',
'button.assignUser': 'Assign Users',
'button.assignRole': 'Assign Role',
'button.changePassword': 'Change Password',
'button.enable': 'Enable',
'button.disable': 'Disable',
'tips.selected': 'Selected',
'tips.notSelected': 'Not Select',
'tips.item': 'Item',
'status.enabled': 'Enabled',
'status.disabled': 'Disabled',
};
......@@ -60,17 +60,21 @@ export default {
'menu.exception.server-error': '500',
'menu.exception.trigger': 'Trigger',
'menu.account': 'Account',
'menu.account.center': 'Account Center',
'menu.account.settings': 'Account Settings',
'menu.account.trigger': 'Trigger Error',
'menu.account.logout': 'Logout',
'menu.account.checkTenant': 'Check Tenant',
'menu.account.changePassword': 'Change Password',
'menu.editor': 'Graphic Editor',
'menu.editor.flow': 'Flow Editor',
'menu.editor.mind': 'Mind Editor',
'menu.editor.koni': 'Koni Editor',
// ------------------------------------------------------------------------------
'menu.account.center': 'Account Center',
'menu.account.settings': 'Account Settings',
'menu.account.changePassword': 'Change Password',
'menu.account.checkTenant': 'Check Tenant',
'menu.account.logout': 'Logout',
'menu.datastudio': 'Data Studio',
'menu.devops': 'Devops',
......
......@@ -69,82 +69,143 @@ export default {
'pages.searchTable.batchDeletion': 'Bacth Deletion',
'pages.searchTable.batchApproval': 'Batch Approval',
'pages.devops.jobstatus.CREATED' : 'Created',
'pages.devops.jobstatus.INITIALIZING' : 'Initialize',
'pages.devops.jobstatus.RUNNING' : 'Running',
'pages.devops.jobstatus.FINISHED' : 'Finished',
'pages.devops.jobstatus.FAILING' : 'Abnormal',
'pages.devops.jobstatus.FAILED' : 'Failed',
'pages.devops.jobstatus.SUSPENDED' : 'Paused',
'pages.devops.jobstatus.CANCELLING' : 'Canceling',
'pages.devops.jobstatus.CANCELED' : 'Canceled',
'pages.devops.jobstatus.RESTARTING' : 'Restarting',
'pages.devops.jobstatus.UNKNOWN' : 'Unknown',
'pages.devops.LastUpdateTime' : 'LastUpdateTime',
'pages.settings.UserManagement' : 'User Management',
'pages.settings.Flink' : 'Flink Setting',
'pages.settings.FlinkURL' : 'Submit the Jar file path to FlinkSQL',
'pages.settings.FlinkSQLJarMainParameter' : 'Submit The Main Class entry To the Jar For FlinkSQL',
'pages.settings.FlinkSQLJarMainClass' : 'The Main Class Of The Jar That Submitted FlinkSQL',
'pages.settings.FlinkRestAPI' : 'Using Rest API',
'pages.settings.FlinkURLSplit' : 'FlinkSQL Statement Separator',
'pages.settings.FlinkSQLLogic' : 'Calculate Consanguinity Using A Logical Plan',
'pages.settings.FlinkJobID' : 'Maximum Waiting Time For Getting A Job ID (seconds)',
'pages.settings.FlinkNoSetting' : 'Not Setting',
'pages.settings.FlinkNoUseSetting' : 'After The Flink Task Is Enabled, Operations Such As Savepoint And Stop Are Performed Through The RestAPI Of JobManager',
'pages.settings.FlinkLogic' : 'Whether The Calculation Of Field Consanguinity Analysis For Flink Tasks Is Based On A Logical Plan Is Supported Only In Version 1.14',
'pages.settings.FlinkUpdate' : 'Update',
'pages.settings.FlinkSave' : 'Save',
'pages.settings.FlinkCancel' : 'Cancel',
'pages.settings.FlinkUse' : 'In Use',
'pages.settings.FlinkNotUse' : 'Not Use',
'pages.user.UserEdit' : 'Edit',
'pages.user.UserDelete' : 'Delete',
'pages.user.UserChangePassword' : 'Update Password',
'pages.user.UserConfig' : 'Config',
'pages.user.UserMore' : 'More',
'pages.user.UserCreate' : 'Create',
'pages.user.UserManger' : 'User Management',
'pages.user.UserName' : 'User Name',//用户名
'pages.user.UserJobNumber' : 'Job Number',//工号
'pages.user.UserPhoneNumber' : 'Phone Number',//手机号
'pages.user.UserNickName' : 'Nick Name',//昵称
'pages.user.UserIsUse' : 'Is Use',//是否启用
'pages.user.UserUpdateTime' : 'Update Time',//最近更新时间
'pages.user.UserOperate' : 'Operate',//操作
'pages.user.UserInUse' : 'In Use',//已启用
'pages.user.UserNotUse' : 'Not Use',//已禁用
'pages.user.UserCreateTime' : 'Create Time',//创建时间
'pages.user.UserComplete' : 'Complete',
'pages.user.UserConfirm' : 'Confirm',
'pages.user.UserCancel' : 'Cancel',
'pages.user.UserDeleteUser' : 'Delete User',
'pages.user.UserCreateUser' : 'Create User',
'pages.user.UserUpdateUser' : 'Update User',
'pages.user.UserEnterUserName' : 'Please enter user name',
'pages.user.UserEnterUniqueUserName' : 'Please enter unique user name',
'pages.user.UserEnterJobNumber' : 'Please enter job number',
'pages.user.UserEnterNickName' : 'Please enter nickname',
'pages.user.UserEnterPhoneNumber' : 'Please enter phone number',
'pages.user.UserOldPassword' : 'Old Password',
'pages.user.UserNewPassword' : 'New Password',
'pages.user.UserRepeatNewPassword' : 'Repeat New Password',
'pages.user.UserEnterOldPassword' : 'Please enter old password',
'pages.user.UserEnterNewPassword' : 'Please enter new password',
'pages.user.UserEnterRepeatNewPassword' : 'Please enter repeat new password',
'pages.user.UserNewPasswordNotMatch' : 'The new passwords do not match',
'pages.user.UserUpdatePassword' : 'Update Password',
'pages.regist.openAPI' : 'openAPI Document',
'pages.regist.BusinessComponent' : 'Business Component Document',
'pages.operate': 'Operation', // all table list of operation columns is use this item
'pages.devops.jobstatus.CREATED': 'Created',
'pages.devops.jobstatus.INITIALIZING': 'Initialize',
'pages.devops.jobstatus.RUNNING': 'Running',
'pages.devops.jobstatus.FINISHED': 'Finished',
'pages.devops.jobstatus.FAILING': 'Abnormal',
'pages.devops.jobstatus.FAILED': 'Failed',
'pages.devops.jobstatus.SUSPENDED': 'Paused',
'pages.devops.jobstatus.CANCELLING': 'Canceling',
'pages.devops.jobstatus.CANCELED': 'Canceled',
'pages.devops.jobstatus.RESTARTING': 'Restarting',
'pages.devops.jobstatus.UNKNOWN': 'Unknown',
'pages.devops.LastUpdateTime': 'LastUpdateTime',
'pages.settings.UserManagement': 'User Management',
'pages.settings.Flink': 'Flink Setting',
'pages.settings.FlinkURL': 'Submit the Jar file path to FlinkSQL',
'pages.settings.FlinkSQLJarMainParameter': 'Submit The Main Class entry To the Jar For FlinkSQL',
'pages.settings.FlinkSQLJarMainClass': 'The Main Class Of The Jar That Submitted FlinkSQL',
'pages.settings.FlinkRestAPI': 'Using Rest API',
'pages.settings.FlinkURLSplit': 'FlinkSQL Statement Separator',
'pages.settings.FlinkSQLLogic': 'Calculate Consanguinity Using A Logical Plan',
'pages.settings.FlinkJobID': 'Maximum Waiting Time For Getting A Job ID (seconds)',
'pages.settings.FlinkNoSetting': 'Not Setting',
'pages.settings.FlinkNoUseSetting': 'After The Flink Task Is Enabled, Operations Such As Savepoint And Stop Are Performed Through The RestAPI Of JobManager',
'pages.settings.FlinkLogic': 'Whether The Calculation Of Field Consanguinity Analysis For Flink Tasks Is Based On A Logical Plan Is Supported Only In Version 1.14',
'pages.settings.FlinkUpdate': 'Update',
'pages.settings.FlinkSave': 'Save',
'pages.settings.FlinkCancel': 'Cancel',
'pages.settings.FlinkUse': 'In Use',
'pages.settings.FlinkNotUse': 'Not Use',
'pages.user.UserManger': 'User Management',
'pages.user.UserName': 'User Name',//用户名
'pages.user.UserJobNumber': 'Job Number',//工号
'pages.user.UserPhoneNumber': 'Phone Number',//手机号
'pages.user.UserNickName': 'Nick Name',//昵称
'pages.user.UserIsUse': 'Is Enable',//是否启用
'pages.user.UserUpdateTime': 'Update Time',//最近更新时间
'pages.user.UserCreateTime': 'Create Time',//创建时间
'pages.user.UserDeleteUser': 'Delete User',
'pages.user.UserCreateUser': 'Create User',
'pages.user.UserUpdateUser': 'Update User',
'pages.user.AssignRole': 'Assign Role',
'pages.user.delete': 'Delete User',
'pages.user.deleteConfirm': 'Are you sure you want to delete this User?',
'pages.user.enable': 'Enable User',
'pages.user.enableConfirm': 'Are you sure you want to enable this User?',
'pages.user.disable': 'Disable User',
'pages.user.disableConfirm': 'Are you sure you want to disable this User?',
'pages.user.UserEnterUserName': 'Please enter user name',
'pages.user.UserEnterUniqueUserName': 'Please enter unique user name',
'pages.user.UserEnterJobNumber': 'Please enter job number',
'pages.user.UserEnterNickName': 'Please enter nickname',
'pages.user.UserEnterPhoneNumber': 'Please enter phone number',
'pages.user.UserOldPassword': 'Old Password',
'pages.user.UserNewPassword': 'New Password',
'pages.user.UserRepeatNewPassword': 'Repeat New Password',
'pages.user.UserEnterOldPassword': 'Please enter old password',
'pages.user.UserEnterNewPassword': 'Please enter new password',
'pages.user.UserEnterRepeatNewPassword': 'Please enter repeat new password',
'pages.user.UserNewPasswordNotMatch': 'The new passwords do not match',
'pages.user.disableTotalOf': 'Total Of ',
'pages.user.selectDisable': 'User Is Disabled ',
'pages.tenant.TenantManager': 'Tenant Management',
'pages.tenant.TenantCode': 'Tenant Code',
'pages.tenant.Note': 'Note',
'pages.tenant.CreateTime': 'Create Time',
'pages.tenant.UpdateTime': 'Update Time',
'pages.tenant.AssignUser': 'Assign Users',
'pages.tenant.assignUser.pleaseHolder': 'Please enter username/nickname Search',
'pages.tenant.create': 'Create Tenant',
'pages.tenant.update': 'Update Tenant',
'pages.tenant.EnterTenantCode': 'Please enter Tenant Code!',
'pages.tenant.EnterTenantNote': 'Please enter Tenant Note!',
'pages.tenant.delete': 'Delete Tenant',
'pages.tenant.deleteConfirm': 'Are you sure you want to delete this Tenant?',
'pages.tenant.enable': 'Enable Tenant',
'pages.tenant.enableConfirm': 'Are you sure you want to enable this Tenant?',
'pages.tenant.disable': 'Disable Tenant',
'pages.tenant.disableConfirm': 'Are you sure you want to disable this Tenant?',
'pages.nameSpace.NameSpaceManagement': 'NameSpace Management',
'pages.nameSpace.NameSpaceCode': 'NameSpace Code',
'pages.nameSpace.belongTenant': 'Belong Tenant',
'pages.nameSpace.enable': 'Is Enable',
'pages.nameSpace.note': 'Note',
'pages.nameSpace.createTime': 'Create Time',
'pages.nameSpace.updateTime': 'Update Time',
'pages.nameSpace.deleteNameSpace': 'Delete NameSpace',
'pages.nameSpace.deleteNameSpaceConfirm': 'Are you sure you want to delete this NameSpace?',
'pages.nameSpace.enableNameSpace': 'Enable NameSpace',
'pages.nameSpace.enableNameSpaceConfirm': 'Are you sure you want to enable this NameSpace?',
'pages.nameSpace.disableNameSpace': 'Disable NameSpace',
'pages.nameSpace.disableNameSpaceConfirm': 'Are you sure you want to disable this NameSpace?',
'pages.nameSpace.create': 'Create NameSpace',
'pages.nameSpace.update': 'Update NameSpace',
'pages.nameSpace.EnterNameSpaceCode': 'Please enter NameSpace Code!',
'pages.nameSpace.EnterNameSpaceNote': 'Please enter NameSpace Note!',
'pages.nameSpace.disableTotalOf': 'Total Of ',
'pages.nameSpace.selectDisable': 'Namespace Is Disabled ',
'pages.role.roleManagement': 'Role Management',
'pages.role.roleCode': 'Role Code',
'pages.role.roleName': 'Role Name',
'pages.role.namespaceIds': 'Namespace',
'pages.role.note': 'Note',
'pages.role.belongTenant': 'Belong Tenant',
'pages.role.createTime': 'Create Time',
'pages.role.updateTime': 'Update Time',
'pages.role.create': 'Create Role',
'pages.role.update': 'Update Role',
'pages.role.EnterRoleCode': 'Please enter Role Code!',
'pages.role.EnterRoleName': 'Please enter Role Name!',
'pages.role.selectNameSpace': 'Please select NameSpace!',
'pages.role.EnterNote': 'Please enter Role Note!',
'pages.role.delete': 'Delete Role',
'pages.role.deleteConfirm': 'Are you sure you want to delete this Role?',
'pages.role.enable': 'Enable Role',
'pages.role.enableConfirm': 'Are you sure you want to enable this Role?',
'pages.role.disable': 'Disable Role',
'pages.role.disableConfirm': 'Are you sure you want to disable this Role?',
'pages.regist.openAPI': 'openAPI Document',
'pages.regist.BusinessComponent': 'Business Component Document',
'pages.matedata.NoDatabaseSelected' : 'No database selected',
'pages.matedata.Application' : 'Application',
......
......@@ -22,4 +22,27 @@ export default {
'button.close': '关闭',
'button.confirm': '确定',
'button.cancel': '取消',
'button.finish': '完成',
'button.save': '保存',
'button.delete': '删除',
'button.batchDelete': '批量删除',
'button.batchEnable': '批量启用',
'button.batchDisable': '批量禁用',
'button.more': '更多',
'button.config': '配置',
'button.edit': '编辑',
'button.assignUser': '分配用户',
'button.assignRole': '分配角色',
'button.changePassword': '修改密码',
'button.enable': '启用',
'button.disable': '禁用',
'tips.selected': '已选择',
'tips.notSelected': '未选',
'tips.item': '项',
'status.enabled': '已启用',
'status.disabled': '已禁用',
};
......@@ -60,12 +60,7 @@ export default {
'menu.exception.server-error': '500',
'menu.exception.trigger': '触发错误',
'menu.account': '个人页',
'menu.account.center': '个人中心',
'menu.account.settings': '个人设置',
'menu.account.trigger': '触发报错',
'menu.account.logout': '退出登录',
'menu.account.changePassword': '修改密码',
'menu.account.checkTenant': '切换租户',
'menu.editor': '图形编辑器',
'menu.editor.flow': '流程编辑器',
'menu.editor.mind': '脑图编辑器',
......@@ -77,6 +72,14 @@ export default {
'menu.dev.ant-design.docs': '官方文档',
'menu.dev.ant-design.preview': '官方预览',
// ------------------------------------------------------------------------------
'menu.account.center': '个人中心',
'menu.account.settings': '个人设置',
'menu.account.changePassword': '修改密码',
'menu.account.checkTenant': '切换租户',
'menu.account.logout': '退出登录',
'menu.datastudio': '数据开发',
......
......@@ -88,4 +88,142 @@ export default {
'pages.searchTable.tenThousand': '万',
'pages.searchTable.batchDeletion': '批量删除',
'pages.searchTable.batchApproval': '批量审批',
// ------------------------------------------------------------------------------
'pages.operate': '操作', // all table list of operation columns is use this item
'pages.devops.jobstatus.CREATED': '已创建',
'pages.devops.jobstatus.INITIALIZING': '初始化中',
'pages.devops.jobstatus.RUNNING': '运行中',
'pages.devops.jobstatus.FINISHED': '已完成',
'pages.devops.jobstatus.FAILING': '异常中',
'pages.devops.jobstatus.FAILED': '已失败',
'pages.devops.jobstatus.SUSPENDED': '已暂停',
'pages.devops.jobstatus.CANCELLING': '取消中',
'pages.devops.jobstatus.CANCELED': '已取消',
'pages.devops.jobstatus.RESTARTING': '重启中',
'pages.devops.jobstatus.UNKNOWN': '未知',
'pages.devops.LastUpdateTime': '最后更新时间',
'pages.settings.UserManagement': '用户管理',
'pages.settings.Flink': 'Flink 设置',
'pages.settings.FlinkURL': '提交 Jar 文件路径到 FlinkSQL',
'pages.settings.FlinkSQLJarMainParameter': '将主类条目提交到 FlinkSQL 的 Jar',
'pages.settings.FlinkSQLJarMainClass': '提交FlinkSQL的Jar主类',
'pages.settings.FlinkRestAPI': '使用 Rest API',
'pages.settings.FlinkURLSplit': 'FlinkSQL 语句分隔符',
'pages.settings.FlinkSQLLogic': '使用逻辑计划计算血缘关系',
'pages.settings.FlinkJobID': '获取作业 ID 的最长等待时间(秒)',
'pages.settings.FlinkNoSetting': '未设置',
'pages.settings.FlinkNoUseSetting': 'Flink任务开启后,通过 JobManager 的 RestAPI 进行 Savepoint、Stop等操作',
'pages.settings.FlinkLogic': 'Flink 任务的字段血缘分析计算是否基于逻辑计划 , 仅在 1.14 版本中支持',
'pages.settings.FlinkUpdate': '修改',
'pages.settings.FlinkSave': '保存',
'pages.settings.FlinkCancel': '返回',
'pages.settings.FlinkUse': '启用',
'pages.settings.FlinkNotUse': '禁用',
'pages.user.UserManger': '用户管理',
'pages.user.UserName': '用户名',//用户名
'pages.user.UserJobNumber': '工号',//工号
'pages.user.UserPhoneNumber': '手机号',//手机号
'pages.user.UserNickName': '昵称',//昵称
'pages.user.UserIsUse': '是否启用',//是否启用
'pages.user.UserUpdateTime': '最近更新时间',//最近更新时间
'pages.user.UserCreateTime': '创建时间',//创建时间
'pages.user.UserDeleteUser': '删除用户',
'pages.user.UserCreateUser': '添加用户',
'pages.user.UserUpdateUser': '修改用户',
'pages.user.AssignRole': '分配角色',
'pages.user.delete': '删除用户',
'pages.user.deleteConfirm': '您确定要删除此用户吗?',
'pages.user.enable': '启用用户',
'pages.user.enableConfirm': '您确定要启用此用户吗?',
'pages.user.disable': '禁用用户',
'pages.user.disableConfirm': '您确定要禁用此用户吗?',
'pages.user.UserEnterUserName': '请输入用户名',
'pages.user.UserEnterUniqueUserName': '请输入唯一的用户名',
'pages.user.UserEnterJobNumber': '请输入工号',
'pages.user.UserEnterNickName': '请输入昵称',
'pages.user.UserEnterPhoneNumber': '请输入手机号',
'pages.user.UserOldPassword': '旧密码',
'pages.user.UserNewPassword': '新密码',
'pages.user.UserRepeatNewPassword': '重复新密码',
'pages.user.UserEnterOldPassword': '请输入旧密码',
'pages.user.UserEnterNewPassword': '请输入新密码',
'pages.user.UserEnterRepeatNewPassword': '请重复输入新密码',
'pages.user.UserNewPasswordNotMatch': '两次输入的新密码不一致',
'pages.user.disableTotalOf': '被禁用的用户共 ',
'pages.user.selectDisable': ' 个',
'pages.tenant.TenantManager': '租户管理',
'pages.tenant.TenantCode': '租户编码',
'pages.tenant.Note': '备注/描述',
'pages.tenant.CreateTime': '创建时间',
'pages.tenant.UpdateTime': '最后更新时间',
'pages.tenant.AssignUser': '分配用户',
'pages.tenant.create': '创建租户',
'pages.tenant.update': '修改租户',
'pages.tenant.EnterTenantCode': '请输入租户编码!',
'pages.tenant.EnterTenantNote': '请输入租户备注/描述信息!',
'pages.tenant.delete': '删除租户',
'pages.tenant.deleteConfirm': '您确定要删除此租户吗?',
'pages.tenant.enable': '启用租户',
'pages.tenant.enableConfirm': '您确定要启用此租户吗?',
'pages.tenant.disable': '禁用租户',
'pages.tenant.disableConfirm': '您确定要禁用此租户吗?',
'pages.nameSpace.NameSpaceManagement': '命名空间管理',
'pages.nameSpace.NameSpaceCode': '命名空间编码',
'pages.nameSpace.belongTenant': '所属租户',
'pages.nameSpace.enable': '是否启用',
'pages.nameSpace.note': '备注/描述',
'pages.nameSpace.createTime': '创建时间',
'pages.nameSpace.updateTime': '最后更新时间',
'pages.nameSpace.deleteNameSpace': '删除命名空间',
'pages.nameSpace.deleteNameSpaceConfirm': '您确定要删除此命名空间吗?',
'pages.nameSpace.enableNameSpace': '启用命名空间',
'pages.nameSpace.enableNameSpaceConfirm': '您确定要启用此命名空间吗?',
'pages.nameSpace.disableNameSpace': '禁用命名空间',
'pages.nameSpace.disableNameSpaceConfirm': '您确定要禁用此命名空间吗?',
'pages.nameSpace.create': '创建命名空间',
'pages.nameSpace.update': '修改命名空间',
'pages.nameSpace.EnterNameSpaceCode': '请输入命名空间编码!',
'pages.nameSpace.EnterNameSpaceNote': '请输入命名空间的备注/描述信息!',
'pages.nameSpace.disableTotalOf': '被禁用的命名空间共 ',
'pages.nameSpace.selectDisable': '个',
'pages.role.roleManagement': '角色管理',
'pages.role.roleCode': '角色编码',
'pages.role.roleName': '角色名称',
'pages.role.namespaceIds': '命名空间',
'pages.role.note': '备注/描述',
'pages.role.belongTenant': '所属租户',
'pages.role.createTime': '创建时间',
'pages.role.updateTime': '最后更新时间',
'pages.role.create': '创建角色',
'pages.role.update': '修改角色',
'pages.role.EnterRoleCode': '请输入角色编码!',
'pages.role.EnterRoleName': '请输入角色名称!',
'pages.role.selectNameSpace': '请选择命名空间!',
'pages.role.EnterNote': '请输入角色的备注/描述信息!',
'pages.role.delete': '删除角色',
'pages.role.deleteConfirm': '您确定要删除此角色吗?',
'pages.role.enable': '启用角色',
'pages.role.enableConfirm': '您确定要启用此角色吗?',
'pages.role.disable': '禁用角色',
'pages.role.disableConfirm': '您确定要禁用此角色吗?',
'pages.regist.openAPI': 'OpenAPI 文档',
'pages.regist.BusinessComponent': '业务组件文档',
};
......@@ -22,6 +22,7 @@ import React, {useState} from 'react';
import {Button, Form, Input, Modal, Switch} from 'antd';
import {NameSpaceTableListItem} from "@/pages/AuthenticationCenter/data.d";
import {getStorageTenantId} from "@/components/Common/crud";
import {useIntl} from "@@/plugin-locale/localeExports";
export type TenantFormProps = {
onCancel: (flag?: boolean) => void;
......@@ -37,6 +38,9 @@ const formLayout = {
const NameSpaceForm: React.FC<TenantFormProps> = (props) => {
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const [form] = Form.useForm();
const [formVals, setFormVals] = useState<Partial<NameSpaceTableListItem>>({
id: props.values?.id,
......@@ -57,8 +61,8 @@ const NameSpaceForm: React.FC<TenantFormProps> = (props) => {
const submitForm = async () => {
const fieldsValue = await form.validateFields();
fieldsValue.id = formVals.id;
setFormVals({...formVals,...fieldsValue});
handleSubmit({...formVals,...fieldsValue});
setFormVals({...formVals, ...fieldsValue});
handleSubmit({...formVals, ...fieldsValue});
};
const renderContent = (formValsPara: Partial<NameSpaceTableListItem>) => {
......@@ -66,28 +70,28 @@ const NameSpaceForm: React.FC<TenantFormProps> = (props) => {
<>
<Form.Item
name="namespaceCode"
label="命名空间编号"
rules={[{required: true, message: '请输入命名空间唯一编码!'}]}>
<Input placeholder="请输入命名空间唯一编码"/>
label={l('pages.nameSpace.NameSpaceCode')}
rules={[{required: true, message: l('pages.nameSpace.EnterNameSpaceCode')}]}>
<Input placeholder={l('pages.nameSpace.EnterNameSpaceCode')}/>
</Form.Item>
<Form.Item
hidden={true}
name="tenantId"
label="所属租户"
>
label={l('pages.nameSpace.belongTenant')}
>
<Input disabled defaultValue={getStorageTenantId()}/>
</Form.Item>
<Form.Item
name="note"
label="注释"
label={l('pages.nameSpace.note')}
>
<Input.TextArea placeholder="请输入描述信息" allowClear
<Input.TextArea placeholder={l('pages.nameSpace.EnterNameSpaceNote')} allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item>
<Form.Item
name="enabled"
label="是否启用">
<Switch checkedChildren="启用" unCheckedChildren="禁用"
label={l('pages.nameSpace.enable')}>
<Switch checkedChildren={l('status.enabled')} unCheckedChildren={l('status.disabled')}
defaultChecked={formValsPara.enabled}/>
</Form.Item>
</>
......@@ -97,9 +101,9 @@ const NameSpaceForm: React.FC<TenantFormProps> = (props) => {
const renderFooter = () => {
return (
<>
<Button onClick={() => handleModalVisible(false)}>取消</Button>
<Button onClick={() => handleModalVisible(false)}> {l('button.cancel')}</Button>
<Button type="primary" onClick={() => submitForm()}>
完成
{l('button.finish')}
</Button>
</>
);
......@@ -110,7 +114,7 @@ const NameSpaceForm: React.FC<TenantFormProps> = (props) => {
width={640}
bodyStyle={{padding: '32px 40px 48px'}}
destroyOnClose
title={formVals.id ? "修改命名空间" : "创建命名空间"}
title={formVals.id ? l('pages.nameSpace.update') : l('pages.nameSpace.create')}
visible={modalVisible}
footer={renderFooter()}
onCancel={() => handleModalVisible()}
......
......@@ -27,6 +27,7 @@ import ProDescriptions from '@ant-design/pro-descriptions';
import {handleAddOrUpdate, handleRemove, queryData, updateEnabled} from "@/components/Common/crud";
import {NameSpaceTableListItem} from "@/pages/AuthenticationCenter/data.d";
import NameSpaceForm from "@/pages/AuthenticationCenter/NamespaceManager/components/NameSpaceForm";
import {useIntl} from "@@/plugin-locale/localeExports";
const url = '/api/namespace';
......@@ -38,16 +39,19 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
const actionRef = useRef<ActionType>();
const [selectedRowsState, setSelectedRows] = useState<NameSpaceTableListItem[]>([]);
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const editAndDelete = (key: string | number, currentItem: NameSpaceTableListItem) => {
if (key === 'edit') {
handleUpdateModalVisible(true);
setFormValues(currentItem);
} else if (key === 'delete') {
Modal.confirm({
title: '删除命名空间',
content: '确定删除该命名空间吗?',
okText: '确认',
cancelText: '取消',
title: l('pages.nameSpace.deleteNameSpace', '默认'),
content: l('pages.nameSpace.deleteNameSpaceConfirm'),
okText: l('button.confirm'),
cancelText: l('button.cancel'),
onOk: async () => {
await handleRemove(url, [currentItem]);
actionRef.current?.reloadAndRest?.();
......@@ -62,13 +66,13 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
<Dropdown
overlay={
<Menu onClick={({key}) => editAndDelete(key, item)}>
<Menu.Item key="edit">编辑</Menu.Item>
<Menu.Item key="delete">删除</Menu.Item>
<Menu.Item key="edit">{l('button.edit')}</Menu.Item>
<Menu.Item key="delete">{l('button.delete')}</Menu.Item>
</Menu>
}
>
<a>
更多 <DownOutlined/>
{l('button.more')} <DownOutlined/>
</a>
</Dropdown>
);
......@@ -85,60 +89,60 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
},
},
{
title: '命名空间编码',
title: l('pages.nameSpace.NameSpaceCode'),
dataIndex: 'namespaceCode',
render: (dom, entity) => {
return <a onClick={() => setRow(entity)}>{dom}</a>;
},
},
{
title: '所属租户',
title: l('pages.nameSpace.belongTenant'),
hideInSearch: true,
render: (dom, entity) => {
return entity.tenant.tenantCode;
},
},
{
title: '是否启用',
title: l('pages.nameSpace.enable'),
dataIndex: 'enabled',
hideInTable: false,
hideInSearch: true,
filters: [
{
text: '已启用',
text: l('status.enabled'),
value: 1,
},
{
text: '未启用',
text: l('status.disabled'),
value: 0,
},
],
filterMultiple: false,
valueEnum: {
true: {text: '已启用', status: 'Success'},
false: {text: '未启用', status: 'Error'},
true: {text: l('status.enabled'), status: 'Success'},
false: {text: l('status.disabled'), status: 'Error'},
},
},
{
title: '备注',
title: l('pages.nameSpace.note'),
dataIndex: 'note',
hideInSearch: true,
ellipsis: true,
},
{
title: '创建时间',
title: l('pages.nameSpace.createTime'),
dataIndex: 'createTime',
sorter: true,
valueType: 'dateTime',
},
{
title: '最近更新时间',
title: l('pages.nameSpace.updateTime'),
dataIndex: 'updateTime',
sorter: true,
valueType: 'dateTime',
},
{
title: '操作',
title: l('pages.operate'),
dataIndex: 'option',
valueType: 'option',
render: (_, record) => [
......@@ -148,7 +152,7 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
setFormValues(record);
}}
>
配置
{l('button.config')}
</a>,
<MoreBtn key="more" item={record}/>,
],
......@@ -156,9 +160,9 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
];
return (
<PageContainer>
<PageContainer title={false}>
<ProTable<NameSpaceTableListItem>
headerTitle="命名空间管理"
headerTitle={l('pages.nameSpace.NameSpaceManagement')}
actionRef={actionRef}
rowKey="id"
search={{
......@@ -166,7 +170,7 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
}}
toolBarRender={() => [
<Button type="primary" onClick={() => handleModalVisible(true)}>
<PlusOutlined/> 新建
<PlusOutlined/> {l('button.create')}
</Button>,
]}
request={(params, sorter, filter) => queryData(url, {...params, sorter, filter})}
......@@ -179,9 +183,10 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
<FooterToolbar
extra={
<div>
已选择 <a style={{fontWeight: 600}}>{selectedRowsState.length}</a>&nbsp;&nbsp;
{l('tips.selected')} <a
style={{fontWeight: 600}}>{selectedRowsState.length}</a> {l('tips.item')}&nbsp;&nbsp;
<span>
被禁用的命名空间共 {selectedRowsState.length - selectedRowsState.reduce((pre, item) => pre + (item.enabled ? 1 : 0), 0)}
{l('pages.nameSpace.disableTotalOf')} {selectedRowsState.length - selectedRowsState.reduce((pre, item) => pre + (item.enabled ? 1 : 0), 0)} {l('pages.nameSpace.selectDisable')}
</span>
</div>
}
......@@ -189,10 +194,10 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
<Button type="primary" danger
onClick={() => {
Modal.confirm({
title: '删除命名空间',
content: '确定删除选中的命名空间吗?',
okText: '确认',
cancelText: '取消',
title: l('pages.nameSpace.deleteNameSpace'),
content: l('pages.nameSpace.deleteNameSpaceConfirm'),
okText: l('button.confirm'),
cancelText: l('button.cancel'),
onOk: async () => {
await handleRemove(url, selectedRowsState);
setSelectedRows([]);
......@@ -201,15 +206,15 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
});
}}
>
批量删除
{l('button.batchDelete')}
</Button>
<Button type="primary"
onClick={() => {
Modal.confirm({
title: '启用命名空间',
content: '确定启用选中的命名空间吗?',
okText: '确认',
cancelText: '取消',
title: l('pages.nameSpace.enableNameSpace'),
content: l('pages.nameSpace.enableNameSpaceConfirm'),
okText: l('button.confirm'),
cancelText: l('button.cancel'),
onOk: async () => {
await updateEnabled(url, selectedRowsState, true);
setSelectedRows([]);
......@@ -217,14 +222,14 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
}
});
}}
>批量启用</Button>
>{l('button.batchEnable')}</Button>
<Button danger
onClick={() => {
Modal.confirm({
title: '禁用命名空间',
content: '确定禁用选中的命名空间吗?',
okText: '确认',
cancelText: '取消',
title: l('pages.nameSpace.disableNameSpace'),
content: l('pages.nameSpace.disableNameSpaceConfirm'),
okText: l('button.confirm'),
cancelText: l('button.cancel'),
onOk: async () => {
await updateEnabled(url, selectedRowsState, false);
setSelectedRows([]);
......@@ -232,7 +237,7 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
}
});
}}
>批量禁用</Button>
> {l('button.batchDisable')}</Button>
</FooterToolbar>
)}
<NameSpaceForm
......
......@@ -25,6 +25,7 @@ import {getStorageTenantId} from "@/components/Common/crud";
import {connect} from "umi";
import {NameSpaceStateType} from "@/pages/AuthenticationCenter/RoleManager/model";
import {buildFormData, getFormData} from "@/pages/AuthenticationCenter/function";
import {useIntl} from "@@/plugin-locale/localeExports";
export type TenantFormProps = {
......@@ -45,6 +46,10 @@ const Option = Select.Option;
const RoleForm: React.FC<TenantFormProps> = (props) => {
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const [form] = Form.useForm();
const [formVals, setFormVals] = useState<Partial<RoleTableListItem>>({
id: props.values?.id,
......@@ -95,25 +100,25 @@ const RoleForm: React.FC<TenantFormProps> = (props) => {
<>
<Form.Item
name="roleCode"
label="角色编号"
rules={[{required: true, message: '请输入角色唯一编码!'}]}>
<Input placeholder="请输入角色唯一编码"/>
label={l('pages.role.roleCode')}
rules={[{required: true, message: l('pages.role.roleCode')}]}>
<Input placeholder={l('pages.role.EnterRoleCode')}/>
</Form.Item>
<Form.Item
name="roleName"
label="角色名称"
rules={[{required: true, message: '请输入角色名称!'}]}>
<Input placeholder="请输入角色名称"/>
label={l('pages.role.roleName')}
rules={[{required: true, message: l('pages.role.EnterRoleName')}]}>
<Input placeholder={l('pages.role.EnterRoleName')}/>
</Form.Item>
<Form.Item
name="namespaceIds"
label="命名空间"
rules={[{required: true, message: '请选择命名空间!'}]}
label={l('pages.role.namespaceIds')}
rules={[{required: true, message: l('pages.role.selectNameSpace')}]}
>
<Select
mode="multiple"
style={{width: '100%'}}
placeholder="请选择命名空间"
placeholder={l('pages.role.selectNameSpace')}
optionLabelProp="label"
>
{getNameSpaceOptions()}
......@@ -121,9 +126,9 @@ const RoleForm: React.FC<TenantFormProps> = (props) => {
</Form.Item>
<Form.Item
name="note"
label="注释"
label={l('pages.role.note')}
>
<Input.TextArea placeholder="请输入文本注释" allowClear
<Input.TextArea placeholder={l('pages.role.EnterNote')} allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item>
</>
......@@ -133,9 +138,9 @@ const RoleForm: React.FC<TenantFormProps> = (props) => {
const renderFooter = () => {
return (
<>
<Button onClick={() => handleModalVisible(false)}>取消</Button>
<Button onClick={() => handleModalVisible(false)}>{l('button.cancel')}</Button>
<Button type="primary" onClick={() => submitForm()}>
完成
{l('button.finish')}
</Button>
</>
);
......@@ -146,7 +151,7 @@ const RoleForm: React.FC<TenantFormProps> = (props) => {
width={1000}
bodyStyle={{padding: '32px 40px 48px'}}
destroyOnClose
title={formVals.id ? "修改角色" : "创建角色"}
title={formVals.id ? l('pages.role.update') : l('pages.role.create')}
visible={modalVisible}
footer={renderFooter()}
onCancel={() => handleModalVisible()}
......
......@@ -29,6 +29,7 @@ import {RoleTableListItem} from "@/pages/AuthenticationCenter/data.d";
import RoleForm from "@/pages/AuthenticationCenter/RoleManager/components/RoleForm";
import {getNameSpaceList} from "@/pages/AuthenticationCenter/service";
import {connect} from "umi";
import {useIntl} from "@@/plugin-locale/localeExports";
const url = '/api/role';
......@@ -41,6 +42,10 @@ const RoleFormList: React.FC<{}> = (props: any) => {
const actionRef = useRef<ActionType>();
const [selectedRowsState, setSelectedRows] = useState<RoleTableListItem[]>([]);
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
useEffect(() => {
getNameSpaceList(dispatch);
}, []);
......@@ -51,10 +56,10 @@ const RoleFormList: React.FC<{}> = (props: any) => {
handleUpdateModalVisible(true);
} else if (key === 'delete') {
Modal.confirm({
title: '删除角色',
content: '确定删除该角色吗?',
okText: '确认',
cancelText: '取消',
title: l('pages.role.delete'),
content: l('pages.role.deleteConfirm'),
okText: l('button.confirm'),
cancelText: l('button.cancel'),
onOk: async () => {
await handleRemove(url, [currentItem]);
actionRef.current?.reloadAndRest?.();
......@@ -69,13 +74,13 @@ const RoleFormList: React.FC<{}> = (props: any) => {
<Dropdown
overlay={
<Menu onClick={({key}) => editAndDelete(key, item)}>
<Menu.Item key="edit">编辑</Menu.Item>
<Menu.Item key="delete">删除</Menu.Item>
<Menu.Item key="edit">{l('button.edit')}</Menu.Item>
<Menu.Item key="delete">{l('button.delete')}</Menu.Item>
</Menu>
}
>
<a>
更多 <DownOutlined/>
{l('button.more')} <DownOutlined/>
</a>
</Dropdown>
);
......@@ -89,18 +94,18 @@ const RoleFormList: React.FC<{}> = (props: any) => {
sorter: true,
},
{
title: '角色编码',
title: l('pages.role.roleCode'),
dataIndex: 'roleCode',
render: (dom, entity) => {
return <a onClick={() => setRow(entity)}>{dom}</a>;
},
},
{
title: '角色名称',
title: l('pages.role.roleName'),
dataIndex: 'roleName',
},
{
title: '所属租户',
title: l('pages.role.belongTenant'),
hideInSearch: true,
render: (dom, entity) => {
return entity?.tenant?.tenantCode || '';
......@@ -129,35 +134,35 @@ const RoleFormList: React.FC<{}> = (props: any) => {
// },
// },
{
title: '备注',
title: l('pages.role.note'),
dataIndex: 'note',
hideInSearch: true,
ellipsis: true,
},
{
title: '创建时间',
title: l('pages.role.createTime'),
dataIndex: 'createTime',
sorter: true,
valueType: 'dateTime',
},
{
title: '最近更新时间',
title: l('pages.role.updateTime'),
dataIndex: 'updateTime',
sorter: true,
valueType: 'dateTime',
},
{
title: '操作',
title: l('pages.operate'),
dataIndex: 'option',
valueType: 'option',
render: (_, record) => [
<Button type={"link"}
onClick={() => {
handleUpdateModalVisible(true);
setFormValues(record);
}}
onClick={() => {
handleUpdateModalVisible(true);
setFormValues(record);
}}
>
配置
{l('button.config')}
</Button>,
<MoreBtn key="more" item={record}/>,
],
......@@ -165,9 +170,9 @@ const RoleFormList: React.FC<{}> = (props: any) => {
];
return (
<PageContainer>
<PageContainer title={false}>
<ProTable<RoleTableListItem>
headerTitle="角色管理"
headerTitle={l('pages.role.roleManagement')}
actionRef={actionRef}
rowKey="id"
search={{
......@@ -175,7 +180,7 @@ const RoleFormList: React.FC<{}> = (props: any) => {
}}
toolBarRender={() => [
<Button type="primary" onClick={() => handleModalVisible(true)}>
<PlusOutlined/> 新建
<PlusOutlined/> {l('button.create')}
</Button>,
]}
request={(params, sorter, filter) => queryData(url, {tenantId: getStorageTenantId(), sorter, filter})}
......@@ -188,17 +193,17 @@ const RoleFormList: React.FC<{}> = (props: any) => {
<FooterToolbar
extra={
<div>
已选择 <a style={{fontWeight: 600}}>{selectedRowsState.length}</a>
{l('tips.selected')} <a style={{fontWeight: 600}}>{selectedRowsState.length}</a> {l('tips.item')}
</div>
}
>
<Button type="primary" danger
onClick={() => {
Modal.confirm({
title: '删除角色',
content: '确定删除选中的角色吗?',
okText: '确认',
cancelText: '取消',
title: l('pages.role.delete'),
content: l('pages.role.deleteConfirm'),
okText: l('button.confirm'),
cancelText: l('button.cancel'),
onOk: async () => {
await handleRemove(url, selectedRowsState);
setSelectedRows([]);
......@@ -207,7 +212,7 @@ const RoleFormList: React.FC<{}> = (props: any) => {
});
}}
>
批量删除
{l('button.batchDelete')}
</Button>
</FooterToolbar>
)}
......
......@@ -23,7 +23,8 @@ import difference from 'lodash/difference';
import React, {useEffect, useState} from 'react';
import {getData} from "@/components/Common/crud";
import {Scrollbars} from 'react-custom-scrollbars';
import { TenantTableListItem, UserTableListItem} from "@/pages/AuthenticationCenter/data.d";
import {TenantTableListItem, UserTableListItem} from "@/pages/AuthenticationCenter/data.d";
import {useIntl} from "@@/plugin-locale/localeExports";
interface TableTransferProps extends TransferProps<UserTableListItem> {
......@@ -36,13 +37,6 @@ interface TableTransferProps extends TransferProps<UserTableListItem> {
// Customize Table Transfer
const GrantTenantTransfer = ({leftColumns, rightColumns, ...restProps}: TableTransferProps) => (
<Transfer
titles={['未选', '已选']}
locale={{
itemUnit: "项",
itemsUnit: "项",
searchPlaceholder: "请输入用户名搜索",
}}
showSelectAll={false}
showSearch={true}
{...restProps}>
......@@ -90,7 +84,7 @@ const GrantTenantTransfer = ({leftColumns, rightColumns, ...restProps}: TableTra
}}
onRow={({id, enabled: itemDisabled}) => ({
onClick: (e) => {
if (itemDisabled || !enabled){
if (itemDisabled || !enabled) {
onItemSelect(id, listSelectedKeys.includes(id));
} else {
return;
......@@ -111,7 +105,7 @@ export type TableTransferFromProps = {
};
const GrantTenantToUserTableTransferFrom = (props: TableTransferFromProps) => {
const intl = useIntl();
const {tenant, onChange: handleChange} = props;
const [targetKeys, setTargetKeys] = useState<string[]>([]);
......@@ -135,30 +129,30 @@ const GrantTenantToUserTableTransferFrom = (props: TableTransferFromProps) => {
const leftTableColumns: ColumnsType<UserTableListItem> = [
{
title: '用户名',
title: intl.formatMessage({id: 'pages.user.UserName'}),
dataIndex: 'username',
},
{
title: '昵称',
title: intl.formatMessage({id: 'pages.user.UserNickName'}),
dataIndex: 'nickname',
},
{
title: '工号',
title: intl.formatMessage({id: 'pages.user.UserJobNumber'}),
dataIndex: 'worknum',
},
];
const rightTableColumns: ColumnsType<UserTableListItem> = [
{
title: '用户名',
title: intl.formatMessage({id: 'pages.user.UserName'}),
dataIndex: 'username',
},
{
title: '昵称',
title: intl.formatMessage({id: 'pages.user.UserNickName'}),
dataIndex: 'nickname',
},
{
title: '工号',
title: intl.formatMessage({id: 'pages.user.UserJobNumber'}),
dataIndex: 'worknum',
},
];
......
......@@ -21,6 +21,7 @@
import React, {useState} from 'react';
import {Button, Form, Input, Modal} from 'antd';
import {TenantTableListItem} from "@/pages/AuthenticationCenter/data.d";
import {useIntl} from "@@/plugin-locale/localeExports";
export type TenantFormProps = {
onCancel: (flag?: boolean) => void;
......@@ -37,6 +38,8 @@ const FormItem = Form.Item;
const TenantForm: React.FC<TenantFormProps> = (props) => {
const intl = useIntl();
const [form] = Form.useForm();
const [formVals, setFormVals] = useState<Partial<TenantTableListItem>>({
id: props.values.id,
......@@ -56,8 +59,8 @@ const TenantForm: React.FC<TenantFormProps> = (props) => {
const submitForm = async () => {
const fieldsValue = await form.validateFields();
fieldsValue.id = formVals.id;
setFormVals({...formVals,...fieldsValue});
handleSubmit({...formVals,...fieldsValue});
setFormVals({...formVals, ...fieldsValue});
handleSubmit({...formVals, ...fieldsValue});
};
const renderContent = (formVals: Partial<TenantTableListItem>) => {
......@@ -65,16 +68,16 @@ const TenantForm: React.FC<TenantFormProps> = (props) => {
<>
<FormItem
name="tenantCode"
label="唯一编码"
rules={[{required: true, message: '请输入租户唯一编码!'}]}>
<Input allowClear placeholder="请输入租户唯一编码"/>
label={intl.formatMessage({id: 'pages.tenant.TenantCode'})}
rules={[{required: true, message: intl.formatMessage({id: 'pages.tenant.EnterTenantCode'})}]}>
<Input allowClear placeholder={intl.formatMessage({id: 'pages.tenant.EnterTenantCode'})}/>
</FormItem>
<FormItem
name="note"
label="注释"
rules={[{required: true, message: '请输入租户注释/描述信息!'}]}
label={intl.formatMessage({id: 'pages.tenant.Note'})}
rules={[{required: true, message: intl.formatMessage({id: 'pages.tenant.EnterTenantNote'})}]}
>
<Input.TextArea placeholder="请输入租户注释/描述信息" allowClear
<Input.TextArea placeholder={intl.formatMessage({id: 'pages.tenant.EnterTenantNote'})} allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</FormItem>
</>
......@@ -84,9 +87,9 @@ const TenantForm: React.FC<TenantFormProps> = (props) => {
const renderFooter = () => {
return (
<>
<Button onClick={() => handleModalVisible(false)}>取消</Button>
<Button onClick={() => handleModalVisible(false)}>{intl.formatMessage({id: 'button.cancel'})}</Button>
<Button type="primary" onClick={() => submitForm()}>
完成
{intl.formatMessage({id: 'button.finish'})}
</Button>
</>
);
......@@ -97,7 +100,7 @@ const TenantForm: React.FC<TenantFormProps> = (props) => {
width={640}
bodyStyle={{padding: '32px 40px 48px'}}
destroyOnClose
title={formVals.id ? "修改租户" : "创建租户"}
title={formVals.id ? intl.formatMessage({id: 'pages.tenant.update'}) : intl.formatMessage({id: 'pages.tenant.create'})}
visible={modalVisible}
footer={renderFooter()}
onCancel={() => handleModalVisible()}
......
......@@ -28,6 +28,7 @@ import {handleAddOrUpdate, handleRemove, queryData} from "@/components/Common/cr
import {TenantTableListItem} from "@/pages/AuthenticationCenter/data.d";
import TenantForm from "@/pages/AuthenticationCenter/TenantManager/components/TenantForm";
import GrantTenantTransfer from "@/pages/AuthenticationCenter/TenantManager/components/GrantTenantTransfer";
import {useIntl} from "umi";
const url = '/api/tenant';
const TenantFormList: React.FC<{}> = (props: any) => {
......@@ -40,16 +41,20 @@ const TenantFormList: React.FC<{}> = (props: any) => {
const [selectedRowsState, setSelectedRows] = useState<TenantTableListItem[]>([]);
const [formValues, setFormValues] = useState({});
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const editAndDelete = (key: string | number, currentItem: TenantTableListItem) => {
if (key === 'edit') {
handleUpdateModalVisible(true);
setFormValues(currentItem);
} else if (key === 'delete') {
Modal.confirm({
title: '删除租户',
content: '确定删除该租户吗?',
okText: '确认',
cancelText: '取消',
title: l('pages.tenant.delete'),
content: l('pages.tenant.deleteConfirm'),
okText: l('button.confirm'),
cancelText: l('button.cancel'),
onOk: async () => {
await handleRemove(url, [currentItem]);
actionRef.current?.reloadAndRest?.();
......@@ -64,13 +69,13 @@ const TenantFormList: React.FC<{}> = (props: any) => {
<Dropdown
overlay={
<Menu onClick={({key}) => editAndDelete(key, item)}>
<Menu.Item key="edit">编辑</Menu.Item>
<Menu.Item key="delete">删除</Menu.Item>
<Menu.Item key="edit">{l('button.edit')}</Menu.Item>
<Menu.Item key="delete">{l('button.delete')}</Menu.Item>
</Menu>
}
>
<a>
更多 <DownOutlined/>
{l('button.more')} <DownOutlined/>
</a>
</Dropdown>
);
......@@ -78,7 +83,8 @@ const TenantFormList: React.FC<{}> = (props: any) => {
const handleGrantTenantForm = () => {
return (
<Modal title="分配用户" visible={handleGrantTenant} destroyOnClose={true} width={"1500px"}
<Modal title={l('pages.tenant.AssignUser')} visible={handleGrantTenant}
destroyOnClose={true} width={"1500px"}
onCancel={() => {
setHandleGrantTenant(false);
}}
......@@ -86,11 +92,11 @@ const TenantFormList: React.FC<{}> = (props: any) => {
<Button key="back" onClick={() => {
setHandleGrantTenant(false);
}}>
关闭
{l('button.close')}
</Button>,
<Button type="primary" onClick={async () => {
// to save
const success = await handleAddOrUpdate(url+ "/grantTenantToUser", {
const success = await handleAddOrUpdate(url + "/grantTenantToUser", {
tenantId: formValues.id,
users: tenantRelFormValues
});
......@@ -103,7 +109,7 @@ const TenantFormList: React.FC<{}> = (props: any) => {
}
}}
>
确认
{l('button.confirm')}
</Button>,
]}>
<GrantTenantTransfer tenant={formValues} onChange={(value) => {
......@@ -122,8 +128,7 @@ const TenantFormList: React.FC<{}> = (props: any) => {
sorter: true,
},
{
title: '租户编码',
tip: '编码是唯一的',
title: l('pages.tenant.TenantCode'),
dataIndex: 'tenantCode',
render: (dom, entity) => {
return <a onClick={() => setRow(entity)}>{dom}</a>;
......@@ -152,33 +157,33 @@ const TenantFormList: React.FC<{}> = (props: any) => {
// },
// },
{
title: '备注',
title: l('pages.tenant.Note'),
dataIndex: 'note',
hideInSearch: true,
ellipsis: true,
},
{
title: '创建时间',
title: l('pages.tenant.CreateTime'),
dataIndex: 'createTime',
valueType: 'dateTime',
},
{
title: '最近更新时间',
title: l('pages.tenant.UpdateTime'),
dataIndex: 'updateTime',
valueType: 'dateTime',
},
{
title: '操作',
title: l('pages.operate'),
dataIndex: 'option',
valueType: 'option',
render: (_, record:TenantTableListItem) => [
render: (_, record: TenantTableListItem) => [
<a
onClick={() => {
handleUpdateModalVisible(true);
setFormValues(record);
}}
>
配置
{l('button.config')}
</a>,
<a
onClick={() => {
......@@ -186,7 +191,7 @@ const TenantFormList: React.FC<{}> = (props: any) => {
setFormValues(record);
}}
>
分配用户
{l('pages.tenant.AssignUser')}
</a>,
<MoreBtn key="more" item={record}/>,
],
......@@ -194,9 +199,9 @@ const TenantFormList: React.FC<{}> = (props: any) => {
];
return (
<PageContainer>
<PageContainer title={false}>
<ProTable<TenantTableListItem>
headerTitle="租户管理"
headerTitle={l('pages.tenant.TenantManager')}
actionRef={actionRef}
rowKey="id"
search={{
......@@ -204,7 +209,7 @@ const TenantFormList: React.FC<{}> = (props: any) => {
}}
toolBarRender={() => [
<Button type="primary" onClick={() => handleModalVisible(true)}>
<PlusOutlined/> 新建
<PlusOutlined/> {l('button.create')}
</Button>,
]}
request={(params, sorter, filter) => queryData(url, {...params, sorter, filter})}
......@@ -217,17 +222,18 @@ const TenantFormList: React.FC<{}> = (props: any) => {
<FooterToolbar
extra={
<div>
已选择 <a style={{fontWeight: 600}}>{selectedRowsState.length}</a>
{l('tips.selected')} <a
style={{fontWeight: 600}}>{selectedRowsState.length}</a> {l('tips.item')}
</div>
}
>
<Button type="primary" danger
onClick={() => {
Modal.confirm({
title: '删除租户',
content: '确定删除选中的租户吗?',
okText: '确认',
cancelText: '取消',
title: l('pages.tenant.delete'),
content: l('pages.tenant.deleteConfirm'),
okText: l('button.confirm'),
cancelText: l('button.cancel'),
onOk: async () => {
await handleRemove(url, selectedRowsState);
setSelectedRows([]);
......@@ -236,7 +242,7 @@ const TenantFormList: React.FC<{}> = (props: any) => {
});
}}
>
批量删除
{l('button.batchDelete')}
</Button>
</FooterToolbar>
)}
......
......@@ -21,7 +21,7 @@
import React, {useState} from 'react';
import {Button, Form, Input, Modal} from 'antd';
import {PasswordItem} from "@/pages/AuthenticationCenter/data.d";
import { useIntl, Link, history, FormattedMessage, SelectLang} from 'umi';
import {useIntl} from 'umi';
export type PasswordFormProps = {
onCancel: (flag?: boolean) => void;
......@@ -37,7 +37,9 @@ const formLayout = {
const PasswordForm: React.FC<PasswordFormProps> = (props) => {
const intl = useIntl();
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const [form] = Form.useForm();
const [formVals, setFormVals] = useState<Partial<PasswordItem>>({
......@@ -53,8 +55,8 @@ const PasswordForm: React.FC<PasswordFormProps> = (props) => {
const submitForm = async () => {
const fieldsValue = await form.validateFields();
setFormVals({ ...formVals, ...fieldsValue });
handleSubmit({ ...formVals, ...fieldsValue });
setFormVals({...formVals, ...fieldsValue});
handleSubmit({...formVals, ...fieldsValue});
};
const renderContent = () => {
......@@ -62,39 +64,39 @@ const PasswordForm: React.FC<PasswordFormProps> = (props) => {
<>
<Form.Item
name="password"
label= {intl.formatMessage({id: 'pages.user.UserOldPassword', defaultMessage: '旧密码',})}
label={l('pages.user.UserOldPassword')}
hasFeedback
rules={[{required: true, message: intl.formatMessage({id: 'pages.user.UserEnterOldPassword', defaultMessage: '请输入旧密码!',})}]}>
<Input.Password placeholder={intl.formatMessage({id: 'pages.user.UserEnterOldPassword', defaultMessage: '请输入旧密码!',})}/>
rules={[{required: true, message: l('pages.user.UserEnterOldPassword')}]}>
<Input.Password placeholder={l('pages.user.UserEnterOldPassword')}/>
</Form.Item>
<Form.Item
name="newPassword"
label={intl.formatMessage({id: 'pages.user.UserNewPassword', defaultMessage: '新密码',})}
label={l('pages.user.UserNewPassword')}
hasFeedback
rules={[{required: true, message: intl.formatMessage({id: 'pages.user.UserEnterNewPassword', defaultMessage: '请输入新密码',})}]}>
<Input.Password placeholder={intl.formatMessage({id: 'pages.user.UserEnterNewPassword', defaultMessage: '请输入新密码',})}/>
rules={[{required: true, message: l('pages.user.UserEnterNewPassword')}]}>
<Input.Password placeholder={l('pages.user.UserEnterNewPassword')}/>
</Form.Item>
<Form.Item
name="newPasswordCheck"
label={intl.formatMessage({id: 'pages.user.UserRepeatNewPassword', defaultMessage: '重复新密码',})}
hasFeedback
dependencies={['newPassword']}
rules={[
{
required: true,
message: intl.formatMessage({id: 'pages.user.UserNewPasswordNotMatch', defaultMessage: '重复密码不一致',}),
},
({ getFieldValue }) => ({
validator(_, value) {
if (!value || getFieldValue('newPassword') === value) {
return Promise.resolve();
}
return Promise.reject(new Error(intl.formatMessage({id: 'pages.user.UserNewPasswordNotMatch', defaultMessage: '重复密码不一致',})));
name="newPasswordCheck"
label={l('pages.user.UserRepeatNewPassword')}
hasFeedback
dependencies={['newPassword']}
rules={[
{
required: true,
message: l('pages.user.UserNewPasswordNotMatch'),
},
}),
]}>
<Input.Password placeholder={intl.formatMessage({id: 'pages.user.UserEnterRepeatNewPassword', defaultMessage: '请重复输入新密码',})}/>
</Form.Item>
({getFieldValue}) => ({
validator(_, value) {
if (!value || getFieldValue('newPassword') === value) {
return Promise.resolve();
}
return Promise.reject(new Error(l('pages.user.UserNewPasswordNotMatch')));
},
}),
]}>
<Input.Password placeholder={l('pages.user.UserEnterRepeatNewPassword')}/>
</Form.Item>
</>
);
};
......@@ -102,9 +104,9 @@ const PasswordForm: React.FC<PasswordFormProps> = (props) => {
const renderFooter = () => {
return (
<>
<Button onClick={() => handleModalVisible(false)}>{intl.formatMessage({id: 'pages.user.UserCancel', defaultMessage: '取消',})}</Button>
<Button onClick={() => handleModalVisible(false)}> {l('button.cancel')}</Button>
<Button type="primary" onClick={() => submitForm()}>
{intl.formatMessage({id: 'pages.user.UserComplete', defaultMessage: '完成',})}
{l('button.finish')}
</Button>
</>
);
......@@ -115,7 +117,7 @@ const PasswordForm: React.FC<PasswordFormProps> = (props) => {
width={1200}
bodyStyle={{padding: '32px 40px 48px'}}
destroyOnClose
title={intl.formatMessage({id: 'pages.user.UserUpdatePassword', defaultMessage: '修改密码',})}
title={l('button.changePassword')}
visible={modalVisible}
footer={renderFooter()}
onCancel={() => handleModalVisible()}
......
......@@ -24,6 +24,7 @@ import {useEffect, useState} from 'react';
import {getData} from "@/components/Common/crud";
import {Scrollbars} from 'react-custom-scrollbars';
import {RoleTableListItem, UserTableListItem} from "@/pages/AuthenticationCenter/data.d";
import {useIntl} from "@@/plugin-locale/localeExports";
interface TableTransferProps extends TransferProps<RoleTableListItem> {
......@@ -36,13 +37,6 @@ interface TableTransferProps extends TransferProps<RoleTableListItem> {
// Customize Table Transfer
const TableTransfer = ({leftColumns, rightColumns, ...restProps}: TableTransferProps) => (
<Transfer
titles={['未选', '已选']}
locale={{
itemUnit: "项",
itemsUnit: "项",
searchPlaceholder: "请输入角色名称搜索",
}}
showSelectAll={false}
showSearch={true}
{...restProps}>
......@@ -109,6 +103,9 @@ export type TableTransferFromProps = {
const TableTransferFrom = (props: TableTransferFromProps) => {
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const {user, onChange: handleChange} = props;
const [targetKeys, setTargetKeys] = useState<string[]>([]);
......@@ -133,15 +130,15 @@ const TableTransferFrom = (props: TableTransferFromProps) => {
const leftTableColumns: ColumnsType<RoleTableListItem> = [
{
dataIndex: 'roleCode',
title: '角色编码',
title: l('pages.role.roleCode'),
},
{
dataIndex: 'roleName',
title: '角色名称',
title: l('pages.role.roleName'),
},
{
dataIndex: 'note',
title: '描述',
title: l('pages.role.note'),
ellipsis: true,
},
];
......@@ -149,15 +146,15 @@ const TableTransferFrom = (props: TableTransferFromProps) => {
const rightTableColumns: ColumnsType<RoleTableListItem> = [
{
dataIndex: 'roleCode',
title: '角色编码',
title: l('pages.role.roleCode'),
},
{
dataIndex: 'roleName',
title: '角色名称',
title: l('pages.role.roleName'),
},
{
dataIndex: 'note',
title: '描述',
title: l('pages.role.note'),
ellipsis: true,
},
];
......
......@@ -21,7 +21,7 @@
import React, {useState} from 'react';
import {Button, Form, Input, Modal, Switch} from 'antd';
import {UserTableListItem} from "@/pages/AuthenticationCenter/data.d";
import { useIntl, Link, history, FormattedMessage, SelectLang} from 'umi';
import {useIntl} from 'umi';
export type UserFormProps = {
onCancel: (flag?: boolean) => void;
......@@ -37,7 +37,9 @@ const formLayout = {
const UserForm: React.FC<UserFormProps> = (props) => {
const intl = useIntl();
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const [form] = Form.useForm();
const [formVals, setFormVals] = useState<Partial<UserTableListItem>>({
......@@ -60,8 +62,8 @@ const UserForm: React.FC<UserFormProps> = (props) => {
const submitForm = async () => {
const fieldsValue = await form.validateFields();
setFormVals({ ...formVals, ...fieldsValue });
handleSubmit({ ...formVals, ...fieldsValue });
setFormVals({...formVals, ...fieldsValue});
handleSubmit({...formVals, ...fieldsValue});
};
const renderContent = (formVals: Partial<UserTableListItem>) => {
......@@ -69,32 +71,38 @@ const UserForm: React.FC<UserFormProps> = (props) => {
<>
<Form.Item
name="username"
label={intl.formatMessage({id: 'pages.user.UserName', defaultMessage: '用户名',})}
rules={[{required: true, message: intl.formatMessage({id: 'pages.user.UserEnterUserName', defaultMessage: '请输入用户名',})}]}>
<Input placeholder={intl.formatMessage({id: 'pages.user.UserEnterUniqueUserName', defaultMessage: "请输入唯一用户名",})}/>
label={l('pages.user.UserName')}
rules={[{
required: true,
message: l('pages.user.UserEnterUserName')
}]}>
<Input placeholder={l('pages.user.UserEnterUniqueUserName')}/>
</Form.Item>
<Form.Item
name="nickname"
label={intl.formatMessage({id: 'pages.user.UserNickName', defaultMessage: '昵称',})}
label={l('pages.user.UserNickName')}
>
<Input placeholder={intl.formatMessage({id: 'pages.user.UserEnterNickName', defaultMessage: "请输入昵称",})}/>
<Input placeholder={l('pages.user.UserEnterNickName')}/>
</Form.Item>
<Form.Item
name="worknum"
label={intl.formatMessage({id: 'pages.user.UserJobNumber', defaultMessage: '工号',})}
label={l('pages.user.UserJobNumber')}
>
<Input placeholder={intl.formatMessage({id: 'pages.user.UserEnterJobNumber', defaultMessage: "请输入工号",})}/>
<Input
placeholder={l('pages.user.UserEnterJobNumber')}/>
</Form.Item>
<Form.Item
name="mobile"
label={intl.formatMessage({id: 'pages.user.UserPhoneNumber', defaultMessage: '手机号',})}
label={l('pages.user.UserPhoneNumber')}
>
<Input placeholder={intl.formatMessage({id: 'pages.user.UserEnterPhoneNumber', defaultMessage: "请输入手机号",})}/>
<Input
placeholder={l('pages.user.UserEnterPhoneNumber')}/>
</Form.Item>
<Form.Item
name="enabled"
label={intl.formatMessage({id: 'pages.user.UserIsUse', defaultMessage: '是否启用',})}>
<Switch checkedChildren={intl.formatMessage({id: 'pages.user.UserInUse', defaultMessage: '启用',})} unCheckedChildren={intl.formatMessage({id: 'pages.user.UserNotUse', defaultMessage: '禁用',})}
label={l('pages.user.UserIsUse')}>
<Switch checkedChildren={l('status.enabled')}
unCheckedChildren={l('status.disabled')}
defaultChecked={formVals.enabled}/>
</Form.Item>
</>
......@@ -104,9 +112,9 @@ const UserForm: React.FC<UserFormProps> = (props) => {
const renderFooter = () => {
return (
<>
<Button onClick={() => handleModalVisible(false)}>{intl.formatMessage({id: 'pages.user.UserCancel', defaultMessage: '取消',})}</Button>
<Button onClick={() => handleModalVisible(false)}>{l('button.cancel')}</Button>
<Button type="primary" onClick={() => submitForm()}>
{intl.formatMessage({id: 'pages.user.UserComplete', defaultMessage: '完成',})}
{l('button.finish')}
</Button>
</>
);
......@@ -117,7 +125,7 @@ const UserForm: React.FC<UserFormProps> = (props) => {
width={1200}
bodyStyle={{padding: '32px 40px 48px'}}
destroyOnClose
title={formVals.id?intl.formatMessage({id: 'pages.user.UserUpdateUser', defaultMessage: '维护用户',}):intl.formatMessage({id: 'pages.user.UserCreateUser', defaultMessage: '创建用户',})}
title={formVals.id ? l('pages.user.UserUpdateUser') : l('pages.user.UserCreateUser')}
visible={modalVisible}
footer={renderFooter()}
onCancel={() => handleModalVisible()}
......
......@@ -29,6 +29,7 @@ import {UserTableListItem} from "@/pages/AuthenticationCenter/data.d";
import UserForm from "@/pages/AuthenticationCenter/UserManager/components/UserForm";
import PasswordForm from "@/pages/AuthenticationCenter/UserManager/components/PasswordForm";
import TableTransferFrom from "@/pages/AuthenticationCenter/UserManager/components/TableTransfer";
import {useIntl} from "@@/plugin-locale/localeExports";
const url = '/api/user';
const UserTableList: React.FC<{}> = (props: any) => {
......@@ -43,6 +44,9 @@ const UserTableList: React.FC<{}> = (props: any) => {
const actionRef = useRef<ActionType>();
const [selectedRowsState, setSelectedRows] = useState<UserTableListItem[]>([]);
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const editAndDelete = (key: string | number, currentItem: UserTableListItem) => {
if (key === 'edit') {
setFormValues(currentItem);
......@@ -52,10 +56,10 @@ const UserTableList: React.FC<{}> = (props: any) => {
handlePasswordModalVisible(true);
} else if (key === 'delete') {
Modal.confirm({
title: '删除用户',
content: '确定删除该用户吗?',
okText: '确认',
cancelText: '取消',
title: l('pages.user.delete'),
content: l('pages.user.deleteConfirm'),
okText: l('button.confirm'),
cancelText: l('button.cancel'),
onOk: async () => {
await handleRemove(url, [currentItem]);
actionRef.current?.reloadAndRest?.();
......@@ -70,14 +74,14 @@ const UserTableList: React.FC<{}> = (props: any) => {
<Dropdown
overlay={
<Menu onClick={({key}) => editAndDelete(key, item)}>
<Menu.Item key="edit">编辑</Menu.Item>
<Menu.Item key="password">修改密码</Menu.Item>
{item.username == 'admin' ? '' : (<Menu.Item key="delete">删除</Menu.Item>)}
<Menu.Item key="edit">{l('button.edit')}</Menu.Item>
<Menu.Item key="password">{l('button.changePassword')}</Menu.Item>
{item.username == 'admin' ? '' : (<Menu.Item key="delete">{l('button.delete')}</Menu.Item>)}
</Menu>
}
>
<a>
更多 <DownOutlined/>
{l('button.more')} <DownOutlined/>
</a>
</Dropdown>
);
......@@ -85,7 +89,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
const handleGrantRoleForm = () => {
return (
<Modal title="添加角色" visible={handleGrantRole} destroyOnClose={true} width={"1500px"}
<Modal title={l('pages.user.AssignRole')} visible={handleGrantRole} destroyOnClose={true} width={"1500px"}
onCancel={() => {
setHandleGrantRole(false);
}}
......@@ -93,7 +97,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
<Button key="back" onClick={() => {
setHandleGrantRole(false);
}}>
关闭
{l('button.close')}
</Button>,
<Button type="primary" onClick={async () => {
// to save
......@@ -110,7 +114,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
}
}}
>
确认
{l('button.confirm')}
</Button>,
]}>
<TableTransferFrom user={formValues} onChange={(value) => {
......@@ -122,7 +126,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
const columns: ProColumns<UserTableListItem>[] = [
{
title: '用户名',
title: l('pages.user.UserName'),
dataIndex: 'username',
sorter: true,
render: (dom, entity) => {
......@@ -137,60 +141,60 @@ const UserTableList: React.FC<{}> = (props: any) => {
hideInSearch: true,
},
{
title: '昵称',
title: l('pages.user.UserNickName'),
sorter: true,
dataIndex: 'nickname',
hideInTable: false,
},
{
title: '工号',
title: l('pages.user.UserJobNumber'),
sorter: true,
dataIndex: 'worknum',
hideInTable: false,
},
{
title: '手机号',
title: l('pages.user.UserPhoneNumber'),
sorter: true,
dataIndex: 'mobile',
hideInTable: false,
},
{
title: '是否启用',
title: l('pages.user.UserIsUse'),
dataIndex: 'enabled',
hideInForm: true,
hideInSearch: true,
hideInTable: false,
filters: [
{
text: '已启用',
text: l('status.enabled'),
value: 1,
},
{
text: '已禁用',
text: l('status.disabled'),
value: 0,
},
],
filterMultiple: false,
valueEnum: {
true: {text: '已启用', status: 'Success'},
false: {text: '已禁用', status: 'Error'},
true: {text: l('status.enabled'), status: 'Success'},
false: {text: l('status.disabled'), status: 'Error'},
},
},
{
title: '创建时间',
title: l('pages.user.UserCreateTime'),
dataIndex: 'createTime',
sorter: true,
valueType: 'dateTime',
hideInTable: true,
},
{
title: '最近更新时间',
title: l('pages.user.UserUpdateTime'),
dataIndex: 'updateTime',
sorter: true,
valueType: 'dateTime',
},
{
title: '操作',
title: l('pages.operate'),
dataIndex: 'option',
valueType: 'option',
render: (_, record) => [
......@@ -200,7 +204,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
setFormValues(record);
}}
>
配置
{l('button.config')}
</a>,
<a
onClick={() => {
......@@ -208,7 +212,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
setFormValues(record);
}}
>
关联角色
{l('pages.user.AssignRole')}
</a>,
<MoreBtn key="more" item={record}/>,
],
......@@ -217,9 +221,9 @@ const UserTableList: React.FC<{}> = (props: any) => {
return (
<>
<PageContainer>
<PageContainer title={false}>
<ProTable<UserTableListItem>
headerTitle="用户管理"
headerTitle={l('pages.user.UserManger')}
actionRef={actionRef}
rowKey="id"
search={{
......@@ -227,7 +231,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
}}
toolBarRender={() => [
<Button type="primary" onClick={() => handleModalVisible(true)}>
<PlusOutlined/> 新建
<PlusOutlined/> {l('button.create')}
</Button>,
]}
request={(params, sorter, filter) => queryData(url, {...params, sorter, filter})}
......@@ -240,9 +244,10 @@ const UserTableList: React.FC<{}> = (props: any) => {
<FooterToolbar
extra={
<div>
已选择 <a style={{fontWeight: 600}}>{selectedRowsState.length}</a>&nbsp;&nbsp;
{l('tips.selected')} <a
style={{fontWeight: 600}}>{selectedRowsState.length}</a> {l('tips.item')}&nbsp;&nbsp;
<span>
被禁用的用户共 {selectedRowsState.length - selectedRowsState.reduce((pre, item) => pre + (item.enabled ? 1 : 0), 0)}
{l('pages.user.disableTotalOf')} {selectedRowsState.length - selectedRowsState.reduce((pre, item) => pre + (item.enabled ? 1 : 0), 0)} {l('pages.user.selectDisable')}
</span>
</div>
}
......@@ -250,10 +255,10 @@ const UserTableList: React.FC<{}> = (props: any) => {
<Button type="primary" danger
onClick={() => {
Modal.confirm({
title: '删除用户',
content: '确定删除选中的用户吗?',
okText: '确认',
cancelText: '取消',
title: l('pages.user.delete'),
content: l('pages.user.deleteConfirm'),
okText: l('button.confirm'),
cancelText: l('button.cancel'),
onOk: async () => {
await handleRemove(url, selectedRowsState);
setSelectedRows([]);
......@@ -262,15 +267,15 @@ const UserTableList: React.FC<{}> = (props: any) => {
});
}}
>
批量删除
{l('button.batchDelete')}
</Button>
<Button type="primary"
onClick={() => {
Modal.confirm({
title: '启用用户',
content: '确定启用选中的用户吗?',
okText: '确认',
cancelText: '取消',
title: l('pages.user.enable'),
content: l('pages.user.enableConfirm'),
okText: l('button.confirm'),
cancelText: l('button.cancel'),
onOk: async () => {
await updateEnabled(url, selectedRowsState, true);
setSelectedRows([]);
......@@ -278,14 +283,14 @@ const UserTableList: React.FC<{}> = (props: any) => {
}
});
}}
>批量启用</Button>
>{l('button.batchEnable')}</Button>
<Button danger
onClick={() => {
Modal.confirm({
title: '禁用用户',
content: '确定禁用选中的用户吗?',
okText: '确认',
cancelText: '取消',
title: l('pages.user.disable'),
content: l('pages.user.disableConfirm'),
okText: l('button.confirm'),
cancelText: l('button.cancel'),
onOk: async () => {
await updateEnabled(url, selectedRowsState, false);
setSelectedRows([]);
......@@ -293,7 +298,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
}
});
}}
>批量禁用</Button>
>{l('button.batchDisable')}</Button>
</FooterToolbar>
)}
<UserForm
......@@ -317,7 +322,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
<>
<PasswordForm
onSubmit={async (value) => {
const success = await handleOption(url + "/modifyPassword", '修改密码', value);
const success = await handleOption(url + "/modifyPassword", l('button.changePassword'), value);
if (success) {
handlePasswordModalVisible(false);
setFormValues({});
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment