Compare commits
1 Commits
main
...
45d2ab7bc4
| Author | SHA1 | Date | |
|---|---|---|---|
| 45d2ab7bc4 |
@@ -321,7 +321,11 @@ const EnrollmentsTab: React.FC<TabProps & { data: EnrollmentRecord[] }> = ({
|
|||||||
columns={columns}
|
columns={columns}
|
||||||
dataSource={data}
|
dataSource={data}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
pagination={{ pageSize: 15 }}
|
pagination={{
|
||||||
|
defaultPageSize: 15,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [15, 30, 50],
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
<Modal
|
<Modal
|
||||||
title="添加报读记录"
|
title="添加报读记录"
|
||||||
@@ -428,7 +432,11 @@ const ExamScoresTab: React.FC<TabProps & { data: ExamScoreRecord[]; enrollments:
|
|||||||
columns={columns}
|
columns={columns}
|
||||||
dataSource={data}
|
dataSource={data}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
pagination={{ pageSize: 15 }}
|
pagination={{
|
||||||
|
defaultPageSize: 15,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [15, 30, 50],
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
<Modal
|
<Modal
|
||||||
title="添加考试成绩"
|
title="添加考试成绩"
|
||||||
@@ -529,7 +537,11 @@ const LearningTab: React.FC<TabProps & { data: LearningRecord[] }> = ({ data, st
|
|||||||
columns={columns}
|
columns={columns}
|
||||||
dataSource={data}
|
dataSource={data}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
pagination={{ pageSize: 15 }}
|
pagination={{
|
||||||
|
defaultPageSize: 15,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [15, 30, 50],
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
<Modal
|
<Modal
|
||||||
title="添加学情记录"
|
title="添加学情记录"
|
||||||
@@ -712,7 +724,11 @@ const AttachmentsTab: React.FC<TabProps & { data: AttachmentRecord[] }> = ({ dat
|
|||||||
columns={columns}
|
columns={columns}
|
||||||
dataSource={data}
|
dataSource={data}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
pagination={{ pageSize: 15 }}
|
pagination={{
|
||||||
|
defaultPageSize: 15,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [15, 30, 50],
|
||||||
|
}}
|
||||||
style={{ marginTop: 16 }}
|
style={{ marginTop: 16 }}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -399,7 +399,12 @@ const BillsPage: React.FC = () => {
|
|||||||
dataSource={filteredBills}
|
dataSource={filteredBills}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
loading={loading}
|
loading={loading}
|
||||||
pagination={{ pageSize: 15, showTotal: (total) => `共 ${total} 条` }}
|
pagination={{
|
||||||
|
defaultPageSize: 15,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [15, 30, 50, 100],
|
||||||
|
showTotal: (total) => `共 ${total} 条`,
|
||||||
|
}}
|
||||||
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
||||||
rowSelection={{
|
rowSelection={{
|
||||||
selectedRowKeys: selectedRows,
|
selectedRowKeys: selectedRows,
|
||||||
|
|||||||
@@ -527,7 +527,11 @@ const ClassDetailPage: React.FC = () => {
|
|||||||
columns={studentColumns}
|
columns={studentColumns}
|
||||||
dataSource={students}
|
dataSource={students}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
pagination={{ pageSize: 20 }}
|
pagination={{
|
||||||
|
defaultPageSize: 20,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [20, 50, 100],
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
<Modal
|
<Modal
|
||||||
title="添加学员"
|
title="添加学员"
|
||||||
@@ -571,7 +575,11 @@ const ClassDetailPage: React.FC = () => {
|
|||||||
columns={teacherColumns}
|
columns={teacherColumns}
|
||||||
dataSource={teachers}
|
dataSource={teachers}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
pagination={{ pageSize: 20 }}
|
pagination={{
|
||||||
|
defaultPageSize: 20,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [20, 50, 100],
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
<Modal
|
<Modal
|
||||||
title="添加教师"
|
title="添加教师"
|
||||||
@@ -630,7 +638,11 @@ const ClassDetailPage: React.FC = () => {
|
|||||||
columns={scheduleColumns}
|
columns={scheduleColumns}
|
||||||
dataSource={schedules}
|
dataSource={schedules}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
pagination={{ pageSize: 20 }}
|
pagination={{
|
||||||
|
defaultPageSize: 20,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [20, 50, 100],
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -264,7 +264,11 @@ const ClassesPage: React.FC = () => {
|
|||||||
rowKey="id"
|
rowKey="id"
|
||||||
loading={loading}
|
loading={loading}
|
||||||
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
||||||
pagination={{ pageSize: 20 }}
|
pagination={{
|
||||||
|
defaultPageSize: 20,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [20, 50, 100],
|
||||||
|
}}
|
||||||
scroll={{ x: 1100 }}
|
scroll={{ x: 1100 }}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|||||||
@@ -436,7 +436,12 @@ const ClassroomRentalsPage: React.FC = () => {
|
|||||||
rowKey="id"
|
rowKey="id"
|
||||||
loading={loading}
|
loading={loading}
|
||||||
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
||||||
pagination={{ pageSize: 15, showTotal: (total) => `共 ${total} 条` }}
|
pagination={{
|
||||||
|
defaultPageSize: 15,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [15, 30, 50, 100],
|
||||||
|
showTotal: (total) => `共 ${total} 条`,
|
||||||
|
}}
|
||||||
scroll={{ x: 1200 }}
|
scroll={{ x: 1200 }}
|
||||||
/>
|
/>
|
||||||
<Modal
|
<Modal
|
||||||
|
|||||||
@@ -287,7 +287,12 @@ const ClassroomsPage: React.FC = () => {
|
|||||||
rowKey="id"
|
rowKey="id"
|
||||||
loading={loading}
|
loading={loading}
|
||||||
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
||||||
pagination={{ pageSize: 20, showTotal: (total) => `共 ${total} 条` }}
|
pagination={{
|
||||||
|
defaultPageSize: 20,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [20, 50, 100],
|
||||||
|
showTotal: (total) => `共 ${total} 条`,
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
<Modal
|
<Modal
|
||||||
title={editing ? '编辑教室' : '添加教室'}
|
title={editing ? '编辑教室' : '添加教室'}
|
||||||
|
|||||||
@@ -318,7 +318,12 @@ const DepositsPage: React.FC = () => {
|
|||||||
rowKey="id"
|
rowKey="id"
|
||||||
loading={loading}
|
loading={loading}
|
||||||
scroll={{ x: 1200 }}
|
scroll={{ x: 1200 }}
|
||||||
pagination={{ pageSize: 15, showTotal: (total) => `共 ${total} 条` }}
|
pagination={{
|
||||||
|
defaultPageSize: 15,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [15, 30, 50, 100],
|
||||||
|
showTotal: (total) => `共 ${total} 条`,
|
||||||
|
}}
|
||||||
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|||||||
@@ -452,7 +452,12 @@ const ExpensesPage: React.FC = () => {
|
|||||||
rowKey="id"
|
rowKey="id"
|
||||||
loading={loading}
|
loading={loading}
|
||||||
scroll={{ x: 1200 }}
|
scroll={{ x: 1200 }}
|
||||||
pagination={{ pageSize: 15, showTotal: (total) => `共 ${total} 条` }}
|
pagination={{
|
||||||
|
defaultPageSize: 15,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [15, 30, 50, 100],
|
||||||
|
showTotal: (total) => `共 ${total} 条`,
|
||||||
|
}}
|
||||||
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
||||||
rowSelection={{
|
rowSelection={{
|
||||||
selectedRowKeys: selectedRoomKeys,
|
selectedRowKeys: selectedRoomKeys,
|
||||||
@@ -575,7 +580,12 @@ const ExpensesPage: React.FC = () => {
|
|||||||
rowKey="id"
|
rowKey="id"
|
||||||
loading={loading}
|
loading={loading}
|
||||||
scroll={{ x: 1200 }}
|
scroll={{ x: 1200 }}
|
||||||
pagination={{ pageSize: 15, showTotal: (total) => `共 ${total} 条` }}
|
pagination={{
|
||||||
|
defaultPageSize: 15,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [15, 30, 50, 100],
|
||||||
|
showTotal: (total) => `共 ${total} 条`,
|
||||||
|
}}
|
||||||
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
||||||
rowSelection={{
|
rowSelection={{
|
||||||
selectedRowKeys: selectedPersonalKeys,
|
selectedRowKeys: selectedPersonalKeys,
|
||||||
|
|||||||
@@ -495,7 +495,12 @@ const OccupanciesPage: React.FC = () => {
|
|||||||
loading={loading}
|
loading={loading}
|
||||||
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
||||||
scroll={{ x: 1300 }}
|
scroll={{ x: 1300 }}
|
||||||
pagination={{ pageSize: 15, showTotal: (total) => `共 ${total} 条` }}
|
pagination={{
|
||||||
|
defaultPageSize: 15,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [15, 30, 50, 100],
|
||||||
|
showTotal: (total) => `共 ${total} 条`,
|
||||||
|
}}
|
||||||
rowSelection={rowSelection}
|
rowSelection={rowSelection}
|
||||||
/>
|
/>
|
||||||
<Modal
|
<Modal
|
||||||
|
|||||||
@@ -26,13 +26,14 @@ const OperationLogsPage: React.FC = () => {
|
|||||||
const [total, setTotal] = useState(0);
|
const [total, setTotal] = useState(0);
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const [page, setPage] = useState(1);
|
const [page, setPage] = useState(1);
|
||||||
|
const [pageSize, setPageSize] = useState(20);
|
||||||
const [filterModule, setFilterModule] = useState<string | undefined>();
|
const [filterModule, setFilterModule] = useState<string | undefined>();
|
||||||
const [dateRange, setDateRange] = useState<[string, string] | null>(null);
|
const [dateRange, setDateRange] = useState<[string, string] | null>(null);
|
||||||
|
|
||||||
const fetchData = useCallback(async () => {
|
const fetchData = useCallback(async () => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
try {
|
try {
|
||||||
const params: any = { page, pageSize: 20 };
|
const params: any = { page, pageSize };
|
||||||
if (filterModule) params.module = filterModule;
|
if (filterModule) params.module = filterModule;
|
||||||
if (dateRange) {
|
if (dateRange) {
|
||||||
params.startDate = dateRange[0];
|
params.startDate = dateRange[0];
|
||||||
@@ -46,7 +47,7 @@ const OperationLogsPage: React.FC = () => {
|
|||||||
message.error(err?.message || '加载失败,请稍后重试');
|
message.error(err?.message || '加载失败,请稍后重试');
|
||||||
}
|
}
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}, [page, filterModule, dateRange]);
|
}, [page, pageSize, filterModule, dateRange]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetchData();
|
fetchData();
|
||||||
@@ -159,8 +160,13 @@ const OperationLogsPage: React.FC = () => {
|
|||||||
pagination={{
|
pagination={{
|
||||||
current: page,
|
current: page,
|
||||||
total,
|
total,
|
||||||
pageSize: 20,
|
pageSize,
|
||||||
onChange: setPage,
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [20, 50, 100],
|
||||||
|
onChange: (nextPage, nextPageSize) => {
|
||||||
|
setPage(nextPage);
|
||||||
|
setPageSize(nextPageSize);
|
||||||
|
},
|
||||||
showTotal: (t) => `共 ${t} 条`,
|
showTotal: (t) => `共 ${t} 条`,
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -235,7 +235,12 @@ const OrganizationsPage: React.FC = () => {
|
|||||||
loading={loading}
|
loading={loading}
|
||||||
locale={{ emptyText: <Empty description="暂无机构" /> }}
|
locale={{ emptyText: <Empty description="暂无机构" /> }}
|
||||||
scroll={{ x: 1100 }}
|
scroll={{ x: 1100 }}
|
||||||
pagination={{ pageSize: 20, showTotal: (total) => `共 ${total} 个机构` }}
|
pagination={{
|
||||||
|
defaultPageSize: 20,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [20, 50, 100],
|
||||||
|
showTotal: (total) => `共 ${total} 个机构`,
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
<Modal
|
<Modal
|
||||||
title={editing ? `编辑机构 · ${editing.name}` : '添加外部机构'}
|
title={editing ? `编辑机构 · ${editing.name}` : '添加外部机构'}
|
||||||
|
|||||||
@@ -519,7 +519,12 @@ const RoomsPage: React.FC = () => {
|
|||||||
scroll={{ x: 1200 }}
|
scroll={{ x: 1200 }}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
||||||
pagination={{ pageSize: 20, showTotal: (total) => `共 ${total} 间` }}
|
pagination={{
|
||||||
|
defaultPageSize: 20,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [20, 50, 100],
|
||||||
|
showTotal: (total) => `共 ${total} 间`,
|
||||||
|
}}
|
||||||
rowClassName={(record) => (record.status === 'archived' ? 'archived-row' : '')}
|
rowClassName={(record) => (record.status === 'archived' ? 'archived-row' : '')}
|
||||||
rowSelection={{
|
rowSelection={{
|
||||||
selectedRowKeys,
|
selectedRowKeys,
|
||||||
|
|||||||
@@ -577,7 +577,12 @@ const StudentsPage: React.FC = () => {
|
|||||||
loading={loading}
|
loading={loading}
|
||||||
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
locale={{ emptyText: <Empty description="暂无数据" /> }}
|
||||||
scroll={{ x: 1410 }}
|
scroll={{ x: 1410 }}
|
||||||
pagination={{ pageSize: 15, showTotal: (total) => `共 ${total} 人` }}
|
pagination={{
|
||||||
|
defaultPageSize: 15,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [15, 30, 50, 100],
|
||||||
|
showTotal: (total) => `共 ${total} 人`,
|
||||||
|
}}
|
||||||
rowClassName={(record: any) => (record.status === 'archived' ? 'archived-row' : '')}
|
rowClassName={(record: any) => (record.status === 'archived' ? 'archived-row' : '')}
|
||||||
rowSelection={{
|
rowSelection={{
|
||||||
selectedRowKeys,
|
selectedRowKeys,
|
||||||
|
|||||||
@@ -146,7 +146,12 @@ const TeacherWorkspacePage: React.FC = () => {
|
|||||||
columns={classColumns}
|
columns={classColumns}
|
||||||
dataSource={data.assignedClasses}
|
dataSource={data.assignedClasses}
|
||||||
rowKey="classId"
|
rowKey="classId"
|
||||||
pagination={{ pageSize: 20, showTotal: (total) => `共 ${total} 个班级` }}
|
pagination={{
|
||||||
|
defaultPageSize: 20,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [20, 50, 100],
|
||||||
|
showTotal: (total) => `共 ${total} 个班级`,
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<Empty description="暂无分配的班级" />
|
<Empty description="暂无分配的班级" />
|
||||||
@@ -160,7 +165,12 @@ const TeacherWorkspacePage: React.FC = () => {
|
|||||||
columns={scheduleColumns}
|
columns={scheduleColumns}
|
||||||
dataSource={data.todaySchedules}
|
dataSource={data.todaySchedules}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
pagination={{ pageSize: 20, showTotal: (total) => `共 ${total} 节` }}
|
pagination={{
|
||||||
|
defaultPageSize: 20,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [20, 50, 100],
|
||||||
|
showTotal: (total) => `共 ${total} 节`,
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<Empty description="今日无排课" />
|
<Empty description="今日无排课" />
|
||||||
@@ -174,7 +184,12 @@ const TeacherWorkspacePage: React.FC = () => {
|
|||||||
columns={studentColumns}
|
columns={studentColumns}
|
||||||
dataSource={data.myStudents}
|
dataSource={data.myStudents}
|
||||||
rowKey="studentId"
|
rowKey="studentId"
|
||||||
pagination={{ pageSize: 20, showTotal: (total) => `共 ${total} 人` }}
|
pagination={{
|
||||||
|
defaultPageSize: 20,
|
||||||
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [20, 50, 100],
|
||||||
|
showTotal: (total) => `共 ${total} 人`,
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<Empty description="暂无学生" />
|
<Empty description="暂无学生" />
|
||||||
|
|||||||
@@ -46,13 +46,14 @@ const ROLE_TYPE_LABELS: Record<string, string> = {
|
|||||||
academic_teacher: '教务老师',
|
academic_teacher: '教务老师',
|
||||||
};
|
};
|
||||||
|
|
||||||
const PAGE_SIZE = 20;
|
const DEFAULT_PAGE_SIZE = 20;
|
||||||
|
|
||||||
const TeachersPage: React.FC = () => {
|
const TeachersPage: React.FC = () => {
|
||||||
const [data, setData] = useState<TeacherRow[]>([]);
|
const [data, setData] = useState<TeacherRow[]>([]);
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const [total, setTotal] = useState(0);
|
const [total, setTotal] = useState(0);
|
||||||
const [page, setPage] = useState(1);
|
const [page, setPage] = useState(1);
|
||||||
|
const [pageSize, setPageSize] = useState(DEFAULT_PAGE_SIZE);
|
||||||
const [search, setSearch] = useState('');
|
const [search, setSearch] = useState('');
|
||||||
const [profileModal, setProfileModal] = useState<TeacherRow | null>(null);
|
const [profileModal, setProfileModal] = useState<TeacherRow | null>(null);
|
||||||
const [form] = Form.useForm<ProfileFormValues>();
|
const [form] = Form.useForm<ProfileFormValues>();
|
||||||
@@ -62,7 +63,7 @@ const TeachersPage: React.FC = () => {
|
|||||||
setLoading(true);
|
setLoading(true);
|
||||||
try {
|
try {
|
||||||
const res = await api.get<TeacherListResponse>('/rbac/teachers', {
|
const res = await api.get<TeacherListResponse>('/rbac/teachers', {
|
||||||
params: { search: search || undefined, page, pageSize: PAGE_SIZE },
|
params: { search: search || undefined, page, pageSize },
|
||||||
});
|
});
|
||||||
setData(res.list);
|
setData(res.list);
|
||||||
setTotal(res.total);
|
setTotal(res.total);
|
||||||
@@ -70,7 +71,7 @@ const TeachersPage: React.FC = () => {
|
|||||||
// silent
|
// silent
|
||||||
}
|
}
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}, [page, search]);
|
}, [page, pageSize, search]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetchData();
|
fetchData();
|
||||||
@@ -199,9 +200,14 @@ const TeachersPage: React.FC = () => {
|
|||||||
scroll={{ x: 1300 }}
|
scroll={{ x: 1300 }}
|
||||||
pagination={{
|
pagination={{
|
||||||
current: page,
|
current: page,
|
||||||
pageSize: PAGE_SIZE,
|
pageSize,
|
||||||
total,
|
total,
|
||||||
onChange: setPage,
|
showSizeChanger: true,
|
||||||
|
pageSizeOptions: [20, 50, 100],
|
||||||
|
onChange: (nextPage, nextPageSize) => {
|
||||||
|
setPage(nextPage);
|
||||||
|
setPageSize(nextPageSize);
|
||||||
|
},
|
||||||
showTotal: (t) => `共 ${t} 人`,
|
showTotal: (t) => `共 ${t} 人`,
|
||||||
}}
|
}}
|
||||||
expandable={{
|
expandable={{
|
||||||
|
|||||||
Reference in New Issue
Block a user