settings for future and past dates
Some checks failed
PHPUnit / test (push) Has been cancelled

This commit is contained in:
2026-07-17 17:45:38 +02:00
parent 9265181154
commit 764b4c5545
5 changed files with 25 additions and 4 deletions

View File

@ -231,7 +231,8 @@ Question fields:
- `options[].key`: answer option key. Send this back as `answerOptionKey` during upload.
- `options[].nextQuestionId`: optional conditional navigation target.
- `pointsMap`: optional map from answer option key to point value.
- `textKey`, `textKey1`, `textKey2`, `hint`, `hint1`, `hint2`, `symptoms`, `range`, `constraints`, `minSelection`: optional layout-specific config fields.
- `textKey`, `textKey1`, `textKey2`, `hint`, `hint1`, `hint2`, `symptoms`, `range`, `constraints`, `precision`, `dateRange`, `minSelection`: optional layout-specific config fields.
- `dateRange` (date_spinner): `"past"` (default) or `"future"` — which years/dates the app offers.
Important ID rule: the fetch response returns short question IDs such as `q1`. The server resolves these back to full database IDs during upload, so the Android app should upload the same short IDs it received.

View File

@ -581,6 +581,7 @@ if ($qnID) {
if (isset($config['unitLabel'])) $q['unitLabel'] = $config['unitLabel'];
if (isset($config['constraints'])) $q['constraints'] = $config['constraints'];
if (isset($config['precision'])) $q['precision'] = $config['precision'];
if (isset($config['dateRange'])) $q['dateRange'] = $config['dateRange'];
if (isset($config['minSelection'])) $q['minSelection'] = $config['minSelection'];
if (isset($config['maxLength'])) $q['maxLength'] = (int)$config['maxLength'];
if (isset($config['nextQuestionId'])) $q['nextQuestionId'] = $config['nextQuestionId'];

View File

@ -490,10 +490,13 @@ function qdb_dev_build_answers_for_questionnaire(PDO $pdo, string $qnID, int $va
break;
case 'date_spinner':
$year = 2018 + ($v % 6);
$precision = $config['precision'] ?? 'full';
$dateRange = ($config['dateRange'] ?? 'past') === 'future' ? 'future' : 'past';
$year = $dateRange === 'future'
? ((int)date('Y') + ($v % 5))
: (2018 + ($v % 6));
$month = 1 + ($v % 12);
$day = 1 + ($v % 28);
$precision = $config['precision'] ?? 'full';
$dateValue = match ($precision) {
'year' => sprintf('%04d', $year),
'year_month' => sprintf('%04d-%02d', $year, $month),

View File

@ -602,6 +602,7 @@ function configFormHTML(layout, config, prefix, opts = {}) {
const notBefore = config.constraints?.notBefore || '';
const notAfter = config.constraints?.notAfter || '';
const precision = config.precision || 'full';
const dateRange = config.dateRange === 'future' ? 'future' : 'past';
html = `
<div class="form-group">
<label>Date precision</label>
@ -611,6 +612,14 @@ function configFormHTML(layout, config, prefix, opts = {}) {
<option value="year" ${precision === 'year' ? 'selected' : ''}>Year only</option>
</select>
</div>
<div class="form-group">
<label>Allowed dates</label>
<select id="${prefix}_dateRange">
<option value="past" ${dateRange === 'past' ? 'selected' : ''}>Past (today and earlier)</option>
<option value="future" ${dateRange === 'future' ? 'selected' : ''}>Future (today and later)</option>
</select>
<span class="field-hint">Controls which years the app shows. Default is past.</span>
</div>
<div class="form-row">
<div class="form-group">
<label>Not before (question key)</label>
@ -717,6 +726,8 @@ function readConfigFromForm(layout, prefix) {
case 'date_spinner': {
const prec = val('precision') || 'full';
if (prec && prec !== 'full') config.precision = prec;
const dateRange = val('dateRange') || 'past';
if (dateRange === 'future') config.dateRange = 'future';
const nb = val('notBefore');
const na = val('notAfter');
if (nb || na) {

View File

@ -333,9 +333,14 @@ function renderQuestionBody(q, sectionIdx) {
case 'date_spinner': {
const precision = config.precision || 'full';
const dateRange = config.dateRange === 'future' ? 'future' : 'past';
const years = [];
const now = new Date().getFullYear();
for (let yr = now + 1; yr >= 1900; yr--) years.push(yr);
if (dateRange === 'future') {
for (let yr = now; yr <= now + 50; yr++) years.push(yr);
} else {
for (let yr = now; yr >= 1900; yr--) years.push(yr);
}
inner += `<div class="qp-date-row">`;
if (precision === 'full') {
inner += `<select data-part="day" class="qp-select qp-select-sm"><option value="">Day</option>`;