Skip to content

Commit 47bc8f9

Browse files
committed
EES-4368 api data set preview token log
1 parent c144a5a commit 47bc8f9

7 files changed

+468
-45
lines changed

src/explore-education-statistics-admin/src/pages/release/ReleasePageContainer.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import {
3232
releaseApiDataSetLocationsMappingRoute,
3333
releaseApiDataSetPreviewRoute,
3434
releaseApiDataSetPreviewTokenRoute,
35+
releaseApiDataSetPreviewTokenLogRoute,
3536
} from '@admin/routes/releaseRoutes';
3637
import LoadingSpinner from '@common/components/LoadingSpinner';
3738
import Tag from '@common/components/Tag';
@@ -63,6 +64,7 @@ const routes = [
6364
releaseApiDataSetLocationsMappingRoute,
6465
releaseApiDataSetPreviewRoute,
6566
releaseApiDataSetPreviewTokenRoute,
67+
releaseApiDataSetPreviewTokenLogRoute,
6668
releaseSummaryEditRoute,
6769
releaseFootnotesCreateRoute,
6870
releaseFootnotesEditRoute,

src/explore-education-statistics-admin/src/pages/release/data/ReleaseApiDataSetDetailsPage.tsx

+31-14
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import apiDataSetQueries from '@admin/queries/apiDataSetQueries';
88
import {
99
releaseApiDataSetLocationsMappingRoute,
1010
releaseApiDataSetPreviewRoute,
11+
releaseApiDataSetPreviewTokenLogRoute,
1112
releaseApiDataSetsRoute,
1213
ReleaseDataSetRouteParams,
1314
ReleaseRouteParams,
@@ -67,20 +68,36 @@ export default function ReleaseApiDataSetDetailsPage() {
6768
actions={
6869
<ul className="govuk-list">
6970
{dataSet.draftVersion.status === 'Draft' && (
70-
<li>
71-
<Link
72-
to={generatePath<ReleaseDataSetRouteParams>(
73-
releaseApiDataSetPreviewRoute.path,
74-
{
75-
publicationId: release.publicationId,
76-
releaseId: release.id,
77-
dataSetId,
78-
},
79-
)}
80-
>
81-
Preview API data set
82-
</Link>
83-
</li>
71+
<>
72+
<li>
73+
<Link
74+
to={generatePath<ReleaseDataSetRouteParams>(
75+
releaseApiDataSetPreviewRoute.path,
76+
{
77+
publicationId: release.publicationId,
78+
releaseId: release.id,
79+
dataSetId,
80+
},
81+
)}
82+
>
83+
Preview API data set
84+
</Link>
85+
</li>
86+
<li>
87+
<Link
88+
to={generatePath<ReleaseDataSetRouteParams>(
89+
releaseApiDataSetPreviewTokenLogRoute.path,
90+
{
91+
publicationId: release.publicationId,
92+
releaseId: release.id,
93+
dataSetId,
94+
},
95+
)}
96+
>
97+
View API data set token log
98+
</Link>
99+
</li>
100+
</>
84101
)}
85102
{canUpdateRelease && dataSet.draftVersion.status !== 'Processing' && (
86103
<li>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
import Link from '@admin/components/Link';
2+
import {
3+
releaseApiDataSetDetailsRoute,
4+
releaseApiDataSetPreviewTokenRoute,
5+
ReleaseDataSetPreviewTokenRouteParams,
6+
ReleaseDataSetRouteParams,
7+
} from '@admin/routes/releaseRoutes';
8+
import previewTokenQueries from '@admin/queries/previewTokenQueries';
9+
import apiDataSetQueries from '@admin/queries/apiDataSetQueries';
10+
import previewTokenService from '@admin/services/previewTokenService';
11+
import LoadingSpinner from '@common/components/LoadingSpinner';
12+
import ModalConfirm from '@common/components/ModalConfirm';
13+
import FormattedDate from '@common/components/FormattedDate';
14+
import ButtonText from '@common/components/ButtonText';
15+
import Tag from '@common/components/Tag';
16+
import VisuallyHidden from '@common/components/VisuallyHidden';
17+
import { useQuery } from '@tanstack/react-query';
18+
import { generatePath, useParams } from 'react-router-dom';
19+
import React from 'react';
20+
21+
export default function ReleaseApiDataSetPreviewTokenLogPage() {
22+
const { dataSetId, releaseId, publicationId } =
23+
useParams<ReleaseDataSetPreviewTokenRouteParams>();
24+
25+
const { data: dataSet, isLoading: isLoadingDataSet } = useQuery(
26+
apiDataSetQueries.get(dataSetId),
27+
);
28+
29+
const {
30+
data: previewTokens,
31+
isLoading: isLoadingPreviewTokens,
32+
refetch: refetchTokens,
33+
} = useQuery({
34+
...previewTokenQueries.list(dataSet?.draftVersion?.id ?? ''),
35+
enabled: !!dataSet?.draftVersion,
36+
});
37+
38+
const handleRevoke = async (id: string) => {
39+
await previewTokenService.revokePreviewToken(id);
40+
refetchTokens();
41+
};
42+
43+
return (
44+
<>
45+
<Link
46+
back
47+
className="govuk-!-margin-bottom-6"
48+
to={generatePath<ReleaseDataSetRouteParams>(
49+
releaseApiDataSetDetailsRoute.path,
50+
{
51+
publicationId,
52+
releaseId,
53+
dataSetId,
54+
},
55+
)}
56+
>
57+
Back to API data set details
58+
</Link>
59+
<LoadingSpinner loading={isLoadingDataSet || isLoadingPreviewTokens}>
60+
<div className="govuk-grid-row">
61+
<div className="govuk-grid-column-three-quarters">
62+
<span className="govuk-caption-l">API preview token log</span>
63+
<h2>{dataSet?.title}</h2>
64+
</div>
65+
</div>
66+
67+
{previewTokens?.length ? (
68+
<table>
69+
<caption>
70+
<VisuallyHidden>
71+
Table showing preview tokens for the API data set
72+
</VisuallyHidden>
73+
</caption>
74+
<thead>
75+
<tr>
76+
<th>Reference</th>
77+
<th>User</th>
78+
<th>Date generated</th>
79+
<th>Status</th>
80+
<th>Expiry</th>
81+
<th className="govuk-!-text-align-right">Action</th>
82+
</tr>
83+
</thead>
84+
<tbody>
85+
{previewTokens.map(token => {
86+
return (
87+
<tr key={token.id}>
88+
<td>{token.label}</td>
89+
<td>{token.createdByEmail}</td>
90+
<td>
91+
<FormattedDate format="d MMMM yyyy, HH:mm">
92+
{token.created}
93+
</FormattedDate>
94+
</td>
95+
<td>
96+
<Tag
97+
colour={token.status === 'Active' ? 'green' : 'grey'}
98+
>
99+
{token.status}
100+
</Tag>
101+
</td>
102+
<td>
103+
<FormattedDate format="d MMMM yyyy, HH:mm">
104+
{token.expiry}
105+
</FormattedDate>
106+
</td>
107+
<td className="govuk-!-text-align-right">
108+
{token.status === 'Active' && (
109+
<>
110+
<Link
111+
to={generatePath<ReleaseDataSetPreviewTokenRouteParams>(
112+
releaseApiDataSetPreviewTokenRoute.path,
113+
{
114+
publicationId,
115+
releaseId,
116+
dataSetId,
117+
previewTokenId: token.id,
118+
},
119+
)}
120+
>
121+
View details
122+
<VisuallyHidden> for {token.label}</VisuallyHidden>
123+
</Link>
124+
<ModalConfirm
125+
title="Revoke this token"
126+
triggerButton={
127+
<ButtonText className="govuk-!-margin-left-2">
128+
Revoke
129+
<VisuallyHidden> {token.label}</VisuallyHidden>
130+
</ButtonText>
131+
}
132+
onConfirm={() => handleRevoke(token.id)}
133+
>
134+
<p>Are you sure you want to revoke this token?</p>
135+
</ModalConfirm>
136+
</>
137+
)}
138+
</td>
139+
</tr>
140+
);
141+
})}
142+
</tbody>
143+
</table>
144+
) : (
145+
<p>No tokens have been created.</p>
146+
)}
147+
</LoadingSpinner>
148+
</>
149+
);
150+
}

src/explore-education-statistics-admin/src/pages/release/data/ReleaseApiDataSetPreviewTokenPage.tsx

+54-18
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ import { useConfig } from '@admin/contexts/ConfigContext';
33
import {
44
releaseApiDataSetDetailsRoute,
55
releaseApiDataSetPreviewRoute,
6+
releaseApiDataSetPreviewTokenLogRoute,
67
ReleaseDataSetPreviewTokenRouteParams,
78
ReleaseDataSetRouteParams,
89
} from '@admin/routes/releaseRoutes';
910
import previewTokenQueries from '@admin/queries/previewTokenQueries';
1011
import apiDataSetQueries from '@admin/queries/apiDataSetQueries';
1112
import previewTokenService from '@admin/services/previewTokenService';
13+
import { useLastLocation } from '@admin/contexts/LastLocationContext';
1214
import LoadingSpinner from '@common/components/LoadingSpinner';
1315
import Button from '@common/components/Button';
1416
import CopyTextButton from '@common/components/CopyTextButton';
@@ -21,6 +23,8 @@ import React from 'react';
2123

2224
export default function ReleaseApiDataSetPreviewTokenPage() {
2325
const history = useHistory();
26+
const lastLocation = useLastLocation();
27+
2428
const { publicApiBaseUrl, publicApiDocsUrl } = useConfig();
2529

2630
const { dataSetId, previewTokenId, releaseId, publicationId } =
@@ -34,18 +38,40 @@ export default function ReleaseApiDataSetPreviewTokenPage() {
3438
...previewTokenQueries.get(previewTokenId),
3539
});
3640

41+
const previewPagePath = generatePath<ReleaseDataSetRouteParams>(
42+
releaseApiDataSetPreviewRoute.path,
43+
{
44+
publicationId,
45+
releaseId,
46+
dataSetId,
47+
},
48+
);
49+
50+
const detailsPagePath = generatePath<ReleaseDataSetRouteParams>(
51+
releaseApiDataSetDetailsRoute.path,
52+
{
53+
publicationId,
54+
releaseId,
55+
dataSetId,
56+
},
57+
);
58+
59+
const tokenLogPagePath = generatePath<ReleaseDataSetRouteParams>(
60+
releaseApiDataSetPreviewTokenLogRoute.path,
61+
{
62+
publicationId,
63+
releaseId,
64+
dataSetId,
65+
},
66+
);
67+
3768
const handleRevoke = async (id: string) => {
3869
await previewTokenService.revokePreviewToken(id);
3970

4071
history.push(
41-
generatePath<ReleaseDataSetRouteParams>(
42-
releaseApiDataSetPreviewRoute.path,
43-
{
44-
publicationId,
45-
releaseId,
46-
dataSetId,
47-
},
48-
),
72+
lastLocation?.pathname === tokenLogPagePath
73+
? tokenLogPagePath
74+
: previewPagePath,
4975
);
5076
};
5177

@@ -54,16 +80,15 @@ export default function ReleaseApiDataSetPreviewTokenPage() {
5480
<Link
5581
back
5682
className="govuk-!-margin-bottom-6"
57-
to={generatePath<ReleaseDataSetRouteParams>(
58-
releaseApiDataSetDetailsRoute.path,
59-
{
60-
publicationId,
61-
releaseId,
62-
dataSetId,
63-
},
64-
)}
83+
to={
84+
lastLocation?.pathname === tokenLogPagePath
85+
? tokenLogPagePath
86+
: detailsPagePath
87+
}
6588
>
66-
Back to API data set details
89+
{lastLocation?.pathname === tokenLogPagePath
90+
? 'Back to API preview token log'
91+
: ' Back to API data set details'}
6792
</Link>
6893
<LoadingSpinner loading={isLoadingDataSet || isLoadingPreviewTokenId}>
6994
<div className="govuk-grid-row">
@@ -109,7 +134,18 @@ export default function ReleaseApiDataSetPreviewTokenPage() {
109134
<p>Are you sure you want to revoke this token?</p>
110135
</ModalConfirm>
111136
<p>
112-
<Link to="todo">View API data set token log</Link>
137+
<Link
138+
to={generatePath<ReleaseDataSetRouteParams>(
139+
releaseApiDataSetPreviewTokenLogRoute.path,
140+
{
141+
publicationId,
142+
releaseId,
143+
dataSetId,
144+
},
145+
)}
146+
>
147+
View API data set token log
148+
</Link>
113149
</p>
114150
<h3>API data set endpoints quick start</h3>
115151
{dataSet?.draftVersion && (

0 commit comments

Comments
 (0)