From 39222a9ab3921c7f1d7dba982e912360b679f746 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 13:27:51 +0000 Subject: [PATCH 01/12] Bump zod from 3.22.2 to 3.22.3 in /ui Bumps [zod](https://github.com/colinhacks/zod) from 3.22.2 to 3.22.3. - [Release notes](https://github.com/colinhacks/zod/releases) - [Changelog](https://github.com/colinhacks/zod/blob/master/CHANGELOG.md) - [Commits](https://github.com/colinhacks/zod/compare/v3.22.2...v3.22.3) --- updated-dependencies: - dependency-name: zod dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- ui/package-lock.json | 8 ++++---- ui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index b0eb344..08aa968 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -29,7 +29,7 @@ "react-dom": "18.2.0", "react-error-boundary": "^3.1.4", "react-hook-form": "^7.40.0", - "zod": "^3.20.2" + "zod": "^3.22.3" }, "devDependencies": { "@babel/core": "^7.20.5", @@ -26050,9 +26050,9 @@ } }, "node_modules/zod": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.2.tgz", - "integrity": "sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==", + "version": "3.22.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", + "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/ui/package.json b/ui/package.json index ca9d24e..25e3342 100644 --- a/ui/package.json +++ b/ui/package.json @@ -34,7 +34,7 @@ "react-dom": "18.2.0", "react-error-boundary": "^3.1.4", "react-hook-form": "^7.40.0", - "zod": "^3.20.2" + "zod": "^3.22.3" }, "devDependencies": { "@babel/core": "^7.20.5", From e737a2768956f9906ac90b580320e652050dd895 Mon Sep 17 00:00:00 2001 From: Guy Hannay Date: Thu, 26 Oct 2023 13:38:42 +0100 Subject: [PATCH 02/12] add: buttons --- .../PermissionsTable/PermissionsTable.tsx | 59 ++++++++++--------- ui/src/components/Select/Select.tsx | 6 +- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/ui/src/components/PermissionsTable/PermissionsTable.tsx b/ui/src/components/PermissionsTable/PermissionsTable.tsx index 524b410..51d59ef 100644 --- a/ui/src/components/PermissionsTable/PermissionsTable.tsx +++ b/ui/src/components/PermissionsTable/PermissionsTable.tsx @@ -1,4 +1,5 @@ import { Select } from '@/components' +import { Button } from '@/components' import { zodResolver } from '@hookform/resolvers/zod' import { Typography } from '@mui/material' import { Controller, useForm, FieldValues } from 'react-hook-form' @@ -149,7 +150,7 @@ const PermissionsTable = ({ > remove(index)}> - + @@ -171,33 +172,33 @@ const PermissionsTable = ({ {!permissionsAtMax && ( - { - const result = trigger(undefined, { shouldFocus: true }) - if (result) { - const permissionToAdd = watch() - // Triggers an error if the domain is not set for protected sensitivity - if ( - isDataPermission(permissionToAdd) && - permissionToAdd.sensitivity === 'PROTECTED' && - permissionToAdd.domain === undefined - ) { - setError('domain', { type: 'custom', message: 'Required' }) - } else { - append(permissionToAdd) - reset({ - type: undefined, - layer: undefined, - sensitivity: undefined, - domain: undefined - }) + <> + + - + {generateOptions(Object.keys(filteredPermissionsListData))} )} @@ -313,7 +314,7 @@ const PermissionsTable = ({ generateOptions( Object.keys( filteredPermissionsListData[watch('type')][watch('layer')][ - watch('sensitivity') + watch('sensitivity') ] ) )} diff --git a/ui/src/components/Select/Select.tsx b/ui/src/components/Select/Select.tsx index 5ff0d3d..8ecb566 100644 --- a/ui/src/components/Select/Select.tsx +++ b/ui/src/components/Select/Select.tsx @@ -10,7 +10,7 @@ import SelectCheckbox from './SelectCheckbox' import FormControl from '../FormControl/FormControl' import { Props } from './types' -const StyledBasicSelect = styled(BasicSelect)>` +const StyledBasicSelect = styled(BasicSelect) >` .MuiInputBase-input { padding: 4px 15px 0px 15px; height: 100%; @@ -35,13 +35,13 @@ const Select: FC = forwardRef( data, ref } - + data return ( {checkboxes ? ( - + ) : ( {data.map((item) => ( From 9641646f2f1575584f723866e0b6f2599155d43f Mon Sep 17 00:00:00 2001 From: Guy Hannay Date: Thu, 26 Oct 2023 15:06:57 +0100 Subject: [PATCH 03/12] add: disabled buttons when not fulfilled --- .../PermissionsTable/PermissionsTable.tsx | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/ui/src/components/PermissionsTable/PermissionsTable.tsx b/ui/src/components/PermissionsTable/PermissionsTable.tsx index 51d59ef..ee79e55 100644 --- a/ui/src/components/PermissionsTable/PermissionsTable.tsx +++ b/ui/src/components/PermissionsTable/PermissionsTable.tsx @@ -119,6 +119,7 @@ const PermissionsTable = ({ } else { setPermissionsAtMax(false) } + // console.log(filteredPermissionsListData) }, [filteredPermissionsListData]) const generateOptions = (items) => @@ -130,6 +131,31 @@ const PermissionsTable = ({ ) }) + const [isDisabled, setIsDisabled] = useState(false) + useEffect(() => { + const permissionToAdd = watch() + + if (permissionToAdd.sensitivity !== "PROTECTED") { + delete permissionToAdd.domain + } + let allValuesDefined = true + for (const key in permissionToAdd) { + if (permissionToAdd[key] === undefined) { + allValuesDefined = false; + break; // No need to continue checking once one undefined value is found + } + } + console.log(permissionToAdd) + + if (allValuesDefined || permissionToAdd.type === "DATA_ADMIN" || permissionToAdd.type === "USER_ADMIN") { + setIsDisabled(false) + } else { + setIsDisabled(true) + } + }) + + + return ( @@ -149,9 +175,7 @@ const PermissionsTable = ({ sx={{ '&:last-child td, &:last-child th': { border: 0 } }} > - remove(index)}> - - + {item.type} @@ -175,6 +199,7 @@ const PermissionsTable = ({ <> + {item.type} diff --git a/ui/src/components/Select/Select.tsx b/ui/src/components/Select/Select.tsx index 8ecb566..5cf432f 100644 --- a/ui/src/components/Select/Select.tsx +++ b/ui/src/components/Select/Select.tsx @@ -35,13 +35,13 @@ const Select: FC = forwardRef( data, ref } - data + return ( {checkboxes ? ( - + ) : ( {data.map((item) => ( From 3595f5a75656e4f5836e3d4fbbaab69aef0f8296 Mon Sep 17 00:00:00 2001 From: Toby Drane Date: Thu, 9 Nov 2023 17:45:07 +0000 Subject: [PATCH 05/12] ui testing --- .../components/schema_create.test.tsx | 66 +++++++++++++++++++ ui/src/components/SchemaCreate.tsx | 29 ++++++++ 2 files changed, 95 insertions(+) create mode 100644 ui/src/__tests__/components/schema_create.test.tsx diff --git a/ui/src/__tests__/components/schema_create.test.tsx b/ui/src/__tests__/components/schema_create.test.tsx new file mode 100644 index 0000000..7f32bd2 --- /dev/null +++ b/ui/src/__tests__/components/schema_create.test.tsx @@ -0,0 +1,66 @@ +import { screen } from '@testing-library/react' +import { CreateSchema } from '@/components' +import { GenerateSchemaResponse } from '@/service/types' +import { renderWithProviders } from '@/utils/testing' +import fetchMock from 'jest-fetch-mock' + +const mockSchemaData: GenerateSchemaResponse = { + metadata: { + domain: 'domain', + dataset: 'dataset', + sensitivity: 'PRIVATE', + layer: 'default', + description: 'Some base description...', + owners: [ + { + name: 'Tiny Tim', + email: 'tiny_tim@email.com' + } + ], + key_only_tags: [], + key_value_tags: {}, + update_behaviour: 'APPEND' + }, + columns: [ + { + name: 'col1', + partition_index: null, + data_type: 'int', + allow_null: true, + format: null + } + ] +} + +const mockLayersData = ['default'] + +describe('Component: SchemaCreate', () => { + afterEach(() => { + fetchMock.resetMocks() + jest.clearAllMocks() + }) + + it('renders', async () => { + renderWithProviders( + + ) + + // Expect the initial UI to be populated with the schema data + expect(screen.getByTestId('sensitivity')).toHaveValue('PRIVATE') + expect(screen.getByTestId('layer')).toHaveValue('default') + expect(screen.getByTestId('domain')).toHaveValue('domain') + expect(screen.getByTestId('dataset')).toHaveValue('dataset') + expect(screen.getByTestId('description')).toHaveValue('Some base description...') + }) + + it('renders the need to change date format', async () => { + mockSchemaData.columns[0].data_type = 'date' + renderWithProviders( + + ) + + // eslint-disable-next-line jest-dom/prefer-in-document + expect(screen.getAllByTestId('date-format')).toHaveLength(1) + expect(screen.getAllByTestId('date-format')[0]).toBeRequired() + }) +}) diff --git a/ui/src/components/SchemaCreate.tsx b/ui/src/components/SchemaCreate.tsx index 79bfe1f..e6a2459 100644 --- a/ui/src/components/SchemaCreate.tsx +++ b/ui/src/components/SchemaCreate.tsx @@ -98,6 +98,11 @@ function CreateSchema({ ) } + // Used to conditionally show the format field if we have a date data type in the table + const doesTypesContainData = newSchemaData.columns.some( + (cols) => cols.data_type === 'date' + ) + return (
{ @@ -133,6 +138,7 @@ function CreateSchema({ error={!!error} helperText={error?.message} onChange={(e) => field.onChange(e.target.value)} + inputProps={{ 'data-testid': 'sensitivity' }} /> )} @@ -153,6 +159,7 @@ function CreateSchema({ error={!!error} helperText={error?.message} onChange={(e) => field.onChange(e.target.value)} + inputProps={{ 'data-testid': 'layer' }} /> )} @@ -175,6 +182,7 @@ function CreateSchema({ error={!!error} helperText={error?.message} onChange={(e) => field.onChange(e.target.value)} + inputProps={{ 'data-testid': 'domain' }} /> )} @@ -197,6 +205,7 @@ function CreateSchema({ error={!!error} helperText={error?.message} onChange={(e) => field.onChange(e.target.value)} + inputProps={{ 'data-testid': 'dataset' }} /> )} @@ -222,6 +231,7 @@ function CreateSchema({ helperText={error?.message} placeholder="Enter a human readable descriptive to describe the dataset..." onChange={(e) => field.onChange(e.target.value)} + inputProps={{ 'data-testid': 'description' }} /> )} @@ -259,6 +269,24 @@ function CreateSchema({
) }, + { + children: + item.data_type === 'date' ? ( + + setNewSchemaDataColumn(item.name, 'format', e.target.value) + } + /> + ) : ( + '' + ) + }, { children: ( @@ -299,6 +327,7 @@ function CreateSchema({ headers={[ { children: 'Name' }, { children: 'Data Type' }, + { children: doesTypesContainData ? 'Data Format' : '' }, { children: 'Allows Null' }, { children: 'Partition Index (Optional)' } ]} From ee46ffa280dee3269bae97d02edaecbc285f7a9d Mon Sep 17 00:00:00 2001 From: Toby Drane Date: Wed, 15 Nov 2023 11:39:21 +0000 Subject: [PATCH 06/12] tweak api to default a date format and fix sdk to send data to parquet --- .pre-commit-config.yaml | 2 +- .../services/schema_infer_service.py | 6 ++- api/requirements.txt | 1 + .../services/test_schema_infer_service.py | 41 +++++++++++++++++++ sdk/rapid/rapid.py | 4 +- sdk/requirements.txt | 1 + sdk/setup.py | 2 +- sdk/tests/test_rapid.py | 23 ++++++----- 8 files changed, 64 insertions(+), 16 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c42e1b7..b908c38 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,7 @@ repos: rev: 1.7.5 hooks: - id: bandit - exclude: '(tests|docs)/.*' + exclude: '(tests|docs|test)/.*' - repo: https://github.com/psf/black rev: 22.6.0 hooks: diff --git a/api/api/application/services/schema_infer_service.py b/api/api/application/services/schema_infer_service.py index 9ebdc69..3e45084 100644 --- a/api/api/application/services/schema_infer_service.py +++ b/api/api/application/services/schema_infer_service.py @@ -13,10 +13,12 @@ ) from api.common.value_transformers import clean_column_name -from api.domain.data_types import extract_athena_types +from api.domain.data_types import extract_athena_types, is_date_type from api.domain.schema import Schema, Column from api.domain.schema_metadata import Owner, SchemaMetadata +DEFAULT_DATE_FORMAT = "%Y-%m-%d" + class SchemaInferService: def infer_schema( @@ -67,7 +69,7 @@ def _infer_columns(self, dataframe: pd.DataFrame) -> List[Column]: partition_index=None, data_type=_type, allow_null=True, - format=None, + format=DEFAULT_DATE_FORMAT if is_date_type(_type) else None, ) for name, _type in extract_athena_types(dataframe).items() ] diff --git a/api/requirements.txt b/api/requirements.txt index 95c1fe0..440de54 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -7,6 +7,7 @@ httpx jinja2 pandas psutil +pyarrow pyjwt pydantic[email] python-multipart diff --git a/api/test/api/application/services/test_schema_infer_service.py b/api/test/api/application/services/test_schema_infer_service.py index c130de3..7c40fba 100644 --- a/api/test/api/application/services/test_schema_infer_service.py +++ b/api/test/api/application/services/test_schema_infer_service.py @@ -3,6 +3,9 @@ from pathlib import Path from unittest.mock import patch +import pandas as pd +import pyarrow as pa +import pyarrow.parquet as pq import pytest from api.application.services.schema_infer_service import SchemaInferService @@ -67,6 +70,44 @@ def test_infer_schema(self): assert actual_schema == expected_schema os.remove(temp_out_path) + def test_infer_schema_with_date(self): + expected_schema = Schema( + metadata=SchemaMetadata( + layer="raw", + domain="mydomain", + dataset="mydataset", + sensitivity="PUBLIC", + owners=[Owner(name="change_me", email="change_me@email.com")], + ), + columns=[ + Column( + name="colname1", + partition_index=None, + data_type="string", + allow_null=True, + format=None, + ), + Column( + name="colname2", + partition_index=None, + data_type="date", + allow_null=True, + format="%Y-%m-%d", + ), + ], + ).dict(exclude={"metadata": {"version"}}) + df = pd.DataFrame(data={"colname1": ["something"], "colname2": ["2021-01-01"]}) + df["colname2"] = pd.to_datetime(df["colname2"]) + temp_out_path = tempfile.mkstemp(suffix=".parquet")[1] + path = Path(temp_out_path) + pq.write_table(pa.Table.from_pandas(df), path) + + actual_schema = self.infer_schema_service.infer_schema( + "raw", "mydomain", "mydataset", "PUBLIC", path + ) + assert actual_schema == expected_schema + os.remove(temp_out_path) + @patch("api.application.services.schema_infer_service.construct_chunked_dataframe") def test_raises_error_when_parsing_provided_file_fails( self, mock_construct_chunked_dataframe diff --git a/sdk/rapid/rapid.py b/sdk/rapid/rapid.py index c24d48a..77c8e06 100644 --- a/sdk/rapid/rapid.py +++ b/sdk/rapid/rapid.py @@ -245,8 +245,8 @@ def convert_dataframe_for_file_upload(self, df: DataFrame): """ return { "file": ( - f"rapid-sdk-{int(datetime.now().timestamp())}.csv", - df.to_csv(index=False), + f"rapid-sdk-{int(datetime.now().timestamp())}.parquet", + df.to_parquet(index=False), ) } diff --git a/sdk/requirements.txt b/sdk/requirements.txt index c086b21..98354f7 100644 --- a/sdk/requirements.txt +++ b/sdk/requirements.txt @@ -7,3 +7,4 @@ requests requests-mock twine pydantic +pyarrow diff --git a/sdk/setup.py b/sdk/setup.py index 2d3f388..43bb1b4 100644 --- a/sdk/setup.py +++ b/sdk/setup.py @@ -9,6 +9,6 @@ author_email="lcard@no10.gov.uk", license="MIT", packages=find_packages(include=["rapid", "rapid.*"], exclude=["tests"]), - install_requires=["pandas", "requests", "deepdiff"], + install_requires=["pandas", "requests", "deepdiff", "pyarrow", "pydantic"], include_package_data=True, ) diff --git a/sdk/tests/test_rapid.py b/sdk/tests/test_rapid.py index dd4c716..bd3a267 100644 --- a/sdk/tests/test_rapid.py +++ b/sdk/tests/test_rapid.py @@ -1,6 +1,7 @@ from mock import Mock, call -from pandas import DataFrame import pytest +import io +import pandas as pd from requests_mock import Mocker from rapid import Rapid @@ -154,7 +155,7 @@ def test_upload_dataframe_success_after_waiting( domain = "test_domain" dataset = "test_dataset" job_id = 1234 - df = DataFrame() + df = pd.DataFrame() requests_mock.post( f"{RAPID_URL}/datasets/{layer}/{domain}/{dataset}", json={"details": {"job_id": job_id}}, @@ -176,7 +177,7 @@ def test_upload_dataframe_success_no_waiting( domain = "test_domain" dataset = "test_dataset" job_id = 1234 - df = DataFrame() + df = pd.DataFrame() requests_mock.post( f"{RAPID_URL}/datasets/{layer}/{domain}/{dataset}", json={"details": {"job_id": job_id}}, @@ -194,7 +195,7 @@ def test_upload_dataframe_failure(self, requests_mock: Mocker, rapid: Rapid): domain = "test_domain" dataset = "test_dataset" job_id = 1234 - df = DataFrame() + df = pd.DataFrame() requests_mock.post( f"{RAPID_URL}/datasets/{layer}/{domain}/{dataset}", json={"details": {"job_id": job_id}}, @@ -238,12 +239,14 @@ def test_fetch_dataset_info_failure(self, requests_mock: Mocker, rapid: Rapid): @pytest.mark.usefixtures("rapid") def test_convert_dataframe_for_file_upload(self, rapid: Rapid): - df = DataFrame() + df = pd.DataFrame() res = rapid.convert_dataframe_for_file_upload(df) filename = res["file"][0] - data = res["file"][1] - assert filename.startswith("rapid-sdk") and filename.endswith(".csv") - assert data == "\n" + data = io.BytesIO(res["file"][1]) + df = pd.read_parquet(data) + + assert filename.startswith("rapid-sdk") and filename.endswith(".parquet") + assert len(df) == 0 @pytest.mark.usefixtures("requests_mock", "rapid") def test_generate_schema_success(self, requests_mock: Mocker, rapid: Rapid): @@ -251,7 +254,7 @@ def test_generate_schema_success(self, requests_mock: Mocker, rapid: Rapid): domain = "test_domain" dataset = "test_dataset" sensitivity = "PUBLIC" - df = DataFrame() + df = pd.DataFrame() mocked_response = { "metadata": { "layer": "raw", @@ -299,7 +302,7 @@ def test_generate_schema_failure(self, requests_mock: Mocker, rapid: Rapid): domain = "test_domain" dataset = "test_dataset" sensitivity = "PUBLIC" - df = DataFrame() + df = pd.DataFrame() mocked_response = {"data": "dummy"} requests_mock.post( f"{RAPID_URL}/schema/{layer}/{sensitivity}/{domain}/{dataset}/generate", From 31f9574cb449cdd4ca77e64ad712723252692aae Mon Sep 17 00:00:00 2001 From: Toby Drane Date: Wed, 15 Nov 2023 12:37:25 +0000 Subject: [PATCH 07/12] fix tests --- ui/src/__tests__/subject/create.test.tsx | 6 +-- .../PermissionsTable/PermissionsTable.tsx | 38 ++++++++----------- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/ui/src/__tests__/subject/create.test.tsx b/ui/src/__tests__/subject/create.test.tsx index cce85e4..ae6e0b2 100644 --- a/ui/src/__tests__/subject/create.test.tsx +++ b/ui/src/__tests__/subject/create.test.tsx @@ -62,7 +62,7 @@ describe('Page: Subject Create', () => { userEvent.selectOptions(screen.getByTestId('select-type'), 'WRITE') userEvent.selectOptions(screen.getByTestId('select-layer'), 'ALL') userEvent.selectOptions(screen.getByTestId('select-sensitivity'), 'ALL') - await userEvent.click(screen.getByTestId('AddIcon')) + await userEvent.click(screen.getByTestId('add-permission')) await userEvent.click(screen.getByTestId('submit')) fetchMock.mockResponseOnce(JSON.stringify(mockData), { status: 200 }) @@ -108,7 +108,7 @@ describe('Page: Subject Create', () => { userEvent.selectOptions(screen.getByTestId('select-type'), 'WRITE') userEvent.selectOptions(screen.getByTestId('select-layer'), 'ALL') userEvent.selectOptions(screen.getByTestId('select-sensitivity'), 'ALL') - await userEvent.click(screen.getByTestId('AddIcon')) + await userEvent.click(screen.getByTestId('add-permission')) await new Promise((r) => setTimeout(r, 2000)) await userEvent.click(screen.getByTestId('submit')) fetchMock.mockResponseOnce(JSON.stringify(mockData), { status: 200 }) @@ -147,7 +147,7 @@ describe('Page: Subject Create', () => { userEvent.selectOptions(screen.getByTestId('select-type'), 'WRITE') userEvent.selectOptions(screen.getByTestId('select-layer'), 'ALL') userEvent.selectOptions(screen.getByTestId('select-sensitivity'), 'ALL') - await userEvent.click(screen.getByTestId('AddIcon')) + await userEvent.click(screen.getByTestId('add-permission')) await userEvent.click(screen.getByTestId('submit')) fetchMock.mockReject(new Error(error)) diff --git a/ui/src/components/PermissionsTable/PermissionsTable.tsx b/ui/src/components/PermissionsTable/PermissionsTable.tsx index d4b83f2..36808c2 100644 --- a/ui/src/components/PermissionsTable/PermissionsTable.tsx +++ b/ui/src/components/PermissionsTable/PermissionsTable.tsx @@ -9,9 +9,6 @@ import { isDataPermission } from '@/service/permissions' import { PermissionUiResponse } from '@/service/types' import { useEffect, useState } from 'react' import { cloneDeep } from 'lodash' -import IconButton from '@mui/material/IconButton' -import AddIcon from '@mui/icons-material/Add' -import RemoveIcon from '@mui/icons-material/Remove' import Table from '@mui/material/Table' import TableBody from '@mui/material/TableBody' import TableCell from '@mui/material/TableCell' @@ -136,25 +133,17 @@ const PermissionsTable = ({ const permissionToAdd = watch() // If the permission is not protected, remove the domain key - if (permissionToAdd.sensitivity !== "PROTECTED") { + if (permissionToAdd.sensitivity !== 'PROTECTED') { delete permissionToAdd.domain } - let allValuesDefined = true - for (const key in permissionToAdd) { - if (permissionToAdd[key] === undefined) { - allValuesDefined = false; - break; - } - } - - if (allValuesDefined || permissionToAdd.type === "DATA_ADMIN" || permissionToAdd.type === "USER_ADMIN") { - setIsDisabled(false) - } else { - setIsDisabled(true) - } - }) + const allValuesDefined = Object.values(permissionToAdd).every( + (value) => value !== undefined + ) + const isAdminPermission = ['DATA_ADMIN', 'USER_ADMIN'].includes(permissionToAdd.type) + setIsDisabled(!(allValuesDefined || isAdminPermission)) + }) return ( @@ -175,7 +164,9 @@ const PermissionsTable = ({ sx={{ '&:last-child td, &:last-child th': { border: 0 } }} > - + {item.type} @@ -200,6 +191,7 @@ const PermissionsTable = ({ + > + Add + @@ -245,7 +239,7 @@ const PermissionsTable = ({ setValue('type', event.target.value as ActionType) }} > - + {generateOptions(Object.keys(filteredPermissionsListData))} )} @@ -339,7 +333,7 @@ const PermissionsTable = ({ generateOptions( Object.keys( filteredPermissionsListData[watch('type')][watch('layer')][ - watch('sensitivity') + watch('sensitivity') ] ) )} From ed735039956549aba158cdc1a6d822ef42d92921 Mon Sep 17 00:00:00 2001 From: Toby Drane Date: Wed, 15 Nov 2023 13:16:40 +0000 Subject: [PATCH 08/12] nump nextjs and remove the deprecated @next/font --- ui/package-lock.json | 314 +++++++++++++++---------------------------- ui/package.json | 3 +- 2 files changed, 113 insertions(+), 204 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index 519cc25..943c969 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -23,7 +23,7 @@ "eslint": "8.29.0", "eslint-config-next": "13.0.6", "jest-cli": "^29.6.4", - "next": "13.0.6", + "next": "13.5.4", "playwright": "^1.37.1", "react": "18.2.0", "react-dom": "18.2.0", @@ -4157,9 +4157,9 @@ } }, "node_modules/@next/env": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.0.6.tgz", - "integrity": "sha512-yceT6DCHKqPRS1cAm8DHvDvK74DLIkDQdm5iV+GnIts8h0QbdHvkUIkdOvQoOODgpr6018skbmSQp12z5OWIQQ==" + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.4.tgz", + "integrity": "sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ==" }, "node_modules/@next/eslint-plugin-next": { "version": "13.0.6", @@ -4193,40 +4193,10 @@ "resolved": "https://registry.npmjs.org/@next/font/-/font-13.4.19.tgz", "integrity": "sha512-yOuSRYfqksWcaG/sATr1/DEGvvI8gnmAAnQCCZ0+L9p4Pio3/DMu71J56YHh9Hz84LDN4tMVzuux0ssCuM50sA==" }, - "node_modules/@next/swc-android-arm-eabi": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.6.tgz", - "integrity": "sha512-FGFSj3v2Bluw8fD/X+1eXIEB0PhoJE0zfutsAauRhmNpjjZshLDgoXMWm1jTRL/04K/o9gwwO2+A8+sPVCH1uw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-android-arm64": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.6.tgz", - "integrity": "sha512-7MgbtU7kimxuovVsd7jSJWMkIHBDBUsNLmmlkrBRHTvgzx5nDBXogP0hzZm7EImdOPwVMPpUHRQMBP9mbsiJYQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.6.tgz", - "integrity": "sha512-AUVEpVTxbP/fxdFsjVI9d5a0CFn6NVV7A/RXOb0Y+pXKIIZ1V5rFjPwpYfIfyOo2lrqgehMNQcyMRoTrhq04xg==", + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz", + "integrity": "sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==", "cpu": [ "arm64" ], @@ -4239,9 +4209,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.6.tgz", - "integrity": "sha512-SasCDJlshglsPnbzhWaIF6VEGkQy2NECcAOxPwaPr0cwbbt4aUlZ7QmskNzgolr5eAjFS/xTr7CEeKJtZpAAtQ==", + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz", + "integrity": "sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==", "cpu": [ "x64" ], @@ -4253,40 +4223,10 @@ "node": ">= 10" } }, - "node_modules/@next/swc-freebsd-x64": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.6.tgz", - "integrity": "sha512-6Lbxd9gAdXneTkwHyYW/qtX1Tdw7ND9UbiGsGz/SP43ZInNWnW6q0au4hEVPZ9bOWWRKzcVoeTBdoMpQk9Hx9w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm-gnueabihf": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.6.tgz", - "integrity": "sha512-wNdi5A519e1P+ozEuYOhWPzzE6m1y7mkO6NFwn6watUwO0X9nZs7fT9THmnekvmFQpaZ6U+xf2MQ9poQoCh6jQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.6.tgz", - "integrity": "sha512-e8KTRnleQY1KLk5PwGV5hrmvKksCc74QRpHl5ffWnEEAtL2FE0ave5aIkXqErsPdXkiKuA/owp3LjQrP+/AH7Q==", + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz", + "integrity": "sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==", "cpu": [ "arm64" ], @@ -4299,9 +4239,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.6.tgz", - "integrity": "sha512-/7RF03C3mhjYpHN+pqOolgME3guiHU5T3TsejuyteqyEyzdEyLHod+jcYH6ft7UZ71a6TdOewvmbLOtzHW2O8A==", + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz", + "integrity": "sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==", "cpu": [ "arm64" ], @@ -4314,9 +4254,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.6.tgz", - "integrity": "sha512-kxyEXnYHpOEkFnmrlwB1QlzJtjC6sAJytKcceIyFUHbCaD3W/Qb5tnclcnHKTaFccizZRePXvV25Ok/eUSpKTw==", + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz", + "integrity": "sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==", "cpu": [ "x64" ], @@ -4329,9 +4269,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.6.tgz", - "integrity": "sha512-N0c6gubS3WW1oYYgo02xzZnNatfVQP/CiJq2ax+DJ55ePV62IACbRCU99TZNXXg+Kos6vNW4k+/qgvkvpGDeyA==", + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.4.tgz", + "integrity": "sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==", "cpu": [ "x64" ], @@ -4344,9 +4284,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.6.tgz", - "integrity": "sha512-QjeMB2EBqBFPb/ac0CYr7GytbhUkrG4EwFWbcE0vsRp4H8grt25kYpFQckL4Jak3SUrp7vKfDwZ/SwO7QdO8vw==", + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz", + "integrity": "sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==", "cpu": [ "arm64" ], @@ -4359,9 +4299,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.6.tgz", - "integrity": "sha512-EQzXtdqRTcmhT/tCq81rIwE36Y3fNHPInaCuJzM/kftdXfa0F+64y7FAoMO13npX8EG1+SamXgp/emSusKrCXg==", + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz", + "integrity": "sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==", "cpu": [ "ia32" ], @@ -4374,9 +4314,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.6.tgz", - "integrity": "sha512-pSkqZ//UP/f2sS9T7IvHLfEWDPTX0vRyXJnAUNisKvO3eF3e1xdhDX7dix/X3Z3lnN4UjSwOzclAI87JFbOwmQ==", + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz", + "integrity": "sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==", "cpu": [ "x64" ], @@ -10102,9 +10042,9 @@ } }, "node_modules/@swc/helpers": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", - "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", "dependencies": { "tslib": "^2.4.0" } @@ -12857,6 +12797,17 @@ "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", "dev": true }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -13664,40 +13615,6 @@ "node": ">=10" } }, - "node_modules/css-loader/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/css-loader/node_modules/postcss": { - "version": "8.4.29", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", - "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/css-loader/node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -16567,8 +16484,7 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/global": { "version": "4.4.0", @@ -20655,49 +20571,43 @@ "dev": true }, "node_modules/next": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/next/-/next-13.0.6.tgz", - "integrity": "sha512-COvigvms2LRt1rrzfBQcMQ2GZd86Mvk1z+LOLY5pniFtL4VrTmhZ9salrbKfSiXbhsD01TrDdD68ec3ABDyscA==", + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/next/-/next-13.5.4.tgz", + "integrity": "sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==", "dependencies": { - "@next/env": "13.0.6", - "@swc/helpers": "0.4.14", + "@next/env": "13.5.4", + "@swc/helpers": "0.5.2", + "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.0" + "postcss": "8.4.31", + "styled-jsx": "5.1.1", + "watchpack": "2.4.0" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=14.6.0" + "node": ">=16.14.0" }, "optionalDependencies": { - "@next/swc-android-arm-eabi": "13.0.6", - "@next/swc-android-arm64": "13.0.6", - "@next/swc-darwin-arm64": "13.0.6", - "@next/swc-darwin-x64": "13.0.6", - "@next/swc-freebsd-x64": "13.0.6", - "@next/swc-linux-arm-gnueabihf": "13.0.6", - "@next/swc-linux-arm64-gnu": "13.0.6", - "@next/swc-linux-arm64-musl": "13.0.6", - "@next/swc-linux-x64-gnu": "13.0.6", - "@next/swc-linux-x64-musl": "13.0.6", - "@next/swc-win32-arm64-msvc": "13.0.6", - "@next/swc-win32-ia32-msvc": "13.0.6", - "@next/swc-win32-x64-msvc": "13.0.6" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^6.0.0 || ^7.0.0", + "@next/swc-darwin-arm64": "13.5.4", + "@next/swc-darwin-x64": "13.5.4", + "@next/swc-linux-arm64-gnu": "13.5.4", + "@next/swc-linux-arm64-musl": "13.5.4", + "@next/swc-linux-x64-gnu": "13.5.4", + "@next/swc-linux-x64-musl": "13.5.4", + "@next/swc-win32-arm64-msvc": "13.5.4", + "@next/swc-win32-ia32-msvc": "13.5.4", + "@next/swc-win32-x64-msvc": "13.5.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" }, "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { + "@opentelemetry/api": { "optional": true }, "sass": { @@ -20705,34 +20615,6 @@ } } }, - "node_modules/next/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -21571,6 +21453,11 @@ "node": ">=0.12" } }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -21660,6 +21547,33 @@ "node": ">=0.10.0" } }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", @@ -23775,6 +23689,14 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -24009,9 +23931,9 @@ } }, "node_modules/styled-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.0.tgz", - "integrity": "sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", "dependencies": { "client-only": "0.0.1" }, @@ -24105,12 +24027,6 @@ "node": ">= 10" } }, - "node_modules/svgo/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -24965,11 +24881,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-browserslist-db/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -25195,7 +25106,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" diff --git a/ui/package.json b/ui/package.json index b705d71..34de483 100644 --- a/ui/package.json +++ b/ui/package.json @@ -21,14 +21,13 @@ "@mui/icons-material": "^5.11.0", "@mui/lab": "^5.0.0-alpha.112", "@mui/material": "^5.10.17", - "@next/font": "^13.0.6", "@tanstack/react-query": "^4.19.1", "@types/react-dom": "18.0.9", "dedent": "^1.5.1", "eslint": "8.29.0", "eslint-config-next": "13.0.6", "jest-cli": "^29.6.4", - "next": "13.0.6", + "next": "13.5.4", "playwright": "^1.37.1", "react": "18.2.0", "react-dom": "18.2.0", From 04c8d1e421c73756e494ed94c05243bcbf39c941 Mon Sep 17 00:00:00 2001 From: Toby Drane Date: Wed, 15 Nov 2023 15:17:30 +0000 Subject: [PATCH 09/12] fix swagger docco ui --- api/api/entry.py | 4 ++-- ui/src/components/Select/Select.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/api/entry.py b/api/api/entry.py index bbc9d4f..92095dc 100644 --- a/api/api/entry.py +++ b/api/api/entry.py @@ -230,9 +230,9 @@ def _set_security_headers(response) -> None: "default-src 'self' " f"{IDENTITY_PROVIDER_BASE_URL}; " "script-src 'self' 'unsafe-inline' " - "cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js; " + "cdn.jsdelivr.net/npm/swagger-ui-dist@5.9.0/swagger-ui-bundle.js; " "style-src 'self' " - "cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css; " + "cdn.jsdelivr.net/npm/swagger-ui-dist@5.9.0/swagger-ui.css; " "img-src 'self' data: " "fastapi.tiangolo.com/img/favicon.png;" ) diff --git a/ui/src/components/Select/Select.tsx b/ui/src/components/Select/Select.tsx index 5cf432f..5ff0d3d 100644 --- a/ui/src/components/Select/Select.tsx +++ b/ui/src/components/Select/Select.tsx @@ -10,7 +10,7 @@ import SelectCheckbox from './SelectCheckbox' import FormControl from '../FormControl/FormControl' import { Props } from './types' -const StyledBasicSelect = styled(BasicSelect) >` +const StyledBasicSelect = styled(BasicSelect)>` .MuiInputBase-input { padding: 4px 15px 0px 15px; height: 100%; From d079456a15217372d4c337154174867f9c8660f4 Mon Sep 17 00:00:00 2001 From: Toby Drane Date: Wed, 15 Nov 2023 16:00:15 +0000 Subject: [PATCH 10/12] enable data bucket with eventbridge --- infrastructure/blocks/pipeline/iam.tf | 1 + infrastructure/blocks/s3/main.tf | 5 +++++ infrastructure/modules/rapid/main.tf | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/infrastructure/blocks/pipeline/iam.tf b/infrastructure/blocks/pipeline/iam.tf index 44bb152..fb9ed51 100644 --- a/infrastructure/blocks/pipeline/iam.tf +++ b/infrastructure/blocks/pipeline/iam.tf @@ -55,6 +55,7 @@ resource "aws_iam_policy" "pipeline_ecr_access" { resource "aws_iam_policy" "pipeline_ecr_public_access" { # checkov:skip=CKV_AWS_355: GetAuthorizationToken has no resource constraint + # checkov:skip=CKV_AWS_287: GetServiceBearerToken has no resource constraint name = "pipeline_ecr_public_access" description = "Allow pipeline to access the public ECR" tags = var.tags diff --git a/infrastructure/blocks/s3/main.tf b/infrastructure/blocks/s3/main.tf index 8dac7fd..d1c976f 100644 --- a/infrastructure/blocks/s3/main.tf +++ b/infrastructure/blocks/s3/main.tf @@ -40,6 +40,11 @@ resource "aws_s3_bucket_public_access_block" "rapid_data_storage" { } +resource "aws_s3_bucket_notification" "rapid_data_storage" { + bucket = aws_s3_bucket.rapid_data_storage.id + eventbridge = true +} + resource "aws_s3_bucket" "logs" { #checkov:skip=CKV_AWS_144:No need for cross region replication #checkov:skip=CKV_AWS_145:No need for non default key diff --git a/infrastructure/modules/rapid/main.tf b/infrastructure/modules/rapid/main.tf index 85066bd..1a57b1e 100644 --- a/infrastructure/modules/rapid/main.tf +++ b/infrastructure/modules/rapid/main.tf @@ -96,6 +96,11 @@ resource "aws_s3_bucket" "this" { } } +resource "aws_s3_bucket_notification" "this" { + bucket = aws_s3_bucket.this.id + eventbridge = true +} + resource "aws_s3_bucket_public_access_block" "this" { bucket = aws_s3_bucket.this.id ignore_public_acls = true From 4d91f9d28dcf807ec6a60df5e6926cd21f759b14 Mon Sep 17 00:00:00 2001 From: Toby Drane Date: Wed, 15 Nov 2023 16:28:38 +0000 Subject: [PATCH 11/12] docco changes --- docs/api/schema.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/api/schema.md b/docs/api/schema.md index d26ae77..dd9843c 100644 --- a/docs/api/schema.md +++ b/docs/api/schema.md @@ -109,6 +109,8 @@ the day (%d) is optional and a separator ('/' or '-') must be in place. Accepted - %Y-%m -> 2021-01 - %m-%Y -> 01-2021 +> When using the generate schema endpoint, rAPId will automatically detect a valid date column and specify a default date format of `%Y-%m-%d`, this can be changed before a schema upload if required. + ### Booleans In order to handle nullables we have introduced [pandas' boolean nullable data type](https://pandas.pydata.org/pandas-docs/stable/user_guide/boolean.html), From f11298831b98ac41c29f0b8f1c9db8bf3c18c7a3 Mon Sep 17 00:00:00 2001 From: Toby Drane Date: Wed, 15 Nov 2023 17:25:57 +0000 Subject: [PATCH 12/12] prepare for release --- docs/changelog.md | 20 +++++++++++++++++++- infrastructure/modules/rapid/variables.tf | 4 ++-- mkdocs.yml | 1 + sdk/setup.py | 2 +- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 457c946..a0cc5ad 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,22 @@ # Changelog +## v7.0.8 / v0.1.6 (sdk) - _2023-11-15_ + +### Fixes + +- Issue with date types when editing a schema on the UI because of no option to apply format column and therefore getting an _all fields are required_ error. +- Tweaked UI design when adding permissions to subject. +- SDK not uploading a Pandas Dataframe with a date field set correctly. +- Updated NextJS and Zod package version. + +### Features + +- Data bucket now has EventBridge notifications enabled by default. + +### Closes relevant GitHub issues + +- https://github.com/no10ds/rapid/issues/57 + ## v7.0.7 / v0.1.5 (sdk) - _2023-11-07_ ### Fixes @@ -85,7 +102,8 @@ - See the [migration doc](migration.md) for details on how to migrate to v7 from v6. -[Unreleased changes]: https://github.com/no10ds/rapid/compare/v7.0.7...HEAD +[Unreleased changes]: https://github.com/no10ds/rapid/compare/v7.0.8...HEAD +[v7.0.8 / v0.1.6 (sdk)]: https://github.com/no10ds/rapid/v7.0.7...v7.0.8 [v7.0.7 / v0.1.5 (sdk)]: https://github.com/no10ds/rapid/v7.0.6...v7.0.7 [v7.0.6 / v0.1.4 (sdk)]: https://github.com/no10ds/rapid/v7.0.5...v7.0.6 [v7.0.5 / v0.1.3 (sdk)]: https://github.com/no10ds/rapid/v7.0.4...v7.0.5 diff --git a/infrastructure/modules/rapid/variables.tf b/infrastructure/modules/rapid/variables.tf index c982dae..ea04014 100644 --- a/infrastructure/modules/rapid/variables.tf +++ b/infrastructure/modules/rapid/variables.tf @@ -13,13 +13,13 @@ variable "app-replica-count-max" { variable "application_version" { type = string description = "The version number for the application image (e.g.: v1.0.4, v1.0.x-latest, etc.)" - default = "v7.0.7" + default = "v7.0.8" } variable "ui_version" { type = string description = "The version number for the static ui (e.g.: v1.0.0, etc.)" - default = "v7.0.7" + default = "v7.0.8" } variable "catalog_disabled" { diff --git a/mkdocs.yml b/mkdocs.yml index 2d6a790..435222f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -64,5 +64,6 @@ plugins: markdown_extensions: - pymdownx.highlight - pymdownx.extra + - pymdownx.magiclink - pymdownx.tabbed: alternate_style: true diff --git a/sdk/setup.py b/sdk/setup.py index 43bb1b4..a695eb5 100644 --- a/sdk/setup.py +++ b/sdk/setup.py @@ -2,7 +2,7 @@ setup( name="rapid-sdk", - version="0.1.5", + version="0.1.6", description="A python sdk for the rAPId API", url="https://github.com/no10ds/rapid-sdk", author="Lewis Card",