From 80f0040faeb0b8a9cc6e239fff7cb985461d010f Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Thu, 3 Nov 2022 17:52:00 +0100 Subject: [PATCH] feat: datetime attribute --- src/lib/elements/forms/inputDateTime.svelte | 5 +- .../attributes/boolean.svelte | 13 ++-- .../attributes/createAttribute.svelte | 7 +- .../attributes/datetime.svelte | 69 +++++++++++++++++++ .../attributes/email.svelte | 11 +-- .../attributes/enum.svelte | 6 +- .../attributes/float.svelte | 10 +-- .../attributes/integer.svelte | 10 +-- .../attributes/ip.svelte | 8 +-- .../attributes/store.ts | 8 ++- .../attributes/string.svelte | 9 +-- .../attributes/url.svelte | 8 +-- .../document-[document]/+layout.ts | 29 ++++++-- .../document-[document]/attribute.svelte | 7 +- .../attributes/_datetime.svelte | 11 +++ .../document-[document]/document.svelte | 2 +- 16 files changed, 161 insertions(+), 52 deletions(-) create mode 100644 src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/datetime.svelte create mode 100644 src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/_datetime.svelte diff --git a/src/lib/elements/forms/inputDateTime.svelte b/src/lib/elements/forms/inputDateTime.svelte index 3869f498b..b15eac42d 100644 --- a/src/lib/elements/forms/inputDateTime.svelte +++ b/src/lib/elements/forms/inputDateTime.svelte @@ -21,7 +21,7 @@ } }); - const handleInvalid = (event: Event) => { + function handleInvalid(event: Event) { event.preventDefault(); if (element.validity.valueMissing) { @@ -30,7 +30,7 @@ } error = element.validationMessage; - }; + } $: if (value) { error = null; @@ -45,6 +45,7 @@ {disabled} {readonly} {required} + step=".001" autocomplete={autocomplete ? 'on' : 'off'} type="datetime-local" class="input-text" diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/boolean.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/boolean.svelte index edc4e9473..c913f4c06 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/boolean.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/boolean.svelte @@ -16,7 +16,7 @@ const dispatch = createEventDispatcher(); - let xdefault: boolean, + let xdefault: boolean | null, required = false, array = false; @@ -28,7 +28,7 @@ $collection.$id, key, required, - xdefault ? xdefault : undefined, + xdefault ?? undefined, array ); dispatch('created', attribute); @@ -49,7 +49,7 @@ xdefault = selectedAttribute.default; } - $: if (required) { + $: if (required || array) { xdefault = null; } @@ -61,12 +61,13 @@ label="Default value" placeholder="Select a value" options={[ + { label: 'Select a value', value: null }, { label: 'True', value: true }, { label: 'False', value: false } ]} bind:value={xdefault} - disabled={overview} /> - + disabled={overview || array || required} /> + Indicate whether this is a required attribute - + Indicate whether this attribute should act as an array diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/createAttribute.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/createAttribute.svelte index c0e261897..5c6145c7c 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/createAttribute.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/createAttribute.svelte @@ -4,7 +4,6 @@ import { Button, InputText, FormList, InputSelect } from '$lib/elements/forms'; import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; - import { addNotification } from '$lib/stores/notifications'; export let showCreate = false; @@ -15,10 +14,6 @@ const created = async () => { invalidate(Dependencies.COLLECTION); showCreate = false; - addNotification({ - type: 'success', - message: `Attribute has been created` - }); }; $: if (selectedOption) { @@ -72,6 +67,6 @@ - + diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/datetime.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/datetime.svelte new file mode 100644 index 000000000..50698fefd --- /dev/null +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/datetime.svelte @@ -0,0 +1,69 @@ + + + + + Indicate whether this is a required attribute + + Indicate whether this attribute should act as an array diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/email.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/email.svelte index 1db971cfc..4c3392997 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/email.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/email.svelte @@ -1,11 +1,12 @@ - - + Indicate whether this is a required attribute - + Indicate whether this attribute should act as an array diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/enum.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/enum.svelte index 3a33b38d8..47624e2ce 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/enum.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/enum.svelte @@ -58,7 +58,7 @@ ({ required, array, elements } = selectedAttribute); xdefault = selectedAttribute.default; } - $: if (required) { + $: if (required || array) { xdefault = null; } @@ -75,7 +75,7 @@ bind:options bind:value={xdefault} disabled={overview || required} /> - + Indicate whether this is a required attribute - + Indicate whether this attribute should act as an array diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/float.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/float.svelte index 389dec445..b9a37d60d 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/float.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/float.svelte @@ -56,7 +56,7 @@ xdefault = selectedAttribute.default; } - $: if (required) { + $: if (required || array) { xdefault = null; } @@ -67,11 +67,13 @@ - + Indicate whether this is a required attribute - + Indicate whether this attribute should act as an array diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/integer.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/integer.svelte index 41429ac93..14c52af02 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/integer.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/integer.svelte @@ -55,7 +55,7 @@ ({ required, array, min, max } = selectedAttribute); xdefault = selectedAttribute.default; } - $: if (required) { + $: if (required || array) { xdefault = null; } @@ -66,10 +66,12 @@ - + Indicate whether this is a required attribute - + Indicate whether this attribute should act as an array diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/ip.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/ip.svelte index f40f1d8fa..ed7250ab9 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/ip.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/ip.svelte @@ -51,7 +51,7 @@ ({ required, array } = selectedAttribute); xdefault = selectedAttribute.default; } - $: if (required) { + $: if (required || array) { xdefault = null; } @@ -60,9 +60,9 @@ id="default" label="Default value" bind:value={xdefault} - disabled={required} + disabled={required || array} readonly={overview} /> - + Indicate whether this is a required attribute - + Indicate whether this attribute should act as an array diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/store.ts b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/store.ts index ca2b439e5..5f3e1da7c 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/store.ts +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/store.ts @@ -8,11 +8,12 @@ import Integer from './integer.svelte'; import Ip from './ip.svelte'; import String from './string.svelte'; import Url from './url.svelte'; +import Datetime from './datetime.svelte'; export type Option = { name: string; component: typeof SvelteComponent; - type: 'string' | 'integer' | 'double' | 'boolean'; + type: 'string' | 'integer' | 'double' | 'boolean' | 'datetime'; format?: 'email' | 'ip' | 'url' | 'enum'; }; @@ -37,6 +38,11 @@ export const options: Option[] = [ component: Boolean, type: 'boolean' }, + { + name: 'Datetime', + component: Datetime, + type: 'datetime' + }, { name: 'Email', component: Email, diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/string.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/string.svelte index b69dc22b9..27764415c 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/string.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/string.svelte @@ -53,7 +53,7 @@ ({ required, array, size } = selectedAttribute); xdefault = selectedAttribute.default; } - $: if (required) { + $: if (required || array) { xdefault = null; } @@ -63,9 +63,10 @@ id="default" label="Default value" bind:value={xdefault} - disabled={required} + maxlength={size} + disabled={required || array} readonly={overview} /> - + Indicate whether this is a required attribute - + Indicate whether this attribute should act as an array diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/url.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/url.svelte index 23e57028b..f30452f55 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/url.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/url.svelte @@ -51,7 +51,7 @@ ({ required, array } = selectedAttribute); xdefault = selectedAttribute.default; } - $: if (required) { + $: if (required || array) { xdefault = null; } @@ -60,9 +60,9 @@ id="default" label="Default value" bind:value={xdefault} - disabled={required} + disabled={required || array} readonly={overview} /> - + Indicate whether this is a required attribute - + Indicate whether this attribute should act as an array diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/+layout.ts b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/+layout.ts index c7761a8d2..2aaef7461 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/+layout.ts +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/+layout.ts @@ -4,20 +4,37 @@ import type { LayoutLoad } from './$types'; import Breadcrumbs from './breadcrumbs.svelte'; import Header from './header.svelte'; import { error } from '@sveltejs/kit'; +import type { Attributes } from '../store'; export const load: LayoutLoad = async ({ params, parent, depends }) => { - await parent(); depends(Dependencies.DOCUMENT); + const { collection } = await parent(); + const document = await sdkForProject.databases.getDocument( + params.database, + params.collection, + params.document + ); + /** + * Sanitize DateTime to remove UTC Timezone section. + */ + collection.attributes.forEach((attribute) => { + const { type, key, array } = attribute as unknown as Attributes; + if (type === 'datetime') { + if (array) { + document[key] = document[key].map((n: string) => { + return new Date(n).toISOString().slice(0, 23); + }); + } else { + document[key] = new Date(document[key]).toISOString().slice(0, 23); + } + } + }); try { return { header: Header, breadcrumbs: Breadcrumbs, - document: await sdkForProject.databases.getDocument( - params.database, - params.collection, - params.document - ) + document }; } catch (e) { throw error(e.code, e.message); diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attribute.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attribute.svelte index a21f61c07..afb09fa9a 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attribute.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attribute.svelte @@ -1,6 +1,7 @@ {#if attribute.type in attributesTypeMap} - {#if 'format' in attribute} + {#if 'format' in attribute && attribute.format} + import { InputDateTime } from '$lib/elements/forms'; + import type { Models } from '@aw-labs/appwrite-console'; + + export let id: string; + export let label: string; + export let value: string; + export let attribute: Models.AttributeDatetime; + + + diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/document.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/document.svelte index 3f93af8f3..8468405ea 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/document.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/document.svelte @@ -8,10 +8,10 @@ import { sdkForProject } from '$lib/stores/sdk'; import { addNotification } from '$lib/stores/notifications'; import { writable } from 'svelte/store'; - import Attribute from './attribute.svelte'; import type { Models } from '@aw-labs/appwrite-console'; import { Dependencies } from '$lib/constants'; import { invalidate } from '$app/navigation'; + import Attribute from './attribute.svelte'; let disableUpdate = true; let currentDoc: string;