Skip to content

Commit 7758372

Browse files
committed
Add more page titles
1 parent 228a9a4 commit 7758372

File tree

14 files changed

+223
-56
lines changed

14 files changed

+223
-56
lines changed

examples/demo/src/categories/CategoryEdit.tsx

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import {
1010
TextInput,
1111
useTranslate,
1212
useRecordContext,
13+
useDefaultTitle,
14+
useGetResourceLabel,
1315
} from 'react-admin';
1416

1517
import ThumbnailField from '../products/ThumbnailField';
@@ -59,14 +61,21 @@ const CategoryEdit = () => (
5961
);
6062

6163
const CategoryTitle = () => {
64+
const appTitle = useDefaultTitle();
6265
const record = useRecordContext<Category>();
6366
const translate = useTranslate();
67+
const getResourceLabel = useGetResourceLabel();
68+
69+
const pageTitle = translate('ra.page.edit', {
70+
name: getResourceLabel('categories', 1),
71+
recordRepresentation: `"${record?.name}"`,
72+
});
6473

6574
return record ? (
66-
<span>
67-
{translate('resources.categories.name', { smart_count: 1 })} &quot;
68-
{record.name}&quot;
69-
</span>
75+
<>
76+
<title>{`${appTitle} - ${pageTitle}`}</title>
77+
<span>{pageTitle}</span>
78+
</>
7079
) : null;
7180
};
7281

