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

Commit af9dc1e

Browse files
authored
Merge pull request #308 from navikt/refactor/ART-07-access
Add page for pending access request and switch to new access request endpoint
2 parents 7ea8d2a + 48a729e commit af9dc1e

13 files changed

+218
-218
lines changed

components/dataproducts/access/datasetAccess.tsx

+82-46
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import { useState } from 'react'
33
import { isAfter, parseISO, format } from 'date-fns'
44
import {
55
useRevokeAccessMutation,
6-
useApproveAccessRequestMutation,
7-
useDenyAccessRequestMutation,
86
} from '../../../lib/schema/graphql'
97
import {
108
Alert,
@@ -19,7 +17,7 @@ import { ExternalLink } from '@navikt/ds-icons'
1917
import { nb } from 'date-fns/locale'
2018
import ErrorMessage from '../../lib/error'
2119
import { useGetDataset } from '../../../lib/rest/dataproducts'
22-
import { useFetchAccessRequestsForDataset } from '../../../lib/rest/access'
20+
import { apporveAccessRequest, denyAccessRequest, useFetchAccessRequestsForDataset } from '../../../lib/rest/access'
2321

2422
interface AccessEntry {
2523
subject: string
@@ -126,23 +124,89 @@ interface AccessModalProps {
126124

127125
interface AccessRequestModalProps {
128126
requestID: string
129-
actionDeny: (requestID: string, setOpen: Function) => void
130-
actionApprove: (requestID: string) => void
127+
user?: string
131128
}
132129

133-
const AccessRequestModal = ({
130+
export const AccessRequestModal = ({
134131
requestID,
135-
actionDeny,
136-
actionApprove,
132+
user,
137133
}: AccessRequestModalProps) => {
138-
const [open, setOpen] = useState(false)
134+
const [openDeny, setOpenDeny] = useState(false)
135+
const [openApprove, setOpenApprove] = useState(false)
136+
const [errorApprove, setErrorApprove] = useState<string|undefined>(undefined)
137+
const [errorDeny, setErrorDeny] = useState<string|undefined>(undefined)
138+
const approve = async (requestID: string) =>
139+
apporveAccessRequest(requestID).then(res=>
140+
{
141+
setOpenApprove(false)
142+
setErrorApprove(undefined)
143+
window.location.reload();
144+
}
145+
).catch((e:any)=>{
146+
setErrorApprove(e.message)
147+
})
148+
const deny = async (requestID: string, reason?: string)=>denyAccessRequest(requestID, reason ||'')
149+
.then(()=>{
150+
setOpenDeny(false)
151+
setErrorDeny(undefined)
152+
window.location.reload();
153+
}).catch((e:any)=>{
154+
setErrorDeny(e.message)
155+
})
156+
157+
158+
const cancelApprove = () => {
159+
setOpenApprove(false)
160+
setErrorApprove(undefined)
161+
}
162+
163+
const cancelDeny = () => {
164+
setOpenDeny(false)
165+
setErrorDeny(undefined)
166+
}
167+
139168
return (
140169
<>
141170
<Modal
142-
open={open}
171+
open={openApprove}
172+
aria-label="Godkjenn søknad"
173+
onClose={() => setOpenApprove(false)}
174+
className='w-full md:w-[60rem] px-8 h-[13rem]'
175+
>
176+
<Modal.Body className='h-full'>
177+
<div className='flex flex-col justify-center items-center'>
178+
<Heading level="1" size="medium">
179+
Godkjenn søknad
180+
</Heading>
181+
<p className='mt-4 mb-4'>Gi tilgang til datasett{user ? ` til ${user}` : ''}? </p>
182+
<div className="flex flex-row gap-4">
183+
<Button
184+
onClick={cancelApprove}
185+
variant="secondary"
186+
size="small"
187+
>
188+
Avbryt
189+
</Button>
190+
<Button
191+
onClick={() => {
192+
approve(requestID)
193+
}}
194+
variant="primary"
195+
size="small"
196+
>
197+
Godkjenn
198+
</Button>
199+
</div>
200+
{errorApprove && <div className='text-red-600'>{errorApprove}</div>}
201+
</div>
202+
</Modal.Body>
203+
</Modal>
204+
205+
<Modal
206+
open={openDeny}
143207
aria-label="Avslå søknad"
144-
onClose={() => setOpen(false)}
145-
className="max-w-full md:max-w-3xl px-8 h-[20rem]"
208+
onClose={() => setOpenDeny(false)}
209+
className="max-w-full md:max-w-3xl px-8 h-[24rem]"
146210
>
147211
<Modal.Body className="h-full">
148212
<div className="flex flex-col gap-8">
@@ -152,32 +216,33 @@ const AccessRequestModal = ({
152216
<Textarea label="Begrunnelse" />
153217
<div className="flex flex-row gap-4">
154218
<Button
155-
onClick={() => setOpen(false)}
219+
onClick={cancelDeny}
156220
variant="secondary"
157221
size="small"
158222
>
159223
Avbryt
160224
</Button>
161225
<Button
162-
onClick={() => actionDeny(requestID, setOpen)}
226+
onClick={() => deny(requestID)}
163227
variant="primary"
164228
size="small"
165229
>
166230
Avslå
167231
</Button>
168232
</div>
233+
{errorDeny && <div className='text-red-600'>{errorDeny}</div>}
169234
</div>
170235
</Modal.Body>
171236
</Modal>
172237
<div className="flex flex-row flex-nowrap gap-4 justify-end">
173238
<Button
174-
onClick={() => actionApprove(requestID)}
239+
onClick={() => setOpenApprove(true)}
175240
variant="secondary"
176241
size="small"
177242
>
178243
Godkjenn
179244
</Button>
180-
<Button onClick={() => setOpen(true)} variant="secondary" size="small">
245+
<Button onClick={() => setOpenDeny(true)} variant="secondary" size="small">
181246
Avslå
182247
</Button>
183248
</div>
@@ -235,8 +300,6 @@ const AccessModal = ({ accessEntry, action }: AccessModalProps) => {
235300
const DatasetAccess = ({ id }: AccessListProps) => {
236301
const [formError, setFormError] = useState('')
237302
const [revokeAccess] = useRevokeAccessMutation()
238-
const [approveAccessRequest] = useApproveAccessRequestMutation()
239-
const [denyAccessRequest] = useDenyAccessRequestMutation()
240303
const fetchAccessRequestsForDataset = useFetchAccessRequestsForDataset(id)
241304

242305
const getDataset = useGetDataset(id)
@@ -256,32 +319,6 @@ const DatasetAccess = ({ id }: AccessListProps) => {
256319
!getDataset?.dataset?.access ? [] :
257320
getDataset.dataset.access
258321

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-
285322
const removeAccess = async (a: access, setOpen: Function) => {
286323
try {
287324
await revokeAccess({
@@ -345,8 +382,7 @@ const DatasetAccess = ({ id }: AccessListProps) => {
345382
<Table.DataCell className="w-[150px]" align="right">
346383
<AccessRequestModal
347384
requestID={r.id}
348-
actionApprove={approveRequest}
349-
actionDeny={denyRequest}
385+
user={r.subject}
350386
/>
351387
</Table.DataCell>
352388
</Table.Row>

components/dataproducts/accessRequest/accessRequestsListForOwner.tsx

-77
This file was deleted.

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={() => {
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { Alert, Link } from "@navikt/ds-react"
2+
import { useContext, useState } from "react"
3+
import { UserState } from "../../lib/context"
4+
5+
export const AccessRequestAlert = () => {
6+
const userData = useContext(UserState)
7+
return userData?.accessRequests?.length ?(
8+
<Alert variant='info'>
9+
Du har tilgangssøknad som venter på <Link href="/user/requestsForGroup">behandling</Link>.
10+
</Alert>): <></>
11+
}
+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Heading, Link, Table, Tabs } from "@navikt/ds-react"
2+
import { PendingAccessRequestBar } from "./pendingAccessRequestBar"
3+
4+
interface pendingAccessRequestsForGroupProps {
5+
accessRequests: any[]
6+
}
7+
8+
export const AccessRequestsForGroup = ({ accessRequests }: pendingAccessRequestsForGroupProps) => {
9+
//TODO: support approved and denied requests
10+
const pendingRequest = accessRequests.filter((r) => r.status === 'pending')
11+
return <><div>
12+
{pendingRequest?.length > 0 ? (<div>
13+
{pendingRequest.map((r: any, i: number) => (
14+
<PendingAccessRequestBar accessRequest={r} key={i}></PendingAccessRequestBar>
15+
))
16+
}</div>
17+
) : (
18+
<div>Ingen tilgangssøknader</div>
19+
)}
20+
</div>
21+
</>
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { Link } from "@navikt/ds-react"
2+
import { useContext, useState } from "react"
3+
import { AccessRequestModal } from "../dataproducts/access/datasetAccess"
4+
import { apporveAccessRequest, denyAccessRequest } from "../../lib/rest/access"
5+
import { ExternalLink } from "@navikt/ds-icons"
6+
import { UserState } from "../../lib/context"
7+
8+
interface PendingAccessRequestBarProps {
9+
accessRequest: any
10+
}
11+
12+
export const PendingAccessRequestBar = ({ accessRequest }: PendingAccessRequestBarProps) => {
13+
return (
14+
<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">
15+
<div>
16+
<h3> <Link rel="norefferer" href={`/dataproduct/${accessRequest.dataproductID}/${accessRequest.dataproductSlug}/${accessRequest.datasetID}`}>
17+
{`${accessRequest?.datasetName} - ${accessRequest?.dataproductName}`}
18+
</Link>
19+
</h3>
20+
{accessRequest.owner}
21+
<br></br>
22+
<div className="flex flex-row">
23+
<div>
24+
{!accessRequest.expires ? "Alltid tilgang fra ": "Tilgangsperiode: "}
25+
{new Date(accessRequest.created).toLocaleDateString('no-NO')}
26+
{accessRequest.expires && ` - ${new Date(accessRequest.expires).toLocaleDateString('no-NO')}`}
27+
</div>
28+
<div className="ml-[2rem]">
29+
{accessRequest.polly?.url ? (
30+
<Link target="_blank" rel="norefferer" href={accessRequest.polly.url}>
31+
Åpne behandling
32+
<ExternalLink />
33+
</Link>
34+
) : (
35+
'Ingen behandling'
36+
)}
37+
</div>
38+
</div>
39+
</div>
40+
<div>
41+
<AccessRequestModal requestID={accessRequest.id}></AccessRequestModal>
42+
</div>
43+
</div>)
44+
}

lib/queries/accessRequest/approveAccessRequest.ts

-7
This file was deleted.

lib/queries/accessRequest/denyAccessRequest.ts

-7
This file was deleted.

0 commit comments

Comments
 (0)