Browse Source

Merge branch 'release/1.0' into develop

Olivier Massot 1 year ago
parent
commit
3717c46595
29 changed files with 589 additions and 249 deletions
  1. 399 0
      .htaccess
  2. 1 1
      ot_core/Classes/Domain/Repository/DonorRepository.php
  3. 1 1
      ot_core/Classes/Domain/Repository/EventRepository.php
  4. 1 1
      ot_core/Classes/Domain/Repository/MemberRepository.php
  5. 6 1
      ot_core/Classes/Service/OpentalentImageService.php
  6. 1 0
      ot_core/Classes/Website/OtWebsiteRepository.php
  7. 0 0
      ot_core/Tests/Build/.phpunit.result.cache
  8. 0 1
      ot_core/Tests/Build/UnitTests.xml
  9. 6 5
      ot_core/Tests/Unit/Controller/SelectedSiteControllerTest.php
  10. 2 2
      ot_core/Tests/Unit/Domain/Model/DonorTest.php
  11. 2 2
      ot_core/Tests/Unit/Domain/Model/EventTest.php
  12. 1 1
      ot_core/Tests/Unit/Domain/Model/MemberTest.php
  13. 2 3
      ot_core/Tests/Unit/Domain/Model/OrganizationTest.php
  14. 2 4
      ot_core/Tests/Unit/Domain/Repository/AbstractApiRepositoryTestCase.php
  15. 2 2
      ot_core/Tests/Unit/Domain/Repository/ApiPagedCollectionTest.php
  16. 2 2
      ot_core/Tests/Unit/Exception/ApiRequestExceptionTest.php
  17. 19 0
      ot_core/Tests/Unit/OtUnitTestCase.php
  18. 2 3
      ot_core/Tests/Unit/Service/OpentalentApiServiceTest.php
  19. 2 2
      ot_core/Tests/Unit/Service/OpentalentEnvServiceTest.php
  20. 2 2
      ot_core/Tests/Unit/Website/OtPageRepositoryTest.php
  21. 2 3
      ot_core/Tests/Unit/Website/OtWebsiteRepositoryTest.php
  22. 2 11
      ot_templating/Classes/ViewHelpers/Page/GetFirstWithTemplateViewHelper.php
  23. 1 1
      ot_templating/Resources/Private/Layouts/Classic/StructureDetails.html
  24. 1 1
      ot_templating/Resources/Private/Layouts/Modern/StructureDetails.html
  25. 28 40
      ot_templating/Resources/Private/Partials/Classic/Assets.html
  26. 1 1
      ot_templating/Resources/Private/Partials/Classic/Topbar.html
  27. 99 158
      ot_templating/Resources/Private/Partials/Modern/Assets.html
  28. 1 1
      ot_templating/Resources/Private/Partials/Modern/Menu.html
  29. 1 0
      ot_templating/Resources/Public/assets/Classic/style/module/_members.scss

+ 399 - 0
.htaccess

