From a687a23a641ca262dbffd383af129a0069fbc5ee Mon Sep 17 00:00:00 2001 From: crupest Date: Mon, 16 Nov 2020 16:30:32 +0800 Subject: ... --- FrontEnd/src/app/views/common/AppBar.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'FrontEnd/src/app/views/common') diff --git a/FrontEnd/src/app/views/common/AppBar.tsx b/FrontEnd/src/app/views/common/AppBar.tsx index 8f35b482..11d3de04 100644 --- a/FrontEnd/src/app/views/common/AppBar.tsx +++ b/FrontEnd/src/app/views/common/AppBar.tsx @@ -15,7 +15,7 @@ const AppBar: React.FC = (_) => { const { t } = useTranslation(); - const isAdministrator = user && user.administrator; + const hasAdministrationPermission = user && user.hasAdministrationPermission; const [expand, setExpand] = React.useState(false); const collapse = (): void => setExpand(false); @@ -56,7 +56,7 @@ const AppBar: React.FC = (_) => { {t("nav.about")} - {isAdministrator && ( + {hasAdministrationPermission && ( Date: Tue, 17 Nov 2020 17:31:42 +0800 Subject: ... --- FrontEnd/src/app/http/user.ts | 25 ++ FrontEnd/src/app/views/admin/AdminSubPage.tsx | 18 +- FrontEnd/src/app/views/admin/UserAdmin.tsx | 352 +++++++--------------- FrontEnd/src/app/views/common/OperationDialog.tsx | 31 +- 4 files changed, 163 insertions(+), 263 deletions(-) (limited to 'FrontEnd/src/app/views/common') diff --git a/FrontEnd/src/app/http/user.ts b/FrontEnd/src/app/http/user.ts index 92a6433e..243846d1 100644 --- a/FrontEnd/src/app/http/user.ts +++ b/FrontEnd/src/app/http/user.ts @@ -28,6 +28,8 @@ export interface HttpUser { } export interface HttpUserPatchRequest { + username?: string; + password?: string; nickname?: string; } @@ -36,6 +38,11 @@ export interface HttpChangePasswordRequest { newPassword: string; } +export interface HttpCreateUserRequest { + username: string; + password: string; +} + export class HttpUserNotExistError extends Error { constructor(public innerError?: AxiosError) { super(); @@ -56,6 +63,7 @@ export interface IHttpUserClient { req: HttpUserPatchRequest, token: string ): Promise; + delete(username: string, token: string): Promise; getAvatar(username: string): Promise; getAvatar( username: string, @@ -73,6 +81,8 @@ export interface IHttpUserClient { permission: UserPermission, token: string ): Promise; + + createUser(req: HttpCreateUserRequest, token: string): Promise; } export class HttpUserClient implements IHttpUserClient { @@ -102,6 +112,13 @@ export class HttpUserClient implements IHttpUserClient { .catch(convertToNetworkError); } + delete(username: string, token: string): Promise { + return axios + .delete(`${apiBaseUrl}/users/${username}?token=${token}`) + .catch(convertToNetworkError) + .then(); + } + getAvatar(username: string): Promise; getAvatar( username: string, @@ -171,6 +188,14 @@ export class HttpUserClient implements IHttpUserClient { .catch(convertToNetworkError) .then(); } + + createUser(req: HttpCreateUserRequest, token: string): Promise { + return axios + .post(`${apiBaseUrl}/userop/createuser?token=${token}`, req) + .then(extractResponseData) + .catch(convertToNetworkError) + .then(); + } } let client: IHttpUserClient = new HttpUserClient(); diff --git a/FrontEnd/src/app/views/admin/AdminSubPage.tsx b/FrontEnd/src/app/views/admin/AdminSubPage.tsx index 5d2df13c..5efe1ee3 100644 --- a/FrontEnd/src/app/views/admin/AdminSubPage.tsx +++ b/FrontEnd/src/app/views/admin/AdminSubPage.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { Nav } from "react-bootstrap"; +import { Container, Nav } from "react-bootstrap"; import { useHistory, useRouteMatch } from "react-router"; const AdminSubPage: React.FC = ({ children }) => { @@ -13,8 +13,8 @@ const AdminSubPage: React.FC = ({ children }) => { } return ( - <> - diff --git a/FrontEnd/src/app/views/admin/UserAdmin.tsx b/FrontEnd/src/app/views/admin/UserAdmin.tsx index bd60381f..8fd9b351 100644 --- a/FrontEnd/src/app/views/admin/UserAdmin.tsx +++ b/FrontEnd/src/app/views/admin/UserAdmin.tsx @@ -15,6 +15,7 @@ import { kUserPermissionList, UserPermission, } from "@/http/user"; +import { useTranslation } from "react-i18next"; interface DialogProps { open: boolean; @@ -204,6 +205,8 @@ interface UserItemProps { } const UserItem: React.FC = ({ user, on }) => { + const { t } = useTranslation(); + const [editMaskVisible, setEditMaskVisible] = React.useState(false); return ( @@ -214,10 +217,16 @@ const UserItem: React.FC = ({ user, on }) => { onClick={() => setEditMaskVisible(true)} />

{user.username}

-
nickname: {user.nickname}
-
unique id: {user.uniqueId}
- permissions:{" "} + {t("admin:user.nickname")} + {user.nickname} +
+
+ {t("admin:user.uniqueId")} + {user.uniqueId} +
+
+ {t("admin:user.permissions")} {user.permissions.map((permission) => { return ( @@ -231,13 +240,13 @@ const UserItem: React.FC = ({ user, on }) => { onClick={() => setEditMaskVisible(false)} >
@@ -249,6 +258,8 @@ interface UserAdminProps { } const UserAdmin: React.FC = (props) => { + const { t } = useTranslation(); + type DialogInfo = | null | { @@ -384,7 +395,7 @@ const UserAdmin: React.FC = (props) => { }) } > - Create + {t("admin:create")} diff --git a/FrontEnd/src/app/views/common/AppBar.tsx b/FrontEnd/src/app/views/common/AppBar.tsx index 11d3de04..c862a6d3 100644 --- a/FrontEnd/src/app/views/common/AppBar.tsx +++ b/FrontEnd/src/app/views/common/AppBar.tsx @@ -63,7 +63,7 @@ const AppBar: React.FC = (_) => { activeClassName="active" onClick={collapse} > - Administration + {t("nav.administration")}
)} -- cgit v1.2.3 From 34ce9e1c2734a4dc1b364b76c7042839c9172aef Mon Sep 17 00:00:00 2001 From: crupest Date: Fri, 20 Nov 2020 20:49:05 +0800 Subject: ... --- FrontEnd/src/app/locales/en/admin.json | 22 +++++++++- FrontEnd/src/app/locales/zh/admin.json | 22 +++++++++- FrontEnd/src/app/views/admin/UserAdmin.tsx | 50 +++++++++++++---------- FrontEnd/src/app/views/common/OperationDialog.tsx | 3 +- 4 files changed, 72 insertions(+), 25 deletions(-) (limited to 'FrontEnd/src/app/views/common') diff --git a/FrontEnd/src/app/locales/en/admin.json b/FrontEnd/src/app/locales/en/admin.json index a0290206..098ffb1f 100644 --- a/FrontEnd/src/app/locales/en/admin.json +++ b/FrontEnd/src/app/locales/en/admin.json @@ -5,11 +5,31 @@ }, "create": "Create", "user": { + "username": "Username: ", + "password": "Password: ", "nickname": "Nickname: ", "uniqueId": "Unique ID: ", "permissions": "Permissions: ", "modify": "Modify", "modifyPermissions": "Modify Permissions", - "delete": "Delete" + "delete": "Delete", + "dialog": { + "create": { + "title": "Create User", + "prompt": "You are creating a new user." + }, + "delete": { + "title": "Delete user", + "prompt": "You are deleting <1>username . Caution: This can't be undo." + }, + "modify": { + "title": "Modify User", + "prompt": "You are modifying user <1>username ." + }, + "modifyPermissions": { + "title": "Modify User Permissions", + "prompt": "You are modifying permissions of user <1>username ." + } + } } } diff --git a/FrontEnd/src/app/locales/zh/admin.json b/FrontEnd/src/app/locales/zh/admin.json index d6895206..fed39b2d 100644 --- a/FrontEnd/src/app/locales/zh/admin.json +++ b/FrontEnd/src/app/locales/zh/admin.json @@ -5,11 +5,31 @@ }, "create": "创建", "user": { + "username": "用户名:", + "password": "密码:", "nickname": "昵称:", "uniqueId": "唯一ID:", "permissions": "权限:", "modify": "修改", "modifyPermissions": "修改权限", - "delete": "删除" + "delete": "删除", + "dialog": { + "create": { + "title": "创建用户", + "prompt": "您正在创建一个新用户。" + }, + "delete": { + "title": "删除用户", + "prompt": "您正在删除用户 <1>username 。注意:此操作不可撤销。" + }, + "modify": { + "title": "修改用户", + "prompt": "您正在修改用户 <1>username 。" + }, + "modifyPermissions": { + "title": "修改用户权限", + "prompt": "您正在修改用户 <1>username 的权限。" + } + } } } diff --git a/FrontEnd/src/app/views/admin/UserAdmin.tsx b/FrontEnd/src/app/views/admin/UserAdmin.tsx index 8fd9b351..3cfd5880 100644 --- a/FrontEnd/src/app/views/admin/UserAdmin.tsx +++ b/FrontEnd/src/app/views/admin/UserAdmin.tsx @@ -15,7 +15,7 @@ import { kUserPermissionList, UserPermission, } from "@/http/user"; -import { useTranslation } from "react-i18next"; +import { Trans, useTranslation } from "react-i18next"; interface DialogProps { open: boolean; @@ -33,13 +33,13 @@ const CreateUserDialog: React.FC> = ({ }) => { return ( @@ -70,12 +70,12 @@ const UserDeleteDialog: React.FC ( - <> - You are deleting user {username} ! - + + 0{username}2 + )} onProcess={() => getHttpUserClient().delete(username, token)} onSuccessAndClose={onSuccess} @@ -93,19 +93,26 @@ const UserModifyDialog: React.FC ( - <> - You are change the password of user - {oldUser.username} ! - + + 0{oldUser.username}2 + )} inputScheme={ [ - { type: "text", label: "New Username", initValue: oldUser.username }, - { type: "text", label: "New Password" }, - { type: "text", label: "New Nickname", initValue: oldUser.nickname }, + { + type: "text", + label: "admin:user.username", + initValue: oldUser.username, + }, + { type: "text", label: "admin:user.password" }, + { + type: "text", + label: "admin:user.nickname", + initValue: oldUser.nickname, + }, ] as const } onProcess={([username, password, nickname]) => @@ -139,13 +146,12 @@ const UserPermissionModifyDialog: React.FC ( - <> - You are modify permission of user - {username} ! - + + 0{username}2 + )} inputScheme={kUserPermissionList.map( (permission, index) => ({ diff --git a/FrontEnd/src/app/views/common/OperationDialog.tsx b/FrontEnd/src/app/views/common/OperationDialog.tsx index 08baf93a..bca5cb87 100644 --- a/FrontEnd/src/app/views/common/OperationDialog.tsx +++ b/FrontEnd/src/app/views/common/OperationDialog.tsx @@ -120,7 +120,8 @@ const OperationDialog = < >( props: OperationDialogProps ): React.ReactElement => { - const inputScheme = props.inputScheme as readonly OperationInputInfo[]; + const inputScheme = (props.inputScheme ?? + []) as readonly OperationInputInfo[]; const { t } = useTranslation(); -- cgit v1.2.3 From 439b28b8950b3acd34d415ecca2476647cc226f1 Mon Sep 17 00:00:00 2001 From: crupest Date: Fri, 20 Nov 2020 20:56:59 +0800 Subject: ... --- FrontEnd/src/app/views/admin/UserAdmin.tsx | 8 ++++---- FrontEnd/src/app/views/common/OperationDialog.tsx | 13 +++---------- FrontEnd/src/app/views/home/TimelineCreateDialog.tsx | 2 +- FrontEnd/src/app/views/settings/index.tsx | 2 +- .../views/timeline-common/TimelinePropertyChangeDialog.tsx | 1 - FrontEnd/src/app/views/timeline/TimelineDeleteDialog.tsx | 2 +- FrontEnd/src/app/views/user/ChangeNicknameDialog.tsx | 1 - 7 files changed, 10 insertions(+), 19 deletions(-) (limited to 'FrontEnd/src/app/views/common') diff --git a/FrontEnd/src/app/views/admin/UserAdmin.tsx b/FrontEnd/src/app/views/admin/UserAdmin.tsx index 3cfd5880..948cbb25 100644 --- a/FrontEnd/src/app/views/admin/UserAdmin.tsx +++ b/FrontEnd/src/app/views/admin/UserAdmin.tsx @@ -34,7 +34,7 @@ const CreateUserDialog: React.FC> = ({ return ( ( 0{username}2 @@ -94,7 +94,7 @@ const UserModifyDialog: React.FC ( 0{oldUser.username}2 @@ -147,7 +147,7 @@ const UserPermissionModifyDialog: React.FC ( 0{username}2 diff --git a/FrontEnd/src/app/views/common/OperationDialog.tsx b/FrontEnd/src/app/views/common/OperationDialog.tsx index bca5cb87..77ed851f 100644 --- a/FrontEnd/src/app/views/common/OperationDialog.tsx +++ b/FrontEnd/src/app/views/common/OperationDialog.tsx @@ -99,7 +99,7 @@ export interface OperationDialogProps< open: boolean; close: () => void; title: I18nText | (() => React.ReactNode); - titleColor?: "default" | "dangerous" | "create" | string; + themeColor?: "danger" | "success" | string; onProcess: ( inputs: MapOperationInputInfoValueTypeList ) => Promise; @@ -313,7 +313,7 @@ const OperationDialog = < {t("operationDialog.cancel")} { @@ -362,14 +362,7 @@ const OperationDialog = < {title} diff --git a/FrontEnd/src/app/views/home/TimelineCreateDialog.tsx b/FrontEnd/src/app/views/home/TimelineCreateDialog.tsx index 786ebb5d..12bbfb54 100644 --- a/FrontEnd/src/app/views/home/TimelineCreateDialog.tsx +++ b/FrontEnd/src/app/views/home/TimelineCreateDialog.tsx @@ -18,7 +18,7 @@ const TimelineCreateDialog: React.FC = (props) => { = (props) => { return ( = (props) => { open={props.open} close={props.close} title="timeline.deleteDialog.title" - titleColor="danger" + themeColor="danger" inputPrompt={() => { return ( diff --git a/FrontEnd/src/app/views/user/ChangeNicknameDialog.tsx b/FrontEnd/src/app/views/user/ChangeNicknameDialog.tsx index 0e95b05b..f319ac37 100644 --- a/FrontEnd/src/app/views/user/ChangeNicknameDialog.tsx +++ b/FrontEnd/src/app/views/user/ChangeNicknameDialog.tsx @@ -13,7 +13,6 @@ const ChangeNicknameDialog: React.FC = (props) => {