diff --git a/browser/data-browser/src/components/SideBar/DriveSwitcher.tsx b/browser/data-browser/src/components/SideBar/DriveSwitcher.tsx index c40459ce4..f7beb4bda 100644 --- a/browser/data-browser/src/components/SideBar/DriveSwitcher.tsx +++ b/browser/data-browser/src/components/SideBar/DriveSwitcher.tsx @@ -48,17 +48,19 @@ export function DriveSwitcher() { const items = useMemo( () => [ - ...Array.from(savedDrivesMap.entries()).map(([subject, resource]) => ({ - id: subject, - label: getTitle(resource), - helper: `Switch to ${getTitle(resource)}`, - disabled: subject === drive, - onClick: () => { - setDrive(subject); - navigate(constructOpenURL(subject)); - }, - icon: subject === drive ? : , - })), + ...Array.from(savedDrivesMap.entries()) + .filter(([_, resource]) => !resource.error) + .map(([subject, resource]) => ({ + id: subject, + label: getTitle(resource), + helper: `Switch to ${getTitle(resource)}`, + disabled: subject === drive, + onClick: () => { + setDrive(subject); + navigate(constructOpenURL(subject)); + }, + icon: subject === drive ? : , + })), DIVIDER, // Dedupe history from savedDrives bause not all savedDrives might be loaded yet. ...Array.from(dedupeAFromB(historyMap, savedDrivesMap)) diff --git a/browser/data-browser/src/components/forms/NewForm/CustomCreateActions/BasicInstanceHandlers.ts b/browser/data-browser/src/components/forms/NewForm/CustomCreateActions/BasicInstanceHandlers.ts index 3ef97a192..4eae6486b 100644 --- a/browser/data-browser/src/components/forms/NewForm/CustomCreateActions/BasicInstanceHandlers.ts +++ b/browser/data-browser/src/components/forms/NewForm/CustomCreateActions/BasicInstanceHandlers.ts @@ -12,7 +12,7 @@ export const registerBasicInstanceHandlers = () => { await createAndNavigate( dataBrowser.classes.folder, { - [core.properties.name]: 'untitled-folder', + [core.properties.name]: 'Untitled Folder', [dataBrowser.properties.displayStyle]: classes.displayStyles.list, }, parent, diff --git a/browser/data-browser/src/components/forms/NewForm/CustomCreateActions/CustomForms/NewDriveDialog.tsx b/browser/data-browser/src/components/forms/NewForm/CustomCreateActions/CustomForms/NewDriveDialog.tsx index 99b607fda..a67521be6 100644 --- a/browser/data-browser/src/components/forms/NewForm/CustomCreateActions/CustomForms/NewDriveDialog.tsx +++ b/browser/data-browser/src/components/forms/NewForm/CustomCreateActions/CustomForms/NewDriveDialog.tsx @@ -1,5 +1,5 @@ import { core, useStore, server, dataBrowser } from '@tomic/react'; -import { useState, useCallback, FormEvent, FC, useEffect } from 'react'; +import { useState, useCallback, FormEvent, FC, useEffect, useId } from 'react'; import { styled } from 'styled-components'; import { stringToSlug } from '../../../../../helpers/stringToSlug'; import { Button } from '../../../../Button'; @@ -20,6 +20,7 @@ export const NewDriveDialog: FC = ({ onClose, }) => { const store = useStore(); + const nameFieldId = useId(); const { setDrive } = useSettings(); const [name, setName] = useState(''); @@ -105,9 +106,10 @@ export const NewDriveDialog: FC = ({ hide(true); }} > - + void, dependants: unknown[]) { + const [deps, setDeps] = useState(dependants); + + if (deps.some((d, i) => d !== dependants[i])) { + setDeps(dependants); + callback(); + } +} diff --git a/browser/data-browser/src/views/DrivePage.tsx b/browser/data-browser/src/views/DrivePage.tsx index e1681e331..8c725b7b0 100644 --- a/browser/data-browser/src/views/DrivePage.tsx +++ b/browser/data-browser/src/views/DrivePage.tsx @@ -56,6 +56,7 @@ function DrivePage({ resource }: ResourcePageProps): JSX.Element {
Default Ontology - Unknown Resource + {getMessageForErrorType(resource.error)} ); @@ -58,7 +85,7 @@ export function ResourceInline({ function DefaultInline({ subject }: ResourceInlineInstanceProps): JSX.Element { const resource = useResource(subject); - const [description] = useString(resource, urls.properties.description); + const [description] = useString(resource, core.properties.description); return {resource.title}; } @@ -67,6 +94,6 @@ const classMap = new Map< string, (props: ResourceInlineInstanceProps) => JSX.Element >([ - [urls.classes.tag, TagInline], - [urls.classes.file, FileInline], + [dataBrowser.classes.tag, TagInline], + [server.classes.file, FileInline], ]); diff --git a/browser/data-browser/src/views/TablePage/TableCell.tsx b/browser/data-browser/src/views/TablePage/TableCell.tsx index c94f75fc6..03da41808 100644 --- a/browser/data-browser/src/views/TablePage/TableCell.tsx +++ b/browser/data-browser/src/views/TablePage/TableCell.tsx @@ -108,9 +108,12 @@ export function TableCell({ const handleEditNextRow = useCallback(() => { if (!savePending) { onEditNextRow?.(); - setTimeout(() => { + + // Only go to the next row if the resource has any properties set (It has two by default, isA and parent) + // This prevents triggering a rerender and losing focus on the input. + if (resource.getPropVals().size > 2) { setActiveCell(rowIndex + 1, columnIndex); - }, 0); + } } }, [savePending, setActiveCell, rowIndex, columnIndex]); diff --git a/browser/data-browser/src/views/TablePage/useTableInvalidation.ts b/browser/data-browser/src/views/TablePage/useTableInvalidation.ts index 3709eccca..457f3c634 100644 --- a/browser/data-browser/src/views/TablePage/useTableInvalidation.ts +++ b/browser/data-browser/src/views/TablePage/useTableInvalidation.ts @@ -4,13 +4,14 @@ import { CursorMode, useTableEditorContext, } from '../../components/TableEditor/TableEditorContext'; +import { useOnValueChange } from '../../helpers/useOnValueChange'; export function useTableInvalidation( resource: Resource, invalidateTable: () => void, ) { const store = useStore(); - const { cursorMode } = useTableEditorContext(); + const { cursorMode, selectedColumn, selectedRow } = useTableEditorContext(); const [markedForInvalidation, setMarkedForInvalidation] = useState(false); @@ -20,6 +21,12 @@ export function useTableInvalidation( } }, [invalidateTable, markedForInvalidation]); + useOnValueChange(() => { + if (markedForInvalidation) { + invalidateTable(); + } + }, [selectedRow, selectedColumn]); + useEffect(() => { if (markedForInvalidation && cursorMode !== CursorMode.Edit) { invalidateTable(); diff --git a/browser/e2e/package.json b/browser/e2e/package.json index 79f01d83f..3662b83c2 100644 --- a/browser/e2e/package.json +++ b/browser/e2e/package.json @@ -12,7 +12,7 @@ "url": "https://github.com/atomicdata-dev/atomic-server/" }, "devDependencies": { - "@playwright/test": "^1.37.0" + "@playwright/test": "^1.43.1" }, "scripts": { "playwright-install": "playwright install chromium", diff --git a/browser/e2e/tests/tables.spec.ts b/browser/e2e/tests/tables.spec.ts index 0175f3d96..7481c9055 100644 --- a/browser/e2e/tests/tables.spec.ts +++ b/browser/e2e/tests/tables.spec.ts @@ -45,10 +45,11 @@ test.describe('tables', async () => { await page.keyboard.press('Enter'); await expect( page.locator( - `[aria-rowindex="${rowIndex}"] > [aria-colindex="${2}"] > input`, + `[aria-rowindex="${rowIndex}"] > [aria-colindex="2"] > input`, ), ).toBeFocused(); await page.keyboard.type(name); + await page.waitForTimeout(300); await tab(); // Flay newline await page.waitForTimeout(300); @@ -86,7 +87,7 @@ test.describe('tables', async () => { ).toBeVisible(); await expect( page.locator( - `[aria-rowindex="${rowIndex + 1}"] > [aria-colindex="${2}"] > input`, + `[aria-rowindex="${rowIndex + 1}"] > [aria-colindex="2"] > input`, ), "Next row's first cell isn't focused", ).toBeFocused(); diff --git a/browser/e2e/tests/test-utils.ts b/browser/e2e/tests/test-utils.ts index b9f75ff53..bd4ae357e 100644 --- a/browser/e2e/tests/test-utils.ts +++ b/browser/e2e/tests/test-utils.ts @@ -101,14 +101,20 @@ export async function signIn(page: Page) { */ export async function newDrive(page: Page) { // Create new drive to prevent polluting the main drive + const driveTitle = `testdrive-${timestamp()}`; await page.locator(sideBarDriveSwitcher).click(); await page.locator('button:has-text("New Drive")').click(); + await expect( + currentDialog(page).getByRole('heading', { name: 'New Drive' }), + ).toBeVisible(); + + await currentDialog(page).getByLabel('Name').fill(driveTitle); + + await currentDialog(page).getByRole('button', { name: 'Create' }).click(); expect(page.locator(`${currentDriveTitle} > localhost`)).not.toBeVisible(); await expect(page.locator('text="Create new resource"')).toBeVisible(); const driveURL = await getCurrentSubject(page); expect(driveURL).toContain('localhost'); - const driveTitle = `testdrive-${timestamp()}`; - await editTitle(driveTitle, page); return { driveURL: driveURL as string, driveTitle }; } diff --git a/browser/lib/src/error.ts b/browser/lib/src/error.ts index 9955661cf..a907b4421 100644 --- a/browser/lib/src/error.ts +++ b/browser/lib/src/error.ts @@ -20,6 +20,10 @@ export function isUnauthorized(error?: Error): boolean { return false; } +export function isAtomicError(error: Error): error is AtomicError { + return error instanceof AtomicError; +} + /** * Atomic Data Errors have an additional Type, which tells the client what kind * of error to render. diff --git a/browser/lib/src/resource.ts b/browser/lib/src/resource.ts index 53c13b286..400a6a33d 100644 --- a/browser/lib/src/resource.ts +++ b/browser/lib/src/resource.ts @@ -726,17 +726,6 @@ export class Resource { this._subject = subject; } - /** Returns true if the value has not changed */ - private equalsCurrentValue(prop: string, value: JSONValue) { - const ownValue = this.get(prop); - - if (value === Object(value)) { - return JSON.stringify(ownValue) === JSON.stringify(value); - } - - return ownValue === value; - } - private isParentNew() { const parentSubject = this.propvals.get(core.properties.parent) as string; diff --git a/browser/lib/src/store.ts b/browser/lib/src/store.ts index 686d8b93a..58108f567 100644 --- a/browser/lib/src/store.ts +++ b/browser/lib/src/store.ts @@ -26,6 +26,7 @@ import { buildSearchSubject, server, } from './index.js'; +import { stringToSlug } from './stringToSlug.js'; import { authenticate, fetchWebSocket, startWebsocket } from './websockets.js'; /** Function called when a resource is updated or removed */ @@ -288,7 +289,7 @@ export class Store { parts: string[], parent?: string, ): Promise { - const path = parts.join('/'); + const path = parts.map(part => stringToSlug(part)).join('/'); const parentUrl = parent ?? this.getServerUrl(); return this.findAvailableSubject(path, parentUrl); @@ -941,7 +942,7 @@ export class Store { parent: string, firstTry = true, ): Promise { - let url = `${parent}/${path}`; + let url = new URL(`${parent}/${path}`).toString(); if (!firstTry) { const randomPart = this.randomPart(); @@ -968,7 +969,6 @@ export class Store { return; } - // We clone for react, because otherwise it won't rerender Promise.allSettled(callbacks.map(async cb => cb(resource))); } } diff --git a/browser/lib/src/stringToSlug.ts b/browser/lib/src/stringToSlug.ts new file mode 100644 index 000000000..a6f8bf199 --- /dev/null +++ b/browser/lib/src/stringToSlug.ts @@ -0,0 +1,7 @@ +export function stringToSlug(str: string): string { + return str + .toLowerCase() + .replace(/\s+/g, '-') + .replace(/-+/g, '-') + .replace(/[^\w-]+/g, ''); +} diff --git a/browser/pnpm-lock.yaml b/browser/pnpm-lock.yaml index 7b85ed7fa..d640cc904 100644 --- a/browser/pnpm-lock.yaml +++ b/browser/pnpm-lock.yaml @@ -144,13 +144,13 @@ importers: version: 1.2.1 '@radix-ui/react-popover': specifier: ^1.0.6 - version: 1.0.6(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.6(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-scroll-area': specifier: ^1.0.1 - version: 1.0.4(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-tabs': specifier: ^1.0.4 - version: 1.0.4(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@tomic/react': specifier: workspace:* version: link:../react @@ -267,8 +267,8 @@ importers: e2e: devDependencies: '@playwright/test': - specifier: ^1.37.0 - version: 1.37.0 + specifier: ^1.43.1 + version: 1.43.1 lib: dependencies: @@ -438,7 +438,7 @@ packages: '@babel/traverse': 7.22.8 '@babel/types': 7.22.5 convert-source-map: 1.9.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@9.4.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -533,7 +533,7 @@ packages: '@babel/core': 7.22.9 '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4 + debug: 4.3.4(supports-color@9.4.0) lodash.debounce: 4.0.8 resolve: 1.22.3 transitivePeerDependencies: @@ -1634,7 +1634,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.22.7 '@babel/types': 7.22.5 - debug: 4.3.4 + debug: 4.3.4(supports-color@9.4.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -3670,15 +3670,12 @@ packages: engines: {node: '>=14'} dev: true - /@playwright/test@1.37.0: - resolution: {integrity: sha512-181WBLk4SRUyH1Q96VZl7BP6HcK0b7lbdeKisn3N/vnjitk+9HbdlFz/L5fey05vxaAhldIDnzo8KUoy8S3mmQ==} + /@playwright/test@1.43.1: + resolution: {integrity: sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==} engines: {node: '>=16'} hasBin: true dependencies: - '@types/node': 20.11.5 - playwright-core: 1.37.0 - optionalDependencies: - fsevents: 2.3.2 + playwright: 1.43.1 dev: true /@pnpm/config.env-replace@1.1.0: @@ -3757,7 +3754,7 @@ packages: '@babel/runtime': 7.22.6 dev: false - /@radix-ui/react-arrow@1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: '@types/react': '*' @@ -3771,13 +3768,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.6 - '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-collection@1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: '@types/react': '*' @@ -3793,9 +3791,10 @@ packages: '@babel/runtime': 7.22.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.34)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-slot': 1.0.2(@types/react@18.2.34)(react@18.2.0) '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -3842,7 +3841,7 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-dismissable-layer@1.0.4(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} peerDependencies: '@types/react': '*' @@ -3858,10 +3857,11 @@ packages: '@babel/runtime': 7.22.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.34)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.34)(react@18.2.0) '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -3880,7 +3880,7 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-focus-scope@1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} peerDependencies: '@types/react': '*' @@ -3895,9 +3895,10 @@ packages: dependencies: '@babel/runtime': 7.22.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.34)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -3917,7 +3918,7 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-popover@1.0.6(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popover@1.0.6(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA==} peerDependencies: '@types/react': '*' @@ -3934,24 +3935,25 @@ packages: '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.34)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.34)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.34)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-slot': 1.0.2(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.5(@types/react@18.2.34)(react@18.2.0) dev: false - /@radix-ui/react-popper@1.1.2(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} peerDependencies: '@types/react': '*' @@ -3966,21 +3968,22 @@ packages: dependencies: '@babel/runtime': 7.22.6 '@floating-ui/react-dom': 2.0.1(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.34)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/rect': 1.0.1 '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-portal@1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} peerDependencies: '@types/react': '*' @@ -3994,13 +3997,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.6 - '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-presence@1.0.1(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: '@types/react': '*' @@ -4017,11 +4021,12 @@ packages: '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-primitive@1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: '@types/react': '*' @@ -4037,11 +4042,12 @@ packages: '@babel/runtime': 7.22.6 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.34)(react@18.2.0) '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-roving-focus@1.0.4(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: '@types/react': '*' @@ -4056,20 +4062,21 @@ packages: dependencies: '@babel/runtime': 7.22.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.34)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-scroll-area@1.0.4(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-scroll-area@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-OIClwBkwPG+FKvC4OMTRaa/3cfD069nkKFFL/TQzRzaO42Ce5ivKU9VMKgT7UU6UIkjcQqKBrDOIzWtPGw6e6w==} peerDependencies: '@types/react': '*' @@ -4088,11 +4095,12 @@ packages: '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.34)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -4112,7 +4120,7 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-tabs@1.0.4(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} peerDependencies: '@types/react': '*' @@ -4130,11 +4138,12 @@ packages: '@radix-ui/react-context': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.34)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.34)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.34)(react@18.2.0) '@types/react': 18.2.34 + '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -5104,7 +5113,6 @@ packages: resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} dependencies: '@types/react': 18.2.34 - dev: true /@types/react-pdf@6.2.0: resolution: {integrity: sha512-OSCYmrfaJvpXkM5V4seUMAhUDOAOqbGQf9kwv14INyTf7AjDs2ukfkkQrLWRQ8OjWrDklbXYWh5l7pT7l0N76g==} @@ -5361,7 +5369,7 @@ packages: vite: ^4 || ^5 dependencies: '@swc/core': 1.3.104 - vite: 5.0.12 + vite: 5.0.12(@types/node@20.11.5) transitivePeerDependencies: - '@swc/helpers' dev: true @@ -6039,16 +6047,6 @@ packages: engines: {node: '>=4'} dev: true - /axios@1.6.2: - resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} - dependencies: - follow-redirects: 1.15.3 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: true - /axios@1.6.2(debug@4.3.4): resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} dependencies: @@ -7342,17 +7340,6 @@ packages: ms: 2.1.3 dev: false - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - /debug@4.3.4(supports-color@9.4.0): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -8850,16 +8837,6 @@ packages: from2: 2.3.0 dev: true - /follow-redirects@1.15.3: - resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: true - /follow-redirects@1.15.3(debug@4.3.4): resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} engines: {node: '>=4.0'} @@ -11091,7 +11068,7 @@ packages: cli-truncate: 2.1.0 commander: 6.2.1 cosmiconfig: 7.1.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@9.4.0) dedent: 0.7.0 enquirer: 2.4.1 execa: 4.1.0 @@ -11920,7 +11897,7 @@ packages: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: '@types/debug': 4.1.8 - debug: 4.3.4 + debug: 4.3.4(supports-color@9.4.0) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -13118,10 +13095,20 @@ packages: pathe: 1.1.1 dev: true - /playwright-core@1.37.0: - resolution: {integrity: sha512-1c46jhTH/myQw6sesrcuHVtLoSNfJv8Pfy9t3rs6subY7kARv0HRw5PpyfPYPpPtQvBOmgbE6K+qgYUpj81LAA==} + /playwright-core@1.43.1: + resolution: {integrity: sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==} + engines: {node: '>=16'} + hasBin: true + dev: true + + /playwright@1.43.1: + resolution: {integrity: sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==} engines: {node: '>=16'} hasBin: true + dependencies: + playwright-core: 1.43.1 + optionalDependencies: + fsevents: 2.3.2 dev: true /please-upgrade-node@3.2.0: @@ -16066,10 +16053,10 @@ packages: workbox-build: ^7.0.0 workbox-window: ^7.0.0 dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@9.4.0) fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.0.12 + vite: 5.0.12(@types/node@20.11.5) workbox-build: 7.0.0 workbox-window: 7.0.0 transitivePeerDependencies: @@ -16081,50 +16068,15 @@ packages: peerDependencies: vite: ^2 || ^3 || ^4 || ^5 dependencies: - axios: 1.6.2 + axios: 1.6.2(debug@4.3.4) clean-css: 5.3.3 flat-cache: 3.0.4 picocolors: 1.0.0 - vite: 5.0.12 + vite: 5.0.12(@types/node@20.11.5) transitivePeerDependencies: - debug dev: true - /vite@5.0.12: - resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.19.6 - postcss: 8.4.33 - rollup: 4.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /vite@5.0.12(@types/node@20.11.5): resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} engines: {node: ^18.0.0 || >=20.0.0}