diff --git a/src/lib/elements/forms/inputNumber.svelte b/src/lib/elements/forms/inputNumber.svelte index 2abf5228a2..fd648803d3 100644 --- a/src/lib/elements/forms/inputNumber.svelte +++ b/src/lib/elements/forms/inputNumber.svelte @@ -27,7 +27,19 @@ const parsed = Number(raw); if (Number.isFinite(parsed)) { - value = parsed; + if (step === 1) { + if (!Number.isInteger(parsed)) { + const lowerInt = Math.floor(parsed); + const upperInt = Math.ceil(parsed); + error = `Value must be an integer. Please enter a value between ${lowerInt} and ${upperInt}.`; + return; + } + value = parsed; + error = null; + } else { + value = parsed; + error = null; + } } } @@ -52,7 +64,15 @@ error = event.currentTarget.validationMessage; }; - $: if (value !== null && value !== undefined && !Number.isNaN(value)) { + $: if ( + step === 1 && + value !== null && + value !== undefined && + !Number.isNaN(value) && + Number.isInteger(value) + ) { + error = null; + } else if (step !== 1 && value !== null && value !== undefined && !Number.isNaN(value)) { error = null; } diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/attributes/integer.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/attributes/integer.svelte index faa220fa05..bb4bcda4ea 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/attributes/integer.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/attributes/integer.svelte @@ -9,6 +9,13 @@ key: string, data: Partial ) { + const min = data.min !== null && data.min !== undefined ? Math.round(data.min) : undefined; + const max = data.max !== null && data.max !== undefined ? Math.round(data.max) : undefined; + const defaultValue = + data.default !== null && data.default !== undefined + ? Math.round(data.default) + : undefined; + await sdk .forProject(page.params.region, page.params.project) .databases.createIntegerAttribute( @@ -16,9 +23,9 @@ collectionId, key, data.required, - data.min, - data.max, - data.default, + min, + max, + defaultValue, data.array ); } @@ -29,6 +36,13 @@ data: Partial, originalKey?: string ) { + const min = data.min !== null && data.min !== undefined ? Math.round(data.min) : data.min; + const max = data.max !== null && data.max !== undefined ? Math.round(data.max) : data.max; + const defaultValue = + data.default !== null && data.default !== undefined + ? Math.round(data.default) + : data.default; + await sdk .forProject(page.params.region, page.params.project) .databases.updateIntegerAttribute( @@ -36,9 +50,9 @@ collectionId, originalKey, data.required, - data.default, - Math.abs(data.min) > Number.MAX_SAFE_INTEGER ? undefined : data.min, - Math.abs(data.max) > Number.MAX_SAFE_INTEGER ? undefined : data.max, + defaultValue, + Math.abs(min) > Number.MAX_SAFE_INTEGER ? undefined : min, + Math.abs(max) > Number.MAX_SAFE_INTEGER ? undefined : max, data.key !== originalKey ? data.key : undefined ); } @@ -90,12 +104,14 @@ label="Min" placeholder="Enter size" bind:value={data.min} + step={1} required={editing} /> ; + for (const attr of $createDocument.attributes) { + if (attr.type === 'integer') { + const key = attr.key as keyof typeof processedDocument; + const val = processedDocument[key] as unknown; + if (attr.array && Array.isArray(val)) { + processedDocument[key] = (val as unknown[]).map((v) => { + if (typeof v === 'number' && Number.isFinite(v)) + return Math.round(v as number); + if ( + typeof v === 'string' && + v.trim() !== '' && + Number.isFinite(Number(v)) + ) + return Math.round(Number(v)); + return v; + }); + } else if (typeof val === 'number' && Number.isFinite(val)) { + processedDocument[key] = Math.round(val as number); + } else if ( + typeof val === 'string' && + val.trim() !== '' && + Number.isFinite(Number(val)) + ) { + processedDocument[key] = Math.round(Number(val)); + } + } + } + const { $id } = await sdk .forProject(page.params.region, page.params.project) .databases.createDocument( page.params.database, page.params.collection, $createDocument.id ?? ID.unique(), - $createDocument.document, + processedDocument, $createDocument.permissions ); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/document.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/document.svelte index fd3865bf8d..9754058e1b 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/document.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/document.svelte @@ -52,13 +52,41 @@ async function updateData() { try { + const processedWork = { ...$work } as Record; + for (const attr of $collection.attributes) { + if (attr.type === 'integer') { + const key = attr.key as keyof typeof processedWork; + const val = processedWork[key] as unknown; + if (attr.array && Array.isArray(val)) { + processedWork[key] = (val as unknown[]).map((v) => { + if (typeof v === 'number' && Number.isFinite(v)) + return Math.round(v as number); + if ( + typeof v === 'string' && + v.trim() !== '' && + Number.isFinite(Number(v)) + ) + return Math.round(Number(v)); + return v; + }); + } else if (typeof val === 'number' && Number.isFinite(val)) { + processedWork[key] = Math.round(val as number); + } else if ( + typeof val === 'string' && + val.trim() !== '' && + Number.isFinite(Number(val)) + ) { + processedWork[key] = Math.round(Number(val)); + } + } + } await sdk .forProject(page.params.region, page.params.project) .databases.updateDocument( databaseId, collectionId, documentId, - $work, + processedWork, $work.$permissions ); await invalidate(Dependencies.DOCUMENT);