From 5cdd80d9b63c79ea6591111c4e78f927358975e6 Mon Sep 17 00:00:00 2001 From: Wojciech Date: Wed, 14 Oct 2020 10:30:52 +0200 Subject: [PATCH] fix: handle Date when coverting to formData before the fix it converted to empty objects --- src/backend/adapters/record/base-record.ts | 1 - .../hooks/use-record/record-to-form-data.spec.ts | 9 +++++++++ src/frontend/hooks/use-record/record-to-form-data.ts | 9 ++++++++- src/utils/flat/flat.types.ts | 1 + 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/backend/adapters/record/base-record.ts b/src/backend/adapters/record/base-record.ts index 9c9114e0a..a764610ca 100644 --- a/src/backend/adapters/record/base-record.ts +++ b/src/backend/adapters/record/base-record.ts @@ -1,4 +1,3 @@ -import _ from 'lodash' import { flat } from '../../../utils/flat' import { ParamsType } from './params.type' import BaseResource from '../resource/base-resource' diff --git a/src/frontend/hooks/use-record/record-to-form-data.spec.ts b/src/frontend/hooks/use-record/record-to-form-data.spec.ts index d153983fd..7bb193cd1 100644 --- a/src/frontend/hooks/use-record/record-to-form-data.spec.ts +++ b/src/frontend/hooks/use-record/record-to-form-data.spec.ts @@ -31,4 +31,13 @@ describe('recordToFormData', function () { expect(recordToFormData(record).get(propertyKey)).to.equal(FORM_VALUE_EMPTY_ARRAY) }) + + it('does not convert date to empty object', async () => { + const date = new Date() + const record = await factory.build('RecordJSON', { params: { + [propertyKey]: date, + } }) + + expect(recordToFormData(record).get(propertyKey)).to.equal(date.toString()) + }) }) diff --git a/src/frontend/hooks/use-record/record-to-form-data.ts b/src/frontend/hooks/use-record/record-to-form-data.ts index c8214a569..fd5d3078c 100644 --- a/src/frontend/hooks/use-record/record-to-form-data.ts +++ b/src/frontend/hooks/use-record/record-to-form-data.ts @@ -4,6 +4,12 @@ export const FORM_VALUE_NULL = '__FORM_VALUE_NULL__' export const FORM_VALUE_EMPTY_OBJECT = '__FORM_VALUE_EMPTY_OBJECT__' export const FORM_VALUE_EMPTY_ARRAY = '__FORM_VALUE_EMPTY_ARRAY__' +const isObjectOrArray = (value: any): boolean => ( + typeof value === 'object' + && (value as object).constructor !== File + && !(value instanceof Date) +) + /** * Changes RecordJSON that it can be send as a FormData to the backend. * @@ -19,6 +25,7 @@ export const FORM_VALUE_EMPTY_ARRAY = '__FORM_VALUE_EMPTY_ARRAY__' export default function recordToFormData(record: RecordJSON): FormData { const formData = new FormData() + // Assume that record.params are flatted Object.entries(record.params).forEach(([key, value]) => { // {@link updateRecord} does not change empty objects "{}" - so in order to prevent having // them changed to "[object Object]" we have to set them to empty strings. @@ -26,7 +33,7 @@ export default function recordToFormData(record: RecordJSON): FormData { return formData.set(key, FORM_VALUE_NULL) } // File objects has to go through because they are handled by FormData - if (typeof value === 'object' && (value as object).constructor !== File) { + if (isObjectOrArray(value)) { if (Array.isArray(value)) { return formData.set(key, FORM_VALUE_EMPTY_ARRAY) } diff --git a/src/utils/flat/flat.types.ts b/src/utils/flat/flat.types.ts index 42c9957c3..c4843eec2 100644 --- a/src/utils/flat/flat.types.ts +++ b/src/utils/flat/flat.types.ts @@ -7,6 +7,7 @@ export type FlattenValue = 'string' | 'boolean' | 'number' | + Date | null | [] | {} |