mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Add common DateTimeCell for tables
This commit is contained in:
parent
bd92527529
commit
5262c9bee6
5 changed files with 35 additions and 15 deletions
17
src/apps/dashboard/components/table/DateTimeCell.tsx
Normal file
17
src/apps/dashboard/components/table/DateTimeCell.tsx
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
import format from 'date-fns/format';
|
||||||
|
import type { MRT_Cell, MRT_RowData } from 'material-react-table';
|
||||||
|
import { FC } from 'react';
|
||||||
|
|
||||||
|
import { useLocale } from 'hooks/useLocale';
|
||||||
|
|
||||||
|
interface CellProps {
|
||||||
|
cell: MRT_Cell<MRT_RowData>
|
||||||
|
}
|
||||||
|
|
||||||
|
const DateTimeCell: FC<CellProps> = ({ cell }) => {
|
||||||
|
const { dateFnsLocale } = useLocale();
|
||||||
|
|
||||||
|
return format(cell.getValue<Date>(), 'Pp', { locale: dateFnsLocale });
|
||||||
|
};
|
||||||
|
|
||||||
|
export default DateTimeCell;
|
|
@ -1,3 +1,4 @@
|
||||||
|
import parseISO from 'date-fns/parseISO';
|
||||||
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
||||||
import type { ActivityLogEntry } from '@jellyfin/sdk/lib/generated-client/models/activity-log-entry';
|
import type { ActivityLogEntry } from '@jellyfin/sdk/lib/generated-client/models/activity-log-entry';
|
||||||
import { LogLevel } from '@jellyfin/sdk/lib/generated-client/models/log-level';
|
import { LogLevel } from '@jellyfin/sdk/lib/generated-client/models/log-level';
|
||||||
|
@ -6,7 +7,8 @@ import ToggleButtonGroup from '@mui/material/ToggleButtonGroup';
|
||||||
import { type MRT_ColumnDef, useMaterialReactTable } from 'material-react-table';
|
import { type MRT_ColumnDef, useMaterialReactTable } from 'material-react-table';
|
||||||
import { useSearchParams } from 'react-router-dom';
|
import { useSearchParams } from 'react-router-dom';
|
||||||
|
|
||||||
import TablePage, { DEFAULT_TABLE_OPTIONS } from 'apps/dashboard/components/TablePage';
|
import DateTimeCell from 'apps/dashboard/components/table/DateTimeCell';
|
||||||
|
import TablePage, { DEFAULT_TABLE_OPTIONS } from 'apps/dashboard/components/table/TablePage';
|
||||||
import { useLogEntries } from 'apps/dashboard/features/activity/api/useLogEntries';
|
import { useLogEntries } from 'apps/dashboard/features/activity/api/useLogEntries';
|
||||||
import ActionsCell from 'apps/dashboard/features/activity/components/ActionsCell';
|
import ActionsCell from 'apps/dashboard/features/activity/components/ActionsCell';
|
||||||
import LogLevelCell from 'apps/dashboard/features/activity/components/LogLevelCell';
|
import LogLevelCell from 'apps/dashboard/features/activity/components/LogLevelCell';
|
||||||
|
@ -14,7 +16,6 @@ import OverviewCell from 'apps/dashboard/features/activity/components/OverviewCe
|
||||||
import UserAvatarButton from 'apps/dashboard/components/UserAvatarButton';
|
import UserAvatarButton from 'apps/dashboard/components/UserAvatarButton';
|
||||||
import type { ActivityLogEntryCell } from 'apps/dashboard/features/activity/types/ActivityLogEntryCell';
|
import type { ActivityLogEntryCell } from 'apps/dashboard/features/activity/types/ActivityLogEntryCell';
|
||||||
import { type UsersRecords, useUsersDetails } from 'hooks/useUsers';
|
import { type UsersRecords, useUsersDetails } from 'hooks/useUsers';
|
||||||
import { parseISO8601Date, toLocaleString } from 'scripts/datetime';
|
|
||||||
import globalize from 'lib/globalize';
|
import globalize from 'lib/globalize';
|
||||||
import { toBoolean } from 'utils/string';
|
import { toBoolean } from 'utils/string';
|
||||||
|
|
||||||
|
@ -82,10 +83,10 @@ const Activity = () => {
|
||||||
const columns = useMemo<MRT_ColumnDef<ActivityLogEntry>[]>(() => [
|
const columns = useMemo<MRT_ColumnDef<ActivityLogEntry>[]>(() => [
|
||||||
{
|
{
|
||||||
id: 'Date',
|
id: 'Date',
|
||||||
accessorFn: row => parseISO8601Date(row.Date),
|
accessorFn: row => row.Date ? parseISO(row.Date) : undefined,
|
||||||
header: globalize.translate('LabelTime'),
|
header: globalize.translate('LabelTime'),
|
||||||
size: 160,
|
size: 160,
|
||||||
Cell: ({ cell }) => toLocaleString(cell.getValue<Date>()),
|
Cell: DateTimeCell,
|
||||||
filterVariant: 'datetime-range'
|
filterVariant: 'datetime-range'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,12 +5,12 @@ import Box from '@mui/material/Box/Box';
|
||||||
import Button from '@mui/material/Button/Button';
|
import Button from '@mui/material/Button/Button';
|
||||||
import IconButton from '@mui/material/IconButton/IconButton';
|
import IconButton from '@mui/material/IconButton/IconButton';
|
||||||
import Tooltip from '@mui/material/Tooltip/Tooltip';
|
import Tooltip from '@mui/material/Tooltip/Tooltip';
|
||||||
import format from 'date-fns/format';
|
|
||||||
import parseISO from 'date-fns/parseISO';
|
import parseISO from 'date-fns/parseISO';
|
||||||
import { type MRT_ColumnDef, useMaterialReactTable } from 'material-react-table';
|
import { type MRT_ColumnDef, useMaterialReactTable } from 'material-react-table';
|
||||||
import React, { useCallback, useMemo, useState } from 'react';
|
import React, { useCallback, useMemo, useState } from 'react';
|
||||||
|
|
||||||
import TablePage, { DEFAULT_TABLE_OPTIONS } from 'apps/dashboard/components/TablePage';
|
import DateTimeCell from 'apps/dashboard/components/table/DateTimeCell';
|
||||||
|
import TablePage, { DEFAULT_TABLE_OPTIONS } from 'apps/dashboard/components/table/TablePage';
|
||||||
import UserAvatarButton from 'apps/dashboard/components/UserAvatarButton';
|
import UserAvatarButton from 'apps/dashboard/components/UserAvatarButton';
|
||||||
import { useDeleteDevice } from 'apps/dashboard/features/devices/api/useDeleteDevice';
|
import { useDeleteDevice } from 'apps/dashboard/features/devices/api/useDeleteDevice';
|
||||||
import { useDevices } from 'apps/dashboard/features/devices/api/useDevices';
|
import { useDevices } from 'apps/dashboard/features/devices/api/useDevices';
|
||||||
|
@ -19,7 +19,6 @@ import DeviceNameCell from 'apps/dashboard/features/devices/components/DeviceNam
|
||||||
import type { DeviceInfoCell } from 'apps/dashboard/features/devices/types/deviceInfoCell';
|
import type { DeviceInfoCell } from 'apps/dashboard/features/devices/types/deviceInfoCell';
|
||||||
import ConfirmDialog from 'components/ConfirmDialog';
|
import ConfirmDialog from 'components/ConfirmDialog';
|
||||||
import { useApi } from 'hooks/useApi';
|
import { useApi } from 'hooks/useApi';
|
||||||
import { useLocale } from 'hooks/useLocale';
|
|
||||||
import { type UsersRecords, useUsersDetails } from 'hooks/useUsers';
|
import { type UsersRecords, useUsersDetails } from 'hooks/useUsers';
|
||||||
import globalize from 'lib/globalize';
|
import globalize from 'lib/globalize';
|
||||||
|
|
||||||
|
@ -38,7 +37,6 @@ const getUserCell = (users: UsersRecords) => function UserCell({ renderedCellVal
|
||||||
export const Component = () => {
|
export const Component = () => {
|
||||||
const { api } = useApi();
|
const { api } = useApi();
|
||||||
const { data: devices, isLoading: isDevicesLoading } = useDevices({});
|
const { data: devices, isLoading: isDevicesLoading } = useDevices({});
|
||||||
const { dateFnsLocale } = useLocale();
|
|
||||||
const { usersById: users, names: userNames, isLoading: isUsersLoading } = useUsersDetails();
|
const { usersById: users, names: userNames, isLoading: isUsersLoading } = useUsersDetails();
|
||||||
|
|
||||||
const [ isDeleteConfirmOpen, setIsDeleteConfirmOpen ] = useState(false);
|
const [ isDeleteConfirmOpen, setIsDeleteConfirmOpen ] = useState(false);
|
||||||
|
@ -105,7 +103,7 @@ export const Component = () => {
|
||||||
accessorFn: row => row.DateLastActivity ? parseISO(row.DateLastActivity) : undefined,
|
accessorFn: row => row.DateLastActivity ? parseISO(row.DateLastActivity) : undefined,
|
||||||
header: globalize.translate('LastActive'),
|
header: globalize.translate('LastActive'),
|
||||||
size: 160,
|
size: 160,
|
||||||
Cell: ({ cell }) => format(cell.getValue<Date>(), 'Pp', { locale: dateFnsLocale }),
|
Cell: DateTimeCell,
|
||||||
filterVariant: 'datetime-range',
|
filterVariant: 'datetime-range',
|
||||||
enableEditing: false
|
enableEditing: false
|
||||||
},
|
},
|
||||||
|
@ -134,7 +132,7 @@ export const Component = () => {
|
||||||
filterVariant: 'multi-select',
|
filterVariant: 'multi-select',
|
||||||
filterSelectOptions: userNames
|
filterSelectOptions: userNames
|
||||||
}
|
}
|
||||||
], [ UserCell, dateFnsLocale, userNames ]);
|
], [ UserCell, userNames ]);
|
||||||
|
|
||||||
const mrTable = useMaterialReactTable({
|
const mrTable = useMaterialReactTable({
|
||||||
...DEFAULT_TABLE_OPTIONS,
|
...DEFAULT_TABLE_OPTIONS,
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
import parseISO from 'date-fns/parseISO';
|
||||||
|
|
||||||
|
import DateTimeCell from 'apps/dashboard/components/table/DateTimeCell';
|
||||||
import Page from 'components/Page';
|
import Page from 'components/Page';
|
||||||
import { useApi } from 'hooks/useApi';
|
import { useApi } from 'hooks/useApi';
|
||||||
import globalize from 'lib/globalize';
|
import globalize from 'lib/globalize';
|
||||||
|
@ -14,7 +17,6 @@ import Stack from '@mui/material/Stack';
|
||||||
import Tooltip from '@mui/material/Tooltip';
|
import Tooltip from '@mui/material/Tooltip';
|
||||||
import Typography from '@mui/material/Typography';
|
import Typography from '@mui/material/Typography';
|
||||||
import { MaterialReactTable, MRT_ColumnDef, useMaterialReactTable } from 'material-react-table';
|
import { MaterialReactTable, MRT_ColumnDef, useMaterialReactTable } from 'material-react-table';
|
||||||
import { getDisplayTime, parseISO8601Date, toLocaleDateString } from 'scripts/datetime';
|
|
||||||
import DeleteIcon from '@mui/icons-material/Delete';
|
import DeleteIcon from '@mui/icons-material/Delete';
|
||||||
import AddIcon from '@mui/icons-material/Add';
|
import AddIcon from '@mui/icons-material/Add';
|
||||||
|
|
||||||
|
@ -38,8 +40,8 @@ const ApiKeys = () => {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'DateIssued',
|
id: 'DateIssued',
|
||||||
accessorFn: item => parseISO8601Date(item.DateCreated),
|
accessorFn: item => item.DateCreated ? parseISO(item.DateCreated) : undefined,
|
||||||
Cell: ({ cell }) => toLocaleDateString(cell.getValue<Date>()) + ' ' + getDisplayTime(cell.getValue<Date>()),
|
Cell: DateTimeCell,
|
||||||
header: globalize.translate('HeaderDateIssued'),
|
header: globalize.translate('HeaderDateIssued'),
|
||||||
filterVariant: 'datetime-range'
|
filterVariant: 'datetime-range'
|
||||||
}
|
}
|
||||||
|
@ -77,8 +79,10 @@ const ApiKeys = () => {
|
||||||
},
|
},
|
||||||
|
|
||||||
renderTopToolbarCustomActions: () => (
|
renderTopToolbarCustomActions: () => (
|
||||||
<Button onClick={showNewKeyPopup}>
|
<Button
|
||||||
<AddIcon />
|
startIcon={<AddIcon />}
|
||||||
|
onClick={showNewKeyPopup}
|
||||||
|
>
|
||||||
{globalize.translate('HeaderNewApiKey')}
|
{globalize.translate('HeaderNewApiKey')}
|
||||||
</Button>
|
</Button>
|
||||||
),
|
),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue