Skip to content

Commit 29e81e7

Browse files
authored
Merge pull request #523 from maykinmedia/issue/#498-frontend-prepopulate
Issue/#498 frontend prepopulate
2 parents 07cfcab + 0fd3ad3 commit 29e81e7

8 files changed

+71
-24
lines changed

frontend/src/fixtures/destructionListItem.ts

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export const FIXTURE_DESTRUCTION_LIST_ITEM: DestructionListItem = {
1212
zaak: zaakFactory(),
1313
processingStatus: "new",
1414
plannedDestructionDate: null,
15+
reviewAdviceIgnored: null,
1516
};
1617
export const FIXTURE_DESTRUCTION_LIST_ITEM_DELETED: DestructionListItem = {
1718
pk: 2,
@@ -20,6 +21,7 @@ export const FIXTURE_DESTRUCTION_LIST_ITEM_DELETED: DestructionListItem = {
2021
zaak: null,
2122
processingStatus: "succeeded",
2223
plannedDestructionDate: "2026-01-01T00:00:00Z",
24+
reviewAdviceIgnored: null,
2325
};
2426
export const FIXTURE_DESTRUCTION_LIST_ITEM_FAILED: DestructionListItem = {
2527
pk: 3,
@@ -28,6 +30,7 @@ export const FIXTURE_DESTRUCTION_LIST_ITEM_FAILED: DestructionListItem = {
2830
zaak: zaakFactory(),
2931
processingStatus: "failed",
3032
plannedDestructionDate: "2026-01-01T00:00:00Z",
33+
reviewAdviceIgnored: null,
3134
};
3235

3336
export const destructionListItemFactory = createObjectFactory(

frontend/src/hooks/useZaakReviewStatusBadges.tsx

+16-5
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,27 @@ import {
1616
export function useZaakReviewStatusBadges(
1717
zakenOnPage: Zaak[],
1818
reviewedZaakSelectionOnPage: ZaakSelection<{ approved: boolean }>,
19+
reviewAdviceIgnoredResults: Record<string, boolean>, // Map of reviewAdviceIgnored
1920
): Record<string, { badge: React.ReactNode; status: ZAAK_REVIEW_STATUS_ENUM }> {
2021
const statuses = useZaakReviewStatuses(
2122
zakenOnPage,
2223
reviewedZaakSelectionOnPage,
2324
);
25+
2426
return useMemo(() => {
2527
const badges = zakenOnPage.map((z) => {
2628
const status = statuses[z.url as string];
29+
const reviewAdviceIgnored = reviewAdviceIgnoredResults[z.url as string];
30+
31+
if (reviewAdviceIgnored) {
32+
// Display "Herboordelen" badge for reviewAdviceIgnored zaken
33+
return (
34+
// @ts-expect-error - style props not supported (yet?)
35+
<Badge key={z.uuid} level="info" style={{ display: "block" }}>
36+
<Solid.ArrowPathRoundedSquareIcon /> Herboordelen
37+
</Badge>
38+
);
39+
}
2740

2841
if (typeof status === "boolean") {
2942
if (status) {
@@ -37,17 +50,15 @@ export function useZaakReviewStatusBadges(
3750
return (
3851
// @ts-expect-error - style props not supported (yet?)
3952
<Badge key={z.uuid} level="danger" style={{ display: "block" }}>
40-
<Solid.HandThumbDownIcon />
41-
Uitgezonderd
53+
<Solid.HandThumbDownIcon /> Uitgezonderd
4254
</Badge>
4355
);
4456
}
4557
} else {
4658
return (
4759
// @ts-expect-error - style props not supported (yet?)
4860
<Badge key={z.uuid} style={{ display: "block" }}>
49-
<Solid.QuestionMarkCircleIcon />
50-
Niet beoordeeld
61+
<Solid.QuestionMarkCircleIcon /> Niet beoordeeld
5162
</Badge>
5263
);
5364
}
@@ -58,5 +69,5 @@ export function useZaakReviewStatusBadges(
5869
{ badge: badges[i], status: statuses[z.url as string] },
5970
]);
6071
return Object.fromEntries(entries);
61-
}, [statuses]);
72+
}, [statuses, reviewAdviceIgnoredResults, zakenOnPage]);
6273
}

frontend/src/lib/api/destructionListsItem.ts

+15-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export type DestructionListItem = {
1010
zaak: Zaak | null;
1111
processingStatus: ProcessingStatus;
1212
plannedDestructionDate: string | null;
13+
reviewAdviceIgnored: boolean | null;
1314
};
1415

1516
export interface ZaakItem extends Zaak {
@@ -32,14 +33,25 @@ export async function listDestructionListItems(
3233
page?: number;
3334
page_size?: number;
3435
"item-processing_status"?: ProcessingStatus;
35-
"item-status": DestructionListItemStatus; // TODO ?
36+
"item-status"?: DestructionListItemStatus;
37+
"item-order_review_ignored"?: string | boolean;
3638
},
3739
) {
40+
if (params && !(params instanceof URLSearchParams)) {
41+
if (typeof params["item-order_review_ignored"] === "boolean") {
42+
params["item-order_review_ignored"] = String(
43+
params["item-order_review_ignored"],
44+
);
45+
}
46+
}
47+
48+
// Use the params object directly in the request
3849
const response = await request("GET", "/destruction-list-items/", {
3950
"item-destruction_list": destructionListUuid,
4051
"item-status": "suggested",
41-
...params,
42-
} as typeof params & { "item-destruction_list": string });
52+
...((params as Record<string, string>) || {}),
53+
});
54+
4355
const promise: Promise<PaginatedDestructionListItems> = response.json();
4456
return promise;
4557
}

frontend/src/lib/api/review.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { request } from "./request";
55

66
export type Review = {
77
destructionList: string;
8-
decision: "accepted" | "rejected";
8+
decision: "accepted" | "rejected" | "ignored_review";
99
listFeedback: string;
1010
pk?: number;
1111
author?: User;

frontend/src/pages/constants.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { Review } from "../lib/api/review";
1010
export const REVIEW_DECISION_MAPPING: Record<Review["decision"], string> = {
1111
accepted: "Goedgekeurd",
1212
rejected: "Afgewezen",
13+
ignored_review: "Herboordelen",
1314
};
1415

1516
export const REVIEW_DECISION_LEVEL_MAPPING: Record<
@@ -18,6 +19,7 @@ export const REVIEW_DECISION_LEVEL_MAPPING: Record<
1819
> = {
1920
accepted: "success",
2021
rejected: "danger",
22+
ignored_review: "info",
2123
};
2224

2325
export const STATUSES_ELIGIBLE_FOR_EDIT = ["new", "changes_requested"];

frontend/src/pages/destructionlist/review/DestructionListReview.loader.ts

+7-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import {
66
DestructionList,
77
getDestructionList,
88
} from "../../../lib/api/destructionLists";
9+
import {
10+
PaginatedDestructionListItems,
11+
listDestructionListItems,
12+
} from "../../../lib/api/destructionListsItem";
913
import {
1014
Review,
1115
ReviewItemWithZaak,
@@ -17,7 +21,6 @@ import {
1721
getLatestReviewResponse,
1822
} from "../../../lib/api/reviewResponse";
1923
import { listReviewers } from "../../../lib/api/reviewers";
20-
import { PaginatedZaken, listZaken } from "../../../lib/api/zaken";
2124
import {
2225
canReviewDestructionListRequired,
2326
loginRequired,
@@ -31,7 +34,7 @@ export type DestructionListReviewContext = {
3134
destructionList: DestructionList;
3235
logItems: AuditLogItem[];
3336

34-
paginatedZaken: PaginatedZaken;
37+
paginatedZaken: PaginatedDestructionListItems;
3538
review: Review;
3639
reviewItems?: ReviewItemWithZaak[];
3740
reviewResponse?: ReviewResponse;
@@ -76,9 +79,9 @@ export const destructionListReviewLoader = loginRequired(
7679
reviewItemsPromise,
7780
reviewResponsePromise,
7881
listReviewers(),
79-
listZaken({
82+
listDestructionListItems(uuid, {
83+
"item-order_review_ignored": true,
8084
...objParams,
81-
in_destruction_list: uuid,
8285
}),
8386
]);
8487

frontend/src/pages/destructionlist/review/DestructionListReview.stories.tsx

+6-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
destructionListAssigneesFactory,
1313
destructionListFactory,
1414
} from "../../../fixtures/destructionList";
15-
import { paginatedZakenFactory } from "../../../fixtures/paginatedZaken";
15+
import { paginatedDestructionListItemsFactory } from "../../../fixtures/destructionListItem";
1616
import { reviewFactory } from "../../../fixtures/review";
1717
import {
1818
beoordelaarFactory,
@@ -167,7 +167,7 @@ const FIXTURE: DestructionListReviewContext = {
167167
logItems: [],
168168
review: reviewFactory(),
169169
reviewers: usersFactory(),
170-
paginatedZaken: paginatedZakenFactory(),
170+
paginatedZaken: paginatedDestructionListItemsFactory(),
171171
};
172172

173173
export const ReviewerCanApproveZaak: Story = {
@@ -186,8 +186,10 @@ export const ReviewerCanApproveZaak: Story = {
186186
});
187187
const approve = approves[0];
188188
await userEvent.click(approve);
189-
const checkbox = await canvas.findByRole("checkbox", { checked: true });
190-
await expect(checkbox).toBeInTheDocument();
189+
// Find all checkboxes
190+
const checkboxes = await canvas.findAllByRole("checkbox");
191+
const checkbox = checkboxes[0];
192+
await expect(checkbox).toBeChecked();
191193
},
192194
};
193195

frontend/src/pages/destructionlist/review/DestructionListReview.tsx

+21-7
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
useConfirm,
88
usePrompt,
99
} from "@maykin-ui/admin-ui";
10-
import React, { useMemo } from "react";
10+
import { useMemo } from "react";
1111
import { useLoaderData } from "react-router-dom";
1212

1313
import {
@@ -60,6 +60,9 @@ export function DestructionListReviewPage() {
6060
reviewItems,
6161
reviewResponse,
6262
} = useLoaderData() as DestructionListReviewContext;
63+
const zakenResults = paginatedZaken.results
64+
.map((zaak) => zaak.zaak)
65+
.filter((zaak) => zaak !== null) as Zaak[];
6366

6467
const user = useWhoAmI();
6568

@@ -70,7 +73,7 @@ export function DestructionListReviewPage() {
7073
comment: string;
7174
}>(
7275
storageKey,
73-
paginatedZaken.results,
76+
zakenResults,
7477
filterSelectionZaken,
7578
getSelectionDetail,
7679
RestBackend,
@@ -84,7 +87,7 @@ export function DestructionListReviewPage() {
8487
comment: string;
8588
}>(
8689
storageKey,
87-
paginatedZaken.results.map((z) => z.url as string),
90+
zakenResults.map((zaak) => zaak.url as string),
8891
true,
8992
RestBackend,
9093
);
@@ -120,25 +123,36 @@ export function DestructionListReviewPage() {
120123
),
121124
);
122125

126+
const reviewAdviceIgnoredResults = Object.fromEntries(
127+
paginatedZaken.results.map((result) => [
128+
result.zaak?.url as string,
129+
result.reviewAdviceIgnored || false,
130+
]),
131+
);
132+
123133
const submitAction = useSubmitAction<ReviewDestructionListAction>();
124134
const destructionListReviewKey = getDestructionListReviewKey(
125135
uuid,
126136
destructionList.status,
127137
);
128138
const zaakReviewStatusBadges = useZaakReviewStatusBadges(
129-
paginatedZaken.results,
130-
{ ...approvedZaakSelection, ...excludedZaakSelection },
139+
zakenResults,
140+
{
141+
...approvedZaakSelection,
142+
...excludedZaakSelection,
143+
},
144+
reviewAdviceIgnoredResults,
131145
);
132146

133147
// The object list of the current page with review actions appended.
134148
const objectList = useMemo(() => {
135-
return paginatedZaken.results.map((zaak) => {
149+
return zakenResults.map((zaak) => {
136150
const badge = zaakReviewStatusBadges[zaak.url as string].badge;
137151
const actions = getActionsToolbarForZaak(zaak);
138152
return { ...zaak, Beoordeling: badge, Acties: actions };
139153
});
140154
}, [
141-
paginatedZaken,
155+
zakenResults,
142156
zaakReviewStatusBadges,
143157
reviewItems,
144158
excludedZaakSelection,

0 commit comments

Comments
 (0)