Quellcode durchsuchen

Initial Commit: EUM-Site-Package

eliasCybob vor 3 Monaten
Commit
22d3d5b0a9
100 geänderte Dateien mit 3370 neuen und 0 gelöschten Zeilen
  1. 60 0
      .editorconfig
  2. 4 0
      .gitignore
  3. 114 0
      Classes/Utility/TcaUtility.php
  4. 22 0
      Configuration/RTE/Preset.yaml
  5. 9 0
      Configuration/Services.yaml
  6. 28 0
      Configuration/TCA/Overrides/pages.php
  7. 3 0
      Configuration/TCA/Overrides/sys_redirect.php
  8. 11 0
      Configuration/TCA/Overrides/sys_template.php
  9. 54 0
      Configuration/TCA/Overrides/tt_content.php
  10. 5 0
      Configuration/TSconfig/Page/basic.tsconfig
  11. 70 0
      Configuration/TSconfig/Page/mod.tsconfig
  12. 0 0
      Configuration/TSconfig/Page/rte.tsconfig
  13. 22 0
      Configuration/TSconfig/Page/tcadefaults.tsconfig
  14. 59 0
      Configuration/TSconfig/Page/tceform.tsconfig
  15. 43 0
      Configuration/TSconfig/Page/tcemain.tsconfig
  16. 26 0
      Configuration/TypoScript/Base/constants.typoscript
  17. 16 0
      Configuration/TypoScript/Base/setup.typoscript
  18. 37 0
      Configuration/TypoScript/Config/constants.typoscript
  19. 3 0
      Configuration/TypoScript/Config/setup.typoscript
  20. 38 0
      Configuration/TypoScript/Content/setup.typoscript
  21. 40 0
      Configuration/TypoScript/Extension/Container/setup.typoscript
  22. 5 0
      Configuration/TypoScript/Extension/ContentSlug/constants.typoscript
  23. 5 0
      Configuration/TypoScript/Extension/Form/setup.typoscript
  24. 10 0
      Configuration/TypoScript/Extension/Powermail/constants.typoscript
  25. 1 0
      Configuration/TypoScript/Extension/Powermail/setup.typoscript
  26. 2 0
      Configuration/TypoScript/Extension/constants.typoscript
  27. 3 0
      Configuration/TypoScript/Extension/setup.typoscript
  28. 34 0
      Configuration/TypoScript/Lib/setup.typoscript
  29. 47 0
      Configuration/TypoScript/Page/constants.typoscript
  30. 122 0
      Configuration/TypoScript/Page/setup.typoscript
  31. 19 0
      Configuration/TypoScript/Theme/constants.typoscript
  32. 47 0
      Configuration/TypoScript/Theme/setup.typoscript
  33. 12 0
      Resources/Private/Language/de.locallang.xlf
  34. 11 0
      Resources/Private/Language/locallang.xlf
  35. 34 0
      Resources/Private/Layouts/Container/Default.html
  36. 58 0
      Resources/Private/Layouts/Content/Default.html
  37. 8 0
      Resources/Private/Layouts/Extensions/Powermail/Layouts/ContentElements/Export/Default.html
  38. 5 0
      Resources/Private/Layouts/Extensions/Powermail/Layouts/Default.html
  39. 1 0
      Resources/Private/Layouts/Extensions/Powermail/Layouts/Export.html
  40. 1 0
      Resources/Private/Layouts/Extensions/Powermail/Layouts/Mail.html
  41. 1 0
      Resources/Private/Layouts/Extensions/Powermail/Layouts/PowermailAll.html
  42. 11 0
      Resources/Private/Layouts/Page/Default.html
  43. 7 0
      Resources/Private/Layouts/Page/Iframe.html
  44. 119 0
      Resources/Private/Partials/Content/Menu/Menu.html
  45. 23 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Captcha.html
  46. 30 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Check.html
  47. 7 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Content.html
  48. 22 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Country.html
  49. 15 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Date.html
  50. 30 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/File.html
  51. 6 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Hidden.html
  52. 20 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Html.html
  53. 17 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Input.html
  54. 14 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Location.html
  55. 31 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Password.html
  56. 26 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Radio.html
  57. 6 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Reset.html
  58. 23 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Select.html
  59. 6 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Submit.html
  60. 6 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Text.html
  61. 19 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Textarea.html
  62. 6 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Typoscript.html
  63. 11 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/FieldLabel.html
  64. 40 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Form/Page.html
  65. 6 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Mail/DisclaimerLink.html
  66. 4 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Misc/FlashMessages.html
  67. 81 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Misc/FormError.html
  68. 17 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Misc/GoogleAdwordsConversion.html
  69. 15 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Misc/HoneyPod.html
  70. 33 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Misc/MarketingInformation.html
  71. 34 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/CheckWrongLocalizedForms.html
  72. 34 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/CheckWrongLocalizedPages.html
  73. 32 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/DevelopmentContext.html
  74. 58 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/Email.html
  75. 30 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/ExtMngConfig.html
  76. 20 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/Mode.html
  77. 80 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/PowermailVersionNote.html
  78. 30 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/Session.html
  79. 32 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/StaticTemplate.html
  80. 30 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/T3Version.html
  81. 33 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/UploadsFolder.html
  82. 154 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/Export.html
  83. 37 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/Filter.html
  84. 12 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/JsAndCssImport.html
  85. 329 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/List.html
  86. 86 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/OverviewBe.html
  87. 39 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/Pagination.html
  88. 133 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/Search.html
  89. 19 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/SearchButtons.html
  90. 5 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Module/SelectedLineMessage.html
  91. 22 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Output/Abc.html
  92. 24 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Output/EditHidden.html
  93. 53 0
      Resources/Private/Partials/Extensions/Powermail/Partials/Output/Search.html
  94. 26 0
      Resources/Private/Partials/Extensions/Powermail/Partials/PowermailAll/Mail.html
  95. 26 0
      Resources/Private/Partials/Extensions/Powermail/Partials/PowermailAll/Web.html
  96. 39 0
      Resources/Private/Partials/Form/Navigation.html
  97. 27 0
      Resources/Private/Partials/Page/Breadcrumb.html
  98. 41 0
      Resources/Private/Partials/Page/Footer.html
  99. 10 0
      Resources/Private/Partials/Page/Footer/Legalnavigation.html
  100. 134 0
      Resources/Private/Partials/Page/General/Socials.html

+ 60 - 0
.editorconfig

@@ -0,0 +1,60 @@
+# EditorConfig is awesome: http://EditorConfig.org
+
+# top-most EditorConfig file
+root = true
+
+# Unix-style newlines with a newline ending every file
+[*]
+charset = utf-8
+end_of_line = lf
+indent_style = space
+indent_size = 4
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+# TS/JS-Files
+[*.{ts,js}]
+indent_size = 2
+
+# HTML-Files
+[*.html]
+indent_size = 2
+
+# JSON-Files
+[*.json]
+indent_style = tab
+
+# ReST-Files
+[*.rst]
+indent_size = 4
+max_line_length = 80
+
+# YAML-Files
+[*.{yaml,yml}]
+indent_size = 2
+
+# NEON-Files
+[*.neon]
+indent_size = 2
+indent_style = tab
+
+# package.json
+[package.json]
+indent_size = 2
+
+# TypoScript
+[*.{typoscript,tsconfig}]
+indent_size = 2
+
+# XLF-Files
+[*.xlf]
+indent_style = tab
+
+# SQL-Files
+[*.sql]
+indent_style = tab
+indent_size = 2
+
+# .htaccess
+[{_.htaccess,.htaccess}]
+indent_style = tab

+ 4 - 0
.gitignore

@@ -0,0 +1,4 @@
+/.idea/
+/Documentation-GENERATED-temp/
+*/.DS_Store
+.DS_Store

+ 114 - 0
Classes/Utility/TcaUtility.php

@@ -0,0 +1,114 @@
+<?php
+declare(strict_types=1);
+
+namespace CYBOB\EumSitePackage\Utility;
+
+/**
+ * @package \CYBOB\EumSitePackage\Utility
+ */
+class TcaUtility
+{
+    /**
+     * Returns a default crop editor configuration.
+     *
+     * @return array[]
+     */
+    public static function getDefaultCropConfiguration(): array
+    {
+        return [
+            'desktop' => [
+                'title' => 'Desktop (min-width: 1200px)',
+                'cropArea' => [
+                    'x' => 0.0,
+                    'y' => 0.0,
+                    'width' => 1.0,
+                    'height' => 1.0
+                ],
+                'allowedAspectRatios' => [
+                    '1:1' => [
+                        'title' => '1:1',
+                        'value' => 1.0
+                    ],
+                    '4:3' => [
+                        'title' => '4:3',
+                        'value' => 4 / 3
+                    ],
+                    '6:7' => [
+                        'title' => '6:7',
+                        'value' => 6 / 6.9345372460
+                    ],
+                    '16:9' => [
+                        'title' => '16:9',
+                        'value' => 16 / 9
+                    ],
+                    'NaN' => [
+                        'title' => 'Free',
+                        'value' => 0.0
+                    ]
+                ]
+            ],
+            'tablet' => [
+                'title' => 'Tablet (max-width: 1200px)',
+                'cropArea' => [
+                    'x' => 0.0,
+                    'y' => 0.0,
+                    'width' => 1.0,
+                    'height' => 1.0
+                ],
+                'allowedAspectRatios' => [
+                    '1:1' => [
+                        'title' => '1:1',
+                        'value' => 1.0
+                    ],
+                    '4:3' => [
+                        'title' => '4:3',
+                        'value' => 4 / 3
+                    ],
+                    '6:7' => [
+                        'title' => '6:7',
+                        'value' => 6 / 6.9345372460
+                    ],
+                    '16:9' => [
+                        'title' => '16:9',
+                        'value' => 16 / 9
+                    ],
+                    'NaN' => [
+                        'title' => 'Free',
+                        'value' => 0.0
+                    ]
+                ]
+            ],
+            'mobile' => [
+                'title' => 'Mobile (max-width: 750px)',
+                'cropArea' => [
+                    'x' => 0.0,
+                    'y' => 0.0,
+                    'width' => 1.0,
+                    'height' => 1.0
+                ],
+                'allowedAspectRatios' => [
+                    '1:1' => [
+                        'title' => '1:1',
+                        'value' => 1.0
+                    ],
+                    '4:3' => [
+                        'title' => '4:3',
+                        'value' => 4 / 3
+                    ],
+                    '6:7' => [
+                        'title' => '6:7',
+                        'value' => 6 / 6.9345372460
+                    ],
+                    '16:9' => [
+                        'title' => '16:9',
+                        'value' => 16 / 9
+                    ],
+                    'NaN' => [
+                        'title' => 'Free',
+                        'value' => 0.0
+                    ]
+                ]
+            ]
+        ];
+    }
+}

+ 22 - 0
Configuration/RTE/Preset.yaml

@@ -0,0 +1,22 @@
+#
+# import basic
+#
+
+imports:
+ - { resource: "EXT:site_package/Configuration/RTE/BasicPreset.yaml" }
+
+editor:
+  config:
+    #
+    # add custom rte css
+    #
+
+    contentsCss:
+      - "EXT:eum_site_package/Resources/Public/Css/rte.css"
+
+    #
+    # add custom style options
+    #
+
+    stylesSet:
+      - { name: "Button Hover", element: "a", attributes: { class: "btn link" } }

+ 9 - 0
Configuration/Services.yaml

@@ -0,0 +1,9 @@
+services:
+  _defaults:
+    autowire: true
+    autoconfigure: true
+    public: false
+
+  CYBOB\EumSitePackage\:
+    resource: '../Classes/*'
+    exclude: '../Classes/Domain/Model/*'

+ 28 - 0
Configuration/TCA/Overrides/pages.php

@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * Register static Page TSconfig file
+ */
+
+\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::registerPageTSConfigFile(
+    'eum_site_package',
+    'Configuration/TSconfig/Page/basic.tsconfig',
+    'E&M site package'
+);
+
+/**
+ * Add crop editor
+ */
+
+$cropConfiguration = \CYBOB\EumSitePackage\Utility\TcaUtility::getDefaultCropConfiguration();;
+
+$GLOBALS['TCA']['pages']['columns']['media']['config']['overrideChildTca']['columns']['crop']['config'] = [
+    'cropVariants' => array_merge_recursive(
+        [
+            'default' => [
+                'disabled' => true
+            ]
+        ],
+        $cropConfiguration
+    )
+];

+ 3 - 0
Configuration/TCA/Overrides/sys_redirect.php

@@ -0,0 +1,3 @@
+<?php
+
+$GLOBALS['TCA']['sys_redirect']['columns']['target_statuscode']['config']['default'] = 301;

+ 11 - 0
Configuration/TCA/Overrides/sys_template.php

@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * Register static TypoScript files
+ */
+
+\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile(
+    'eum_site_package',
+    'Configuration/TypoScript/Base',
+    'EUM site package'
+);

+ 54 - 0
Configuration/TCA/Overrides/tt_content.php

@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * Allow language synchronization for FAL fields
+ */
+
+$allowSync = [
+    'tt_content' => [
+        'image',
+        'media'
+    ]
+];
+
+foreach ($allowSync as $syncTablename => $syncColumns) {
+    foreach ($syncColumns as $syncColumn) {
+        $GLOBALS['TCA'][$syncTablename]['columns'][$syncColumn]['config']['behaviour']['allowLanguageSynchronization'] = 1;
+    }
+}
+
+/**
+ * Add crop editor
+ */
+
+$cropConfiguration = \CYBOB\EumSitePackage\Utility\TcaUtility::getDefaultCropConfiguration();
+
+$cropColumnsByType = [
+    'image' => [
+        'image'
+    ],
+    'menu_pages' => [
+        'image'
+    ],
+    'menu_subpages' => [
+        'image'
+    ],
+    'menu_categorized_pages' => [
+        'image'
+    ]
+];
+
+foreach ($cropColumnsByType as $type => $cropColumns) {
+    foreach ($cropColumns as $cropColumn) {
+        $GLOBALS['TCA']['tt_content']['types'][$type]['columnsOverrides'][$cropColumn]['config']['overrideChildTca']['columns']['crop']['config'] = [
+            'cropVariants' => array_merge_recursive(
+                [
+                    'default' => [
+                        'disabled' => true
+                    ]
+                ],
+                $cropConfiguration
+            )
+        ];
+    }
+}

+ 5 - 0
Configuration/TSconfig/Page/basic.tsconfig

@@ -0,0 +1,5 @@
+@import 'EXT:eum_site_package/Configuration/TSconfig/Page/rte.tsconfig'
+@import 'EXT:eum_site_package/Configuration/TSconfig/Page/tcadefaults.tsconfig'
+@import 'EXT:eum_site_package/Configuration/TSconfig/Page/tceform.tsconfig'
+@import 'EXT:eum_site_package/Configuration/TSconfig/Page/tcemain.tsconfig'
+@import 'EXT:eum_site_package/Configuration/TSconfig/Page/mod.tsconfig'

+ 70 - 0
Configuration/TSconfig/Page/mod.tsconfig

