diff --git a/.gitignore b/.gitignore index 46a9f3602..27cc4e27e 100644 --- a/.gitignore +++ b/.gitignore @@ -145,5 +145,4 @@ dist .stylelintcache # SvelteKit build / generate output -.svelte-kit - +.svelte-kit \ No newline at end of file diff --git a/src/lib/components/customId.svelte b/src/lib/components/customId.svelte index dafdb0661..173e984a7 100644 --- a/src/lib/components/customId.svelte +++ b/src/lib/components/customId.svelte @@ -2,13 +2,13 @@ import { trackEvent } from '$lib/actions/analytics'; import { InnerModal } from '$lib/components'; import { InputId } from '$lib/elements/forms'; - + import { InputProjectId } from '$lib/elements/forms'; export let show = false; export let name: string; export let id: string; export let autofocus = true; export let fullWidth = false; - + export let isProject = false; $: if (!show) { id = null; } @@ -29,7 +29,11 @@
- + {#if isProject} + + {:else} + + {/if}
diff --git a/src/lib/components/status.svelte b/src/lib/components/status.svelte index ca140ceb9..00ed3353e 100644 --- a/src/lib/components/status.svelte +++ b/src/lib/components/status.svelte @@ -18,5 +18,5 @@ {#if status} {/if} - + diff --git a/src/lib/elements/forms/index.ts b/src/lib/elements/forms/index.ts index 5e2bbd518..1f729ba4b 100644 --- a/src/lib/elements/forms/index.ts +++ b/src/lib/elements/forms/index.ts @@ -26,3 +26,4 @@ export { default as InputId } from './inputId.svelte'; export { default as InputSecret } from './inputSecret.svelte'; export { default as Helper } from './helper.svelte'; export { default as Label } from './label.svelte'; +export { default as InputProjectId } from './inputProjectId.svelte'; diff --git a/src/lib/elements/forms/inputCron.svelte b/src/lib/elements/forms/inputCron.svelte index 484b92756..48d71b7d5 100644 --- a/src/lib/elements/forms/inputCron.svelte +++ b/src/lib/elements/forms/inputCron.svelte @@ -18,7 +18,7 @@ let element: HTMLInputElement; let error: string; - const pattern = String.raw`^[^]+\s+[^]+\s+[^]+\s+[^]+\s+[^]+`; + const pattern = String.raw`^.*\s+.*\s+.*\s+.*\s+.*`; onMount(() => { if (element && autofocus) { diff --git a/src/lib/elements/forms/inputProjectId.svelte b/src/lib/elements/forms/inputProjectId.svelte new file mode 100644 index 000000000..80c35e8cb --- /dev/null +++ b/src/lib/elements/forms/inputProjectId.svelte @@ -0,0 +1,59 @@ + + + +
+ + +
+
+
+
diff --git a/src/lib/layout/header.svelte b/src/lib/layout/header.svelte index dbaff6206..54422dd82 100644 --- a/src/lib/layout/header.svelte +++ b/src/lib/layout/header.svelte @@ -133,9 +133,9 @@ updateVerificationEmail()}> diff --git a/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte b/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte index 7da08c27d..bbf1c1b6e 100644 --- a/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte +++ b/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte @@ -85,7 +85,7 @@ {@const accessedAt = $key.accessedAt ? toLocaleDate($key.accessedAt) : 'never'} -
+
{$key.name}
@@ -157,7 +157,7 @@
-
{$key.name}
+
{$key.name}

Last accessed: {accessedAt}

diff --git a/src/routes/console/project-[project]/settings/deleteProject.svelte b/src/routes/console/project-[project]/settings/deleteProject.svelte index c0476e764..065e9eed8 100644 --- a/src/routes/console/project-[project]/settings/deleteProject.svelte +++ b/src/routes/console/project-[project]/settings/deleteProject.svelte @@ -43,7 +43,7 @@ -
{$project.name}
+
{$project.name}

Last update: {toLocaleDateTime($project.$updatedAt)}

diff --git a/src/routes/console/project-[project]/settings/migrations/(import)/step1.svelte b/src/routes/console/project-[project]/settings/migrations/(import)/step1.svelte index f27ae8758..390b42db6 100644 --- a/src/routes/console/project-[project]/settings/migrations/(import)/step1.svelte +++ b/src/routes/console/project-[project]/settings/migrations/(import)/step1.svelte @@ -142,7 +142,7 @@ }))} />

- +

{/if} {:else if $provider.provider === 'supabase'} diff --git a/tests/unit/elements/inputProjectId.test.ts b/tests/unit/elements/inputProjectId.test.ts new file mode 100644 index 000000000..b2cfcacf7 --- /dev/null +++ b/tests/unit/elements/inputProjectId.test.ts @@ -0,0 +1,40 @@ +import '@testing-library/jest-dom'; +import { render } from '@testing-library/svelte'; +import userEvent from '@testing-library/user-event'; +import { InputProjectId } from '../../../src/lib/elements/forms'; + +const validStrings = ['validstring', 'valid-string', 'validstring123', 'valid-']; + +const invalidStrings = ['-invalid', 'Valid', '_invalid', 'Valid123', 'valid.string']; + +test('shows id input', () => { + const { getByPlaceholderText } = render(InputProjectId); + const input = getByPlaceholderText('Enter ID'); + + expect(input).toBeInTheDocument(); + expect(input).toHaveAttribute('type', 'text'); +}); + +test('state', async () => { + const { component, getByPlaceholderText } = render(InputProjectId, { value: '' }); + const input = getByPlaceholderText('Enter ID'); + + expect(component.value).toEqual(''); + await userEvent.type(input, 'lorem'); + expect(component.value).toEqual('lorem'); +}); + +validStrings.forEach((validString) => { + test(`validates ${validString} as valid`, () => { + const { getByPlaceholderText } = render(InputProjectId, { value: validString }); + const input = getByPlaceholderText('Enter ID') as HTMLInputElement; + expect(input.checkValidity()).toBe(true); + }); +}); +invalidStrings.forEach((invalidString) => { + test(`validates ${invalidString} as invalid`, () => { + const { getByPlaceholderText } = render(InputProjectId, { value: invalidString }); + const input = getByPlaceholderText('Enter ID') as HTMLInputElement; + expect(input.checkValidity()).toBe(false); + }); +});