Skip to content

Commit a0f3e3d

Browse files
Merge pull request #4374 from kris6673/app-consent
Fix: Fix broken filters and enhance UI components
2 parents 30cb8d6 + 35563f2 commit a0f3e3d

File tree

1 file changed

+157
-66
lines changed

1 file changed

+157
-66
lines changed

src/pages/tenant/administration/app-consent-requests/index.js

Lines changed: 157 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,155 @@
11
import { useState } from "react";
22
import { Layout as DashboardLayout } from "/src/layouts/index.js";
33
import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx";
4-
import { Button, Accordion, AccordionSummary, AccordionDetails, Typography } from "@mui/material";
4+
import {
5+
Button,
6+
Accordion,
7+
AccordionSummary,
8+
AccordionDetails,
9+
Typography,
10+
SvgIcon,
11+
Stack,
12+
} from "@mui/material";
513
import { Grid } from "@mui/system";
6-
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
14+
import { Visibility, CheckCircle, ExpandMore, Security } from "@mui/icons-material";
15+
import { FunnelIcon, XMarkIcon } from "@heroicons/react/24/outline";
716
import { useForm } from "react-hook-form";
817
import CippFormComponent from "/src/components/CippComponents/CippFormComponent";
918
import { useSettings } from "/src/hooks/use-settings";
1019

11-
const simpleColumns = [
12-
"Tenant",
13-
"CippStatus",
14-
"appDisplayName",
15-
"requestUser",
16-
"requestReason",
17-
"requestStatus",
18-
"requestDate",
19-
];
20-
2120
const apiUrl = "/api/ListAppConsentRequests";
2221
const pageTitle = "App Consent Requests";
2322

