From 4afc71c4bf41e17903d795adb25d3e2de662a627 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 8 Apr 2024 08:29:20 +0100 Subject: [PATCH] Break out core date parsing utils to share between packages --- .../Core/DatePicker/SpectrumDatePicker.svelte | 25 ++------------- packages/bbui/src/helpers.js | 31 +++++++++++++++++++ .../src/components/grid/cells/DateCell.svelte | 23 ++++---------- 3 files changed, 39 insertions(+), 40 deletions(-) diff --git a/packages/bbui/src/Form/Core/DatePicker/SpectrumDatePicker.svelte b/packages/bbui/src/Form/Core/DatePicker/SpectrumDatePicker.svelte index 73e460c30d..bd9fb8269e 100644 --- a/packages/bbui/src/Form/Core/DatePicker/SpectrumDatePicker.svelte +++ b/packages/bbui/src/Form/Core/DatePicker/SpectrumDatePicker.svelte @@ -9,6 +9,7 @@ import Calendar from "./Calendar.svelte" import DateTimeInput from "./DateInput.svelte" import ActionButton from "../../../ActionButton/ActionButton.svelte" + import { parseDate } from "../../../helpers" export let id = null export let disabled = false @@ -30,7 +31,7 @@ let popover let calendar - $: parsedValue = parseValue(value) + $: parsedValue = parseDate(value) $: showCalendar = !timeOnly $: showTime = enableTime || timeOnly @@ -59,28 +60,6 @@ } } - const parseValue = value => { - let parsedDate - - // Attempt to parse as a time-only string if required - if (typeof value === "string" && timeOnly) { - parsedDate = dayjs(`0-${value}`) - } - - // Attempt to parse as normal if required - if (!parsedDate?.isValid()) { - parsedDate = dayjs(value) - } - if (!parsedDate?.isValid()) { - return null - } - - // By rounding to the nearest second we avoid locking up in an endless - // loop in the builder, caused by potentially enriching {{ now }} to every - // millisecond. - return dayjs(Math.floor(parsedDate.valueOf() / 1000) * 1000) - } - const handleChange = date => { if (!date) { dispatch("change", null) diff --git a/packages/bbui/src/helpers.js b/packages/bbui/src/helpers.js index abb7c9a8aa..80a11f9151 100644 --- a/packages/bbui/src/helpers.js +++ b/packages/bbui/src/helpers.js @@ -1,4 +1,5 @@ import { helpers } from "@budibase/shared-core" +import dayjs from "dayjs" export const deepGet = helpers.deepGet @@ -115,3 +116,33 @@ export const copyToClipboard = value => { } }) } + +export const parseDate = (value, { timeOnly, dateOnly } = {}) => { + // If empty then invalid + if (!value) { + return null + } + + // Certain string values need transformed + if (typeof value !== "string") { + if (timeOnly || !isNaN(new Date(`0-${value}`))) { + value = `0-${value}` + } + + // If date only, check for cases where we received a UTC string + else if (dateOnly && value.endsWith("Z")) { + value = value.split("Z")[0] + } + } + + // Parse value and check for validity + const parsedDate = dayjs(value) + if (!parsedDate.isValid()) { + return null + } + + // By rounding to the nearest second we avoid locking up in an endless + // loop in the builder, caused by potentially enriching {{ now }} to every + // millisecond. + return dayjs(Math.floor(parsedDate.valueOf() / 1000) * 1000) +} diff --git a/packages/frontend-core/src/components/grid/cells/DateCell.svelte b/packages/frontend-core/src/components/grid/cells/DateCell.svelte index 1190d6e99f..da3dd0b374 100644 --- a/packages/frontend-core/src/components/grid/cells/DateCell.svelte +++ b/packages/frontend-core/src/components/grid/cells/DateCell.svelte @@ -1,6 +1,5 @@