@@ -0,0 +1,70 @@
+#
+# Mod Config
+#
+
+mod {
+  #
+  # Backend layouts
+  #
+
+  web_layout.BackendLayouts {
+    header_content {
+      title = Header & Content
+
+      config.backend_layout {
+        colCount = 1
+        rowCount = 2
+
+        rows {
+          1 {
+            columns {
+              1 {
+                name = Header
+                colPos = 3
+                colspan = 1
+
+                #
+                # Content defender
+                #
+
+                disallowed {
+                  CType = 1col-container, 2cols-with-header-container, 3cols-container
+                }
+              }
+            }
+          }
+
+          2 {
+            columns {
+              1 {
+                name = Content
+                colPos = 0
+                colspan = 1
+              }
+            }
+          }
+        }
+      }
+    }
+
+    iframe {
+      title = iFrame
+
+      config.backend_layout {
+        colCount = 1
+        rowCount = 1
+        rows {
+          1 {
+            columns {
+              1 {
+                name = Content
+                colPos = 0
+                colspan = 1
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}

+ 0 - 0
Configuration/TSconfig/Page/rte.tsconfig


+ 22 - 0
Configuration/TSconfig/Page/tcadefaults.tsconfig

@@ -0,0 +1,22 @@
+#
+# TCAdefaults Config
+#
+
+TCAdefaults {
+
+  #
+  # Content
+  #
+
+  tt_content {
+    image_zoom = 1
+  }
+
+  #
+  # Pages
+  #
+
+  pages {
+
+  }
+}

+ 59 - 0
Configuration/TSconfig/Page/tceform.tsconfig

@@ -0,0 +1,59 @@
+#
+# TCEFORM Config
+#
+
+TCEFORM {
+
+  #
+  # Content
+  #
+
+  tt_content {
+    layout.types {
+
+      #
+      # Container elements
+      #
+
+      1col-container {
+        altLabels {
+          0 = Default
+          1 = Container
+          2 = Container Fluid
+          3 = Container Fluid (no padding)
+        }
+      }
+
+      2cols-with-header-container < .1col-container
+      3cols-container < .1col-container
+
+      #
+      # Menu elements
+      #
+
+      menu_subpages {
+        altLabels {
+          1 = LLL - Category
+        }
+
+        keepItems = 0,1
+      }
+    }
+
+    frame_class {
+      keepItems =
+
+      addItems {
+        default = Default
+      }
+    }
+  }
+
+  #
+  # Pages
+  #
+
+  pages {
+
+  }
+}

+ 43 - 0
Configuration/TSconfig/Page/tcemain.tsconfig

@@ -0,0 +1,43 @@
+#
+# TCEMAIN Config
+#
+
+TCEMAIN {
+
+  #
+  # Table
+  #
+
+  table {
+
+    #
+    # Pages
+    #
+
+    pages {
+      disablePrependAtCopy = 1
+    }
+
+    #
+    # Content
+    #
+
+    tt_content {
+      disablePrependAtCopy = 1
+    }
+  }
+
+  #
+  # Permissions
+  #
+
+  permissions {
+    everybody = show
+
+    group = show,edit,new,delete,editcontent
+    groupid = 4
+
+    user = show,edit,new,delete,editcontent
+    userid = 1
+  }
+}

+ 26 - 0
Configuration/TypoScript/Base/constants.typoscript

@@ -0,0 +1,26 @@
+#
+# dependencies
+#
+
+@import 'EXT:site_package/Configuration/TypoScript/Base/constants.typoscript'
+
+#
+# EUM site package
+#
+
+styles.templates {
+  templateRootPath = EXT:eum_site_package/Resources/Private/Templates/Content/
+  partialRootPath = EXT:eum_site_package/Resources/Private/Partials/Content/
+  layoutRootPath = EXT:eum_site_package/Resources/Private/Layouts/Content/
+
+  lib {
+    templateRootPath = EXT:eum_site_package/Resources/Private/Templates/Lib/
+    partialRootPath = EXT:eum_site_package/Resources/Private/Partials/Lib/
+    layoutRootPath = EXT:eum_site_package/Resources/Private/Layouts/Lib/
+  }
+}
+
+@import 'EXT:eum_site_package/Configuration/TypoScript/Config/constants.typoscript'
+@import 'EXT:eum_site_package/Configuration/TypoScript/Page/constants.typoscript'
+@import 'EXT:eum_site_package/Configuration/TypoScript/Theme/constants.typoscript'
+@import 'EXT:eum_site_package/Configuration/TypoScript/Extension/constants.typoscript'

+ 16 - 0
Configuration/TypoScript/Base/setup.typoscript

@@ -0,0 +1,16 @@
+#
+# dependencies
+#
+
+@import 'EXT:site_package/Configuration/TypoScript/Base/setup.typoscript'
+
+#
+# E&M site package
+#
+
+@import 'EXT:eum_site_package/Configuration/TypoScript/Config/setup.typoscript'
+@import 'EXT:eum_site_package/Configuration/TypoScript/Page/setup.typoscript'
+@import 'EXT:eum_site_package/Configuration/TypoScript/Content/setup.typoscript'
+@import 'EXT:eum_site_package/Configuration/TypoScript/Theme/setup.typoscript'
+@import 'EXT:eum_site_package/Configuration/TypoScript/Extension/setup.typoscript'
+@import 'EXT:eum_site_package/Configuration/TypoScript/Lib/setup.typoscript'

+ 37 - 0
Configuration/TypoScript/Config/constants.typoscript

@@ -0,0 +1,37 @@
+#
+# Config constants
+#
+
+config {
+
+  #
+  # Assets
+  #
+
+  assets {
+    compressCss = 0
+    compressJs = 0
+    concatenateCss = 0
+    concatenateJs = 0
+  }
+
+  #
+  # General
+  #
+
+  general {
+    baseURL = https://p678948.webspaceconfig.de/
+    baseURLdev = https://p678948.webspaceconfig.de/
+    siteTitle = E&M NRW
+    no_cache = 1
+    sendCacheHeaders = 0
+  }
+
+  #
+  # Security
+  #
+
+  security {
+    cspAdditions = style-src 'self' 'unsafe-inline'; img-src 'self' https://*.googleapis.com https://maps.gstatic.com/ data:; object-src 'self' data:; frame-src 'self' mailto: tel: *.krone-dev.cybob-one.com *.youtube.com *.youtube-nocookie.com; script-src 'self' https://*.googleapis.com; connect-src 'self' https://*.googleapis.com; font-src 'self'
+  }
+}

+ 3 - 0
Configuration/TypoScript/Config/setup.typoscript

@@ -0,0 +1,3 @@
+#
+# Config setup
+#

+ 38 - 0
Configuration/TypoScript/Content/setup.typoscript

@@ -0,0 +1,38 @@
+#
+# Content elements setup
+#
+
+tt_content {
+  image.dataProcessing {
+    60 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
+    60 {
+      if {
+        value.field = layout
+        equals = 2
+      }
+
+      table = pages
+      uidInList = this
+      pidInList = 0
+      max = 1
+      as = page
+    }
+
+    70 = CYBOB\SitePackage\DataProcessing\ParentContainerProcessor
+    70 {
+      if.isTrue.field = tx_container_parent
+      as = container
+    }
+  }
+
+  menu_pages.dataProcessing.50 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
+  menu_pages.dataProcessing.50 {
+    if.isTrue.field = image
+
+    as = files
+    references.fieldName = image
+  }
+
+  menu_subpages.dataProcessing.50 < .menu_pages.dataProcessing.50
+  menu_categorized_pages.dataProcessing.50 < .menu_pages.dataProcessing.50
+}

+ 40 - 0
Configuration/TypoScript/Extension/Container/setup.typoscript

@@ -0,0 +1,40 @@
+#
+# Container setup
+#
+
+#
+# Base container
+#
+
+lib.containerElement {
+  templateRootPaths {
+    30 = EXT:eum_site_package/Resources/Private/Templates/Container/
+  }
+
+  partialRootPaths {
+    30 = EXT:eum_site_package/Resources/Private/Partials/Container/
+  }
+
+  layoutRootPaths {
+    30 = EXT:eum_site_package/Resources/Private/Layouts/Container/
+  }
+}
+
+#
+# Accordion container
+#
+
+tt_content.accordion-container < lib.containerElement
+tt_content.accordion-container {
+  templateName = Accordion
+
+  dataProcessing {
+    10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
+    10 {
+      if.isTrue.field = image
+
+      as = images
+      references.fieldName = image
+    }
+  }
+}

+ 5 - 0
Configuration/TypoScript/Extension/ContentSlug/constants.typoscript

@@ -0,0 +1,5 @@
+#
+# EXT:content_slug Constants
+#
+
+plugin.tx_contentslug.settings.renderPrefix = 0

+ 5 - 0
Configuration/TypoScript/Extension/Form/setup.typoscript

@@ -0,0 +1,5 @@
+#
+# Form setup
+#
+
+@import 'EXT:form/Configuration/TypoScript/setup.typoscript'

+ 10 - 0
Configuration/TypoScript/Extension/Powermail/constants.typoscript

@@ -0,0 +1,10 @@
+@import 'EXT:in2code/powermail/Configuration/TypoScript/Main/constants.typoscript'
+
+plugin.tx_powermail {
+    view {
+        templateRootPath  = EXT:eum_site_package/Resources/Private/Templates/Extensions/Powermail/Templates/
+        partialRootPath   = EXT:eum_site_package/Resources/Private/Partials/Extensions/Powermail/Partials/
+        layoutRootPath    = EXT:eum_site_package/Resources/Private/Layouts/Extensions/Powermail/Layouts/
+
+    }
+}

+ 1 - 0
Configuration/TypoScript/Extension/Powermail/setup.typoscript

@@ -0,0 +1 @@
+@import 'EXT:in2code/powermail/Configuration/TypoScript/Main/setup.typoscript'

+ 2 - 0
Configuration/TypoScript/Extension/constants.typoscript

@@ -0,0 +1,2 @@
+@import 'EXT:eum_site_package/Configuration/TypoScript/Extension/ContentSlug/constants.typoscript'
+@import 'EXT:eum_site_package/Configuration/TypoScript/Extension/Powermail/constants.typoscript'

+ 3 - 0
Configuration/TypoScript/Extension/setup.typoscript

@@ -0,0 +1,3 @@
+@import 'EXT:eum_site_package/Configuration/TypoScript/Extension/Container/setup.typoscript'
+@import 'EXT:eum_site_package/Configuration/TypoScript/Extension/Form/setup.typoscript'
+@import 'EXT:eum_site_package/Configuration/TypoScript/Extension/Powermail/setup.typoscript'

+ 34 - 0
Configuration/TypoScript/Lib/setup.typoscript

@@ -0,0 +1,34 @@
+#
+# Lib setup
+#
+
+lib.breadcrumb = FLUIDTEMPLATE
+lib.breadcrumb {
+  templateName = Breadcrumb
+
+  templateRootPaths {
+    0 = EXT:eum_site_package/Resources/Private/Templates/Lib/
+    1 = {$styles.templates.lib.templateRootPath}
+  }
+
+  partialRootPaths {
+    0 = EXT:eum_site_package/Resources/Private/Partials/Lib/
+    1 = {$styles.templates.lib.partialRootPath}
+  }
+
+  layoutRootPaths {
+    0 = EXT:eum_site_package/Resources/Private/Layouts/Lib/
+    1 = {$styles.templates.lib.layoutRootPath}
+  }
+
+  dataProcessing {
+    10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor
+    10 {
+      special = rootline
+      special.range = 0|-1
+
+      titleField = nav_title // title
+      as = breadcrumbnavigation
+    }
+  }
+}

+ 47 - 0
Configuration/TypoScript/Page/constants.typoscript

@@ -0,0 +1,47 @@
+#
+# Page constants
+#
+
+page {
+
+  #
+  # Template
+  #
+
+  template {
+    templateRootPath = EXT:eum_site_package/Resources/Private/Templates/Page/
+    partialRootPath = EXT:eum_site_package/Resources/Private/Partials/Page/
+    layoutRootPath = EXT:eum_site_package/Resources/Private/Layouts/Page/
+  }
+
+  #
+  # Menu
+  #
+
+  menu {
+    rootPid = 1
+    levels = 3
+  }
+
+  #
+  # Footer
+  #
+
+  footer {
+    sitemapRootPid =
+    legalRootPid = 30
+  }
+
+  #
+  # Socials
+  #
+
+  socials {
+    youtube =
+    facebook =
+    instagram =
+    xing =
+    linkedIn =
+    twitter =
+  }
+}

+ 122 - 0
Configuration/TypoScript/Page/setup.typoscript

@@ -0,0 +1,122 @@
+#
+# Page setup
+#
+
+page = PAGE
+page {
+
+  #
+  # Metadata
+  #
+
+  meta {
+    viewport = width=device-width, initial-scale=1, shrink-to-fit=no
+  }
+
+  shortcutIcon = EXT:eum_site_package/Resources/Public/Icons/favicon.ico
+
+  #
+  # Header Data
+  #
+  headerData {
+    10 = TEXT
+    10.value (
+        <link rel="shortcut icon" type="image/x-icon" href="/typo3conf/ext/eum_site_package/Resources/Public/Icons/favicon.ico" sizes="32x32">
+        <link rel="apple-touch-icon" sizes="192x192" href="/typo3conf/ext/eum_site_package/Resources/Public/Icons/apple-touch-icon.png">
+        <link rel="shortcut icon" href="/typo3conf/ext/eum_site_package/Resources/Public/Icons/android-icon.png" sizes="196x196">
+    )
+  }
+
+  #
+  # Body Tag
+  #
+  bodyTagCObject.10.50 = TEXT
+  bodyTagCObject.10.50 {
+    value = eum
+    noTrimWrap = | ||
+  }
+
+  #
+  # Template
+  #
+
+  10 {
+    templateName >
+    templateRootPaths >
+
+    file.stdWrap.cObject = CASE
+    file.stdWrap.cObject {
+      key.data = levelfield:-1, backend_layout_next_level, slide
+      key.override.field = backend_layout
+
+      default = TEXT
+      default.value = EXT:eum_site_package/Resources/Private/Templates/Page/Default.html
+
+      pagets__header_content = TEXT
+      pagets__header_content.value = EXT:eum_site_package/Resources/Private/Templates/Page/Default.html
+
+      pagets__iframe = TEXT
+      pagets__iframe.value = EXT:eum_site_package/Resources/Private/Templates/Page/Iframe.html
+    }
+
+    dataProcessing {
+      20 < .10
+      20 {
+        levels = 2
+        special.value = {$page.footer.sitemapRootPid}
+        as = footersitemap
+        dataProcessing >
+      }
+
+      30 < .20
+      30 {
+        levels = 2
+        special.value = {$page.footer.legalRootPid}
+        as = legalnavigation
+      }
+
+      40 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor
+      40 {
+        special = rootline
+        special.range = 0|-1
+
+        titleField = nav_title // title
+        as = breadcrumbnavigation
+      }
+
+      50 = TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor
+      50 {
+        languages = auto
+        as = languagenavigation
+      }
+
+      60 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
+      60 {
+        as = media
+        references.fieldName = media
+        references.table = pages
+      }
+    }
+
+    variables {
+
+    }
+  }
+
+  #
+  # CSS
+  #
+
+  includeCSS {
+    styles_eum = EXT:eum_site_package/Resources/Public/Css/styles.css
+  }
+
+  #
+  # JS
+  #
+
+  includeJSFooter {
+    jquery_min = EXT:eum_site_package/Resources/Public/Libraries/jquery/jquery-3.6.0.min.js
+    general = EXT:eum_site_package/Resources/Public/JavaScript/general.js
+  }
+}

+ 19 - 0
Configuration/TypoScript/Theme/constants.typoscript

@@ -0,0 +1,19 @@
+#
+# Theme constants
+#
+
+theme {
+
+  #
+  # Bootstrap
+  #
+
+  bootstrap {
+    bodyBg = $light
+    bodyColor = $dark
+    borderRounded =
+    borderStrength = 1
+    primary = $dark
+    secondary = $dark
+  }
+}

+ 47 - 0
Configuration/TypoScript/Theme/setup.typoscript

@@ -0,0 +1,47 @@
+#
+# Theme setup
+#
+
+#
+# SCSS variables
+#
+
+plugin.tx_wsscss.variables {
+
+  #
+  # Bootstrap
+  #
+
+  #
+  # Base colors
+  #
+
+  primary = {$theme.bootstrap.primary}
+  secondary = {$theme.bootstrap.secondary}
+  success = {$theme.bootstrap.success}
+  info = {$theme.bootstrap.info}
+  warning = {$theme.bootstrap.warning}
+  danger = {$theme.bootstrap.danger}
+  light = {$theme.bootstrap.light}
+  dark = {$theme.bootstrap.dark}
+
+  #
+  # Body colors
+  #
+
+  body-bg = {$theme.bootstrap.bodyBg}
+  body-color = {$theme.bootstrap.bodyColor}
+}
+
+#
+# Fluid styled content settings
+#
+
+lib.contentElement.settings {
+  #
+  # Additional settings
+  #
+
+  borderStrength = {$theme.bootstrap.borderStrength}
+  borderRounded = {$theme.bootstrap.borderRounded}
+}

+ 12 - 0
Resources/Private/Language/de.locallang.xlf

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xliff version="1.0" xmlns:t3="http://typo3.org/schemas/xliff">
+    <file source-language="en" target-language="de" datatype="plaintext" original="locallang.xlf" date="2022-05-17T16:00:00Z" product-name="eum-site-package">
+        <header/>
+        <body>
+             <trans-unit id="test" xml:space="preserve">
+                <source>test</source>
+                <target>test</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>

+ 11 - 0
Resources/Private/Language/locallang.xlf

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xliff version="1.0" xmlns:t3="http://typo3.org/schemas/xliff">
+    <file source-language="en" datatype="plaintext" original="locallang.xlf" date="2022-05-17T16:00:00Z" product-name="eum-site-package">
+        <header/>
+        <body>
+            <trans-unit id="test" xml:space="preserve">
+                <source>test</source>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>

+ 34 - 0
Resources/Private/Layouts/Container/Default.html

@@ -0,0 +1,34 @@
+<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
+
+<section>
+  <div class="container-wrapper">
+    <f:if condition="{data.sectionIndex}">
+      <a id="c{data.uid}"></a>
+
+      <f:if condition="{data._LOCALIZED_UID}">
+        <a id="c{data._LOCALIZED_UID}"></a>
+      </f:if>
+    </f:if>
+
+    <f:switch expression="{data.layout}">
+      <f:case value="1">
+        <f:variable name="containerClass" value="container"/>
+      </f:case>
+      <f:case value="2">
+        <f:variable name="containerClass" value="container-fluid"/>
+      </f:case>
+      <f:case value="3">
+        <f:variable name="containerClass" value="container-fluid p-0"/>
+      </f:case>
+      <f:defaultCase>
+        <f:variable name="containerClass" value="container"/>
+      </f:defaultCase>
+    </f:switch>
+
+    <div class="{containerClass} {f:if(condition: '{data.frame_class} != \'default\'', then: 'border border-{settings.borderStrength} {settings.borderRounded} border-{data.frame_class}')} layout-{data.layout} {data.space_before_class} {data.space_after_class}">
+      <f:render section="Main" optional="true"/>
+    </div>
+  </div>
+</section>
+
+</html>

+ 58 - 0
Resources/Private/Layouts/Content/Default.html

@@ -0,0 +1,58 @@
+<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
+
+<f:if condition="{data.frame_class} != none">
+  <f:then>
+
+    <f:if condition="{data.frame_class} != 'default'">
+      <div class="{data.frame_class}">
+    </f:if>
+
+    <div id="c{data.uid}"
+         class="ce ce-{data.CType} layout-{data.layout} {data.space_before_class} {data.space_after_class}">
+      <f:if condition="{data._LOCALIZED_UID}">
+        <a id="c{data._LOCALIZED_UID}"></a>
+      </f:if>
+      <f:render section="Before" optional="true">
+        <f:render partial="DropIn/Before/All" arguments="{_all}"/>
+      </f:render>
+      <f:render section="Header" optional="true">
+        <f:render partial="Header/All" arguments="{_all}"/>
+      </f:render>
+      <f:render section="Main" optional="true"/>
+      <f:render section="Footer" optional="true">
+        <f:render partial="Footer/All" arguments="{_all}"/>
+      </f:render>
+      <f:render section="After" optional="true">
+        <f:render partial="DropIn/After/All" arguments="{_all}"/>
+      </f:render>
+    </div>
+
+    <f:if condition="{data.frame_class} != 'default'">
+      </div>
+    </f:if>
+
+  </f:then>
+  <f:else>
+
+    <a id="c{data.uid}"></a>
+    <f:if condition="{data._LOCALIZED_UID}">
+      <a id="c{data._LOCALIZED_UID}"></a>
+    </f:if>
+    <f:render section="Before" optional="true">
+      <f:render partial="DropIn/Before/All" arguments="{_all}"/>
+    </f:render>
+    <f:render section="Header" optional="true">
+      <f:render partial="Header/All" arguments="{_all}"/>
+    </f:render>
+    <f:render section="Main" optional="true"/>
+    <f:render section="Footer" optional="true">
+      <f:render partial="Footer/All" arguments="{_all}"/>
+    </f:render>
+    <f:render section="After" optional="true">
+      <f:render partial="DropIn/After/All" arguments="{_all}"/>
+    </f:render>
+
+  </f:else>
+</f:if>
+
+</html>

+ 8 - 0
Resources/Private/Layouts/Extensions/Powermail/Layouts/ContentElements/Export/Default.html

@@ -0,0 +1,8 @@
+<f:spaceless>
+
+    <f:comment>
+        Overwrite the default content element layout for export files to remove the wrapper div
+    </f:comment>
+
+    <f:render section="Main" optional="true" />
+</f:spaceless>

+ 5 - 0
Resources/Private/Layouts/Extensions/Powermail/Layouts/Default.html

@@ -0,0 +1,5 @@
+<f:spaceless>
+	<div class="tx-powermail">
+		<f:render section="main" />
+	</div>
+</f:spaceless>

+ 1 - 0
Resources/Private/Layouts/Extensions/Powermail/Layouts/Export.html

@@ -0,0 +1 @@
+<f:render section="main" />

+ 1 - 0
Resources/Private/Layouts/Extensions/Powermail/Layouts/Mail.html

@@ -0,0 +1 @@
+<f:render section="main" />

+ 1 - 0
Resources/Private/Layouts/Extensions/Powermail/Layouts/PowermailAll.html

@@ -0,0 +1 @@
+<f:render section="{section}" />

+ 11 - 0
Resources/Private/Layouts/Page/Default.html

@@ -0,0 +1,11 @@
+<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
+  <a name="top" id="top"></a>
+  <div class="container main_part">
+    <f:render partial="Header" arguments="{_all}"/>
+    <main>
+      <f:render section="Main"/>
+    </main>
+  </div>
+  <f:render partial="Footer" arguments="{_all}"/>
+
+</html>

+ 7 - 0
Resources/Private/Layouts/Page/Iframe.html

@@ -0,0 +1,7 @@
+<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
+
+<main role="main">
+  <f:render section="Main"/>
+</main>
+
+</html>

+ 119 - 0
Resources/Private/Partials/Content/Menu/Menu.html

@@ -0,0 +1,119 @@
+<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
+
+<f:if condition="{menu}">
+  <f:switch expression="{layout}">
+    <f:case value="1">
+      <f:render section="MenuCategories"
+                arguments="{menu: menu, files: files, data: data}"/>
+    </f:case>
+    <f:defaultCase>
+      <f:render section="MenuDefault"
+                arguments="{menu: menu, files: files, data: data}"/>
+    </f:defaultCase>
+  </f:switch>
+</f:if>
+
+<f:section name="MenuDefault">
+  <div class="row">
+    <f:for each="{menu}" as="page">
+
+      <a href="{page.link}"
+         class="col"
+         title="{page.title}"
+         {f:if(condition: page.target, then: ' target="{page.target}"')}
+      >
+      <div class="col-wrapper">
+        <div class="contentwrapper">
+          <div class="row">
+            <div class="col teasertext">
+              <p class="text">{page.title}</p>
+              <p class="category big">{page.data.subtitle}</p>
+            </div>
+          </div>
+        </div>
+
+        <f:if condition="{page.files -> f:count()}">
+          <f:then>
+            <picture>
+              <source media="(min-width: 1200px)"
+                      srcset="{f:uri.image(image: page.files.0, maxWidth: 800, cropVariant: 'desktop')}"/>
+              <source media="(max-width: 1200px)"
+                      srcset="{f:uri.image(image: page.files.0, maxWidth: 370, cropVariant: 'tablet')}"/>
+              <source media="(max-width: 750px)"
+                      srcset="{f:uri.image(image: page.files.0, maxWidth: 720, cropVariant: 'mobile')}"/>
+
+              <f:image image="{page.files.0}" maxWidth="800" cropVariant="desktop" class="img-responsive hero"/>
+            </picture>
+          </f:then>
+          <f:else>
+            <f:comment><!-- @TODO: default image --></f:comment>
+          </f:else>
+        </f:if>
+      </div>
+      </a>
+
+    </f:for>
+  </div>
+</f:section>
+
+<f:section name="MenuCategories">
+  <section class="bluredtitle bluebg contact">
+    <div class="blurtitle-inner">
+      <div class="blur"></div>
+
+      <f:if condition="{files -> f:count()}">
+        <picture>
+          <source srcset="{f:uri.image(image: files.0, width: 992, cropVariant: 'mobile')}"
+                  media="(max-width: 992px)">
+          <source srcset="{f:uri.image(image: files.0, width: 1200, cropVariant: 'tablet')}"
+                  media="(max-width: 1200px)">
+          <source srcset="{f:uri.image(image: files.0, width: 1800, cropVariant: 'desktop')}"
+                  media="(min-width: 1200px)">
+
+          <f:image image="{files.0}" width="1800" cropVariant="desktop"/>
+        </picture>
+      </f:if>
+    </div>
+    <div class="container intro">
+      <div class="row">
+        <div class="col-md-12 col-12">
+          <f:cObject typoscriptObjectPath="lib.breadcrumb"/>
+        </div>
+      </div>
+
+      <div class="highlightbox contactfilter national">
+        <div class="container contactfiltercontent">
+          <div class="row">
+            <div class="col-md-8 col-12">
+              <f:if condition="{data.header}">
+                <p class="h2">
+                  {data.header}
+                </p>
+              </f:if>
+
+              <f:if condition="{data.subheader}">
+                <p>{data.subheader}</p>
+              </f:if>
+
+              <ul class="nav nav-tabs nav-tabs-accordion" role="tablist">
+                <f:for each="{menu}" as="page">
+                  <li class="nav-item" role="presentation">
+                    <a href="{page.link}"
+                       class="nav-link{f:if(condition: '{page.active} || {page.current}', then: ' active')}"
+                       title="{page.title}"
+                       {f:if(condition: page.target, then: ' target="{page.target}"')}
+                    >
+                      <span>{page.title}</span>
+                    </a>
+                  </li>
+                </f:for>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </section>
+</f:section>
+
+</html>

+ 23 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Captcha.html

@@ -0,0 +1,23 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_captcha powermail_fieldwrap_{field.marker} form-group col-md-6">
+	<div class="{settings.styles.framework.fieldWrappingClasses} {vh:validation.errorClass(field:field, class: 'powermail_field_error')}">
+		<f:render partial="Form/FieldLabel" arguments="{_all}" />
+		<div class="col-sm-10">
+			<f:form.textfield
+				id="powermail_field_{field.marker}"
+				property="{field.marker}"
+				value=""
+				class="powermail_captcha {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}"
+				additionalAttributes="{vh:validation.captchaDataAttribute(field:field)}" />
+
+
+			<vh:validation.captcha field="{field}" alt="captcha" class="powermail_captchaimage" id="powermail_captchaimage" />
+
+			<f:if condition="{settings.validation.client}">
+				<div class="powermail_field_error_container powermail_field_error_container_{field.marker}"></div>
+			</f:if>
+		</div>
+
+	</div>
+</div>

+ 30 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Check.html

@@ -0,0 +1,30 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_check powermail_fieldwrap_{field.marker} form-group col-md-12">
+	<div class="{settings.styles.framework.fieldWrappingClasses}">
+		<f:render partial="Form/FieldLabel" arguments="{_all}" />
+
+		<div class="col-sm-10">
+			<f:for each="{field.modifiedSettings}" as="setting" iteration="index">
+				<div class="checkbox">
+					<label>
+						<f:form.checkbox
+								property="{field.marker}"
+								multiple="true"
+								value="{setting.value}"
+								checked="{vh:misc.prefillMultiField(field:field, mail:mail, cycle:index.cycle)}"
+								id="powermail_field_{field.marker}_{index.cycle}"
+								additionalAttributes="{vh:validation.validationDataAttribute(field:field, iteration:index)}"
+								class="powermail_checkbox powermail_checkbox_{field.uid}" />
+						<vh:string.escapeLabels>{setting.label}</vh:string.escapeLabels>
+					</label>
+				</div>
+			</f:for>
+		</div>
+
+
+		<f:if condition="{settings.validation.client}">
+			<div class="powermail_field_error_container powermail_field_error_container_{field.marker}"></div>
+		</f:if>
+	</div>
+</div>

+ 7 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Content.html

@@ -0,0 +1,7 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_content powermail_fieldwrap_{field.marker} {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+	<div class="{settings.styles.framework.fieldWrappingClasses} {settings.styles.framework.offsetClasses}">
+		<vh:misc.contentElement uid="{field.contentElement}" />
+	</div>
+</div>

+ 22 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Country.html

@@ -0,0 +1,22 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:comment>
+	{vh:form.countries()} will try to get the country list from the extension static_info_tables (and _de, _fr etc...)
+	If static_info_tables is not installed, a static list of countries and the ISO3 code will be shown in frontend
+	If you want to change sorting, Value or Label, please install static_info_tables
+</f:comment>
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_country powermail_fieldwrap_{field.marker} {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+	<div class="{settings.styles.framework.fieldWrappingClasses}">
+		<f:render partial="Form/FieldLabel" arguments="{_all}" />
+
+		<f:form.select
+				property="{field.marker}"
+				options="{vh:form.countries(key:'isoCodeA3',value:'officialNameLocal',sortbyField:'isoCodeA3',sorting:'asc')}"
+				prependOptionLabel="{f:translate(key:'pleaseChoose')}"
+				class="powermail_country {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}"
+				value="{vh:misc.prefillField(field:field, mail:mail)}"
+				additionalAttributes="{vh:validation.validationDataAttribute(field:field)}"
+				id="powermail_field_{field.marker}" />
+	</div>
+</div>

+ 15 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Date.html

@@ -0,0 +1,15 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_date powermail_fieldwrap_{field.marker} {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+	<div class="{settings.styles.framework.fieldWrappingClasses}">
+		<f:render partial="Form/FieldLabel" arguments="{_all}" />
+
+		<f:form.textfield
+				type="{field.datepickerSettingsOptimized}"
+				id="powermail_field_{field.marker}"
+				property="{field.marker}"
+				value="{vh:misc.prefillField(field:field, mail:mail)}"
+				additionalAttributes="{vh:validation.datepickerDataAttribute(field:field, value:'{vh:misc.prefillField(field:field)}')}"
+				class="powermail_date {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}" />
+	</div>
+</div>

+ 30 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/File.html

@@ -0,0 +1,30 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_file powermail_fieldwrap_{field.marker} {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+	<div class="{settings.styles.framework.fieldWrappingClasses}">
+		<f:render partial="Form/FieldLabel" arguments="{_all}" />
+
+		<vh:form.multiUpload
+				id="powermail_field_{field.marker}"
+				property="{field.marker}"
+				additionalAttributes="{vh:validation.uploadAttributes(field:field)}"
+				class="powermail_file {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class: 'powermail_field_error')}" />
+
+		<f:if condition="{vh:misc.prefillField(field:field, mail:mail)}">
+			<div class="powermail_fieldwrap_file_list">
+				<ul>
+					<f:for each="{vh:misc.prefillField(field:field, mail:mail)}" as="file">
+						<li>
+							{file}
+							<f:form.hidden property="{field.marker}." value="{file}" />
+						</li>
+					</f:for>
+				</ul>
+
+				<button type="button" class="btn btn-danger deleteAllFiles">
+					<f:translate key="deleteAllFiles">Delete All Files</f:translate>
+				</button>
+			</div>
+		</f:if>
+	</div>
+</div>

+ 6 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Hidden.html

@@ -0,0 +1,6 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+<f:form.hidden
+		id="powermail_field_{field.marker}"
+		property="{field.marker}"
+		value="{vh:misc.prefillField(field:field, mail:mail)}"
+		class="powermail_hidden {field.css} powermail_{field.marker}" />

+ 20 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Html.html

@@ -0,0 +1,20 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:comment>
+    Per default the HTML-Output is parsed through a htmlspecialchars() function for security reasons.
+    If you are aware of possible security issues from your editory, you can enable html output via TypoScript constants:
+    plugin.tx_powermail.settings.setup.misc.htmlForHtmlFields = 1
+</f:comment>
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_html powermail_fieldwrap_{field.marker} {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+    <div class="{settings.styles.framework.fieldWrappingClasses} {settings.styles.framework.offsetClasses}">
+        <f:if condition="{settings.misc.htmlForHtmlFields}">
+            <f:then>
+                <f:sanitize.html>{field.text -> f:format.raw()}</f:sanitize.html>
+            </f:then>
+            <f:else>
+                {field.text}
+            </f:else>
+        </f:if>
+    </div>
+</div>

+ 17 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Input.html

@@ -0,0 +1,17 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_input powermail_fieldwrap_{field.marker} form-group {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+	<div class="{settings.styles.framework.fieldWrappingClasses}">
+		<f:render partial="Form/FieldLabel" arguments="{_all}" />
+		<div class="col-sm-10 w-100 col-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
+		<f:form.textfield
+				type="{vh:validation.fieldTypeFromValidation(field:field)}"
+				property="{field.marker}"
+				placeholder="{field.placeholder}"
+				value="{vh:misc.prefillField(field:field, mail:mail)}"
+				class="powermail_input {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}"
+				additionalAttributes="{vh:validation.validationDataAttribute(field:field)}"
+				id="powermail_field_{field.marker}" />
+		</div>
+	</div>
+</div>

+ 14 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Location.html

@@ -0,0 +1,14 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_location powermail_fieldwrap_{field.marker} {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+	<div class="{settings.styles.framework.fieldWrappingClasses}">
+		<f:render partial="Form/FieldLabel" arguments="{_all}"/>
+
+		<f:form.textfield
+			id="powermail_field_{field.marker}"
+			property="{field.marker}"
+			value="{vh:misc.prefillField(field:field, mail:mail)}"
+			additionalAttributes="{data-powermail-location:'prefill',data-powermail-eidurl:'{f:uri.page(absolute:1)}'}"
+			class="powermail_location {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}"/>
+	</div>
+</div>

+ 31 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Password.html

@@ -0,0 +1,31 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_password powermail_fieldwrap_{field.marker} {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+	<div class="{settings.styles.framework.fieldWrappingClasses}">
+		<f:render partial="Form/FieldLabel" arguments="{_all}" />
+
+		<f:form.password
+				id="powermail_field_{field.marker}"
+				property="{field.marker}"
+				value=""
+				additionalAttributes="{vh:validation.validationDataAttribute(field:field)}"
+				class="powermail_password {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}" />
+	</div>
+</div>
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_password powermail_fieldwrap_{field.marker} powermail_fieldwrap_{field.marker}_mirror {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+	<div class="{settings.styles.framework.fieldWrappingClasses}">
+		<f:if condition="{field.css} != 'nolabel'">
+			<label for="powermail_field_{field.marker}_mirror" class="{settings.styles.framework.labelClasses}">
+				<f:translate key="writePasswordAgain" /><f:if condition="{field.mandatory}"><span class="mandatory">*</span></f:if>
+			</label>
+		</f:if>
+
+		<f:form.password
+				id="powermail_field_{field.marker}_mirror"
+				property="{field.marker}_mirror"
+				value=""
+				additionalAttributes="{vh:validation.passwordValidationDataAttribute(field:field)}"
+				class="powermail_password {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}" />
+	</div>
+</div>

+ 26 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Radio.html

@@ -0,0 +1,26 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_radio powermail_fieldwrap_{field.marker} {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+	<div class="{settings.styles.framework.fieldWrappingClasses}">
+		<f:render partial="Form/FieldLabel" arguments="{_all}" />
+
+		<f:for each="{field.modifiedSettings}" as="setting" iteration="index">
+			<div class="{settings.styles.framework.radioClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}">
+				<f:form.radio
+					property="{field.marker}"
+					value="{setting.value}"
+					checked="{vh:misc.prefillMultiField(field:field, mail:mail, cycle:index.cycle)}"
+					id="powermail_field_{field.marker}_{index.cycle}"
+					additionalAttributes="{vh:validation.validationDataAttribute(field:field, iteration:index)}"
+					class="form-check-input powermail_radio" />
+				<label for="powermail_field_{field.marker}_{index.cycle}" class="form-check-label">
+					<vh:string.escapeLabels>{setting.label}</vh:string.escapeLabels>
+				</label>
+			</div>
+		</f:for>
+
+		<f:if condition="{settings.validation.client}">
+			<div class="powermail_field_error_container powermail_field_error_container_{field.marker}"></div>
+		</f:if>
+	</div>
+</div>

+ 6 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Reset.html

@@ -0,0 +1,6 @@
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_reset powermail_fieldwrap_{field.marker} {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+	<div class="{settings.styles.framework.fieldWrappingClasses} {settings.styles.framework.offsetClasses}">
+		<input type="reset" value="{field.title}" class="powermail_reset btn btn-primary btn-danger" />
+	</div>
+</div>

+ 23 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Select.html

@@ -0,0 +1,23 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_select powermail_fieldwrap_{field.marker} form-group col-md-6">
+	<div class="{settings.styles.framework.fieldWrappingClasses}">
+		<f:render partial="Form/FieldLabel" arguments="{_all}" />
+		<div class="col-sm-10">
+			<vh:form.selectField
+					options="{field.modifiedSettings}"
+					property="{field.marker}"
+					class="powermail_select {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}"
+					id="powermail_field_{field.marker}"
+					additionalAttributes="{vh:validation.validationDataAttribute(field:field)}"
+					multiple="{field.multiselectForField}"
+					value="{vh:misc.prefillField(field:field, mail:mail)}" />
+
+			<f:if condition="{field.multiselect}">
+				<f:if condition="{settings.validation.client}">
+					<div class="powermail_field_error_container powermail_field_error_container_{field.marker}"></div>
+				</f:if>
+			</f:if>
+		</div>
+	</div>
+</div>

+ 6 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Submit.html

@@ -0,0 +1,6 @@
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_submit powermail_fieldwrap_{field.marker} form-group {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+	<div class="col-sm-10 col-sm-offset-2 w-100 col-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
+		<f:form.submit value="{field.title}" class="{settings.styles.framework.submitClasses} w-100" />
+	</div>
+</div>

+ 6 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Text.html

@@ -0,0 +1,6 @@
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_text powermail_fieldwrap_{field.marker} {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+	<div class="{settings.styles.framework.fieldWrappingClasses} {settings.styles.framework.offsetClasses}">
+		<f:format.nl2br>{field.text}</f:format.nl2br>
+	</div>
+</div>

+ 19 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Textarea.html

@@ -0,0 +1,19 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_textarea powermail_fieldwrap_{field.marker} form-group {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+	<div class="{settings.styles.framework.fieldWrappingClasses}">
+		<f:render partial="Form/FieldLabel" arguments="{_all}" />
+
+		<div class="col-sm-10 w-100 col-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
+			<f:form.textarea
+				cols="20"
+				rows="5"
+				id="powermail_field_{field.marker}"
+				property="{field.marker}"
+				placeholder="{field.placeholder}"
+				value="{vh:misc.prefillField(field:field, mail:mail)}"
+				additionalAttributes="{vh:validation.validationDataAttribute(field:field)}"
+				class="powermail_textarea {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}" />
+		</div>
+	</div>
+</div>

+ 6 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Field/Typoscript.html

@@ -0,0 +1,6 @@
+
+<div class="powermail_fieldwrap powermail_fieldwrap_type_typoscript powermail_fieldwrap_{field.marker} {field.css} {settings.styles.framework.fieldAndLabelWrappingClasses}">
+	<div class="{settings.styles.framework.fieldWrappingClasses} {settings.styles.framework.offsetClasses}">
+		<f:cObject typoscriptObjectPath="{field.path}" data="{field}" />
+	</div>
+</div>

+ 11 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/FieldLabel.html

@@ -0,0 +1,11 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:comment>
+    Partial file for the HTML-structure of nearly all field labels
+</f:comment>
+
+<f:if condition="{field.css} != 'nolabel'">
+    <label for="powermail_field_{field.marker}" class="{settings.styles.framework.labelClasses} control-label col-sm-2 w-100 col-12 col-sm-12 col-md-12 col-lg-12 col-xl-12" title="{field.description}">
+        <vh:string.escapeLabels>{field.title}</vh:string.escapeLabels><f:if condition="{field.mandatory}"><span class="mandatory" aria-hidden="true">*</span></f:if>
+    </label>
+</f:if>

+ 40 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Form/Page.html

@@ -0,0 +1,40 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<style>
+
+    ul.powermail-errors-list.filled {
+        background-color: #F2DEDE; 
+        border: 1px solid #EBCCD1;
+        color: #A94442;
+        padding: 0;
+        list-style-type: none;
+        margin: 5px 0 20px 0;
+    }
+
+    ul.powermail-errors-list.filled li {
+        padding: 5px 10px;
+    }
+</style>
+
+<fieldset class="w-100 powermail_fieldset powermail_fieldset_{page.uid} {page.css}">
+    <f:if condition="{page.css} != 'nolabel'">
+        <legend class="powermail_legend">{page.title}</legend>
+    </f:if>
+
+    <f:for each="{page.fields}" as="field" iteration="iteration">
+        <vh:misc.createRowTags columns="{settings.styles.numberOfColumns}" class="{settings.styles.framework.rowClasses}" iteration="{iteration}">
+            <f:render partial="Form/Field/{vh:String.Upper(string:field.type)}" arguments="{field:field}"/>
+        </vh:misc.createRowTags>
+    </f:for>
+
+    <f:if condition="{settings.main.moresteps}">
+        <div class="powermail_fieldwrap powermail_tab_navigation">
+			<f:if condition="!{iterationPages.isFirst}">
+                <button type="button" class="btn btn-secondary" data-powermail-morestep-show="{iterationPages.index - 1}">&lt;</button>
+            </f:if>
+            <f:if condition="!{iterationPages.isLast}">
+                <button type="button" class="btn btn-primary" data-powermail-morestep-show="{iterationPages.cycle}" data-powermail-morestep-previous>&gt;</button>
+            </f:if>
+        </div>
+    </f:if>
+</fieldset>

+ 6 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Mail/DisclaimerLink.html

@@ -0,0 +1,6 @@
+<f:if condition="{settings.sender.addDisclaimerLink} && {mail.uid}">
+	<p>
+		<f:translate key="disclaimer_mailmessage">Do you want to delete your request?</f:translate><br />
+		<f:link.action action="disclaimer" absolute="1" arguments="{mail:mail,hash:hashDisclaimer}" additionalParams="{L:L}"><f:translate key="disclaimer_mailmessage_link">delete</f:translate></f:link.action>
+	</p>
+</f:if>

+ 4 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Misc/FlashMessages.html

@@ -0,0 +1,4 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+<vh:misc.checkForTypoScript settings="{settings}" />
+
+<f:flashMessages queueIdentifier="extbase.flashmessages.tx_powermail_pi1"/>

+ 81 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Misc/FormError.html

@@ -0,0 +1,81 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:form.validationResults>
+    <f:if condition="{validationResults.flattenedErrors}">
+        <nav class="powermail_message powermail_message_error" aria-label="{f:translate(key: 'validationerror_container_label')}">
+            <h2><f:translate key="validationerror_title" /></h2>
+
+            <ol>
+                <f:for each="{validationResults.flattenedErrors}" as="errors">
+                    <f:for each="{errors}" as="singleError">
+                        <li>
+                            <f:if condition="{singleError.message} == 'spam_details'">
+                                <f:then>
+                                    <f:comment>
+                                        Show spam message
+                                    </f:comment>
+                                    <f:translate key="validationerror_spam" /> {singleError.arguments.spamfactor}
+
+                                    <f:translate key="validationerror_{singleError.message}">{singleError.message}</f:translate>
+                                </f:then>
+                                <f:else>
+                                    <f:comment>
+                                        Show field error message
+                                    </f:comment>
+                                    <f:if condition="{singleError.arguments.marker}">
+                                        <f:if condition="{vh:getter.getFieldPropertyFromMarkerAndForm(marker: singleError.arguments.marker, form: form, property: 'type')} == 'check'
+                                            || {vh:getter.getFieldPropertyFromMarkerAndForm(marker: singleError.arguments.marker, form: form, property: 'type')} == 'radio'">
+                                            <f:then>
+                                                <f:comment>
+                                                    "Hack" to link to the first checkbox/ radio
+                                                </f:comment>
+                                                <a href="#powermail_field_{singleError.arguments.marker}_1">
+                                                    <vh:getter.getFieldPropertyFromMarkerAndForm marker="{singleError.arguments.marker}" form="{form}" property="title"/>:
+
+                                                    <f:if condition="{vh:getter.getFieldPropertyFromMarkerAndForm(marker: singleError.arguments.marker, form: form, property: 'mandatory_text')} !== ''">
+                                                        <f:then>
+                                                            <f:comment>
+                                                                Show custom error message
+                                                            </f:comment>
+                                                            {vh:getter.getFieldPropertyFromMarkerAndForm(marker: singleError.arguments.marker, form: form, property: 'mandatory_text')}
+                                                        </f:then>
+                                                        <f:else>
+                                                            <f:comment>
+                                                                Show default error message
+                                                            </f:comment>
+                                                            <f:translate key="validationerror_{singleError.message}">{singleError.message}</f:translate>
+                                                        </f:else>
+                                                    </f:if>
+                                                </a>
+                                            </f:then>
+                                            <f:else>
+                                                <a href="#powermail_field_{singleError.arguments.marker}">
+                                                    <vh:getter.getFieldPropertyFromMarkerAndForm marker="{singleError.arguments.marker}" form="{form}" property="title"/>:
+
+                                                    <f:if condition="{vh:getter.getFieldPropertyFromMarkerAndForm(marker: singleError.arguments.marker, form: form, property: 'mandatory_text')} !== ''">
+                                                        <f:then>
+                                                            <f:comment>
+                                                                Show custom error message
+                                                            </f:comment>
+                                                            {vh:getter.getFieldPropertyFromMarkerAndForm(marker: singleError.arguments.marker, form: form, property: 'mandatory_text')}
+                                                        </f:then>
+                                                        <f:else>
+                                                            <f:comment>
+                                                                Show default error message
+                                                            </f:comment>
+                                                            <f:translate key="validationerror_{singleError.message}">{singleError.message}</f:translate>
+                                                        </f:else>
+                                                    </f:if>
+                                                </a>
+                                            </f:else>
+                                        </f:if>
+                                    </f:if>
+                                </f:else>
+                            </f:if>
+                        </li>
+                    </f:for>
+                </f:for>
+            </ol>
+        </nav>
+    </f:if>
+</f:form.validationResults>

+ 17 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Misc/GoogleAdwordsConversion.html

@@ -0,0 +1,17 @@
+<f:if condition="{settings.marketing.googleAdwords._enable}">
+	<script type="text/javascript">
+		var google_conversion_id = {settings.marketing.googleAdwords.google_conversion_id};
+		var google_conversion_language = "{settings.marketing.googleAdwords.google_conversion_language}";
+		var google_conversion_format = "{settings.marketing.googleAdwords.google_conversion_format}";
+		var google_conversion_color = "ffffff";
+		var google_conversion_label = "{settings.marketing.googleAdwords.google_conversion_label}";
+		var google_conversion_value = 0;
+	</script>
+	<script type="text/javascript" src="https://www.googleadservices.com/pagead/conversion.js"></script>
+
+	<noscript>
+		<div style="display:inline;">
+			<img height="1" width="1" style="border-style:none;" alt="" src="https://www.googleadservices.com/pagead/conversion/{settings.marketing.googleAdwords.google_conversion_id}/?label={settings.marketing.googleAdwords.google_conversion_label}&amp;guid=ON&amp;script=0"/>
+		</div>
+	</noscript>
+</f:if>

+ 15 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Misc/HoneyPod.html

@@ -0,0 +1,15 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:if condition="{vh:validation.isHonepodEnabled()}">
+	<div style="margin-left: -99999px; position: absolute;">
+		<label for="powermail_hp_{form.uid}">
+			<f:translate key="honeypodLabel" />
+		</label>
+		<f:form.textfield
+				name="field[__hp]"
+				value=""
+				id="powermail_hp_{form.uid}"
+				tabindex="-1"
+				additionalAttributes="{autocomplete: 'new-powermail-hp-{form.uid}', aria-hidden: 'true'}" />
+	</div>
+</f:if>

+ 33 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Misc/MarketingInformation.html

@@ -0,0 +1,33 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+<f:if condition="{vh:condition.isMarketingInformationActive(marketingInformation:marketingInfos, settings:settings)}">
+	<p> </p>
+	<table width="500px">
+		<tr>
+			<th colspan="2" align="left" style="font-size: 14px;">
+				<b><f:translate key="MarketingInformation" default="Marketing Information" /></b>
+			</th>
+		</tr>
+		<f:for each="{marketingInfos}" as="value" key="key">
+			<tr valign="top">
+
+				<td style="font-size: 12px;" width="50%">
+					<b><f:translate key="\In2code\Powermail\Domain\Model\Mail.marketing{vh:string.upper(string:'{key}')}" default="{key}" /></b>
+				</td>
+
+				<f:if condition="{vh:condition.isArray(val:'{value}')}">
+					<f:else>
+						<td style="font-size: 12px;" width="50%">{value}</td>
+					</f:else>
+					<f:then>
+						<td style="font-size: 12px;" width="50%">
+							<f:for each="{value}" as="subvalue" iteration="index">
+								<f:link.page pageUid="{subvalue}" absolute="1"><vh:getter.getPageNameFromUid uid="{subvalue}" /></f:link.page><f:if condition="{index.isLast}"><f:else> &gt; </f:else></f:if>
+							</f:for>
+						</td>
+					</f:then>
+				</f:if>
+
+			</tr>
+		</f:for>
+	</table>
+</f:if>

+ 34 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/CheckWrongLocalizedForms.html

@@ -0,0 +1,34 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:if condition="{vh:be.checkWrongLocalizedForms()}">
+	<f:then>
+		<div class="alert alert-success">
+			<div class="header-container">
+				<h4 class="message-header">
+					<f:translate key="BackendCheckWrongLocalizedFormsTitle">Localized Forms</f:translate>
+				</h4>
+			</div>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckWrongLocalizedFormsCorrect">No failures found</f:translate>
+				</p>
+			</div>
+		</div>
+	</f:then>
+	<f:else>
+		<div class="alert alert-warning">
+			<h4 class="message-header">
+				<f:translate key="BackendCheckWrongLocalizedFormsTitle">Localized Forms</f:translate>
+			</h4>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckWrongLocalizedFormsFailed">Broken localized Forms found</f:translate>
+				</p>
+				<f:form action="fixWrongLocalizedForms">
+					<input type="submit" value="{f:translate(key:'BackendCheckTryToFix', default:'Solve problem')}" />
+					<p><strong><f:translate key="BackendCheckBackupBefore">Please backup before!</f:translate></strong></p>
+				</f:form>
+			</div>
+		</div>
+	</f:else>
+</f:if>

+ 34 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/CheckWrongLocalizedPages.html

@@ -0,0 +1,34 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:if condition="{vh:be.checkWrongLocalizedPages()}">
+	<f:then>
+		<div class="alert alert-success">
+			<div class="header-container">
+				<h4 class="message-header">
+					<f:translate key="BackendCheckWrongLocalizedPagesTitle">Localized Pages</f:translate>
+				</h4>
+			</div>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckWrongLocalizedPagesCorrect">No failures found</f:translate>
+				</p>
+			</div>
+		</div>
+	</f:then>
+	<f:else>
+		<div class="alert alert-warning">
+			<h4 class="message-header">
+				<f:translate key="BackendCheckWrongLocalizedPagesTitle">Localized Pages</f:translate>
+			</h4>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckWrongLocalizedPagesFailed">Broken localized Pages found</f:translate>
+				</p>
+				<f:form action="fixWrongLocalizedPages">
+					<input type="submit" value="{f:translate(key:'BackendCheckTryToFix', default:'Solve problem')}" />
+					<p><strong><f:translate key="BackendCheckBackupBefore">Please backup before!</f:translate></strong></p>
+				</f:form>
+			</div>
+		</div>
+	</f:else>
+</f:if>

+ 32 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/DevelopmentContext.html

@@ -0,0 +1,32 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:if condition="{vh:condition.isDevelopmentContext()}">
+	<f:if condition="{vh:getter.getDevelopmentContextEmail()}">
+		<f:then>
+			<div class="alert alert-info">
+				<div class="header-container">
+					<h4 class="message-header">
+						<f:translate key="BackendCheckDevelopmentContextTitle">Development Context</f:translate>
+					</h4>
+				</div>
+				<div class="message-body">
+					<p>
+						<f:translate key="BackendCheckDevelopmentContextActive" arguments="{0: '{vh:getter.getDevelopmentContextEmail()}'}">This TYPO3 instance is running in development context. All mails will be send to %s only.</f:translate>
+					</p>
+				</div>
+			</div>
+		</f:then>
+		<f:else>
+			<div class="alert alert-warning">
+				<h4 class="message-header">
+					<f:translate key="BackendCheckDevelopmentContextTitle">Development Context</f:translate>
+				</h4>
+				<div class="message-body">
+					<p>
+						<f:translate key="BackendCheckDevelopmentContextAvailable" arguments="{0: '$GLOBALS[\'TYPO3_CONF_VARS\'][\'EXT\'][\'powermailDevelopContextEmail\']=\'force@email.org\';'}">This TYPO3 instance is running in development context. You can use %s in the AdditionalConfiguration.php to enforce powermail to send testmails to this email-address only.</f:translate>
+					</p>
+				</div>
+			</div>
+		</f:else>
+	</f:if>
+</f:if>

+ 58 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/Email.html

@@ -0,0 +1,58 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:if condition="{email}">
+	<f:if condition="{issent}">
+		<f:then>
+            <div class="alert alert-success">
+                <h4 class="message-header">
+                    <f:translate key="BackendCheckEmailTitle" />
+                </h4>
+				<div class="message-body">
+					<p>
+						<f:translate key="BackendCheckEmailCorrect" />
+					</p>
+				</div>
+			</div>
+		</f:then>
+		<f:else>
+            <div class="alert alert-warning">
+				<h4 class="message-header">
+					<f:translate key="BackendCheckEmailTitle" />
+				</h4>
+				<div class="message-body">
+					<p>
+						<f:translate key="BackendCheckEmailFailed" />
+					</p>
+				</div>
+			</div>
+		</f:else>
+	</f:if>
+</f:if>
+
+<div class="typo3-message message-notice powermail-message">
+	<div class="message-body powermail-padding-bottom powermail_email">
+		<f:form
+				class="form-horizontal"
+				action="checkBe">
+			<div class="form-group">
+				<label for="powermail_email" class="col-sm-2 control-label">
+					<f:translate key="BackendEmailFormReceiver" />
+				</label>
+				<div class="col-sm-10">
+					<f:form.textfield
+							name="email"
+							placeholder="your@email.org"
+							value=""
+							id="powermail_email"
+							class="form-control" />
+				</div>
+			</div>
+
+			<div class="form-group">
+				<div class="col-sm-10 col-sm-offset-2">
+					<f:form.submit value="Send Mail Now" class="btn btn-primary" />
+				</div>
+			</div>
+		</f:form>
+	</div>
+</div>

+ 30 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/ExtMngConfig.html

@@ -0,0 +1,30 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:if condition="{vh:be.extMngConfig()}">
+	<f:then>
+		<div class="alert alert-success">
+			<div class="header-container">
+				<h4 class="message-header">
+					<f:translate key="BackendCheckExtMngConfigTitle" />
+				</h4>
+			</div>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckExtMngConfigCorrect" />
+				</p>
+			</div>
+		</div>
+	</f:then>
+	<f:else>
+		<div class="alert alert-danger">
+			<h4 class="message-header">
+				<f:translate key="BackendCheckExtMngConfigTitle" />
+			</h4>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckExtMngConfigFailed" />
+				</p>
+			</div>
+		</div>
+	</f:else>
+</f:if>

+ 20 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/Mode.html

@@ -0,0 +1,20 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+<div class="alert alert-info">
+	<div class="header-container">
+		<h4 class="message-header">
+			<f:translate key="BackendCheckComposerModeTitle">Composer mode</f:translate>
+		</h4>
+	</div>
+	<div class="message-body">
+		<p>
+			<f:if condition="{vh:condition.isComposerMode()}">
+				<f:then>
+					<f:translate key="BackendCheckComposerModeComposer">Composer Mode</f:translate>
+				</f:then>
+				<f:else>
+					<f:translate key="BackendCheckComposerModeClassic">Classic Mode</f:translate>
+				</f:else>
+			</f:if>
+		</p>
+	</div>
+</div>

+ 80 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/PowermailVersionNote.html

@@ -0,0 +1,80 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:switch expression="{vh:be.powermailVersionNote()}">
+	<f:case value="0">
+		<div class="alert alert-warning">
+			<div class="header-container">
+				<h4 class="message-header">
+					<f:translate key="BackendCheckVersionTitle">Version</f:translate>
+					{vh:be.powermailVersion()}
+				</h4>
+			</div>
+			<f:if condition="{vh:condition.isComposerMode()}">
+				<f:else>
+					<div class="message-body">
+						<p>
+							<f:translate key="BackendCheckVersionNoInformation">It could not be verified if this version is secure or unsecure</f:translate>
+
+							(<f:translate key="BackendCheckVersionLastUpdate">Last update:</f:translate>
+							<f:format.date format="{f:translate(key:'datepicker_format_datetime', default:'Y-m-d')}">@{vh:be.lastUpdateExtensionRepository()}</f:format.date>)
+						</p>
+					</div>
+				</f:else>
+			</f:if>
+		</div>
+	</f:case>
+	<f:case value="1">
+		<div class="alert alert-success">
+			<div class="header-container">
+				<h4 class="message-header">
+					<f:translate key="BackendCheckVersionTitle">Version</f:translate>
+					{vh:be.powermailVersion()}
+				</h4>
+			</div>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckVersionUpToDate">Powermail version is up-to-date</f:translate>
+
+					(<f:translate key="BackendCheckVersionLastUpdate">Last update:</f:translate>
+					<f:format.date format="{f:translate(key:'datepicker_format_datetime', default:'Y-m-d')}">@{vh:be.lastUpdateExtensionRepository()}</f:format.date>)
+				</p>
+			</div>
+		</div>
+	</f:case>
+	<f:case value="2">
+		<div class="alert alert-danger">
+			<div class="header-container">
+				<h4 class="message-header">
+					<f:translate key="BackendCheckVersionTitle">Version</f:translate>
+					{vh:be.powermailVersion()}
+				</h4>
+			</div>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckVersionSecurity">The installed powermail version is not secure, please update your version as soon as possible!</f:translate>
+
+					(<f:translate key="BackendCheckVersionLastUpdate">Last update:</f:translate>
+					<f:format.date format="{f:translate(key:'datepicker_format_datetime', default:'Y-m-d')}">@{vh:be.lastUpdateExtensionRepository()}</f:format.date>)
+				</p>
+			</div>
+		</div>
+	</f:case>
+	<f:case value="3">
+		<div class="alert alert-warning">
+			<div class="header-container">
+				<h4 class="message-header">
+					<f:translate key="BackendCheckVersionTitle">Version</f:translate>
+					{vh:be.powermailVersion()}
+				</h4>
+			</div>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckVersionUpgrade">A newer powermail version is available</f:translate>
+
+					(<f:translate key="BackendCheckVersionLastUpdate">Last update:</f:translate>
+					<f:format.date format="{f:translate(key:'datepicker_format_datetime', default:'Y-m-d')}">@{vh:be.lastUpdateExtensionRepository()}</f:format.date>)
+				</p>
+			</div>
+		</div>
+	</f:case>
+</f:switch>

+ 30 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/Session.html

@@ -0,0 +1,30 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:if condition="{vh:be.session()}">
+	<f:then>
+		<div class="alert alert-success">
+			<div class="header-container">
+				<h4 class="message-header">
+					<f:translate key="BackendCheckSessionTitle" />
+				</h4>
+			</div>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckSessionCorrect" />
+				</p>
+			</div>
+		</div>
+	</f:then>
+	<f:else>
+		<div class="alert alert-danger">
+			<h4 class="message-header">
+				<f:translate key="BackendCheckSessionTitle" />
+			</h4>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckSessionFailed" />
+				</p>
+			</div>
+		</div>
+	</f:else>
+</f:if>

+ 32 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/StaticTemplate.html

@@ -0,0 +1,32 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:if condition="{settings.staticTemplate}">
+	<f:then>
+		<div class="alert alert-success">
+			<div class="header-container">
+				<h4 class="message-header">
+					<f:translate key="BackendCheckStaticTemplateTitle" />
+				</h4>
+			</div>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckStaticTemplateCorrect" />
+					<f:be.pagePath /> ({pid})
+				</p>
+			</div>
+		</div>
+	</f:then>
+	<f:else>
+		<div class="alert alert-danger">
+			<h4 class="message-header">
+				<f:translate key="BackendCheckStaticTemplateTitle" />
+			</h4>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckStaticTemplateFailed" />
+					<f:be.pagePath /> ({pid})
+				</p>
+			</div>
+		</div>
+	</f:else>
+</f:if>

+ 30 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/T3Version.html

@@ -0,0 +1,30 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:if condition="{vh:be.t3Version()}">
+	<f:then>
+		<div class="alert alert-success">
+			<div class="header-container">
+				<h4 class="message-header">
+					<f:translate key="BackendCheckT3VersionTitle" />
+				</h4>
+			</div>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckT3VersionCorrect" />
+				</p>
+			</div>
+		</div>
+	</f:then>
+	<f:else>
+		<div class="alert alert-danger">
+			<h4 class="message-header">
+				<f:translate key="BackendCheckT3VersionTitle" />
+			</h4>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckT3VersionFailed" />
+				</p>
+			</div>
+		</div>
+	</f:else>
+</f:if>

+ 33 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/CheckBe/UploadsFolder.html

@@ -0,0 +1,33 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:if condition="{vh:be.uploadsFolder()}">
+	<f:then>
+		<div class="alert alert-success">
+			<div class="header-container">
+				<h4 class="message-header">
+					<f:translate key="BackendCheckUploadsFolderTitle" />
+				</h4>
+			</div>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckUploadsFolderCorrect" />
+				</p>
+			</div>
+		</div>
+	</f:then>
+	<f:else>
+		<div class="alert alert-danger">
+			<h4 class="message-header">
+				<f:translate key="BackendCheckUploadsFolderTitle" />
+			</h4>
+			<div class="message-body">
+				<p>
+					<f:translate key="BackendCheckUploadsFolderFailed" />
+				</p>
+				<f:form action="fixUploadFolder">
+					<input type="submit" value="{f:translate(key:'BackendCheckTryToFix', default:'Solve problem')}" />
+				</f:form>
+			</div>
+		</div>
+	</f:else>
+</f:if>

+ 154 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/Export.html

@@ -0,0 +1,154 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<div class="clearfix">
+	<div class="pull-right mb-3">
+		<f:form.button
+				class="btn btn-secondary"
+				type="button"
+				additionalAttributes="{data-bs-toggle:'collapse',data-bs-target:'#extended_export',aria-expanded:'false',aria-controls:'collapseExample'}">
+			<f:translate key="BackendListFilterExtendedExport">extended export</f:translate>
+		</f:form.button>
+		<button type="button" class="export_icon export_icon_csv btn btn-info">CSV</button>
+        <f:if condition="{activateXlsxExport}">
+            <f:then>
+                <button type="button" class="export_icon export_icon_xls btn btn-info">XLS</button>
+            </f:then>
+            <f:else>
+                <button type="button" class="export_icon export_icon_xls export_icon_xls_not_available btn btn-info" data-modal-title="{f:translate(key: 'xlsInfoModalTitle', default: 'Information')}" data-modal-text="{f:translate(key: 'xlsInfoModalText', default: 'Please install Extension base_excel')}" data-modal-cancel="{f:translate(key: 'xlsInfoModalCancel', default: 'Cancel')}">XLS</button>
+            </f:else>
+        </f:if>
+	</div>
+</div>
+
+
+
+<div class="collapse" id="extended_export">
+	<div class="row">
+		<div class="form-group col-md-6">
+			<label for="export_field_selection" class="xexport_field_selection_label">
+				<f:translate key="BackendListFilterExtendedExportLeftLabel" />
+			</label>
+			<ul class="extended_export_field connected list-group" id="export_field_selection">
+				<f:for each="{firstForm.pages}" as="page">
+					<f:for each="{page.fields}" as="field">
+						<f:if condition="{field.exportableFieldType}">
+							<li id="{field.uid}" class="list-group-item list-group-item-info pointer">
+								{field.title} <span class="info">(<f:translate key="FormField" />)</span>
+							</li>
+						</f:if>
+					</f:for>
+				</f:for>
+			</ul>
+		</div>
+		<div class="form-group col-md-6">
+			<label for="export_field_selection_container" class="xexport_field_selection_container_label">
+				<f:translate key="BackendListFilterExtendedExportRightLabel" />
+			</label>
+			<ul class="extended_export_field_container connected list-group" id="export_field_selection_container">
+				<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'crdate')}">
+					<li id="crdate" class="list-group-item list-group-item-warning pointer">
+						<f:translate key="\In2code\Powermail\Domain\Model\Mail.date" />
+					</li>
+				</f:if>
+				<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'sender_name')}">
+					<li id="sender_name" class="list-group-item list-group-item-warning pointer">
+						<f:translate key="\In2code\Powermail\Domain\Model\Mail.senderName" />
+					</li>
+				</f:if>
+				<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'sender_mail')}">
+					<li id="sender_mail" class="list-group-item list-group-item-warning pointer">
+						<f:translate key="\In2code\Powermail\Domain\Model\Mail.senderMail" />
+					</li>
+				</f:if>
+				<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'receiver_mail')}">
+					<li id="receiver_mail" class="list-group-item list-group-item-warning pointer">
+						<f:translate key="\In2code\Powermail\Domain\Model\Mail.receiverMail" />
+					</li>
+				</f:if>
+				<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'subject')}">
+					<li id="subject" class="list-group-item list-group-item-warning pointer">
+						<f:translate key="\In2code\Powermail\Domain\Model\Mail.subject" />
+					</li>
+				</f:if>
+				<f:if condition="{vh:condition.isMarketingInformationEnabledGlobally()}">
+					<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'marketing_referer_domain')}">
+						<li id="marketing_referer_domain" class="list-group-item list-group-item-warning pointer">
+							<f:translate key="\In2code\Powermail\Domain\Model\Mail.marketingRefererDomain" />
+						</li>
+					</f:if>
+					<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'marketing_referer')}">
+						<li id="marketing_referer" class="list-group-item list-group-item-warning pointer">
+							<f:translate key="\In2code\Powermail\Domain\Model\Mail.marketingReferer" />
+						</li>
+					</f:if>
+					<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'marketing_frontend_language')}">
+						<li id="marketing_frontend_language" class="list-group-item list-group-item-warning pointer">
+							<f:translate key="\In2code\Powermail\Domain\Model\Mail.marketingFrontendLanguage" />
+						</li>
+					</f:if>
+					<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'marketing_browser_language')}">
+						<li id="marketing_browser_language" class="list-group-item list-group-item-warning pointer">
+							<f:translate key="\In2code\Powermail\Domain\Model\Mail.marketingBrowserLanguage" />
+						</li>
+					</f:if>
+					<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'marketing_country')}">
+						<li id="marketing_country" class="list-group-item list-group-item-warning pointer">
+							<f:translate key="\In2code\Powermail\Domain\Model\Mail.marketingCountry" />
+						</li>
+					</f:if>
+					<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'marketing_mobile_device')}">
+						<li id="marketing_mobile_device" class="list-group-item list-group-item-warning pointer">
+							<f:translate key="\In2code\Powermail\Domain\Model\Mail.marketingMobileDevice" />
+						</li>
+					</f:if>
+					<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'marketing_mobile_device')}">
+						<li id="marketing_page_funnel" class="list-group-item list-group-item-warning pointer">
+							<f:translate key="\In2code\Powermail\Domain\Model\Mail.marketingPageFunnel" />
+						</li>
+					</f:if>
+					<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'user_agent')}">
+						<li id="user_agent" class="list-group-item list-group-item-warning pointer">
+							<f:translate key="\In2code\Powermail\Domain\Model\Mail.userAgent" />
+						</li>
+					</f:if>
+					<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'time')}">
+						<li id="time" class="list-group-item list-group-item-warning pointer">
+							<f:translate key="\In2code\Powermail\Domain\Model\Mail.time" />
+						</li>
+					</f:if>
+				</f:if>
+				<f:if condition="{vh:condition.isIpInformationEnabledGlobally()}">
+					<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'sender_ip')}">
+						<li id="sender_ip" class="list-group-item list-group-item-warning pointer">
+							<f:translate key="\In2code\Powermail\Domain\Model\Mail.senderIp" />
+						</li>
+					</f:if>
+				</f:if>
+				<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'uid')}">
+					<li id="uid" class="list-group-item list-group-item-warning pointer">
+						<f:translate key="\In2code\Powermail\Domain\Model\Mail.uid" />
+					</li>
+				</f:if>
+				<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'feuser')}">
+					<li id="feuser" class="list-group-item list-group-item-warning pointer">
+						<f:translate key="\In2code\Powermail\Domain\Model\Mail.feuser" />
+					</li>
+				</f:if>
+				<f:if condition="{vh:condition.isBackendUserAllowedToViewField(table:'tx_powermail_domain_model_mail',field:'hidden')}">
+					<li id="hidden" class="list-group-item list-group-item-warning pointer">
+						<f:translate key="\In2code\Powermail\Domain\Model\Mail.hidden">disabled</f:translate>
+					</li>
+				</f:if>
+			</ul>
+		</div>
+	</div>
+</div>
+
+<f:if condition="{firstForm}">
+	<f:form.hidden
+			name="export[fields]"
+			value="{vh:string.implodeField(objects:'{vh:getter.getFieldsFromForm(form:firstForm,property:\'uid\',fieldType:\'exportable\')}')}"
+			id="export_fields"
+			respectSubmittedDataValue="false" />
+</f:if>
+

