Skip to content

Commit 91725da

Browse files
authored
Merge pull request #5171 from dfe-analytical-services/ees-5424
EES-5424 Add deleted and new location group tables to location mappings page
2 parents 3aef7ce + a4ea81e commit 91725da

34 files changed

+1495
-278
lines changed

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

+25-7
Original file line numberDiff line numberDiff line change
@@ -108,16 +108,32 @@ export default function ReleaseApiDataSetFiltersMappingPage() {
108108

109109
const navItems: NavItem[] = useMemo(() => {
110110
return [
111+
...(Object.keys(mappableFilters).length > 0
112+
? [
113+
{
114+
id: 'mappable-filter-columns',
115+
text: 'Filter columns not found in new data set',
116+
},
117+
]
118+
: []),
111119
{
112120
id: 'mappable-filter-options',
113-
text: 'Filter options not found in the new data set',
121+
text: 'Filter options not found in new data set',
114122
subNavItems: Object.keys(mappableFilterOptions).map(filterKey => {
115123
return {
116124
id: `mappable-filter-options-${kebabCase(filterKey)}`,
117125
text: filtersMapping?.mappings[filterKey].source.label ?? filterKey,
118126
};
119127
}),
120128
},
129+
...(Object.keys(newFilters).length > 0
130+
? [
131+
{
132+
id: 'new-filter-columns',
133+
text: 'New filter columns',
134+
},
135+
]
136+
: []),
121137
{
122138
id: 'new-filter-options',
123139
text: 'New filter options',
@@ -315,7 +331,7 @@ export default function ReleaseApiDataSetFiltersMappingPage() {
315331
className="govuk-heading-l dfe-flex dfe-align-items--center"
316332
id="mappable-filter-columns"
317333
>
318-
Filter columns not found in the new data set{' '}
334+
Filter columns not found in new data set{' '}
319335
<Tag className="govuk-!-margin-left-2" colour="grey">
320336
No action required
321337
</Tag>
@@ -328,7 +344,7 @@ export default function ReleaseApiDataSetFiltersMappingPage() {
328344
)}
329345

330346
<h3 className="govuk-heading-l" id="mappable-filter-options">
331-
Filter options not found in the new data set
347+
Filter options not found in new data set
332348
</h3>
333349

334350
{Object.keys(mappableFilterOptions).length > 0 && filtersMapping ? (
@@ -349,9 +365,9 @@ export default function ReleaseApiDataSetFiltersMappingPage() {
349365
<br />
350366
<div className="govuk-!-font-size-19 govuk-!-margin-top-4">
351367
Column:{' '}
352-
<span className="govuk-!-font-weight-regular">
368+
<code className="govuk-!-font-weight-regular">
353369
{filterKey}
354-
</span>
370+
</code>
355371
</div>
356372
</>
357373
}
@@ -395,11 +411,12 @@ export default function ReleaseApiDataSetFiltersMappingPage() {
395411
if (newFilterOptions[filterKey].length) {
396412
const filterLabel =
397413
filtersMapping.candidates[filterKey].label;
414+
398415
return (
399416
<AccordionSection
400417
caption={
401418
<>
402-
<strong>Column:</strong> {filterKey}
419+
<strong>Column:</strong> <code>{filterKey}</code>
403420
</>
404421
}
405422
goToTop={false}
@@ -446,11 +463,12 @@ export default function ReleaseApiDataSetFiltersMappingPage() {
446463
) {
447464
const filterLabel =
448465
filtersMapping.mappings[filterKey].source.label;
466+
449467
return (
450468
<AccordionSection
451469
caption={
452470
<>
453-
<strong>Column:</strong> {filterKey}
471+
<strong>Column:</strong> <code>{filterKey}</code>
454472
</>
455473
}
456474
goToTop={false}

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

+95-24
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,44 @@
1-
import Link from '@admin/components/Link';
21
import ButtonLink from '@admin/components/ButtonLink';
2+
import Link from '@admin/components/Link';
3+
import ApiDataSetAutoMappedTable from '@admin/pages/release/data/components/ApiDataSetAutoMappedTable';
4+
import ApiDataSetDeletedLocationGroupsTable from '@admin/pages/release/data/components/ApiDataSetDeletedLocationGroupsTable';
5+
import ApiDataSetLocationCode from '@admin/pages/release/data/components/ApiDataSetLocationCode';
6+
import ApiDataSetMappableTable from '@admin/pages/release/data/components/ApiDataSetMappableTable';
7+
import ApiDataSetNewItemsTable from '@admin/pages/release/data/components/ApiDataSetNewItemsTable';
8+
import ApiDataSetNewLocationGroupsTable from '@admin/pages/release/data/components/ApiDataSetNewLocationGroupsTable';
9+
import { PendingMappingUpdate } from '@admin/pages/release/data/types/apiDataSetMappings';
310
import getApiDataSetLocationMappings, {
411
AutoMappedLocation,
512
LocationCandidateWithKey,
613
MappableLocation,
714
} from '@admin/pages/release/data/utils/getApiDataSetLocationMappings';
8-
import ApiDataSetMappableTable from '@admin/pages/release/data/components/ApiDataSetMappableTable';
9-
import ApiDataSetNewItemsTable from '@admin/pages/release/data/components/ApiDataSetNewItemsTable';
10-
import ApiDataSetAutoMappedTable from '@admin/pages/release/data/components/ApiDataSetAutoMappedTable';
11-
import ApiDataSetLocationCode from '@admin/pages/release/data/components/ApiDataSetLocationCode';
12-
import { PendingMappingUpdate } from '@admin/pages/release/data/types/apiDataSetMappings';
1315
import getUnmappedLocationErrors from '@admin/pages/release/data/utils/getUnmappedLocationErrors';
14-
import getApiDataSetLocationCodes from '@admin/pages/release/data/utils/getApiDataSetLocationCodes';
16+
import apiDataSetQueries from '@admin/queries/apiDataSetQueries';
17+
import apiDataSetVersionQueries from '@admin/queries/apiDataSetVersionQueries';
1518
import {
1619
releaseApiDataSetDetailsRoute,
1720
ReleaseDataSetRouteParams,
1821
} from '@admin/routes/releaseRoutes';
19-
import apiDataSetVersionQueries from '@admin/queries/apiDataSetVersionQueries';
20-
import apiDataSetQueries from '@admin/queries/apiDataSetQueries';
2122
import apiDataSetVersionService, {
2223
LocationCandidate,
2324
} from '@admin/services/apiDataSetVersionService';
24-
import Tag from '@common/components/Tag';
25-
import LoadingSpinner from '@common/components/LoadingSpinner';
2625
import Accordion from '@common/components/Accordion';
2726
import AccordionSection from '@common/components/AccordionSection';
28-
import PageNav, { NavItem } from '@common/components/PageNav';
27+
import LoadingSpinner from '@common/components/LoadingSpinner';
2928
import NotificationBanner from '@common/components/NotificationBanner';
29+
import PageNav, { NavItem } from '@common/components/PageNav';
3030
import SummaryListItem from '@common/components/SummaryListItem';
31+
import Tag from '@common/components/Tag';
32+
import useDebouncedCallback from '@common/hooks/useDebouncedCallback';
3133
import locationLevelsMap, {
3234
LocationLevelKey,
3335
} from '@common/utils/locationLevelsMap';
34-
import useDebouncedCallback from '@common/hooks/useDebouncedCallback';
3536
import typedKeys from '@common/utils/object/typedKeys';
3637
import { useQuery } from '@tanstack/react-query';
38+
import compact from 'lodash/compact';
39+
import omit from 'lodash/omit';
3740
import React, { useCallback, useEffect, useMemo, useState } from 'react';
3841
import { generatePath, useParams } from 'react-router-dom';
39-
import omit from 'lodash/omit';
40-
import compact from 'lodash/compact';
4142
import { useImmer } from 'use-immer';
4243

4344
// Fields to omit from mapping diff.
@@ -56,6 +57,14 @@ export default function ReleaseApiDataSetLocationsMappingPage() {
5657
const [mappableLocations, updateMappableLocations] = useImmer<
5758
Partial<Record<LocationLevelKey, MappableLocation[]>>
5859
>({});
60+
61+
const [newLocationGroups, updateNewLocationGroups] = useImmer<
62+
Partial<Record<LocationLevelKey, LocationCandidate[]>>
63+
>({});
64+
const [deletedLocationGroups, updateDeletedLocationGroups] = useImmer<
65+
Partial<Record<LocationLevelKey, LocationCandidate[]>>
66+
>({});
67+
5968
const [pendingUpdates, setPendingUpdates] = useState<PendingMappingUpdate[]>(
6069
[],
6170
);
@@ -77,14 +86,20 @@ export default function ReleaseApiDataSetLocationsMappingPage() {
7786
useEffect(() => {
7887
if (locationsMapping) {
7988
const mappings = getApiDataSetLocationMappings(locationsMapping);
89+
8090
updateAutoMappedLocations(mappings.autoMappedLocations);
8191
updateNewLocations(mappings.newLocations);
8292
updateMappableLocations(mappings.mappableLocations);
93+
94+
updateNewLocationGroups(mappings.newLocationGroups);
95+
updateDeletedLocationGroups(mappings.deletedLocationGroups);
8396
}
8497
}, [
8598
locationsMapping,
8699
updateAutoMappedLocations,
100+
updateDeletedLocationGroups,
87101
updateMappableLocations,
102+
updateNewLocationGroups,
88103
updateNewLocations,
89104
]);
90105

@@ -100,11 +115,27 @@ export default function ReleaseApiDataSetLocationsMappingPage() {
100115

101116
const navItems: NavItem[] = useMemo(() => {
102117
return [
118+
...(Object.keys(deletedLocationGroups).length > 0
119+
? [
120+
{
121+
id: 'deleted-location-groups',
122+
text: 'Location groups not found in new data set',
123+
},
124+
]
125+
: []),
103126
{
104127
id: 'mappable-locations',
105-
text: 'Locations not found in the new data set',
128+
text: 'Locations not found in new data set',
106129
subNavItems: getSubNavItems(mappableLocations, 'mappable'),
107130
},
131+
...(Object.keys(newLocationGroups).length > 0
132+
? [
133+
{
134+
id: 'new-location-groups',
135+
text: 'New location groups',
136+
},
137+
]
138+
: []),
108139
{
109140
id: 'new-locations',
110141
text: 'New locations',
@@ -116,7 +147,13 @@ export default function ReleaseApiDataSetLocationsMappingPage() {
116147
subNavItems: getSubNavItems(autoMappedLocations, 'auto-mapped'),
117148
},
118149
];
119-
}, [autoMappedLocations, mappableLocations, newLocations]);
150+
}, [
151+
autoMappedLocations,
152+
deletedLocationGroups,
153+
mappableLocations,
154+
newLocationGroups,
155+
newLocations,
156+
]);
120157

121158
const updateMappingState = useCallback(
122159
(updates: PendingMappingUpdate[]) => {
@@ -259,6 +296,7 @@ export default function ReleaseApiDataSetLocationsMappingPage() {
259296
<LoadingSpinner loading={isLoadingDataSet || isLoadingMapping}>
260297
<div className="govuk-grid-row">
261298
<PageNav items={navItems} />
299+
262300
<div className="govuk-grid-column-three-quarters">
263301
<span className="govuk-caption-l">Map locations</span>
264302
<h2>{dataSet?.title}</h2>
@@ -286,8 +324,23 @@ export default function ReleaseApiDataSetLocationsMappingPage() {
286324
show as new locations in the API data set.
287325
</p>
288326

327+
{Object.keys(deletedLocationGroups).length > 0 && (
328+
<>
329+
<h3 className="govuk-heading-l" id="deleted-location-groups">
330+
{`Location groups not found in new data set (${
331+
Object.keys(deletedLocationGroups).length
332+
}) `}
333+
<Tag colour="grey">No action required</Tag>
334+
</h3>
335+
336+
<ApiDataSetDeletedLocationGroupsTable
337+
locationGroups={deletedLocationGroups}
338+
/>
339+
</>
340+
)}
341+
289342
<h3 className="govuk-heading-l" id="unmapped-locations">
290-
Locations not found in the new data set
343+
Locations not found in new data set
291344
</h3>
292345

293346
{typedKeys(mappableLocations).length > 0 ? (
@@ -300,9 +353,9 @@ export default function ReleaseApiDataSetLocationsMappingPage() {
300353
return (
301354
<ApiDataSetMappableTable
302355
key={level}
303-
candidateHint={candidate =>
304-
getApiDataSetLocationCodes(candidate)
305-
}
356+
candidateHint={candidate => (
357+
<ApiDataSetLocationCode location={candidate} />
358+
)}
306359
candidateIsMajorMapping={(candidate, mapping) => {
307360
return Object.entries(
308361
omit(mapping.source, omittedDiffingFields),
@@ -346,6 +399,24 @@ export default function ReleaseApiDataSetLocationsMappingPage() {
346399
<p>No locations.</p>
347400
)}
348401

402+
{Object.keys(newLocationGroups).length > 0 && (
403+
<>
404+
<h3
405+
className="govuk-heading-l govuk-!-margin-top-8"
406+
id="new-location-groups"
407+
>
408+
{`New location groups (${
409+
Object.keys(deletedLocationGroups).length
410+
}) `}
411+
<Tag colour="grey">No action required</Tag>
412+
</h3>
413+
414+
<ApiDataSetNewLocationGroupsTable
415+
locationGroups={newLocationGroups}
416+
/>
417+
</>
418+
)}
419+
349420
<h3
350421
className="govuk-heading-l govuk-!-margin-top-8"
351422
id="new-locations"
@@ -419,9 +490,9 @@ export default function ReleaseApiDataSetLocationsMappingPage() {
419490
key={level}
420491
>
421492
<ApiDataSetAutoMappedTable
422-
candidateHint={candidate =>
423-
getApiDataSetLocationCodes(candidate)
424-
}
493+
candidateHint={candidate => (
494+
<ApiDataSetLocationCode location={candidate} />
495+
)}
425496
groupKey={level}
426497
groupLabel={groupLabel}
427498
itemLabel="location"

0 commit comments

Comments
 (0)