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',
......
This diff is collapsed.
......@@ -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()}
......
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