+ 37 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/Filter.html

@@ -0,0 +1,37 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:form
+		action="dispatch"
+		name="filter"
+		id="powermail_module_search">
+
+	<f:render partial="Module/Search" arguments="{_all}" />
+	<f:if condition="{forwardToAction} == 'list'">
+		<f:render partial="Module/Export" arguments="{_all}" />
+	</f:if>
+
+	<f:comment>
+		Forward to this action in dispatchAction
+	</f:comment>
+	<f:form.hidden name="forwardToAction" value="{forwardToAction}" id="forwardToAction" />
+
+	<f:comment>
+		Keep Sorting on filter or export
+	</f:comment>
+	<f:if condition="{piVars.sorting}">
+		<f:then>
+			<f:for each="{piVars.sorting}" key="sortingKey" as="order">
+				<f:form.hidden
+						name="sorting[{sortingKey}]"
+						class="extended_export_sorting_container"
+						value="{order}" />
+			</f:for>
+		</f:then>
+		<f:else>
+			<f:form.hidden
+					name="sorting[{settings.sortby}]"
+					class="extended_export_sorting_container"
+					value="{settings.order}" />
+		</f:else>
+	</f:if>
+</f:form>

+ 12 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/JsAndCssImport.html

@@ -0,0 +1,12 @@
+<f:comment>
+    TODO: Re-add JS once it has been moved into ES Modules
+</f:comment>
+
+<f:be.pageRenderer
+    includeCssFiles="{
+        0: '{f:uri.resource(path:\'Css/Backend.css\')}'
+    }"
+    includeJavaScriptModules="{
+        0: '@in2code/powermail/backend'
+    }"
+/>

