Skip to content

Commit dd1b240

Browse files
committed
feat(admin):frontend for registry managers to list and validate their certifications
1 parent 807df3f commit dd1b240

File tree

5 files changed

+394
-163
lines changed

5 files changed

+394
-163
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { useGraphQlClient } from "@/components/graphql/graphql-client/GraphqlClient";
2+
import { graphql } from "@/graphql/generated";
3+
import { CertificationStatus } from "@/graphql/generated/graphql";
4+
import { useQuery } from "@tanstack/react-query";
5+
6+
const getCertificationsQuery = graphql(`
7+
query getCertificationsV2ForRegistryManager(
8+
$offset: Int
9+
$searchFilter: String
10+
$status: CertificationStatus
11+
$visible: Boolean
12+
) {
13+
searchCertificationsV2ForRegistryManager(
14+
limit: 10
15+
offset: $offset
16+
searchText: $searchFilter
17+
status: $status
18+
visible: $visible
19+
) {
20+
rows {
21+
id
22+
label
23+
codeRncp
24+
status
25+
visible
26+
certificationAuthorityStructure {
27+
label
28+
}
29+
expiresAt
30+
}
31+
info {
32+
totalRows
33+
totalPages
34+
currentPage
35+
}
36+
}
37+
}
38+
`);
39+
40+
const RECORDS_PER_PAGE = 10;
41+
export const useCertifications = ({
42+
searchFilter,
43+
currentPage = 1,
44+
status,
45+
visible,
46+
}: {
47+
searchFilter?: string;
48+
currentPage?: number;
49+
status?: CertificationStatus;
50+
visible?: boolean;
51+
}) => {
52+
const { graphqlClient } = useGraphQlClient();
53+
console.log("visible", visible);
54+
const {
55+
data: getCertificationsResponse,
56+
status: getCertificationsQueryStatus,
57+
} = useQuery({
58+
queryKey: [
59+
"getCertificationsForRegistryManager",
60+
searchFilter,
61+
currentPage,
62+
status,
63+
visible,
64+
],
65+
queryFn: () =>
66+
graphqlClient.request(getCertificationsQuery, {
67+
status: status as CertificationStatus,
68+
visible,
69+
searchFilter,
70+
offset: (currentPage - 1) * RECORDS_PER_PAGE,
71+
}),
72+
});
73+
74+
const certificationPage =
75+
getCertificationsResponse?.searchCertificationsV2ForRegistryManager;
76+
77+
return {
78+
certificationPage,
79+
getCertificationsQueryStatus,
80+
};
81+
};

packages/reva-admin-react/src/app/responsable-certifications/certifications/layout.tsx renamed to packages/reva-admin-react/src/app/responsable-certifications/certifications/(list)/layout.tsx

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,59 @@
11
"use client";
2-
import SideMenu from "@codegouvfr/react-dsfr/SideMenu";
3-
import { usePathname, useSearchParams } from "next/navigation";
2+
import { CertificationStatus } from "@/graphql/generated/graphql";
3+
import SideMenu, { SideMenuProps } from "@codegouvfr/react-dsfr/SideMenu";
4+
import { useSearchParams } from "next/navigation";
45
import { ReactNode } from "react";
56

67
export default function CertificationsLayout({
78
children,
89
}: {
910
children: ReactNode;
1011
}) {
11-
const currentPathname = usePathname();
1212
const searchParams = useSearchParams();
1313

14+
const statusParam = searchParams.get("status") || undefined;
1415
const searchFilter = searchParams.get("search") || "";
16+
const visibleParam = searchParams.get("visible") || undefined;
1517

16-
const hrefSideMenu = (path: string, category: string) => {
18+
const hrefSideMenu = (status?: string, visible?: "true" | "false") => {
1719
const params = new URLSearchParams();
20+
if (status) {
21+
params.set("status", status);
22+
}
23+
24+
if (visible) {
25+
params.set("visible", visible);
26+
}
27+
1828
params.set("page", "1");
19-
params.set("CATEGORY", category);
2029

2130
if (searchFilter) {
2231
params.set("search", searchFilter);
2332
}
2433

25-
return `${path}/?${params.toString()}`;
34+
return `/responsable-certifications/certifications/?${params.toString()}`;
2635
};
2736

28-
const menuItem = ({
29-
text,
30-
path,
31-
category,
32-
defaultMenuItem,
33-
}: {
34-
text: string;
35-
path: string;
36-
category: string;
37-
defaultMenuItem?: boolean;
38-
}) => ({
39-
isActive:
40-
(currentPathname.startsWith(path) &&
41-
searchParams.get("CATEGORY") === category) ||
42-
(!searchParams.get("CATEGORY") && defaultMenuItem),
37+
const menuItem = (
38+
text: string,
39+
status?: CertificationStatus,
40+
visible?: "true" | "false",
41+
): SideMenuProps.Item => ({
42+
isActive: status === statusParam && visible === visibleParam,
4343
linkProps: {
44-
href: hrefSideMenu(path, category),
44+
href: hrefSideMenu(status, visible),
4545
target: "_self",
4646
},
4747
text,
4848
});
4949

5050
const validatedManuItems = [
51-
menuItem({
52-
text: "Visibles",
53-
path: "/responsable-certifications/certifications/",
54-
category: "VISIBLE",
55-
}),
56-
menuItem({
57-
text: "Invisibles",
58-
path: "/responsable-certifications/certifications/",
59-
category: "INVISIBLE",
60-
}),
51+
menuItem("Visibles", "VALIDE_PAR_CERTIFICATEUR", "true"),
52+
menuItem("Invisibles", "VALIDE_PAR_CERTIFICATEUR", "false"),
6153
];
6254

6355
const toValidateMenuItems = [
64-
menuItem({
65-
text: "À valider",
66-
path: "/responsable-certifications/certifications/",
67-
category: "TO_VALIDATE",
68-
defaultMenuItem: true,
69-
}),
56+
menuItem("À valider", "A_VALIDER_PAR_CERTIFICATEUR"),
7057
];
7158

7259
return (

0 commit comments

Comments
 (0)