Files
survey-bundle/contao/templates/frontend/_survey_question_form.html.twig
T
Claude Fable 5 833a8964cf Add topic sections, ordered inserts, rich-text descriptions and grouped results (Ausbaustufe 3)
- section content type with structure service, reader context and grouped results/PDF/Excel
- new questions append at the end (backend oncreate) and per-section add buttons
- rich-text descriptions: Quill 2 (frontend), reduced TinyMCE (backend), server-side whitelist sanitizer
- externalize inline assets, bundle Chart.js locally, harden debug access, validate range bounds

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-22 07:57:40 +02:00

59 lines
4.5 KiB
Twig

{# Gemeinsames Formular für Fragen und Themenbereiche (bestehend und neu).
Erwartet: form, formId, questionType, isNew (bool), dirtyHint (string), submitLabel (string), newQuestionContext (optional) #}
{% trans_default_domain 'messages' %}
{% set isSectionType = questionType == 'section' %}
{{ form_start(form, {attr: {class: 'survey-form-grid', id: formId, 'data-survey-dirty-form': '1', 'data-survey-question-form': '1'}}) }}
<input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}">
{{ form_errors(form) }}
{% if isNew and newQuestionContext|default(null) and newQuestionContext.insertAfter %}
<div class="survey-alert info survey-insert-hint">
{% if newQuestionContext.sectionTitle %}
{{ 'survey.edit.insert_into_section'|trans({'%section%': newQuestionContext.sectionTitle}) }}
{% else %}
{{ 'survey.edit.insert_before_first_section'|trans }}
{% endif %}
</div>
{% endif %}
<label class="survey-label">{{ 'survey.edit.label_type'|trans }}{{ form_widget(form.type, {attr: {'data-survey-question-type': '1'}}) }}</label>
<label class="survey-label">
<span class="question-only-field"{% if isSectionType %} style="display:none"{% endif %}>{{ 'survey.edit.label_question'|trans }}</span>
<span class="section-only-field"{% if not isSectionType %} style="display:none"{% endif %}>{{ 'survey.edit.label_section_title'|trans }}</span>
{{ form_widget(form.question) }}{{ form_errors(form.question) }}
</label>
<div class="section-only-field survey-field-hint"{% if not isSectionType %} style="display:none"{% endif %}>{{ 'survey.edit.section_hint'|trans }}</div>
<div class="question-only-field survey-form-grid"{% if isSectionType %} style="display:none"{% endif %}>
<label class="survey-label">{{ 'survey.edit.label_description'|trans }}{{ form_widget(form.description) }}</label>
<div class="survey-question-toggles">
<label class="survey-inline-check">{{ form_widget(form.mandatory) }}<span>{{ 'survey.edit.mandatory'|trans }}</span></label>
<label class="survey-inline-check">{{ form_widget(form.published) }}<span>{{ 'survey.edit.active'|trans }}</span></label>
<label class="survey-inline-check yes-no-config-field"{% if questionType != 'yes_no_maybe' %} style="display:none"{% endif %}>{{ form_widget(form.allowMaybe) }}<span>{{ 'survey.edit.allow_maybe'|trans }}</span></label>
<label class="survey-inline-check choice-config-field"{% if questionType != 'choice' %} style="display:none"{% endif %}>{{ form_widget(form.allowMultiple) }}<span>{{ 'survey.edit.allow_multiple'|trans }}</span></label>
</div>
<div class="yes-no-config-field survey-grid-columns" style="grid-template-columns: repeat(2, minmax(0, 1fr));{% if questionType != 'yes_no_maybe' %}display:none;{% endif %}">
<label class="survey-label">{{ 'survey.edit.jump_yes'|trans }}{{ form_widget(form.jumpOnYes) }}</label>
<label class="survey-label">{{ 'survey.edit.jump_no'|trans }}{{ form_widget(form.jumpOnNo) }}</label>
</div>
<div class="choice-config-field survey-grid-columns" style="grid-template-columns: repeat(2, minmax(0, 1fr));{% if questionType != 'choice' %}display:none;{% endif %}">
{% for number in 1..10 %}
<label class="survey-label">{{ 'survey.edit.answer_option'|trans({'%number%': number}) }}{{ form_widget(form['answerOption' ~ number]) }}{{ form_errors(form['answerOption' ~ number]) }}</label>
{% endfor %}
</div>
<div class="range-config-field survey-grid-columns" style="grid-template-columns: repeat(3, minmax(0, 1fr));{% if questionType != 'range' %}display:none;{% endif %}">
<label class="survey-label">{{ 'survey.edit.range_min'|trans }}{{ form_widget(form.rangeMin) }}{{ form_errors(form.rangeMin) }}</label>
<label class="survey-label">{{ 'survey.edit.range_max'|trans }}{{ form_widget(form.rangeMax) }}{{ form_errors(form.rangeMax) }}</label>
<label class="survey-label">{{ 'survey.edit.range_step'|trans }}{{ form_widget(form.rangeStep) }}{{ form_errors(form.rangeStep) }}</label>
</div>
</div>
{% if isNew %}
<div class="survey-button-row survey-button-row--form-actions">
<button class="survey-button primary">{{ submitLabel }}</button>
<div class="survey-dirty-hint" data-survey-dirty-hint-for="{{ formId }}" hidden>{{ dirtyHint }}</div>
</div>
{% endif %}
{{ form_end(form) }}