This commit is contained in:
rgrgogu
2026-05-06 19:04:04 +08:00
parent f165e8b3bb
commit 95f838376e
19 changed files with 1035 additions and 87 deletions
+45 -32
View File
@@ -1,8 +1,9 @@
import { useMemo, useRef } from "react";
import { useMemo, useRef, useState } from "react";
import { useNavigate } from "react-router-dom";
import { useUsers } from "@/contexts/AdminUserContext";
import DataTable from "@/components/generic/Table/DataTable";
import { ArchiveUserDialog } from "./ArchiveUserDialog";
import { FilterSheet } from "@/components/generic/Sheet/FilterSheet";
import { buildUserColumns, columnPinning } from "../config/columns.config";
@@ -13,9 +14,10 @@ import { buildRowActions } from "../config/rowActions.config";
import { getTimestamp } from "@/utils/timestamp.util";
export default function UsersTable() {
const navigate = useNavigate();
const [archiveTarget, setArchiveTarget] = useState(null);
const tableRefsRef = useRef({ getFilters: () => [], getSort: () => [] });
const navigate = useNavigate();
const {
users,
attributes,
@@ -24,7 +26,7 @@ export default function UsersTable() {
loading,
fetchUsers,
fetchUserFieldValues,
deactivateUser,
deactivateUser
} = useUsers();
// Shared export config — passed into toolbar + selection configs
@@ -35,7 +37,7 @@ export default function UsersTable() {
sheetName: "Users",
};
const rowActions = buildRowActions({ navigate, deactivateUser });
const rowActions = buildRowActions({ navigate, onArchive: (row) => setArchiveTarget(row) });
const toolbarActions = buildToolbarActions({
fetchUsers, pagination, exportConfig, navigate,
getFilters: () => tableRefsRef.current.getFilters(),
@@ -45,32 +47,43 @@ export default function UsersTable() {
const columns = useMemo(() => buildUserColumns(attributes, rowActions), [attributes]);
return (
<DataTable
title="Users"
data={users}
columns={columns}
attributes={attributes}
pagination={pagination}
setPagination={setPagination}
loading={loading}
onFetch={fetchUsers}
onFetchFilterData={fetchUserFieldValues}
onRefsReady={(refs) => tableRefsRef.current = refs}
renderFilterSheet={({ open, onOpenChange, column, attr, data, loading }) => (
<FilterSheet
open={open}
onOpenChange={onOpenChange}
column={column}
attr={attr}
data={data}
loading={loading}
/>
)}
columnPinning={columnPinning}
toolbarActions={toolbarActions}
selectionActions={selectionActions}
recordLabel="user"
emptyMessage="No users match the current filters."
/>
<>
<DataTable
title="Users"
data={users}
columns={columns}
attributes={attributes}
pagination={pagination}
setPagination={setPagination}
loading={loading}
onFetch={fetchUsers}
onFetchFilterData={fetchUserFieldValues}
onRefsReady={(refs) => tableRefsRef.current = refs}
renderFilterSheet={({ open, onOpenChange, column, attr, data, loading }) => (
<FilterSheet
open={open}
onOpenChange={onOpenChange}
column={column}
attr={attr}
data={data}
loading={loading}
/>
)}
columnPinning={columnPinning}
toolbarActions={toolbarActions}
selectionActions={selectionActions}
recordLabel="user"
emptyMessage="No users match the current filters."
/>
<ArchiveUserDialog
open={!!archiveTarget}
onOpenChange={(v) => !v && setArchiveTarget(null)}
user={archiveTarget}
onSuccess={() => {
setArchiveTarget(null);
fetchUsers({ page: 1, limit: pagination.limit });
}}
/>
</>
);
}