+ 329 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/List.html

@@ -0,0 +1,329 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+{namespace core=TYPO3\CMS\Core\ViewHelpers}
+{namespace be=TYPO3\CMS\Backend\ViewHelpers}
+
+<div class="panel panel-default">
+	<div class="panel-heading">
+		<f:translate key="BackendListMails" />
+		(<f:count subject="{mails}" />)
+	</div>
+	<div class="table-fit">
+		<table class="table table-hover">
+			<thead>
+				<tr>
+					<th nowrap="nowrap" class="col-icon"></th>
+					<th nowrap="nowrap">
+						<f:if condition="{piVars.tx_powermail_web_powermailm1.sorting.crdate} && {0 : piVars.tx_powermail_web_powermailm1.sorting.crdate} == {0 : 'asc'}">
+							<f:then>
+								<f:link.action additionalParams="{tx_powermail_web_powermailm1: {sorting: {crdate: 'desc'}}}">
+									<f:translate key="\In2code\Powermail\Domain\Model\Mail.date" />
+									<core:Icon identifier="actions-move-up" />
+								</f:link.action>
+							</f:then>
+							<f:else>
+								<f:link.action additionalParams="{tx_powermail_web_powermailm1: {sorting: {crdate: 'asc'}}}">
+									<f:translate key="\In2code\Powermail\Domain\Model\Mail.date" />
+									<core:Icon identifier="actions-move-down" />
+								</f:link.action>
+							</f:else>
+						</f:if>
+					</th>
+					<th nowrap="nowrap">
+						<strong>
+							<f:translate key="\In2code\Powermail\Domain\Model\Mail.datetime" />
+						</strong>
+					</th>
+					<th nowrap="nowrap">
+						<strong>
+							<f:translate key="\In2code\Powermail\Domain\Model\Mail.senderName" />
+						</strong>
+					</th>
+					<th nowrap="nowrap">
+						<strong>
+							<f:translate key="\In2code\Powermail\Domain\Model\Mail.senderMail" />
+						</strong>
+					</th>
+					<th nowrap="nowrap">
+						<f:if condition="{piVars.tx_powermail_web_powermailm1.sorting.subject} && {0 : piVars.tx_powermail_web_powermailm1.sorting.subject} == {0 : 'asc'}">
+							<f:then>
+								<f:link.action additionalParams="{tx_powermail_web_powermailm1: {sorting: {subject: 'desc'}}}">
+									<f:translate key="\In2code\Powermail\Domain\Model\Mail.subject" />
+									<core:Icon identifier="actions-move-up" />
+								</f:link.action>
+							</f:then>
+							<f:else>
+								<f:link.action additionalParams="{tx_powermail_web_powermailm1: {sorting: {subject: 'asc'}}}">
+									<f:translate key="\In2code\Powermail\Domain\Model\Mail.subject" />
+									<core:Icon identifier="actions-move-down" />
+								</f:link.action>
+							</f:else>
+						</f:if>
+					</th>
+					<th nowrap="nowrap" class="col-control">
+						<f:if condition="{writeAccess}">
+							<span class="btn addPowermailSelectionAll">
+								<core:Icon identifier="actions-variable-add"/>
+							</span>
+						</f:if>
+					</th>
+				</tr>
+			</thead>
+			<tbody>
+				<f:for each="{pagination.paginator.paginatedItems}" as="mail" iteration="iteration">
+
+					<f:comment>Basic mail information</f:comment>
+					<tr class="{f:if(condition:iteration.isFirst,then:' firstcol')}{f:if(condition:iteration.isLast,then:' lastcol')}">
+
+						<td nowrap="nowrap" class="col-icon nowrap">
+							<span class="openPowermailDetailsIcons" data-action="openPowermailDetails">
+								<core:Icon identifier="actions-pagetree-collapse" />
+								<core:Icon identifier="actions-pagetree-expand" />
+							</span>
+							<span class="powermailRecordIcon">
+								<span{f:if(condition:mail.hidden,then:' class="hide"')}>
+									<core:Icon identifier="tcarecords-tx_powermail_domain_model_mail-default" />
+								</span>
+								<span{f:if(condition:mail.hidden,else:' class="hide"')}>
+									<core:Icon identifier="tcarecords-tx_powermail_domain_model_mail-default" overlay="overlay-hidden" />
+								</span>
+							</span>
+						</td>
+						<td nowrap="nowrap">
+							<f:format.date format="{f:translate(key:'datepicker_format_date')}">{mail.crdate}</f:format.date>
+						</td>
+						<td nowrap="nowrap">
+							<f:format.date format="{f:translate(key:'datepicker_format_time')}">{mail.crdate}</f:format.date>
+						</td>
+						<td nowrap="nowrap">
+							<span title="{mail.senderName}">
+								<f:format.crop maxCharacters="50" append="&nbsp;[...]">{mail.senderName}</f:format.crop>
+							</span>
+						</td>
+						<td nowrap="nowrap">
+							<span title="{mail.senderMail}">
+								<f:format.crop maxCharacters="50" append="&nbsp;[...]">{mail.senderMail}</f:format.crop>
+							</span>
+						</td>
+						<td nowrap="nowrap">
+							<span title="{mail.subject}">
+								<f:format.crop maxCharacters="60" append="&nbsp;[...]">{mail.subject}</f:format.crop>
+							</span>
+						</td>
+
+						<td nowrap="nowrap" class="col-control">
+							<div role="group" class="btn-group">
+								<span class="btn" data-action="openPowermailDetails" title="{f:translate(key: 'BackendListHelpDetails')}">
+									<core:Icon identifier="actions-device-desktop"/>
+								</span>
+
+								<f:if condition="{writeAccess}">
+									<f:comment>
+										Edit
+									</f:comment>
+									<span class="btn">
+										<be:link.editRecord
+												returnUrl="{f:be.uri(route: 'web_powermail', parameters: '{id: pid}')}"
+												table="tx_powermail_domain_model_mail"
+												title="{f:translate(key: 'BackendListHelpEdit')}"
+												uid="{mail.uid}">
+											<core:Icon identifier="actions-open"/>
+										</be:link.editRecord>
+									</span>
+									<f:comment>
+										Delete
+									</f:comment>
+									<span class="btn" data-action="deleteMail"
+										  title="{f:translate(key:'BackendListMailDelete')}">
+										<core:Icon identifier="actions-delete"/>
+									</span>
+
+									<f:comment>
+										Hide/Show
+									</f:comment>
+									<span class="btn">
+										<span class="unhideMail visibilityButton {f:if(condition:mail.hidden, else:' hide')}"
+											  title="{f:translate(key:'BackendListHelpUnhide')}">
+											<core:Icon identifier="actions-toggle-off"/>
+										</span>
+										<span class="hideMail visibilityButton {f:if(condition:mail.hidden, then: 'hide')}"
+											  title="{f:translate(key:'BackendListHelpHide')}">
+											<core:Icon identifier="actions-toggle-on"/>
+										</span>
+									</span>
+									<f:comment>
+										Select
+									</f:comment>
+									<span class="btn addPowermailSelection">
+										<core:Icon identifier="actions-variable-add"/>
+									</span>
+								</f:if>
+
+								<input type="hidden" class="container_uid" name="container_uid" value="{mail.uid}" />
+								<input type="hidden" class="container_module_uri" name="container_module_uri" value="{moduleUri}" />
+								<input type="hidden" class="container_table" name="container_table" value="tx_powermail_domain_model_mail" />
+								<input type="hidden" class="container_label_delete_confirmation" name="container_label_delete_confirmation" value="{f:translate(key:'BackendListMailDeleteConfirmation')}" />
+							</div>
+						</td>
+					</tr>
+
+					<f:comment>More mail details</f:comment>
+					<tr class="db_list_normal powermail_listbe_details powermail_listbe_details_closed" data-action="powermailDetailsContainer">
+						<td colspan="7">
+							<div class="powermail_listbe_details_container">
+								<f:for each="{mail.answers}" as="answer">
+									<f:if condition="{answer.value}">
+										<dl class="powermail_listbe_details_dl">
+											<dt>
+												<f:if condition="{answer.field.title}">
+													<f:then>
+														{answer.field.title}:
+													</f:then>
+													<f:else>
+														No Label:
+													</f:else>
+												</f:if>
+											</dt>
+											<dd class="powermail_listbe_details_dd powermail_listbe_details_type_{answer.field.type}">
+												<f:comment>Data Type String</f:comment>
+												<f:if condition="{answer.valueType} == 0">
+													<f:format.nl2br>{answer.value}</f:format.nl2br>
+												</f:if>
+
+												<f:comment>Data Type Array</f:comment>
+												<f:if condition="{answer.valueType} == 1">
+													<vh:string.implodeField objects="{answer.value}" separator=", " />
+												</f:if>
+
+												<f:comment>Data Type Date (already parsed Timestamp by Model)</f:comment>
+												<f:if condition="{answer.valueType} == 2">
+													{answer.value}
+												</f:if>
+
+												<f:comment>Data Type Fileupload</f:comment>
+												<f:if condition="{answer.valueType} == 3">
+													<div class="powermail_uploaded_file_container">
+														<f:for each="{answer.value}" as="subValue" iteration="uploadIndex">
+															<div class="powermail_uploaded_file_container__item">
+																<a href="{vh:misc.link(path:'{vh:misc.getFileWithPath(path:\'{settings.uploadPath}\',fileName:\'{subValue}\')}', absolute:1)}" title="{settings.uploadPath}{subValue}" target="_blank">
+																	<f:if condition="{vh:condition.isImage(path:subValue)}">
+																		<f:then>
+																			<f:if condition="{vh:condition.fileExists(file:'{vh:misc.getFileWithPath(path:\'{settings.uploadPath}\',fileName:\'{subValue}\')}')}">
+																				<f:then>
+																					<f:image src="{vh:misc.getFileWithPath(path:'{settings.uploadPath}',fileName:'{subValue}')}" alt="{subValue}" width="200" maxHeight="200" />
+																				</f:then>
+																				<f:else>
+																					File does not exist
+																				</f:else>
+																			</f:if>
+																		</f:then>
+																		<f:else>
+																			{subValue}
+																		</f:else>
+																	</f:if>
+																</a>
+
+																<a href="{be:moduleLink(route:'powermail_downloadfile', arguments:'{file: \'{settings.uploadPath}{subValue}\'}')}" download>
+																	Download
+																</a>
+															</div>
+														</f:for>
+													</div>
+												</f:if>
+											</dd>
+										</dl>
+									</f:if>
+								</f:for>
+								<f:if condition="{mail.spamFactor} != '0%'">
+									<dl class="powermail_listbe_details_dl powermail_listbe_details_dl_additional">
+										<dt>
+											<strong><f:translate key="\In2code\Powermail\Domain\Model\Mail.spamFactor" default="Spamfactor" /></strong>
+										</dt>
+										<dd>
+											{mail.spamFactor}
+										</dd>
+									</dl>
+								</f:if>
+								<f:if condition="{vh:condition.isMarketingInformationEnabledGlobally()}">
+									<f:if condition="{mail.marketingRefererDomain}">
+										<dl class="powermail_listbe_details_dl powermail_listbe_details_dl_additional">
+											<dt>
+												<strong><f:translate key="\In2code\Powermail\Domain\Model\Mail.marketingRefererDomain" default="marketingRefererDomain" /></strong>
+											</dt>
+											<dd>
+												{mail.marketingRefererDomain}
+											</dd>
+										</dl>
+									</f:if>
+									<f:if condition="{mail.marketingReferer}">
+										<dl class="powermail_listbe_details_dl powermail_listbe_details_dl_additional">
+											<dt>
+												<strong><f:translate key="\In2code\Powermail\Domain\Model\Mail.marketingReferer" default="marketingReferer" /></strong>
+											</dt>
+											<dd>
+												{mail.marketingReferer}
+											</dd>
+										</dl>
+									</f:if>
+									<f:if condition="{mail.marketingCountry}">
+										<dl class="powermail_listbe_details_dl powermail_listbe_details_dl_additional">
+											<dt>
+												<strong><f:translate key="\In2code\Powermail\Domain\Model\Mail.marketingCountry" default="marketingCountry" /></strong>
+											</dt>
+											<dd>
+												{mail.marketingCountry}
+											</dd>
+										</dl>
+									</f:if>
+									<f:if condition="{mail.marketingMobileDevice}">
+										<f:comment>Use marketingPageFunnel as indicator if marketing is switched on in generally - showing "0" is ok</f:comment>
+										<dl class="powermail_listbe_details_dl powermail_listbe_details_dl_additional">
+											<dt>
+												<strong><f:translate key="\In2code\Powermail\Domain\Model\Mail.marketingMobileDevice" default="marketingMobileDevice" /></strong>
+											</dt>
+											<dd>
+												{mail.marketingMobileDevice}
+											</dd>
+										</dl>
+									</f:if>
+									<f:if condition="{mail.marketingPageFunnel}">
+										<f:comment>Use marketingPageFunnel as indicator if marketing is switched on in generally - showing "0" is ok</f:comment>
+										<dl class="powermail_listbe_details_dl powermail_listbe_details_dl_additional">
+											<dt>
+												<strong><f:translate key="\In2code\Powermail\Domain\Model\Mail.marketingFrontendLanguage" default="marketingFrontendLanguage" /></strong>
+											</dt>
+											<dd>
+												{mail.marketingFrontendLanguage}
+											</dd>
+										</dl>
+									</f:if>
+									<f:if condition="{mail.marketingBrowserLanguage}">
+										<dl class="powermail_listbe_details_dl powermail_listbe_details_dl_additional">
+											<dt>
+												<strong><f:translate key="\In2code\Powermail\Domain\Model\Mail.marketingBrowserLanguage" default="marketingBrowserLanguage" /></strong>
+											</dt>
+											<dd>
+												{mail.marketingBrowserLanguage}
+											</dd>
+										</dl>
+									</f:if>
+									<f:if condition="{mail.marketingPageFunnel}">
+										<dl class="powermail_listbe_details_dl powermail_listbe_details_dl_additional">
+											<dt>
+												<strong><f:translate key="\In2code\Powermail\Domain\Model\Mail.marketingPageFunnel" /></strong>
+											</dt>
+											<dd>
+												<f:for each="{mail.marketingPageFunnel}" as="page" iteration="index">
+													<span title="id={page}"><vh:getter.getPageNameFromUid uid="{page}" /></span> <f:if condition="{index.isLast}"><f:else> &gt; </f:else></f:if>
+												</f:for>
+											</dd>
+										</dl>
+									</f:if>
+								</f:if>
+							</div>
+						</td>
+					</tr>
+				</f:for>
+			</tbody>
+		</table>
+	</div>
+</div>