@@ -0,0 +1,399 @@
+
+SetEnv TYPO3_CONTEXT Development
+
+# Enable / Disable the opentalent ot_optimizer middlewares
+SetEnv TYPO3_OPTIMIZE 1
+
+#####
+#
+# Example .htaccess file for TYPO3 CMS - for use with Apache Webserver
+#
+# This file includes settings for the following configuration options:
+#
+# - Compression
+# - Caching
+# - MIME types
+# - Cross Origin requests
+# - Rewriting and Access
+# - Miscellaneous
+# - PHP optimisation
+#
+# If you want to use it, you have to copy it to the root folder of your TYPO3 installation (if its
+# not there already) and rename it to '.htaccess'. To make .htaccess files work, you might need to
+# adjust the 'AllowOverride' directive in your Apache configuration file.
+#
+# IMPORTANT: You may need to change this file depending on your TYPO3 installation!
+#            Consider adding this file's content to your webserver's configuration directly for speed improvement
+#
+# Lots of the options are taken from https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess
+#
+####
+
+
+### Begin: Compression ###
+
+# Compressing resource files will save bandwidth and so improve loading speed especially for users
+# with slower internet connections. TYPO3 can compress the .js and .css files for you.
+# *) Uncomment the following lines and
+# *) Set $GLOBALS['TYPO3_CONF_VARS']['BE']['compressionLevel'] = 9 for the Backend
+# *) Set $GLOBALS['TYPO3_CONF_VARS']['FE']['compressionLevel'] = 9 together with the TypoScript properties
+#    config.compressJs and config.compressCss for GZIP compression of Frontend JS and CSS files.
+
+<FilesMatch "\.js\.gz">
+	AddType "text/javascript" .gz
+</FilesMatch>
+<FilesMatch "\.css\.gz">
+	AddType "text/css" .gz
+</FilesMatch>
+AddEncoding x-gzip .gz
+
+<IfModule mod_deflate.c>
+	# Force compression for mangled `Accept-Encoding` request headers
+	<IfModule mod_setenvif.c>
+		<IfModule mod_headers.c>
+			SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
+			RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
+		</IfModule>
+	</IfModule>
+
+	# Compress all output labeled with one of the following media types.
+	#
+	# (!) For Apache versions below version 2.3.7 you don't need to
+	# enable `mod_filter` and can remove the `<IfModule mod_filter.c>`
+	# and `</IfModule>` lines as `AddOutputFilterByType` is still in
+	# the core directives.
+	#
+	# https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype
+
+	<IfModule mod_filter.c>
+		AddOutputFilterByType DEFLATE application/atom+xml \
+			application/javascript \
+			application/json \
+			application/ld+json \
+			application/manifest+json \
+			application/rdf+xml \
+			application/rss+xml \
+			application/schema+json \
+			application/vnd.geo+json \
+			application/geo+json \
+			application/vnd.ms-fontobject \
+			application/x-font-ttf \
+			application/x-javascript \
+			application/x-web-app-manifest+json \
+			application/xhtml+xml \
+			application/xml \
+			font/eot \
+			font/opentype \
+			font/otf \
+			font/ttf \
+			image/bmp \
+			image/svg+xml \
+			image/vnd.microsoft.icon \
+			image/x-icon \
+			text/cache-manifest \
+			text/css \
+			text/html \
+			text/javascript \
+			text/plain \
+			text/vcard \
+			text/vnd.rim.location.xloc \
+			text/vtt \
+			text/x-component \
+			text/x-cross-domain-policy \
+			text/xml
+	</IfModule>
+
+	<IfModule mod_mime.c>
+		AddEncoding gzip svgz
+	</IfModule>
+</IfModule>
+
+### End: Compression ###
+
+
+
+### Begin: Browser caching of resource files ###
+
+# This affects Frontend and Backend and increases performance.
+<IfModule mod_expires.c>
+
+	ExpiresActive On
+	ExpiresDefault                                      "access plus 1 month"
+
+	ExpiresByType text/css                              "access plus 1 year"
+
+	ExpiresByType application/json                      "access plus 0 seconds"
+	ExpiresByType application/ld+json                   "access plus 0 seconds"
+	ExpiresByType application/schema+json               "access plus 0 seconds"
+	ExpiresByType application/vnd.geo+json              "access plus 0 seconds"
+	ExpiresByType application/geo+json                  "access plus 0 seconds"
+	ExpiresByType application/xml                       "access plus 0 seconds"
+	ExpiresByType text/xml                              "access plus 0 seconds"
+
+	ExpiresByType image/vnd.microsoft.icon              "access plus 1 week"
+	ExpiresByType image/x-icon                          "access plus 1 week"
+
+	ExpiresByType text/x-component                      "access plus 1 month"
+
+	ExpiresByType text/html                             "access plus 0 seconds"
+
+	ExpiresByType application/javascript                "access plus 1 year"
+	ExpiresByType application/x-javascript              "access plus 1 year"
+	ExpiresByType text/javascript                       "access plus 1 year"
+
+	ExpiresByType application/manifest+json             "access plus 1 week"
+	ExpiresByType application/x-web-app-manifest+json   "access plus 0 seconds"
+	ExpiresByType text/cache-manifest                   "access plus 0 seconds"
+
+	ExpiresByType audio/ogg                             "access plus 1 month"
+	ExpiresByType image/apng                            "access plus 1 month"
+	ExpiresByType image/avif                            "access plus 1 month"
+	ExpiresByType image/avif-sequence                   "access plus 1 month"
+	ExpiresByType image/bmp                             "access plus 1 month"
+	ExpiresByType image/gif                             "access plus 1 month"
+	ExpiresByType image/jpeg                            "access plus 1 month"
+	ExpiresByType image/jxl                             "access plus 1 month"
+	ExpiresByType image/png                             "access plus 1 month"
+	ExpiresByType image/svg+xml                         "access plus 1 month"
+	ExpiresByType image/webp                            "access plus 1 month"
+	ExpiresByType video/mp4                             "access plus 1 month"
+	ExpiresByType video/ogg                             "access plus 1 month"
+	ExpiresByType video/webm                            "access plus 1 month"
+
+	ExpiresByType application/atom+xml                  "access plus 1 hour"
+	ExpiresByType application/rdf+xml                   "access plus 1 hour"
+	ExpiresByType application/rss+xml                   "access plus 1 hour"
+
+	ExpiresByType font/collection                       "access plus 1 month"
+	ExpiresByType application/vnd.ms-fontobject         "access plus 1 month"
+	ExpiresByType font/eot                              "access plus 1 month"
+	ExpiresByType font/opentype                         "access plus 1 month"
+	ExpiresByType font/otf                              "access plus 1 month"
+	ExpiresByType application/x-font-ttf                "access plus 1 month"
+	ExpiresByType font/ttf                              "access plus 1 month"
+	ExpiresByType application/font-woff                 "access plus 1 month"
+	ExpiresByType application/x-font-woff               "access plus 1 month"
+	ExpiresByType font/woff                             "access plus 1 month"
+	ExpiresByType application/font-woff2                "access plus 1 month"
+	ExpiresByType font/woff2                            "access plus 1 month"
+
+	ExpiresByType text/x-cross-domain-policy            "access plus 1 week"
+
+</IfModule>
+
+### End: Browser caching of resource files ###
+
+
+### Begin: MIME types ###
+
+# Proper MIME types for all files
+<IfModule mod_mime.c>
+	# Security configuration
+	RemoveType .html .htm
+	<FilesMatch ".+\.html?$">
+		AddType text/html .html .htm
+	</FilesMatch>
+
+	RemoveType .svg .svgz
+	<FilesMatch ".+\.svgz?$">
+		AddType image/svg+xml .svg .svgz
+	</FilesMatch>
+
+	# Data interchange
+	AddType application/atom+xml                        atom
+	AddType application/json                            json map topojson
+	AddType application/ld+json                         jsonld
+	AddType application/rss+xml                         rss
+	AddType application/vnd.geo+json                    geojson
+	AddType application/xml                             rdf xml
+
+	# JavaScript
+	AddType application/javascript                      js
+
+	# Manifest files
+	AddType application/manifest+json                   webmanifest
+	AddType application/x-web-app-manifest+json         webapp
+	AddType text/cache-manifest                         appcache
+
+	# Media files
+
+	AddType audio/mp4                                   f4a f4b m4a
+	AddType audio/ogg                                   oga ogg opus
+	AddType image/avif                                  avif
+	AddType image/avif-sequence                         avifs
+	AddType image/bmp                                   bmp
+	AddType image/jxl                                   jxl
+	AddType image/webp                                  webp
+	AddType video/mp4                                   f4v f4p m4v mp4
+	AddType video/ogg                                   ogv
+	AddType video/webm                                  webm
+	AddType video/x-flv                                 flv
+	AddType image/x-icon                                cur ico
+
+	# Web fonts
+	AddType font/woff                                   woff
+	AddType font/woff2                                  woff2
+	AddType application/vnd.ms-fontobject               eot
+	AddType font/ttf                                    ttc ttf
+	AddType font/otf                                    otf
+
+	# Other
+	AddType application/octet-stream                    safariextz
+	AddType application/x-bb-appworld                   bbaw
+	AddType application/x-chrome-extension              crx
+	AddType application/x-opera-extension               oex
+	AddType application/x-xpinstall                     xpi
+	AddType text/vcard                                  vcard vcf
+	AddType text/vnd.rim.location.xloc                  xloc
+	AddType text/vtt                                    vtt
+	AddType text/x-component                            htc
+
+</IfModule>
+
+# UTF-8 encoding
+AddDefaultCharset utf-8
+<IfModule mod_mime.c>
+	AddCharset utf-8 .atom .css .js .json .manifest .rdf .rss .vtt .webapp .webmanifest .xml
+</IfModule>
+
+### End: MIME types ###
+
+
+
+### Begin: Cross Origin ###
+
+# Send the CORS header for images when browsers request it.
+<IfModule mod_setenvif.c>
+	<IfModule mod_headers.c>
+		<FilesMatch "\.(avifs?|bmp|cur|gif|ico|jpe?g|png|svgz?|webp)$">
+			SetEnvIf Origin ":" IS_CORS
+			Header set Access-Control-Allow-Origin "*" env=IS_CORS
+		</FilesMatch>
+	</IfModule>
+</IfModule>
+
+# Allow cross-origin access to web fonts.
+<IfModule mod_headers.c>
+	<FilesMatch "\.(eot|otf|tt[cf]|woff2?)$">
+		Header set Access-Control-Allow-Origin "*"
+	</FilesMatch>
+</IfModule>
+
+### End: Cross Origin ###
+
+
+
+### Begin: Rewriting and Access ###
+
+<IfModule mod_rewrite.c>
+
+	# Enable URL rewriting
+	RewriteEngine On
+
+	# Store the current location in an environment variable CWD to use
+	# mod_rewrite in .htaccess files without knowing the RewriteBase
+	RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$
+	RewriteRule ^.*$ - [E=CWD:%2]
+
+	# Rules to set ApplicationContext based on hostname
+	#RewriteCond %{HTTP_HOST} ^dev\.example\.com$
+	#RewriteRule .? - [E=TYPO3_CONTEXT:Development]
+	#RewriteCond %{HTTP_HOST} ^staging\.example\.com$
+	#RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging]
+	#RewriteCond %{HTTP_HOST} ^www\.example\.com$
+	#RewriteRule .? - [E=TYPO3_CONTEXT:Production]
+
+	# Rule for versioned static files, configured through:
+	# - $GLOBALS['TYPO3_CONF_VARS']['BE']['versionNumberInFilename']
+	# - $GLOBALS['TYPO3_CONF_VARS']['FE']['versionNumberInFilename']
+	# IMPORTANT: This rule has to be the very first RewriteCond in order to work!
+	RewriteCond %{REQUEST_FILENAME} !-f
+	RewriteCond %{REQUEST_FILENAME} !-d
+	RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gz)$ %{ENV:CWD}$1.$3 [L]
+
+	# Access block for folders
+	RewriteRule _(?:recycler|temp)_/ - [F]
+	RewriteRule fileadmin/templates/.*\.(?:txt|ts)$ - [F]
+	RewriteRule ^(?:vendor|typo3_src|typo3temp/var) - [F]
+	RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|Documentation|docs?)/ - [F]
+
+	# Block access to all hidden files and directories with the exception of
+	# the visible content from within the `/.well-known/` hidden directory (RFC 5785).
+	RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC]
+	RewriteCond %{SCRIPT_FILENAME} -d [OR]
+	RewriteCond %{SCRIPT_FILENAME} -f
+	RewriteRule (?:^|/)\. - [F]
+
+	# Stop rewrite processing, if we are in any other known directory
+	# NOTE: Add your additional local storages here
+	RewriteRule ^(?:fileadmin/|typo3conf/|typo3temp/|uploads/) - [L]
+
+	# If the file/symlink/directory does not exist but is below /typo3/, redirect to the TYPO3 Backend entry point.
+	RewriteCond %{REQUEST_FILENAME} !-f
+	RewriteCond %{REQUEST_FILENAME} !-d
+	RewriteCond %{REQUEST_FILENAME} !-l
+	RewriteRule ^typo3/(.*)$ %{ENV:CWD}typo3/index.php [QSA,L]
+
+	# If the file/symlink/directory does not exist => Redirect to index.php.
+	# For httpd.conf, you need to prefix each '%{REQUEST_FILENAME}' with '%{DOCUMENT_ROOT}'.
+	RewriteCond %{REQUEST_FILENAME} !-f
+	RewriteCond %{REQUEST_FILENAME} !-d
+	RewriteCond %{REQUEST_FILENAME} !-l
+	RewriteRule ^.*$ %{ENV:CWD}index.php [QSA,L]
+
+</IfModule>
+
+# Access block for files
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	<FilesMatch "(?i:^\.|^#.*#|^(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|^composer\.(?:json|lock)|^ext_conf_template\.txt|^ext_typoscript_constants\.txt|^ext_typoscript_setup\.txt|flexform[^.]*\.xml|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|ya?ml|ts|typoscript|tsconfig|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sqlite(?:\..*)?|sw[op]|git.*|rc)|.*~)$">
+		Order allow,deny
+		Deny from all
+		Satisfy All
+	</FilesMatch>
+</IfModule>
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	<If "%{REQUEST_URI} =~ m#(?i:/\.|/\x23.*\x23|/(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|/composer\.(?:json|lock)|/ext_conf_template\.txt|/ext_typoscript_constants\.txt|/ext_typoscript_setup\.txt|flexform[^.]*\.xml|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|ya?ml|ts|typoscript|tsconfig|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sqlite(?:\..*)?|sw[op]|git.*|rc)|.*~)$#">
+		Require all denied
+	</If>
+</IfModule>
+
+# Block access to vcs directories
+<IfModule mod_alias.c>
+	RedirectMatch 404 /\.(?:git|svn|hg)/
+</IfModule>
+
+### End: Rewriting and Access ###
+
+
+
+### Begin: Miscellaneous ###
+
+# 404 error prevention for non-existing redirected folders
+Options -MultiViews
+
+# Make sure that directory listings are disabled.
+<IfModule mod_autoindex.c>
+	Options -Indexes
+</IfModule>
+
+<IfModule mod_headers.c>
+	# Force IE to render pages in the highest available mode
+	Header set X-UA-Compatible "IE=edge"
+	<FilesMatch "\.(appcache|avifs?|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svgz?|ttf|vcf|webapp|webm|webp|woff2?|xml|xpi)$">
+		Header unset X-UA-Compatible
+	</FilesMatch>
+
+	# Reducing MIME type security risks
+	Header set X-Content-Type-Options "nosniff"
+</IfModule>
+
+# ETag removal
+<IfModule mod_headers.c>
+	Header unset ETag
+</IfModule>
+FileETag None
+
+### End: Miscellaneous ###
+

