export const LAYOUT_TYPES = [ { value: 'radio_question', label: 'Radio (Single Choice)' }, { value: 'multi_check_box_question', label: 'Checkbox (Multiple Choice)' }, { value: 'glass_scale_question', label: 'Glass Scale' }, { value: 'value_spinner', label: 'Value Spinner' }, { value: 'date_spinner', label: 'Date Spinner' }, { value: 'string_spinner', label: 'String Spinner' }, { value: 'client_coach_code_question', label: 'Client / Coach Code' }, { value: 'client_not_signed', label: 'Client Not Signed' }, { value: 'last_page', label: 'Last Page' }, ]; export const OPTION_TYPES = new Set(['radio_question', 'multi_check_box_question']); export function layoutSelectHTML(selected = 'radio_question', id = '') { return ``; } export function layoutLabel(value) { const t = LAYOUT_TYPES.find(t => t.value === value); return t ? t.label : value || 'unknown'; } export function parseConfig(q) { try { return JSON.parse(q.configJson || '{}'); } catch { return {}; } } export function questionLocalIds(questions) { return questions.map(q => { const parts = q.questionID.split('__'); return { questionID: q.questionID, localId: parts[parts.length - 1], defaultText: q.defaultText }; }); } export function esc(s) { const d = document.createElement('div'); d.textContent = s ?? ''; return d.innerHTML; } export function configFormHTML(layout, config, prefix) { let html = ''; switch (layout) { case 'radio_question': html = `
`; break; case 'multi_check_box_question': html = `
`; break; case 'glass_scale_question': html = `
`; break; case 'value_spinner': html = `
`; break; case 'date_spinner': { const notBefore = config.constraints?.notBefore || ''; const notAfter = config.constraints?.notAfter || ''; html = `
`; break; } case 'string_spinner': html = `
`; break; case 'client_coach_code_question': html = `
`; break; case 'client_not_signed': html = `
`; break; case 'last_page': html = `
`; break; } return html ? `
${html}
` : ''; } export function readConfigFromForm(layout, prefix) { const config = {}; const val = id => document.getElementById(`${prefix}_${id}`)?.value?.trim() || ''; switch (layout) { case 'radio_question': if (val('textKey')) config.textKey = val('textKey'); break; case 'multi_check_box_question': { const ms = parseInt(val('minSelection') || '0', 10); if (ms > 0) config.minSelection = ms; break; } case 'glass_scale_question': { const raw = val('symptoms'); const syms = raw.split('\n').map(s => s.trim()).filter(Boolean); if (syms.length) config.symptoms = syms; break; } case 'value_spinner': config.range = { min: parseInt(val('rangeMin') || '0', 10), max: parseInt(val('rangeMax') || '100', 10), }; break; case 'date_spinner': { const nb = val('notBefore'); const na = val('notAfter'); if (nb || na) { config.constraints = {}; if (nb) config.constraints.notBefore = nb; if (na) config.constraints.notAfter = na; } break; } case 'string_spinner': { const raw = val('stringOptions'); const opts = raw.split('\n').map(s => s.trim()).filter(Boolean); if (opts.length) config.options = opts; break; } case 'client_coach_code_question': if (val('hint1')) config.hint1 = val('hint1'); if (val('hint2')) config.hint2 = val('hint2'); break; case 'client_not_signed': if (val('textKey1')) config.textKey1 = val('textKey1'); if (val('textKey2')) config.textKey2 = val('textKey2'); if (val('hint')) config.hint = val('hint'); break; case 'last_page': if (val('textKey')) config.textKey = val('textKey'); break; } return JSON.stringify(config); }