+ 86 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/OverviewBe.html

@@ -0,0 +1,86 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+{namespace core=TYPO3\CMS\Core\ViewHelpers}
+{namespace be=TYPO3\CMS\Backend\ViewHelpers}
+
+<div class="panel panel-default">
+	<div class="panel-heading">
+		<f:translate key="BackendOverviewTable">Forms</f:translate>
+		(<f:count subject="{forms}" />)
+	</div>
+	<div class="table-fit">
+		<table class="table table-hover">
+			<thead>
+				<tr>
+					<th nowrap="nowrap" class="col-icon">
+						&nbsp;
+					</th>
+					<th nowrap="nowrap">
+						<f:translate key="BackendOverviewCol1">Form Title</f:translate>
+					</th>
+					<th nowrap="nowrap">
+						<f:translate key="BackendOverviewCol2">Stored on Page</f:translate>
+					</th>
+					<th nowrap="nowrap">
+						<f:translate key="BackendOverviewCol3">Used on Page</f:translate>
+					</th>
+					<th nowrap="nowrap">
+						<f:translate key="BackendOverviewCol4">Powermail Pages</f:translate>
+					</th>
+					<th nowrap="nowrap">
+						<f:translate key="BackendOverviewCol5">Powermail Fields</f:translate>
+					</th>
+					<th nowrap="nowrap">
+						&nbsp;
+					</th>
+				</tr>
+			</thead>
+			<tbody>
+				<f:for each="{forms}" as="form" iteration="iteration">
+
+					<f:comment>Basic form information</f:comment>
+					<tr class="{f:if(condition:iteration.isFirst,then:' firstcol')}{f:if(condition:iteration.isLast,then:' lastcol')}">
+						<td nowrap="nowrap" class="col-icon" title="id={form.uid}">
+							<core:Icon identifier="tcarecords-tx_powermail_domain_model_mail-default" />
+						</td>
+						<td nowrap="nowrap">
+                            <be:link.editRecord uid="{form.uid}" table="tx_powermail_domain_model_form">
+								<span title="id={form.uid}">{form.title}</span>
+                            </be:link.editRecord>
+						</td>
+						<td nowrap="nowrap">
+							<a title="id={form.pid}" href="{f:be.uri(route:'web_layout',parameters:'{id:form.pid}')}">
+								<vh:getter.getPageNameFromUid uid="{form.pid}" />
+							</a>
+						</td>
+						<td nowrap="nowrap">
+							<f:for each="{vh:getter.getPagesWithContentRelatedToForm(form:form)}" as="page">
+								<a title="id={page.uid}" href="{f:be.uri(route:'web_layout',parameters:'{id:page.uid}')}">
+									{page.title}
+								</a>
+								<br />
+							</f:for>
+						</td>
+						<td nowrap="nowrap">
+							<span title="{vh:string.implodeField(objects:form.pages, field:'title', separator:', ')}">
+								<f:count>{form.pages}</f:count> <f:translate key="BackendOverviewPages">Pages</f:translate>
+							</span>
+						</td>
+						<td nowrap="nowrap">
+							<span title="{vh:string.implodeField(objects:'{vh:getter.getFieldsFromForm(form:form)}', separator:', ')}">
+								<f:count><vh:getter.getFieldsFromForm form="{form}" /></f:count> <f:translate key="BackendOverviewFields">Fields</f:translate>
+							</span>
+						</td>
+
+						<td nowrap="nowrap" class="col-control">
+							<div role="group" class="btn-group">
+                                <be:link.editRecord uid="{form.uid}" table="tx_powermail_domain_model_form">
+                                    <core:Icon identifier="actions-open" />
+								</be:link.editRecord>
+							</div>
+						</td>
+					</tr>
+				</f:for>
+			</tbody>
+		</table>
+	</div>
+</div>