examples/demo/src/categories/CategoryList.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import {
33
EditButton,
44
List,
55
RecordContextProvider,
6+
useDefaultTitle,
7+
useGetResourceLabel,
68
useListContext,
9+
useTranslate,
710
} from 'react-admin';
811
import {
912
Grid,
@@ -18,13 +21,29 @@ import { humanize } from 'inflection';
1821
import LinkToRelatedProducts from './LinkToRelatedProducts';
1922
import { Category } from '../types';
2023

24+
const CategoriesTitle = () => {
25+
const title = useDefaultTitle();
26+
const translate = useTranslate();
27+
const getResourceLabel = useGetResourceLabel();
28+
const pageTitle = translate('ra.page.list', {
29+
name: getResourceLabel('categories', 2),
30+
});
31+
return (
32+
<>
33+
<title>{`${title} - ${pageTitle}`}</title>
34+
<span>{pageTitle}</span>
35+
</>
36+
);
37+
};
38+
2139
const CategoryList = () => (
2240
<List
2341
sort={{ field: 'name', order: 'ASC' }}
2442
perPage={20}
2543
pagination={false}
2644
component="div"
2745
actions={false}
46+
title={<CategoriesTitle />}
2847
>
2948
<CategoryGrid />
3049
</List>

examples/demo/src/invoices/InvoiceList.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import {
1212
SelectColumnsButton,
1313
ReferenceInput,
1414
FilterButton,
15+
useDefaultTitle,
16+
useTranslate,
17+
useGetResourceLabel,
1518
} from 'react-admin';
1619

1720
import FullNameField from '../visitors/FullNameField';
@@ -33,12 +36,28 @@ const ListActions = () => (
3336
</TopToolbar>
3437
);
3538

39+
const InvoicesTitle = () => {
40+
const title = useDefaultTitle();
41+
const translate = useTranslate();
42+
const getResourceLabel = useGetResourceLabel();
43+
const pageTitle = translate('ra.page.list', {
44+
name: getResourceLabel('invoices', 2),
45+
});
46+
return (
47+
<>
48+
<title>{`${title} - ${pageTitle}`}</title>
49+
<span>{pageTitle}</span>
50+
</>
51+
);
52+
};
53+
3654
const InvoiceList = () => (
3755
<List
3856
filters={listFilters}
3957
perPage={25}
4058
sort={{ field: 'date', order: 'DESC' }}
4159
actions={<ListActions />}
60+
title={<InvoicesTitle />}
4261
>
4362
<DatagridConfigurable
4463
rowClick="expand"

examples/demo/src/orders/OrderEdit.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
Toolbar,
1414
useRecordContext,
1515
useTranslate,
16+
useDefaultTitle,
1617
} from 'react-admin';
1718
import { Card, CardContent, Box, Grid, Typography, Link } from '@mui/material';
1819

@@ -27,14 +28,17 @@ const OrderEdit = () => (
2728
);
2829

2930
const OrderTitle = () => {
31+
const appTitle = useDefaultTitle();
3032
const translate = useTranslate();
3133
const record = useRecordContext<Order>();
34+
const pageTitle = translate('resources.orders.title', {
35+
reference: record?.reference,
36+
});
3237
return record ? (
33-
<span>
34-
{translate('resources.orders.title', {
35-
reference: record.reference,
36-
})}
37-
</span>
38+
<>
39+
<title>{`${appTitle} - ${pageTitle}`}</title>
40+
<span>{pageTitle}</span>
41+
</>
3842
) : null;
3943
};
4044

examples/demo/src/orders/OrderList.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ import {
1919
SelectColumnsButton,
2020
TextField,
2121
TopToolbar,
22+
useDefaultTitle,
23+
useGetResourceLabel,
2224
useListContext,
25+
useTranslate,
2326
} from 'react-admin';
2427
import { useMediaQuery, Divider, Tabs, Tab, Theme } from '@mui/material';
2528

@@ -36,13 +39,29 @@ const ListActions = () => (
3639
</TopToolbar>
3740
);
3841

42+
const OrdersTitle = () => {
43+
const title = useDefaultTitle();
44+
const translate = useTranslate();
45+
const getResourceLabel = useGetResourceLabel();
46+
const pageTitle = translate('ra.page.list', {
47+
name: getResourceLabel('orders', 2),
48+
});
49+
return (
50+
<>
51+
<title>{`${title} - ${pageTitle}`}</title>
52+
<span>{pageTitle}</span>
53+
</>
54+
);
55+
};
56+
3957
const OrderList = () => (
4058
<List
4159
filterDefaultValues={{ status: 'ordered' }}
4260
sort={{ field: 'date', order: 'DESC' }}
4361
perPage={25}
4462
filters={orderFilters}
4563
actions={<ListActions />}
64+
title={<OrdersTitle />}
4665
>
4766
<TabbedDatagrid />
4867
</List>

examples/demo/src/products/ProductCreate.tsx

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
required,
77
useDefaultTitle,
88
useGetResourceLabel,
9-
useResourceContext,
109
useTranslate,
1110
} from 'react-admin';
1211
import { ProductEditDetails } from './ProductEditDetails';
@@ -17,22 +16,16 @@ const RichTextInput = React.lazy(() =>
1716
);
1817

1918
const ProductTitle = () => {
20-
const title = useDefaultTitle();
19+
const appTitle = useDefaultTitle();
2120
const translate = useTranslate();
22-
const resource = useResourceContext();
2321
const getResourceLabel = useGetResourceLabel();
24-
if (!resource) {
25-
throw new Error(
26-
'useCreateController requires a non-empty resource prop or context'
27-
);
28-
}
29-
const defaultTitle = translate('ra.page.create', {
30-
name: getResourceLabel(resource, 1),
22+
const pageTitle = translate('ra.page.create', {
23+
name: getResourceLabel('products', 1),
3124
});
3225
return (
3326
<>
34-
<title>{`${title} - ${defaultTitle}`}</title>
35-
<span>{defaultTitle}</span>
27+
<title>{`${appTitle} - ${pageTitle}`}</title>
28+
<span>{pageTitle}</span>
3629
</>
3730
);
3831
};

examples/demo/src/products/ProductEdit.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import {
1313
TextInput,
1414
useRecordContext,
1515
useDefaultTitle,
16+
useTranslate,
17+
useGetResourceLabel,
1618
} from 'react-admin';
1719
import PhotoCameraIcon from '@mui/icons-material/PhotoCamera';
1820
import AspectRatioIcon from '@mui/icons-material/AspectRatio';
@@ -33,13 +35,19 @@ const RichTextInput = React.lazy(() =>
3335
);
3436

3537
const ProductTitle = () => {
36-
const title = useDefaultTitle();
37-
38+
const appTitle = useDefaultTitle();
39+
const translate = useTranslate();
3840
const record = useRecordContext<Product>();
41+
const getResourceLabel = useGetResourceLabel();
42+
43+
const pageTitle = translate('ra.page.edit', {
44+
name: getResourceLabel('products', 1),
45+
recordRepresentation: `"${record?.reference}"`,
46+
});
3947
return record ? (
4048
<>
41-
<title>{`${title} - Poster "${record.reference}`}</title>
42-
<span>Poster "{record.reference}"</span>
49+
<title>{`${appTitle} - ${pageTitle}`}</title>
50+
<span>{pageTitle}</span>
4351
</>
4452
) : null;
4553
};

examples/demo/src/products/ProductList.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,17 @@ import ImageList from './GridList';
2525
import Aside from './Aside';
2626

2727
const ProductList = () => {
28-
const title = useDefaultTitle();
28+
const appTitle = useDefaultTitle();
29+
const translate = useTranslate();
2930
const getResourceLabel = useGetResourceLabel();
31+
const pageTitle = translate('ra.page.list', {
32+
name: getResourceLabel('products', 2),
33+
});
3034
const isSmall = useMediaQuery<Theme>(theme => theme.breakpoints.down('md'));
3135
return (
3236
<ListBase perPage={24} sort={{ field: 'reference', order: 'ASC' }}>
33-
<title>{`${title} - ${getResourceLabel('products', 2)}`}</title>
34-
<Title defaultTitle={getResourceLabel('products', 2)} />
37+
<title>{`${appTitle} - ${pageTitle}`}</title>
38+
<Title defaultTitle={pageTitle} />
3539
<FilterContext.Provider value={productFilters}>
3640
<ListActions isSmall={isSmall} />
3741
{isSmall && (

examples/demo/src/reviews/ReviewCreate.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,29 @@ import {
1010
useNotify,
1111
useRedirect,
1212
getRecordFromLocation,
13+
useDefaultTitle,
14+
useTranslate,
15+
useGetResourceLabel,
1316
} from 'react-admin';
1417
import { useLocation } from 'react-router';
1518

1619
import StarRatingInput from './StarRatingInput';
1720

21+
const ReviewTitle = () => {
22+
const appTitle = useDefaultTitle();
23+
const translate = useTranslate();
24+
const getResourceLabel = useGetResourceLabel();
25+
const pageTitle = translate('ra.page.create', {
26+
name: getResourceLabel('reviews', 1),
27+
});
28+
return (
29+
<>
30+
<title>{`${appTitle} - ${pageTitle}`}</title>
31+
<span>{pageTitle}</span>
32+
</>
33+
);
34+
};
35+
1836
const ReviewCreate = () => {
1937
const notify = useNotify();
2038
const redirect = useRedirect();
@@ -31,7 +49,7 @@ const ReviewCreate = () => {
3149
};
3250

3351
return (
34-
<Create mutationOptions={{ onSuccess }}>
52+
<Create mutationOptions={{ onSuccess }} title={<ReviewTitle />}>
3553
<SimpleForm
3654
defaultValues={{ status: 'pending' }}
3755
sx={{

examples/demo/src/reviews/ReviewList.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import {
77
List,
88
SelectColumnsButton,
99
TopToolbar,
10+
useDefaultTitle,
11+
useGetResourceLabel,
12+
useTranslate,
1013
} from 'react-admin';
1114
import { matchPath, useLocation, useNavigate } from 'react-router-dom';
1215
import { Box, Drawer, useMediaQuery, Theme } from '@mui/material';
@@ -25,6 +28,21 @@ const ReviewListActions = () => (
2528
</TopToolbar>
2629
);
2730

31+
const ReviewsTitle = () => {
32+
const title = useDefaultTitle();
33+
const translate = useTranslate();
34+
const getResourceLabel = useGetResourceLabel();
35+
const pageTitle = translate('ra.page.list', {
36+
name: getResourceLabel('reviews', 2),
37+
});
38+
return (
39+
<>
40+
<title>{`${title} - ${pageTitle}`}</title>
41+
<span>{pageTitle}</span>
42+
</>
43+
);
44+
};
45+
2846
const ReviewList = () => {
2947
const isXSmall = useMediaQuery<Theme>(theme =>
3048
theme.breakpoints.down('sm')
@@ -53,6 +71,7 @@ const ReviewList = () => {
5371
perPage={25}
5472
sort={{ field: 'date', order: 'DESC' }}
5573
actions={<ReviewListActions />}
74+
title={<ReviewsTitle />}
5675
>
5776
{isXSmall ? (
5877
<ReviewListMobile />

0 commit comments

Comments
 (0)