Skip to content

Commit e2fd969

Browse files
authored
Merge pull request #209 from nitheesh-aot/filters
COMP-309: Natural sort order for Topics
2 parents 23005cc + 532ba56 commit e2fd969

File tree

6 files changed

+90
-29
lines changed

6 files changed

+90
-29
lines changed

compliance-web/src/components/App/Inspections/Profile/Requirements/RequirementDrawer.tsx

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { yupResolver } from "@hookform/resolvers/yup";
22
import { Stack } from "@mui/material";
33
import { FormProvider, useForm } from "react-hook-form";
44
import DrawerTitleBar from "@/components/Shared/Drawer/DrawerTitleBar";
5-
import { useCallback, useMemo, useState } from "react";
5+
import { useCallback, useEffect, useState } from "react";
66
import { useMenuStore } from "@/store/menuStore";
77
import DrawerActionBarTop from "@/components/Shared/Drawer/DrawerActionBarTop";
88
import DrawerActionBarBottom from "@/components/Shared/Drawer/DrawerActionBarBottom";
@@ -52,6 +52,9 @@ const RequirementDrawer: React.FC<RequirementDrawerProps> = ({
5252
index,
5353
}) => {
5454
const { appHeaderHeight } = useMenuStore();
55+
const [inspectionRequirementData, setInspectionRequirementData] = useState<
56+
InspectionRequirementFormData | undefined
57+
>(undefined);
5558
const [requirementSourceList, setRequirementSourceList] = useState<
5659
RequirementSourceFormData[]
5760
>([]);
@@ -60,18 +63,17 @@ const RequirementDrawer: React.FC<RequirementDrawerProps> = ({
6063
const { data: complianceFindingsList } = useComplianceFindingsData();
6164
const { data: topicsList } = useTopicsData();
6265

63-
const defaultValues = useMemo<InspectionRequirementFormData>(() => {
64-
return requirement ? formatRequirementFormData(requirement) : initFormData;
65-
}, [requirement]);
66-
6766
const methods = useForm<RequirementSchemaType>({
6867
resolver: yupResolver(RequirementFormSchema),
6968
mode: "onBlur",
70-
defaultValues: defaultValues,
7169
});
7270

7371
const { handleSubmit, reset } = methods;
7472

73+
useEffect(() => {
74+
reset(inspectionRequirementData ?? initFormData);
75+
}, [inspectionRequirementData, reset]);
76+
7577
const onSuccess = useCallback(() => {
7678
onSubmit("Changes saved successfully!");
7779
}, [onSubmit]);
@@ -81,10 +83,34 @@ const RequirementDrawer: React.FC<RequirementDrawerProps> = ({
8183
reset();
8284
}, [onSubmit, reset]);
8385

84-
const { mutate: createInspectionRequirement } =
85-
useCreateInspectionRequirement(onSuccess);
86-
const { mutate: updateInspectionRequirement } =
87-
useUpdateInspectionRequirement(onSuccess);
86+
const {
87+
mutate: createInspectionRequirement,
88+
data: inspectionRequirementCreateData,
89+
} = useCreateInspectionRequirement(onSuccess);
90+
const {
91+
mutate: updateInspectionRequirement,
92+
data: inspectionRequirementUpdateData,
93+
} = useUpdateInspectionRequirement(onSuccess);
94+
95+
useEffect(() => {
96+
const inspectionRequirement: InspectionRequirement =
97+
inspectionRequirementUpdateData ??
98+
inspectionRequirementCreateData ??
99+
requirement;
100+
if (inspectionRequirement) {
101+
const inspectionRequirementFormData = formatRequirementFormData(
102+
inspectionRequirement
103+
);
104+
setInspectionRequirementData(inspectionRequirementFormData);
105+
setRequirementSourceList(
106+
inspectionRequirementFormData.requirementSourceDetails ?? []
107+
);
108+
}
109+
}, [
110+
inspectionRequirementUpdateData,
111+
inspectionRequirementCreateData,
112+
requirement,
113+
]);
88114

89115
const { mutate: deleteInspectionRequirement } =
90116
useDeleteInspectionRequirement(onDeleteSuccess);
@@ -106,10 +132,10 @@ const RequirementDrawer: React.FC<RequirementDrawerProps> = ({
106132
requirementSourceList
107133
);
108134

109-
if (requirement) {
135+
if (inspectionRequirementData) {
110136
updateInspectionRequirement({
111137
inspectionId: inspectionData.id,
112-
requirementId: requirement.id,
138+
requirementId: inspectionRequirementData.id ?? 0,
113139
inspectionRequirement: inspectionRequirementPayload,
114140
});
115141
} else {
@@ -122,7 +148,7 @@ const RequirementDrawer: React.FC<RequirementDrawerProps> = ({
122148
[
123149
inspectionData,
124150
requirementSourceList,
125-
requirement,
151+
inspectionRequirementData,
126152
updateInspectionRequirement,
127153
createInspectionRequirement,
128154
]
@@ -140,14 +166,15 @@ const RequirementDrawer: React.FC<RequirementDrawerProps> = ({
140166
<form onSubmit={handleSubmit(onSubmitHandler)}>
141167
<DrawerTitleBar
142168
title={
143-
requirement
169+
inspectionRequirementData
144170
? `Edit Requirement ${index !== undefined ? `#${index + 1}` : ""}`
145171
: "Create Requirement"
146172
}
147173
isFormDirtyCheck
148174
/>
149-
<DrawerActionBarTop isShowActionBar={!requirement} />
175+
<DrawerActionBarTop isShowActionBar={!inspectionRequirementData} />
150176
<Stack
177+
key={JSON.stringify(inspectionRequirementData)}
151178
height={`calc(100vh - ${appHeaderHeight + 129}px)`} // 64px (DrawerTitleBar height) + 65px (DrawerActionBar height)
152179
direction={"row"}
153180
>
@@ -159,16 +186,15 @@ const RequirementDrawer: React.FC<RequirementDrawerProps> = ({
159186
/>
160187
<RequirementFormRight
161188
onDataChange={onRequirementSourceListDataChange}
162-
requirementSourceFormDataList={
163-
defaultValues.requirementSourceDetails ?? []
164-
}
189+
requirementSourceFormDataList={requirementSourceList}
165190
/>
166191
</Stack>
167192
<DrawerActionBarBottom
168-
isShowActionBar={!!requirement}
193+
isShowActionBar={!!inspectionRequirementData}
169194
onDeleteAction={onDeleteRequirement}
170195
onDeleteTitle="Delete Requirement"
171196
onDeleteDescription="You are about to delete this Requirement. Are you sure?"
197+
dirtyCheck={false}
172198
/>
173199
</form>
174200
</FormProvider>

compliance-web/src/components/App/Inspections/Profile/Requirements/RequirementRelatedDocumentModal.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ const RequirementRelatedDocumentModal: React.FC<
128128
};
129129
const reqSectionData: RequirementRelatedDocumentSectionData = {
130130
id: relatedDocumentSectionData?.id ?? Date.now(),
131+
dbId: relatedDocumentSectionData?.dbId ?? undefined,
131132
sourceFormId: requirementSourceData.id,
132133
relatedDocumentFormId:
133134
relatedDocumentData?.id ?? reqRelatedDocumentData.id,

compliance-web/src/components/App/Inspections/Profile/Requirements/RequirementUtils.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ export const formatRequirementAPIData = (
4444
description: item.description?.html ?? "",
4545
documents: [],
4646
};
47+
if (item.dbId) {
48+
requirementSource.id = item.dbId;
49+
}
4750
if (isRequirementSourceCondition(item.requirementSource?.id ?? "")) {
4851
requirementSource.condition_number = item.sourceNumber ?? "";
4952
} else {
@@ -58,6 +61,9 @@ export const formatRequirementAPIData = (
5861
section_title: section.sectionTitle ?? "",
5962
description: section.description?.html ?? "",
6063
};
64+
if (section.dbId) {
65+
srcDocument.id = section.dbId;
66+
}
6167
requirementSource.documents.push(srcDocument);
6268
});
6369
});
@@ -78,26 +84,28 @@ export const formatRequirementAPIData = (
7884

7985

8086
export const formatRequirementFormData = (requirement: InspectionRequirement): InspectionRequirementFormData => {
81-
const requirementSourceDetails: RequirementSourceFormData[] = requirement.requirement_source_details.map((item) => {
87+
const requirementSourceDetails: RequirementSourceFormData[] = requirement?.requirement_source_details?.map((item) => {
8288
const relatedDocuments: RequirementRelatedDocumentData[] = [];
83-
item.documents.forEach((document) => {
89+
item.documents.forEach((document, index) => {
8490
const existingDocumentIndex = relatedDocuments.findIndex(
8591
(doc) => doc.documentTitle === document.document_title
8692
);
93+
const docFormId = existingDocumentIndex >= 0 ? relatedDocuments[existingDocumentIndex].id : Date.now() + index;
8794
const section: RequirementRelatedDocumentSectionData = {
88-
id: Date.now(),
95+
id: document.id,
96+
dbId: document.id,
8997
sourceFormId: item.id,
90-
relatedDocumentFormId: document.id,
98+
relatedDocumentFormId: docFormId,
9199
sectionNumber: document.section_number,
92100
sectionTitle: document.section_title,
93101
description: { html: document.description, text: document.description },
94102
};
95103

96-
if (existingDocumentIndex !== -1) {
104+
if (existingDocumentIndex >= 0) {
97105
relatedDocuments[existingDocumentIndex]?.sections?.push(section);
98106
} else {
99107
relatedDocuments.push({
100-
id: document.id,
108+
id: docFormId,
101109
relatedDocument: document.document_type,
102110
documentTitle: document.document_title,
103111
sections: [section],
@@ -106,6 +114,7 @@ export const formatRequirementFormData = (requirement: InspectionRequirement): I
106114
});
107115
return {
108116
id: item.id,
117+
dbId: item.id,
109118
requirementSource: item.requirement_source,
110119
sourceNumber: item.section_number ?? item.condition_number,
111120
sourceTitle: item.title,
@@ -115,6 +124,7 @@ export const formatRequirementFormData = (requirement: InspectionRequirement): I
115124
};
116125
});
117126
return {
127+
id: requirement.id,
118128
requirementSummary: requirement.summary,
119129
topic: requirement.topic,
120130
complianceFinding: requirement.compliance_finding,

compliance-web/src/components/Shared/Drawer/DrawerActionBarBottom.tsx

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,17 @@ type DrawerActionBarBottomProps = {
1212
onDeleteAction?: () => void;
1313
onDeleteTitle?: string;
1414
onDeleteDescription?: string;
15+
dirtyCheck?: boolean;
1516
};
1617

1718
const DrawerActionBarBottom: React.FC<DrawerActionBarBottomProps> = React.memo(
18-
({ isShowActionBar, onDeleteAction, onDeleteTitle, onDeleteDescription }) => {
19+
({
20+
isShowActionBar,
21+
onDeleteAction,
22+
onDeleteTitle,
23+
onDeleteDescription,
24+
dirtyCheck = true,
25+
}) => {
1926
const { setClose } = useDrawer();
2027
const { setOpen, setClose: setModalClose } = useModal();
2128

@@ -63,10 +70,17 @@ const DrawerActionBarBottom: React.FC<DrawerActionBarBottomProps> = React.memo(
6370
</Button>
6471
)}
6572
<Box sx={{ display: "flex", gap: "1rem" }}>
66-
<Button onClick={setClose} color="secondary" disabled={!isDirty}>
73+
<Button
74+
onClick={setClose}
75+
color="secondary"
76+
disabled={dirtyCheck && !isDirty}
77+
>
6778
Cancel
6879
</Button>
69-
<Button type="submit" disabled={!isValid || !isDirty}>
80+
<Button
81+
type="submit"
82+
disabled={!isValid || (dirtyCheck && !isDirty)}
83+
>
7084
Save
7185
</Button>
7286
</Box>

compliance-web/src/hooks/useTopics.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,12 @@ const deleteTopic = (id: number) => {
2727
export const useTopicsData = () => {
2828
return useQuery({
2929
queryKey: ["topics"],
30-
queryFn: fetchTopics,
30+
queryFn: async () => {
31+
const topics = await fetchTopics();
32+
return topics.sort((a, b) =>
33+
a.name.localeCompare(b.name, undefined, { sensitivity: "base" })
34+
);
35+
},
3136
});
3237
};
3338

compliance-web/src/models/InspectionRequirement.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export interface InspectionRequirement {
4949
}
5050

5151
export interface InspectionRequirementFormData {
52+
id?: number;
5253
requirementSummary?: string;
5354
topic?: Topic;
5455
complianceFinding?: IRType;
@@ -62,6 +63,7 @@ export interface InspectionRequirementFormData {
6263

6364
export interface RequirementSourceFormData {
6465
id?: number;
66+
dbId?: number;
6567
requirementSource?: RequirementSource;
6668
sourceNumber?: string;
6769
sourceTitle?: string,
@@ -83,6 +85,7 @@ export interface RequirementRelatedDocumentData {
8385

8486
export interface RequirementRelatedDocumentSectionData {
8587
id?: number;
88+
dbId?: number;
8689
sourceFormId?: number;
8790
relatedDocumentFormId?: number;
8891
sectionNumber?: string;
@@ -116,6 +119,7 @@ export interface InspectionRequirementAPIData {
116119
}
117120

118121
export interface InspectionRequirementSourceAPIData {
122+
id?: number,
119123
requirement_source_id: string,
120124
section_number?: string,
121125
condition_number?: string,
@@ -126,6 +130,7 @@ export interface InspectionRequirementSourceAPIData {
126130
}
127131

128132
export interface InspectionRequirementSourceDocumentAPIData {
133+
id?: number,
129134
document_type_id: string,
130135
document_title: string,
131136
section_number: string,

0 commit comments

Comments
 (0)