From 86d958e7edd5c2437112980db102765ee3e37090 Mon Sep 17 00:00:00 2001 From: Faton Ramadani Date: Tue, 14 May 2024 22:15:16 +0200 Subject: [PATCH] feat(frontend): Add date format (#3675) * feat(frontend): Add date format * feat(frontend): Add date format * feat(frontend): add missing case * feat(frontend): add date format * fix(frontend): added missing tooltip + added default value to the date component --- frontend/src/lib/common.ts | 5 +- frontend/src/lib/components/ArgInput.svelte | 9 ++- frontend/src/lib/components/DateInput.svelte | 56 +++++++++++++++++++ frontend/src/lib/components/Label.svelte | 2 +- .../lib/components/LightweightArgInput.svelte | 7 ++- .../src/lib/components/SchemaModal.svelte | 6 +- .../lib/components/StringTypeNarrowing.svelte | 38 ++++++++++++- .../apps/editor/component/components.ts | 6 +- frontend/src/lib/inferArgSig.ts | 6 +- frontend/src/lib/utils.ts | 2 + 10 files changed, 126 insertions(+), 11 deletions(-) create mode 100644 frontend/src/lib/components/DateInput.svelte diff --git a/frontend/src/lib/common.ts b/frontend/src/lib/common.ts index 3e11745a99..fcdaa04524 100644 --- a/frontend/src/lib/common.ts +++ b/frontend/src/lib/common.ts @@ -39,6 +39,7 @@ export interface SchemaProperty { showExpr?: string password?: boolean order?: string[] + dateFormat?: string } export interface ModalSchemaProperty { @@ -61,6 +62,7 @@ export interface ModalSchemaProperty { customErrorMessage?: string showExpr?: string password?: boolean + dateFormat?: string } export function modalToSchema(schema: ModalSchemaProperty): SchemaProperty { @@ -82,7 +84,8 @@ export function modalToSchema(schema: ModalSchemaProperty): SchemaProperty { currencyLocale: schema.currencyLocale, multiselect: schema.multiselect, showExpr: schema.showExpr, - password: schema.password + password: schema.password, + dateFormat: schema.dateFormat } } export type Schema = { diff --git a/frontend/src/lib/components/ArgInput.svelte b/frontend/src/lib/components/ArgInput.svelte index d7be76dab6..35c4e62ff4 100644 --- a/frontend/src/lib/components/ArgInput.svelte +++ b/frontend/src/lib/components/ArgInput.svelte @@ -23,6 +23,7 @@ import ArgEnum from './ArgEnum.svelte' import ArrayTypeNarrowing from './ArrayTypeNarrowing.svelte' import DateTimeInput from './DateTimeInput.svelte' + import DateInput from './DateInput.svelte' import S3FilePicker from './S3FilePicker.svelte' import CurrencyInput from './apps/components/inputs/currency/CurrencyInput.svelte' import FileUpload from './common/fileUpload/FileUpload.svelte' @@ -290,6 +291,7 @@ bind:minRows={extra['minRows']} bind:disableCreate={extra['disableCreate']} bind:disableVariablePicker={extra['disableVariablePicker']} + bind:dateFormat={extra['dateFormat']} /> {:else if type == 'number' || type == 'integer'} {description} {/if} +
{#if inputCat == 'number'} {#if extra['min'] != undefined && extra['max'] != undefined} @@ -599,7 +602,11 @@ />
{:else if inputCat == 'date'} - + {#if format === 'date'} + + {:else} + + {/if} {:else if inputCat == 'sql' || inputCat == 'yaml'}
+ import { createEventDispatcher } from 'svelte' + import { format, isValid } from 'date-fns' + + export let value: string | undefined = undefined + export let autofocus: boolean | null = false + export let minDate: string | undefined = undefined + export let maxDate: string | undefined = undefined + export let dateFormat: string | undefined = 'dd-MM-yyyy' + + let date: string | undefined = undefined + + const dispatch = createEventDispatcher() + + function updateValue(newDate: string | undefined) { + if (newDate && isValid(new Date(newDate))) { + if (dateFormat === undefined) { + dateFormat = 'dd-MM-yyyy' + } + + try { + let dateFromValue: Date | undefined = newDate ? new Date(newDate) : undefined + + if (dateFromValue === undefined) { + return + } + + const parsedDate = format(dateFromValue, dateFormat) + value = parsedDate + + dispatch('change', value) + } catch (error) { + console.error('Failed to parse date:', error) + return + } + } + } + + let randomId = 'datetarget-' + Math.random().toString(36).substring(7) + + +
+ { + if (date) { + updateValue(date) + } + }} + /> +
diff --git a/frontend/src/lib/components/Label.svelte b/frontend/src/lib/components/Label.svelte index 00eee56a06..16436ead5f 100644 --- a/frontend/src/lib/components/Label.svelte +++ b/frontend/src/lib/components/Label.svelte @@ -2,7 +2,7 @@ export let label: string | undefined = undefined -
+
{label} diff --git a/frontend/src/lib/components/LightweightArgInput.svelte b/frontend/src/lib/components/LightweightArgInput.svelte index b3899861a1..e9a0e19e81 100644 --- a/frontend/src/lib/components/LightweightArgInput.svelte +++ b/frontend/src/lib/components/LightweightArgInput.svelte @@ -15,6 +15,7 @@ import LightweightResourcePicker from './LightweightResourcePicker.svelte' import LightweightObjectResourceInput from './LightweightObjectResourceInput.svelte' import DateTimeInput from './DateTimeInput.svelte' + import DateInput from './DateInput.svelte' import CurrencyInput from './apps/components/inputs/currency/CurrencyInput.svelte' import Multiselect from 'svelte-multiselect' import Password from './Password.svelte' @@ -395,7 +396,11 @@ {/each} {:else if inputCat == 'date'} - + {#if format === 'date'} + + {:else} + + {/if} {:else if inputCat == 'base64'}
{:else if property.selectedType == 'array'} diff --git a/frontend/src/lib/components/StringTypeNarrowing.svelte b/frontend/src/lib/components/StringTypeNarrowing.svelte index e1df15944b..1e0a0a5f30 100644 --- a/frontend/src/lib/components/StringTypeNarrowing.svelte +++ b/frontend/src/lib/components/StringTypeNarrowing.svelte @@ -1,9 +1,12 @@ {f} {/each} + + {#if format == 'date'} +
+ +
+ + +
+ {/if} {:else if kind == 'none'} {#if !noExtra}