Use proper casing for i18n locales (#1998)

This commit is contained in:
Jeff
2026-05-11 19:42:07 -07:00
committed by GitHub
parent e49e488b4c
commit e2a1d813a9
224 changed files with 17323 additions and 18474 deletions
@@ -24,12 +24,12 @@ const ComponentErrorFallback = ({ resetErrorBoundary }: ComponentErrorFallbackPr
<Group gap="xs">
<Icon fill="error" icon="error" size="lg" />
<TextTitle fw={600} order={4}>
{t('error.genericError', { postProcess: 'sentenceCase' })}
{t('error.genericError')}
</TextTitle>
</Group>
<Group grow>
<Button onClick={resetErrorBoundary} size="xs" variant="default">
{t('common.reload', { postProcess: 'sentenceCase' })}
{t('common.reload')}
</Button>
</Group>
</Stack>
@@ -27,10 +27,10 @@ export const DisplayTypeToggleButton = ({
onClick={onToggle}
tooltip={{
label: isGrid
? t('table.config.view.grid', { postProcess: 'sentenceCase' })
? t('table.config.view.grid')
: isDetail
? t('table.config.view.detail', { postProcess: 'sentenceCase' })
: t('table.config.view.table', { postProcess: 'sentenceCase' }),
? t('table.config.view.detail')
: t('table.config.view.table'),
}}
variant="subtle"
{...buttonProps}
@@ -19,7 +19,7 @@ export const FilterButton = ({ isActive, onClick, ...props }: FilterButtonProps)
}}
onClick={onClick}
tooltip={{
label: t('common.filters', { count: 2, postProcess: 'sentenceCase' }),
label: t('common.filters', { count: 2 }),
...props.tooltip,
}}
variant="subtle"
@@ -18,7 +18,7 @@ export const FolderButton = ({ isActive, ...props }: FolderButtonProps) => {
...props.iconProps,
}}
tooltip={{
label: t('entity.folder', { count: 1, postProcess: 'sentenceCase' }),
label: t('entity.folder', { count: 1 }),
...props.tooltip,
}}
variant="subtle"
@@ -73,15 +73,11 @@ export const GridConfig = ({
<SegmentedControl
data={[
{
label: t('table.config.general.pagination_infinite', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.pagination_infinite'),
value: ListPaginationType.INFINITE,
},
{
label: t('table.config.general.pagination_paginate', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.pagination_paginate'),
value: ListPaginationType.PAGINATED,
},
]}
@@ -97,7 +93,7 @@ export const GridConfig = ({
/>
),
id: 'pagination',
label: t('table.config.general.pagination', { postProcess: 'sentenceCase' }),
label: t('table.config.general.pagination'),
size: 'sm',
},
{
@@ -125,9 +121,7 @@ export const GridConfig = ({
id: 'itemsPerPage',
label: (
<Group>
{t('table.config.general.pagination_itemsPerPage', {
postProcess: 'sentenceCase',
})}
{t('table.config.general.pagination_itemsPerPage')}
<Badge>{list.itemsPerPage}</Badge>
</Group>
),
@@ -186,7 +180,7 @@ export const GridConfig = ({
id: 'itemGap',
label: (
<Group>
{t('table.config.general.gap', { postProcess: 'sentenceCase' })}
{t('table.config.general.gap')}
<Badge>{grid.itemGap}</Badge>
</Group>
),
@@ -205,12 +199,12 @@ export const GridConfig = ({
label: (
<Group justify="space-between" w="100%" wrap="nowrap">
<Group>
{t('table.config.general.itemsPerRow', { postProcess: 'sentenceCase' })}
{t('table.config.general.itemsPerRow')}
<Badge>{grid.itemsPerRow}</Badge>
</Group>
<Checkbox
checked={grid.itemsPerRowEnabled}
label={t('common.enable', { postProcess: 'titleCase' })}
label={t('common.enable')}
onChange={(e) =>
setList(listKey, {
grid: { itemsPerRowEnabled: e.target.checked },
@@ -227,21 +221,15 @@ export const GridConfig = ({
<SegmentedControl
data={[
{
label: t('table.config.general.size_compact', {
postProcess: 'titleCase',
}),
label: t('table.config.general.size_compact'),
value: 'compact',
},
{
label: t('table.config.general.size_default', {
postProcess: 'titleCase',
}),
label: t('table.config.general.size_default'),
value: 'default',
},
{
label: t('table.config.general.size_large', {
postProcess: 'titleCase',
}),
label: t('table.config.general.size_large'),
value: 'large',
},
]}
@@ -256,7 +244,7 @@ export const GridConfig = ({
/>
),
id: 'size',
label: t('table.config.general.size', { postProcess: 'sentenceCase' }),
label: t('table.config.general.size'),
size: 'sm',
},
@@ -419,12 +407,10 @@ const GridRowConfig = ({
return (
<Stack gap="xs">
<Group justify="space-between" mb="md">
<Text size="sm">{t('common.gridRows', { postProcess: 'sentenceCase' })}</Text>
<Text size="sm">{t('common.gridRows')}</Text>
<TextInput
onChange={(e) => setSearchRows(e.currentTarget.value)}
placeholder={t('common.search', {
postProcess: 'sentenceCase',
})}
placeholder={t('common.search')}
size="xs"
/>
</Group>
@@ -592,9 +578,7 @@ const GridRowItem = memo(
onClick={() => handleMoveUp(item)}
size="xs"
tooltip={{
label: t('table.config.general.moveUp', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.moveUp'),
}}
variant="subtle"
/>
@@ -604,9 +588,7 @@ const GridRowItem = memo(
onClick={() => handleMoveDown(item)}
size="xs"
tooltip={{
label: t('table.config.general.moveDown', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.moveDown'),
}}
variant="subtle"
/>
@@ -618,9 +600,7 @@ const GridRowItem = memo(
onClick={() => handleAlignLeft(item)}
size="xs"
tooltip={{
label: t('table.config.general.alignLeft', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.alignLeft'),
}}
variant={item.align === 'start' ? 'filled' : 'subtle'}
/>
@@ -630,9 +610,7 @@ const GridRowItem = memo(
onClick={() => handleAlignCenter(item)}
size="xs"
tooltip={{
label: t('table.config.general.alignCenter', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.alignCenter'),
}}
variant={item.align === 'center' ? 'filled' : 'subtle'}
/>
@@ -642,9 +620,7 @@ const GridRowItem = memo(
onClick={() => handleAlignRight(item)}
size="xs"
tooltip={{
label: t('table.config.general.alignRight', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.alignRight'),
}}
variant={item.align === 'end' ? 'filled' : 'subtle'}
/>
@@ -407,7 +407,7 @@ export const LibraryHeaderMenu = ({
size="md"
variant="transparent"
>
{t('player.albumRadio', { postProcess: 'sentenceCase' })}
{t('player.albumRadio')}
</Button>
)}
{onArtistRadio && (
@@ -424,7 +424,7 @@ export const LibraryHeaderMenu = ({
size="md"
variant="transparent"
>
{t('player.artistRadio', { postProcess: 'sentenceCase' })}
{t('player.artistRadio')}
</Button>
)}
</Group>
@@ -27,7 +27,7 @@ const DISPLAY_TYPES = [
label: (
<Group align="center" justify="center" p="sm">
<Icon icon="layoutTable" size="lg" />
{i18n.t('table.config.view.table', { postProcess: 'sentenceCase' }) as string}
{i18n.t('table.config.view.table') as string}
</Group>
),
value: ListDisplayType.TABLE,
@@ -36,7 +36,7 @@ const DISPLAY_TYPES = [
label: (
<Group align="center" justify="center" p="sm">
<Icon icon="layoutGrid" size="lg" />
{i18n.t('table.config.view.grid', { postProcess: 'sentenceCase' }) as string}
{i18n.t('table.config.view.grid') as string}
</Group>
),
value: ListDisplayType.GRID,
@@ -45,7 +45,7 @@ const DISPLAY_TYPES = [
label: (
<Group align="center" justify="center" p="sm">
<Icon icon="layoutDetail" size="lg" />
{i18n.t('table.config.view.detail', { postProcess: 'sentenceCase' }) as string}
{i18n.t('table.config.view.detail') as string}
</Group>
),
value: ListDisplayType.DETAIL,
@@ -55,7 +55,7 @@ const DISPLAY_TYPES = [
// label: (
// <Stack align="center" p="sm">
// <Icon icon="layoutList" size="lg" />
// {i18n.t('table.config.view.list', { postProcess: 'sentenceCase' }) as string}
// {i18n.t('table.config.view.list') as string}
// </Stack>
// ),
// value: ListDisplayType.LIST,
@@ -148,12 +148,7 @@ export const ListConfigMenu = (props: ListConfigMenuProps) => {
return (
<>
<SettingsButton {...props.buttonProps} onClick={handlers.toggle} />
<Modal
handlers={handlers}
opened={isOpen}
size="xl"
title={t('common.configure', { postProcess: 'sentenceCase' })}
>
<Modal handlers={handlers} opened={isOpen} size="xl" title={t('common.configure')}>
<Stack gap="xs">
{availableDisplayTypes.length > 1 && (
<ListConfigTable
@@ -174,9 +169,7 @@ export const ListConfigMenu = (props: ListConfigMenuProps) => {
/>
),
id: 'displayType',
label: t('table.config.general.displayType', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.displayType'),
},
]}
/>
@@ -93,10 +93,10 @@ export const ListFiltersModal = ({ isActive, itemType }: ListFiltersProps) => {
/>
)}
{t('common.filters', { postProcess: 'sentenceCase' })}
{t('common.filters')}
</Group>
<Button onClick={handleReset} size="compact-sm" variant="subtle">
{t('common.reset', { postProcess: 'sentenceCase' })}
{t('common.reset')}
</Button>
</Group>
}
@@ -159,11 +159,11 @@ export const ListFiltersTitle = ({ itemType }: ListFiltersTitleProps) => {
return (
<Group justify="space-between" pb={0} pl="md" pr="md" pt="md">
<Text fw={500} size="xl">
{t('common.filters', { postProcess: 'sentenceCase' })}
{t('common.filters')}
</Text>
<Group gap="xs">
<Button onClick={clear} size="compact-sm" variant="subtle">
{t('common.reset', { postProcess: 'sentenceCase' })}
{t('common.reset')}
</Button>
{canUnpin && (
<ActionIcon
@@ -133,87 +133,87 @@ export const ListSortByDropdownControlled = ({
export const CLIENT_SIDE_SONG_FILTERS = [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.id', { postProcess: 'titleCase' }),
name: i18n.t('filter.id'),
value: SongListSort.ID,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.album', { postProcess: 'titleCase' }),
name: i18n.t('filter.album'),
value: SongListSort.ALBUM,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.albumArtist', { postProcess: 'titleCase' }),
name: i18n.t('filter.albumArtist'),
value: SongListSort.ALBUM_ARTIST,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.artist', { postProcess: 'titleCase' }),
name: i18n.t('filter.artist'),
value: SongListSort.ARTIST,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.bpm', { postProcess: 'titleCase' }),
name: i18n.t('filter.bpm'),
value: SongListSort.BPM,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('common.channel', { count: 2, postProcess: 'titleCase' }),
name: i18n.t('common.channel', { count: 2 }),
value: SongListSort.CHANNELS,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.comment', { postProcess: 'titleCase' }),
name: i18n.t('filter.comment'),
value: SongListSort.COMMENT,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.duration', { postProcess: 'titleCase' }),
name: i18n.t('filter.duration'),
value: SongListSort.DURATION,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.isFavorited', { postProcess: 'titleCase' }),
name: i18n.t('filter.isFavorited'),
value: SongListSort.FAVORITED,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.genre', { postProcess: 'titleCase' }),
name: i18n.t('filter.genre'),
value: SongListSort.GENRE,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: SongListSort.NAME,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.sortName', { postProcess: 'titleCase' }),
name: i18n.t('filter.sortName'),
value: SongListSort.SORT_NAME,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.playCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.playCount'),
value: SongListSort.PLAY_COUNT,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.rating', { postProcess: 'titleCase' }),
name: i18n.t('filter.rating'),
value: SongListSort.RATING,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.recentlyAdded', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyAdded'),
value: SongListSort.RECENTLY_ADDED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.recentlyPlayed', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyPlayed'),
value: SongListSort.RECENTLY_PLAYED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.releaseYear', { postProcess: 'titleCase' }),
name: i18n.t('filter.releaseYear'),
value: SongListSort.YEAR,
},
];
@@ -221,72 +221,72 @@ export const CLIENT_SIDE_SONG_FILTERS = [
export const CLIENT_SIDE_ALBUM_FILTERS = [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.albumArtist', { postProcess: 'titleCase' }),
name: i18n.t('filter.albumArtist'),
value: AlbumListSort.ALBUM_ARTIST,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.id', { postProcess: 'titleCase' }),
name: i18n.t('filter.id'),
value: AlbumListSort.ID,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.duration', { postProcess: 'titleCase' }),
name: i18n.t('filter.duration'),
value: AlbumListSort.DURATION,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.favorited', { postProcess: 'titleCase' }),
name: i18n.t('filter.favorited'),
value: AlbumListSort.FAVORITED,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: AlbumListSort.NAME,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.sortName', { postProcess: 'titleCase' }),
name: i18n.t('filter.sortName'),
value: AlbumListSort.SORT_NAME,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.playCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.playCount'),
value: AlbumListSort.PLAY_COUNT,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.random', { postProcess: 'titleCase' }),
name: i18n.t('filter.random'),
value: AlbumListSort.RANDOM,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.rating', { postProcess: 'titleCase' }),
name: i18n.t('filter.rating'),
value: AlbumListSort.RATING,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.recentlyAdded', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyAdded'),
value: AlbumListSort.RECENTLY_ADDED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.recentlyPlayed', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyPlayed'),
value: AlbumListSort.RECENTLY_PLAYED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.releaseDate', { postProcess: 'titleCase' }),
name: i18n.t('filter.releaseDate'),
value: AlbumListSort.RELEASE_DATE,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.releaseYear', { postProcess: 'titleCase' }),
name: i18n.t('filter.releaseYear'),
value: AlbumListSort.YEAR,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.songCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.songCount'),
value: AlbumListSort.SONG_COUNT,
},
];
@@ -297,161 +297,161 @@ const ALBUM_LIST_FILTERS: Partial<
[ServerType.JELLYFIN]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.albumArtist', { postProcess: 'titleCase' }),
name: i18n.t('filter.albumArtist'),
value: AlbumListSort.ALBUM_ARTIST,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.id', { postProcess: 'titleCase' }),
name: i18n.t('filter.id'),
value: AlbumListSort.ID,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.communityRating', { postProcess: 'titleCase' }),
name: i18n.t('filter.communityRating'),
value: AlbumListSort.COMMUNITY_RATING,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.criticRating', { postProcess: 'titleCase' }),
name: i18n.t('filter.criticRating'),
value: AlbumListSort.CRITIC_RATING,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: AlbumListSort.NAME,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.playCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.playCount'),
value: AlbumListSort.PLAY_COUNT,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.random', { postProcess: 'titleCase' }),
name: i18n.t('filter.random'),
value: AlbumListSort.RANDOM,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.recentlyAdded', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyAdded'),
value: AlbumListSort.RECENTLY_ADDED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.releaseDate', { postProcess: 'titleCase' }),
name: i18n.t('filter.releaseDate'),
value: AlbumListSort.RELEASE_DATE,
},
],
[ServerType.NAVIDROME]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.albumArtist', { postProcess: 'titleCase' }),
name: i18n.t('filter.albumArtist'),
value: AlbumListSort.ALBUM_ARTIST,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.id', { postProcess: 'titleCase' }),
name: i18n.t('filter.id'),
value: AlbumListSort.ID,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.artist', { postProcess: 'titleCase' }),
name: i18n.t('filter.artist'),
value: AlbumListSort.ARTIST,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.duration', { postProcess: 'titleCase' }),
name: i18n.t('filter.duration'),
value: AlbumListSort.DURATION,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.mostPlayed', { postProcess: 'titleCase' }),
name: i18n.t('filter.mostPlayed'),
value: AlbumListSort.PLAY_COUNT,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: AlbumListSort.NAME,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.random', { postProcess: 'titleCase' }),
name: i18n.t('filter.random'),
value: AlbumListSort.RANDOM,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.rating', { postProcess: 'titleCase' }),
name: i18n.t('filter.rating'),
value: AlbumListSort.RATING,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.recentlyAdded', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyAdded'),
value: AlbumListSort.RECENTLY_ADDED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.recentlyPlayed', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyPlayed'),
value: AlbumListSort.RECENTLY_PLAYED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.songCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.songCount'),
value: AlbumListSort.SONG_COUNT,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.favorited', { postProcess: 'titleCase' }),
name: i18n.t('filter.favorited'),
value: AlbumListSort.FAVORITED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.releaseYear', { postProcess: 'titleCase' }),
name: i18n.t('filter.releaseYear'),
value: AlbumListSort.YEAR,
},
],
[ServerType.SUBSONIC]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.albumArtist', { postProcess: 'titleCase' }),
name: i18n.t('filter.albumArtist'),
value: AlbumListSort.ALBUM_ARTIST,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.id', { postProcess: 'titleCase' }),
name: i18n.t('filter.id'),
value: AlbumListSort.ID,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.mostPlayed', { postProcess: 'titleCase' }),
name: i18n.t('filter.mostPlayed'),
value: AlbumListSort.PLAY_COUNT,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: AlbumListSort.NAME,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.random', { postProcess: 'titleCase' }),
name: i18n.t('filter.random'),
value: AlbumListSort.RANDOM,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.recentlyAdded', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyAdded'),
value: AlbumListSort.RECENTLY_ADDED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.recentlyPlayed', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyPlayed'),
value: AlbumListSort.RECENTLY_PLAYED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.favorited', { postProcess: 'titleCase' }),
name: i18n.t('filter.favorited'),
value: AlbumListSort.FAVORITED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.releaseYear', { postProcess: 'titleCase' }),
name: i18n.t('filter.releaseYear'),
value: AlbumListSort.YEAR,
},
],
@@ -463,141 +463,141 @@ const SONG_LIST_FILTERS: Partial<
[ServerType.JELLYFIN]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.album', { postProcess: 'titleCase' }),
name: i18n.t('filter.album'),
value: SongListSort.ALBUM,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.albumArtist', { postProcess: 'titleCase' }),
name: i18n.t('filter.albumArtist'),
value: SongListSort.ALBUM_ARTIST,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.artist', { postProcess: 'titleCase' }),
name: i18n.t('filter.artist'),
value: SongListSort.ARTIST,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.duration', { postProcess: 'titleCase' }),
name: i18n.t('filter.duration'),
value: SongListSort.DURATION,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.playCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.playCount'),
value: SongListSort.PLAY_COUNT,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: SongListSort.NAME,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.random', { postProcess: 'titleCase' }),
name: i18n.t('filter.random'),
value: SongListSort.RANDOM,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.recentlyAdded', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyAdded'),
value: SongListSort.RECENTLY_ADDED,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.recentlyPlayed', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyPlayed'),
value: SongListSort.RECENTLY_PLAYED,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.releaseDate', { postProcess: 'titleCase' }),
name: i18n.t('filter.releaseDate'),
value: SongListSort.RELEASE_DATE,
},
],
[ServerType.NAVIDROME]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.album', { postProcess: 'titleCase' }),
name: i18n.t('filter.album'),
value: SongListSort.ALBUM,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.albumArtist', { postProcess: 'titleCase' }),
name: i18n.t('filter.albumArtist'),
value: SongListSort.ALBUM_ARTIST,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.artist', { postProcess: 'titleCase' }),
name: i18n.t('filter.artist'),
value: SongListSort.ARTIST,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.bpm', { postProcess: 'titleCase' }),
name: i18n.t('filter.bpm'),
value: SongListSort.BPM,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('common.channel', { count: 2, postProcess: 'titleCase' }),
name: i18n.t('common.channel', { count: 2 }),
value: SongListSort.CHANNELS,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.comment', { postProcess: 'titleCase' }),
name: i18n.t('filter.comment'),
value: SongListSort.COMMENT,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.duration', { postProcess: 'titleCase' }),
name: i18n.t('filter.duration'),
value: SongListSort.DURATION,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.isFavorited', { postProcess: 'titleCase' }),
name: i18n.t('filter.isFavorited'),
value: SongListSort.FAVORITED,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.genre', { postProcess: 'titleCase' }),
name: i18n.t('filter.genre'),
value: SongListSort.GENRE,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: SongListSort.NAME,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.playCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.playCount'),
value: SongListSort.PLAY_COUNT,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.random', { postProcess: 'titleCase' }),
name: i18n.t('filter.random'),
value: SongListSort.RANDOM,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.rating', { postProcess: 'titleCase' }),
name: i18n.t('filter.rating'),
value: SongListSort.RATING,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.recentlyAdded', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyAdded'),
value: SongListSort.RECENTLY_ADDED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.recentlyPlayed', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyPlayed'),
value: SongListSort.RECENTLY_PLAYED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.releaseYear', { postProcess: 'titleCase' }),
name: i18n.t('filter.releaseYear'),
value: SongListSort.YEAR,
},
],
[ServerType.SUBSONIC]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: SongListSort.NAME,
},
],
@@ -609,7 +609,7 @@ const FOLDER_LIST_FILTERS: Partial<
[ServerType.JELLYFIN]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.id', { postProcess: 'titleCase' }),
name: i18n.t('filter.id'),
value: SongListSort.ID,
},
...(SONG_LIST_FILTERS[ServerType.JELLYFIN] || []),
@@ -617,7 +617,7 @@ const FOLDER_LIST_FILTERS: Partial<
[ServerType.NAVIDROME]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.id', { postProcess: 'titleCase' }),
name: i18n.t('filter.id'),
value: SongListSort.ID,
},
...(SONG_LIST_FILTERS[ServerType.NAVIDROME] || []),
@@ -625,7 +625,7 @@ const FOLDER_LIST_FILTERS: Partial<
[ServerType.SUBSONIC]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.id', { postProcess: 'titleCase' }),
name: i18n.t('filter.id'),
value: SongListSort.ID,
},
...(SONG_LIST_FILTERS[ServerType.SUBSONIC] || []),
@@ -646,81 +646,81 @@ const ALBUM_ARTIST_LIST_FILTERS: Partial<
[ServerType.JELLYFIN]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.album', { postProcess: 'titleCase' }),
name: i18n.t('filter.album'),
value: AlbumArtistListSort.ALBUM,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.duration', { postProcess: 'titleCase' }),
name: i18n.t('filter.duration'),
value: AlbumArtistListSort.DURATION,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: AlbumArtistListSort.NAME,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.random', { postProcess: 'titleCase' }),
name: i18n.t('filter.random'),
value: AlbumArtistListSort.RANDOM,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.recentlyAdded', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyAdded'),
value: AlbumArtistListSort.RECENTLY_ADDED,
},
],
[ServerType.NAVIDROME]: [
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.albumCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.albumCount'),
value: AlbumArtistListSort.ALBUM_COUNT,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.isFavorited', { postProcess: 'titleCase' }),
name: i18n.t('filter.isFavorited'),
value: AlbumArtistListSort.FAVORITED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.mostPlayed', { postProcess: 'titleCase' }),
name: i18n.t('filter.mostPlayed'),
value: AlbumArtistListSort.PLAY_COUNT,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: AlbumArtistListSort.NAME,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.rating', { postProcess: 'titleCase' }),
name: i18n.t('filter.rating'),
value: AlbumArtistListSort.RATING,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.songCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.songCount'),
value: AlbumArtistListSort.SONG_COUNT,
},
],
[ServerType.SUBSONIC]: [
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.albumCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.albumCount'),
value: AlbumArtistListSort.ALBUM_COUNT,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.isFavorited', { postProcess: 'titleCase' }),
name: i18n.t('filter.isFavorited'),
value: AlbumArtistListSort.FAVORITED,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: AlbumArtistListSort.NAME,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.rating', { postProcess: 'titleCase' }),
name: i18n.t('filter.rating'),
value: AlbumArtistListSort.RATING,
},
],
@@ -732,81 +732,81 @@ const ARTIST_LIST_FILTERS: Partial<
[ServerType.JELLYFIN]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.album', { postProcess: 'titleCase' }),
name: i18n.t('filter.album'),
value: ArtistListSort.ALBUM,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.duration', { postProcess: 'titleCase' }),
name: i18n.t('filter.duration'),
value: ArtistListSort.DURATION,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: ArtistListSort.NAME,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.random', { postProcess: 'titleCase' }),
name: i18n.t('filter.random'),
value: ArtistListSort.RANDOM,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.recentlyAdded', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyAdded'),
value: ArtistListSort.RECENTLY_ADDED,
},
],
[ServerType.NAVIDROME]: [
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.albumCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.albumCount'),
value: ArtistListSort.ALBUM_COUNT,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.isFavorited', { postProcess: 'titleCase' }),
name: i18n.t('filter.isFavorited'),
value: ArtistListSort.FAVORITED,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.mostPlayed', { postProcess: 'titleCase' }),
name: i18n.t('filter.mostPlayed'),
value: ArtistListSort.PLAY_COUNT,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: ArtistListSort.NAME,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.rating', { postProcess: 'titleCase' }),
name: i18n.t('filter.rating'),
value: ArtistListSort.RATING,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.songCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.songCount'),
value: ArtistListSort.SONG_COUNT,
},
],
[ServerType.SUBSONIC]: [
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.albumCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.albumCount'),
value: ArtistListSort.ALBUM_COUNT,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.isFavorited', { postProcess: 'titleCase' }),
name: i18n.t('filter.isFavorited'),
value: ArtistListSort.FAVORITED,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: ArtistListSort.NAME,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.rating', { postProcess: 'titleCase' }),
name: i18n.t('filter.rating'),
value: ArtistListSort.RATING,
},
],
@@ -818,21 +818,21 @@ const GENRE_LIST_FILTERS: Partial<
[ServerType.JELLYFIN]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: GenreListSort.NAME,
},
],
[ServerType.NAVIDROME]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: GenreListSort.NAME,
},
],
[ServerType.SUBSONIC]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: GenreListSort.NAME,
},
],
@@ -844,56 +844,56 @@ const PLAYLIST_LIST_FILTERS: Partial<
[ServerType.JELLYFIN]: [
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.duration', { postProcess: 'titleCase' }),
name: i18n.t('filter.duration'),
value: PlaylistListSort.DURATION,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: PlaylistListSort.NAME,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.songCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.songCount'),
value: PlaylistListSort.SONG_COUNT,
},
],
[ServerType.NAVIDROME]: [
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.duration', { postProcess: 'titleCase' }),
name: i18n.t('filter.duration'),
value: PlaylistListSort.DURATION,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: PlaylistListSort.NAME,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.owner', { postProcess: 'titleCase' }),
name: i18n.t('filter.owner'),
value: PlaylistListSort.OWNER,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.isPublic', { postProcess: 'titleCase' }),
name: i18n.t('filter.isPublic'),
value: PlaylistListSort.PUBLIC,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.songCount', { postProcess: 'titleCase' }),
name: i18n.t('filter.songCount'),
value: PlaylistListSort.SONG_COUNT,
},
{
defaultOrder: SortOrder.DESC,
name: i18n.t('filter.recentlyUpdated', { postProcess: 'titleCase' }),
name: i18n.t('filter.recentlyUpdated'),
value: PlaylistListSort.UPDATED_AT,
},
],
[ServerType.SUBSONIC]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: PlaylistListSort.NAME,
},
],
@@ -905,36 +905,36 @@ const RADIO_LIST_FILTERS: Partial<
[ServerType.JELLYFIN]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.id', { postProcess: 'titleCase' }),
name: i18n.t('filter.id'),
value: RadioListSort.ID,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: RadioListSort.NAME,
},
],
[ServerType.NAVIDROME]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.id', { postProcess: 'titleCase' }),
name: i18n.t('filter.id'),
value: RadioListSort.ID,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: RadioListSort.NAME,
},
],
[ServerType.SUBSONIC]: [
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.id', { postProcess: 'titleCase' }),
name: i18n.t('filter.id'),
value: RadioListSort.ID,
},
{
defaultOrder: SortOrder.ASC,
name: i18n.t('filter.name', { postProcess: 'titleCase' }),
name: i18n.t('filter.name'),
value: RadioListSort.NAME,
},
],
@@ -27,10 +27,7 @@ export const OrderToggleButton = ({
}}
onClick={onToggle}
tooltip={{
label:
sortOrder === SortOrder.ASC
? t('common.ascending', { postProcess: 'sentenceCase' })
: t('common.descending', { postProcess: 'sentenceCase' }),
label: sortOrder === SortOrder.ASC ? t('common.ascending') : t('common.descending'),
}}
variant="subtle"
{...buttonProps}
@@ -42,11 +42,11 @@ const PageErrorFallback = ({ error, resetErrorBoundary }: PageErrorFallbackProps
<Group gap="xs">
<Icon fill="error" icon="error" size="lg" />
<TextTitle fw={700} order={3}>
{t('error.genericError', { postProcess: 'sentenceCase' })}
{t('error.genericError')}
</TextTitle>
</Group>
<Text style={{ wordBreak: 'break-word' }}>
{error?.message || t('error.genericError', { postProcess: 'sentenceCase' })}
{error?.message || t('error.genericError')}
</Text>
{process.env.NODE_ENV === 'development' && error?.stack && (
<Code
@@ -64,10 +64,10 @@ const PageErrorFallback = ({ error, resetErrorBoundary }: PageErrorFallbackProps
)}
<Group grow>
<Button onClick={resetErrorBoundary} size="md" variant="default">
{t('common.reload', { postProcess: 'sentenceCase' })}
{t('common.reload')}
</Button>
<Button onClick={handleRefresh} size="md" variant="filled">
{t('common.refresh', { postProcess: 'sentenceCase' })}
{t('common.refresh')}
</Button>
</Group>
</Stack>
@@ -24,10 +24,10 @@ const playButtons: {
label: (
<Stack gap="xs" justify="center">
<Text fw={500} ta="center">
{i18n.t('player.addNext', { postProcess: 'sentenceCase' })}
{i18n.t('player.addNext')}
</Text>
<Text fw={500} isMuted size="xs" ta="center">
{i18n.t('player.holdToShuffle', { postProcess: 'sentenceCase' })}
{i18n.t('player.holdToShuffle')}
</Text>
</Stack>
),
@@ -40,10 +40,10 @@ const playButtons: {
label: (
<Stack gap="xs" justify="center">
<Text fw={500} ta="center">
{i18n.t('player.play', { postProcess: 'sentenceCase' })}
{i18n.t('player.play')}
</Text>
<Text fw={500} isMuted size="xs" ta="center">
{i18n.t('player.holdToShuffle', { postProcess: 'sentenceCase' })}
{i18n.t('player.holdToShuffle')}
</Text>
</Stack>
),
@@ -55,10 +55,10 @@ const playButtons: {
label: (
<Stack gap="xs" justify="center">
<Text fw={500} ta="center">
{i18n.t('player.addLast', { postProcess: 'sentenceCase' })}
{i18n.t('player.addLast')}
</Text>
<Text fw={500} isMuted size="xs" ta="center">
{i18n.t('player.holdToShuffle', { postProcess: 'sentenceCase' })}
{i18n.t('player.holdToShuffle')}
</Text>
</Stack>
),
@@ -74,9 +74,9 @@ export const LONG_PRESS_PLAY_BEHAVIOR = {
};
const PLAY_BEHAVIOR_TO_LABEL = {
[Play.LAST]: i18n.t('player.addLast', { postProcess: 'sentenceCase' }),
[Play.NEXT]: i18n.t('player.addNext', { postProcess: 'sentenceCase' }),
[Play.NOW]: i18n.t('player.play', { postProcess: 'sentenceCase' }),
[Play.LAST]: i18n.t('player.addLast'),
[Play.NEXT]: i18n.t('player.addNext'),
[Play.NOW]: i18n.t('player.play'),
};
const TooltipLabel = ({ label }: { label: React.ReactNode | string; type: Play }) => {
@@ -86,7 +86,7 @@ const TooltipLabel = ({ label }: { label: React.ReactNode | string; type: Play }
{label}
</Text>
<Text fw={500} isMuted size="xs" ta="center">
{i18n.t('player.holdToShuffle', { postProcess: 'sentenceCase' })}
{i18n.t('player.holdToShuffle')}
</Text>
</Stack>
);
@@ -64,7 +64,7 @@ export const PlayTextButton = ({
{props.children || (
<Group gap="sm" wrap="nowrap">
<Icon icon="mediaPlay" size="lg" />
{t('player.play', { postProcess: 'sentenceCase' })}
{t('player.play')}
</Group>
)}
</Button>
@@ -86,7 +86,7 @@ export const PlayNextTextButton = ({ ...props }: TextPlayButtonProps) => {
<PlayTextButton {...props} showTooltip={false}>
<Group gap="sm" wrap="nowrap">
<Icon className={styles.noFill} icon="mediaPlayNext" size="lg" />
{t('player.addNext', { postProcess: 'sentenceCase' })}
{t('player.addNext')}
</Group>
</PlayTextButton>
);
@@ -107,7 +107,7 @@ export const PlayLastTextButton = ({ ...props }: TextPlayButtonProps) => {
<PlayTextButton {...props} showTooltip={false}>
<Group gap="sm" wrap="nowrap">
<Icon className={styles.noFill} icon="mediaPlayLast" size="lg" />
{t('player.addLast', { postProcess: 'sentenceCase' })}
{t('player.addLast')}
</Group>
</PlayTextButton>
);
@@ -128,7 +128,7 @@ export const WideShuffleButton = ({ ...props }: TextPlayButtonProps) => {
<PlayTextButton {...props}>
<Group gap="sm" wrap="nowrap">
<Icon fill="default" icon="mediaShuffle" size="lg" />
{t('action.shuffle', { postProcess: 'sentenceCase' })}
{t('action.shuffle')}
</Group>
</PlayTextButton>
);
@@ -19,7 +19,7 @@ export const RefreshButton = ({ loading, onClick, ...props }: RefreshButtonProps
loading={loading}
onClick={onClick}
tooltip={{
label: t('common.refresh', { postProcess: 'sentenceCase' }),
label: t('common.refresh'),
...props.tooltip,
}}
variant="subtle"
@@ -48,11 +48,11 @@ const RouterErrorFallback = ({ error, resetErrorBoundary }: RouterErrorFallbackP
<Group gap="xs">
<Icon fill="error" icon="error" size="lg" />
<TextTitle fw={700} order={3}>
{t('error.genericError', { postProcess: 'sentenceCase' })}
{t('error.genericError')}
</TextTitle>
</Group>
<Text style={{ wordBreak: 'break-word' }}>
{error?.message || t('error.genericError', { postProcess: 'sentenceCase' })}
{error?.message || t('error.genericError')}
</Text>
{process.env.NODE_ENV === 'development' && error?.stack && (
<Code
@@ -70,10 +70,10 @@ const RouterErrorFallback = ({ error, resetErrorBoundary }: RouterErrorFallbackP
)}
<Group grow>
<Button onClick={resetErrorBoundary} size="md" variant="default">
{t('common.reload', { postProcess: 'sentenceCase' })}
{t('common.reload')}
</Button>
<Button onClick={handleRefresh} size="md" variant="filled">
{t('common.refresh', { postProcess: 'sentenceCase' })}
{t('common.refresh')}
</Button>
</Group>
</Stack>
@@ -98,9 +98,7 @@ export const SaveAsCollectionButton = ({ fullWidth, itemType }: SaveAsCollection
<Popover.Target>
{fullWidth ? (
<Button fullWidth onClick={handleOpen} variant="default">
{t('page.collections.saveAsCollection', {
postProcess: 'sentenceCase',
})}
{t('page.collections.saveAsCollection')}
</Button>
) : (
<ActionIcon
@@ -108,9 +106,7 @@ export const SaveAsCollectionButton = ({ fullWidth, itemType }: SaveAsCollection
iconProps={{ size: 'lg' }}
onClick={handleOpen}
tooltip={{
label: t('page.collections.saveAsCollection', {
postProcess: 'sentenceCase',
}),
label: t('page.collections.saveAsCollection'),
}}
variant="subtle"
/>
@@ -120,9 +116,7 @@ export const SaveAsCollectionButton = ({ fullWidth, itemType }: SaveAsCollection
<form onKeyDown={handleFormKeyDown} onSubmit={handleSubmit} ref={formRef}>
<Stack gap="sm">
<Text fw={500} size="sm" ta="center">
{t('page.collections.overrideExisting', {
postProcess: 'sentenceCase',
})}
{t('page.collections.overrideExisting')}
</Text>
<div className={styles.list}>
<ScrollArea>
@@ -146,10 +140,10 @@ export const SaveAsCollectionButton = ({ fullWidth, itemType }: SaveAsCollection
<TextInput autoFocus maxLength={128} {...form.getInputProps('name')} />
<Group gap="xs" justify="flex-end">
<Button onClick={handlers.close} type="button" variant="subtle">
{t('common.cancel', { postProcess: 'sentenceCase' })}
{t('common.cancel')}
</Button>
<Button type="submit" variant="filled">
{t('common.save', { postProcess: 'sentenceCase' })}
{t('common.save')}
</Button>
</Group>
</Stack>
@@ -15,7 +15,7 @@ export const SettingsButton = ({ ...props }: SettingsButtonProps) => {
...props.iconProps,
}}
tooltip={{
label: t('common.configure', { postProcess: 'sentenceCase' }),
label: t('common.configure'),
...props.tooltip,
}}
variant="subtle"
@@ -96,15 +96,11 @@ export const TableConfig = ({
<SegmentedControl
data={[
{
label: t('table.config.general.pagination_infinite', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.pagination_infinite'),
value: ListPaginationType.INFINITE,
},
{
label: t('table.config.general.pagination_paginate', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.pagination_paginate'),
value: ListPaginationType.PAGINATED,
},
]}
@@ -117,7 +113,7 @@ export const TableConfig = ({
/>
),
id: 'pagination',
label: t('table.config.general.pagination', { postProcess: 'sentenceCase' }),
label: t('table.config.general.pagination'),
size: 'sm',
},
{
@@ -145,9 +141,7 @@ export const TableConfig = ({
id: 'itemsPerPage',
label: (
<Group>
{t('table.config.general.pagination_itemsPerPage', {
postProcess: 'sentenceCase',
})}
{t('table.config.general.pagination_itemsPerPage')}
<Badge>{list.itemsPerPage}</Badge>
</Group>
),
@@ -157,21 +151,15 @@ export const TableConfig = ({
<SegmentedControl
data={[
{
label: t('table.config.general.size_compact', {
postProcess: 'titleCase',
}),
label: t('table.config.general.size_compact'),
value: 'compact',
},
{
label: t('table.config.general.size_default', {
postProcess: 'titleCase',
}),
label: t('table.config.general.size_default'),
value: 'default',
},
{
label: t('table.config.general.size_large', {
postProcess: 'titleCase',
}),
label: t('table.config.general.size_large'),
value: 'large',
},
]}
@@ -186,9 +174,7 @@ export const TableConfig = ({
/>
),
id: 'size',
label: t('table.config.general.size', {
postProcess: 'titleCase',
}),
label: t('table.config.general.size'),
},
{
component: (
@@ -198,9 +184,7 @@ export const TableConfig = ({
/>
),
id: 'enableHeader',
label: t('table.config.general.showHeader', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.showHeader'),
},
{
component: (
@@ -210,9 +194,7 @@ export const TableConfig = ({
/>
),
id: 'enableRowHoverHighlight',
label: t('table.config.general.rowHoverHighlight', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.rowHoverHighlight'),
},
{
component: (
@@ -222,9 +204,7 @@ export const TableConfig = ({
/>
),
id: 'enableAlternateRowColors',
label: t('table.config.general.alternateRowColors', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.alternateRowColors'),
},
{
component: (
@@ -234,9 +214,7 @@ export const TableConfig = ({
/>
),
id: 'enableHorizontalBorders',
label: t('table.config.general.horizontalBorders', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.horizontalBorders'),
},
{
component: (
@@ -246,9 +224,7 @@ export const TableConfig = ({
/>
),
id: 'enableVerticalBorders',
label: t('table.config.general.verticalBorders', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.verticalBorders'),
},
{
component: (
@@ -260,7 +236,7 @@ export const TableConfig = ({
/>
),
id: 'autoFitColumns',
label: t('table.config.general.autoFitColumns', { postProcess: 'sentenceCase' }),
label: t('table.config.general.autoFitColumns'),
},
...(extraOptions || []),
];
@@ -494,12 +470,10 @@ const TableColumnConfig = ({
return (
<Stack gap="xs">
<Group justify="space-between" mb="md">
<Text size="sm">{t('common.tableColumns', { postProcess: 'sentenceCase' })}</Text>
<Text size="sm">{t('common.tableColumns')}</Text>
<TextInput
onChange={(e) => setSearchColumns(e.currentTarget.value)}
placeholder={t('common.search', {
postProcess: 'sentenceCase',
})}
placeholder={t('common.search')}
size="xs"
/>
</Group>
@@ -684,9 +658,7 @@ const TableColumnItem = memo(
onClick={() => handleMoveUp(item)}
size="xs"
tooltip={{
label: t('table.config.general.moveUp', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.moveUp'),
}}
variant="subtle"
/>
@@ -696,9 +668,7 @@ const TableColumnItem = memo(
onClick={() => handleMoveDown(item)}
size="xs"
tooltip={{
label: t('table.config.general.moveDown', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.moveDown'),
}}
variant="subtle"
/>
@@ -711,9 +681,7 @@ const TableColumnItem = memo(
onClick={() => handlePinToLeft(item)}
size="xs"
tooltip={{
label: t('table.config.general.pinToLeft', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.pinToLeft'),
}}
variant={item.pinned === 'left' ? 'filled' : 'subtle'}
/>
@@ -723,9 +691,7 @@ const TableColumnItem = memo(
onClick={() => handlePinToRight(item)}
size="xs"
tooltip={{
label: t('table.config.general.pinToRight', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.pinToRight'),
}}
variant={item.pinned === 'right' ? 'filled' : 'subtle'}
/>
@@ -738,9 +704,7 @@ const TableColumnItem = memo(
onClick={() => handleAlignLeft(item)}
size="xs"
tooltip={{
label: t('table.config.general.alignLeft', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.alignLeft'),
}}
variant={item.align === 'start' ? 'filled' : 'subtle'}
/>
@@ -750,9 +714,7 @@ const TableColumnItem = memo(
onClick={() => handleAlignCenter(item)}
size="xs"
tooltip={{
label: t('table.config.general.alignCenter', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.alignCenter'),
}}
variant={item.align === 'center' ? 'filled' : 'subtle'}
/>
@@ -762,9 +724,7 @@ const TableColumnItem = memo(
onClick={() => handleAlignRight(item)}
size="xs"
tooltip={{
label: t('table.config.general.alignRight', {
postProcess: 'sentenceCase',
}),
label: t('table.config.general.alignRight'),
}}
variant={item.align === 'end' ? 'filled' : 'subtle'}
/>
@@ -773,11 +733,7 @@ const TableColumnItem = memo(
className={clsx(styles.group, styles.numberInput)}
hideControls={false}
leftSection={
<Tooltip
label={t('table.config.general.autosize', {
postProcess: 'sentenceCase',
})}
>
<Tooltip label={t('table.config.general.autosize')}>
<Checkbox
checked={item.autoSize}
id={item.id}