+ 39 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/Pagination.html

@@ -0,0 +1,39 @@
+<nav aria-label="Powermail navigation">
+    <ul class="pagination">
+        <f:if condition="{pagination.previousPageNumber} && {pagination.previousPageNumber} >= {pagination.firstPageNumber}">
+            <f:then>
+                <li class="page-item previous">
+                    <a href="{f:uri.action(action:actionName, arguments:{currentPage: pagination.previousPageNumber})}"
+                       title="{f:translate(key:'pagination.previous')}" class="page-link">
+                        {f:translate(key:'widget.pagination.previous', extensionName: 'fluid')}
+                    </a>
+                </li>
+            </f:then>
+            <f:else>
+            </f:else>
+        </f:if>
+        <f:if condition="{pagination.hasLessPages}">
+            <li class="page-item">…</li>
+        </f:if>
+        <f:for each="{pagination.allPageNumbers}" as="page">
+            <li class="page-item {f:if(condition: '{page} == {paginator.currentPageNumber}', then:'active')}">
+                <a href="{f:uri.action(action:actionName, arguments:{currentPage: page})}" class="page-link">{page}</a>
+            </li>
+        </f:for>
+        <f:if condition="{pagination.hasMorePages}">
+            <li class="page-item">…</li>
+        </f:if>
+        <f:if condition="{pagination.nextPageNumber} && {pagination.nextPageNumber} <= {pagination.lastPageNumber}">
+            <f:then>
+                <li class="page-item next">
+                    <a href="{f:uri.action(action:actionName, arguments:{currentPage: pagination.nextPageNumber})}"
+                       title="{f:translate(key:'pagination.next')}" class="page-link">
+                        {f:translate(key:'widget.pagination.next', extensionName: 'fluid')}
+                    </a>
+                </li>
+            </f:then>
+            <f:else>
+            </f:else>
+        </f:if>
+    </ul>
+</nav>

