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

Commit

Permalink
Merge branch 'main' into dependabot/github_actions/docker/build-push-…
Browse files Browse the repository at this point in the history
…action-5
  • Loading branch information
erikvatt authored Nov 29, 2023
2 parents 3c9b32f + eb47d5d commit a04db20
Show file tree
Hide file tree
Showing 53 changed files with 20,565 additions and 12,942 deletions.
53 changes: 53 additions & 0 deletions components/dataProc/joinableViewCard.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { Alert, Box, CopyButton, ExpansionCard, Link, Loader, Tooltip } from "@navikt/ds-react"
import { JoinableView, useJoinableViewQuery } from "../../lib/schema/graphql"
import { ExternalLink } from "@navikt/ds-icons"
import LoaderSpinner from "../lib/spinner"
import { useState } from "react"

interface JoinableViewCardProps {
joinableView: JoinableView
}

export const JoinableViewCardContent = ({ joinableViewId }: { joinableViewId: string }) => {
const { data, loading, error } = useJoinableViewQuery({ variables: { id: joinableViewId } })
const urlComps = data?.joinableView.pseudoDatasources && data?.joinableView.pseudoDatasources.length
? data?.joinableView.pseudoDatasources[0].bigqueryUrl.split('.') : ["", "", ""]
const projectID = urlComps[0]
const datasetID = urlComps[1]
const bigQueryUrl = `https://console.cloud.google.com/bigquery?d=${datasetID}&p=${projectID}&page=dataset`

return <div>
{loading && <LoaderSpinner />}
{error && <Alert variant="error">Klarte ikke hente data om views tilrettelagt for kobling</Alert>}
{data && <>
<Link href={bigQueryUrl}>{"Åpne BigQuery dataset i Google Cloud Console"}<ExternalLink /></Link>
{data?.joinableView.pseudoDatasources.map((bqv, index) => <Box key={index} padding="1" className="w-[55rem]">
{bqv.deleted?<Tooltip content="Datasettet er slettet fra markedsplassen"><div className="flex flex-row items-center line-through">{bqv.bigqueryUrl}</div></Tooltip>:
bqv.accessible? <div className="flex flex-row items-center bg-gray-200">{bqv.bigqueryUrl}<CopyButton copyText={bqv.bigqueryUrl}></CopyButton></div>
: <Tooltip content="Har ikke tilgang til datasettet"><div className="flex flex-row items-center text-gray-200" >{bqv.bigqueryUrl}</div></Tooltip>}
</Box>)}
{data?.joinableView.expires &&
<div className="mt-3 italic">
BigQuery datasettet slettes {data?.joinableView.expires.split("T")[0]}
</div>
}
</>}
</div>
}

export const JoinableViewCard = ({ joinableView }: JoinableViewCardProps) => {
const [expanded, setExpanded] = useState(false)

return <div key={joinableView.id} className="w-[60rem]">
<ExpansionCard aria-label="default-demo" onToggle={open => setExpanded(open)}>
<ExpansionCard.Header>
<ExpansionCard.Title>{`${joinableView?.name} - ${joinableView?.created}`}</ExpansionCard.Title>
<ExpansionCard.Description>
<p>Klikk for å vise BigQuery dataset</p></ExpansionCard.Description>
</ExpansionCard.Header>
<ExpansionCard.Content>
{expanded && <JoinableViewCardContent joinableViewId={joinableView.id} />}
</ExpansionCard.Content>
</ExpansionCard>
</div>
}
19 changes: 19 additions & 0 deletions components/dataProc/joinableViewsList.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { Alert, Heading, Link, ExpansionCard, CopyButton, Box } from "@navikt/ds-react"
import { GET_JOINABLEVIEWS } from "../../lib/queries/pseudoView/joinableViews"
import { useJoinableViewsQuery } from "../../lib/schema/graphql"
import { ExternalLink } from "@navikt/ds-icons"
import LoaderSpinner from "../lib/spinner"
import { JoinableViewCard } from "./joinableViewCard"

