diff --git a/job-tracker-ui/src/admin-users-page.test.tsx b/job-tracker-ui/src/admin-users-page.test.tsx index 47b3c6b..c58cd98 100644 --- a/job-tracker-ui/src/admin-users-page.test.tsx +++ b/job-tracker-ui/src/admin-users-page.test.tsx @@ -55,6 +55,15 @@ beforeEach(() => { function held() { let resolve!: (value: T) => void; const promise=new Promise(yes => { resolve=yes; }); return { promise, resolve }; } function createDraft(email='new@example.test') { fireEvent.change(screen.getByLabelText('Email'), { target: { value: email } }); fireEvent.change(screen.getByLabelText('New password'), { target: { value: 'TestPassword123!' } }); } +test.each([['en', 'Rows per page:'], ['nb', 'Rader per side:']])('desktop user-grid pagination follows %s UI language', async (language, label) => { + window.localStorage.setItem('uiLanguage', language); + (window.matchMedia as jest.Mock).mockImplementation(() => ({ matches: false, addEventListener: jest.fn(), removeEventListener: jest.fn(), addListener: jest.fn(), removeListener: jest.fn() })); + renderPage([{ id: 'locale-user', email: 'locale@example.test', roles: [], emailConfirmed: true, isCurrentUser: false, canRemoveAdmin: true }]); + expect(await screen.findByText(label)).toBeInTheDocument(); + expect(screen.getByLabelText(label)).toHaveTextContent('10'); + expect(mockedApi.get).toHaveBeenCalledTimes(1); +}); + test('failed users read stays unavailable and Retry only reads', async () => { mockedApi.get.mockRejectedValueOnce(new Error('offline')); renderPage([]); const retry=await screen.findByRole('button', { name: 'Retry' }); diff --git a/job-tracker-ui/src/views/AdminUsersPage.tsx b/job-tracker-ui/src/views/AdminUsersPage.tsx index f18e88d..c896693 100644 --- a/job-tracker-ui/src/views/AdminUsersPage.tsx +++ b/job-tracker-ui/src/views/AdminUsersPage.tsx @@ -15,6 +15,7 @@ import { } from "@mui/material"; import useMediaQuery from "@mui/material/useMediaQuery"; import { DataGrid, GridColDef } from "@mui/x-data-grid"; +import { nbNO } from "@mui/x-data-grid/locales"; import { api, getApiErrorMessage } from "../api"; import { useToast } from "../toast"; @@ -39,7 +40,7 @@ export default function AdminUsersPage() { const isMobile = useMediaQuery("(max-width:767.95px)"); const { toast } = useToast(); const { confirmAction } = useDialogActions(); - const { t } = useI18n(); + const { t, language } = useI18n(); const [busy, setBusy] = useState(false); const owner = useRef({ mounted: true, generation: 0, busy: false }); const body = useRef(null); @@ -293,6 +294,7 @@ export default function AdminUsersPage() { ) : ( "auto"} rows={rows}