diff --git a/src/qqq/components/forms/EntityForm.tsx b/src/qqq/components/forms/EntityForm.tsx index 7f9ddf1..b27a9f3 100644 --- a/src/qqq/components/forms/EntityForm.tsx +++ b/src/qqq/components/forms/EntityForm.tsx @@ -378,6 +378,32 @@ function EntityForm(props: Props): JSX.Element actions.setSubmitting(true); await (async () => { + ////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // (1) convert date-time fields from user's time-zone into UTC // + // (2) if there's an initial value which matches the value (e.g., from the form), then remove that field // + // from the set of values that we'll submit to the backend. This is to deal with the fact that our // + // date-times in the UI (e.g., the form field) only go to the minute - so they kinda always end up // + // changing from, say, 12:15:30 to just 12:15:00... this seems to get around that, for cases when the // + // user didn't change the value in the field (but if the user did change the value, then we will submit it) // + ////////////////////////////////////////////////////////////////////////////////////////////////////////////// + for(let fieldName of tableMetaData.fields.keys()) + { + const fieldMetaData = tableMetaData.fields.get(fieldName); + if(fieldMetaData.type === QFieldType.DATE_TIME && values[fieldName]) + { + console.log(`DateTime ${fieldName}: Initial value: [${initialValues[fieldName]}] -> [${values[fieldName]}]`) + if (initialValues[fieldName] == values[fieldName]) + { + console.log(" - Is the same, so, deleting from the post"); + delete (values[fieldName]); + } + else + { + values[fieldName] = ValueUtils.frontendLocalZoneDateTimeStringToUTCStringForBackend(values[fieldName]); + } + } + } + if (props.id !== null) { await qController diff --git a/src/qqq/components/widgets/components/DropdownMenu.tsx b/src/qqq/components/widgets/components/DropdownMenu.tsx index fb6f994..7266cb7 100644 --- a/src/qqq/components/widgets/components/DropdownMenu.tsx +++ b/src/qqq/components/widgets/components/DropdownMenu.tsx @@ -80,11 +80,11 @@ function makeBackendValuesFromFrontendValues(frontendDefaultValues: StartAndEndD const backendTimeValues: StartAndEndDate = {}; if(frontendDefaultValues && frontendDefaultValues.startDate) { - backendTimeValues.startDate = FilterUtils.frontendLocalZoneDateTimeStringToUTCStringForBackend(frontendDefaultValues.startDate); + backendTimeValues.startDate = ValueUtils.frontendLocalZoneDateTimeStringToUTCStringForBackend(frontendDefaultValues.startDate); } if(frontendDefaultValues && frontendDefaultValues.endDate) { - backendTimeValues.endDate = FilterUtils.frontendLocalZoneDateTimeStringToUTCStringForBackend(frontendDefaultValues.endDate); + backendTimeValues.endDate = ValueUtils.frontendLocalZoneDateTimeStringToUTCStringForBackend(frontendDefaultValues.endDate); } return (backendTimeValues); } @@ -129,7 +129,7 @@ function DropdownMenu({name, defaultValue, label, dropdownOptions, onChangeCallb const dateChanged = (fieldName: "startDate" | "endDate", event: any) => { customTimeValuesFrontend[fieldName] = event.target.value; - customTimeValuesBackend[fieldName] = FilterUtils.frontendLocalZoneDateTimeStringToUTCStringForBackend(event.target.value); + customTimeValuesBackend[fieldName] = ValueUtils.frontendLocalZoneDateTimeStringToUTCStringForBackend(event.target.value); clearTimeout(debounceTimeout); const newDebounceTimeout = setTimeout(() => diff --git a/src/qqq/utils/qqq/FilterUtils.ts b/src/qqq/utils/qqq/FilterUtils.ts index c54758c..3f6deae 100644 --- a/src/qqq/utils/qqq/FilterUtils.ts +++ b/src/qqq/utils/qqq/FilterUtils.ts @@ -270,19 +270,6 @@ class FilterUtils }; - /******************************************************************************* - ** - *******************************************************************************/ - private static zeroPad = (n: number): string => - { - if (n < 10) - { - return ("0" + n); - } - return (`${n}`); - }; - - /******************************************************************************* ** Helper method - take a list of values, which may be possible values, and ** either return the original list, or a new list that is just the ids of the @@ -314,7 +301,7 @@ class FilterUtils { try { - let toPush = this.frontendLocalZoneDateTimeStringToUTCStringForBackend(param[i]); + let toPush = ValueUtils.frontendLocalZoneDateTimeStringToUTCStringForBackend(param[i]); rs.push(toPush); } catch (e) @@ -333,21 +320,6 @@ class FilterUtils }; - /******************************************************************************* - ** Take a string date (w/o a timezone) like that our calendar widgets make, - ** and convert it to UTC, e.g., for submitting to the backend. - *******************************************************************************/ - public static frontendLocalZoneDateTimeStringToUTCStringForBackend(param: string) - { - let localDate = new Date(param); - let month = (1 + localDate.getUTCMonth()); - let zp = FilterUtils.zeroPad; - let toPush = localDate.getUTCFullYear() + "-" + zp(month) + "-" + zp(localDate.getUTCDate()) + "T" + zp(localDate.getUTCHours()) + ":" + zp(localDate.getUTCMinutes()) + ":" + zp(localDate.getUTCSeconds()) + "Z"; - console.log(`Input date was ${localDate}. Sending to backend as ${toPush}`); - return toPush; - } - - /******************************************************************************* ** Convert a filter field's value from the style that qqq uses, to the style that ** the grid uses. diff --git a/src/qqq/utils/qqq/ValueUtils.tsx b/src/qqq/utils/qqq/ValueUtils.tsx index b3c446e..61d7c2b 100644 --- a/src/qqq/utils/qqq/ValueUtils.tsx +++ b/src/qqq/utils/qqq/ValueUtils.tsx @@ -373,6 +373,33 @@ class ValueUtils return (value); } } + + /******************************************************************************* + ** + *******************************************************************************/ + private static zeroPad = (n: number): string => + { + if (n < 10) + { + return ("0" + n); + } + return (`${n}`); + }; + + /******************************************************************************* + ** Take a string date (w/o a timezone) like that our calendar widgets make, + ** and convert it to UTC, e.g., for submitting to the backend. + *******************************************************************************/ + public static frontendLocalZoneDateTimeStringToUTCStringForBackend(param: string) + { + let localDate = new Date(param); + let month = (1 + localDate.getUTCMonth()); + let zp = ValueUtils.zeroPad; + let toPush = localDate.getUTCFullYear() + "-" + zp(month) + "-" + zp(localDate.getUTCDate()) + "T" + zp(localDate.getUTCHours()) + ":" + zp(localDate.getUTCMinutes()) + ":" + zp(localDate.getUTCSeconds()) + "Z"; + console.log(`Input date was ${localDate}. Sending to backend as ${toPush}`); + return toPush; + } + } ////////////////////////////////////////////////////////////////////////////////////////////////