1
1
import { useState } from "react" ;
2
2
import { Layout as DashboardLayout } from "/src/layouts/index.js" ;
3
3
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" ;
5
13
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" ;
7
16
import { useForm } from "react-hook-form" ;
8
17
import CippFormComponent from "/src/components/CippComponents/CippFormComponent" ;
9
18
import { useSettings } from "/src/hooks/use-settings" ;
10
19
11
- const simpleColumns = [
12
- "Tenant" ,
13
- "CippStatus" ,
14
- "appDisplayName" ,
15
- "requestUser" ,
16
- "requestReason" ,
17
- "requestStatus" ,
18
- "requestDate" ,
19
- ] ;
20
-
21
20
const apiUrl = "/api/ListAppConsentRequests" ;
22
21
const pageTitle = "App Consent Requests" ;
23
22
24
23
const Page = ( ) => {
25
24
const tenantFilter = useSettings ( ) . currentTenant ;
26
25
const formControl = useForm ( {
27
26
defaultValues : {
28
- requestStatus : "All " ,
27
+ requestStatus : "InProgress " ,
29
28
} ,
30
29
} ) ;
31
30
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
34
35
35
36
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 ) ;
39
50
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 ) ;
43
54
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 ,
45
129
} ;
46
130
47
131
return (
48
132
< 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
50
133
tableFilter = {
51
134
< 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 >
54
153
</ AccordionSummary >
55
154
< AccordionDetails >
56
155
< form onSubmit = { formControl . handleSubmit ( onSubmit ) } >
@@ -72,11 +171,34 @@ const Page = () => {
72
171
/>
73
172
</ Grid >
74
173
75
- { /* Submit Button */ }
174
+ { /* Action Buttons */ }
76
175
< 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 >
80
202
</ Grid >
81
203
</ Grid >
82
204
</ form >
@@ -86,45 +208,14 @@ const Page = () => {
86
208
title = { pageTitle }
87
209
apiUrl = { apiUrl }
88
210
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 } ` }
98
213
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
111
216
} }
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 }
128
219
/>
129
220
) ;
130
221
} ;
0 commit comments