export const JoinableViewsList = () => {
const joinableViews = useJoinableViewsQuery()
return <div>
{joinableViews.loading && <LoaderSpinner />}
{joinableViews.error && <Alert variant="error">Kan ikke Hente sammenføybare viewer.</Alert>}
{joinableViews.data &&
<div className="flex-col space-y-2">
{joinableViews.data.joinableViews?.map(it => <JoinableViewCard key={it.id} joinableView={it} />)}
</div>
}
</div>
}
8 changes: 4 additions & 4 deletions components/dataproducts/access/datasetAccess.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ const AccessRequestModal = ({
onClose={() => setOpen(false)}
className="max-w-full md:max-w-3xl px-8 h-[20rem]"
>
<Modal.Content className="h-full">
<Modal.Body className="h-full">
<div className="flex flex-col gap-8">
<Heading level="1" size="medium">
Avslå søknad
Expand All @@ -169,7 +169,7 @@ const AccessRequestModal = ({
</Button>
</div>
</div>
</Modal.Content>
</Modal.Body>
</Modal>
<div className="flex flex-row flex-nowrap gap-4 justify-end">
<Button
Expand Down Expand Up @@ -197,7 +197,7 @@ const AccessModal = ({ accessEntry, action }: AccessModalProps) => {
onClose={() => setOpen(false)}
className="max-w-full md:max-w-3xl px-8 h-[12rem]"
>
<Modal.Content className="h-full">
<Modal.Body className="h-full">
<div className="flex flex-col gap-8">
<Heading level="1" size="medium">
Fjerne tilgang
Expand All @@ -220,7 +220,7 @@ const AccessModal = ({ accessEntry, action }: AccessModalProps) => {
</Button>
</div>
</div>
</Modal.Content>
</Modal.Body>
</Modal>
<Button
onClick={() => setOpen(true)}
Expand Down
10 changes: 5 additions & 5 deletions components/dataproducts/access/newDatasetAccess.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Button, Heading, Radio, RadioGroup, TextField, UNSAFE_DatePicker, UNSAFE_useDatepicker } from "@navikt/ds-react";
import { Button, DatePicker, Heading, Radio, RadioGroup, TextField, useDatepicker } from "@navikt/ds-react";
import { DatasetQuery, SubjectType, useGrantAccessMutation } from "../../../lib/schema/graphql";
import * as yup from 'yup'
import { Controller, useForm, useFormState } from "react-hook-form";
Expand Down Expand Up @@ -64,7 +64,7 @@ const NewDatasetAccess = ({dataset, setShowNewAccess}: NewDatasetAccessProps) =>
},
})

const { datepickerProps, inputProps, selectedDay } = UNSAFE_useDatepicker({
const { datepickerProps, inputProps, selectedDay } = useDatepicker({
fromDate: tomorrow(),
onDateChange: (d: Date | undefined) => setValue("expires", d ? d.toISOString() : ''),
});
Expand Down Expand Up @@ -144,14 +144,14 @@ const NewDatasetAccess = ({dataset, setShowNewAccess}: NewDatasetAccessProps) =>
error={errors?.accessType?.message}
>
<Radio value="until">Til dato</Radio>
<UNSAFE_DatePicker {...datepickerProps}>
<UNSAFE_DatePicker.Input
<DatePicker {...datepickerProps}>
<DatePicker.Input
{...inputProps}
label=""
disabled={field.value === 'eternal'}
error={errors?.expires?.message}
/>
</UNSAFE_DatePicker>
</DatePicker>
<Radio value="eternal">For alltid</Radio>
</RadioGroup>
)}
Expand Down
10 changes: 5 additions & 5 deletions components/dataproducts/accessRequest/accessRequestForm.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { yupResolver } from '@hookform/resolvers/yup';
import { Button, Heading, Radio, RadioGroup, TextField, UNSAFE_DatePicker, UNSAFE_useDatepicker } from '@navikt/ds-react'
import { Button, DatePicker, Heading, Radio, RadioGroup, TextField, useDatepicker} from '@navikt/ds-react'
import { useRouter } from 'next/router'
import { useContext, useState } from 'react'
import { Controller, useForm } from 'react-hook-form'
Expand Down Expand Up @@ -107,7 +107,7 @@ const AccessRequestFormV2 = ({
},
})

const { datepickerProps, inputProps, selectedDay } = UNSAFE_useDatepicker({
const { datepickerProps, inputProps, selectedDay } = useDatepicker({
defaultSelected: new Date(getValues("expires")),
fromDate: new Date(tomorrow()),
onDateChange: (d: Date | undefined) => setValue("expires", d ? d.toISOString() : ''),
Expand Down Expand Up @@ -213,14 +213,14 @@ const AccessRequestFormV2 = ({
error={errors?.accessType?.message}
>
<Radio value="until">Til dato</Radio>
<UNSAFE_DatePicker {...datepickerProps}>
<UNSAFE_DatePicker.Input
<DatePicker {...datepickerProps}>
<DatePicker.Input
{...inputProps}
label=""
disabled={field.value === 'eternal'}
error={errors?.expires?.message?.toString()}
/>
</UNSAFE_DatePicker>
</DatePicker>
<Radio value="eternal">For alltid</Radio>
</RadioGroup>
)}
Expand Down
74 changes: 74 additions & 0 deletions components/dataproducts/dataproductList.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import { ExpansionCard } from "@navikt/ds-react"
import SearchResultLink from "../search/searchResultLink"

interface Dataset {
__typename?: 'Dataset' | undefined
id: string
dataproductID: string
dataproduct: {
name: string
slug: string
}
name: string
keywords: string[]
slug: string
owner: { __typename?: 'Owner' | undefined, group: string }
}

interface DataproductsListProps {
datasets: Dataset[]
}

const groupDatasetsByDataproduct = (datasets: any[]) => {
let dataproducts = new Map<string, Dataset[]>()

datasets.forEach((dataset) => {
dataproducts.set(dataset.dataproductID, dataproducts.get(dataset.dataproductID) || [])
dataproducts.get(dataset.dataproductID)?.push(dataset)
})

var datasetsGroupedByDataproduct: Array<Dataset[]> = [];
dataproducts.forEach((datasets) => {
datasetsGroupedByDataproduct.push(datasets)
})

return datasetsGroupedByDataproduct
}

export const DataproductsList = ({ datasets }: DataproductsListProps) => {
const groupedDatasets = groupDatasetsByDataproduct(datasets)
return (
<>
{groupedDatasets.map((datasets) => {
return (
<>
<div className="w-[60rem]">
<ExpansionCard key={datasets[0].dataproductID} aria-label="dataproduct-access">
<ExpansionCard.Header>
<ExpansionCard.Title>{`Dataprodukt - ${datasets[0].dataproduct.name}`}</ExpansionCard.Title>
<ExpansionCard.Description>
<p>Klikk for å se datasettene du har tilgang til</p></ExpansionCard.Description>
</ExpansionCard.Header>
<ExpansionCard.Content className="text-center">
<>
{datasets.map((dataset) => {
return <SearchResultLink
key={dataset.id}
group={dataset.owner}
name={dataset.name}
type={'Dataset'}
keywords={dataset.keywords}
link={`/dataproduct/${dataset.dataproductID}/${dataset.dataproduct.slug}/${dataset.id}`}
/>
})
}
</>
</ExpansionCard.Content>
</ExpansionCard>
</div>
</>
)
})}
</>
)
}
46 changes: 43 additions & 3 deletions components/dataproducts/dataset/annotateDatasetTable.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as React from 'react'
import { Select, Table } from '@navikt/ds-react'
import { Select, Table, Checkbox, Popover, Alert } from '@navikt/ds-react'
import LoaderSpinner from '../../lib/spinner'
import { ApolloError } from '@apollo/client'
import {
Expand All @@ -8,23 +8,58 @@ import {
PIITagOptions,
PIITagType,
} from './useColumnTags'
import {PersonopplysningerDetaljert} from "./helptext";
import { PersonopplysningerDetaljert } from "./helptext";
import { useRef, useState } from 'react'

interface PseudoCheckProps {
pseudoColumns: Map<string, boolean>
selectPseudoColumn?: (columnName: string, on: boolean) => void
name: string
}

const PseudoCheck = ({ pseudoColumns, name, selectPseudoColumn }: PseudoCheckProps) => {
const elRef = useRef<HTMLInputElement>(null);
const [showAtLeastOne, setShowAtLeastOne] = useState(false)
return <>
<Checkbox checked={pseudoColumns.get(name)} ref={elRef} onChange={evt => {
if (!Array.from(pseudoColumns).filter((e) => e[0] != name && e[1]).length && !evt.target.checked) {
setShowAtLeastOne(true)
return
}
setShowAtLeastOne(false)
selectPseudoColumn?.(name, evt.target.checked)
}}>{""}</Checkbox> <Popover
open={showAtLeastOne}
placement="right"
onClose={() => setShowAtLeastOne(false)}
anchorEl={elRef.current}
>
<Popover.Content>Må ha minst en pseudokolonne</Popover.Content>
</Popover></>
}


interface AnnotateDatasetTableProps {
loading: boolean
error: ApolloError | undefined
columns: ColumnType[] | undefined
tags: Map<string, PIITagType> | undefined
pseudoColumns: Map<string, boolean>
annotateColumn: (columnName: string, tag: PIITagType) => void
selectPseudoColumn?: (columnName: string, on: boolean) => void
}


const AnnotateDatasetTable = ({
loading,
error,
columns,
tags,
pseudoColumns,
selectPseudoColumn,
annotateColumn,
}: AnnotateDatasetTableProps) => {

if (loading) {
return <LoaderSpinner />
}
Expand All @@ -36,6 +71,7 @@ const AnnotateDatasetTable = ({

if (!columns) return <div>Ingen skjemainformasjon</div>

const selectedAllColumns = Array.from(pseudoColumns).filter(e=> e[1]).length === columns.length
return (
<div className="mb-3 w-[91vw] overflow-auto">
<p className="flex gap-2 items-center mb-2">Klassifiser personopplysningene <PersonopplysningerDetaljert /></p>
Expand All @@ -47,10 +83,12 @@ const AnnotateDatasetTable = ({
<Table.HeaderCell>Type</Table.HeaderCell>
<Table.HeaderCell>Description</Table.HeaderCell>
<Table.HeaderCell>Personopplysning</Table.HeaderCell>
{selectPseudoColumn && <Table.HeaderCell>Pseudonymisèr</Table.HeaderCell>}

</Table.Row>
</Table.Header>
<Table.Body>
{columns?.map((row) => (
{columns?.map((row, index) => (
<Table.Row key={row.name}>
<Table.DataCell>{row.name}</Table.DataCell>
<Table.DataCell>{row.mode}</Table.DataCell>
Expand All @@ -77,10 +115,12 @@ const AnnotateDatasetTable = ({
))}
</Select>
</Table.DataCell>
{selectPseudoColumn && <Table.DataCell><PseudoCheck pseudoColumns={pseudoColumns} name={row.name} selectPseudoColumn={selectPseudoColumn}></PseudoCheck></Table.DataCell>}
</Table.Row>
))}
</Table.Body>
</Table>
{selectedAllColumns && <Alert className="w-[60rem]" variant='error'>Skal ikke pseudonymisere alle kolonner</Alert>}
</div>
)
}
Expand Down
1 change: 0 additions & 1 deletion components/dataproducts/dataset/datasetOwnerMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ const DatasetOwnerMenu = ({
const [updateDataset] = useUpdateDatasetMutation()

const onMove = async (dataproductID: string)=>{
console.log(dataset)
await updateDataset({
variables: {
id: dataset?.id,
Expand Down
6 changes: 5 additions & 1 deletion components/dataproducts/dataset/datasetTableSchema.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { DatasetQuery } from '../../../lib/schema/graphql'
import * as React from 'react'
import { Heading, Table } from '@navikt/ds-react'
import { Alert, Heading, Table, Tag } from '@navikt/ds-react'
import { PIITagNames } from './useColumnTags'
import {PersonopplysningerDetaljert} from "./helptext";
import TagPill from '../../lib/tagPill';

interface DatasetTableSchemaProps {
datasource: DatasetQuery['dataset']['datasource']
Expand All @@ -21,6 +22,7 @@ const DatasetTableSchema = ({
<Heading spacing level="3" size="small">
Skjema
</Heading>
{datasource.pseudoColumns?.length && <Alert variant="info">Det er et pseudoynimisert view</Alert>}
<div className="mb-3 w-[91vw] overflow-auto">
<Table className="w-fit 2xl:w-[60rem]" size="small">
<Table.Header>
Expand All @@ -30,6 +32,7 @@ const DatasetTableSchema = ({
<Table.HeaderCell>Type</Table.HeaderCell>
<Table.HeaderCell>Description</Table.HeaderCell>
{showPii && <Table.HeaderCell><span className="flex gap-2 items-center">Personopplysning <PersonopplysningerDetaljert /></span></Table.HeaderCell>}
<Table.HeaderCell></Table.HeaderCell>
</Table.Row>
</Table.Header>
<Table.Body>
Expand All @@ -46,6 +49,7 @@ const DatasetTableSchema = ({
)}
</Table.DataCell>
)}
<Table.DataCell>{datasource.pseudoColumns?.some(it=> it == row.name) && <Tag variant="warning">SHA256 hashed</Tag>}</Table.DataCell>
</Table.Row>
))}
</Table.Body>
Expand Down
Loading

0 comments on commit a04db20

Please sign in to comment.