From 39b8ece5c9c8ebbe8ca359c02ee6e2ac1cb767b6 Mon Sep 17 00:00:00 2001 From: Jose Gomez Date: Tue, 23 Aug 2022 09:11:14 -0400 Subject: [PATCH] Check if the current time matches the selected interval --- .../components/Inputs/index.js | 31 +++++++++++++++++-- .../EditSettingsView/components/ModalForm.js | 2 +- .../validation/model-configuration.js | 2 +- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/packages/core/admin/admin/src/content-manager/components/Inputs/index.js b/packages/core/admin/admin/src/content-manager/components/Inputs/index.js index 063025be0c..5c662491cd 100644 --- a/packages/core/admin/admin/src/content-manager/components/Inputs/index.js +++ b/packages/core/admin/admin/src/content-manager/components/Inputs/index.js @@ -162,7 +162,34 @@ function Inputs({ [fieldSchema, isRequired] ); - const { label, description, placeholder, visible, step: metadataStep } = metadatas; + const { label, description, placeholder, visible } = metadatas; + + /** + * It decides whether using the default `step` accoding to its `inputType` or the one + * obtained from `metadatas`. + * + * The `metadatas.step` is returned when the `inputValue` is divisible by it or when the + * `inputValue` is empty, otherwise the default `step` is returned. + */ + const inputStep = useMemo(() => { + if (!metadatas.step || (inputType !== 'datetime' && inputType !== 'time')) { + return step; + } + + if (!inputValue) { + return metadatas.step; + } + + let minutes; + + if (inputType === 'datetime') { + minutes = parseInt(inputValue.substr(14, 2), 10); + } else if (inputType === 'time') { + minutes = parseInt(inputValue.slice(-2), 10); + } + + return minutes % metadatas.step === 0 ? metadatas.step : step; + }, [inputType, inputValue, metadatas.step, step]); if (visible === false) { return null; @@ -242,7 +269,7 @@ function Inputs({ options={options} placeholder={placeholder ? { id: placeholder, defaultMessage: placeholder } : null} required={fieldSchema.required || false} - step={metadataStep || step} + step={inputStep} type={inputType} // validations={validations} value={inputValue} diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/ModalForm.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/ModalForm.js index 1965b97184..19b014398b 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/ModalForm.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/ModalForm.js @@ -138,7 +138,7 @@ const ModalForm = ({ onMetaChange, onSizeChange }) => { onChange={(value) => onMetaChange({ target: { name: 'step', value } })} label={formatMessage({ id: getTrad('containers.SettingPage.editSettings.step.label'), - defaultMessage: 'Step', + defaultMessage: 'Time interval (minutes)', })} > {TIME_FIELD_OPTIONS.map((value) => ( diff --git a/packages/core/content-manager/server/controllers/validation/model-configuration.js b/packages/core/content-manager/server/controllers/validation/model-configuration.js index 3b2a4cd3ca..47e76a9eff 100644 --- a/packages/core/content-manager/server/controllers/validation/model-configuration.js +++ b/packages/core/content-manager/server/controllers/validation/model-configuration.js @@ -59,7 +59,7 @@ const createMetadasSchema = (schema) => { .positive() .test( 'isDivisibleBy60', - 'Step must be divisible by 60', + 'Step must be either 1 or divisible by 60', (value) => !value || value === 1 || (value * 24) % 60 === 0 ), })