{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 {