fix(mui): review fixes — Select string contract, DataTable aria-sort, sx/page-clamp/dev-warn

Select value/option restricted to string (MUI sets the literal child value; string|number + onChange:string was a type lie). DataTable sortDirection uses ?? 'asc' so aria-sort is never undefined on the active column. StatusChip sx-merge drops undefined; Pagination clamps page into range; DataTable dev-warns on sortKey without onSort; Alert onClose JSDoc.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
BOHA
2026-06-06 21:34:15 +02:00
parent 9aa90ff5f4
commit 1398d4b4dc
5 changed files with 12 additions and 6 deletions

View File

@@ -1,7 +1,10 @@
import type { ReactNode } from "react";
import MuiAlert from "@mui/material/Alert";
/** Inline contextual alert (form/section feedback) — distinct from the global toast. */
/**
* Inline contextual alert (form/section feedback) — distinct from the global toast.
* `onClose` is simplified to take no arguments (MUI's close SyntheticEvent is omitted).
*/
export default function Alert({
severity = "info",
children,

View File

@@ -43,6 +43,9 @@ export default function DataTable<T>({
sortDir,
onSort,
}: DataTableProps<T>) {
if (import.meta.env.DEV && columns.some((c) => c.sortKey) && !onSort) {
console.warn("DataTable: columns with sortKey require an onSort prop.");
}
if (rows.length === 0 && empty) return <>{empty}</>;
return (
<TableContainer sx={{ borderRadius: 2 }}>
@@ -54,7 +57,7 @@ export default function DataTable<T>({
key={c.key}
align={c.align}
sortDirection={
c.sortKey && sortBy === c.sortKey ? sortDir : false
c.sortKey && sortBy === c.sortKey ? (sortDir ?? "asc") : false
}
sx={{
textTransform: "uppercase",

View File

@@ -15,7 +15,7 @@ export default function Pagination({
return (
<Box sx={{ display: "flex", justifyContent: "center", mt: 2 }}>
<MuiPagination
page={page}
page={Math.min(Math.max(page, 1), pageCount)}
count={pageCount}
onChange={(_, p) => onChange(p)}
color="primary"

View File

@@ -2,12 +2,12 @@ import MuiTextField, { type TextFieldProps } from "@mui/material/TextField";
import MenuItem from "@mui/material/MenuItem";
export interface SelectOption {
value: string | number;
value: string;
label: string;
}
type SelectProps = Omit<TextFieldProps, "onChange" | "select" | "value"> & {
value: string | number;
value: string;
onChange: (value: string) => void;
options?: SelectOption[];
};

View File

@@ -19,7 +19,7 @@ export default function StatusChip({
onClick={onClick}
sx={[
{ fontWeight: 600, ...(onClick ? { cursor: "pointer" } : {}) },
...(Array.isArray(sx) ? sx : [sx]),
...(Array.isArray(sx) ? sx : sx ? [sx] : []),
]}
{...props}
/>