From bbd7c6be3f07998da5143da8fdee0cb4dabe16a5 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 10 Nov 2026 10:56:19 +0100 Subject: [PATCH] feat(conditional): go to a question after date and time questions Date and time questions get the select "After question N", stored in extraSettings.next. Date and time questions of old forms (datetime) get no jumps. Assisted-by: Claude Code:claude-opus-5-5 Signed-off-by: Andy Scherzinger --- docs/DataStructure.md | 2 +- lib/Constants.php | 2 ++ src/utils/Jumps.ts | 2 ++ tests/Unit/Service/FormsServiceTest.php | 12 +++++++++++- tests/fixtures/jump-paths.json | 19 +++++++++++++++++++ 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/docs/DataStructure.md b/docs/DataStructure.md index f51ff41ec..1b91e5bbc 100644 --- a/docs/DataStructure.md +++ b/docs/DataStructure.md @@ -271,7 +271,7 @@ Optional extra settings for some [Question Types](#question-types) | `rows` | `grid` | Array | - | Array of row identifiers / labels for grid questions | | `questionType` | `grid` | String | `checkbox`, `number`, `radio` | Type of cell for grid questions (checkbox, numeric input, or radio) | | `goTo` | `dropdown, multiple_unique` | Array | see [Jumps](#jumps) | Where to go next for an answer | -| `next` | `color, file, grid, long, multiple, ranking, short` | Integer / string | question id, `'submit'` | Where to go after the question, see [Jumps](#jumps) | +| `next` | `color, date, file, grid, long, multiple, ranking, short, time` | Integer / string | question id, `'submit'` | Where to go after the question, see [Jumps](#jumps) | ### Jumps diff --git a/lib/Constants.php b/lib/Constants.php index eb9dbbb6d..c81adf987 100644 --- a/lib/Constants.php +++ b/lib/Constants.php @@ -216,12 +216,14 @@ class Constants { 'dateMax' => ['string', 'integer', 'NULL'], 'dateMin' => ['string', 'integer', 'NULL'], 'dateRange' => ['boolean', 'NULL'], + 'next' => ['integer', 'string'], ]; public const EXTRA_SETTINGS_TIME = [ 'timeMax' => ['string', 'NULL'], 'timeMin' => ['string', 'NULL'], 'timeRange' => ['boolean', 'NULL'], + 'next' => ['integer', 'string'], ]; // should be in sync with FileTypes.js diff --git a/src/utils/Jumps.ts b/src/utils/Jumps.ts index 5dad119b5..7eec1f992 100644 --- a/src/utils/Jumps.ts +++ b/src/utils/Jumps.ts @@ -17,12 +17,14 @@ export const QUESTION_TYPES_WITH_GOTO = ['dropdown', 'multiple_unique'] export const QUESTION_TYPES_WITH_NEXT = [ 'color', + 'date', 'file', 'grid', 'long', 'multiple', 'ranking', 'short', + 'time', ] /** The answer a jump belongs to: an option or the answer "Other" */ diff --git a/tests/Unit/Service/FormsServiceTest.php b/tests/Unit/Service/FormsServiceTest.php index 04fa89b62..6f39a5009 100644 --- a/tests/Unit/Service/FormsServiceTest.php +++ b/tests/Unit/Service/FormsServiceTest.php @@ -1687,9 +1687,19 @@ public static function dataAreExtraSettingsValid() { 'questionType' => Constants::ANSWER_TYPE_SHORT, 'expected' => false, ], - 'jump: next not offered on date questions' => [ + 'jump: next on date questions' => [ 'extraSettings' => ['next' => 5], 'questionType' => Constants::ANSWER_TYPE_DATE, + 'expected' => true, + ], + 'jump: next on time questions' => [ + 'extraSettings' => ['next' => 'submit'], + 'questionType' => Constants::ANSWER_TYPE_TIME, + 'expected' => true, + ], + 'jump: next not offered on datetime questions' => [ + 'extraSettings' => ['next' => 5], + 'questionType' => Constants::ANSWER_TYPE_DATETIME, 'expected' => false, ], 'jump: goTo per option and Other' => [ diff --git a/tests/fixtures/jump-paths.json b/tests/fixtures/jump-paths.json index 087f2f656..584b82d08 100644 --- a/tests/fixtures/jump-paths.json +++ b/tests/fixtures/jump-paths.json @@ -238,6 +238,25 @@ "answers": { "1": ["11", "12"] }, "visible": [1, 3] }, + { + "name": "a time question goes to its target", + "questions": [ + { "id": 1, "type": "time", "extraSettings": { "next": 3 } }, + { "id": 2, "type": "short", "extraSettings": {} }, + { "id": 3, "type": "short", "extraSettings": {} } + ], + "answers": { "1": ["10:30"] }, + "visible": [1, 3] + }, + { + "name": "a date question goes to its target", + "questions": [ + { "id": 1, "type": "date", "extraSettings": { "next": "submit" } }, + { "id": 2, "type": "short", "extraSettings": {} } + ], + "answers": { "1": ["2026-11-10"] }, + "visible": [1] + }, { "name": "the jumps of skipped questions do not count", "questions": [