+ 1 - 1
ot_core/Classes/Domain/Repository/DonorRepository.php

@@ -65,7 +65,7 @@ class DonorRepository extends BaseApiRepository
         $donor->setWebsite($record['website']);
         $donor->setWording($record['wording']);
         $donor->setDisplayedOn($record['displayedOn']);
-        $donor->setLogo($record['logo'] ? $this->apiService->getApiUri($record['logo'], true) : null);
+        $donor->setLogo($record['logo']);
 
         return $donor;
     }

+ 1 - 1
ot_core/Classes/Domain/Repository/EventRepository.php

@@ -190,7 +190,7 @@ class EventRepository extends BaseApiRepository
         $event->setRoomFloorSize($record['roomFloorSize']);
         $event->setZupId($record['zupId']);
         $event->setDeepLink($record['deepLink']);
-        $event->setImage($record['image'] ? $this->apiService->getApiUri($record['image'], true) : null);
+        $event->setImage($record['image']);
         $event->setPriceMini($record['priceMini']);
         $event->setMeetingSchedule($record['meetingSchedule']);
         $event->setApi($record['api']);

+ 1 - 1
ot_core/Classes/Domain/Repository/MemberRepository.php

@@ -64,7 +64,7 @@ class MemberRepository extends BaseApiRepository
             $member->setMission($record['mission']);
         }
         $member->setPersonId((int)$record['personId']);
-        $member->setImage($record['image'] ? $this->apiService->getApiUri($record['image'], true) : null);
+        $member->setImage($record['image']);
 
         return $member;
     }

+ 6 - 1
ot_core/Classes/Service/OpentalentImageService.php

@@ -10,6 +10,8 @@ class OpentalentImageService
     public const IMAGE_MD = 'md';
     public const IMAGE_LG = 'lg';
 
+    private OpentalentApiService $apiService;
+
     public function __construct(
         OpentalentApiService $apiService = null
     )
@@ -22,7 +24,10 @@ class OpentalentImageService
             throw new \RuntimeException('Invalid $size : ' . $size);
         }
 
-        $path = $this->apiService->getBody("api/public/files/$fileId/download/$size", ['relativePath' => true]);
+        $url = $this->apiService->getApiUri("api/public/files/$fileId/download/$size");
+
+        $path = $this->apiService->getBody($url, ['relativePath' => true]);
+
         return $this->apiService->getApiUri($path, true);
     }
 }

+ 1 - 0
ot_core/Classes/Website/OtWebsiteRepository.php

@@ -294,6 +294,7 @@ class OtWebsiteRepository
                               ],
                 'rootPageId' => $rootUid,
                 'routes' => [],
+                'contentSecurityPolicies' => [], // En attendant résolution de https://review.typo3.org/c/Packages/TYPO3.CMS/+/85954
             ]
         );
     }

File diff suppressed because it is too large
+ 0 - 0
ot_core/Tests/Build/.phpunit.result.cache


+ 0 - 1
ot_core/Tests/Build/UnitTests.xml

