style(web): translate the comments in the src/views directory into English
This commit is contained in:
@@ -1,3 +1,15 @@
|
||||
/*
|
||||
* @Author: ZhaoYing
|
||||
* @Date: 2026-02-03 16:42:17
|
||||
* @Last Modified by: ZhaoYing
|
||||
* @Last Modified time: 2026-02-03 16:42:17
|
||||
*/
|
||||
/**
|
||||
* Member Modal
|
||||
* Modal for inviting new members or editing existing member roles
|
||||
* Generates invitation links for new members
|
||||
*/
|
||||
|
||||
import { forwardRef, useImperativeHandle, useState } from 'react';
|
||||
import { Form, Input, Select, Modal, App } from 'antd';
|
||||
import type { SelectProps } from 'antd';
|
||||
@@ -12,10 +24,17 @@ const FormItem = Form.Item;
|
||||
const { Option } = Select;
|
||||
type LabelRender = SelectProps['labelRender'];
|
||||
|
||||
/**
|
||||
* Component props
|
||||
*/
|
||||
interface MemberModalProps {
|
||||
/** Callback to refresh member list */
|
||||
refreshTable: () => void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modal for member invitation and editing
|
||||
*/
|
||||
const MemberModal = forwardRef<MemberModalRef, MemberModalProps>(({
|
||||
refreshTable
|
||||
}, ref) => {
|
||||
@@ -36,7 +55,7 @@ const MemberModal = forwardRef<MemberModalRef, MemberModalProps>(({
|
||||
]
|
||||
const values: MemberModalData = Form.useWatch([], form);
|
||||
|
||||
// 封装取消方法,添加关闭弹窗逻辑
|
||||
/** Close modal and reset form */
|
||||
const handleClose = () => {
|
||||
setVisible(false);
|
||||
setEditingUser(null);
|
||||
@@ -44,10 +63,11 @@ const MemberModal = forwardRef<MemberModalRef, MemberModalProps>(({
|
||||
setLoading(false)
|
||||
};
|
||||
|
||||
/** Open modal with optional member data for editing */
|
||||
const handleOpen = (member?: Member | null) => {
|
||||
if (member) {
|
||||
setEditingUser(member);
|
||||
// 设置表单值
|
||||
// Set form values
|
||||
form.setFieldsValue({
|
||||
email: member.account,
|
||||
role: member.role
|
||||
@@ -57,7 +77,7 @@ const MemberModal = forwardRef<MemberModalRef, MemberModalProps>(({
|
||||
}
|
||||
setVisible(true);
|
||||
};
|
||||
// 封装保存方法,添加提交逻辑
|
||||
/** Save member (invite or update) */
|
||||
const handleSave = () => {
|
||||
form
|
||||
.validateFields()
|
||||
@@ -100,11 +120,12 @@ const MemberModal = forwardRef<MemberModalRef, MemberModalProps>(({
|
||||
});
|
||||
}
|
||||
|
||||
// 暴露给父组件的方法
|
||||
/** Expose methods to parent component */
|
||||
useImperativeHandle(ref, () => ({
|
||||
handleOpen,
|
||||
handleClose
|
||||
}));
|
||||
/** Custom label renderer for role select */
|
||||
const labelRender: LabelRender = (props) => {
|
||||
const { label, value } = props;
|
||||
|
||||
|
||||
@@ -1,35 +1,49 @@
|
||||
/*
|
||||
* @Author: ZhaoYing
|
||||
* @Date: 2026-02-03 16:42:12
|
||||
* @Last Modified by: ZhaoYing
|
||||
* @Last Modified time: 2026-02-03 16:42:12
|
||||
*/
|
||||
/**
|
||||
* Member Management Page
|
||||
* Manages workspace members with invite, edit, and delete functionality
|
||||
*/
|
||||
|
||||
import React, { useRef } from 'react';
|
||||
import { App, Button, Space } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import type { ColumnsType } from 'antd/es/table';
|
||||
import type { AnyObject } from 'antd/es/_util/type';
|
||||
import { deleteMember, memberListUrl } from '@/api/member';
|
||||
|
||||
import { deleteMember, memberListUrl } from '@/api/member';
|
||||
import MemberModal from './components/MemberModal';
|
||||
import type { Member, MemberModalRef } from './types'
|
||||
import Tag from '@/components/Tag';
|
||||
import Table, { type TableRef } from '@/components/Table'
|
||||
import { formatDateTime } from '@/utils/format';
|
||||
|
||||
/**
|
||||
* Member management main component
|
||||
*/
|
||||
const MemberManagement: React.FC = () => {
|
||||
const { t } = useTranslation();
|
||||
const { message, modal } = App.useApp();
|
||||
const memberFormRef = useRef<MemberModalRef>(null);
|
||||
const tableRef = useRef<TableRef>(null);
|
||||
|
||||
// 打开新增用户弹窗
|
||||
/** Open member modal for create or edit */
|
||||
const handleEdit = (member?: Member) => {
|
||||
if (memberFormRef.current) {
|
||||
memberFormRef.current.handleOpen(member);
|
||||
}
|
||||
}
|
||||
|
||||
// 刷新列表数据
|
||||
/** Refresh member list */
|
||||
const refreshTable = () => {
|
||||
tableRef.current?.loadData()
|
||||
}
|
||||
|
||||
// 单个删除用户
|
||||
/** Delete member with confirmation */
|
||||
const handleDelete = async (member: Member) => {
|
||||
modal.confirm({
|
||||
title: t('common.confirmDeleteDesc', { name: member.username }),
|
||||
@@ -46,7 +60,7 @@ const MemberManagement: React.FC = () => {
|
||||
})
|
||||
};
|
||||
|
||||
// 表格列配置
|
||||
/** Table column configuration */
|
||||
const columns: ColumnsType = [
|
||||
{
|
||||
title: t('member.username'),
|
||||
|
||||
@@ -1,17 +1,43 @@
|
||||
// 用户数据类型
|
||||
/*
|
||||
* @Author: ZhaoYing
|
||||
* @Date: 2026-02-03 16:42:00
|
||||
* @Last Modified by: ZhaoYing
|
||||
* @Last Modified time: 2026-02-03 16:42:00
|
||||
*/
|
||||
/**
|
||||
* Type definitions for Member Management
|
||||
*/
|
||||
|
||||
/**
|
||||
* Member data structure
|
||||
*/
|
||||
export interface Member {
|
||||
/** Member ID */
|
||||
id: string;
|
||||
/** Member username */
|
||||
username: string;
|
||||
/** Member account (email) */
|
||||
account: string;
|
||||
/** Member role */
|
||||
role: string;
|
||||
/** Last login timestamp */
|
||||
last_login_at: string | number;
|
||||
}
|
||||
// 用户表单数据类型
|
||||
|
||||
/**
|
||||
* Member invitation/edit form data
|
||||
*/
|
||||
export interface MemberModalData {
|
||||
/** Member email address */
|
||||
email: string;
|
||||
/** Member role */
|
||||
role: string;
|
||||
}
|
||||
// 定义组件暴露的方法接口
|
||||
|
||||
/**
|
||||
* Member modal ref interface
|
||||
*/
|
||||
export interface MemberModalRef {
|
||||
/** Open modal with optional member data for editing */
|
||||
handleOpen: (user?: Member | null) => void;
|
||||
}
|
||||
Reference in New Issue
Block a user