Refine survey template module layout

This commit is contained in:
Jürgen Mummert
2026-06-08 20:01:08 +02:00
parent 7843fca003
commit 99caf51af9
3 changed files with 84 additions and 47 deletions
@@ -287,6 +287,13 @@
align-items: center; align-items: center;
} }
.survey-list-card__head--template {
align-items: baseline;
justify-content: space-between;
flex-wrap: wrap;
gap: 0.75rem;
}
.survey-list-card__headline { .survey-list-card__headline {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -296,6 +303,12 @@
flex: 1 1 auto; flex: 1 1 auto;
} }
.survey-list-card__headline--template {
align-items: baseline;
justify-content: flex-start;
flex: 1 1 auto;
}
.survey-list-card__title-wrap { .survey-list-card__title-wrap {
min-width: 0; min-width: 0;
} }
@@ -323,6 +336,11 @@
margin-left: 1rem; margin-left: 1rem;
} }
.survey-list-card__head-actions--template {
align-items: baseline;
margin-left: auto;
}
.survey-list-card__footer { .survey-list-card__footer {
display: flex; display: flex;
align-items: baseline; align-items: baseline;
@@ -1,7 +1,9 @@
{% trans_default_domain 'messages' %} {% trans_default_domain 'messages' %}
{% include '@Survey/frontend/_survey_assets.html.twig' %} {% include '@Survey/frontend/_survey_assets.html.twig' %}
{% include '@Survey/frontend/_survey_branding.html.twig' %} {% if not templatesOnly|default(false) %}
{% include '@Survey/frontend/_survey_branding.html.twig' %}
{% endif %}
{% set moduleHeadline = (headline is iterable ? headline.text|default('') : headline|default(''))|striptags|trim %} {% set moduleHeadline = (headline is iterable ? headline.text|default('') : headline|default(''))|striptags|trim %}
{% set templatesOnly = templatesOnly|default(false) %} {% set templatesOnly = templatesOnly|default(false) %}
@@ -33,33 +35,47 @@
<div class="survey-grid survey-list-grid"> <div class="survey-grid survey-list-grid">
{% for survey in surveys %} {% for survey in surveys %}
<article class="survey-card survey-list-card"> <article class="survey-card survey-list-card">
<div class="survey-list-card__head"> <div class="survey-list-card__head{{ templatesOnly ? ' survey-list-card__head--template' : '' }}">
<div class="survey-list-card__headline"> <div class="survey-list-card__headline{{ templatesOnly ? ' survey-list-card__headline--template' : '' }}">
<div class="survey-list-card__title-wrap"> <div class="survey-list-card__title-wrap">
<h3>{{ survey.title|striptags|trim }}</h3> <h3>{{ survey.title|striptags|trim }}</h3>
</div> </div>
<div class="survey-list-card__stats"> <div class="survey-list-card__stats">
<span class="survey-list-stat">{{ 'survey.list.questions'|trans({'%count%': survey.questionCount}) }}</span> <span class="survey-list-stat">{{ 'survey.list.questions'|trans({'%count%': survey.questionCount}) }}</span>
<span class="survey-list-stat">{{ 'survey.list.participations'|trans({'%count%': survey.participationCount}) }}</span> {% if not templatesOnly %}
<span class="survey-list-stat">{{ 'survey.list.participations'|trans({'%count%': survey.participationCount}) }}</span>
{% endif %}
</div> </div>
</div> </div>
{% if templatesOnly %}
<div class="survey-list-card__head-actions survey-list-card__head-actions--template">
<form method="post" class="survey-question-action-form">
<input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}">
<input type="hidden" name="_survey_action" value="duplicate-survey">
<input type="hidden" name="item_id" value="{{ survey.id }}">
<input type="hidden" name="_token" value="{{ csrf_token('duplicate-survey-' ~ survey.id) }}">
<button class="survey-button secondary" onclick="return confirm('{{ 'survey.list.duplicate_confirm'|trans({'%title%': survey.title|striptags|trim})|e('js') }}');">{{ 'survey.list.duplicate'|trans }}</button>
</form>
</div>
{% endif %}
</div> </div>
{% if not templatesOnly %}
<div class="survey-list-card__footer"> <div class="survey-list-card__footer">
<div class="survey-button-row survey-list-card__actions"> <div class="survey-button-row survey-list-card__actions">
{% if not templatesOnly and survey.editUrl %} {% if survey.editUrl %}
{% if survey.published %} {% if survey.published %}
<span class="survey-button primary is-disabled" aria-disabled="true">{{ 'survey.list.edit'|trans }}</span> <span class="survey-button primary is-disabled" aria-disabled="true">{{ 'survey.list.edit'|trans }}</span>
{% else %} {% else %}
<a class="survey-button primary" href="{{ survey.editUrl }}">{{ 'survey.list.edit'|trans }}</a> <a class="survey-button primary" href="{{ survey.editUrl }}">{{ 'survey.list.edit'|trans }}</a>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if not templatesOnly and survey.publicUrl and survey.published %} {% if survey.publicUrl and survey.published %}
<a class="survey-button secondary" href="{{ survey.publicUrl }}" target="_blank" rel="noreferrer">{{ 'survey.list.public_view'|trans }}</a> <a class="survey-button secondary" href="{{ survey.publicUrl }}" target="_blank" rel="noreferrer">{{ 'survey.list.public_view'|trans }}</a>
{% endif %} {% endif %}
{% if not templatesOnly and survey.draftUrl and not survey.published %} {% if survey.draftUrl and not survey.published %}
<a class="survey-button secondary" href="{{ survey.draftUrl }}" target="_blank" rel="noreferrer">{{ 'survey.list.draft_view'|trans }}</a> <a class="survey-button secondary" href="{{ survey.draftUrl }}" target="_blank" rel="noreferrer">{{ 'survey.list.draft_view'|trans }}</a>
{% endif %} {% endif %}
{% if not templatesOnly and survey.resultsUrl %} {% if survey.resultsUrl %}
<a class="survey-button secondary" href="{{ survey.resultsUrl }}" target="_blank" rel="noreferrer">{{ 'survey.list.show_results'|trans }}</a> <a class="survey-button secondary" href="{{ survey.resultsUrl }}" target="_blank" rel="noreferrer">{{ 'survey.list.show_results'|trans }}</a>
{% endif %} {% endif %}
<form method="post" class="survey-question-action-form"> <form method="post" class="survey-question-action-form">
@@ -69,50 +85,49 @@
<input type="hidden" name="_token" value="{{ csrf_token('duplicate-survey-' ~ survey.id) }}"> <input type="hidden" name="_token" value="{{ csrf_token('duplicate-survey-' ~ survey.id) }}">
<button class="survey-button secondary" onclick="return confirm('{{ 'survey.list.duplicate_confirm'|trans({'%title%': survey.title|striptags|trim})|e('js') }}');">{{ 'survey.list.duplicate'|trans }}</button> <button class="survey-button secondary" onclick="return confirm('{{ 'survey.list.duplicate_confirm'|trans({'%title%': survey.title|striptags|trim})|e('js') }}');">{{ 'survey.list.duplicate'|trans }}</button>
</form> </form>
{% if not templatesOnly %} <form method="post" class="survey-question-action-form">
<form method="post" class="survey-question-action-form"> <input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}">
<input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}"> <input type="hidden" name="_survey_action" value="delete-survey">
<input type="hidden" name="_survey_action" value="delete-survey"> <input type="hidden" name="item_id" value="{{ survey.id }}">
<input type="hidden" name="item_id" value="{{ survey.id }}"> <input type="hidden" name="_token" value="{{ csrf_token('delete-survey-' ~ survey.id) }}">
<input type="hidden" name="_token" value="{{ csrf_token('delete-survey-' ~ survey.id) }}"> <button class="survey-button danger" onclick="return confirm('{{ 'survey.list.delete_confirm'|trans|e('js') }}') && confirm('{{ 'survey.list.delete_confirm_second'|trans|e('js') }}');">{{ 'survey.list.delete'|trans }}</button>
<button class="survey-button danger" onclick="return confirm('{{ 'survey.list.delete_confirm'|trans|e('js') }}') && confirm('{{ 'survey.list.delete_confirm_second'|trans|e('js') }}');">{{ 'survey.list.delete'|trans }}</button> </form>
</form>
{% endif %}
</div> </div>
{% if not templatesOnly %} <div class="survey-list-card__head-actions">
<div class="survey-list-card__head-actions"> <form method="post" class="survey-list-publish-form">
<form method="post" class="survey-list-publish-form"> <input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}">
<input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}"> <input type="hidden" name="_survey_action" value="publish-survey">
<input type="hidden" name="_survey_action" value="publish-survey"> <input type="hidden" name="item_id" value="{{ survey.id }}">
<input type="hidden" name="item_id" value="{{ survey.id }}"> <input type="hidden" name="_token" value="{{ csrf_token('publish-survey-' ~ survey.id) }}">
<input type="hidden" name="_token" value="{{ csrf_token('publish-survey-' ~ survey.id) }}"> <button
<button type="submit"
type="submit" class="survey-button primary survey-list-publish-button"
class="survey-button primary survey-list-publish-button" {% if survey.published %}disabled{% endif %}
{% if survey.published %}disabled{% endif %} {% if not survey.published %}onclick="return confirm('{{ 'survey.edit.publish_confirm'|trans|e('js') }}');"{% endif %}
{% if not survey.published %}onclick="return confirm('{{ 'survey.edit.publish_confirm'|trans|e('js') }}');"{% endif %} >
> {{ survey.published ? 'survey.list.publish_done'|trans : 'survey.list.publish'|trans }}
{{ survey.published ? 'survey.list.publish_done'|trans : 'survey.list.publish'|trans }} </button>
</button> {% if not survey.published %}
{% if not survey.published %} <span class="survey-list-publish-help">{{ 'survey.list.publish_help'|trans }}</span>
<span class="survey-list-publish-help">{{ 'survey.list.publish_help'|trans }}</span> {% endif %}
{% endif %} </form>
</form>
<form method="post" class="survey-list-eye-form"> <form method="post" class="survey-list-eye-form">
<input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}"> <input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}">
<input type="hidden" name="_survey_action" value="toggle-active"> <input type="hidden" name="_survey_action" value="toggle-active">
<input type="hidden" name="item_id" value="{{ survey.id }}"> <input type="hidden" name="item_id" value="{{ survey.id }}">
<input type="hidden" name="_token" value="{{ csrf_token('toggle-active-' ~ survey.id) }}"> <input type="hidden" name="_token" value="{{ csrf_token('toggle-active-' ~ survey.id) }}">
<button type="submit" class="survey-visibility-dot{{ survey.isActive ? ' is-on' : '' }}" title="{{ survey.isActive ? 'survey.edit.deactivate_survey'|trans : 'survey.edit.activate_survey'|trans }}" aria-label="{{ survey.isActive ? 'survey.edit.deactivate_survey'|trans : 'survey.edit.activate_survey'|trans }}"></button> <button type="submit" class="survey-visibility-dot{{ survey.isActive ? ' is-on' : '' }}" title="{{ survey.isActive ? 'survey.edit.deactivate_survey'|trans : 'survey.edit.activate_survey'|trans }}" aria-label="{{ survey.isActive ? 'survey.edit.deactivate_survey'|trans : 'survey.edit.activate_survey'|trans }}"></button>
</form> </form>
</div> </div>
{% endif %}
</div> </div>
{% endif %}
</article> </article>
{% else %} {% else %}
<div class="survey-card">{{ 'survey.list.empty'|trans }}</div> {% if not templatesOnly %}
<div class="survey-card">{{ 'survey.list.empty'|trans }}</div>
{% endif %}
{% endfor %} {% endfor %}
</div> </div>
{% endif %} {% endif %}
@@ -61,7 +61,7 @@ final class MemberSurveyListController extends AbstractFrontendModuleController
'id' => $surveyId, 'id' => $surveyId,
'title' => (string) $survey['title'], 'title' => (string) $survey['title'],
'description' => (string) ($survey['description'] ?? ''), 'description' => (string) ($survey['description'] ?? ''),
'isTemplate' => !empty($survey['isTemplate']), 'isTemplate' => !empty($survey['isTemplate']),
'isActive' => !empty($survey['isActive']), 'isActive' => !empty($survey['isActive']),
'isLocked' => !empty($survey['isLocked']), 'isLocked' => !empty($survey['isLocked']),
'published' => !empty($survey['published']), 'published' => !empty($survey['published']),
@@ -74,6 +74,10 @@ final class MemberSurveyListController extends AbstractFrontendModuleController
]; ];
} }
if ($templatesOnly && [] === $items) {
return new Response('');
}
$template->set('loginRequired', false); $template->set('loginRequired', false);
$template->set('surveys', $items); $template->set('surveys', $items);
$template->set('createUrl', !$templatesOnly && $editPage instanceof PageModel ? $this->generateContentUrl($editPage, ['create' => '1']) : null); $template->set('createUrl', !$templatesOnly && $editPage instanceof PageModel ? $this->generateContentUrl($editPage, ['create' => '1']) : null);