Initial survey bundle import
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
$GLOBALS['TL_CSS'][] = 'assets/survey-backend.css|static';
|
||||
|
||||
$GLOBALS['TL_MODELS']['tl_survey'] = Mummert\SurveyBundle\Model\SurveyModel::class;
|
||||
$GLOBALS['TL_MODELS']['tl_survey_category'] = Mummert\SurveyBundle\Model\SurveyCategoryModel::class;
|
||||
$GLOBALS['TL_MODELS']['tl_survey_content'] = Mummert\SurveyBundle\Model\SurveyContentModel::class;
|
||||
$GLOBALS['TL_MODELS']['tl_survey_condition'] = Mummert\SurveyBundle\Model\SurveyConditionModel::class;
|
||||
$GLOBALS['TL_MODELS']['tl_survey_submission'] = Mummert\SurveyBundle\Model\SurveySubmissionModel::class;
|
||||
$GLOBALS['TL_MODELS']['tl_survey_answer'] = Mummert\SurveyBundle\Model\SurveyAnswerModel::class;
|
||||
$GLOBALS['TL_MODELS']['tl_survey_editor'] = Mummert\SurveyBundle\Model\SurveyEditorModel::class;
|
||||
|
||||
$GLOBALS['BE_MOD']['content']['survey_bundle_surveys'] = [
|
||||
'tables' => ['tl_survey', 'tl_survey_content', 'tl_survey_condition', 'tl_survey_editor', 'tl_survey_submission', 'tl_survey_answer'],
|
||||
];
|
||||
|
||||
$GLOBALS['BE_MOD']['content']['survey_bundle_categories'] = [
|
||||
'tables' => ['tl_survey_category'],
|
||||
];
|
||||
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Contao\CoreBundle\DataContainer\PaletteManipulator;
|
||||
use Mummert\SurveyBundle\EventListener\SurveyDcaListener;
|
||||
|
||||
if (isset($GLOBALS['TL_DCA']['tl_member']['palettes']) && is_array($GLOBALS['TL_DCA']['tl_member']['palettes'])) {
|
||||
foreach (array_keys($GLOBALS['TL_DCA']['tl_member']['palettes']) as $paletteName) {
|
||||
if ('__selector__' === $paletteName) {
|
||||
continue;
|
||||
}
|
||||
|
||||
PaletteManipulator::create()
|
||||
->addLegend('survey_legend', 'contact_legend', PaletteManipulator::POSITION_AFTER)
|
||||
->addField('surveyCategories', 'survey_legend', PaletteManipulator::POSITION_APPEND)
|
||||
->addField('assignedSurveys', 'survey_legend', PaletteManipulator::POSITION_APPEND)
|
||||
->applyToPalette((string) $paletteName, 'tl_member');
|
||||
}
|
||||
}
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_member']['config']['onsubmit_callback'][] = [SurveyDcaListener::class, 'refreshMemberSurveyListMetadata'];
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_member']['fields']['surveyCategories'] = [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_member']['surveyCategories'],
|
||||
'exclude' => true,
|
||||
'inputType' => 'select',
|
||||
'foreignKey' => 'tl_survey_category.title',
|
||||
'eval' => ['multiple' => true, 'chosen' => true, 'tl_class' => 'clr'],
|
||||
'relation' => [
|
||||
'type' => 'hasMany',
|
||||
'load' => 'lazy',
|
||||
'table' => 'tl_survey_category',
|
||||
'field' => 'id',
|
||||
],
|
||||
'save_callback' => [
|
||||
[SurveyDcaListener::class, 'saveMemberSurveyCategories'],
|
||||
],
|
||||
'sql' => 'blob NULL',
|
||||
];
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_member']['fields']['assignedSurveys'] = [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_member']['assignedSurveys'],
|
||||
'exclude' => true,
|
||||
'inputType' => 'select',
|
||||
'options_callback' => [SurveyDcaListener::class, 'getSurveyOptions'],
|
||||
'eval' => ['multiple' => true, 'chosen' => true, 'tl_class' => 'clr'],
|
||||
'load_callback' => [
|
||||
[SurveyDcaListener::class, 'loadMemberAssignedSurveys'],
|
||||
],
|
||||
'save_callback' => [
|
||||
[SurveyDcaListener::class, 'saveMemberAssignedSurveys'],
|
||||
],
|
||||
'sql' => 'blob NULL',
|
||||
];
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_module']['palettes']['member_survey_list'] = '{title_legend},name,headline,type;{survey_navigation_legend},surveyEditPage;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
|
||||
$GLOBALS['TL_DCA']['tl_module']['palettes']['member_survey_edit'] = '{title_legend},name,headline,type;{survey_navigation_legend},surveyListPage;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID';
|
||||
$GLOBALS['TL_DCA']['tl_module']['palettes']['show_survey'] = '{title_legend},name,headline,type;{expert_legend:hide},guests,cssID';
|
||||
$GLOBALS['TL_DCA']['tl_module']['palettes']['survey_results'] = '{title_legend},name,headline,type;{expert_legend:hide},guests,cssID';
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_module']['fields']['surveyEditPage'] = [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_module']['surveyEditPage'],
|
||||
'exclude' => true,
|
||||
'inputType' => 'pageTree',
|
||||
'eval' => ['fieldType' => 'radio', 'mandatory' => true, 'tl_class' => 'w50'],
|
||||
'sql' => ['type' => 'integer', 'unsigned' => true, 'default' => 0],
|
||||
];
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_module']['fields']['surveyListPage'] = [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_module']['surveyListPage'],
|
||||
'exclude' => true,
|
||||
'inputType' => 'pageTree',
|
||||
'eval' => ['fieldType' => 'radio', 'mandatory' => false, 'tl_class' => 'w50'],
|
||||
'sql' => ['type' => 'integer', 'unsigned' => true, 'default' => 0],
|
||||
];
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_module']['fields']['surveyReaderPage'] = [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_module']['surveyReaderPage'],
|
||||
'exclude' => true,
|
||||
'inputType' => 'pageTree',
|
||||
'eval' => ['fieldType' => 'radio', 'mandatory' => false, 'tl_class' => 'w50'],
|
||||
'sql' => ['type' => 'integer', 'unsigned' => true, 'default' => 0],
|
||||
];
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Contao\CoreBundle\DataContainer\PaletteManipulator;
|
||||
|
||||
PaletteManipulator::create()
|
||||
->addLegend('survey_settings_legend', null, PaletteManipulator::POSITION_AFTER, true)
|
||||
->addField('surveyReaderPage', 'survey_settings_legend')
|
||||
->addField('surveyResultsPage', 'survey_settings_legend')
|
||||
->addField('surveyGotenbergUrl', 'survey_settings_legend')
|
||||
->applyToPalette('default', 'tl_settings');
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_settings']['fields']['surveyReaderPage'] = [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_settings']['surveyReaderPage'],
|
||||
'inputType' => 'pageTree',
|
||||
'eval' => ['fieldType' => 'radio', 'tl_class' => 'w50'],
|
||||
];
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_settings']['fields']['surveyResultsPage'] = [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_settings']['surveyResultsPage'],
|
||||
'inputType' => 'pageTree',
|
||||
'eval' => ['fieldType' => 'radio', 'tl_class' => 'w50'],
|
||||
];
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_settings']['fields']['surveyGotenbergUrl'] = [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_settings']['surveyGotenbergUrl'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['rgxp' => 'url', 'decodeEntities' => true, 'maxlength' => 255, 'tl_class' => 'w50 clr'],
|
||||
];
|
||||
@@ -0,0 +1,212 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Contao\DC_Table;
|
||||
use Contao\System;
|
||||
use Mummert\SurveyBundle\EventListener\SurveyDcaListener;
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_survey'] = [
|
||||
'config' => [
|
||||
'dataContainer' => DC_Table::class,
|
||||
'ctable' => ['tl_survey_content', 'tl_survey_condition', 'tl_survey_editor', 'tl_survey_submission'],
|
||||
'enableVersioning' => true,
|
||||
'onload_callback' => [
|
||||
[SurveyDcaListener::class, 'refreshSurveyBackendStateIndex'],
|
||||
],
|
||||
'onsubmit_callback' => [
|
||||
[SurveyDcaListener::class, 'persistSurveyBackendState'],
|
||||
],
|
||||
'sql' => [
|
||||
'keys' => [
|
||||
'id' => 'primary',
|
||||
'alias' => 'unique',
|
||||
'published' => 'index',
|
||||
],
|
||||
],
|
||||
],
|
||||
'list' => [
|
||||
'sorting' => [
|
||||
'mode' => 1,
|
||||
'fields' => ['title'],
|
||||
'flag' => 1,
|
||||
'panelLayout' => 'filter;sort,search,limit',
|
||||
],
|
||||
'label' => [
|
||||
'fields' => ['title', 'categorySummary', 'assignedMembersSummary'],
|
||||
'showColumns' => true,
|
||||
],
|
||||
'global_operations' => [
|
||||
'all' => [
|
||||
'href' => 'act=select',
|
||||
'class' => 'header_edit_all',
|
||||
'attributes' => 'onclick="Backend.getScrollOffset()" accesskey="e"',
|
||||
],
|
||||
],
|
||||
'operations' => [
|
||||
'edit' => [
|
||||
'href' => 'table=tl_survey_content',
|
||||
'icon' => 'children.svg',
|
||||
],
|
||||
'editheader' => [
|
||||
'href' => 'act=edit',
|
||||
'icon' => 'header.svg',
|
||||
],
|
||||
'delete' => [
|
||||
'href' => 'act=delete',
|
||||
'icon' => 'delete.svg',
|
||||
'attributes' => 'onclick="if(!confirm(\'Eintrag wirklich loeschen?\'))return false;Backend.getScrollOffset()"',
|
||||
],
|
||||
'show' => [
|
||||
'href' => 'act=show',
|
||||
'icon' => 'show.svg',
|
||||
],
|
||||
'copyPublicLink' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['copyPublicLink'],
|
||||
'icon' => 'copy.svg',
|
||||
'button_callback' => [SurveyDcaListener::class, 'generateCopyPublicLinkButton'],
|
||||
],
|
||||
'showResults' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['showResults'],
|
||||
'icon' => 'show.svg',
|
||||
'button_callback' => [SurveyDcaListener::class, 'generateShowResultsButton'],
|
||||
],
|
||||
],
|
||||
],
|
||||
'palettes' => [
|
||||
'default' => '{title_legend},title,alias,category,description;{assignment_legend},assignedMembers;{publishing_legend},published,isLocked;{meta_legend},createdAt,updatedAt',
|
||||
],
|
||||
'fields' => [
|
||||
'id' => [
|
||||
'sql' => 'int(10) unsigned NOT NULL auto_increment',
|
||||
],
|
||||
'tstamp' => [
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
'title' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['title'],
|
||||
'inputType' => 'text',
|
||||
'search' => true,
|
||||
'eval' => ['mandatory' => true, 'maxlength' => 255, 'tl_class' => 'w50'],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'alias' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['alias'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['maxlength' => 20, 'readonly' => true, 'alwaysSave' => true, 'tl_class' => 'w50'],
|
||||
'save_callback' => [[SurveyDcaListener::class, 'generateSurveyAlias']],
|
||||
'sql' => "varchar(20) NOT NULL default ''",
|
||||
],
|
||||
'description' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['description'],
|
||||
'inputType' => 'textarea',
|
||||
'eval' => ['rte' => 'tinyMCE', 'tl_class' => 'clr'],
|
||||
'sql' => 'text NULL',
|
||||
],
|
||||
'category' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['category'],
|
||||
'inputType' => 'select',
|
||||
'foreignKey' => 'tl_survey_category.title',
|
||||
'eval' => ['multiple' => true, 'chosen' => true, 'tl_class' => 'clr'],
|
||||
'relation' => ['type' => 'hasMany', 'load' => 'lazy', 'table' => 'tl_survey_category', 'field' => 'id'],
|
||||
'sql' => 'blob NULL',
|
||||
],
|
||||
'categoryFilter' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['categoryFilter'],
|
||||
'filter' => true,
|
||||
'inputType' => 'select',
|
||||
'options_callback' => [SurveyDcaListener::class, 'getCategoryOptions'],
|
||||
'eval' => ['includeBlankOption' => true, 'chosen' => true, 'findInSet' => true],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'categorySummary' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['categorySummary'],
|
||||
'sql' => 'text NULL',
|
||||
],
|
||||
'published' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['published'],
|
||||
'inputType' => 'checkbox',
|
||||
'eval' => ['tl_class' => 'w50 m12'],
|
||||
'sql' => "char(1) NOT NULL default ''",
|
||||
],
|
||||
'isLocked' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['isLocked'],
|
||||
'inputType' => 'checkbox',
|
||||
'eval' => ['tl_class' => 'w50 m12'],
|
||||
'sql' => "char(1) NOT NULL default ''",
|
||||
],
|
||||
'assignedMembers' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['assignedMembers'],
|
||||
'inputType' => 'select',
|
||||
'options_callback' => [Mummert\SurveyBundle\EventListener\SurveyDcaListener::class, 'getMemberOptions'],
|
||||
'eval' => ['multiple' => true, 'chosen' => true, 'tl_class' => 'clr'],
|
||||
'load_callback' => [[Mummert\SurveyBundle\EventListener\SurveyDcaListener::class, 'loadSurveyAssignedMembers']],
|
||||
'save_callback' => [[Mummert\SurveyBundle\EventListener\SurveyDcaListener::class, 'saveSurveyAssignedMembers']],
|
||||
'sql' => 'blob NULL',
|
||||
],
|
||||
'assignedMembersFilter' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['assignedMembersFilter'],
|
||||
'filter' => true,
|
||||
'inputType' => 'select',
|
||||
'options_callback' => [SurveyDcaListener::class, 'getMemberOptions'],
|
||||
'eval' => ['includeBlankOption' => true, 'chosen' => true, 'findInSet' => true],
|
||||
'sql' => 'text NULL',
|
||||
],
|
||||
'assignedMembersSummary' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['assignedMembersSummary'],
|
||||
'sql' => 'text NULL',
|
||||
],
|
||||
'createdBy' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['createdBy'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['readonly' => true, 'tl_class' => 'w50'],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
'updatedBy' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['updatedBy'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['readonly' => true, 'tl_class' => 'w50'],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
'createdAt' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['createdAt'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['rgxp' => 'datim', 'readonly' => true, 'tl_class' => 'w50'],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
'updatedAt' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey']['updatedAt'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['rgxp' => 'datim', 'readonly' => true, 'tl_class' => 'w50'],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
if ('cli' !== PHP_SAPI) {
|
||||
$hasListMetadataColumns = false;
|
||||
|
||||
try {
|
||||
$columnNames = array_map(
|
||||
static fn (string $columnName): string => strtolower($columnName),
|
||||
System::getContainer()->get('database_connection')->fetchFirstColumn('SHOW COLUMNS FROM tl_survey'),
|
||||
);
|
||||
$hasListMetadataColumns = !array_diff(
|
||||
['categoryfilter', 'categorysummary', 'assignedmembersfilter', 'assignedmemberssummary'],
|
||||
$columnNames,
|
||||
);
|
||||
} catch (\Throwable) {
|
||||
$hasListMetadataColumns = false;
|
||||
}
|
||||
|
||||
if (!$hasListMetadataColumns) {
|
||||
$GLOBALS['TL_DCA']['tl_survey']['list']['label']['fields'] = ['title', 'alias'];
|
||||
|
||||
unset(
|
||||
$GLOBALS['TL_DCA']['tl_survey']['fields']['categoryFilter'],
|
||||
$GLOBALS['TL_DCA']['tl_survey']['fields']['categorySummary'],
|
||||
$GLOBALS['TL_DCA']['tl_survey']['fields']['assignedMembersFilter'],
|
||||
$GLOBALS['TL_DCA']['tl_survey']['fields']['assignedMembersSummary'],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Contao\DC_Table;
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_survey_answer'] = [
|
||||
'config' => [
|
||||
'dataContainer' => DC_Table::class,
|
||||
'ptable' => 'tl_survey_submission',
|
||||
'closed' => true,
|
||||
'notCreatable' => true,
|
||||
'notEditable' => true,
|
||||
'notCopyable' => true,
|
||||
'sql' => [
|
||||
'keys' => [
|
||||
'id' => 'primary',
|
||||
'pid' => 'index',
|
||||
'submission' => 'index',
|
||||
'question' => 'index',
|
||||
],
|
||||
],
|
||||
],
|
||||
'list' => [
|
||||
'sorting' => [
|
||||
'mode' => 4,
|
||||
'fields' => ['id'],
|
||||
'headerFields' => ['token', 'startedAt', 'completedAt'],
|
||||
'panelLayout' => 'sort,search,limit',
|
||||
],
|
||||
'label' => [
|
||||
'fields' => ['question', 'questionType', 'value'],
|
||||
'showColumns' => true,
|
||||
],
|
||||
'operations' => [
|
||||
'show' => [
|
||||
'href' => 'act=show',
|
||||
'icon' => 'show.svg',
|
||||
],
|
||||
],
|
||||
],
|
||||
'fields' => [
|
||||
'id' => ['sql' => 'int(10) unsigned NOT NULL auto_increment'],
|
||||
'tstamp' => ['sql' => 'int(10) unsigned NOT NULL default 0'],
|
||||
'pid' => ['sql' => 'int(10) unsigned NOT NULL default 0'],
|
||||
'submission' => ['sql' => 'int(10) unsigned NOT NULL default 0'],
|
||||
'question' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_answer']['question'],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
'questionType' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_answer']['questionType'],
|
||||
'sql' => "varchar(32) NOT NULL default ''",
|
||||
],
|
||||
'value' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_answer']['value'],
|
||||
'sql' => 'text NULL',
|
||||
],
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Contao\DC_Table;
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_survey_category'] = [
|
||||
'config' => [
|
||||
'dataContainer' => DC_Table::class,
|
||||
'enableVersioning' => true,
|
||||
'sql' => [
|
||||
'keys' => [
|
||||
'id' => 'primary',
|
||||
'alias' => 'index',
|
||||
'sorting' => 'index',
|
||||
],
|
||||
],
|
||||
],
|
||||
'list' => [
|
||||
'sorting' => [
|
||||
'mode' => 1,
|
||||
'fields' => ['sorting'],
|
||||
'panelLayout' => 'sort,search,limit',
|
||||
],
|
||||
'label' => [
|
||||
'fields' => ['title', 'alias'],
|
||||
'showColumns' => true,
|
||||
],
|
||||
'operations' => [
|
||||
'edit' => [
|
||||
'href' => 'act=edit',
|
||||
'icon' => 'edit.svg',
|
||||
],
|
||||
'delete' => [
|
||||
'href' => 'act=delete',
|
||||
'icon' => 'delete.svg',
|
||||
'attributes' => 'onclick="if(!confirm(\'Eintrag wirklich loeschen?\'))return false;Backend.getScrollOffset()"',
|
||||
],
|
||||
'show' => [
|
||||
'href' => 'act=show',
|
||||
'icon' => 'show.svg',
|
||||
],
|
||||
],
|
||||
],
|
||||
'palettes' => [
|
||||
'default' => '{title_legend},title,alias,sorting',
|
||||
],
|
||||
'fields' => [
|
||||
'id' => ['sql' => 'int(10) unsigned NOT NULL auto_increment'],
|
||||
'tstamp' => ['sql' => 'int(10) unsigned NOT NULL default 0'],
|
||||
'title' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_category']['title'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['mandatory' => true, 'maxlength' => 255, 'tl_class' => 'w50'],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'alias' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_category']['alias'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['maxlength' => 128, 'tl_class' => 'w50'],
|
||||
'sql' => "varchar(128) NOT NULL default ''",
|
||||
],
|
||||
'sorting' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_category']['sorting'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['rgxp' => 'natural', 'tl_class' => 'w50'],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Contao\DC_Table;
|
||||
use Mummert\SurveyBundle\EventListener\SurveyDcaListener;
|
||||
|
||||
$guardCallback = [SurveyDcaListener::class, 'guardConditionSave'];
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_survey_condition'] = [
|
||||
'config' => [
|
||||
'dataContainer' => DC_Table::class,
|
||||
'ptable' => 'tl_survey',
|
||||
'enableVersioning' => true,
|
||||
'onsubmit_callback' => [
|
||||
[SurveyDcaListener::class, 'touchSurveyConditionParent'],
|
||||
],
|
||||
'ondelete_callback' => [
|
||||
[SurveyDcaListener::class, 'guardConditionDelete'],
|
||||
[SurveyDcaListener::class, 'touchSurveyConditionParent'],
|
||||
],
|
||||
'sql' => [
|
||||
'keys' => [
|
||||
'id' => 'primary',
|
||||
'pid' => 'index',
|
||||
'sourceQuestion' => 'index',
|
||||
'targetQuestion' => 'index',
|
||||
],
|
||||
],
|
||||
],
|
||||
'list' => [
|
||||
'sorting' => [
|
||||
'mode' => 4,
|
||||
'fields' => ['id'],
|
||||
'headerFields' => ['title', 'alias', 'published', 'isLocked'],
|
||||
'panelLayout' => 'sort,search,limit',
|
||||
],
|
||||
'label' => [
|
||||
'fields' => ['sourceQuestion', 'answerValue', 'targetQuestion'],
|
||||
'showColumns' => true,
|
||||
],
|
||||
'operations' => [
|
||||
'edit' => [
|
||||
'href' => 'act=edit',
|
||||
'icon' => 'edit.svg',
|
||||
],
|
||||
'copy' => [
|
||||
'href' => 'act=copy',
|
||||
'icon' => 'copy.svg',
|
||||
],
|
||||
'delete' => [
|
||||
'href' => 'act=delete',
|
||||
'icon' => 'delete.svg',
|
||||
'attributes' => 'onclick="if(!confirm(\'Eintrag wirklich loeschen?\'))return false;Backend.getScrollOffset()"',
|
||||
],
|
||||
'show' => [
|
||||
'href' => 'act=show',
|
||||
'icon' => 'show.svg',
|
||||
],
|
||||
],
|
||||
],
|
||||
'palettes' => [
|
||||
'default' => '{logic_legend},sourceQuestion,answerValue,targetQuestion',
|
||||
],
|
||||
'fields' => [
|
||||
'id' => ['sql' => 'int(10) unsigned NOT NULL auto_increment'],
|
||||
'tstamp' => ['sql' => 'int(10) unsigned NOT NULL default 0'],
|
||||
'pid' => ['sql' => 'int(10) unsigned NOT NULL default 0'],
|
||||
'sourceQuestion' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_condition']['sourceQuestion'],
|
||||
'inputType' => 'select',
|
||||
'options_callback' => [SurveyDcaListener::class, 'getQuestionOptions'],
|
||||
'eval' => ['mandatory' => true, 'includeBlankOption' => true, 'chosen' => true, 'tl_class' => 'w50'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
'answerValue' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_condition']['answerValue'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['mandatory' => true, 'maxlength' => 255, 'tl_class' => 'w50'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'targetQuestion' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_condition']['targetQuestion'],
|
||||
'inputType' => 'select',
|
||||
'options_callback' => [SurveyDcaListener::class, 'getQuestionOptions'],
|
||||
'eval' => ['mandatory' => true, 'includeBlankOption' => true, 'chosen' => true, 'tl_class' => 'clr'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,241 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Contao\DC_Table;
|
||||
use Mummert\SurveyBundle\EventListener\SurveyDcaListener;
|
||||
|
||||
$guardCallback = [SurveyDcaListener::class, 'guardContentSave'];
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_survey_content'] = [
|
||||
'config' => [
|
||||
'dataContainer' => DC_Table::class,
|
||||
'ptable' => 'tl_survey',
|
||||
'enableVersioning' => true,
|
||||
'onsubmit_callback' => [
|
||||
[SurveyDcaListener::class, 'touchSurveyContentParent'],
|
||||
],
|
||||
'onpalette_callback' => [
|
||||
[SurveyDcaListener::class, 'resolveSurveyContentPalette'],
|
||||
],
|
||||
'ondelete_callback' => [
|
||||
[SurveyDcaListener::class, 'guardContentDelete'],
|
||||
[SurveyDcaListener::class, 'touchSurveyContentParent'],
|
||||
],
|
||||
'sql' => [
|
||||
'keys' => [
|
||||
'id' => 'primary',
|
||||
'pid' => 'index',
|
||||
'sorting' => 'index',
|
||||
'published' => 'index',
|
||||
],
|
||||
],
|
||||
],
|
||||
'list' => [
|
||||
'sorting' => [
|
||||
'mode' => 4,
|
||||
'fields' => ['sorting'],
|
||||
'headerFields' => ['title', 'alias', 'published', 'isLocked'],
|
||||
'child_record_class' => 'survey-question-record',
|
||||
'panelLayout' => 'sort,search,limit',
|
||||
],
|
||||
'label' => [
|
||||
'fields' => ['question', 'type'],
|
||||
'showColumns' => true,
|
||||
],
|
||||
'operations' => [
|
||||
'edit' => [
|
||||
'href' => 'act=edit',
|
||||
'icon' => 'edit.svg',
|
||||
],
|
||||
'copy' => [
|
||||
'href' => 'act=copy',
|
||||
'icon' => 'copy.svg',
|
||||
],
|
||||
'delete' => [
|
||||
'href' => 'act=delete',
|
||||
'icon' => 'delete.svg',
|
||||
'attributes' => 'onclick="if(!confirm(\'Eintrag wirklich loeschen?\'))return false;Backend.getScrollOffset()"',
|
||||
],
|
||||
'show' => [
|
||||
'href' => 'act=show',
|
||||
'icon' => 'show.svg',
|
||||
],
|
||||
],
|
||||
],
|
||||
'palettes' => [
|
||||
'default' => '{question_legend},type,question,description;{settings_legend},mandatory,published',
|
||||
'yes_no_maybe' => '{question_legend},type,question,description;{settings_legend},mandatory,published,allowMaybe,jumpOnYes,jumpOnNo',
|
||||
'text' => '{question_legend},type,question,description;{settings_legend},mandatory,published',
|
||||
'range' => '{question_legend},type,question,description;{settings_legend},mandatory,published,rangeMin,rangeMax,rangeStep',
|
||||
'choice' => '{question_legend},type,question,description;{settings_legend},mandatory,published,allowMultiple,answerOption1,answerOption2,answerOption3,answerOption4,answerOption5,answerOption6,answerOption7,answerOption8,answerOption9,answerOption10',
|
||||
],
|
||||
'fields' => [
|
||||
'id' => ['sql' => 'int(10) unsigned NOT NULL auto_increment'],
|
||||
'tstamp' => ['sql' => 'int(10) unsigned NOT NULL default 0'],
|
||||
'pid' => ['sql' => 'int(10) unsigned NOT NULL default 0'],
|
||||
'sorting' => [
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
'type' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['type'],
|
||||
'inputType' => 'select',
|
||||
'options' => ['yes_no_maybe', 'text', 'range', 'choice'],
|
||||
'reference' => &$GLOBALS['TL_LANG']['tl_survey_content']['types'],
|
||||
'eval' => ['mandatory' => true, 'includeBlankOption' => true, 'submitOnChange' => true, 'chosen' => true, 'tl_class' => 'w50'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "varchar(32) NOT NULL default ''",
|
||||
],
|
||||
'question' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['question'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['mandatory' => true, 'maxlength' => 255, 'tl_class' => 'clr'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'description' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['description'],
|
||||
'inputType' => 'textarea',
|
||||
'eval' => ['tl_class' => 'clr'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => 'text NULL',
|
||||
],
|
||||
'mandatory' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['mandatory'],
|
||||
'inputType' => 'checkbox',
|
||||
'default' => '1',
|
||||
'eval' => ['tl_class' => 'w50 m12'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "char(1) NOT NULL default ''",
|
||||
],
|
||||
'published' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['published'],
|
||||
'inputType' => 'checkbox',
|
||||
'default' => '1',
|
||||
'eval' => ['tl_class' => 'w50 m12'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "char(1) NOT NULL default ''",
|
||||
],
|
||||
'allowMaybe' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['allowMaybe'],
|
||||
'inputType' => 'checkbox',
|
||||
'eval' => ['tl_class' => 'w50 m12 clr'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "char(1) NOT NULL default ''",
|
||||
],
|
||||
'jumpOnYes' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['jumpOnYes'],
|
||||
'inputType' => 'select',
|
||||
'options_callback' => [SurveyDcaListener::class, 'getQuestionOptionsForContent'],
|
||||
'eval' => ['includeBlankOption' => true, 'chosen' => true, 'tl_class' => 'w50 clr'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
'jumpOnNo' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['jumpOnNo'],
|
||||
'inputType' => 'select',
|
||||
'options_callback' => [SurveyDcaListener::class, 'getQuestionOptionsForContent'],
|
||||
'eval' => ['includeBlankOption' => true, 'chosen' => true, 'tl_class' => 'w50'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
'allowMultiple' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['allowMultiple'],
|
||||
'inputType' => 'checkbox',
|
||||
'eval' => ['tl_class' => 'w50 m12 clr'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "char(1) NOT NULL default ''",
|
||||
],
|
||||
'answerOption1' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['answerOption1'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['maxlength' => 255, 'tl_class' => 'w50 clr'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'answerOption2' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['answerOption2'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['maxlength' => 255, 'tl_class' => 'w50'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'answerOption3' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['answerOption3'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['maxlength' => 255, 'tl_class' => 'w50 clr'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'answerOption4' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['answerOption4'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['maxlength' => 255, 'tl_class' => 'w50'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'answerOption5' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['answerOption5'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['maxlength' => 255, 'tl_class' => 'w50 clr'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'answerOption6' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['answerOption6'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['maxlength' => 255, 'tl_class' => 'w50'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'answerOption7' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['answerOption7'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['maxlength' => 255, 'tl_class' => 'w50 clr'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'answerOption8' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['answerOption8'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['maxlength' => 255, 'tl_class' => 'w50'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'answerOption9' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['answerOption9'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['maxlength' => 255, 'tl_class' => 'w50 clr'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'answerOption10' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['answerOption10'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['maxlength' => 255, 'tl_class' => 'w50'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => "varchar(255) NOT NULL default ''",
|
||||
],
|
||||
'rangeMin' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['rangeMin'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['rgxp' => 'digit', 'tl_class' => 'w50'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => 'int(10) NOT NULL default 0',
|
||||
],
|
||||
'rangeMax' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['rangeMax'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['rgxp' => 'digit', 'tl_class' => 'w50'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => 'int(10) NOT NULL default 10',
|
||||
],
|
||||
'rangeStep' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_content']['rangeStep'],
|
||||
'inputType' => 'text',
|
||||
'eval' => ['rgxp' => 'digit', 'tl_class' => 'w50'],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 1',
|
||||
],
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Contao\DC_Table;
|
||||
use Mummert\SurveyBundle\EventListener\SurveyDcaListener;
|
||||
|
||||
$guardCallback = [SurveyDcaListener::class, 'guardEditorSave'];
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_survey_editor'] = [
|
||||
'config' => [
|
||||
'dataContainer' => DC_Table::class,
|
||||
'ptable' => 'tl_survey',
|
||||
'enableVersioning' => true,
|
||||
'ondelete_callback' => [
|
||||
[SurveyDcaListener::class, 'guardEditorDelete'],
|
||||
],
|
||||
'sql' => [
|
||||
'keys' => [
|
||||
'id' => 'primary',
|
||||
'pid' => 'index',
|
||||
'survey' => 'index',
|
||||
'member' => 'index',
|
||||
],
|
||||
],
|
||||
],
|
||||
'list' => [
|
||||
'sorting' => [
|
||||
'mode' => 4,
|
||||
'fields' => ['member'],
|
||||
'headerFields' => ['title', 'alias', 'isLocked'],
|
||||
'panelLayout' => 'sort,search,limit',
|
||||
],
|
||||
'label' => [
|
||||
'fields' => ['member'],
|
||||
'showColumns' => true,
|
||||
],
|
||||
'operations' => [
|
||||
'edit' => [
|
||||
'href' => 'act=edit',
|
||||
'icon' => 'edit.svg',
|
||||
],
|
||||
'copy' => [
|
||||
'href' => 'act=copy',
|
||||
'icon' => 'copy.svg',
|
||||
],
|
||||
'delete' => [
|
||||
'href' => 'act=delete',
|
||||
'icon' => 'delete.svg',
|
||||
'attributes' => 'onclick="if(!confirm(\'Eintrag wirklich loeschen?\'))return false;Backend.getScrollOffset()"',
|
||||
],
|
||||
'show' => [
|
||||
'href' => 'act=show',
|
||||
'icon' => 'show.svg',
|
||||
],
|
||||
],
|
||||
],
|
||||
'palettes' => [
|
||||
'default' => '{editor_legend},member',
|
||||
],
|
||||
'fields' => [
|
||||
'id' => ['sql' => 'int(10) unsigned NOT NULL auto_increment'],
|
||||
'tstamp' => ['sql' => 'int(10) unsigned NOT NULL default 0'],
|
||||
'pid' => ['sql' => 'int(10) unsigned NOT NULL default 0'],
|
||||
'survey' => ['sql' => 'int(10) unsigned NOT NULL default 0'],
|
||||
'member' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_editor']['member'],
|
||||
'inputType' => 'select',
|
||||
'options_callback' => [SurveyDcaListener::class, 'getMemberOptions'],
|
||||
'eval' => ['mandatory' => true, 'includeBlankOption' => true, 'chosen' => true],
|
||||
'save_callback' => [$guardCallback],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Contao\DC_Table;
|
||||
|
||||
$GLOBALS['TL_DCA']['tl_survey_submission'] = [
|
||||
'config' => [
|
||||
'dataContainer' => DC_Table::class,
|
||||
'ptable' => 'tl_survey',
|
||||
'ctable' => ['tl_survey_answer'],
|
||||
'closed' => true,
|
||||
'notCreatable' => true,
|
||||
'notEditable' => true,
|
||||
'notCopyable' => true,
|
||||
'sql' => [
|
||||
'keys' => [
|
||||
'id' => 'primary',
|
||||
'pid' => 'index',
|
||||
'survey' => 'index',
|
||||
'token' => 'index',
|
||||
'isFinished' => 'index',
|
||||
],
|
||||
],
|
||||
],
|
||||
'list' => [
|
||||
'sorting' => [
|
||||
'mode' => 4,
|
||||
'fields' => ['startedAt'],
|
||||
'headerFields' => ['title', 'alias'],
|
||||
'panelLayout' => 'sort,search,limit',
|
||||
],
|
||||
'label' => [
|
||||
'fields' => ['token', 'startedAt', 'completedAt', 'isFinished'],
|
||||
'showColumns' => true,
|
||||
],
|
||||
'operations' => [
|
||||
'edit' => [
|
||||
'href' => 'table=tl_survey_answer',
|
||||
'icon' => 'children.svg',
|
||||
],
|
||||
'show' => [
|
||||
'href' => 'act=show',
|
||||
'icon' => 'show.svg',
|
||||
],
|
||||
],
|
||||
],
|
||||
'fields' => [
|
||||
'id' => ['sql' => 'int(10) unsigned NOT NULL auto_increment'],
|
||||
'tstamp' => ['sql' => 'int(10) unsigned NOT NULL default 0'],
|
||||
'pid' => ['sql' => 'int(10) unsigned NOT NULL default 0'],
|
||||
'survey' => ['sql' => 'int(10) unsigned NOT NULL default 0'],
|
||||
'token' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_submission']['token'],
|
||||
'sql' => "varchar(26) NOT NULL default ''",
|
||||
],
|
||||
'startedAt' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_submission']['startedAt'],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
'completedAt' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_submission']['completedAt'],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
'currentQuestion' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_submission']['currentQuestion'],
|
||||
'sql' => 'int(10) unsigned NOT NULL default 0',
|
||||
],
|
||||
'isFinished' => [
|
||||
'label' => &$GLOBALS['TL_LANG']['tl_survey_submission']['isFinished'],
|
||||
'sql' => "char(1) NOT NULL default ''",
|
||||
],
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
$GLOBALS['TL_LANG']['MOD']['survey_bundle_surveys'] = ['Umfragen', 'Umfragen, Fragen, Bedingungen und anonyme Antworten verwalten.'];
|
||||
$GLOBALS['TL_LANG']['MOD']['survey_bundle_categories'] = ['Umfrage-Kategorien', 'Kategorien fuer Umfragen pflegen.'];
|
||||
|
||||
$GLOBALS['TL_LANG']['FMD']['survey'] = 'Umfragen';
|
||||
$GLOBALS['TL_LANG']['FMD']['member_survey_list'] = ['Meine Umfragen', 'Zeigt alle dem Mitglied zugewiesenen Umfragen an.'];
|
||||
$GLOBALS['TL_LANG']['FMD']['member_survey_edit'] = ['Umfrage bearbeiten', 'Bearbeitungsbereich fuer zugewiesene Umfragen im Frontend.'];
|
||||
$GLOBALS['TL_LANG']['FMD']['show_survey'] = ['Umfrage ausfuellen', 'Oeffentliche Umfrageansicht ueber den oeffentlichen Link.'];
|
||||
$GLOBALS['TL_LANG']['FMD']['survey_results'] = ['Ergebnisse', 'Zeigt die Ergebnisse einer Umfrage ueber den konfigurierten Ergebnis-Link an.'];
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
$GLOBALS['TL_LANG']['tl_member']['survey_legend'] = 'Umfrage-Zuordnung';
|
||||
$GLOBALS['TL_LANG']['tl_member']['surveyCategories'] = ['Umfrage-Kategorien', 'Diese Kategorien werden neuen und bereits zugewiesenen Umfragen dieses Mitglieds automatisch zugeordnet.'];
|
||||
$GLOBALS['TL_LANG']['tl_member']['assignedSurveys'] = ['Zugewiesene Umfragen', 'Waehlen Sie die Umfragen aus, die dieses Mitglied bearbeiten darf. Das Suchfeld in der Auswahl hilft bei vielen Eintraegen.'];
|
||||
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
$GLOBALS['TL_LANG']['tl_module']['survey_navigation_legend'] = 'Verknuepfte Seiten';
|
||||
$GLOBALS['TL_LANG']['tl_module']['surveyEditPage'] = ['Bearbeitungsseite', 'Seite mit dem Frontendmodul zur Bearbeitung von Umfragen.'];
|
||||
$GLOBALS['TL_LANG']['tl_module']['surveyListPage'] = ['Uebersichtsseite', 'Seite mit der Uebersicht der Umfragen.'];
|
||||
$GLOBALS['TL_LANG']['tl_module']['surveyReaderPage'] = ['Anzeigeseite', 'Oeffentliche Seite zum Aufrufen einer Umfrage ueber den oeffentlichen Link.'];
|
||||
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
$GLOBALS['TL_LANG']['tl_settings']['survey_settings_legend'] = 'Umfrage-Einstellungen';
|
||||
$GLOBALS['TL_LANG']['tl_settings']['surveyReaderPage'] = ['Reader-Seite', 'Diese Seite wird global fuer den oeffentlichen Umfrage-Link verwendet.'];
|
||||
$GLOBALS['TL_LANG']['tl_settings']['surveyResultsPage'] = ['Ergebnisseite', 'Diese Seite wird global fuer die Anzeige der Umfrage-Ergebnisse verwendet.'];
|
||||
$GLOBALS['TL_LANG']['tl_settings']['surveyGotenbergUrl'] = ['Gotenberg-URL', 'Basis-URL der Gotenberg-Instanz fuer den serverseitigen PDF-Export, z. B. https://gotenberg.mummert.media'];
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
$GLOBALS['TL_LANG']['tl_survey']['title'] = ['Titel', 'Titel der Umfrage.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['alias'] = ['Oeffentlicher Link-Schluessel', 'Wird automatisch als 20-stelliger Link-Schluessel erzeugt.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['category'] = ['Kategorien', 'Ordnet die Umfrage einer oder mehreren Kategorien zu.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['categoryFilter'] = ['Kategorien', 'Filtert die Liste nach einer Umfrage-Kategorie.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['categorySummary'] = ['Kategorien', 'Zugeordnete Kategorien der Umfrage.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['description'] = ['Beschreibung', 'Einleitung fuer den Editor und das Frontend.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['title_legend'] = 'Grunddaten';
|
||||
$GLOBALS['TL_LANG']['tl_survey']['assignment_legend'] = 'Bearbeitende Mitglieder';
|
||||
$GLOBALS['TL_LANG']['tl_survey']['publishing_legend'] = 'Sichtbarkeit';
|
||||
$GLOBALS['TL_LANG']['tl_survey']['meta_legend'] = 'Verwaltungsdaten';
|
||||
$GLOBALS['TL_LANG']['tl_survey']['published'] = ['Veroeffentlicht', 'Die Umfrage oeffentlich freischalten.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['isLocked'] = ['Gesperrt', 'Struktur ist wegen vorhandener Antworten gesperrt.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['assignedMembers'] = ['Zugewiesene Mitglieder', 'Waehlen Sie die Mitglieder aus, die diese Umfrage bearbeiten duerfen.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['assignedMembersFilter'] = ['Zugewiesene Benutzer', 'Filtert die Liste nach einem zugewiesenen Benutzer.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['assignedMembersSummary'] = ['Zugewiesene Benutzer', 'Kommagetrennte Liste der zugewiesenen Benutzer.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['copyPublicLink'] = ['Link kopieren', 'Den oeffentlichen Link in die Zwischenablage kopieren'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['showResults'] = ['Ergebnisse anzeigen', 'Die Ergebnisse dieser Umfrage im Frontend anzeigen'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['createdBy'] = ['Angelegt von', 'ID des erstellenden Mitglieds.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['updatedBy'] = ['Aktualisiert von', 'ID des zuletzt bearbeitenden Mitglieds.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['createdAt'] = ['Angelegt am', 'Zeitpunkt der Erstellung.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey']['updatedAt'] = ['Aktualisiert am', 'Zeitpunkt der letzten Aktualisierung.'];
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
$GLOBALS['TL_LANG']['tl_survey_answer']['question'] = ['Frage', 'Referenz zur Frage.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_answer']['questionType'] = ['Frageart', 'Gespeicherte Art der Frage zum Zeitpunkt der Antwort.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_answer']['value'] = ['Antwort', 'Gespeicherte Antwort.'];
|
||||
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
$GLOBALS['TL_LANG']['tl_survey_category']['title'] = ['Titel', 'Titel der Kategorie.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_category']['alias'] = ['Alias', 'Optionaler Alias.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_category']['title_legend'] = 'Grunddaten';
|
||||
$GLOBALS['TL_LANG']['tl_survey_category']['sorting'] = ['Sortierung', 'Sortierwert fuer die Backend-Liste.'];
|
||||
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
$GLOBALS['TL_LANG']['tl_survey_condition']['logic_legend'] = 'Sprungregel';
|
||||
$GLOBALS['TL_LANG']['tl_survey_condition']['sourceQuestion'] = ['Ausgangsfrage', 'Frage, deren Antwort ausgewertet wird.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_condition']['answerValue'] = ['Antwort', 'Antwortwert, bei dem zu einer anderen Frage gesprungen wird.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_condition']['targetQuestion'] = ['Naechste Frage', 'Zu dieser Frage wird bei passender Antwort gewechselt.'];
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['type'] = ['Fragetyp', 'Typ der Frage.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['types'] = [
|
||||
'yes_no_maybe' => 'Ja-Nein-Frage',
|
||||
'text' => 'Offene Frage',
|
||||
'range' => 'Bewertungsfrage',
|
||||
'choice' => 'Single/Multiple-Choice',
|
||||
];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['question'] = ['Frage', 'Titel bzw. Wortlaut der Frage.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['description'] = ['Beschreibung', 'Optionale Zusatzbeschreibung zur Frage.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['question_legend'] = 'Frage';
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['settings_legend'] = 'Einstellungen';
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['mandatory'] = ['Pflichtfrage', 'Diese Frage muss beantwortet werden.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['published'] = ['Aktiv', 'Die Frage wird in der Umfrage angezeigt.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['allowMaybe'] = ['Vielleicht anbieten', 'Ergaenzt die Ja-Nein-Frage um die Antwortmoeglichkeit Vielleicht.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['jumpOnYes'] = ['Zur Frage springen bei Auswahl ja', 'Springt bei der Antwort Ja direkt zu dieser Frage.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['jumpOnNo'] = ['Zur Frage springen bei Auswahl nein', 'Springt bei der Antwort Nein direkt zu dieser Frage.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['allowMultiple'] = ['Multiple-Choice aktivieren', 'Erlaubt mehrere Antworten statt einer einzelnen Auswahl.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['answerOption1'] = ['Antwort 1', 'Erste moegliche Antwort.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['answerOption2'] = ['Antwort 2', 'Zweite moegliche Antwort.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['answerOption3'] = ['Antwort 3', 'Dritte moegliche Antwort.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['answerOption4'] = ['Antwort 4', 'Vierte moegliche Antwort.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['answerOption5'] = ['Antwort 5', 'Fuenfte moegliche Antwort.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['answerOption6'] = ['Antwort 6', 'Sechste moegliche Antwort.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['answerOption7'] = ['Antwort 7', 'Siebte moegliche Antwort.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['answerOption8'] = ['Antwort 8', 'Achte moegliche Antwort.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['answerOption9'] = ['Antwort 9', 'Neunte moegliche Antwort.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['answerOption10'] = ['Antwort 10', 'Zehnte moegliche Antwort.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['rangeMin'] = ['Kleinster Wert', 'Kleinster Wert des Schiebereglers.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['rangeMax'] = ['Groesster Wert', 'Groesster Wert des Schiebereglers.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_content']['rangeStep'] = ['Schrittweite', 'Abstand zwischen den moeglichen Werten des Schiebereglers.'];
|
||||
@@ -0,0 +1,4 @@
|
||||
<?php
|
||||
|
||||
$GLOBALS['TL_LANG']['tl_survey_editor']['editor_legend'] = 'Bearbeitungsrechte';
|
||||
$GLOBALS['TL_LANG']['tl_survey_editor']['member'] = ['Bearbeitendes Mitglied', 'Dieses Frontend-Mitglied darf die Umfrage bearbeiten.'];
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
$GLOBALS['TL_LANG']['tl_survey_submission']['token'] = ['Teilnahme-Code', 'Anonymer Code dieses Umfrage-Durchlaufs.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_submission']['startedAt'] = ['Begonnen am', 'Zeitpunkt, an dem die Umfrage begonnen wurde.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_submission']['completedAt'] = ['Beendet am', 'Zeitpunkt, an dem die Umfrage abgeschlossen wurde.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_submission']['currentQuestion'] = ['Aktuelle Frage', 'Interne Kennung der aktuell offenen Frage.'];
|
||||
$GLOBALS['TL_LANG']['tl_survey_submission']['isFinished'] = ['Abgeschlossen', 'Kennzeichnet abgeschlossene Umfrage-Durchlaeufe.'];
|
||||
@@ -0,0 +1,410 @@
|
||||
<style>
|
||||
@font-face {
|
||||
font-family: "PT Sans Narrow";
|
||||
src: url("{{ asset('bundles/survey/fonts/PTSansNarrow-Regular.woff2') }}") format("woff2");
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "PT Sans Narrow";
|
||||
src: url("{{ asset('bundles/survey/fonts/PTSansNarrow-Bold.woff2') }}") format("woff2");
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Blogger Sans";
|
||||
src: url("{{ asset('bundles/survey/fonts/Blogger%20Sans-Medium.woff2') }}") format("woff2");
|
||||
font-weight: 500;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
:root {
|
||||
--survey-blue: #0064ad;
|
||||
--survey-orange: #ec7c32;
|
||||
--survey-purple: #9d5276;
|
||||
--survey-green: #00ae97;
|
||||
--survey-rose: #fce4d6;
|
||||
--survey-black: #222222;
|
||||
--survey-gray-dark: #555e68;
|
||||
--survey-gray-mid: #a2a8b4;
|
||||
--survey-gray-soft: #e9e9eb;
|
||||
--survey-surface: rgba(255, 255, 255, 0.92);
|
||||
}
|
||||
|
||||
.survey-brand-strip {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1.5rem;
|
||||
justify-content: center;
|
||||
margin: 0 0 1.75rem;
|
||||
padding: 1rem 1.25rem 0.5rem;
|
||||
}
|
||||
|
||||
.survey-brand-logo {
|
||||
display: block;
|
||||
object-fit: contain;
|
||||
object-position: center;
|
||||
}
|
||||
|
||||
.survey-brand-logo.primary {
|
||||
width: auto;
|
||||
max-width: min(100%, 320px);
|
||||
height: 75px;
|
||||
}
|
||||
|
||||
.survey-brand-logo.secondary {
|
||||
width: auto;
|
||||
max-width: min(100%, 420px);
|
||||
height: 75px;
|
||||
}
|
||||
|
||||
.survey-shell {
|
||||
color: var(--survey-black);
|
||||
font-family: "PT Sans Narrow", sans-serif;
|
||||
letter-spacing: 0.3px;
|
||||
background:
|
||||
radial-gradient(circle at top left, rgba(0, 100, 173, 0.22), transparent 30%),
|
||||
radial-gradient(circle at bottom right, rgba(0, 174, 151, 0.12), transparent 34%),
|
||||
linear-gradient(180deg, rgba(0, 100, 173, 0.12) 0%, rgba(255, 255, 255, 0.98) 52%, rgba(0, 100, 173, 0.08) 100%);
|
||||
border: 1px solid rgba(162, 168, 180, 0.45);
|
||||
border-radius: 2rem;
|
||||
box-shadow: 0 28px 80px rgba(34, 34, 34, 0.08);
|
||||
padding: 1.5rem;
|
||||
}
|
||||
|
||||
.survey-shell h2,
|
||||
.survey-shell h3,
|
||||
.survey-shell h4 {
|
||||
font-family: "Blogger Sans", sans-serif;
|
||||
font-weight: 500;
|
||||
color: var(--survey-blue);
|
||||
letter-spacing: 0.01em;
|
||||
}
|
||||
|
||||
.survey-shell,
|
||||
.survey-shell * {
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.survey-grid {
|
||||
display: grid;
|
||||
gap: 1.5rem;
|
||||
}
|
||||
|
||||
.survey-grid-columns {
|
||||
display: grid;
|
||||
gap: 1.5rem;
|
||||
}
|
||||
|
||||
.survey-results-card {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.survey-results-layout {
|
||||
display: grid;
|
||||
gap: 1.25rem;
|
||||
margin-top: 1.1rem;
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
.survey-results-layout.no-chart {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.survey-chart-panel {
|
||||
position: relative;
|
||||
min-height: 320px;
|
||||
}
|
||||
|
||||
.survey-chart-panel::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
border-radius: 1.5rem;
|
||||
background:
|
||||
radial-gradient(circle at top left, rgba(0, 100, 173, 0.18), transparent 42%),
|
||||
radial-gradient(circle at bottom right, rgba(236, 124, 50, 0.18), transparent 42%),
|
||||
linear-gradient(135deg, rgba(0, 100, 173, 0.12) 0%, rgba(255, 255, 255, 0.9) 52%, rgba(236, 124, 50, 0.12) 100%);
|
||||
border: 1px solid rgba(162, 168, 180, 0.28);
|
||||
}
|
||||
|
||||
.survey-chart-frame {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
min-height: 320px;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.survey-chart-panel.is-line .survey-chart-frame {
|
||||
min-height: 360px;
|
||||
padding: 1rem 1rem 0.75rem;
|
||||
}
|
||||
|
||||
.survey-chart-canvas {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.survey-results-panel {
|
||||
display: grid;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.survey-results-list {
|
||||
display: grid;
|
||||
gap: 0.9rem;
|
||||
}
|
||||
|
||||
.survey-results-row {
|
||||
display: grid;
|
||||
gap: 0.45rem;
|
||||
padding: 0.9rem 1rem;
|
||||
border-radius: 1.15rem;
|
||||
background: rgba(255, 255, 255, 0.78);
|
||||
border: 1px solid rgba(162, 168, 180, 0.24);
|
||||
}
|
||||
|
||||
.survey-results-responses {
|
||||
max-height: 24rem;
|
||||
overflow: auto;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
|
||||
.survey-response-card {
|
||||
margin: 0;
|
||||
font-style: normal;
|
||||
background: rgba(255, 255, 255, 0.72);
|
||||
}
|
||||
|
||||
.survey-metric-grid {
|
||||
display: grid;
|
||||
gap: 0.85rem;
|
||||
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
|
||||
}
|
||||
|
||||
.survey-metric-card {
|
||||
display: grid;
|
||||
gap: 0.35rem;
|
||||
padding: 0.95rem 1rem;
|
||||
border-radius: 1.2rem;
|
||||
background: rgba(252, 228, 214, 0.38);
|
||||
border: 1px solid rgba(236, 124, 50, 0.16);
|
||||
}
|
||||
|
||||
.survey-metric-card strong {
|
||||
font-family: "Blogger Sans", sans-serif;
|
||||
font-size: 1.35rem;
|
||||
color: var(--survey-blue);
|
||||
}
|
||||
|
||||
.survey-metric-label {
|
||||
font-size: 0.78rem;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.08em;
|
||||
color: var(--survey-gray-dark);
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.survey-card {
|
||||
background: var(--survey-surface);
|
||||
border: 1px solid rgba(162, 168, 180, 0.34);
|
||||
border-radius: 1.5rem;
|
||||
padding: 1.25rem;
|
||||
box-shadow: 0 12px 32px rgba(34, 34, 34, 0.06);
|
||||
}
|
||||
|
||||
.survey-meta {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5rem;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.survey-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
padding: 0.25rem 0.65rem;
|
||||
border-radius: 999px;
|
||||
font-size: 0.75rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.06em;
|
||||
text-transform: uppercase;
|
||||
background: rgba(162, 168, 180, 0.16);
|
||||
}
|
||||
|
||||
.survey-badge.success { background: rgba(0, 174, 151, 0.16); color: var(--survey-green); }
|
||||
.survey-badge.warning { background: rgba(236, 124, 50, 0.16); color: var(--survey-orange); }
|
||||
.survey-badge.neutral { background: rgba(162, 168, 180, 0.16); color: var(--survey-gray-dark); }
|
||||
|
||||
.survey-button-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.75rem;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.survey-button {
|
||||
display: inline-flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
padding: 0.8rem 1rem;
|
||||
border-radius: 999px;
|
||||
border: 1px solid transparent;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.survey-button.primary { background: var(--survey-blue); color: #fff; }
|
||||
.survey-button.secondary { background: rgba(255,255,255,0.86); color: var(--survey-blue); border-color: rgba(0,100,173,0.18); }
|
||||
.survey-button.danger { background: rgba(157, 82, 118, 0.12); color: var(--survey-purple); border-color: rgba(157, 82, 118, 0.22); }
|
||||
|
||||
.survey-form-grid {
|
||||
display: grid;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.survey-label {
|
||||
display: grid;
|
||||
gap: 0.4rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.survey-label input,
|
||||
.survey-label textarea,
|
||||
.survey-label select {
|
||||
width: 100%;
|
||||
border-radius: 1rem;
|
||||
border: 1px solid rgba(162,168,180,0.5);
|
||||
padding: 0.8rem 0.9rem;
|
||||
background: rgba(255,255,255,0.98);
|
||||
color: var(--survey-black);
|
||||
}
|
||||
|
||||
.survey-inline-check {
|
||||
display: inline-flex;
|
||||
gap: 0.6rem;
|
||||
align-items: center;
|
||||
border: 1px solid rgba(162,168,180,0.35);
|
||||
border-radius: 1rem;
|
||||
padding: 0.8rem 1rem;
|
||||
background: rgba(252,228,214,0.42);
|
||||
}
|
||||
|
||||
.survey-alert {
|
||||
border-radius: 1.2rem;
|
||||
padding: 1rem 1.1rem;
|
||||
margin-bottom: 1rem;
|
||||
background: rgba(255,255,255,0.78);
|
||||
border: 1px solid rgba(162,168,180,0.35);
|
||||
}
|
||||
|
||||
.survey-alert.error { border-color: rgba(157, 82, 118, 0.28); color: var(--survey-purple); }
|
||||
.survey-alert.warning { border-color: rgba(236, 124, 50, 0.28); color: var(--survey-orange); }
|
||||
|
||||
.survey-kpis {
|
||||
display: grid;
|
||||
gap: 1rem;
|
||||
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
||||
}
|
||||
|
||||
.survey-progress {
|
||||
width: 100%;
|
||||
height: 0.75rem;
|
||||
border-radius: 999px;
|
||||
overflow: hidden;
|
||||
background: rgba(162,168,180,0.22);
|
||||
}
|
||||
|
||||
.survey-progress > span {
|
||||
display: block;
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, var(--survey-blue) 0%, var(--survey-orange) 100%);
|
||||
}
|
||||
|
||||
.survey-progress-bar {
|
||||
display: block;
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, var(--survey-blue) 0%, var(--survey-orange) 100%);
|
||||
}
|
||||
|
||||
.survey-range-output {
|
||||
font-size: 2rem;
|
||||
font-weight: 800;
|
||||
color: var(--survey-green);
|
||||
}
|
||||
|
||||
@media (min-width: 960px) {
|
||||
.survey-grid-columns {
|
||||
grid-template-columns: 0.95fr 1.05fr;
|
||||
}
|
||||
|
||||
.survey-results-layout {
|
||||
grid-template-columns: minmax(320px, 0.95fr) minmax(0, 1.05fr);
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.survey-brand-strip {
|
||||
padding: 0.75rem 0.75rem 0.25rem;
|
||||
}
|
||||
|
||||
.survey-brand-logo.secondary {
|
||||
height: 75px;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
document.querySelectorAll('[data-survey-range]').forEach(function (input) {
|
||||
var targetId = input.getAttribute('data-survey-range-target');
|
||||
var output = targetId ? document.getElementById(targetId) : null;
|
||||
|
||||
if (!output) {
|
||||
return;
|
||||
}
|
||||
|
||||
var update = function () {
|
||||
output.textContent = input.value;
|
||||
};
|
||||
|
||||
input.addEventListener('input', update);
|
||||
update();
|
||||
});
|
||||
|
||||
document.querySelectorAll('[data-survey-question-type]').forEach(function (select) {
|
||||
var wrapper = select.closest('[data-survey-question-editor]');
|
||||
if (!wrapper) {
|
||||
return;
|
||||
}
|
||||
|
||||
var toggle = function () {
|
||||
var showRange = select.value === 'range';
|
||||
var showYesNoMaybe = select.value === 'yes_no_maybe';
|
||||
var showChoice = select.value === 'choice';
|
||||
|
||||
wrapper.querySelectorAll('.range-config-field').forEach(function (element) {
|
||||
element.style.display = showRange ? '' : 'none';
|
||||
});
|
||||
|
||||
wrapper.querySelectorAll('.yes-no-config-field').forEach(function (element) {
|
||||
element.style.display = showYesNoMaybe ? '' : 'none';
|
||||
});
|
||||
|
||||
wrapper.querySelectorAll('.choice-config-field').forEach(function (element) {
|
||||
element.style.display = showChoice ? '' : 'none';
|
||||
});
|
||||
};
|
||||
|
||||
select.addEventListener('change', toggle);
|
||||
toggle();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,3 @@
|
||||
<div class="survey-brand-strip" aria-label="Projektlogos">
|
||||
<img class="survey-brand-logo primary" src="{{ asset('bundles/survey/images/Logo_Landesverband.svg') }}" alt="Kinderschutzbund Sachsen">
|
||||
</div>
|
||||
@@ -0,0 +1,193 @@
|
||||
{% include '@Survey/frontend/_survey_assets.html.twig' %}
|
||||
{% include '@Survey/frontend/_survey_branding.html.twig' %}
|
||||
|
||||
<section class="survey-shell survey-grid">
|
||||
{% if headline.text %}
|
||||
<header>
|
||||
<h2>{{ headline.text }}</h2>
|
||||
</header>
|
||||
{% endif %}
|
||||
|
||||
{% if loginRequired %}
|
||||
<div class="survey-alert warning">Dieses Frontendmodul ist fuer eingeloggte Mitglieder gedacht. Nutzen Sie den normalen Contao-Mitgliederlogin auf einer geschuetzten Seite.</div>
|
||||
{% elseif createMode %}
|
||||
<div class="survey-card">
|
||||
<h3>Neue Umfrage erstellen</h3>
|
||||
<p>Die Umfrage wird nach dem Anlegen automatisch dem eingeloggten Mitglied zugewiesen.</p>
|
||||
{{ form_start(surveyForm, {attr: {class: 'survey-form-grid'}}) }}
|
||||
<label class="survey-label">Titel{{ form_widget(surveyForm.title) }}{{ form_errors(surveyForm.title) }}</label>
|
||||
<label class="survey-label">Beschreibung{{ form_widget(surveyForm.description) }}</label>
|
||||
<label class="survey-inline-check">{{ form_widget(surveyForm.published) }}<span>Direkt veroeffentlichen</span></label>
|
||||
<div class="survey-button-row">
|
||||
<button class="survey-button primary">Umfrage erstellen</button>
|
||||
{% if backUrl %}<a class="survey-button secondary" href="{{ backUrl }}">Zur Liste</a>{% endif %}
|
||||
</div>
|
||||
{{ form_end(surveyForm) }}
|
||||
</div>
|
||||
{% else %}
|
||||
{% set locked = survey.isLocked == '1' %}
|
||||
<div class="survey-button-row">
|
||||
{% if backUrl %}<a class="survey-button secondary" href="{{ backUrl }}">Zur Liste</a>{% endif %}
|
||||
{% if publicUrl %}<a class="survey-button primary" href="{{ publicUrl }}" target="_blank" rel="noreferrer">Oeffentliche Ansicht oeffnen</a>{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="survey-kpis">
|
||||
<article class="survey-card"><strong>Oeffentlicher Link</strong><div>{% if publicUrl %}<a href="{{ publicUrl }}" target="_blank" rel="noreferrer">{{ publicUrl }}</a>{% else %}Noch keine oeffentliche Seite hinterlegt.{% endif %}</div></article>
|
||||
<article class="survey-card"><strong>Status</strong><div class="survey-meta"><span class="survey-badge {{ survey.published ? 'success' : 'neutral' }}">{{ survey.published ? 'veroeffentlicht' : 'entwurf' }}</span>{% if locked %}<span class="survey-badge warning">gesperrt</span>{% endif %}</div></article>
|
||||
<article class="survey-card"><strong>Bearbeitende</strong><div>{{ editors|length }} Mitglied(er)</div></article>
|
||||
</div>
|
||||
|
||||
{% if locked %}
|
||||
<div class="survey-alert warning">Die Umfrage ist strukturell gesperrt, weil bereits Antworten vorliegen. Stammdaten koennen weiter gepflegt werden, der Ablauf und die Fragen jedoch nicht.</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="survey-grid-columns">
|
||||
<div class="survey-grid">
|
||||
<div class="survey-card">
|
||||
<h3>Umfrage-Metadaten</h3>
|
||||
{{ form_start(surveyForm, {attr: {class: 'survey-form-grid'}}) }}
|
||||
<label class="survey-label">Titel{{ form_widget(surveyForm.title) }}{{ form_errors(surveyForm.title) }}</label>
|
||||
<label class="survey-label">Beschreibung{{ form_widget(surveyForm.description) }}</label>
|
||||
<label class="survey-inline-check">{{ form_widget(surveyForm.published) }}<span>Umfrage veroeffentlichen</span></label>
|
||||
<div class="survey-button-row"><button class="survey-button primary">Speichern</button></div>
|
||||
{{ form_end(surveyForm) }}
|
||||
</div>
|
||||
|
||||
<div class="survey-card">
|
||||
<h3>Bearbeitende Mitglieder</h3>
|
||||
<div class="survey-grid">
|
||||
{% for editor in editors %}
|
||||
<div>
|
||||
<strong>{{ [editor.firstname, editor.lastname]|join(' ')|trim ?: editor.email }}</strong><br>
|
||||
<span>{{ editor.email }}</span>
|
||||
</div>
|
||||
{% else %}
|
||||
<div>Keine Editoren hinterlegt.</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="survey-card">
|
||||
<h3>Antworten und Ergebnisse</h3>
|
||||
<div class="survey-grid">
|
||||
{% for submission in submissions %}
|
||||
<article>
|
||||
<div class="survey-meta">
|
||||
<span class="survey-badge neutral">{{ submission.answerCount }} Antworten</span>
|
||||
<span class="survey-badge {{ submission.isFinished ? 'success' : 'warning' }}">{{ submission.isFinished ? 'abgeschlossen' : 'offen' }}</span>
|
||||
</div>
|
||||
<div>Begonnen: {{ submission.startedAt ? submission.startedAt|date('d.m.Y H:i') : 'unbekannt' }}</div>
|
||||
<div>Beendet: {{ submission.completedAt ? submission.completedAt|date('d.m.Y H:i') : 'unbekannt' }}</div>
|
||||
<div>Teilnahme-Code: {{ submission.token }}</div>
|
||||
</article>
|
||||
{% else %}
|
||||
<div>Es liegen noch keine Teilnahmen vor.</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="survey-grid">
|
||||
<div class="survey-card" data-survey-question-editor>
|
||||
<div class="survey-meta"><h3>Fragen bearbeiten</h3>{% if activeQuestionId %}<span class="survey-badge neutral">Bearbeitungsmodus</span>{% endif %}</div>
|
||||
{% if not locked %}
|
||||
{% set questionType = questionForm.type.vars.value ?: 'yes_no_maybe' %}
|
||||
{{ form_start(questionForm, {attr: {class: 'survey-form-grid'}}) }}
|
||||
<label class="survey-label">Fragetyp{{ form_widget(questionForm.type, {attr: {'data-survey-question-type': '1'}}) }}</label>
|
||||
<label class="survey-label">Frage{{ form_widget(questionForm.question) }}{{ form_errors(questionForm.question) }}</label>
|
||||
<label class="survey-label">Beschreibung{{ form_widget(questionForm.description) }}</label>
|
||||
<label class="survey-inline-check">{{ form_widget(questionForm.mandatory) }}<span>Pflichtfrage</span></label>
|
||||
<label class="survey-inline-check">{{ form_widget(questionForm.published) }}<span>Aktiv</span></label>
|
||||
<label class="survey-inline-check yes-no-config-field"{% if questionType != 'yes_no_maybe' %} style="display:none"{% endif %}>{{ form_widget(questionForm.allowMaybe) }}<span>Vielleicht anbieten</span></label>
|
||||
<div class="yes-no-config-field survey-grid-columns"{% if questionType != 'yes_no_maybe' %} style="display:none;grid-template-columns: repeat(2, minmax(0, 1fr));"{% else %} style="grid-template-columns: repeat(2, minmax(0, 1fr));"{% endif %}>
|
||||
<label class="survey-label">Zur Frage springen bei Auswahl ja{{ form_widget(questionForm.jumpOnYes) }}</label>
|
||||
<label class="survey-label">Zur Frage springen bei Auswahl nein{{ form_widget(questionForm.jumpOnNo) }}</label>
|
||||
</div>
|
||||
<label class="survey-inline-check choice-config-field"{% if questionType != 'choice' %} style="display:none"{% endif %}>{{ form_widget(questionForm.allowMultiple) }}<span>Multiple-Choice aktivieren</span></label>
|
||||
<div class="choice-config-field survey-grid-columns"{% if questionType != 'choice' %} style="display:none;grid-template-columns: repeat(2, minmax(0, 1fr));"{% else %} style="grid-template-columns: repeat(2, minmax(0, 1fr));"{% endif %}>
|
||||
<label class="survey-label">Antwort 1{{ form_widget(questionForm.answerOption1) }}</label>
|
||||
<label class="survey-label">Antwort 2{{ form_widget(questionForm.answerOption2) }}</label>
|
||||
<label class="survey-label">Antwort 3{{ form_widget(questionForm.answerOption3) }}</label>
|
||||
<label class="survey-label">Antwort 4{{ form_widget(questionForm.answerOption4) }}</label>
|
||||
<label class="survey-label">Antwort 5{{ form_widget(questionForm.answerOption5) }}</label>
|
||||
<label class="survey-label">Antwort 6{{ form_widget(questionForm.answerOption6) }}</label>
|
||||
<label class="survey-label">Antwort 7{{ form_widget(questionForm.answerOption7) }}</label>
|
||||
<label class="survey-label">Antwort 8{{ form_widget(questionForm.answerOption8) }}</label>
|
||||
<label class="survey-label">Antwort 9{{ form_widget(questionForm.answerOption9) }}</label>
|
||||
<label class="survey-label">Antwort 10{{ form_widget(questionForm.answerOption10) }}</label>
|
||||
</div>
|
||||
<div class="range-config-field survey-grid-columns"{% if questionType != 'range' %} style="display:none;grid-template-columns: repeat(3, minmax(0, 1fr));"{% else %} style="grid-template-columns: repeat(3, minmax(0, 1fr));"{% endif %}>
|
||||
<label class="survey-label">Kleinster Wert{{ form_widget(questionForm.rangeMin) }}</label>
|
||||
<label class="survey-label">Groesster Wert{{ form_widget(questionForm.rangeMax) }}</label>
|
||||
<label class="survey-label">Schrittweite{{ form_widget(questionForm.rangeStep) }}</label>
|
||||
</div>
|
||||
<div class="survey-button-row"><button class="survey-button primary">{{ activeQuestionId ? 'Frage aktualisieren' : 'Frage speichern' }}</button></div>
|
||||
{{ form_end(questionForm) }}
|
||||
{% endif %}
|
||||
|
||||
<div class="survey-grid">
|
||||
{% for question in questions %}
|
||||
<article class="survey-card">
|
||||
<div class="survey-meta">
|
||||
<span class="survey-badge neutral">{{ question.type }}</span>
|
||||
{% if question.mandatory %}<span class="survey-badge warning">Pflicht</span>{% endif %}
|
||||
{% if loop.first %}<span class="survey-badge success">Start</span>{% endif %}
|
||||
</div>
|
||||
<h4>{{ question.question }}</h4>
|
||||
<p>{{ question.description ?: 'Keine Zusatzbeschreibung.' }}</p>
|
||||
{% if not locked %}
|
||||
<div class="survey-button-row">
|
||||
<a class="survey-button secondary" href="?survey={{ survey.id }}&question={{ question.id }}">Bearbeiten</a>
|
||||
<form method="post">
|
||||
<input type="hidden" name="_survey_action" value="delete-question">
|
||||
<input type="hidden" name="item_id" value="{{ question.id }}">
|
||||
<input type="hidden" name="_token" value="{{ csrf_token('delete-question-' ~ question.id) }}">
|
||||
<button class="survey-button danger" onclick="return confirm('Frage wirklich loeschen?');">Loeschen</button>
|
||||
</form>
|
||||
</div>
|
||||
{% endif %}
|
||||
</article>
|
||||
{% else %}
|
||||
<div>Noch keine Fragen angelegt.</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="survey-card">
|
||||
<div class="survey-meta"><h3>Sprungregeln</h3>{% if activeConditionId %}<span class="survey-badge neutral">Bearbeitungsmodus</span>{% endif %}</div>
|
||||
{% if not locked %}
|
||||
{{ form_start(conditionForm, {attr: {class: 'survey-form-grid'}}) }}
|
||||
<label class="survey-label">Ausgangsfrage{{ form_widget(conditionForm.sourceQuestion) }}</label>
|
||||
<label class="survey-label">Antwort{{ form_widget(conditionForm.answerValue) }}</label>
|
||||
<label class="survey-label">Naechste Frage{{ form_widget(conditionForm.targetQuestion) }}</label>
|
||||
<div class="survey-button-row"><button class="survey-button primary">{{ activeConditionId ? 'Bedingung aktualisieren' : 'Bedingung speichern' }}</button></div>
|
||||
{{ form_end(conditionForm) }}
|
||||
{% endif %}
|
||||
|
||||
<div class="survey-grid">
|
||||
{% for condition in conditions %}
|
||||
<article class="survey-card">
|
||||
<div><strong>Wenn Antwort = {{ condition.answerValue }}</strong></div>
|
||||
<div>{{ condition.sourceQuestionLabel ?: ('Frage #' ~ condition.sourceQuestion) }}</div>
|
||||
<div>weiter zu {{ condition.targetQuestionLabel ?: ('Frage #' ~ condition.targetQuestion) }}</div>
|
||||
{% if not locked %}
|
||||
<div class="survey-button-row">
|
||||
<a class="survey-button secondary" href="?survey={{ survey.id }}&condition={{ condition.id }}">Bearbeiten</a>
|
||||
<form method="post">
|
||||
<input type="hidden" name="_survey_action" value="delete-condition">
|
||||
<input type="hidden" name="item_id" value="{{ condition.id }}">
|
||||
<input type="hidden" name="_token" value="{{ csrf_token('delete-condition-' ~ condition.id) }}">
|
||||
<button class="survey-button danger" onclick="return confirm('Bedingung wirklich loeschen?');">Loeschen</button>
|
||||
</form>
|
||||
</div>
|
||||
{% endif %}
|
||||
</article>
|
||||
{% else %}
|
||||
<div>Noch keine Bedingungen definiert.</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</section>
|
||||
@@ -0,0 +1,52 @@
|
||||
{% include '@Survey/frontend/_survey_assets.html.twig' %}
|
||||
{% include '@Survey/frontend/_survey_branding.html.twig' %}
|
||||
|
||||
<section class="survey-shell survey-grid">
|
||||
{% if headline.text %}
|
||||
<header>
|
||||
<h2>{{ headline.text }}</h2>
|
||||
</header>
|
||||
{% endif %}
|
||||
|
||||
{% if loginRequired %}
|
||||
<div class="survey-alert warning">Dieser Bereich verwendet den normalen Contao-Mitgliederlogin. Bitte binden Sie das Modul auf einer geschuetzten Seite oder mit einer separaten Login-Seite ein.</div>
|
||||
{% else %}
|
||||
<div class="survey-button-row">
|
||||
{% if createUrl %}
|
||||
<a class="survey-button primary" href="{{ createUrl }}">Neue Umfrage anlegen</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="survey-grid">
|
||||
{% for survey in surveys %}
|
||||
<article class="survey-card">
|
||||
<div class="survey-meta">
|
||||
<h3>{{ survey.title }}</h3>
|
||||
<span class="survey-badge {{ survey.published ? 'success' : 'neutral' }}">{{ survey.published ? 'veroeffentlicht' : 'Entwurf' }}</span>
|
||||
{% if survey.isLocked %}
|
||||
<span class="survey-badge warning">gesperrt</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<p>{{ survey.description ?: 'Keine Beschreibung hinterlegt.' }}</p>
|
||||
<div class="survey-meta">
|
||||
<span class="survey-badge neutral">{{ survey.questionCount }} Fragen</span>
|
||||
<span class="survey-badge neutral">{{ survey.answerCount }} Antworten</span>
|
||||
</div>
|
||||
<div class="survey-button-row">
|
||||
{% if survey.editUrl %}
|
||||
<a class="survey-button primary" href="{{ survey.editUrl }}">Bearbeiten</a>
|
||||
{% endif %}
|
||||
{% if survey.publicUrl %}
|
||||
<a class="survey-button secondary" href="{{ survey.publicUrl }}" target="_blank" rel="noreferrer">Oeffentliche Ansicht</a>
|
||||
{% endif %}
|
||||
{% if survey.resultsUrl %}
|
||||
<a class="survey-button secondary" href="{{ survey.resultsUrl }}" target="_blank" rel="noreferrer">Ergebnisse anzeigen</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</article>
|
||||
{% else %}
|
||||
<div class="survey-card">Dem eingeloggten Mitglied ist aktuell keine Umfrage zugewiesen.</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</section>
|
||||
@@ -0,0 +1,84 @@
|
||||
{% include '@Survey/frontend/_survey_assets.html.twig' %}
|
||||
{% include '@Survey/frontend/_survey_branding.html.twig' %}
|
||||
|
||||
<section class="survey-shell survey-grid">
|
||||
{% if headline.text %}
|
||||
<header><h2>{{ headline.text }}</h2></header>
|
||||
{% endif %}
|
||||
|
||||
{% if errorMessage %}
|
||||
<div class="survey-alert error">{{ errorMessage }}</div>
|
||||
{% elseif survey %}
|
||||
<article class="survey-card">
|
||||
<div class="survey-meta">
|
||||
<h3>{{ survey.title }}</h3>
|
||||
{% if progress.total > 0 %}<span class="survey-badge neutral">{{ progress.current }}/{{ progress.total }}</span>{% endif %}
|
||||
</div>
|
||||
<p>{{ survey.description ?: 'Bitte beantworten Sie die folgenden Fragen. Jede Frage wird einzeln angezeigt.' }}</p>
|
||||
|
||||
{% if progress.total > 0 %}
|
||||
<div class="survey-progress"><span style="width: {{ progress.percentage }}%"></span></div>
|
||||
{% endif %}
|
||||
</article>
|
||||
|
||||
{% if isComplete %}
|
||||
<article class="survey-card">
|
||||
<h3>Vielen Dank fuers Ausfuellen.</h3>
|
||||
<p>Ihre Antworten wurden anonym gespeichert. Es wurde keine Teilnehmeridentitaet mit diesem Umfrage-Durchlauf verknuepft.</p>
|
||||
{% if answers %}
|
||||
<div class="survey-grid">
|
||||
{% for answer in answers %}
|
||||
<article class="survey-card">
|
||||
<div class="survey-badge neutral">{{ answer.questionType }}</div>
|
||||
<h4>{{ answer.question }}</h4>
|
||||
<p>{{ answer.value }}</p>
|
||||
</article>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</article>
|
||||
{% elseif question %}
|
||||
<article class="survey-card">
|
||||
<div class="survey-meta"><span class="survey-badge neutral">Frage {{ progress.current }}</span></div>
|
||||
<h3>{{ question.question }}</h3>
|
||||
{% if question.description %}<p>{{ question.description }}</p>{% endif %}
|
||||
|
||||
{{ form_start(surveyForm, {attr: {class: 'survey-form-grid'}}) }}
|
||||
<input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}">
|
||||
{% if question.type == 'yes_no_maybe' %}
|
||||
<div class="survey-grid" style="grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));">
|
||||
{% for child in surveyForm.answer %}
|
||||
<label class="survey-card" style="cursor: pointer;">
|
||||
<div class="survey-meta"><strong>{{ child.vars.label }}</strong>{{ form_widget(child) }}</div>
|
||||
<div>Diese Antwort wird direkt fuer den weiteren Ablauf verwendet.</div>
|
||||
</label>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% elseif question.type == 'choice' %}
|
||||
<div class="survey-grid" style="grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));">
|
||||
{% for child in surveyForm.answer %}
|
||||
<label class="survey-card" style="cursor: pointer;">
|
||||
<div class="survey-meta"><strong>{{ child.vars.label }}</strong>{{ form_widget(child) }}</div>
|
||||
</label>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% elseif question.type == 'range' %}
|
||||
<div class="survey-grid">
|
||||
<div class="survey-card">
|
||||
<div>Aktueller Wert</div>
|
||||
<div id="survey-range-output-{{ question.id }}" class="survey-range-output">{{ question.rangeMin }}</div>
|
||||
</div>
|
||||
{{ form_widget(surveyForm.answer, {attr: {'data-survey-range': '1', 'data-survey-range-target': 'survey-range-output-' ~ question.id}}) }}
|
||||
<div class="survey-meta"><span>{{ question.rangeMin }}</span><span>{{ question.rangeMax }}</span></div>
|
||||
</div>
|
||||
{% else %}
|
||||
{{ form_widget(surveyForm.answer) }}
|
||||
{% endif %}
|
||||
|
||||
{{ form_errors(surveyForm.answer) }}
|
||||
<div class="survey-button-row"><button class="survey-button primary">Weiter</button></div>
|
||||
{{ form_end(surveyForm) }}
|
||||
</article>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</section>
|
||||
@@ -0,0 +1,162 @@
|
||||
{% include '@Survey/frontend/_survey_assets.html.twig' %}
|
||||
{% include '@Survey/frontend/_survey_branding.html.twig' %}
|
||||
|
||||
<section class="survey-shell survey-grid">
|
||||
{% if headline.text %}
|
||||
<header>
|
||||
<h2>{{ headline.text }}</h2>
|
||||
</header>
|
||||
{% endif %}
|
||||
|
||||
{% if errorMessage %}
|
||||
<div class="survey-alert warning">{{ errorMessage }}</div>
|
||||
{% elseif survey %}
|
||||
<article class="survey-card">
|
||||
<div class="survey-meta">
|
||||
<h2>{{ survey.title }}</h2>
|
||||
<span class="survey-badge neutral">{{ completedSubmissionCount }} abgeschlossene Teilnahmen</span>
|
||||
<span class="survey-badge neutral">{{ questionResults|length }} Fragen</span>
|
||||
</div>
|
||||
|
||||
<p>{{ survey.description ?: 'Keine Beschreibung hinterlegt.' }}</p>
|
||||
|
||||
{% if downloadUrl or pdfDownloadUrl %}
|
||||
<div class="survey-button-row">
|
||||
{% if downloadUrl %}
|
||||
<a class="survey-button primary" href="{{ downloadUrl }}">Ergebnisse als Excel herunterladen</a>
|
||||
{% endif %}
|
||||
{% if pdfDownloadUrl %}
|
||||
<a class="survey-button secondary" href="{{ pdfDownloadUrl }}">Ergebnisse als PDF herunterladen</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</article>
|
||||
|
||||
<div class="survey-grid">
|
||||
{% for question in questionResults %}
|
||||
<article class="survey-card survey-results-card">
|
||||
<div class="survey-meta">
|
||||
<h3>{{ question.question }}</h3>
|
||||
<span class="survey-badge neutral">{{ question.totalAnswers }} Antworten</span>
|
||||
<span class="survey-badge neutral">{{ question.responseRate }}% Ruecklauf</span>
|
||||
</div>
|
||||
|
||||
{% if question.description %}
|
||||
<p>{{ question.description }}</p>
|
||||
{% endif %}
|
||||
|
||||
<div class="survey-results-layout{% if not question.chart %} no-chart{% endif %}">
|
||||
{% if question.chart %}
|
||||
<div class="survey-chart-panel{% if question.chart.type == 'line' %} is-line{% endif %}">
|
||||
<div class="survey-chart-frame">
|
||||
<canvas class="survey-chart-canvas" data-survey-chart="{{ question.chart|json_encode|e('html_attr') }}"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="survey-results-panel">
|
||||
{% if question.type in ['yes_no_maybe', 'choice'] %}
|
||||
<div class="survey-results-list">
|
||||
{% for option in question.options %}
|
||||
<div class="survey-results-row">
|
||||
<div class="survey-meta">
|
||||
<strong>{{ option.label }}</strong>
|
||||
<span class="survey-badge neutral">{{ option.count }}</span>
|
||||
<span class="survey-badge neutral">{{ option.percentage }}%</span>
|
||||
</div>
|
||||
<div class="survey-progress">
|
||||
<span class="survey-progress-bar" style="width: {{ option.percentage }}%"></span>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% elseif question.type == 'range' %}
|
||||
<div class="survey-metric-grid">
|
||||
<div class="survey-metric-card">
|
||||
<span class="survey-metric-label">Minimum</span>
|
||||
<strong>{{ question.minimum is not null ? question.minimum : '-' }}</strong>
|
||||
</div>
|
||||
<div class="survey-metric-card">
|
||||
<span class="survey-metric-label">Maximum</span>
|
||||
<strong>{{ question.maximum is not null ? question.maximum : '-' }}</strong>
|
||||
</div>
|
||||
<div class="survey-metric-card">
|
||||
<span class="survey-metric-label">Durchschnitt</span>
|
||||
<strong>{{ question.average is not null ? question.average : '-' }}</strong>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="survey-results-list">
|
||||
{% for option in question.distribution %}
|
||||
<div class="survey-results-row">
|
||||
<div class="survey-meta">
|
||||
<strong>{{ option.label }}</strong>
|
||||
<span class="survey-badge neutral">{{ option.count }}</span>
|
||||
<span class="survey-badge neutral">{{ option.percentage }}%</span>
|
||||
</div>
|
||||
<div class="survey-progress">
|
||||
<span class="survey-progress-bar" style="width: {{ option.percentage }}%"></span>
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<p>Noch keine Bewertungen vorhanden.</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
{% if question.responseSummary is defined and question.responseSummary %}
|
||||
<div class="survey-results-list">
|
||||
{% for option in question.responseSummary %}
|
||||
<div class="survey-results-row">
|
||||
<div class="survey-meta">
|
||||
<strong>{{ option.label }}</strong>
|
||||
<span class="survey-badge neutral">{{ option.count }}</span>
|
||||
<span class="survey-badge neutral">{{ option.percentage }}%</span>
|
||||
</div>
|
||||
<div class="survey-progress">
|
||||
<span class="survey-progress-bar" style="width: {{ option.percentage }}%"></span>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="survey-results-list survey-results-responses">
|
||||
{% for response in question.responses %}
|
||||
<blockquote class="survey-card survey-response-card">{{ response|nl2br }}</blockquote>
|
||||
{% else %}
|
||||
<p>Noch keine Freitextantworten vorhanden.</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
{% else %}
|
||||
<article class="survey-card">Fuer diese Umfrage sind noch keine Fragen angelegt.</article>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</section>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.5.1/dist/chart.umd.min.js"></script>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
if (typeof Chart === 'undefined') {
|
||||
return;
|
||||
}
|
||||
|
||||
document.querySelectorAll('[data-survey-chart]').forEach(function (canvas) {
|
||||
try {
|
||||
var chartConfig = JSON.parse(canvas.getAttribute('data-survey-chart') || '{}');
|
||||
|
||||
if (!chartConfig.type || !chartConfig.data) {
|
||||
return;
|
||||
}
|
||||
|
||||
new Chart(canvas, chartConfig);
|
||||
} catch (error) {
|
||||
console.error('Survey chart could not be initialized.', error);
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
Reference in New Issue
Block a user