Skip to content
This repository was archived by the owner on Nov 1, 2024. It is now read-only.

Commit 52adeae

Browse files
committed
access request ui
1 parent c3ccbf9 commit 52adeae

File tree

5 files changed

+103
-55
lines changed

5 files changed

+103
-55
lines changed

components/dataproducts/access/datasetAccess.tsx

+81-43
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { ExternalLink } from '@navikt/ds-icons'
1919
import { nb } from 'date-fns/locale'
2020
import ErrorMessage from '../../lib/error'
2121
import { useGetDataset } from '../../../lib/rest/dataproducts'
22-
import { useFetchAccessRequestsForDataset } from '../../../lib/rest/access'
22+
import { apporveAccessRequest, denyAccessRequest, useFetchAccessRequestsForDataset } from '../../../lib/rest/access'
2323

2424
interface AccessEntry {
2525
subject: string
@@ -126,23 +126,89 @@ interface AccessModalProps {
126126

127127
interface AccessRequestModalProps {
128128
requestID: string
129-
actionDeny: (requestID: string, setOpen: Function) => void
130-
actionApprove: (requestID: string) => void
129+
user?: string
131130
}
132131

133132
export const AccessRequestModal = ({
134133
requestID,
135-
actionDeny,
136-
actionApprove,
134+
user,
137135
}: AccessRequestModalProps) => {
138-
const [open, setOpen] = useState(false)
136+
const [openDeny, setOpenDeny] = useState(false)
137+
const [openApprove, setOpenApprove] = useState(false)
138+
const [errorApprove, setErrorApprove] = useState<string|undefined>(undefined)
139+
const [errorDeny, setErrorDeny] = useState<string|undefined>(undefined)
140+
const approve = async (requestID: string) =>
141+
apporveAccessRequest(requestID).then(res=>
142+
{
143+
setOpenApprove(false)
144+
setErrorApprove(undefined)
145+
window.location.reload();
146+
}
147+
).catch((e:any)=>{
148+
setErrorApprove(e.message)
149+
})
150+
const deny = async (requestID: string, reason?: string)=>denyAccessRequest(requestID, reason ||'')
151+
.then(()=>{
152+
setOpenDeny(false)
153+
setErrorDeny(undefined)
154+
window.location.reload();
155+
}).catch((e:any)=>{
156+
setErrorDeny(e.message)
157+
})
158+
159+
160+
const cancelApprove = () => {
161+
setOpenApprove(false)
162+
setErrorApprove(undefined)
163+
}
164+
165+
const cancelDeny = () => {
166+
setOpenDeny(false)
167+
setErrorDeny(undefined)
168+
}
169+
139170
return (
140171
<>
141172
<Modal
142-
open={open}
173+
open={openApprove}
174+
aria-label="Godkjenn søknad"
175+
onClose={() => setOpenApprove(false)}
176+
className='w-full md:w-[60rem] px-8 h-[13rem]'
177+
>
178+
<Modal.Body className='h-full'>
179+
<div className='flex flex-col justify-center items-center'>
180+
<Heading level="1" size="medium">
181+
Godkjenn søknad
182+
</Heading>
183+
<p className='mt-4 mb-4'>Gi tilgang til datasett{user ? ` til ${user}` : ''}? </p>
184+
<div className="flex flex-row gap-4">
185+
<Button
186+
onClick={cancelApprove}
187+
variant="secondary"
188+
size="small"
189+
>
190+
Avbryt
191+
</Button>
192+
<Button
193+
onClick={() => {
194+
approve(requestID)
195+
}}
196+
variant="primary"
197+
size="small"
198+
>
199+
Godkjenn
200+
</Button>
201+
</div>
202+
{errorApprove && <div className='text-red-600'>{errorApprove}</div>}
203+
</div>
204+
</Modal.Body>
205+
</Modal>
206+
207+
<Modal
208+
open={openDeny}
143209
aria-label="Avslå søknad"
144-
onClose={() => setOpen(false)}
145-
className="max-w-full md:max-w-3xl px-8 h-[20rem]"
210+
onClose={() => setOpenDeny(false)}
211+
className="max-w-full md:max-w-3xl px-8 h-[24rem]"
146212
>
147213
<Modal.Body className="h-full">
148214
<div className="flex flex-col gap-8">
@@ -152,32 +218,33 @@ export const AccessRequestModal = ({
152218
<Textarea label="Begrunnelse" />
153219
<div className="flex flex-row gap-4">
154220
<Button
155-
onClick={() => setOpen(false)}
221+
onClick={cancelDeny}
156222
variant="secondary"
157223
size="small"
158224
>
159225
Avbryt
160226
</Button>
161227
<Button
162-
onClick={() => actionDeny(requestID, setOpen)}
228+
onClick={() => deny(requestID)}
163229
variant="primary"
164230
size="small"
165231
>
166232
Avslå
167233
</Button>
168234
</div>
235+
{errorDeny && <div className='text-red-600'>{errorDeny}</div>}
169236
</div>
170237
</Modal.Body>
171238
</Modal>
172239
<div className="flex flex-row flex-nowrap gap-4 justify-end">
173240
<Button
174-
onClick={() => actionApprove(requestID)}
241+
onClick={() => setOpenApprove(true)}
175242
variant="secondary"
176243
size="small"
177244
>
178245
Godkjenn
179246
</Button>
180-
<Button onClick={() => setOpen(true)} variant="secondary" size="small">
247+
<Button onClick={() => setOpenDeny(true)} variant="secondary" size="small">
181248
Avslå
182249
</Button>
183250
</div>
@@ -235,8 +302,6 @@ const AccessModal = ({ accessEntry, action }: AccessModalProps) => {
235302
const DatasetAccess = ({ id }: AccessListProps) => {
236303
const [formError, setFormError] = useState('')
237304
const [revokeAccess] = useRevokeAccessMutation()
238-
const [approveAccessRequest] = useApproveAccessRequestMutation()
239-
const [denyAccessRequest] = useDenyAccessRequestMutation()
240305
const fetchAccessRequestsForDataset = useFetchAccessRequestsForDataset(id)
241306

242307
const getDataset = useGetDataset(id)
@@ -256,32 +321,6 @@ const DatasetAccess = ({ id }: AccessListProps) => {
256321
!getDataset?.dataset?.access ? [] :
257322
getDataset.dataset.access
258323

259-
const approveRequest = async (requestID: string) => {
260-
try {
261-
await approveAccessRequest({
262-
variables: { id: requestID },
263-
refetchQueries: [
264-
],
265-
})
266-
} catch (e: any) {
267-
setFormError(e.message)
268-
}
269-
}
270-
271-
const denyRequest = async (requestID: string, setOpen: Function) => {
272-
try {
273-
await denyAccessRequest({
274-
variables: { id: requestID },
275-
refetchQueries: [
276-
],
277-
})
278-
} catch (e: any) {
279-
setFormError(e.message)
280-
} finally {
281-
setOpen(false)
282-
}
283-
}
284-
285324
const removeAccess = async (a: access, setOpen: Function) => {
286325
try {
287326
await revokeAccess({
@@ -345,8 +384,7 @@ const DatasetAccess = ({ id }: AccessListProps) => {
345384
<Table.DataCell className="w-[150px]" align="right">
346385
<AccessRequestModal
347386
requestID={r.id}
348-
actionApprove={approveRequest}
349-
actionDeny={denyRequest}
387+
user={r.subject}
350388
/>
351389
</Table.DataCell>
352390
</Table.Row>

components/header/user.tsx

+9
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@ export default function User() {
8484
Mine innsiktsprodukter
8585
</Dropdown.Menu.GroupedList.Item>
8686

87+
<Dropdown.Menu.GroupedList.Item
88+
className={'text-base'}
89+
onClick={() => {
90+
router.push({ pathname: '/user/requestsForGroup' })
91+
}}
92+
>
93+
Tilgangssøknader til meg
94+
</Dropdown.Menu.GroupedList.Item>
95+
8796
<Dropdown.Menu.GroupedList.Item
8897
className={'text-base'}
8998
onClick={() => {

components/user/pendingAccessRequestBar.tsx

+1-10
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,6 @@ interface PendingAccessRequestBarProps {
1010
}
1111

1212
export const PendingAccessRequestBar = ({ accessRequest }: PendingAccessRequestBarProps) => {
13-
const [expanded, setExpanded] = useState(false)
14-
const userData = useContext(UserState)
15-
const approve = (requestID: string) => {
16-
apporveAccessRequest(requestID)
17-
}
18-
const deny = (requestID: string) => {
19-
denyAccessRequest(requestID, "")
20-
}
21-
2213
return (
2314
<div key={accessRequest.id} className="w-[60rem] mb-5 mt-5 border pt-2 pb-2 pl-4 pr-4 flex flex-row justify-between rounded border-gray-200">
2415
<div>
@@ -47,7 +38,7 @@ export const PendingAccessRequestBar = ({ accessRequest }: PendingAccessRequestB
4738
</div>
4839
</div>
4940
<div>
50-
<AccessRequestModal requestID={accessRequest.id} actionDeny={deny} actionApprove={approve}></AccessRequestModal>
41+
<AccessRequestModal requestID={accessRequest.id}></AccessRequestModal>
5142
</div>
5243
</div>)
5344
}

lib/rest/restApi.ts

+10
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ export const fetchTemplate = (url: string) => fetch(url, {
3333
headers: {
3434
'Content-Type': 'application/json',
3535
},
36+
}).then(res => {
37+
if (!res.ok) {
38+
throw new Error(res.statusText)
39+
}
40+
return res
3641
})
3742

3843
export const postTemplate = (url: string, body?: any) => fetch(url, {
@@ -42,6 +47,11 @@ export const postTemplate = (url: string, body?: any) => fetch(url, {
4247
'Content-Type': 'application/json',
4348
},
4449
body: JSON.stringify(body),
50+
}).then(res => {
51+
if (!res.ok) {
52+
throw new Error(res.statusText)
53+
}
54+
return res
4555
})
4656

4757

pages/user/[[...page]].tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,11 @@ export const UserPages = () => {
6464
),
6565
},
6666
{
67-
title: 'Tilgangssøknader til min gruppe',
67+
title: 'Tilgangssøknader til meg',
6868
slug: 'requestsForGroup',
6969
component: (
7070
<div className="grid gap-4">
71-
<h2>Tilgangssøknader til min gruppe</h2>
71+
<h2>Tilgangssøknader til meg</h2>
7272
<AccessRequestsForGroup
7373
accessRequests={data.accessRequestsAsGranter as any[]}
7474
/>

0 commit comments

Comments
 (0)