2423
const Page = () => {
2524
const tenantFilter = useSettings().currentTenant;
2625
const formControl = useForm({
2726
defaultValues: {
28-
requestStatus: "All",
27+
requestStatus: "InProgress",
2928
},
3029
});
3130

32-
const [expanded, setExpanded] = useState(false); // Accordion state
33-
const [filterParams, setFilterParams] = useState({}); // Dynamic filter params
31+
const [expanded, setExpanded] = useState(true); // Accordion state - start expanded since we have a default filter
32+
const [filterEnabled, setFilterEnabled] = useState(true); // State for filter toggle - start with filter enabled
33+
const [requestStatus, setRequestStatus] = useState("InProgress"); // State for request status filter - default to InProgress
34+
const [requestStatusLabel, setRequestStatusLabel] = useState("Pending"); // State for displaying filter label - default label
3435

3536
const onSubmit = (data) => {
36-
// Handle filter application logic
37-
const { requestStatus } = data;
38-
const filters = {};
37+
// Handle the case where requestStatus could be an object {label, value} or a string
38+
const statusValue =
39+
typeof data.requestStatus === "object" && data.requestStatus?.value
40+
? data.requestStatus.value
41+
: data.requestStatus;
42+
const statusLabel =
43+
typeof data.requestStatus === "object" && data.requestStatus?.label
44+
? data.requestStatus.label
45+
: data.requestStatus;
46+
47+
// Check if any filter is applied
48+
const hasFilter = statusValue !== "All";
49+
setFilterEnabled(hasFilter);
3950

40-
if (requestStatus !== "All") {
41-
filters.requestStatus = requestStatus;
42-
}
51+
// Set request status filter if not "All"
52+
setRequestStatus(hasFilter ? statusValue : null);
53+
setRequestStatusLabel(hasFilter ? statusLabel : null);
4354

44-
setFilterParams(filters);
55+
// Close the accordion after applying filters
56+
setExpanded(false);
57+
};
58+
59+
const clearFilters = () => {
60+
formControl.reset({
61+
requestStatus: "All",
62+
});
63+
setFilterEnabled(false);
64+
setRequestStatus(null);
65+
setRequestStatusLabel(null);
66+
setExpanded(false); // Close the accordion when clearing filters
67+
};
68+
69+
const actions = [
70+
{
71+
label: "Review in Entra",
72+
link: `https://entra.microsoft.com/${tenantFilter}/#view/Microsoft_AAD_IAM/StartboardApplicationsMenuBlade/~/AccessRequests`,
73+
color: "info",
74+
icon: <Visibility />,
75+
target: "_blank",
76+
external: true,
77+
},
78+
{
79+
label: "Approve in Entra",
80+
link: "[consentUrl]",
81+
color: "info",
82+
icon: <CheckCircle />,
83+
target: "_blank",
84+
external: true,
85+
},
86+
];
87+
88+
const simpleColumns = [
89+
"requestUser", // Requester
90+
"appDisplayName", // Application Name
91+
"appId", // Application ID
92+
"requestReason", // Reason
93+
"requestStatus", // Status
94+
"reviewedBy", // Reviewed by
95+
"reviewedJustification", // Reviewed Reason
96+
"consentUrl", // Consent URL
97+
];
98+
99+
const filters = [
100+
{
101+
filterName: "Pending requests",
102+
value: [{ id: "requestStatus", value: "InProgress" }],
103+
type: "column",
104+
},
105+
{
106+
filterName: "Expired requests",
107+
value: [{ id: "requestStatus", value: "Expired" }],
108+
type: "column",
109+
},
110+
{
111+
filterName: "Completed requests",
112+
value: [{ id: "requestStatus", value: "Completed" }],
113+
type: "column",
114+
},
115+
];
116+
117+
const offCanvas = {
118+
extendedInfoFields: [
119+
"requestUser", // Requester
120+
"appDisplayName", // Application Name
121+
"appId", // Application ID
122+
"requestReason", // Reason
123+
"requestStatus", // Status
124+
"reviewedBy", // Reviewed by
125+
"reviewedJustification", // Reviewed Reason
126+
"consentUrl", // Consent URL
127+
],
128+
actions: actions,
45129
};
46130

47131
return (
48132
<CippTablePage
49-
// FIXME: This tableFilter does nothing. It does not change the table data at all, like the code makes it seem like it should. -Bobby
50133
tableFilter={
51134
<Accordion expanded={expanded} onChange={() => setExpanded(!expanded)}>
52-
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
53-
<Typography>Filters</Typography>
135+
<AccordionSummary expandIcon={<ExpandMore />}>
136+
<Stack direction="row" spacing={1} alignItems="center">
137+
<SvgIcon>
138+
<FunnelIcon />
139+
</SvgIcon>
140+
<Typography variant="h6">
141+
App Consent Request Filters
142+
{filterEnabled ? (
143+
<span style={{ fontSize: "0.8em", marginLeft: "10px", fontWeight: "normal" }}>
144+
({requestStatusLabel && <>Status: {requestStatusLabel}</>})
145+
</span>
146+
) : (
147+
<span style={{ fontSize: "0.8em", marginLeft: "10px", fontWeight: "normal" }}>
148+
(No filters applied)
149+
</span>
150+
)}
151+
</Typography>
152+
</Stack>
54153
</AccordionSummary>
55154
<AccordionDetails>
56155
<form onSubmit={formControl.handleSubmit(onSubmit)}>
@@ -72,11 +171,34 @@ const Page = () => {
72171
/>
73172
</Grid>
74173

75-
{/* Submit Button */}
174+
{/* Action Buttons */}
76175
<Grid size={{ xs: 12 }}>
77-
<Button type="submit" variant="contained" color="primary">
78-
Apply Filters
79-
</Button>
176+
<Stack direction="row" spacing={2}>
177+
<Button
178+
type="submit"
179+
variant="contained"
180+
color="primary"
181+
startIcon={
182+
<SvgIcon>
183+
<FunnelIcon />
184+
</SvgIcon>
185+
}
186+
>
187+
Apply Filters
188+
</Button>
189+
<Button
190+
variant="outlined"
191+
color="primary"
192+
startIcon={
193+
<SvgIcon>
194+
<XMarkIcon />
195+
</SvgIcon>
196+
}
197+
onClick={clearFilters}
198+
>
199+
Clear Filters
200+
</Button>
201+
</Stack>
80202
</Grid>
81203
</Grid>
82204
</form>
@@ -86,45 +208,14 @@ const Page = () => {
86208
title={pageTitle}
87209
apiUrl={apiUrl}
88210
simpleColumns={simpleColumns}
89-
filters={[
90-
// Filter for showing only pending requests
91-
{
92-
filterName: "Pending requests",
93-
value: [{ id: "requestStatus", value: "InProgress" }],
94-
type: "column",
95-
},
96-
]}
97-
queryKey={`AppConsentRequests-${JSON.stringify(filterParams)}-${tenantFilter}`}
211+
filters={filters}
212+
queryKey={`AppConsentRequests-${requestStatus}-${filterEnabled}-${tenantFilter}`}
98213
apiData={{
99-
...filterParams,
100-
}}
101-
offCanvas={{
102-
extendedInfoFields: [
103-
"requestUser", // Requester
104-
"appDisplayName", // Application Name
105-
"appId", // Application ID
106-
"requestReason", // Reason
107-
"requestStatus", // Status
108-
"reviewedBy", // Reviewed by
109-
"reviewedJustification", // Reviewed Reason
110-
],
214+
RequestStatus: requestStatus, // Pass request status filter from state
215+
Filter: filterEnabled, // Pass filter toggle state
111216
}}
112-
actions={[
113-
{
114-
label: "Review in Entra",
115-
link: `https://entra.microsoft.com/${tenantFilter}/#view/Microsoft_AAD_IAM/StartboardApplicationsMenuBlade/~/AccessRequests`,
116-
color: "info",
117-
target: "_blank",
118-
external: true,
119-
},
120-
{
121-
label: "Approve in Entra",
122-
link: "[consentUrl]",
123-
color: "info",
124-
target: "_blank",
125-
external: true,
126-
},
127-
]}
217+
offCanvas={offCanvas}
218+
actions={actions}
128219
/>
129220
);
130221
};

0 commit comments

Comments
 (0)