diff --git a/src/features/host-org/components/SalaryWalletControls.jsx b/src/features/host-org/components/SalaryWalletControls.jsx index 3e28e95..eb65851 100644 --- a/src/features/host-org/components/SalaryWalletControls.jsx +++ b/src/features/host-org/components/SalaryWalletControls.jsx @@ -71,7 +71,6 @@ const historyColumns = [ export function SalaryWalletCell({ role, userId, userLabel, wallet }) { const [open, setOpen] = useState(false); const balance = Number(wallet?.availableAmount || 0); - const assetType = wallet?.assetType || salaryWalletAssetType(role); return ( <> @@ -81,7 +80,6 @@ export function SalaryWalletCell({ role, userId, userLabel, wallet }) { onClick={() => setOpen(true)} > {formatSalaryWalletAmount(balance)} - {assetType || "-"} - + - @@ -260,7 +257,6 @@ function SalaryWalletHistoryDrawer({ onClose, open, role, userId, userLabel }) {
{salaryWalletRoleLabel(role)} - {salaryWalletAssetType(role) || "-"}
column.width).join(" "); + const tableContentWidth = `${Math.ceil( + preparedColumns.reduce((total, column) => total + readMinWidth(column.width), 0) + )}px`; const activeFilterColumn = preparedColumns.find((column) => column.key === filterMenu.columnKey && column.filter) || null; const activeFilter = activeFilterColumn?.filter || null; const activeFilterIsText = activeFilter?.type === "text"; @@ -267,7 +270,11 @@ export function DataTable({
{preparedColumns.map((column, index) => { diff --git a/src/shared/ui/DataTable.timezone.test.jsx b/src/shared/ui/DataTable.timezone.test.jsx index dfe7c31..930c93a 100644 --- a/src/shared/ui/DataTable.timezone.test.jsx +++ b/src/shared/ui/DataTable.timezone.test.jsx @@ -61,6 +61,22 @@ test("only shows the table filter reset action when filters are active", () => { expect(screen.getByRole("button", { name: "重置筛选" })).toBeInTheDocument(); }); +test("expands table background to the minimum width required by columns", () => { + const columns = [ + { key: "user", label: "用户", width: "minmax(220px, 1fr)" }, + { key: "createdAt", label: "创建时间", width: "minmax(180px, 1fr)" }, + { key: "actions", label: "操作" } + ]; + + render( + + item.id} /> + + ); + + expect(document.querySelector(".admin-table")?.style.getPropertyValue("--admin-table-content-width")).toBe("512px"); +}); + function TimezoneTableFixture() { const { setTimeZone } = useTimeZone(); const columns = [ diff --git a/src/shared/ui/ToastProvider.jsx b/src/shared/ui/ToastProvider.jsx index 474cd89..8e33624 100644 --- a/src/shared/ui/ToastProvider.jsx +++ b/src/shared/ui/ToastProvider.jsx @@ -8,7 +8,7 @@ export function ToastProvider({ children }) { const [toast, setToast] = useState(null); const showToast = useCallback((message, severity = "info") => { - setToast({ message, severity }); + setToast(normalizeToast(message, severity)); }, []); const value = useMemo(() => ({ showToast }), [showToast]); @@ -39,3 +39,16 @@ export function useToast() { } return context; } + +function normalizeToast(message, severity) { + if (message && typeof message === "object") { + return { + message: String(message.message || "操作失败"), + severity: message.severity || severity || "info" + }; + } + return { + message: String(message || "操作失败"), + severity: severity || "info" + }; +} diff --git a/src/shared/ui/ToastProvider.test.jsx b/src/shared/ui/ToastProvider.test.jsx new file mode 100644 index 0000000..66bd615 --- /dev/null +++ b/src/shared/ui/ToastProvider.test.jsx @@ -0,0 +1,36 @@ +import { fireEvent, render, screen } from "@testing-library/react"; +import { expect, test } from "vitest"; +import { ToastProvider, useToast } from "./ToastProvider.jsx"; + +function ToastTrigger({ payload, severity }) { + const { showToast } = useToast(); + return ( + + ); +} + +test("renders object-style toast payloads as text", () => { + render( + + + , + ); + + fireEvent.click(screen.getByRole("button", { name: "show" })); + + expect(screen.getByText("工资结算失败")).toBeInTheDocument(); +}); + +test("keeps tuple-style toast payloads working", () => { + render( + + + , + ); + + fireEvent.click(screen.getByRole("button", { name: "show" })); + + expect(screen.getByText("区域已更新")).toBeInTheDocument(); +}); diff --git a/src/styles/shared-ui.css b/src/styles/shared-ui.css index b47ce13..fafc1e3 100644 --- a/src/styles/shared-ui.css +++ b/src/styles/shared-ui.css @@ -1546,9 +1546,9 @@ --admin-table-cell-x: var(--space-3); display: flex; flex-direction: column; - width: max(100%, var(--admin-table-min-width, 900px)); + width: max(100%, var(--admin-table-min-width, 900px), var(--admin-table-content-width, 0px)); min-height: 100%; - min-width: max(100%, var(--admin-table-min-width, 900px)); + min-width: max(100%, var(--admin-table-min-width, 900px), var(--admin-table-content-width, 0px)); } .admin-row {