@@ -1,7 +1,6 @@
 <phpunit
         backupGlobals="true"
         backupStaticAttributes="false"
-        bootstrap="../../.Build/vendor/nimut/testing-framework/res/Configuration/UnitTestsBootstrap.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertWarningsToExceptions="false"

+ 6 - 5
ot_core/Tests/Unit/Controller/SelectedSiteControllerTest.php

@@ -2,7 +2,6 @@
 
 namespace Opentalent\OtCore\Tests\Unit\Controller;
 
-use Nimut\TestingFramework\TestCase\UnitTestCase;
 use Opentalent\OtCore\Controller\SelectedSiteController;
 use Opentalent\OtCore\Exception\NoSiteSelected;
 use Opentalent\OtCore\Website\OtPageRepository;
@@ -10,6 +9,7 @@ use Opentalent\OtCore\Website\OtWebsiteRepository;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Http\Message\ResponseInterface;
 use TYPO3\CMS\Extbase\Mvc\RequestInterface;
+use Opentalent\OtCore\Tests\Unit\OtUnitTestCase;
 
 class TestableSelectedSiteController extends SelectedSiteController {
     public $currentWebsite;
@@ -26,7 +26,7 @@ class TestableSelectedSiteController extends SelectedSiteController {
     }
 }
 
