From 73ce7b618f016829cdb67147dbd7c3dd7fffacc2 Mon Sep 17 00:00:00 2001 From: Daniil Palagin Date: Tue, 8 Oct 2024 14:59:17 +0200 Subject: [PATCH 1/8] [#363] Fix RangeError: Invalid time value --- src/components/answer/DateTimeAnswer.jsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/answer/DateTimeAnswer.jsx b/src/components/answer/DateTimeAnswer.jsx index 2b569494..37f2374e 100644 --- a/src/components/answer/DateTimeAnswer.jsx +++ b/src/components/answer/DateTimeAnswer.jsx @@ -14,9 +14,16 @@ const DateTimeAnswer = (props) => { useEffect(() => { if (props.value) { - setDate(new Date(parse(props.value, datePickerFormat, new Date()))); + const parsedDate = parse(props.value, datePickerFormat, new Date()); + if (!isNaN(parsedDate.getTime())) { + setDate(parsedDate); + } else { + console.error("Invalid date value:", props.value); + } + } else { + setDate(null); } - }, []); + }, [props.value, datePickerFormat]); const dateFormat = FormUtils.resolveDateTimeFormat( props.question, From 46cffc15f9766bade260b21e04d0d26a0a314135 Mon Sep 17 00:00:00 2001 From: Miroslav Blasko Date: Tue, 8 Oct 2024 16:20:25 +0200 Subject: [PATCH 2/8] Fix IRIs of question and invalid answer --- src/stories/assets/form/form1.json | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/src/stories/assets/form/form1.json b/src/stories/assets/form/form1.json index 0fcbf9a9..20329f31 100644 --- a/src/stories/assets/form/form1.json +++ b/src/stories/assets/form/form1.json @@ -1434,15 +1434,6 @@ "has-answer-origin": "http://onto.fel.cvut.cz/ontologies/eccairs/model/instance#instance-1236864794", "@id": "http://onto.fel.cvut.cz/ontologies/eccairs/model/instance#instance-1236864794-a" }, - { - "@type": "doc:answer", - "has-answer-origin": "http://onto.fel.cvut.cz/ontologies/eccairs/model/instance#instance-1293838025", - "@id": "http://onto.fel.cvut.cz/ontologies/eccairs/model/instance#instance-1293838025-a", - "has_data_value": { - "@value": "0", - "@language": "en" - } - }, { "@id": "http://onto.fel.cvut.cz/ontologies/eccairs/model/instance#instance-1345228433-a", "@type": "doc:answer", @@ -2380,7 +2371,6 @@ }, { "@type": "doc:question", - "has_answer": "http://onto.fel.cvut.cz/ontologies/eccairs/model/instance#instance-1293838025-a", "has-layout-class": "date", "has-template": "http://onto.fel.cvut.cz/ontologies/eccairs/aviation-3.4.0.2/a-462-qt", "comment": { @@ -2448,7 +2438,7 @@ "label": "no of cycles" }, { - "@id": "http://vfn.cz/ontologies/fss-form/primary-treatment--c--neoadjuvant--no-of-cycles-q", + "@id": "http://vfn.cz/ontologies/fss-form/simple-date-time-q", "has-layout-class": ["section", "answerable", "datetime"], "@type": "doc:question", "label": "Date and time", @@ -2459,18 +2449,18 @@ "@type": "doc:question", "has-layout-class": ["section", "answerable", "time"], "time-format": "HH:mm", - "@id": "http://vfn.cz/ontologies/fss-form/primary-treatment--c--neoadjuvant--no-of-cycles-q1" + "@id": "http://vfn.cz/ontologies/fss-form/simple-time-q" }, { "label": "Date", "has-layout-class": ["section", "answerable", "date"], - "@id": "http://vfn.cz/ontologies/fss-form/primary-treatment--c--neoadjuvant--no-of-cycles-q2", + "@id": "http://vfn.cz/ontologies/fss-form/simple-date-q", "@type": "doc:question", "date-format": "yyyy-MM-dd HH:mm" }, { "label": "Timestamp in db", - "@id": "http://vfn.cz/ontologies/fss-form/primary-treatment--c--neoadjuvant--no-of-cycles-q3", + "@id": "http://vfn.cz/ontologies/fss-form/timestamp-in-db-q", "has-layout-class": ["section", "answerable", "datetime"], "has_answer": "http://onto.fel.cvut.cz/ontologies/custom/model/instance#instance123456-a", "@type": "doc:question" @@ -2484,10 +2474,10 @@ }, { "has_related_question": [ - "http://vfn.cz/ontologies/fss-form/primary-treatment--c--neoadjuvant--no-of-cycles-q2", - "http://vfn.cz/ontologies/fss-form/primary-treatment--c--neoadjuvant--no-of-cycles-q", - "http://vfn.cz/ontologies/fss-form/primary-treatment--c--neoadjuvant--no-of-cycles-q1", - "http://vfn.cz/ontologies/fss-form/primary-treatment--c--neoadjuvant--no-of-cycles-q3" + "http://vfn.cz/ontologies/fss-form/simple-date-q", + "http://vfn.cz/ontologies/fss-form/simple-date-time-q", + "http://vfn.cz/ontologies/fss-form/simple-time-q", + "http://vfn.cz/ontologies/fss-form/timestamp-in-db-q" ], "@type": "doc:question", "@id": "http://vfn.cz/ontologies/fss-form/primary-treatment--chemotherapy--neoadjuvant-q", From 8d6b954848bfcc24a876ac2182489258949c8ede Mon Sep 17 00:00:00 2001 From: Miroslav Blasko Date: Tue, 8 Oct 2024 16:20:42 +0200 Subject: [PATCH 3/8] [Upd] Improve logging of error --- src/components/answer/DateTimeAnswer.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/answer/DateTimeAnswer.jsx b/src/components/answer/DateTimeAnswer.jsx index 37f2374e..c967adcc 100644 --- a/src/components/answer/DateTimeAnswer.jsx +++ b/src/components/answer/DateTimeAnswer.jsx @@ -18,7 +18,9 @@ const DateTimeAnswer = (props) => { if (!isNaN(parsedDate.getTime())) { setDate(parsedDate); } else { - console.error("Invalid date value:", props.value); + console.error( + `Invalid date value ${props.value} of question ${props.question["@id"]}.` + ); } } else { setDate(null); From e203e21ae1c882f1873ffe5b37a5798f0c282c50 Mon Sep 17 00:00:00 2001 From: Miroslav Blasko Date: Tue, 8 Oct 2024 16:41:48 +0200 Subject: [PATCH 4/8] [Upd] Move questions to more meaningful sections --- src/stories/assets/form/form1.json | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/stories/assets/form/form1.json b/src/stories/assets/form/form1.json index 20329f31..00e63ee9 100644 --- a/src/stories/assets/form/form1.json +++ b/src/stories/assets/form/form1.json @@ -1346,6 +1346,20 @@ "has-layout-class": "section", "has_answer": [] }, + { + "label": "Technical section 3", + "form:has-question-origin": "http://onto.fel.cvut.cz/ontologies/vfn-form-mod/techical-section-3", + "@type": "doc:question", + "@id": "doc:question-e7e8eae0-6340-4a96-b13e-7dedaxxxaaaaa", + "has_related_question": [ + "http://vfn.cz/ontologies/fss-form/simple-date-q", + "http://vfn.cz/ontologies/fss-form/simple-date-time-q", + "http://vfn.cz/ontologies/fss-form/simple-time-q", + "http://vfn.cz/ontologies/fss-form/timestamp-in-db-q" + ], + "has-layout-class": "section", + "has_answer": [] + }, { "http://onto.fel.cvut.cz/ontologies/form-spin/has-declared-prefix": [], "label": "Vfn", @@ -2472,18 +2486,6 @@ "has-layout-class": ["section", "answerable", "checkbox"], "label": "Adjuvant (after treatment procedure)" }, - { - "has_related_question": [ - "http://vfn.cz/ontologies/fss-form/simple-date-q", - "http://vfn.cz/ontologies/fss-form/simple-date-time-q", - "http://vfn.cz/ontologies/fss-form/simple-time-q", - "http://vfn.cz/ontologies/fss-form/timestamp-in-db-q" - ], - "@type": "doc:question", - "@id": "http://vfn.cz/ontologies/fss-form/primary-treatment--chemotherapy--neoadjuvant-q", - "has-layout-class": ["section", "answerable", "checkbox"], - "label": "Neoadjuvant (before treatment procedure)" - }, { "label": "No", "@id": "http://vfn.cz/ontologies/fss-form/primary-treatment--chemotherapy--no-q", @@ -2495,7 +2497,6 @@ "label": "Chemotherapy", "has_related_question": [ "http://vfn.cz/ontologies/fss-form/primary-treatment--chemotherapy--adjuvant-q", - "http://vfn.cz/ontologies/fss-form/primary-treatment--chemotherapy--neoadjuvant-q", "http://vfn.cz/ontologies/fss-form/primary-treatment--chemotherapy--no-q" ], "@type": "doc:question", @@ -2680,7 +2681,8 @@ "http://vfn.cz/ontologies/fss-form/primary-treatment--definitive-histology-q", "http://vfn.cz/ontologies/fss-form/primary-treatment--surgical-treatment-q", "doc:question-e7e8eae0-6340-4a96-b13e-7ded2b87abd4", - "doc:question-e7e8eae0-6340-4a96-b13e-7dedaaaaaaaa" + "doc:question-e7e8eae0-6340-4a96-b13e-7dedaaaaaaaa", + "doc:question-e7e8eae0-6340-4a96-b13e-7dedaxxxaaaaa" ], "@type": "doc:question", "@id": "http://vfn.cz/ontologies/fss-form/primary-treatment-q", From fc1143f8d02b000c2a5fb2e72ab671f1ec10c85b Mon Sep 17 00:00:00 2001 From: Miroslav Blasko Date: Tue, 8 Oct 2024 17:09:07 +0200 Subject: [PATCH 5/8] [Fix] Change sections to simple questions --- src/stories/assets/form/form1.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/stories/assets/form/form1.json b/src/stories/assets/form/form1.json index 00e63ee9..22c6b4f2 100644 --- a/src/stories/assets/form/form1.json +++ b/src/stories/assets/form/form1.json @@ -2453,7 +2453,7 @@ }, { "@id": "http://vfn.cz/ontologies/fss-form/simple-date-time-q", - "has-layout-class": ["section", "answerable", "datetime"], + "has-layout-class": ["datetime"], "@type": "doc:question", "label": "Date and time", "datetime-format": "yyyy-MM-dd HH:mm" @@ -2461,13 +2461,13 @@ { "label": "Time", "@type": "doc:question", - "has-layout-class": ["section", "answerable", "time"], + "has-layout-class": ["time"], "time-format": "HH:mm", "@id": "http://vfn.cz/ontologies/fss-form/simple-time-q" }, { "label": "Date", - "has-layout-class": ["section", "answerable", "date"], + "has-layout-class": ["date"], "@id": "http://vfn.cz/ontologies/fss-form/simple-date-q", "@type": "doc:question", "date-format": "yyyy-MM-dd HH:mm" @@ -2475,7 +2475,7 @@ { "label": "Timestamp in db", "@id": "http://vfn.cz/ontologies/fss-form/timestamp-in-db-q", - "has-layout-class": ["section", "answerable", "datetime"], + "has-layout-class": ["datetime"], "has_answer": "http://onto.fel.cvut.cz/ontologies/custom/model/instance#instance123456-a", "@type": "doc:question" }, From d3fb9ee28f97e007d47ee57ebcbf57326b93e34f Mon Sep 17 00:00:00 2001 From: Miroslav Blasko Date: Tue, 8 Oct 2024 17:22:16 +0200 Subject: [PATCH 6/8] Fix incorrect date-format of a question --- src/stories/assets/form/form1.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stories/assets/form/form1.json b/src/stories/assets/form/form1.json index 22c6b4f2..839ff701 100644 --- a/src/stories/assets/form/form1.json +++ b/src/stories/assets/form/form1.json @@ -2470,7 +2470,7 @@ "has-layout-class": ["date"], "@id": "http://vfn.cz/ontologies/fss-form/simple-date-q", "@type": "doc:question", - "date-format": "yyyy-MM-dd HH:mm" + "date-format": "yyyy-MM-dd" }, { "label": "Timestamp in db", From 1e3a870c58827d40fbda90449e3ed42c2d4cc467 Mon Sep 17 00:00:00 2001 From: Daniil Palagin Date: Sun, 13 Oct 2024 19:37:56 +0200 Subject: [PATCH 7/8] [#363] Implement timestamp format --- src/components/answer/DateTimeAnswer.jsx | 12 +++++++++--- src/constants/Constants.js | 3 +++ src/stories/assets/form/form1.json | 6 +++++- src/util/FormUtils.js | 8 ++++++++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/components/answer/DateTimeAnswer.jsx b/src/components/answer/DateTimeAnswer.jsx index c967adcc..c537b930 100644 --- a/src/components/answer/DateTimeAnswer.jsx +++ b/src/components/answer/DateTimeAnswer.jsx @@ -35,6 +35,7 @@ const DateTimeAnswer = (props) => { const isDate = FormUtils.isDate(props.question); const isTime = FormUtils.isTime(props.question); + const isTimestamp = FormUtils.isTimestamp(props.question); // DatePicker does not know dateFormat "x", translate to datetime const datePickerFormat = @@ -47,11 +48,16 @@ const DateTimeAnswer = (props) => { if (!date) { props.onChange(""); } - if (dateFormat === Constants.DATETIME_NUMBER_FORMAT) { - props.onChange(Number(date)); + + let timeValue; + if (isTimestamp) { + timeValue = date.getTime(); + } else if (dateFormat === Constants.DATETIME_NUMBER_FORMAT) { + timeValue = Number(date); } else { - props.onChange(format(date, dateFormat)); + timeValue = format(date, dateFormat); } + props.onChange(timeValue); }; return ( diff --git a/src/constants/Constants.js b/src/constants/Constants.js index 53f978f3..d7c20dfb 100644 --- a/src/constants/Constants.js +++ b/src/constants/Constants.js @@ -5,6 +5,7 @@ export default class Constants { static COLUMN_COUNT = 12; static INPUT_LENGTH_THRESHOLD = 50; static DATETIME_NUMBER_FORMAT = "x"; + static EPOCH_MILLISECONDS = "epoch-milliseconds"; /** * Contains mainly definition of constants used to parse the form declaration. @@ -146,6 +147,8 @@ export default class Constants { static DATE_FORMAT = "http://onto.fel.cvut.cz/ontologies/form/date-format"; static DATETIME_FORMAT = "http://onto.fel.cvut.cz/ontologies/form/datetime-format"; + static TIMESTAMP_FORMAT = + "http://onto.fel.cvut.cz/ontologies/form/timestamp-format"; static NOT_ANSWERED_QUESTION = "http://onto.fel.cvut.cz/ontologies/form/not-answered-question"; diff --git a/src/stories/assets/form/form1.json b/src/stories/assets/form/form1.json index 839ff701..042c40ae 100644 --- a/src/stories/assets/form/form1.json +++ b/src/stories/assets/form/form1.json @@ -148,6 +148,9 @@ "date-format": { "@id": "http://onto.fel.cvut.cz/ontologies/form/date-format" }, + "timestamp-format": { + "@id": "http://onto.fel.cvut.cz/ontologies/form/timestamp-format" + }, "datetime-format": { "@id": "http://onto.fel.cvut.cz/ontologies/form/datetime-format" } @@ -2477,7 +2480,8 @@ "@id": "http://vfn.cz/ontologies/fss-form/timestamp-in-db-q", "has-layout-class": ["datetime"], "has_answer": "http://onto.fel.cvut.cz/ontologies/custom/model/instance#instance123456-a", - "@type": "doc:question" + "@type": "doc:question", + "timestamp-format": "epoch-milliseconds" }, { "has_related_question": "http://vfn.cz/ontologies/fss-form/primary-treatment--c--adjuvant--no-of-cycles-q", diff --git a/src/util/FormUtils.js b/src/util/FormUtils.js index c7e30969..64b5098a 100644 --- a/src/util/FormUtils.js +++ b/src/util/FormUtils.js @@ -120,6 +120,14 @@ export default class FormUtils { ); } + static isTimestamp(question) { + return JsonLdUtils.hasValue( + question, + Constants.TIMESTAMP_FORMAT, + Constants.EPOCH_MILLISECONDS + ); + } + static isCheckbox(question) { return JsonLdUtils.hasValue( question, From 835620a200edce89a22909102d4ea4abd5380e4f Mon Sep 17 00:00:00 2001 From: Daniil Palagin Date: Wed, 16 Oct 2024 18:44:00 +0200 Subject: [PATCH 8/8] [#363] Replace datetime number format with timestamp format --- src/components/answer/DateTimeAnswer.jsx | 69 +++++++++++------------- src/util/FormUtils.js | 24 ++++----- 2 files changed, 43 insertions(+), 50 deletions(-) diff --git a/src/components/answer/DateTimeAnswer.jsx b/src/components/answer/DateTimeAnswer.jsx index c537b930..e9913d40 100644 --- a/src/components/answer/DateTimeAnswer.jsx +++ b/src/components/answer/DateTimeAnswer.jsx @@ -4,28 +4,13 @@ import { FormGroup, Form } from "react-bootstrap"; import PropTypes from "prop-types"; import { format, parse } from "date-fns"; import FormUtils from "../../util/FormUtils"; -import Constants from "../../constants/Constants"; import { ConfigurationContext } from "../../contexts/ConfigurationContext"; import classNames from "classnames"; const DateTimeAnswer = (props) => { const { componentsOptions } = useContext(ConfigurationContext); const [date, setDate] = useState(null); - - useEffect(() => { - if (props.value) { - const parsedDate = parse(props.value, datePickerFormat, new Date()); - if (!isNaN(parsedDate.getTime())) { - setDate(parsedDate); - } else { - console.error( - `Invalid date value ${props.value} of question ${props.question["@id"]}.` - ); - } - } else { - setDate(null); - } - }, [props.value, datePickerFormat]); + const [errorMessage, setErrorMessage] = useState(""); const dateFormat = FormUtils.resolveDateTimeFormat( props.question, @@ -35,28 +20,38 @@ const DateTimeAnswer = (props) => { const isDate = FormUtils.isDate(props.question); const isTime = FormUtils.isTime(props.question); - const isTimestamp = FormUtils.isTimestamp(props.question); - - // DatePicker does not know dateFormat "x", translate to datetime - const datePickerFormat = - dateFormat === "x" - ? componentsOptions.dateTimeAnswer.dateTimeFormat - : dateFormat; - - const handleDateChange = (date) => { - setDate(date); - if (!date) { - props.onChange(""); - } + const isTimestampFormat = FormUtils.isTimestamp(props.question); - let timeValue; - if (isTimestamp) { - timeValue = date.getTime(); - } else if (dateFormat === Constants.DATETIME_NUMBER_FORMAT) { - timeValue = Number(date); + useEffect(() => { + const parsedDate = parseDate(props.value); + if (parsedDate) { + setDate(parsedDate); } else { - timeValue = format(date, dateFormat); + setDate(null); + setErrorMessage( + `Invalid date value ${props.value} of question ${props.question["@id"]}.` + ); + console.error(errorMessage); } + }, [props.value, dateFormat]); + + const parseDate = (value) => { + if (!value) return null; + + const parsed = isTimestampFormat + ? new Date(value) + : parse(value, dateFormat, new Date()); + return isNaN(parsed.getTime()) ? null : parsed; + }; + + const handleDateChange = (selectedDate) => { + setDate(selectedDate); + const timeValue = selectedDate + ? isTimestampFormat + ? selectedDate.getTime() + : format(selectedDate, dateFormat) + : ""; + props.onChange(timeValue); }; @@ -65,14 +60,14 @@ const DateTimeAnswer = (props) => { {props.label}