+ 133 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/Search.html

@@ -0,0 +1,133 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+{namespace core=TYPO3\CMS\Core\ViewHelpers}
+
+<fieldset>
+    <div class="form-group">
+        <label for="searchall_mails">
+            <f:translate key="BackendListFilterFulltextSearch" />
+        </label>
+        <f:form.textfield
+                property="all"
+                value="{piVars.filter.all}"
+                id="searchall_mails"
+                class="form-control" />
+    </div>
+    <div class="form-group">
+        <f:if condition="{formUids -> f:count()} > 1">
+            <label for="searchall_form">
+                <f:translate key="BackendListFilterFulltextSearchFormFilter" default="Reduce to one form:" />
+            </label>
+            <f:form.select
+                    property="form"
+                    id="searchall_form"
+                    options="{formUids}"
+                    value="{piVars.filter.form}"
+                    class="form-control"
+                    prependOptionLabel=""
+                    prependOptionValue="" />
+        </f:if>
+    </div>
+    <f:render partial="Module/SearchButtons" arguments="{_all}" />
+</fieldset>
+
+<div class="collapse" id="extended_search">
+    <fieldset>
+        <legend><f:translate key="BackendListFilterDefaultFields">default fields</f:translate></legend>
+        <div class="row">
+            <div class="form-group col-md-6">
+                <label for="searchStart">
+                    <f:translate key="BackendListFilterStart" />
+                </label>
+                <div class="input-group">
+                    <f:form.textfield
+                            type="datetime-local"
+                            property="start"
+                            id="searchStart"
+                            class="form-control"
+                            value="{piVars.filter.start}" />
+                </div>
+            </div>
+            <div class="form-group col-md-6">
+                <label for="searchEnd">
+                    <f:translate key="BackendListFilterEnd" />
+                </label>
+                <div class="input-group">
+                    <f:form.textfield
+                            type="datetime-local"
+                            property="stop"
+                            id="searchEnd"
+                            class="form-control"
+                            value="{piVars.filter.stop}" />
+                </div>
+            </div>
+        </div>
+        <div class="row">
+            <div class="form-group col-md-6">
+                <label for="searchName">
+                    <f:translate key="BackendListFilterName" />
+                </label>
+                <f:form.textfield
+                        property="sender_name"
+                        id="searchName"
+                        class="form-control"
+                        value="{piVars.filter.sender_name}" />
+            </div>
+            <div class="form-group col-md-6">
+                <label for="searchMail">
+                    <f:translate key="BackendListFilterMail" />
+                </label>
+                <f:form.textfield
+                        property="sender_mail"
+                        id="searchMail"
+                        class="form-control"
+                        value="{piVars.filter.sender_mail}" />
+            </div>
+        </div>
+        <div class="row">
+            <div class="form-group col-md-6">
+                <label for="searchSubject">
+                    <f:translate key="BackendListFilterSubject" />
+                </label>
+                <f:form.textfield
+                        property="subject"
+                        id="searchSubject"
+                        class="form-control"
+                        value="{piVars.filter.subject}" />
+            </div>
+            <div class="form-group col-md-6">
+                <label for="searchHidden">
+                    <f:translate key="BackendListFilterHidden" />
+                </label>
+                <vh:form.advancedSelect
+                        property="hidden"
+                        options="{1: '{f:translate(key: \'BackendListFilterShowNonHidden\')}', 2: '{f:translate(key: \'BackendListFilterShowHidden\')}'}"
+                        id="searchHidden"
+                        defaultOption="{f:translate(key: 'pleaseChoose')}"
+                        class="form-control"
+                        value="{piVars.filter.hidden}" />
+            </div>
+        </div>
+    </fieldset>
+    <fieldset>
+        <legend><f:translate key="BackendListFilterAddField">additional fields</f:translate></legend>
+        <div class="row">
+            <f:for each="{firstForm.pages}" as="page">
+                <f:for each="{page.fields}" as="field">
+                    <f:if condition="{field.advancedFieldType}">
+                        <div class="form-group col-md-6">
+                            <label for="answer{field.uid}">
+                                {field.title}
+                            </label>
+                            <f:form.textfield
+                                    property="answer.{field.uid}"
+                                    id="answer{field.uid}"
+                                    class="form-control"
+                                    value="{vh:getter.getPiVarAnswerField(piVars:piVars, field:field)}" />
+                        </div>
+                    </f:if>
+                </f:for>
+            </f:for>
+        </div>
+    </fieldset>
+    <f:render partial="Module/SearchButtons" arguments="{_all}" />
+</div>

+ 19 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/SearchButtons.html

@@ -0,0 +1,19 @@
+<div class="form-group">
+	<f:form.button
+			class="btn btn-secondary"
+			type="button"
+			additionalAttributes="{data-bs-toggle:'collapse',data-bs-target:'#extended_search',aria-expanded:'false'}">
+		<f:translate key="BackendListFilterExtendedSearch">extended search</f:translate>
+	</f:form.button>
+	<f:if condition="{piVars.filter}">
+		<f:link.action
+				action="{forwardToAction}"
+				class="btn btn-warning">
+			<f:translate key="BackendListFilterClean">delete filters</f:translate>
+		</f:link.action>
+	</f:if>
+	<f:form.submit
+			value="{f:translate(key: 'BackendListFilterFulltextSearchSubmit')}"
+			additionalAttributes="{data-action:'searchall_submit'}"
+			class="btn btn-primary" />
+</div>

+ 5 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Module/SelectedLineMessage.html

@@ -0,0 +1,5 @@
+<div class="selectedLineMessage">
+	<span class="selectedLineMessage_numbers">0</span> <f:translate key="BackendListMultiselectLabel">records selected:</f:translate>
+	<a class="t3-icon actions-delete powermailSelectionDelete" href="#" title="delete"><core:Icon identifier="actions-delete"/></a>
+	<a class="t3-icon actions-toggle-off powermailSelectionHide" href="#" title="hide/unhide"><core:Icon identifier="actions-toggle-on"/></a>
+</div>

+ 22 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Output/Abc.html

@@ -0,0 +1,22 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<div class="form-group clearfix">
+	<div class="pull-right">
+		<ul class="pagination">
+			<f:for each="{abc}" as="letter">
+				<f:if condition="{vh:condition.isThereAMailWithStartingLetter(mails:mails, letter:letter, answerField:settings.search.abc)}">
+					<f:then>
+						<li><f:link.action action="list" arguments="{filter:{abc:letter}}">{letter}</f:link.action></li>
+					</f:then>
+					<f:else>
+						<li class="disabled"><a href="#">{letter}</a></li>
+					</f:else>
+				</f:if>
+			</f:for>
+
+			<f:if condition="{piVars.filter.abc}">
+				<li><f:link.page><f:translate key="ClearFilter" /></f:link.page></li>
+			</f:if>
+		</ul>
+	</div>
+</div>

+ 24 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Output/EditHidden.html

@@ -0,0 +1,24 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:alias map="{value:'{vh:misc.prefillField(field:field, mail:mail)}'}">
+	<f:if condition="{vh:condition.isArray(val:value)}">
+		<f:then>
+			<f:for each="{value}" as="singleValue" iteration="i">
+				<f:form.hidden
+						id="powermail_field_{field.marker}_{i.index}"
+						property="{field.marker}."
+						value="{singleValue}"
+						class="powermail_field powermail_hidden {field.css}" />
+			</f:for>
+		</f:then>
+		<f:else>
+			<f:if condition="{value}">
+				<f:form.hidden
+						id="powermail_field_{field.marker}"
+						property="{field.marker}"
+						value="{value}"
+						class="powermail_field powermail_hidden {field.css}" />
+			</f:if>
+		</f:else>
+	</f:if>
+</f:alias>

+ 53 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/Output/Search.html

@@ -0,0 +1,53 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:if condition="{settings.search.fields}">
+	<f:form action="list" name="filter" class="form-horizontal">
+		<f:comment>Fulltext Search</f:comment>
+		<f:for each="{vh:string.explode(string: '{settings.search.fields}')}" as="fieldUid">
+			<f:if condition="{0 : fieldUid} == {0 : '_all'}">
+				<f:then>
+					<div class="form-group">
+						<label for="powermail_frontend_search_all" class="control-label col-sm-2">
+							<f:translate key="PowermailFrontendFilterAll">All</f:translate>
+						</label>
+						<div class="col-sm-10">
+							<f:form.textfield
+									property="{fieldUid}"
+									id="powermail_frontend_search_all"
+									class="powermail_frontend_search powermail_frontend_search_all form-control"
+									value="{piVars.filter._all}" />
+						</div>
+					</div>
+				</f:then>
+			</f:if>
+		</f:for>
+
+		<f:comment>Selected Fields</f:comment>
+		<f:for each="{searchFields}" as="searchField">
+			<div class="form-group">
+				<label for="powermail_frontend_search_{searchField.marker}" class="control-label col-sm-2">
+					{searchField.title}
+				</label>
+				<div class="col-sm-10">
+					<f:form.textfield
+							property="{searchField.uid}"
+							id="powermail_frontend_search_{searchField.marker}"
+							class="powermail_frontend_search powermail_frontend_search_{searchField.marker} form-control"
+							value="{vh:misc.variableInVariable(obj:piVars.filter, prop:searchField.uid)}" />
+				</div>
+			</div>
+		</f:for>
+
+		<div class="form-group">
+			<div class="col-sm-10 col-sm-offset-2">
+				<f:form.submit
+						value="{f:translate(key:'PowermailFrontendFilterSubmit')}"
+						class="btn btn-primary" />
+			</div>
+		</div>
+	</f:form>
+</f:if>
+
+<f:if condition="{settings.search.abc}">
+	<f:render partial="Output/Abc" arguments="{_all}" />
+</f:if>

+ 26 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/PowermailAll/Mail.html

@@ -0,0 +1,26 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:comment>
+	Mail: {mail}
+	Answer: {answer}
+</f:comment>
+
+<tr>
+	<th valign="top" scope="row" style="text-align: start;">
+		<b><vh:string.escapeLabels>{answer.field.title}</vh:string.escapeLabels></b>
+	</th>
+	<td valign="top">
+		<f:if condition="{vh:condition.isArray(val:answer.value)}">
+			<f:else>
+				<f:format.nl2br><vh:misc.manipulateValueWithTypoScript answer="{answer}" type="{type}">{answer.value}</vh:misc.manipulateValueWithTypoScript></f:format.nl2br>
+			</f:else>
+			<f:then>
+				<f:for each="{answer.value}" as="subValue" iteration="index">
+					<f:if condition="{subValue}">
+						<vh:misc.manipulateValueWithTypoScript answer="{answer}" type="{type}">{subValue}</vh:misc.manipulateValueWithTypoScript><f:if condition="{index.isLast}"><f:else>, </f:else></f:if>
+					</f:if>
+				</f:for>
+			</f:then>
+		</f:if>
+	</td>
+</tr>

+ 26 - 0
Resources/Private/Partials/Extensions/Powermail/Partials/PowermailAll/Web.html

@@ -0,0 +1,26 @@
+{namespace vh=In2code\Powermail\ViewHelpers}
+
+<f:comment>
+	Mail: {mail}
+	Answer: {answer}
+</f:comment>
+
+<tr>
+	<th class="powermail_all_label powermail_all_type_{answer.field.type} powermail_all_marker_{answer.field.marker}" scope="row">
+		{answer.field.title}
+	</th>
+	<td class="powermail_all_value powermail_all_type_{answer.field.type} powermail_all_marker_{answer.field.marker}">
+		<f:if condition="{vh:condition.isArray(val:answer.value)}">
+			<f:else>
+				<f:format.nl2br><vh:misc.manipulateValueWithTypoScript answer="{answer}" type="{type}">{answer.value}</vh:misc.manipulateValueWithTypoScript></f:format.nl2br>
+			</f:else>
+			<f:then>
+				<f:for each="{answer.value}" as="subValue" iteration="index">
+					<f:if condition="{subValue}">
+						<vh:misc.manipulateValueWithTypoScript answer="{answer}" type="{type}">{subValue}</vh:misc.manipulateValueWithTypoScript><f:if condition="{index.isLast}"><f:else>, </f:else></f:if>
+					</f:if>
+				</f:for>
+			</f:then>
+		</f:if>
+	</td>
+</tr>

