From dbaeb3d3f19bd00aa7fa40e9c459fe6629033bd1 Mon Sep 17 00:00:00 2001 From: Sebastian Tilsch Date: Mon, 30 Sep 2024 06:06:04 +0200 Subject: [PATCH] fix date related issues in table and mapping --- .../components/config/tableConfig.tsx | 16 ++++++++---- packages/core-utils/src/specialDate.ts | 16 ++++++++++++ .../data-mapping/src/mappingStrategies.ts | 25 +++++++++++-------- .../ui-utils/src/specialDate2LocalDate.ts | 12 ++++++--- 4 files changed, 51 insertions(+), 18 deletions(-) diff --git a/apps/exhibition-live/components/config/tableConfig.tsx b/apps/exhibition-live/components/config/tableConfig.tsx index d68d544b..5765c318 100644 --- a/apps/exhibition-live/components/config/tableConfig.tsx +++ b/apps/exhibition-live/components/config/tableConfig.tsx @@ -11,11 +11,17 @@ const dateColDef: ( const columnDef: MRT_ColumnDef = { header: t(p([...path, key])), id: p([...path, key, "single"]), - accessorFn: mkAccessor(`${p([...path, key, "single"])}.value`, "", (v) => - typeof v === "string" || (typeof v === "number" && String(v).length === 8) - ? specialDate2LocalDate(Number(v), "de") - : String(v), - ), + accessorFn: mkAccessor(`${p([...path, key, "single"])}.value`, "", (v) => { + try { + return typeof v === "string" || + (typeof v === "number" && String(v).length === 8) + ? specialDate2LocalDate(Number(v), "de") + : String(v); + } catch (error) { + console.error("Error processing date:", error); + return String(v); + } + }), filterVariant: "date", filterFn: "betweenInclusive", sortingFn: "datetime", diff --git a/packages/core-utils/src/specialDate.ts b/packages/core-utils/src/specialDate.ts index face4bbd..3ac9f316 100644 --- a/packages/core-utils/src/specialDate.ts +++ b/packages/core-utils/src/specialDate.ts @@ -93,3 +93,19 @@ export const getDatePartAsString = ( const maxLength = part === "year" ? 4 : 2; return leftpad(value, maxLength); }; + +/** + * convert year, month, day to a number + * @param year + * @param month + * @param day + * @returns + */ +export const makeSpecialDate = ( + year: number, + month?: number | undefined, + day?: number | undefined, +) => { + const specialDateString = `${year}${month ? leftpad(month, 2) : "00"}${day ? leftpad(day, 2) : "00"}`; + return Number(specialDateString); +}; diff --git a/packages/data-mapping/src/mappingStrategies.ts b/packages/data-mapping/src/mappingStrategies.ts index c0950f9d..61978740 100644 --- a/packages/data-mapping/src/mappingStrategies.ts +++ b/packages/data-mapping/src/mappingStrategies.ts @@ -5,13 +5,14 @@ import { mapByConfig } from "./mapByConfig"; import isNil from "lodash-es/isNil"; import set from "lodash-es/set"; import get from "lodash-es/get"; -import { getPaddedDate } from "@slub/edb-core-utils"; +import { getPaddedDate, makeSpecialDate } from "@slub/edb-core-utils"; import { IRIToStringFn, NormDataMappings, PrimaryFieldDeclaration, } from "@slub/edb-core-types"; import { JSONSchema7 } from "json-schema"; +import { isNaN } from "lodash-es"; dayjs.extend(customParseFormat); @@ -899,21 +900,25 @@ export const arrayToAdbDate = ( dateValue: number; dateModifier: number; } => { + const { logger } = context || {}; const { offset = 0 } = options || {}; if (sourceData.length < offset + 3) throw new Error( `Not enough data (${sourceData.length}) to convert to date`, ); - const day = sourceData[offset]; - const month = sourceData[offset + 1]; - const year = sourceData[offset + 2]; - if (!year) return null; - const date = dayjs(); - date.year(year); - if (month) date.month(month - 1); - if (day) date.date(day); + + const day = Number(sourceData[offset]); + const month = Number(sourceData[offset + 1] || "0"); + const year = Number(sourceData[offset + 2] || "0"); + const dateValue = makeSpecialDate( + isNaN(year) ? 0 : year, + isNaN(month) ? 0 : month, + isNaN(day) ? 0 : day, + ); + logger.log(`Converted date ${dateValue} from ${sourceData}`); + return { - dateValue: dayJsDateToSpecialInt(date), + dateValue: Number(dateValue), dateModifier: 0, }; }; diff --git a/packages/ui-utils/src/specialDate2LocalDate.ts b/packages/ui-utils/src/specialDate2LocalDate.ts index b0b0c912..a8b0eb3c 100644 --- a/packages/ui-utils/src/specialDate2LocalDate.ts +++ b/packages/ui-utils/src/specialDate2LocalDate.ts @@ -5,13 +5,19 @@ export const specialDate2LocalDate = (date: number, locale: string) => { const { year, month, day } = getDateParts(date); const jsdate = numeric2JSDate(date); if (!year && month && day) { - return dayjs(jsdate).format("MM.DD."); + return locale === "de" + ? dayjs(jsdate).format("DD.MM.") + : dayjs(jsdate).format("MM/DD"); } if (!day && month && year) { - return dayjs(jsdate).format("YYYY.MM.") + "–-"; + return locale === "de" + ? dayjs(jsdate).format("MMMM YYYY") + : dayjs(jsdate).format("MMMM/YYYY"); } if (day && month && year) { - return dayjs(jsdate).format("l"); + return locale === "de" + ? dayjs(jsdate).format("DD.MM.YYYY") + : dayjs(jsdate).format("MM/DD/YYYY"); } if (year && !month && !day) { return dayjs(jsdate).format("YYYY");