-class SelectedSiteControllerTest extends UnitTestCase
+class SelectedSiteControllerTest extends OtUnitTestCase
 {
     protected MockObject | OtPageRepository $otPageRepository;
     protected MockObject | OtWebsiteRepository $otWebsiteRepository;
@@ -46,9 +46,10 @@ class SelectedSiteControllerTest extends UnitTestCase
 
     public function getMockForMethod(string $methodName): MockObject | TestableSelectedSiteController
     {
-        $controller = $this->getMockBuilder(TestableSelectedSiteController::class)
-            ->setMethodsExcept([$methodName, 'injectOtPageRepository', 'injectOtWebsiteRepository'])
-            ->getMock();
+        $controller = $this->getMockForMethods(
+            TestableSelectedSiteController::class,
+            [$methodName, 'injectOtPageRepository', 'injectOtWebsiteRepository']
+        );
 
         $controller->injectOtPageRepository($this->otPageRepository);
         $controller->injectOtWebsiteRepository($this->otWebsiteRepository);

+ 2 - 2
ot_core/Tests/Unit/Domain/Model/DonorTest.php

@@ -3,10 +3,10 @@
 namespace Opentalent\OtCore\Tests\Unit\Domain;
 
 use AssertionError;
-use Nimut\TestingFramework\TestCase\UnitTestCase;
 use Opentalent\OtCore\Domain\Model\Donor;
+use Opentalent\OtCore\Tests\Unit\OtUnitTestCase;
 
-class DonorTest extends UnitTestCase
+class DonorTest extends OtUnitTestCase
 {
     /**
      * Object should instantiate correctly, and properties

+ 2 - 2
ot_core/Tests/Unit/Domain/Model/EventTest.php

@@ -3,11 +3,11 @@
 namespace Opentalent\OtCore\Tests\Unit\Domain;
 
 use AssertionError;
-use Nimut\TestingFramework\TestCase\UnitTestCase;
 use Opentalent\OtCore\Domain\Model\Event;
 use Opentalent\OtCore\Domain\Model\Organization;
+use Opentalent\OtCore\Tests\Unit\OtUnitTestCase;
 
-class EventTest extends UnitTestCase
+class EventTest extends OtUnitTestCase
 {
     /**
      * Object should instantiate correctly, and properties

+ 1 - 1
ot_core/Tests/Unit/Domain/Model/MemberTest.php

@@ -3,8 +3,8 @@
 namespace Opentalent\OtCore\Tests\Unit\Domain;
 
 use AssertionError;
-use Nimut\TestingFramework\TestCase\UnitTestCase;
 use Opentalent\OtCore\Domain\Model\Member;
+use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 class MemberTest extends UnitTestCase
 {

+ 2 - 3
ot_core/Tests/Unit/Domain/Model/OrganizationTest.php

@@ -3,11 +3,10 @@
 namespace Opentalent\OtCore\Tests\Unit\Domain;
 
 use AssertionError;
-use Nimut\TestingFramework\TestCase\UnitTestCase;
-use Opentalent\OtCore\Domain\Model\Donor;
 use Opentalent\OtCore\Domain\Model\Organization;
+use Opentalent\OtCore\Tests\Unit\OtUnitTestCase;
 
-class OrganizationTest extends UnitTestCase
+class OrganizationTest extends OtUnitTestCase
 {
     /**
      * Object should instantiate correctly, and properties

+ 2 - 4
ot_core/Tests/Unit/Domain/Repository/AbstractApiRepositoryTestCase.php

@@ -3,21 +3,19 @@
 namespace Opentalent\OtCore\Tests\Unit\Domain\Repository;
 
 use GuzzleHttp\Client;
-use Nimut\TestingFramework\TestCase\UnitTestCase;
-use Opentalent\OtCore\Domain\Repository\BaseApiRepository;
 use Opentalent\OtCore\Service\OpentalentApiService;
 use Opentalent\OtCore\Tests\Unit\Fixtures\ApiResponseFixtures;
-use Prophecy\Argument;
 use Prophecy\PhpUnit\ProphecyTrait;
 use ReflectionClass;
 use TYPO3\CMS\Core\Core\ApplicationContext;
+use Opentalent\OtCore\Tests\Unit\OtUnitTestCase;
 
 /**
  * Base class for BaseApiRepositoryTest and its subclasses
  *
  * @package Opentalent\OtCore\Tests\Unit\Repository
  */
-abstract class AbstractApiRepositoryTestCase extends UnitTestCase
+abstract class AbstractApiRepositoryTestCase extends OtUnitTestCase
 {
     use ProphecyTrait;
 

+ 2 - 2
ot_core/Tests/Unit/Domain/Repository/ApiPagedCollectionTest.php

@@ -2,10 +2,10 @@
 
 namespace Opentalent\OtCore\Tests\Unit\Repository;
 
-use Nimut\TestingFramework\TestCase\UnitTestCase;
 use Opentalent\OtCore\Domain\Repository\ApiPagedCollection;
+use Opentalent\OtCore\Tests\Unit\OtUnitTestCase;
 
-class ApiPagedCollectionTest extends UnitTestCase
+class ApiPagedCollectionTest extends OtUnitTestCase
 {
     /**
      * @test

+ 2 - 2
ot_core/Tests/Unit/Exception/ApiRequestExceptionTest.php

@@ -3,10 +3,10 @@
 namespace Opentalent\OtCore\Tests\Unit\Exception;
 
 use Exception;
-use Nimut\TestingFramework\TestCase\UnitTestCase;
 use Opentalent\OtCore\Exception\ApiRequestException;
+use Opentalent\OtCore\Tests\Unit\OtUnitTestCase;
 
-class ApiRequestExceptionTest extends UnitTestCase
+class ApiRequestExceptionTest extends OtUnitTestCase
 {
     /**
      * Construction from another exception

+ 19 - 0
ot_core/Tests/Unit/OtUnitTestCase.php

@@ -0,0 +1,19 @@
+<?php
+declare(strict_types=1);
+
+namespace Opentalent\OtCore\Tests\Unit;
+
+use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
+
+class OtUnitTestCase extends UnitTestCase
+{
+    protected function getMockForMethods($className, $methods): mixed {
+        $mockBuilder = $this->getMockBuilder($className);
+
+        $classMethods = get_class_methods($className);
+        $methodsToMock = array_diff($classMethods, $methods);
+        $mockBuilder->onlyMethods($methodsToMock);
+
+        return $mockBuilder->getMock();
+    }
+}

+ 2 - 3
ot_core/Tests/Unit/Service/OpentalentApiServiceTest.php

@@ -4,16 +4,15 @@ namespace Opentalent\OtCore\Tests\Unit\Service;
 
 use GuzzleHttp\Client;
 use GuzzleHttp\Exception\TransferException;
-use Nimut\TestingFramework\TestCase\UnitTestCase;
 use Opentalent\OtCore\Exception\ApiRequestException;
 use Opentalent\OtCore\Service\OpentalentApiService;
 use Opentalent\OtCore\Tests\Unit\Fixtures\ApiResponseFixtures;
-use PHPUnit\TextUI\RuntimeException;
 use Prophecy\Argument;
 use Prophecy\PhpUnit\ProphecyTrait;
 use TYPO3\CMS\Core\Core\ApplicationContext;
+use Opentalent\OtCore\Tests\Unit\OtUnitTestCase;
 
-class OpentalentApiServiceTest extends UnitTestCase
+class OpentalentApiServiceTest extends OtUnitTestCase
 {
     use ProphecyTrait;
 

+ 2 - 2
ot_core/Tests/Unit/Service/OpentalentEnvServiceTest.php

@@ -2,10 +2,10 @@
 
 namespace Opentalent\OtCore\Tests\Unit\Service;
 
-use Nimut\TestingFramework\TestCase\UnitTestCase;
 use Opentalent\OtCore\Service\OpentalentEnvService;
+use Opentalent\OtCore\Tests\Unit\OtUnitTestCase;
 
-class OpentalentEnvServiceTest extends UnitTestCase
+class OpentalentEnvServiceTest extends OtUnitTestCase
 {
     /**
      * get should return the requested variable default value,

+ 2 - 2
ot_core/Tests/Unit/Website/OtPageRepositoryTest.php

@@ -4,15 +4,15 @@ namespace Opentalent\OtCore\Tests\Unit\Website;
 
 use FluidTYPO3\Vhs\Service\PageService;
 use Opentalent\OtCore\Website\OtPageRepository;
-use Nimut\TestingFramework\TestCase\UnitTestCase;
 use Opentalent\OtCore\Tests\Unit\Fixtures\PageFixtures;
 use Opentalent\OtCore\Tests\Unit\QueryBuilderProphet;
 use Prophecy\PhpUnit\ProphecyTrait;
 use TYPO3\CMS\Core\Database\ConnectionPool;
 use TYPO3\CMS\Core\Domain\Repository\PageRepository;
+use Opentalent\OtCore\Tests\Unit\OtUnitTestCase;
 
 
-class OtPageRepositoryTest extends UnitTestCase
+class OtPageRepositoryTest extends OtUnitTestCase
 {
     use ProphecyTrait;
 

+ 2 - 3
ot_core/Tests/Unit/Website/OtWebsiteRepositoryTest.php

@@ -4,18 +4,17 @@
 namespace Opentalent\OtCore\Tests\Unit\Website;
 
 
-use Nimut\TestingFramework\TestCase\UnitTestCase;
 use Opentalent\OtCore\Exception\InvalidWebsiteConfigurationException;
 use Opentalent\OtCore\Exception\NoSuchWebsiteException;
 use Opentalent\OtCore\Tests\Unit\Fixtures\PageFixtures;
 use Opentalent\OtCore\Tests\Unit\Fixtures\WebsiteFixtures;
 use Opentalent\OtCore\Tests\Unit\QueryBuilderProphet;
-use Opentalent\OtCore\Website\OtPageRepository;
 use Opentalent\OtCore\Website\OtWebsiteRepository;
 use Prophecy\PhpUnit\ProphecyTrait;
 use TYPO3\CMS\Core\Database\ConnectionPool;
+use Opentalent\OtCore\Tests\Unit\OtUnitTestCase;
 
-class OtWebsiteRepositoryTest extends UnitTestCase
+class OtWebsiteRepositoryTest extends OtUnitTestCase
 {
     use ProphecyTrait;
 

+ 2 - 11
ot_templating/Classes/ViewHelpers/Page/GetFirstWithTemplateViewHelper.php

@@ -2,15 +2,9 @@
 
 namespace Opentalent\OtTemplating\ViewHelpers\Page;
 
-
-use Closure;
 use Opentalent\OtCore\Website\OtPageRepository;
 use Opentalent\OtCore\ViewHelpers\OtAbstractViewHelper;
 use Opentalent\OtCore\Website\OtWebsiteRepository;
-use Opentalent\OtTemplating\ViewHelpers\RootPage\GetIdViewHelper;
-use TYPO3\CMS\Core\Utility\GeneralUtility;
-use TYPO3\CMS\Extbase\Object\ObjectManager;
-use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
 
 /**
  * Returns the uid of the first page with the given template in the current website, or null if none
@@ -25,6 +19,7 @@ class GetFirstWithTemplateViewHelper extends OtAbstractViewHelper
 {
     public function __construct(
         private readonly OtPageRepository $otPageRepository,
+        private readonly OtWebsiteRepository $otWebsiteRepository,
     ) {}
 
     /**
@@ -49,11 +44,7 @@ class GetFirstWithTemplateViewHelper extends OtAbstractViewHelper
      */
     public function render(): ?int
     {
-        $rootId = GetIdViewHelper::renderStatic(
-            $this->arguments,
-            $this->renderChildrenClosure,
-            $this->renderingContext
-        );
+        $rootId = $this->otWebsiteRepository->getCurrentRootpageUidFromFEGlobals();
 
         $subpages = $this->otPageRepository->getAllSubpagesForPage($rootId);
 

+ 1 - 1
ot_templating/Resources/Private/Layouts/Classic/StructureDetails.html

@@ -17,7 +17,7 @@
     <div class="content">
         <div class="ot-structures">
             <iframe
-                    src="{ot:request.getOtEnvVar(argument: 'FRAMES_BASE_URI')}/structures/{settings.organizationId}?theme={ot:template.getPreference(key: 'themeColor')}"
+                    src="{ot:request.getOtEnvVar(argument: 'FRAMES_BASE_URI')}/structures/{settings.organizationId}?theme={ot:template.getPreference(key: 'themeColor')}&hideBackBtn=1"
                     referrerpolicy="strict-origin"
                     style="border: none;"
                     onload="iFrameResize()"

+ 1 - 1
ot_templating/Resources/Private/Layouts/Modern/StructureDetails.html

@@ -17,7 +17,7 @@
 
         <section class="page-section-ptb">
             <div class="ot-structures">
-                <iframe src="{ot:request.getOtEnvVar(argument: 'FRAMES_BASE_URI')}/structures/{settings.organizationId}?theme={ot:template.getPreference(key: 'themeColor')}"
+                <iframe src="{ot:request.getOtEnvVar(argument: 'FRAMES_BASE_URI')}/structures/{settings.organizationId}?theme={ot:template.getPreference(key: 'themeColor')}&hideBackBtn=1"
                         referrerpolicy="strict-origin"
                         style="border: none;"
                         onload="iFrameResize()"

+ 28 - 40
ot_templating/Resources/Private/Partials/Classic/Assets.html

@@ -10,68 +10,56 @@ Assets included with the VHS viewhelpers
 <v:variable.set name="assets_dir" value="EXT:ot_templating/Resources/Public/assets/Classic" />
 
 <f:comment><!-- Style assets --></f:comment>
-<v:asset.style name="classic-fontAwesome"
-               path="{assets_dir}/style/ext/font-awesome/css/all.min.css"/>
+<f:asset.css identifier="classic-fontAwesome"
+               href="{assets_dir}/style/ext/font-awesome/css/all.min.css"/>
 
-<v:asset.style name="classic-jquery-ui-css"
-               path="{assets_dir}/style/ext/jquery-ui.min.css"/>
+<f:asset.css identifier="classic-jquery-ui-css"
+               href="{assets_dir}/style/ext/jquery-ui.min.css"/>
 
-<v:asset.style name="classic-slick-css"
-               path="{assets_dir}/style/ext/slick.css"/>
+<f:asset.css identifier="classic-slick-css"
+               href="{assets_dir}/style/ext/slick.css"/>
 
-<v:asset.style name="classic-slick-theme"
-               path="{assets_dir}/style/ext/slick-theme.css"/>
+<f:asset.css identifier="classic-slick-theme"
+               href="{assets_dir}/style/ext/slick-theme.css"/>
 
 <f:comment><!-- Leaflet's path shall not be rewritten since
                 it won't find the images files anymore --></f:comment>
-<v:asset.style name="classic-leaflet-css"
-               path="{assets_dir}/style/ext/leaflet.css"
-               rewrite="0"
-               standalone="1"/>
+<f:asset.css identifier="classic-leaflet-css"
+               href="{assets_dir}/style/ext/leaflet.css"/>
 
-<v:asset.style name="classic-leaflet-clusters-css"
-               path="{assets_dir}/style/ext/MarkerCluster.css"
-               rewrite="0"
-               standalone="1"/>
+<f:asset.css identifier="classic-leaflet-clusters-css"
+               href="{assets_dir}/style/ext/MarkerCluster.css"/>
 
-<v:asset.style name="classic-leaflet-clusters-default-css"
-               path="{assets_dir}/style/ext/MarkerCluster.Default.css"
-               rewrite="0"
-               standalone="1"/>
+<f:asset.css identifier="classic-leaflet-clusters-default-css"
+               href="{assets_dir}/style/ext/MarkerCluster.Default.css"/>
 
 <f:comment><!-- Theme's file shall not be rewritten since
                 it may not be updated from a website to another --></f:comment>
-<v:asset.style name="classic-theme"
-               path="{assets_dir}/style/classic-{ot:template.getPreference(key: 'themeColor')}.css"
-               dependencies="fontAwesome,slick,slick-theme,leaflet"
-               rewrite="0"
-               standalone="1"/>
+<f:asset.css identifier="classic-theme"
+               href="{assets_dir}/style/classic-{ot:template.getPreference(key: 'themeColor')}.css"/>
 
 
 <f:comment><!-- Script assets --></f:comment>
-<v:asset.script name="classic-jquery"
-                path="{assets_dir}/script/jquery-3.4.1.min.js"
+<f:asset.script identifier="classic-jquery"
+                src="{assets_dir}/script/jquery-3.4.1.min.js"
                 defer="1"/>
 
-<v:asset.script name="classic-datepicker"
-                path="{assets_dir}/script/jquery-ui.min.js"
+<f:asset.script identifier="classic-datepicker"
+                src="{assets_dir}/script/jquery-ui.min.js"
                 defer="1"/>
 
-<v:asset.script name="classic-slick"
-                path="{assets_dir}/script/slick.min.js"
-                dependencies="classic-jquery"
+<f:asset.script identifier="classic-slick"
+                src="{assets_dir}/script/slick.min.js"
                 defer="1"/>
 
-<v:asset.script name="classic-leaflet"
-                path="{assets_dir}/script/leaflet.js"
+<f:asset.script identifier="classic-leaflet"
+                src="{assets_dir}/script/leaflet.js"
                 defer="1"/>
 
-<v:asset.script name="classic-leaflet-clusters"
-                path="{assets_dir}/script/leaflet.markercluster.js"
+<f:asset.script identifier="classic-leaflet-clusters"
+                src="{assets_dir}/script/leaflet.markercluster.js"
                 defer="1"/>
 
-<v:asset.script name="classic-main"
-                path="{assets_dir}/script/main.js"
-                dependencies="classic-jquery,classic-datepicker,classic-slick,classic-leaflet"
-                standalone="1"
+<f:asset.script identifier="classic-main"
+                src="{assets_dir}/script/main.js"
                 defer="1"/>

+ 1 - 1
ot_templating/Resources/Private/Partials/Classic/Topbar.html

@@ -6,7 +6,7 @@
     <div class="topbar-logo">
         <f:if condition="{settings.structureLogoId}">
             <a href="{ot:rootPage.getUri()}" title="{settings.structureName}">
-                <img src="{ot:image.getSrcById(fileId: settings.structureLogoId, size: 'sm')}" alt="{settings.structureName}"/>
+                <img src="{ot:image.getSrcById(fileId: settings.structureLogoId, size: 'md')}" alt="{settings.structureName}"/>
             </a>
         </f:if>
     </div>

+ 99 - 158
ot_templating/Resources/Private/Partials/Modern/Assets.html

@@ -8,19 +8,16 @@ Assets included with the VHS viewhelpers
 --></f:comment>
 
 <v:variable.set name="assets_dir" value="EXT:ot_templating/Resources/Public/assets/Modern" />
-<v:variable.set name="force_standalone" value="0" />
 
 <f:comment><!-- Fonts assets --></f:comment>
 
-<v:asset.style name="modern-montserrat-font"
-               path="https://fonts.googleapis.com/css?family=Montserrat:300,300i,400,500,500i,600,700,800,900|Poppins:200,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900"
-               external="1"
-               standalone="1"/>
+<f:asset.css identifier="modern-montserrat-font"
+             href="https://fonts.googleapis.com/css?family=Montserrat:300,300i,400,500,500i,600,700,800,900|Poppins:200,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900"
+/>
 
-<v:asset.style name="modern-dosis-font"
-               path="https://fonts.googleapis.com/css?family=Dosis:300,400,500,600,700,800"
-               external="1"
-               standalone="1"/>
+<f:asset.css identifier="modern-dosis-font"
+             href="https://fonts.googleapis.com/css?family=Dosis:300,400,500,600,700,800"
+/>
 
 <style>
     @font-face {
@@ -44,90 +41,76 @@ Assets included with the VHS viewhelpers
 <f:comment><!-- Style assets --></f:comment>
 
 <f:comment><!-- includes all plugins ; can be removed if none of those plugins are used --></f:comment>
-<v:asset.style name="modern-plugins-css"
-               path="{assets_dir}/style/plugins-css.css"
-               standalone="{force_standalone}"/>
+<f:asset.css identifier="modern-plugins-css"
+               href="{assets_dir}/style/plugins-css.css"/>
 
 <f:comment><!-- includes revolution stylesheets --></f:comment>
-<v:asset.style name="modern-revolution-settings"
-               path="{assets_dir}/style/revolution/settings.css"
-               standalone="{force_standalone}"/>
+<f:asset.css identifier="modern-revolution-settings"
+               href="{assets_dir}/style/revolution/settings.css"/>
 
 <f:comment><!-- includes all typography stylesheets --></f:comment>
-<v:asset.style name="modern-typography"
-               path="{assets_dir}/style/typography.css"
-               standalone="{force_standalone}"/>
+<f:asset.css identifier="modern-typography"
+               href="{assets_dir}/style/typography.css"/>
 
-<v:asset.style name="modern-datetimepicker-css"
-               path="{assets_dir}/style/plugins/bootstrap-datetimepicker.min.css"
-               standalone="{force_standalone}"/>
+<f:asset.css identifier="modern-datetimepicker-css"
+               href="{assets_dir}/style/plugins/bootstrap-datetimepicker.min.css"/>
 
-<v:asset.style name="modern-slick-css"
-               path="{assets_dir}/style/plugins/slick.css"
-               standalone="{force_standalone}"/>
+<f:asset.css identifier="modern-slick-css"
+               href="{assets_dir}/style/plugins/slick.css"/>
 
-<v:asset.style name="modern-slick-theme-css"
-               path="{assets_dir}/style/plugins/slick-theme.css"
-               standalone="{force_standalone}"/>
+<f:asset.css identifier="modern-slick-theme-css"
+               href="{assets_dir}/style/plugins/slick-theme.css"/>
 
 <f:comment><!-- Leaflet's path shall not be rewritten since
                 it won't find the images files anymore --></f:comment>
-<v:asset.style name="modern-leaflet-css"
-               path="{assets_dir}/style/plugins/leaflet.css"
-               standalone="1"
-               rewrite="0"/>
+<f:asset.css identifier="modern-leaflet-css"
+               href="{assets_dir}/style/plugins/leaflet.css"/>
 
 <f:comment><!-- includes all shortcodes ; some of them may have to be removed --></f:comment>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/accordion.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/action-box.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/blockquote.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/bootstrap-typography.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/button.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/clients.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/contact-form.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/countdown.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/counter.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/divider.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/dropcap.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/feature-text.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/list-style.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/nice-select.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/owl-carousel.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/page-title.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/pie-chart.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/pricing.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/progress-bar.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/section-title.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/shortcodes.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/social-icons.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/tabs.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/team.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/testimonial.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/side-panel.css"/>
-<v:asset.style group="modern-shortcodes" path="{assets_dir}/style/shortcodes/onload-modal.css"/>
+<f:asset.css identifier="modern-shortcodes1" href="{assets_dir}/style/shortcodes/accordion.css"/>
+<f:asset.css identifier="modern-shortcodes2" href="{assets_dir}/style/shortcodes/action-box.css"/>
+<f:asset.css identifier="modern-shortcodes3" href="{assets_dir}/style/shortcodes/blockquote.css"/>
+<f:asset.css identifier="modern-shortcodes4" href="{assets_dir}/style/shortcodes/bootstrap-typography.css"/>
+<f:asset.css identifier="modern-shortcodes5" href="{assets_dir}/style/shortcodes/button.css"/>
+<f:asset.css identifier="modern-shortcodes6" href="{assets_dir}/style/shortcodes/clients.css"/>
+<f:asset.css identifier="modern-shortcodes7" href="{assets_dir}/style/shortcodes/contact-form.css"/>
+<f:asset.css identifier="modern-shortcodes8" href="{assets_dir}/style/shortcodes/countdown.css"/>
+<f:asset.css identifier="modern-shortcodes9" href="{assets_dir}/style/shortcodes/counter.css"/>
+<f:asset.css identifier="modern-shortcodes10" href="{assets_dir}/style/shortcodes/divider.css"/>
+<f:asset.css identifier="modern-shortcodes11" href="{assets_dir}/style/shortcodes/dropcap.css"/>
+<f:asset.css identifier="modern-shortcodes12" href="{assets_dir}/style/shortcodes/feature-text.css"/>
+<f:asset.css identifier="modern-shortcodes13" href="{assets_dir}/style/shortcodes/list-style.css"/>
+<f:asset.css identifier="modern-shortcodes14" href="{assets_dir}/style/shortcodes/nice-select.css"/>
+<f:asset.css identifier="modern-shortcodes15" href="{assets_dir}/style/shortcodes/owl-carousel.css"/>
+<f:asset.css identifier="modern-shortcodes16" href="{assets_dir}/style/shortcodes/page-title.css"/>
+<f:asset.css identifier="modern-shortcodes17" href="{assets_dir}/style/shortcodes/pie-chart.css"/>
+<f:asset.css identifier="modern-shortcodes18" href="{assets_dir}/style/shortcodes/pricing.css"/>
+<f:asset.css identifier="modern-shortcodes19" href="{assets_dir}/style/shortcodes/progress-bar.css"/>
+<f:asset.css identifier="modern-shortcodes20" href="{assets_dir}/style/shortcodes/section-title.css"/>
+<f:asset.css identifier="modern-shortcodes21" href="{assets_dir}/style/shortcodes/shortcodes.css"/>
+<f:asset.css identifier="modern-shortcodes22" href="{assets_dir}/style/shortcodes/social-icons.css"/>
+<f:asset.css identifier="modern-shortcodes23" href="{assets_dir}/style/shortcodes/tabs.css"/>
+<f:asset.css identifier="modern-shortcodes24" href="{assets_dir}/style/shortcodes/team.css"/>
+<f:asset.css identifier="modern-shortcodes25" href="{assets_dir}/style/shortcodes/testimonial.css"/>
+<f:asset.css identifier="modern-shortcodes26" href="{assets_dir}/style/shortcodes/side-panel.css"/>
+<f:asset.css identifier="modern-shortcodes27" href="{assets_dir}/style/shortcodes/onload-modal.css"/>
 
 
 <f:comment><!-- main stylesheet of the template --></f:comment>
-<v:asset.style name="modern-style-css"
-               path="{assets_dir}/style/style.css"
-               standalone="1"
-               rewrite="0"/>
+<f:asset.css identifier="modern-style-css"
+               href="{assets_dir}/style/style.css"/>
 
 <f:comment><!-- responsive stylesheet of the template (mediaqueries) --></f:comment>
-<v:asset.style name="modern-responsive-css"
-               path="{assets_dir}/style/responsive.css"
-               standalone="{force_standalone}"/>
+<f:asset.css identifier="modern-responsive-css"
+               href="{assets_dir}/style/responsive.css"/>
 
-<v:asset.style name="modern-custom-css"
-               path="{assets_dir}/style/custom.css"
-               standalone="1"/>
+<f:asset.css identifier="modern-custom-css"
+               href="{assets_dir}/style/custom.css"/>
 
 
 <f:comment><!-- Chosen theme --></f:comment>
-<v:asset.style name="modern-theme"
-               path="{assets_dir}/style/skins/modern-{ot:template.getPreference(key: 'themeColor')}.css"
-               standalone="1"
-               rewrite="0"/>
+<f:asset.css identifier="modern-theme"
+               href="{assets_dir}/style/skins/modern-{ot:template.getPreference(key: 'themeColor')}.css"/>
 
 <f:comment><!-- Script assets --></f:comment>
 
@@ -136,135 +119,93 @@ Assets included with the VHS viewhelpers
     var plugin_path = '/typo3conf/ext/ot_templating/Resources/Public/assets/Modern/script/';
 </script>
 
-<v:asset.script name="modern-jquery"
-                path="{assets_dir}/script/jquery-3.3.1.min.js"
-                standalone="{force_standalone}"
+<f:asset.script identifier="modern-jquery"
+                src="{assets_dir}/script/jquery-3.3.1.min.js"
                 defer="1"/>
 
 <f:comment><!-- includes all plugins ; can be removed if none of those plugins are used --></f:comment>
-<v:asset.script name="modern-plugins-jquery"
-                path="{assets_dir}/script/plugins-jquery.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-plugins-jquery"
+                src="{assets_dir}/script/plugins-jquery.js"
                 defer="1" />
 
-<v:asset.script name="modern-recaptcha"
-                path="https://www.google.com/recaptcha/api.js"
-                external="1"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-recaptcha"
+                src="https://www.google.com/recaptcha/api.js"
                 defer="1"/>
 
-<v:asset.script name="modern-jquery-tools"
-                path="{assets_dir}/script/revolution/jquery.themepunch.tools.min.js"
-                standalone="{force_standalone}"
+<f:asset.script identifier="modern-jquery-tools"
+                src="{assets_dir}/script/revolution/jquery.themepunch.tools.min.js"
                 defer="1"/>
 
-<v:asset.script name="modern-jquery-revolution"
-                path="{assets_dir}/script/revolution/jquery.themepunch.revolution.min.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-jquery-revolution"
+                src="{assets_dir}/script/revolution/jquery.themepunch.revolution.min.js"
                 defer="1"/>
 
-<v:asset.script name="modern-revolution-actions"
-                path="{assets_dir}/script/revolution/extensions/revolution.extension.actions.min.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-revolution-actions"
+                src="{assets_dir}/script/revolution/extensions/revolution.extension.actions.min.js"
                 defer="1"/>
 
-<v:asset.script name="modern-revolution-carousel"
-                path="{assets_dir}/script/revolution/extensions/revolution.extension.carousel.min.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-revolution-carousel"
+                src="{assets_dir}/script/revolution/extensions/revolution.extension.carousel.min.js"
                 defer="1"/>
 
-<v:asset.script name="modern-revolution-kenburn"
-                path="{assets_dir}/script/revolution/extensions/revolution.extension.kenburn.min.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-revolution-kenburn"
+                src="{assets_dir}/script/revolution/extensions/revolution.extension.kenburn.min.js"
                 defer="1"/>
 
-<v:asset.script name="modern-revolution-layeranimation"
-                path="{assets_dir}/script/revolution/extensions/revolution.extension.layeranimation.min.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-revolution-layeranimation"
+                src="{assets_dir}/script/revolution/extensions/revolution.extension.layeranimation.min.js"
                 defer="1"/>
 
-<v:asset.script name="modern-revolution-parallax"
-                path="{assets_dir}/script/revolution/extensions/revolution.extension.parallax.min.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-revolution-parallax"
+                src="{assets_dir}/script/revolution/extensions/revolution.extension.parallax.min.js"
                 defer="1"/>
 
-<v:asset.script name="modern-revolution-navigation"
-                path="{assets_dir}/script/revolution/extensions/revolution.extension.navigation.min.js"
-                standalone="{force_standalone}"
+<f:asset.script identifier="modern-revolution-navigation"
+                src="{assets_dir}/script/revolution/extensions/revolution.extension.navigation.min.js"
                 defer="1"/>
 
-<v:asset.script name="modern-revolution-slideanims"
-                path="{assets_dir}/script/revolution/extensions/revolution.extension.slideanims.min.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-revolution-slideanims"
+                src="{assets_dir}/script/revolution/extensions/revolution.extension.slideanims.min.js"
                 defer="1"/>
 
-<v:asset.script name="modern-revolution-navigation"
-                path="{assets_dir}/script/revolution/extensions/revolution.extension.navigation.min.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-revolution-navigation"
+                src="{assets_dir}/script/revolution/extensions/revolution.extension.navigation.min.js"
                 defer="1"/>
 
-<v:asset.script name="modern-revolution-video"
-                path="{assets_dir}/script/revolution/extensions/revolution.extension.video.min.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-revolution-video"
+                src="{assets_dir}/script/revolution/extensions/revolution.extension.video.min.js"
                 defer="1"/>
 
-<v:asset.script name="modern-revolution-custom"
-                path="{assets_dir}/script/revolution/revolution-custom.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-revolution-custom"
+                src="{assets_dir}/script/revolution/revolution-custom.js"
                 defer="1"/>
 
-<v:asset.script name="modern-moment-js"
-                path="{assets_dir}/script/bootstrap-datetimepicker/moment-datepicker.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-moment-js"
+                src="{assets_dir}/script/bootstrap-datetimepicker/moment-datepicker.js"
                 defer="1"/>
 
-<v:asset.script name="modern-datetimepicker-js"
-                path="{assets_dir}/script/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery,modern-moment-js"
+<f:asset.script identifier="modern-datetimepicker-js"
+                src="{assets_dir}/script/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js"
                 defer="1"/>
 
-<v:asset.script name="modern-slick-js"
-                path="{assets_dir}/script/slick/slick.min.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-slick-js"
+                src="{assets_dir}/script/slick/slick.min.js"
                 defer="1"/>
 
-<v:asset.script name="modern-leaflet-js"
-                path="{assets_dir}/script/leaflet/leaflet.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-leaflet-js"
+                src="{assets_dir}/script/leaflet/leaflet.js"
                 defer="1"/>
 
-<v:asset.script name="modern-magnific-popup"
-                path="{assets_dir}/script/magnific-popup/jquery.magnific-popup.min.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-magnific-popup"
+                src="{assets_dir}/script/magnific-popup/jquery.magnific-popup.min.js"
                 defer="1"/>
 
-<v:asset.script name="modern-custom-js"
-                path="{assets_dir}/script/custom.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-custom-js"
+                src="{assets_dir}/script/custom.js"
                 defer="1"/>
 
-<v:asset.script name="modern-custom-ot-js"
-                path="{assets_dir}/script/custom-ot.js"
-                standalone="{force_standalone}"
-                dependencies="modern-jquery"
+<f:asset.script identifier="modern-custom-ot-js"
+                src="{assets_dir}/script/custom-ot.js"
                 defer="1"/>
 
 

+ 1 - 1
ot_templating/Resources/Private/Partials/Modern/Menu.html

@@ -25,7 +25,7 @@
                                     <f:then>
                                         <a href="{ot:rootPage.getUri()}" title="{settings.structureName}">
                                             <img id="logo_img"
-                                                 src="{ot:image.getSrcById(fileId: settings.structureLogoId, size: 'sm')}"
+                                                 src="{ot:image.getSrcById(fileId: settings.structureLogoId, size: 'md')}"
                                                  alt="{settings.structureName}"/>
                                         </a>
                                     </f:then>

+ 1 - 0
ot_templating/Resources/Public/assets/Classic/style/module/_members.scss

@@ -32,6 +32,7 @@ $otmembers-background-color: $otmembers-background-color;
 
   .ot-member-image {
     height: 150px;
+    width: 120px;
     @include flex;
     flex-direction: column;
     justify-content: center;

Some files were not shown because too many files changed in this diff