Skip to content

Commit 0e996b7

Browse files
committed
- Fix status mismatch: change "In review" to "Under Review" to match server expectations
- Add missing "Deprecated" status option to dropdown - Set default status for new policies to "Under Review" - Add comprehensive client-side validation for title, content length, and initial status - Implement server error handling and mapping to display validation errors in UI
1 parent 566e48c commit 0e996b7

File tree

2 files changed

+66
-5
lines changed

2 files changed

+66
-5
lines changed

Clients/src/presentation/components/Policies/PolicyDetailsModal.tsx

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export interface FormErrors {
4747
tags?: string;
4848
nextReviewDate?: string;
4949
assignedReviewers?: string;
50+
content?: string;
5051
}
5152

5253
const PolicyDetailModal: React.FC<Props> = ({
@@ -89,6 +90,7 @@ const PolicyDetailModal: React.FC<Props> = ({
8990
const validateForm = (): boolean => {
9091
const newErrors: FormErrors = {};
9192

93+
// Title validation
9294
const policyTitle = checkStringValidation(
9395
"Policy title",
9496
formData.title,
@@ -116,6 +118,7 @@ const PolicyDetailModal: React.FC<Props> = ({
116118
newErrors.nextReviewDate = policyNextReviewDate.message;
117119
}
118120

121+
// Assigned reviewers validation
119122
const policyAssignedReviewers = formData.assignedReviewers.filter(
120123
(user) => user.id !== undefined
121124
);
@@ -129,7 +132,7 @@ const PolicyDetailModal: React.FC<Props> = ({
129132

130133
const [formData, setFormData] = useState<FormData>({
131134
title: "",
132-
status: "Draft",
135+
status: "Under Review",
133136
tags: [],
134137
nextReviewDate: "",
135138
assignedReviewers: [],
@@ -155,7 +158,7 @@ const PolicyDetailModal: React.FC<Props> = ({
155158
} else {
156159
setFormData({
157160
title: "",
158-
status: "Draft",
161+
status: "Under Review",
159162
tags: [],
160163
nextReviewDate: "",
161164
assignedReviewers: [],
@@ -219,9 +222,40 @@ const PolicyDetailModal: React.FC<Props> = ({
219222
await updatePolicy(policy!.id, payload);
220223
}
221224
onSaved();
222-
} catch (err) {
225+
} catch (err: any) {
223226
// setIsSubmitting(false);
224-
console.error(err);
227+
console.error("Full error object:", err);
228+
console.error("Original error:", err?.originalError);
229+
console.error("Original error response:", err?.originalError?.response);
230+
231+
// Handle server validation errors - the CustomException is in originalError
232+
const errorData = err?.originalError?.response || err?.response?.data || err?.response;
233+
console.error("Error data:", errorData);
234+
235+
if (errorData?.errors) {
236+
console.error("Processing server errors:", errorData.errors);
237+
const serverErrors: FormErrors = {};
238+
errorData.errors.forEach((error: any) => {
239+
console.error("Processing error:", error);
240+
if (error.field === 'title') {
241+
serverErrors.title = error.message;
242+
} else if (error.field === 'status') {
243+
serverErrors.status = error.message;
244+
} else if (error.field === 'tags') {
245+
serverErrors.tags = error.message;
246+
} else if (error.field === 'content_html') {
247+
serverErrors.content = error.message;
248+
} else if (error.field === 'next_review_date') {
249+
serverErrors.nextReviewDate = error.message;
250+
} else if (error.field === 'assigned_reviewer_ids') {
251+
serverErrors.assignedReviewers = error.message;
252+
}
253+
});
254+
console.error("Setting server errors:", serverErrors);
255+
setErrors(serverErrors);
256+
} else {
257+
console.error("No errors found in response");
258+
}
225259
}
226260
};
227261

@@ -455,6 +489,19 @@ const PolicyDetailModal: React.FC<Props> = ({
455489
placeholder="Start typing..."
456490
/>
457491
</Plate>
492+
{errors.content && (
493+
<Typography
494+
component="span"
495+
color={theme.palette.status?.error?.text || theme.palette.error.main}
496+
sx={{
497+
opacity: 0.8,
498+
fontSize: 11,
499+
mt: 1,
500+
}}
501+
>
502+
{errors.content}
503+
</Typography>
504+
)}
458505
</Stack>
459506
</Stack>
460507

Clients/src/presentation/components/Policies/PolicyForm.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,11 @@ interface Props {
3535

3636
const statuses: FormData["status"][] = [
3737
"Draft",
38-
"In review",
38+
"Under Review",
3939
"Approved",
4040
"Published",
4141
"Archived",
42+
"Deprecated",
4243
];
4344

4445
const PolicyForm: React.FC<Props> = ({ formData, setFormData, tags, errors }) => {
@@ -272,6 +273,19 @@ const PolicyForm: React.FC<Props> = ({ formData, setFormData, tags, errors }) =>
272273
},
273274
}}
274275
/>
276+
{errors.tags && (
277+
<Typography
278+
component="span"
279+
color={theme.palette.error.main}
280+
sx={{
281+
opacity: 0.8,
282+
fontSize: 11,
283+
mt: 1,
284+
}}
285+
>
286+
{errors.tags}
287+
</Typography>
288+
)}
275289
</Stack>
276290
</Stack>
277291

0 commit comments

Comments
 (0)