+ 39 - 0
Resources/Private/Partials/Form/Navigation.html

@@ -0,0 +1,39 @@
+<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
+      xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers"
+      data-namespace-typo3-fluid="true">
+
+<nav class="form-navigation">
+  <div class="btn-toolbar" role="toolbar">
+    <div class="btn-group" role="group">
+      <f:if condition="{form.previousPage}">
+        <span class="btn-group previous">
+          <f:form.hidden property="__currentPage"
+                         value="{form.previousPage.index}"
+                         respectSubmittedDataValue="false"/>
+          <f:form.button type="button"
+                         onclick="document.forms['{form.formDefinition.identifier}'].submit();"
+                         class="btn btn-cancel"
+                         formnovalidate="formnovalidate">{formvh:translateElementProperty(element: form.currentPage, renderingOptionProperty: 'previousButtonLabel')}</f:form.button>
+        </span>
+      </f:if>
+      <f:if condition="{form.nextPage}">
+        <f:then>
+          <span class="btn-group next">
+            <f:form.button property="__currentPage" value="{form.nextPage.index}" class="btn btn-primary">{formvh:translateElementProperty(element: form.currentPage, renderingOptionProperty: 'nextButtonLabel')}</f:form.button>
+          </span>
+        </f:then>
+        <f:else>
+          <span class="btn-group next submit">
+            <f:form.button property="__currentPage"
+                           value="{form.pages -> f:count()}"
+                           class="btn btn-primary">
+              {formvh:translateElementProperty(element: form, renderingOptionProperty: 'submitButtonLabel')}
+            </f:form.button>
+          </span>
+        </f:else>
+      </f:if>
+    </div>
+  </div>
+</nav>
+
+</html>

+ 27 - 0
Resources/Private/Partials/Page/Breadcrumb.html

@@ -0,0 +1,27 @@
+<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
+
+<f:comment>
+  <!-- Use <f:cObject typoscriptObjectPath="lib.breadcrumb"/> since this will be used within CE and DCE templates aswell -->
+</f:comment>
+
+<section class="breadcrumb">
+  <div class="breadcrumbwrapper">
+    <div class="container">
+      <div class="row">
+        <div class="col">
+          <ul>
+            <f:for each="{breadcrumbnavigation}" as="item">
+              <li class="{f:if(condition: item.current, then: 'active')}">
+                <a href="{item.link}" target="{f:if(condition: item.target, then: item.target, else: '_self')}">
+                  {item.title}
+                </a>
+              </li>
+            </f:for>
+          </ul>
+        </div>
+      </div>
+    </div>
+  </div>
+</section>
+
+</html>

+ 41 - 0
Resources/Private/Partials/Page/Footer.html

@@ -0,0 +1,41 @@
+<html data-namespace-typo3-fluid="true" xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers">
+
+<footer>
+    <div class="container">
+        <div class="row">
+            <div class="col-12">
+                <hr>
+            </div>
+
+            <div class="col-9">
+
+                <div class="DEVcompany-title">
+                    <f:comment>{companyName}</f:comment>©&nbsp;<f:format.date format="Y">now</f:format.date>&nbsp;Englisch und Mehrsprachigkeit Nordrhein-Westfalen
+
+                    <span class="dot_seperator">&nbsp;·&nbsp;</span>
+                    <span class="footer_right">
+                        <f:render partial="Footer/Legalnavigation" arguments="{_all}"/>
+                    </span>
+                </div>
+
+                <f:for as="column" each="{footersitemap}" iteration="iterator">
+                    <ul class="{f:if(condition: iterator.isFirst, then: 'big')}">
+                        <f:for as="row" each="{column.children}">
+                            <li>
+                                <a href="{row.link}"
+                                   target="{f:if(condition: row.target, then: row.target, else: '_self')}">
+                                    {row.title}&nbsp;·&nbsp;
+                                </a>
+                            </li>
+                        </f:for>
+                    </ul>
+                </f:for>
+            </div>
+            <div class="col-3 text-right">
+                <a href="#top">Nach oben</a>
+            </div>
+        </div>
+    </div>
+</footer>
+
+</html>

+ 10 - 0
Resources/Private/Partials/Page/Footer/Legalnavigation.html

@@ -0,0 +1,10 @@
+<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
+
+<f:for each="{legalnavigation}" as="item" iteration="iterator">
+  <a href="{item.link}">
+    {item.title}
+  </a>
+  <f:if condition="!{iterator.isLast}">&nbsp;·&nbsp;</f:if>
+</f:for>
+
+</html>

+ 134 - 0
Resources/Private/Partials/Page/General/Socials.html

@@ -0,0 +1,134 @@
+<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
+
+<f:if condition="{linkedInLink}">
+  <f:link.typolink parameter="{linkedInLink}" class="socialicon" target="_blank">
+    <svg version="1.1"
+         id="Ebene_1"
+         xmlns="http://www.w3.org/2000/svg"
+         xmlns:xlink="http://www.w3.org/1999/xlink"
+         x="0px"
+         y="0px"
+         viewBox="0 0 11.3 10.8"
+         style="enable-background:new 0 0 11.3 10.8;"
+         xml:space="preserve">
+      <g>
+        <path d="M1.4,0c0.2,0,0.4,0,0.6,0.1s0.3,0.1,0.4,0.3s0.2,0.2,0.3,0.4s0.1,0.3,0.1,0.5c0,0.2,0,0.4-0.1,0.5S2.5,2,2.4,2.1
+                          S2.1,2.4,1.9,2.4S1.6,2.5,1.4,2.5h0c-0.2,0-0.4,0-0.6-0.1S0.5,2.3,0.4,2.1S0.2,1.9,0.1,1.7S0,1.4,0,1.2c0-0.2,0-0.3,0.1-0.5
+                          s0.2-0.3,0.3-0.4s0.3-0.2,0.4-0.3S1.2,0,1.4,0z M0.1,3.5v7.3h2.4V3.5H0.1z M8.5,3.3c0.4,0,0.8,0.1,1.1,0.2s0.6,0.3,0.9,0.6
+                          s0.4,0.6,0.6,1s0.2,0.9,0.2,1.5v4.2H8.9V6.9c0-0.2,0-0.5-0.1-0.7S8.7,5.8,8.6,5.7S8.4,5.4,8.2,5.4S7.9,5.2,7.6,5.2
+                          c-0.2,0-0.3,0-0.4,0.1S6.9,5.4,6.8,5.5S6.6,5.7,6.6,5.8S6.4,6,6.4,6.1c0,0,0,0.1,0,0.1s0,0.1,0,0.1s0,0.1,0,0.2s0,0.1,0,0.2v4.1
+                          H3.9c0-1.6,0-2.9,0-3.9c0-1,0-1.7,0-2.2s0-0.9,0-1.2h2.4v1.1c0.1-0.1,0.2-0.3,0.3-0.4s0.3-0.3,0.4-0.4s0.4-0.2,0.6-0.3
+                          S8.2,3.3,8.5,3.3z"/>
+      </g>
+    </svg>
+  </f:link.typolink>
+</f:if>
+<f:if condition="{youtubeLink}">
+  <f:link.typolink parameter="{youtubeLink}" class="socialicon" target="_blank">
+    <svg version="1.1"
+         id="Ebene_1"
+         xmlns="http://www.w3.org/2000/svg"
+         xmlns:xlink="http://www.w3.org/1999/xlink"
+         x="0px"
+         y="0px"
+         viewBox="0 0 12.8 9"
+         style="enable-background:new 0 0 12.8 9;"
+         xml:space="preserve">
+      <g>
+        <path d="M12.5,1.4c0.1,0.4,0.2,1.1,0.2,1.9l0,1.2l0,1.2c0,0.9-0.1,1.5-0.2,1.9c-0.1,0.3-0.2,0.5-0.4,0.7s-0.4,0.3-0.7,0.4
+												C11,8.9,10,8.9,8.5,9L6.4,9L4.3,9c-1.5,0-2.5-0.1-2.9-0.2C1.1,8.7,0.9,8.5,0.7,8.3S0.3,7.9,0.3,7.6C0.1,7.2,0.1,6.5,0,5.7l0-1.2
+												c0-0.3,0-0.7,0-1.2c0-0.9,0.1-1.5,0.2-1.9c0.1-0.3,0.2-0.5,0.4-0.7s0.4-0.3,0.7-0.4C1.8,0.1,2.8,0.1,4.3,0l2.1,0l2.1,0
+												c1.5,0,2.5,0.1,2.9,0.2c0.3,0.1,0.5,0.2,0.7,0.4S12.5,1.1,12.5,1.4z M5.1,6.4l3.4-1.9L5.1,2.6V6.4z"/>
+      </g>
+    </svg>
+  </f:link.typolink>
+</f:if>
+<f:if condition="{xingLink}">
+  <f:link.typolink parameter="{xingLink}" class="socialicon" target="_blank">
+    <svg version="1.1"
+         id="Ebene_1"
+         xmlns="http://www.w3.org/2000/svg"
+         xmlns:xlink="http://www.w3.org/1999/xlink"
+         x="0px"
+         y="0px"
+         viewBox="0 0 9 10.5"
+         style="enable-background:new 0 0 9 10.5;"
+         xml:space="preserve">
+      <g>
+        <path d="M3.2,5.2l-1,1.8C2.1,7.3,1.9,7.4,1.8,7.4H0.2c-0.1,0-0.2,0-0.2-0.1S0,7.1,0,7l1.6-2.9c0,0,0,0,0,0l-1-1.8
+												c0-0.1,0-0.2,0-0.2s0.1-0.1,0.2-0.1h1.5c0.2,0,0.3,0.1,0.4,0.3l1.1,1.8C3.8,4.2,3.6,4.6,3.2,5.2z M5.6,6.3l2.1,3.9
+												c0,0.1,0.1,0.2,0,0.2s-0.1,0.1-0.2,0.1H6c-0.2,0-0.3-0.1-0.4-0.3l-2.2-4l3.4-6C6.9,0.1,7.1,0,7.2,0h1.5C8.9,0,8.9,0,9,0.1
+												s0,0.1,0,0.2L5.6,6.3z"/>
+      </g>
+    </svg>
+  </f:link.typolink>
+</f:if>
+<f:if condition="{twitterLink}">
+  <f:link.typolink parameter="{twitterLink}" class="socialicon" target="_blank">
+    <svg version="1.1"
+         id="Ebene_1"
+         xmlns="http://www.w3.org/2000/svg"
+         xmlns:xlink="http://www.w3.org/1999/xlink"
+         x="0px"
+         y="0px"
+         viewBox="0 0 12 9.8"
+         style="enable-background:new 0 0 12 9.8;"
+         xml:space="preserve">
+      <g>
+        <path d="M10.8,2.7C10.8,3.9,10.5,5,10,6C9.4,7.1,8.6,8,7.6,8.6C6.5,9.4,5.2,9.8,3.8,9.8C2.4,9.8,1.1,9.4,0,8.6c0.2,0,0.4,0,0.6,0
+												c1.1,0,2.2-0.4,3.1-1.1c-0.5,0-1-0.2-1.4-0.5S1.5,6.4,1.4,5.9c0.2,0,0.3,0,0.4,0c0.2,0,0.4,0,0.7-0.1C1.9,5.8,1.4,5.5,1.1,5
+												S0.5,4,0.5,3.5v0c0.3,0.2,0.7,0.3,1.1,0.3C1.3,3.5,1,3.2,0.8,2.9S0.5,2.1,0.5,1.7s0.1-0.8,0.4-1.2c0.6,0.8,1.4,1.4,2.2,1.8
+												S4.9,3,5.9,3c0-0.2,0-0.4,0-0.6C5.9,2,6,1.6,6.2,1.2s0.5-0.7,0.9-0.9S7.9,0,8.3,0c0.4,0,0.7,0.1,1,0.2s0.6,0.3,0.8,0.6
+												c0.6-0.1,1.1-0.3,1.6-0.6c-0.2,0.6-0.5,1-1.1,1.4c0.5-0.1,0.9-0.2,1.4-0.4c-0.3,0.5-0.8,0.9-1.2,1.3C10.8,2.5,10.8,2.6,10.8,2.7z"/>
+      </g>
+    </svg>
+  </f:link.typolink>
+</f:if>
+<f:if condition="{facebookLink}">
+  <f:link.typolink parameter="{facebookLink}" class="socialicon" target="_blank">
+    <svg version="1.1"
+         id="Ebene_1"
+         xmlns="http://www.w3.org/2000/svg"
+         xmlns:xlink="http://www.w3.org/1999/xlink"
+         x="0px"
+         y="0px"
+         viewBox="0 0 6.2 12"
+         style="enable-background:new 0 0 6.2 12;"
+         xml:space="preserve">
+      <g>
+        <path d="M1.8,6.6H0V4.5h1.8V2.8c0-0.9,0.2-1.6,0.8-2.1S3.7,0,4.5,0c0.7,0,1.2,0,1.6,0.1V2H5.1C4.6,2,4.4,2.1,4.2,2.3
+												C4.1,2.4,4,2.7,4,3v1.5h2L5.7,6.6H4V12H1.8V6.6z"/>
+      </g>
+    </svg>
+  </f:link.typolink>
+</f:if>
+<f:if condition="{instagramLink}">
+  <f:link.typolink parameter="{instagramLink}" class="socialicon" target="_blank">
+    <svg version="1.1"
+         id="Ebene_1"
+         xmlns="http://www.w3.org/2000/svg"
+         xmlns:xlink="http://www.w3.org/1999/xlink"
+         x="0px"
+         y="0px"
+         viewBox="0 0 10.5 10.5"
+         style="enable-background:new 0 0 10.5 10.5;"
+         xml:space="preserve">
+      <g>
+        <path d="M10.5,3.1c0,0.4,0,1.2,0,2.2s0,1.7,0,2.2s-0.1,0.8-0.2,1.2c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6
+												c-0.3,0.1-0.7,0.2-1.2,0.2s-1.2,0-2.2,0s-1.7,0-2.2,0s-0.8-0.1-1.2-0.2c-0.4-0.1-0.7-0.3-1-0.6S0.4,9,0.2,8.6
+												C0.1,8.3,0.1,7.9,0,7.4s0-1.2,0-2.2s0-1.7,0-2.2s0.1-0.8,0.2-1.2c0.1-0.4,0.4-0.7,0.6-1s0.6-0.5,1-0.6C2.2,0.1,2.6,0.1,3.1,0
+												s1.2,0,2.2,0S7,0,7.4,0s0.8,0.1,1.2,0.2c0.4,0.1,0.7,0.4,1,0.6c0.3,0.3,0.5,0.6,0.6,1C10.4,2.2,10.4,2.6,10.5,3.1z M9.4,8.3
+												c0.1-0.3,0.2-0.7,0.2-1.3c0-0.3,0-0.8,0-1.5V4.9c0-0.6,0-1.1,0-1.5c0-0.6-0.1-1-0.2-1.3c-0.2-0.5-0.5-0.8-1-1C8.1,1.1,7.7,1,7.1,1
+												c-0.3,0-0.8,0-1.5,0H4.9c-0.6,0-1.1,0-1.5,0c-0.6,0-1,0.1-1.3,0.2c-0.5,0.2-0.8,0.5-1,1C1.1,2.4,1,2.8,1,3.4c0,0.3,0,0.8,0,1.5v0.8
+												c0,0.6,0,1.1,0,1.5c0,0.6,0.1,1,0.2,1.3c0.2,0.5,0.5,0.8,1,1c0.3,0.1,0.7,0.2,1.3,0.2c0.3,0,0.8,0,1.5,0h0.8c0.6,0,1.1,0,1.5,0
+												c0.6,0,1-0.1,1.3-0.2C8.8,9.1,9.2,8.8,9.4,8.3z M5.2,2.6c0.5,0,0.9,0.1,1.3,0.4s0.7,0.6,1,1s0.4,0.9,0.4,1.3S7.8,6.2,7.6,6.6
+												s-0.6,0.7-1,1S5.7,7.9,5.2,7.9S4.3,7.8,3.9,7.6s-0.7-0.6-1-1S2.6,5.7,2.6,5.2s0.1-0.9,0.4-1.3s0.6-0.7,1-1S4.8,2.6,5.2,2.6z M5.2,7
+												c0.5,0,0.9-0.2,1.2-0.5S7,5.7,7,5.2S6.8,4.4,6.5,4S5.7,3.5,5.2,3.5S4.4,3.7,4,4S3.5,4.8,3.5,5.2S3.7,6.1,4,6.5S4.8,7,5.2,7z
+												 M8.7,2.4c0-0.2-0.1-0.3-0.2-0.4S8.2,1.8,8.1,1.8S7.7,1.9,7.6,2S7.4,2.3,7.4,2.4s0.1,0.3,0.2,0.4s0.3,0.2,0.4,0.2S8.4,3,8.5,2.9
+												S8.7,2.6,8.7,2.4z"/>
+      </g>
+    </svg>
+  </f:link.typolink>
+</f:if>
+
+</html>

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.