Skip to content

Commit 5023bda

Browse files
feat(REGISTRY-1006): Organisations - add parent organisation (subsidiaries) (#839)
2 parents fa0d2ae + 552df15 commit 5023bda

7 files changed

Lines changed: 145 additions & 10 deletions

File tree

src/app/[locale]/(logged-in)/organisation/profile/components/NameAndAddress/NameAndAddress.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { useRouter } from "next/navigation";
2424
import { useEffect, useMemo } from "react";
2525
import useUpdateOrganisation from "../../hooks/useUpdateOrganisation";
2626
import SroFields from "../SroFields";
27+
import OrganisationsParents from "@/organisms/OrganisationsParents";
2728

2829
export interface NameAndAddressFormValues {
2930
organisation_name: string;
@@ -258,6 +259,10 @@ export default function NameAndAddress() {
258259
</Grid>
259260
</Grid>
260261
</PageSection>
262+
<OrganisationsParents
263+
onEditSuccess={() => handleRefetch()}
264+
onDeleteSuccess={() => handleRefetch()}
265+
/>
261266
<OrganisationsSubsidiaries
262267
onEditSuccess={() => handleRefetch()}
263268
onDeleteSuccess={() => handleRefetch()}

src/config/locales/en.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,6 +1495,7 @@
14951495
},
14961496
"Subsidiaries": {
14971497
"heading": "UK subsidiaries",
1498+
"description": "If your Organisation is based internationally, please add any UK-based subsidiaries below.",
14981499
"addSubsidiaryButton": "Add a subsidiary",
14991500
"removeSubsidiaryToolTip": "Remove this subsidiary",
15001501
"editSubsidiaryToolTip": "Edit this subsidiary",
@@ -1503,6 +1504,7 @@
15031504
"organisationName": "Name",
15041505
"address": "Address",
15051506
"actions": "Actions",
1507+
"add": "Add subsidiary",
15061508
"edit": "Edit subsidiary",
15071509
"delete": "Delete subsidiary",
15081510
"subsidiaryNameRequired": "Subsidiary name is required",
@@ -1515,6 +1517,28 @@
15151517
"countyRequiredInvalid": "County is required",
15161518
"countryRequiredInvalid": "Country is required"
15171519
},
1520+
"Parents": {
1521+
"heading": "Parent",
1522+
"description": "If you have a parent organisation, please add it below.",
1523+
"addParentButton": "Add a parent",
1524+
"removeParentToolTip": "Remove this parent",
1525+
"editParentToolTip": "Edit this parent",
1526+
"cancelButton": "Cancel",
1527+
"saveButton": "Save",
1528+
"organisationName": "Name",
1529+
"address": "Address",
1530+
"actions": "Actions",
1531+
"add": "Add parent",
1532+
"edit": "Edit parent",
1533+
"delete": "Delete parent",
1534+
"parentNameRequired": "Parent name is required",
1535+
"postcodeRequiredInvalid": "Postcode is required",
1536+
"postcodeFormatInvalid": "The postcode is not valid",
1537+
"address1RequiredInvalid": "Line 1 of the address is required",
1538+
"townRequiredInvalid": "Town is required",
1539+
"countyRequiredInvalid": "County is required",
1540+
"countryRequiredInvalid": "Country is required"
1541+
},
15181542
"SroDeclaratation": {
15191543
"heading": "SRO Declaration",
15201544
"intro": "In order to grant you full Organisation account privileges (including adding Users from your Organisation and those Users being validated by Data Custodians), you will need to complete and upload the form below.",
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
"use client";
2+
3+
import { useStore } from "@/data/store";
4+
import { PageSection } from "@/modules";
5+
import { useTranslations } from "next-intl";
6+
import { useState } from "react";
7+
8+
import FormModal from "@/components/FormModal";
9+
import useQueryAlerts from "@/hooks/useQueryAlerts";
10+
import OrganisationsSubsidiaryEditForm from "@/modules/OrganisationsSubsidiariesEditForm";
11+
import OrganisationsSubsidiariesTable from "@/modules/OrganisationsSubsidiariesTable";
12+
import useMutationWithConfirmation from "@/queries/useMutationWithConfirmation";
13+
import { Subsidiary } from "@/types/application";
14+
import Button from "@mui/material/Button";
15+
import { deleteSubsidiaryQuery } from "@/services/subsidiaries";
16+
import useMutationUpdateSubsidiary from "../../queries/useMutationUpdateSubsidiary";
17+
18+
const NAMESPACE_TRANSLATION = "Organisations.Parents";
19+
20+
interface OrganisationsParentsProps {
21+
onDeleteSuccess?: () => void;
22+
onEditSuccess?: () => void;
23+
}
24+
25+
export default function OrganisationsParents({
26+
onDeleteSuccess,
27+
onEditSuccess,
28+
}: OrganisationsParentsProps) {
29+
const organisation = useStore(state => state.config.organisation);
30+
const t = useTranslations(NAMESPACE_TRANSLATION);
31+
const [activeParent, setActiveParent] = useState<Subsidiary>();
32+
33+
const { mutateAsync: mutateUpdateAysnc, ...restUpdateState } =
34+
useMutationUpdateSubsidiary();
35+
36+
const { showConfirm } = useMutationWithConfirmation(deleteSubsidiaryQuery(), {
37+
onSuccess: () => {
38+
onDeleteSuccess?.();
39+
},
40+
});
41+
42+
useQueryAlerts(restUpdateState, {
43+
onSuccess: () => {
44+
setActiveParent(undefined);
45+
onEditSuccess?.();
46+
},
47+
});
48+
49+
const parents = organisation?.subsidiaries?.filter(s => s.is_parent) ?? [];
50+
51+
return (
52+
<>
53+
<PageSection heading={t("heading")} description={t("description")}>
54+
<div>
55+
<OrganisationsSubsidiariesTable
56+
data={parents}
57+
t={t}
58+
isPaginated={false}
59+
onEdit={parent => setActiveParent(parent)}
60+
onDelete={parent =>
61+
showConfirm({
62+
params: {
63+
subsidiaryId: parent.id,
64+
organisationId: organisation.id,
65+
isParent: true,
66+
},
67+
})
68+
}
69+
/>
70+
</div>
71+
<Button
72+
variant="outlined"
73+
onClick={() => setActiveParent({})}
74+
sx={{ mt: 2 }}>
75+
{t("addParentButton")}
76+
</Button>
77+
</PageSection>
78+
<FormModal
79+
open={!!activeParent}
80+
heading={activeParent?.id ? t("edit") : t("add")}>
81+
<OrganisationsSubsidiaryEditForm
82+
t={t}
83+
mutateState={restUpdateState}
84+
defaultValues={activeParent}
85+
onCancel={() => setActiveParent(undefined)}
86+
onSubmit={(payload: Subsidiary | Partial<Subsidiary>) => {
87+
mutateUpdateAysnc({
88+
payload: { ...payload, is_parent: true },
89+
params: {
90+
organisationId: organisation.id,
91+
subsidiaryId: activeParent?.id,
92+
},
93+
});
94+
}}
95+
/>
96+
</FormModal>
97+
</>
98+
);
99+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import OrganisationsParents from "./OrganisationsParents";
2+
3+
export default OrganisationsParents;

src/organisms/OrganisationsSubsidiaries/OrganisationsSubsidiaries.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,7 @@ export default function OrganisationsSubsidiaries({
4949

5050
return (
5151
<>
52-
<PageSection
53-
heading={t("heading")}
54-
description="If your Organisation is based internationally, please add any
55-
UK-based subsidiaries below.">
52+
<PageSection heading={t("heading")} description={t("description")}>
5653
<div>
5754
<OrganisationsSubsidiariesTable
5855
data={organisation?.subsidiaries || []}
@@ -78,7 +75,7 @@ export default function OrganisationsSubsidiaries({
7875
</PageSection>
7976
<FormModal
8077
open={!!activeSubsidiary}
81-
heading={activeSubsidiary?.id ? "Edit subsidiary" : "Add subsidiary"}>
78+
heading={activeSubsidiary?.id ? t("edit") : t("add")}>
8279
<OrganisationsSubsidiaryEditForm
8380
t={t}
8481
mutateState={restUpdateState}

src/services/subsidiaries/deleteSubsidiaryQuery.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,25 @@ import { MutateWithArgs, MutationOptions } from "@/types/requests";
33
import deleteSubsidiary from "@/app/actions/subsidiaries/deleteSubsidiary";
44

55
type DeleteSubsidiaryMutationArgs = MutateWithArgs<
6-
{ organisationId: number; subsidiaryId: number },
6+
{ organisationId: number; subsidiaryId: number; isParent?: boolean },
77
undefined
88
>;
99

1010
export default function deleteSubsidiaryQuery(options?: MutationOptions) {
1111
return {
1212
mutationKey: ["deleteSubsidiary", ...(options?.mutationKeySuffix || [])],
1313
mutationFn: ({ params }: DeleteSubsidiaryMutationArgs) => {
14-
return deleteSubsidiary(params.subsidiaryId, params.organisationId, {
15-
error: { message: "deleteSubsidiaryError" },
16-
...options?.responseOptions,
17-
});
14+
return deleteSubsidiary(
15+
params.subsidiaryId,
16+
params.organisationId,
17+
{
18+
error: { message: "deleteSubsidiaryError" },
19+
...options?.responseOptions,
20+
},
21+
params?.isParent
22+
);
1823
},
24+
1925
...options,
2026
} as UseMutationOptions<
2127
Awaited<ReturnType<typeof deleteSubsidiary>>,

src/types/application.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ interface Subsidiary extends AddressFields {
241241
subsidiary_id: number;
242242
};
243243
website?: string;
244+
is_parent?: boolean;
244245
}
245246

246247
interface Charity extends AddressFields {

0 commit comments

Comments
 (0)