diff --git a/composer.json b/composer.json index 9bf6dd95cb..2940bf117d 100644 --- a/composer.json +++ b/composer.json @@ -40,10 +40,10 @@ "type": "package", "package": { "name": "danskernesdigitalebibliotek/dpl-react", - "version": "2024.49.0", + "version": "2024.50.0", "type": "drupal-library", "dist": { - "url": "https://github.com/danskernesdigitalebibliotek/dpl-react/releases/download/2024.49.0/dist-2024-49-0-ccdcf6397ae7b1acd328c0cdd5688c2d7bbf1bd4.zip", + "url": "https://github.com/danskernesdigitalebibliotek/dpl-react/releases/download/2024.50.0/dist-2024-50-0-971e7c3cbc30ed2ea65d95655b798d67a6aa9d75.zip", "type": "zip" }, "require": { @@ -56,9 +56,9 @@ "package": { "name": "danskernesdigitalebibliotek/dpl-design-system", "type": "drupal-library", - "version": "2024.49.0", + "version": "2024.50.0", "dist": { - "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/2024.49.0/dist-2024-49-0-6c2891c7ad8ebebab5a41646dc217693f0b49284.zip", + "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/2024.50.0/dist-2024-50-0-fbcaaf96dce9df6ceb2537705578a0f3e882fe08.zip", "type": "zip" } } @@ -90,8 +90,8 @@ "composer/installers": "1.12.0", "cweagans/composer-patches": "1.7.3", "danskernesdigitalebibliotek/cms-api": "*", - "danskernesdigitalebibliotek/dpl-design-system": "2024.49.0", - "danskernesdigitalebibliotek/dpl-react": "2024.49.0", + "danskernesdigitalebibliotek/dpl-design-system": "2024.50.0", + "danskernesdigitalebibliotek/dpl-react": "2024.50.0", "danskernesdigitalebibliotek/fbs-client": "*", "dealerdirect/phpcodesniffer-composer-installer": "^1.0.0", "deoliveiralucas/array-keys-case-transform": "^1.1", @@ -102,6 +102,7 @@ "drupal/antibot": "^2.0", "drupal/azure_mailer": "^2.0", "drupal/color_field": "^3.0", + "drupal/config_filter": "^2.6", "drupal/config_ignore": "^3", "drupal/config_ignore_auto": "^3", "drupal/config_perms": "^2.1", @@ -302,7 +303,8 @@ "3035578: Add details for AJAX response errors": "https://www.drupal.org/files/issues/2023-07-24/3035578-26.patch", "3293926: Error decorating non-existent service when inner service's module not installed": "https://git.drupalcode.org/project/drupal/-/commit/a64662a3cea209c106b888ce9ef03cc1808f9ffe.patch", "Always assume chmod succeeds": "patches/core-chmod-true.patch", - "Debug Form triggering element detection": "patches/form-triggering-element-detection-paragraphs-ee.patch" + "Debug Form triggering element detection": "patches/form-triggering-element-detection-paragraphs-ee.patch", + "Don't check for file owner in update": "patches/dont-check-fileowner.patch" }, "drupal/date_range_formatter": { "3309324: Fails when start and end date are identical": "https://www.drupal.org/files/issues/2023-12-22/date_range_formatter_3309324_1.patch" @@ -325,11 +327,6 @@ "drupal/field_inheritance": { "3454350: Create seperate permission for adding field inheritance": "https://www.drupal.org/files/issues/2024-06-13/field_inheritance_permission.patch" }, - "drupal/focal_point": { - "3462165 (1/3): Preview results in Error: Call to a member function getDefinitions() on null": "https://git.drupalcode.org/project/focal_point/-/commit/e9803fdb1f74fecf4972120518f87a4e260ccf9e.patch", - "3462165 (2/3): Preview results in Error: Call to a member function getDefinitions() on null": "https://git.drupalcode.org/project/focal_point/-/commit/7d1c3bba96560d96a6ec5a9834d091eebcb7b9b5.patch", - "3462165 (3/3): Preview results in Error: Call to a member function getDefinitions() on null": "https://git.drupalcode.org/project/focal_point/-/commit/72d7a23c5251c2313557fe1f6d01263ddc729963.patch" - }, "drupal/job_scheduler": { "3426366: Callables as worker callbacks": "https://git.drupalcode.org/project/job_scheduler/-/commit/da200da280c4c95e6e91f2416581ad3797ab1428.patch" }, diff --git a/composer.lock b/composer.lock index 834f682e85..55cc55e3b9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d89be314a09f03f216ca135be18c887d", + "content-hash": "f58b7ee6ff24d0da102116095910a003", "packages": [ { "name": "amazeeio/drupal_integrations", @@ -1166,19 +1166,19 @@ }, { "name": "danskernesdigitalebibliotek/dpl-design-system", - "version": "2024.49.0", + "version": "2024.50.0", "dist": { "type": "zip", - "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/2024.49.0/dist-2024-49-0-6c2891c7ad8ebebab5a41646dc217693f0b49284.zip" + "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/2024.50.0/dist-2024-50-0-fbcaaf96dce9df6ceb2537705578a0f3e882fe08.zip" }, "type": "drupal-library" }, { "name": "danskernesdigitalebibliotek/dpl-react", - "version": "2024.49.0", + "version": "2024.50.0", "dist": { "type": "zip", - "url": "https://github.com/danskernesdigitalebibliotek/dpl-react/releases/download/2024.49.0/dist-2024-49-0-ccdcf6397ae7b1acd328c0cdd5688c2d7bbf1bd4.zip" + "url": "https://github.com/danskernesdigitalebibliotek/dpl-react/releases/download/2024.50.0/dist-2024-50-0-971e7c3cbc30ed2ea65d95655b798d67a6aa9d75.zip" }, "require": { "composer/installers": "^1.2.0" @@ -1819,29 +1819,27 @@ }, { "name": "doctrine/deprecations", - "version": "1.1.3", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "1.4.10 || 2.0.3", + "phpstan/phpstan-phpunit": "^1.0 || ^2", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" + "psr/log": "^1 || ^2 || ^3" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -1849,7 +1847,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + "Doctrine\\Deprecations\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1860,9 +1858,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + "source": "https://github.com/doctrine/deprecations/tree/1.1.4" }, - "time": "2024-01-30T19:34:25+00:00" + "time": "2024-12-07T21:18:45+00:00" }, { "name": "doctrine/event-manager", @@ -2802,6 +2800,75 @@ "issues": "https://www.drupal.org/project/issues/color_field?version=8.x" } }, + { + "name": "drupal/config_filter", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/config_filter.git", + "reference": "8.x-2.6" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/config_filter-8.x-2.6.zip", + "reference": "8.x-2.6", + "shasum": "fd1a057a402436fc906c63bf0a74722f73b9b155" + }, + "require": { + "drupal/core": "^8.8 || ^9 || ^10" + }, + "conflict": { + "drush/drush": "<10" + }, + "suggest": { + "drupal/config_split": "Split site configuration for different environments." + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-2.6", + "datestamp": "1698308577", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Fabian Bircher", + "homepage": "https://www.drupal.org/u/bircher", + "email": "opensource@fabianbircher.com", + "role": "Maintainer" + }, + { + "name": "Nuvole Web", + "homepage": "http://nuvole.org", + "email": "info@nuvole.org", + "role": "Maintainer" + }, + { + "name": "pescetti", + "homepage": "https://www.drupal.org/user/436244" + } + ], + "description": "Config Filter allows other modules to interact with a ConfigStorage through filter plugins.", + "homepage": "https://www.drupal.org/project/config_filter", + "keywords": [ + "Drupal", + "configuration", + "configuration management" + ], + "support": { + "source": "https://git.drupalcode.org/project/config_filter", + "issues": "https://www.drupal.org/project/issues/config_filter", + "slack": "https://drupal.slack.com/archives/C45342CDD" + } + }, { "name": "drupal/config_ignore", "version": "3.3.0", @@ -2996,26 +3063,26 @@ }, { "name": "drupal/config_translation_po", - "version": "1.0.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://git.drupalcode.org/project/config_translation_po.git", - "reference": "1.0.0" + "reference": "1.0.1" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/config_translation_po-1.0.0.zip", - "reference": "1.0.0", - "shasum": "268b55019f7106d50e9a3b0ed5f0f845360aed4b" + "url": "https://ftp.drupal.org/files/projects/config_translation_po-1.0.1.zip", + "reference": "1.0.1", + "shasum": "452452f9cabef5efc6229db49cd88ada89babb5f" }, "require": { - "drupal/core": "^9.3 || ^10" + "drupal/core": "^9.3 || ^10 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "1.0.0", - "datestamp": "1687993665", + "version": "1.0.1", + "datestamp": "1732743222", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -3046,8 +3113,11 @@ ], "description": "Configuration Translations to po file", "homepage": "https://www.drupal.org/project/config_translation_po", + "keywords": [ + "Drupal" + ], "support": { - "source": "http://cgit.drupalcode.org/config_translation_po", + "source": "https://git.drupalcode.org/project/config_translation_po", "issues": "https://www.drupal.org/project/issues/config_translation_po" } }, @@ -3318,29 +3388,29 @@ "extra": { "drupal-scaffold": { "file-mapping": { - "[project-root]/.editorconfig": "assets/scaffold/files/editorconfig", - "[project-root]/.gitattributes": "assets/scaffold/files/gitattributes", - "[web-root]/.csslintrc": "assets/scaffold/files/csslintrc", - "[web-root]/.eslintignore": "assets/scaffold/files/eslintignore", - "[web-root]/.eslintrc.json": "assets/scaffold/files/eslintrc.json", - "[web-root]/.ht.router.php": "assets/scaffold/files/ht.router.php", "[web-root]/.htaccess": "assets/scaffold/files/htaccess", - "[web-root]/example.gitignore": "assets/scaffold/files/example.gitignore", - "[web-root]/index.php": "assets/scaffold/files/index.php", - "[web-root]/INSTALL.txt": "assets/scaffold/files/drupal.INSTALL.txt", "[web-root]/README.md": "assets/scaffold/files/drupal.README.md", + "[web-root]/index.php": "assets/scaffold/files/index.php", + "[web-root]/.csslintrc": "assets/scaffold/files/csslintrc", "[web-root]/robots.txt": "assets/scaffold/files/robots.txt", "[web-root]/update.php": "assets/scaffold/files/update.php", "[web-root]/web.config": "assets/scaffold/files/web.config", + "[web-root]/INSTALL.txt": "assets/scaffold/files/drupal.INSTALL.txt", + "[web-root]/.eslintignore": "assets/scaffold/files/eslintignore", + "[web-root]/.eslintrc.json": "assets/scaffold/files/eslintrc.json", + "[web-root]/.ht.router.php": "assets/scaffold/files/ht.router.php", "[web-root]/sites/README.txt": "assets/scaffold/files/sites.README.txt", + "[project-root]/.editorconfig": "assets/scaffold/files/editorconfig", + "[web-root]/example.gitignore": "assets/scaffold/files/example.gitignore", + "[web-root]/themes/README.txt": "assets/scaffold/files/themes.README.txt", + "[project-root]/.gitattributes": "assets/scaffold/files/gitattributes", + "[web-root]/modules/README.txt": "assets/scaffold/files/modules.README.txt", + "[web-root]/profiles/README.txt": "assets/scaffold/files/profiles.README.txt", + "[web-root]/sites/example.sites.php": "assets/scaffold/files/example.sites.php", "[web-root]/sites/development.services.yml": "assets/scaffold/files/development.services.yml", "[web-root]/sites/example.settings.local.php": "assets/scaffold/files/example.settings.local.php", - "[web-root]/sites/example.sites.php": "assets/scaffold/files/example.sites.php", "[web-root]/sites/default/default.services.yml": "assets/scaffold/files/default.services.yml", - "[web-root]/sites/default/default.settings.php": "assets/scaffold/files/default.settings.php", - "[web-root]/modules/README.txt": "assets/scaffold/files/modules.README.txt", - "[web-root]/profiles/README.txt": "assets/scaffold/files/profiles.README.txt", - "[web-root]/themes/README.txt": "assets/scaffold/files/themes.README.txt" + "[web-root]/sites/default/default.settings.php": "assets/scaffold/files/default.settings.php" } } }, @@ -4478,17 +4548,17 @@ }, { "name": "drupal/focal_point", - "version": "2.1.1", + "version": "2.1.2", "source": { "type": "git", "url": "https://git.drupalcode.org/project/focal_point.git", - "reference": "2.1.1" + "reference": "2.1.2" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/focal_point-2.1.1.zip", - "reference": "2.1.1", - "shasum": "f8c24bb4257f784176e79ec6f2b4c11ed46391e0" + "url": "https://ftp.drupal.org/files/projects/focal_point-2.1.2.zip", + "reference": "2.1.2", + "shasum": "5f8ffadd37748506c8f00314b1d45c947eb27cf7" }, "require": { "drupal/core": "^9.3 || ^10 || ^11", @@ -4500,8 +4570,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "2.1.1", - "datestamp": "1721126807", + "version": "2.1.2", + "datestamp": "1731556344", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -5492,26 +5562,26 @@ }, { "name": "drupal/language_neutral_aliases", - "version": "3.1.1", + "version": "3.2.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/language_neutral_aliases.git", - "reference": "3.1.1" + "reference": "3.2.0" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/language_neutral_aliases-3.1.1.zip", - "reference": "3.1.1", - "shasum": "41af20fd8b468d43fcfcebf6e7087f213ba09141" + "url": "https://ftp.drupal.org/files/projects/language_neutral_aliases-3.2.0.zip", + "reference": "3.2.0", + "shasum": "ab0eab68a6efd5329700fd6735eca39db2f707ee" }, "require": { - "drupal/core": "^8.8 || ^9 || ^10" + "drupal/core": "^8.8 || ^9 || ^10 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "3.1.1", - "datestamp": "1700598474", + "version": "3.2.0", + "datestamp": "1729507726", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -5524,7 +5594,7 @@ ], "authors": [ { - "name": "Xen", + "name": "xen", "homepage": "https://www.drupal.org/user/91385" } ], @@ -7927,17 +7997,17 @@ }, { "name": "drupal/upgrade_status", - "version": "4.3.5", + "version": "4.3.6", "source": { "type": "git", "url": "https://git.drupalcode.org/project/upgrade_status.git", - "reference": "4.3.5" + "reference": "4.3.6" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/upgrade_status-4.3.5.zip", - "reference": "4.3.5", - "shasum": "353c17f14c855f5ba0fe48c6a4f6486360c066a7" + "url": "https://ftp.drupal.org/files/projects/upgrade_status-4.3.6.zip", + "reference": "4.3.6", + "shasum": "8169732d814034f541238d67ba31300825a61aca" }, "require": { "dekor/php-array-table": "^2.0", @@ -7954,8 +8024,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "4.3.5", - "datestamp": "1723044184", + "version": "4.3.6", + "datestamp": "1729173427", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -7973,7 +8043,7 @@ ], "authors": [ { - "name": "Gábor Hojtsy", + "name": "gábor hojtsy", "homepage": "https://www.drupal.org/user/4166" } ], @@ -7985,26 +8055,26 @@ }, { "name": "drupal/uuid_url", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/uuid_url.git", - "reference": "8.x-1.3" + "reference": "8.x-1.4" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/uuid_url-8.x-1.3.zip", - "reference": "8.x-1.3", - "shasum": "38623a180989c1e72bfdcdc4274a64c08b05f170" + "url": "https://ftp.drupal.org/files/projects/uuid_url-8.x-1.4.zip", + "reference": "8.x-1.4", + "shasum": "4463bdde93cb84d6fe9ed8fb357353d82678c61f" }, "require": { - "drupal/core": "^8 || ^9 || ^10" + "drupal/core": "^8 || ^9 || ^10 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-1.3", - "datestamp": "1670421397", + "version": "8.x-1.4", + "datestamp": "1727792977", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -10120,16 +10190,16 @@ }, { "name": "mglaman/phpstan-drupal", - "version": "1.2.12", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/mglaman/phpstan-drupal.git", - "reference": "346bdddda169a56b6ebb7dc17893f0ac8f33a4f1" + "reference": "2bc25a59b53c8f3990f168efd71241d9c25ea0c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/346bdddda169a56b6ebb7dc17893f0ac8f33a4f1", - "reference": "346bdddda169a56b6ebb7dc17893f0ac8f33a4f1", + "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/2bc25a59b53c8f3990f168efd71241d9c25ea0c3", + "reference": "2bc25a59b53c8f3990f168efd71241d9c25ea0c3", "shasum": "" }, "require": { @@ -10138,7 +10208,7 @@ "phpstan/phpstan-deprecation-rules": "^1.1.4", "symfony/finder": "^4.2 || ^5.0 || ^6.0 || ^7.0", "symfony/yaml": "^4.2|| ^5.0 || ^6.0 || ^7.0", - "webflo/drupal-finder": "^1.2" + "webflo/drupal-finder": "^1.3.1" }, "require-dev": { "behat/mink": "^1.8", @@ -10204,7 +10274,7 @@ "description": "Drupal extension and rules for PHPStan", "support": { "issues": "https://github.com/mglaman/phpstan-drupal/issues", - "source": "https://github.com/mglaman/phpstan-drupal/tree/1.2.12" + "source": "https://github.com/mglaman/phpstan-drupal/tree/1.3.1" }, "funding": [ { @@ -10220,7 +10290,7 @@ "type": "tidelift" } ], - "time": "2024-08-07T21:15:21+00:00" + "time": "2024-09-27T08:54:16+00:00" }, { "name": "mnsami/composer-custom-directory-installer", @@ -10948,16 +11018,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.0", + "version": "5.6.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c" + "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/f3558a4c23426d12bffeaab463f8a8d8b681193c", - "reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", + "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", "shasum": "" }, "require": { @@ -11006,9 +11076,9 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.0" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.1" }, - "time": "2024-11-12T11:25:25+00:00" + "time": "2024-12-07T09:39:29+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -11911,16 +11981,16 @@ }, { "name": "spatie/color", - "version": "1.6.1", + "version": "1.6.2", "source": { "type": "git", "url": "https://github.com/spatie/color.git", - "reference": "4c540ffbef68a3df3d209718ae06deaab081e708" + "reference": "b4fac074a9e5999dcca12cbfab0f7c73e2684d6d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/color/zipball/4c540ffbef68a3df3d209718ae06deaab081e708", - "reference": "4c540ffbef68a3df3d209718ae06deaab081e708", + "url": "https://api.github.com/repos/spatie/color/zipball/b4fac074a9e5999dcca12cbfab0f7c73e2684d6d", + "reference": "b4fac074a9e5999dcca12cbfab0f7c73e2684d6d", "shasum": "" }, "require": { @@ -11958,7 +12028,7 @@ ], "support": { "issues": "https://github.com/spatie/color/issues", - "source": "https://github.com/spatie/color/tree/1.6.1" + "source": "https://github.com/spatie/color/tree/1.6.2" }, "funding": [ { @@ -11966,7 +12036,7 @@ "type": "github" } ], - "time": "2024-11-18T15:00:47+00:00" + "time": "2024-12-09T16:20:38+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -12252,16 +12322,16 @@ }, { "name": "symfony/cache-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197" + "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197", - "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b", + "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b", "shasum": "" }, "require": { @@ -12308,7 +12378,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.1" }, "funding": [ { @@ -12324,7 +12394,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/config", @@ -12497,16 +12567,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v6.4.15", + "version": "v6.4.16", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "70ab1f65a4516ef741e519ea938e6aa465e6aa36" + "reference": "7a379d8871f6a36f01559c14e11141cc02eb8dc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/70ab1f65a4516ef741e519ea938e6aa465e6aa36", - "reference": "70ab1f65a4516ef741e519ea938e6aa465e6aa36", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/7a379d8871f6a36f01559c14e11141cc02eb8dc8", + "reference": "7a379d8871f6a36f01559c14e11141cc02eb8dc8", "shasum": "" }, "require": { @@ -12558,7 +12628,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.15" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.16" }, "funding": [ { @@ -12574,20 +12644,20 @@ "type": "tidelift" } ], - "time": "2024-11-09T06:56:25+00:00" + "time": "2024-11-25T14:52:46+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "shasum": "" }, "require": { @@ -12625,7 +12695,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" }, "funding": [ { @@ -12641,7 +12711,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/error-handler", @@ -12800,16 +12870,16 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", "shasum": "" }, "require": { @@ -12856,7 +12926,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" }, "funding": [ { @@ -12872,7 +12942,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/filesystem", @@ -13227,16 +13297,16 @@ }, { "name": "symfony/http-kernel", - "version": "v6.4.15", + "version": "v6.4.16", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "b002a5b3947653c5aee3adac2a024ea615fd3ff5" + "reference": "8838b5b21d807923b893ccbfc2cbeda0f1bc00f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b002a5b3947653c5aee3adac2a024ea615fd3ff5", - "reference": "b002a5b3947653c5aee3adac2a024ea615fd3ff5", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/8838b5b21d807923b893ccbfc2cbeda0f1bc00f0", + "reference": "8838b5b21d807923b893ccbfc2cbeda0f1bc00f0", "shasum": "" }, "require": { @@ -13321,7 +13391,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.15" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.16" }, "funding": [ { @@ -13337,7 +13407,7 @@ "type": "tidelift" } ], - "time": "2024-11-13T13:57:37+00:00" + "time": "2024-11-27T12:49:36+00:00" }, { "name": "symfony/mailer", @@ -13530,8 +13600,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -13686,8 +13756,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -13848,8 +13918,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -14006,8 +14076,8 @@ "type": "metapackage", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "notification-url": "https://packagist.org/downloads/", @@ -14071,8 +14141,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -14151,8 +14221,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -14228,8 +14298,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -14424,16 +14494,16 @@ }, { "name": "symfony/property-info", - "version": "v6.4.15", + "version": "v6.4.16", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "9d7b576bb643c72bf3b60eb8e89c98725d00afd0" + "reference": "e4782ec1c2b6896e820896357f6a3d02249e63eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/9d7b576bb643c72bf3b60eb8e89c98725d00afd0", - "reference": "9d7b576bb643c72bf3b60eb8e89c98725d00afd0", + "url": "https://api.github.com/repos/symfony/property-info/zipball/e4782ec1c2b6896e820896357f6a3d02249e63eb", + "reference": "e4782ec1c2b6896e820896357f6a3d02249e63eb", "shasum": "" }, "require": { @@ -14441,17 +14511,18 @@ "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { + "doctrine/annotations": "<1.12", "phpdocumentor/reflection-docblock": "<5.2", "phpdocumentor/type-resolver": "<1.5.1", - "symfony/dependency-injection": "<5.4", - "symfony/serializer": "<6.4" + "symfony/dependency-injection": "<5.4|>=6.0,<6.4" }, "require-dev": { + "doctrine/annotations": "^1.12|^2", "phpdocumentor/reflection-docblock": "^5.2", "phpstan/phpdoc-parser": "^1.0|^2.0", "symfony/cache": "^5.4|^6.0|^7.0", "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4|^7.0" + "symfony/serializer": "^5.4|^6.4|^7.0" }, "type": "library", "autoload": { @@ -14487,7 +14558,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.4.15" + "source": "https://github.com/symfony/property-info/tree/v6.4.16" }, "funding": [ { @@ -14503,7 +14574,7 @@ "type": "tidelift" } ], - "time": "2024-11-07T16:39:46+00:00" + "time": "2024-11-27T10:18:02+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -14590,16 +14661,16 @@ }, { "name": "symfony/routing", - "version": "v6.4.13", + "version": "v6.4.16", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278" + "reference": "91e02e606b4b705c2f4fb42f7e7708b7923a3220" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/640a74250d13f9c30d5ca045b6aaaabcc8215278", - "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278", + "url": "https://api.github.com/repos/symfony/routing/zipball/91e02e606b4b705c2f4fb42f7e7708b7923a3220", + "reference": "91e02e606b4b705c2f4fb42f7e7708b7923a3220", "shasum": "" }, "require": { @@ -14653,7 +14724,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.13" + "source": "https://github.com/symfony/routing/tree/v6.4.16" }, "funding": [ { @@ -14669,7 +14740,7 @@ "type": "tidelift" } ], - "time": "2024-10-01T08:30:56+00:00" + "time": "2024-11-13T15:31:34+00:00" }, { "name": "symfony/serializer", @@ -14771,16 +14842,16 @@ }, { "name": "symfony/service-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", "shasum": "" }, "require": { @@ -14834,7 +14905,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" }, "funding": [ { @@ -14850,7 +14921,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/string", @@ -15035,16 +15106,16 @@ }, { "name": "symfony/translation-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", "shasum": "" }, "require": { @@ -15093,7 +15164,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" }, "funding": [ { @@ -15109,20 +15180,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/validator", - "version": "v6.4.15", + "version": "v6.4.16", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "7541055cdaf54ff95f0735bf703d313374e8b20b" + "reference": "9b0d1988b56511706bc91d96ead39acd77aaf34d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/7541055cdaf54ff95f0735bf703d313374e8b20b", - "reference": "7541055cdaf54ff95f0735bf703d313374e8b20b", + "url": "https://api.github.com/repos/symfony/validator/zipball/9b0d1988b56511706bc91d96ead39acd77aaf34d", + "reference": "9b0d1988b56511706bc91d96ead39acd77aaf34d", "shasum": "" }, "require": { @@ -15190,7 +15261,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.15" + "source": "https://github.com/symfony/validator/tree/v6.4.16" }, "funding": [ { @@ -15206,7 +15277,7 @@ "type": "tidelift" } ], - "time": "2024-11-08T15:28:48+00:00" + "time": "2024-11-27T09:48:51+00:00" }, { "name": "symfony/var-dumper", @@ -17387,16 +17458,16 @@ }, { "name": "php-mock/php-mock", - "version": "2.5.0", + "version": "2.5.1", "source": { "type": "git", "url": "https://github.com/php-mock/php-mock.git", - "reference": "fff1a621ebe54100fa3bd852e7be57773a0c0127" + "reference": "8f58972dce4de5a804dc0459383a11bc651416cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-mock/php-mock/zipball/fff1a621ebe54100fa3bd852e7be57773a0c0127", - "reference": "fff1a621ebe54100fa3bd852e7be57773a0c0127", + "url": "https://api.github.com/repos/php-mock/php-mock/zipball/8f58972dce4de5a804dc0459383a11bc651416cf", + "reference": "8f58972dce4de5a804dc0459383a11bc651416cf", "shasum": "" }, "require": { @@ -17451,7 +17522,7 @@ ], "support": { "issues": "https://github.com/php-mock/php-mock/issues", - "source": "https://github.com/php-mock/php-mock/tree/2.5.0" + "source": "https://github.com/php-mock/php-mock/tree/2.5.1" }, "funding": [ { @@ -17459,7 +17530,7 @@ "type": "github" } ], - "time": "2024-02-10T21:07:01+00:00" + "time": "2024-12-07T20:52:37+00:00" }, { "name": "phpspec/prophecy", @@ -19568,16 +19639,16 @@ }, { "name": "symfony/dom-crawler", - "version": "v6.4.13", + "version": "v6.4.16", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "ae074dffb018c37a57071990d16e6152728dd972" + "reference": "4304e6ad5c894a9c72831ad459f627bfd35d766d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/ae074dffb018c37a57071990d16e6152728dd972", - "reference": "ae074dffb018c37a57071990d16e6152728dd972", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/4304e6ad5c894a9c72831ad459f627bfd35d766d", + "reference": "4304e6ad5c894a9c72831ad459f627bfd35d766d", "shasum": "" }, "require": { @@ -19615,7 +19686,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.4.13" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.16" }, "funding": [ { @@ -19631,7 +19702,7 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:07:50+00:00" + "time": "2024-11-13T15:06:22+00:00" }, { "name": "symfony/lock", @@ -19814,8 +19885,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { diff --git a/config/sync/core.entity_form_display.eventinstance.default.default.yml b/config/sync/core.entity_form_display.eventinstance.default.default.yml index 71ccee1fb3..9664ad0d92 100644 --- a/config/sync/core.entity_form_display.eventinstance.default.default.yml +++ b/config/sync/core.entity_form_display.eventinstance.default.default.yml @@ -15,6 +15,7 @@ dependencies: - field.field.eventinstance.default.field_event_state - field.field.eventinstance.default.field_event_title - field.field.eventinstance.default.field_external_admin_link + - field.field.eventinstance.default.field_screen_names - field.field.eventinstance.default.field_tags - field.field.eventinstance.default.field_teaser_image - field.field.eventinstance.default.field_teaser_text @@ -87,6 +88,22 @@ third_party_settings: description: '' required_fields: true weight: 0 + group_infoscreen: + children: + - field_screen_names + label: Infoscreen + region: content + parent_name: '' + weight: 15 + format_type: details_sidebar + format_settings: + classes: '' + show_empty_fields: false + id: '' + open: true + description: '' + required_fields: true + weight: 0 id: eventinstance.default.default targetEntityType: eventinstance bundle: default @@ -219,7 +236,7 @@ content: placeholder_url: '' placeholder_title: '' third_party_settings: { } - field_tags: + field_screen_names: type: select2_entity_reference weight: 7 region: content @@ -229,6 +246,16 @@ content: match_operator: CONTAINS match_limit: 10 third_party_settings: { } + field_tags: + type: select2_entity_reference + weight: 6 + region: content + settings: + width: 100% + autocomplete: true + match_operator: CONTAINS + match_limit: 10 + third_party_settings: { } field_teaser_image: type: media_library_widget weight: 14 @@ -283,7 +310,7 @@ content: dialog_style: tiles path: type: path - weight: 15 + weight: 16 region: content settings: { } third_party_settings: { } diff --git a/config/sync/core.entity_form_display.eventseries.default.default.yml b/config/sync/core.entity_form_display.eventseries.default.default.yml index 73b0ec9299..c76a24e3b0 100644 --- a/config/sync/core.entity_form_display.eventseries.default.default.yml +++ b/config/sync/core.entity_form_display.eventseries.default.default.yml @@ -14,6 +14,7 @@ dependencies: - field.field.eventseries.default.field_event_place - field.field.eventseries.default.field_event_state - field.field.eventseries.default.field_relevant_ticket_manager + - field.field.eventseries.default.field_screen_names - field.field.eventseries.default.field_tags - field.field.eventseries.default.field_teaser_image - field.field.eventseries.default.field_teaser_text @@ -88,6 +89,22 @@ third_party_settings: description: '' required_fields: true weight: 0 + group_infoscreen: + children: + - field_screen_names + label: Infoscreen + region: content + parent_name: '' + weight: 24 + format_type: details_sidebar + format_settings: + classes: '' + show_empty_fields: false + id: '' + open: true + description: '' + required_fields: true + weight: 0 _core: default_config_hash: 7_dwlx5EAFGRacPwzHjO_cePFPbST8IjxnowMV4sk0A id: eventseries.default.default @@ -223,6 +240,16 @@ content: settings: display_label: true third_party_settings: { } + field_screen_names: + type: select2_entity_reference + weight: 35 + region: content + settings: + width: 100% + autocomplete: false + match_operator: CONTAINS + match_limit: 10 + third_party_settings: { } field_tags: type: select2_entity_reference weight: 34 @@ -293,7 +320,7 @@ content: third_party_settings: { } path: type: path - weight: 24 + weight: 25 region: content settings: { } third_party_settings: { } diff --git a/config/sync/core.entity_form_display.taxonomy_term.screen_name.default.yml b/config/sync/core.entity_form_display.taxonomy_term.screen_name.default.yml new file mode 100644 index 0000000000..f7a4caa0cd --- /dev/null +++ b/config/sync/core.entity_form_display.taxonomy_term.screen_name.default.yml @@ -0,0 +1,53 @@ +uuid: de724c1c-3c49-4e4c-aa3f-466895689de0 +langcode: en +status: true +dependencies: + config: + - taxonomy.vocabulary.screen_name + module: + - path + - text +id: taxonomy_term.screen_name.default +targetEntityType: taxonomy_term +bundle: screen_name +mode: default +content: + description: + type: text_textfield + weight: 0 + region: content + settings: + size: 60 + placeholder: '' + third_party_settings: { } + langcode: + type: language_select + weight: 2 + region: content + settings: + include_locked: true + third_party_settings: { } + name: + type: string_textfield + weight: -5 + region: content + settings: + size: 60 + placeholder: '' + third_party_settings: { } + path: + type: path + weight: 30 + region: content + settings: { } + third_party_settings: { } + status: + type: boolean_checkbox + weight: 100 + region: content + settings: + display_label: true + third_party_settings: { } +hidden: + publish_on: true + unpublish_on: true diff --git a/config/sync/core.entity_view_display.eventinstance.default.card.yml b/config/sync/core.entity_view_display.eventinstance.default.card.yml index d7413f67a1..21660d0b7b 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.card.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.card.yml @@ -16,6 +16,7 @@ dependencies: - field.field.eventinstance.default.field_event_state - field.field.eventinstance.default.field_event_title - field.field.eventinstance.default.field_external_admin_link + - field.field.eventinstance.default.field_screen_names - field.field.eventinstance.default.field_tags - field.field.eventinstance.default.field_teaser_image - field.field.eventinstance.default.field_teaser_text @@ -78,6 +79,14 @@ content: third_party_settings: { } weight: 60 region: content + event_screen_names: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 60 + region: content event_tags: type: entity_reference_label label: above @@ -105,7 +114,7 @@ content: region: content event_ticket_capacity: type: number_integer - label: visible + label: above settings: thousand_separator: '' prefix_suffix: true @@ -144,6 +153,7 @@ hidden: field_event_state: true field_event_title: true field_external_admin_link: true + field_screen_names: true field_tags: true field_teaser_image: true field_teaser_text: true diff --git a/config/sync/core.entity_view_display.eventinstance.default.default.yml b/config/sync/core.entity_view_display.eventinstance.default.default.yml index 4e89c51845..0cc8f0d5a9 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.default.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.default.yml @@ -15,6 +15,7 @@ dependencies: - field.field.eventinstance.default.field_event_state - field.field.eventinstance.default.field_event_title - field.field.eventinstance.default.field_external_admin_link + - field.field.eventinstance.default.field_screen_names - field.field.eventinstance.default.field_tags - field.field.eventinstance.default.field_teaser_image - field.field.eventinstance.default.field_teaser_text @@ -130,6 +131,14 @@ content: third_party_settings: { } weight: 7 region: content + event_screen_names: + type: entity_reference_label + label: visible + settings: + link: true + third_party_settings: { } + weight: 60 + region: content event_tags: type: entity_reference_label label: hidden @@ -203,6 +212,7 @@ hidden: field_event_state: true field_event_title: true field_external_admin_link: true + field_screen_names: true field_tags: true field_teaser_image: true field_teaser_text: true diff --git a/config/sync/core.entity_view_display.eventinstance.default.list.yml b/config/sync/core.entity_view_display.eventinstance.default.list.yml index fe0e4b7a27..f298d72054 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.list.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.list.yml @@ -16,6 +16,7 @@ dependencies: - field.field.eventinstance.default.field_event_state - field.field.eventinstance.default.field_event_title - field.field.eventinstance.default.field_external_admin_link + - field.field.eventinstance.default.field_screen_names - field.field.eventinstance.default.field_tags - field.field.eventinstance.default.field_teaser_image - field.field.eventinstance.default.field_teaser_text @@ -138,6 +139,14 @@ content: third_party_settings: { } weight: 60 region: content + event_screen_names: + type: entity_reference_label + label: visible + settings: + link: true + third_party_settings: { } + weight: 60 + region: content event_tags: type: entity_reference_label label: above @@ -209,6 +218,7 @@ hidden: field_event_state: true field_event_title: true field_external_admin_link: true + field_screen_names: true field_tags: true field_teaser_image: true field_teaser_text: true diff --git a/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml b/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml index 60ec404e52..4ab1f0df1a 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml @@ -16,6 +16,7 @@ dependencies: - field.field.eventinstance.default.field_event_state - field.field.eventinstance.default.field_event_title - field.field.eventinstance.default.field_external_admin_link + - field.field.eventinstance.default.field_screen_names - field.field.eventinstance.default.field_tags - field.field.eventinstance.default.field_teaser_image - field.field.eventinstance.default.field_teaser_text @@ -141,6 +142,14 @@ content: third_party_settings: { } weight: 60 region: content + event_screen_names: + type: entity_reference_label + label: visible + settings: + link: true + third_party_settings: { } + weight: 60 + region: content event_tags: type: entity_reference_label label: above @@ -201,6 +210,7 @@ hidden: field_event_state: true field_event_title: true field_external_admin_link: true + field_screen_names: true field_tags: true field_teaser_image: true field_teaser_text: true diff --git a/config/sync/core.entity_view_display.eventinstance.default.list_teaser_stacked_parent.yml b/config/sync/core.entity_view_display.eventinstance.default.list_teaser_stacked_parent.yml index 52dc6ab0e9..f3f63dd027 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.list_teaser_stacked_parent.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.list_teaser_stacked_parent.yml @@ -16,6 +16,7 @@ dependencies: - field.field.eventinstance.default.field_event_state - field.field.eventinstance.default.field_event_title - field.field.eventinstance.default.field_external_admin_link + - field.field.eventinstance.default.field_screen_names - field.field.eventinstance.default.field_tags - field.field.eventinstance.default.field_teaser_image - field.field.eventinstance.default.field_teaser_text @@ -141,6 +142,14 @@ content: third_party_settings: { } weight: 60 region: content + event_screen_names: + type: entity_reference_label + label: visible + settings: + link: true + third_party_settings: { } + weight: 60 + region: content event_tags: type: entity_reference_label label: hidden @@ -208,6 +217,7 @@ hidden: field_event_state: true field_event_title: true field_external_admin_link: true + field_screen_names: true field_tags: true field_teaser_image: true field_teaser_text: true diff --git a/config/sync/core.entity_view_display.eventinstance.default.nav_spot.yml b/config/sync/core.entity_view_display.eventinstance.default.nav_spot.yml index 7094a071c9..73fd450d83 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.nav_spot.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.nav_spot.yml @@ -16,6 +16,7 @@ dependencies: - field.field.eventinstance.default.field_event_state - field.field.eventinstance.default.field_event_title - field.field.eventinstance.default.field_external_admin_link + - field.field.eventinstance.default.field_screen_names - field.field.eventinstance.default.field_tags - field.field.eventinstance.default.field_teaser_image - field.field.eventinstance.default.field_teaser_text @@ -54,6 +55,14 @@ content: third_party_settings: { } weight: 60 region: content + event_screen_names: + type: entity_reference_label + label: visible + settings: + link: true + third_party_settings: { } + weight: 60 + region: content event_teaser_image: type: entity_reference_entity_view label: hidden @@ -115,6 +124,7 @@ hidden: field_event_state: true field_event_title: true field_external_admin_link: true + field_screen_names: true field_tags: true field_teaser_image: true field_teaser_text: true diff --git a/config/sync/core.entity_view_display.eventinstance.default.nav_teaser.yml b/config/sync/core.entity_view_display.eventinstance.default.nav_teaser.yml index 41c93d5a02..9eed14f308 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.nav_teaser.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.nav_teaser.yml @@ -16,6 +16,7 @@ dependencies: - field.field.eventinstance.default.field_event_state - field.field.eventinstance.default.field_event_title - field.field.eventinstance.default.field_external_admin_link + - field.field.eventinstance.default.field_screen_names - field.field.eventinstance.default.field_tags - field.field.eventinstance.default.field_teaser_image - field.field.eventinstance.default.field_teaser_text @@ -54,6 +55,14 @@ content: third_party_settings: { } weight: 60 region: content + event_screen_names: + type: entity_reference_label + label: visible + settings: + link: true + third_party_settings: { } + weight: 60 + region: content event_ticket_capacity: type: number_integer label: visible @@ -108,6 +117,7 @@ hidden: field_event_state: true field_event_title: true field_external_admin_link: true + field_screen_names: true field_tags: true field_teaser_image: true field_ticket_capacity: true diff --git a/config/sync/core.entity_view_display.eventinstance.default.stacked_event.yml b/config/sync/core.entity_view_display.eventinstance.default.stacked_event.yml index 7be7ec9470..13e04eb244 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.stacked_event.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.stacked_event.yml @@ -16,6 +16,7 @@ dependencies: - field.field.eventinstance.default.field_event_state - field.field.eventinstance.default.field_event_title - field.field.eventinstance.default.field_external_admin_link + - field.field.eventinstance.default.field_screen_names - field.field.eventinstance.default.field_tags - field.field.eventinstance.default.field_teaser_image - field.field.eventinstance.default.field_teaser_text @@ -83,6 +84,14 @@ content: third_party_settings: { } weight: 60 region: content + event_screen_names: + type: entity_reference_label + label: visible + settings: + link: true + third_party_settings: { } + weight: 60 + region: content event_ticket_capacity: type: number_integer label: visible @@ -127,6 +136,7 @@ hidden: field_event_state: true field_event_title: true field_external_admin_link: true + field_screen_names: true field_tags: true field_teaser_image: true field_teaser_text: true diff --git a/config/sync/core.entity_view_display.eventseries.default.card.yml b/config/sync/core.entity_view_display.eventseries.default.card.yml index b87d3a11be..91892307a5 100644 --- a/config/sync/core.entity_view_display.eventseries.default.card.yml +++ b/config/sync/core.entity_view_display.eventseries.default.card.yml @@ -15,6 +15,7 @@ dependencies: - field.field.eventseries.default.field_event_place - field.field.eventseries.default.field_event_state - field.field.eventseries.default.field_relevant_ticket_manager + - field.field.eventseries.default.field_screen_names - field.field.eventseries.default.field_tags - field.field.eventseries.default.field_teaser_image - field.field.eventseries.default.field_teaser_text @@ -80,6 +81,7 @@ hidden: field_event_place: true field_event_state: true field_relevant_ticket_manager: true + field_screen_names: true field_tags: true field_ticket_capacity: true field_ticket_categories: true diff --git a/config/sync/core.entity_view_display.eventseries.default.default.yml b/config/sync/core.entity_view_display.eventseries.default.default.yml index 79e1475fd4..e855484d72 100644 --- a/config/sync/core.entity_view_display.eventseries.default.default.yml +++ b/config/sync/core.entity_view_display.eventseries.default.default.yml @@ -14,6 +14,7 @@ dependencies: - field.field.eventseries.default.field_event_place - field.field.eventseries.default.field_event_state - field.field.eventseries.default.field_relevant_ticket_manager + - field.field.eventseries.default.field_screen_names - field.field.eventseries.default.field_tags - field.field.eventseries.default.field_teaser_image - field.field.eventseries.default.field_teaser_text @@ -166,6 +167,7 @@ hidden: event_registration: true field_event_state: true field_relevant_ticket_manager: true + field_screen_names: true field_ticket_capacity: true monthly_recurring_date: true search_api_excerpt: true diff --git a/config/sync/core.entity_view_display.eventseries.default.list.yml b/config/sync/core.entity_view_display.eventseries.default.list.yml index d257acc5c7..139e6526d6 100644 --- a/config/sync/core.entity_view_display.eventseries.default.list.yml +++ b/config/sync/core.entity_view_display.eventseries.default.list.yml @@ -15,6 +15,7 @@ dependencies: - field.field.eventseries.default.field_event_place - field.field.eventseries.default.field_event_state - field.field.eventseries.default.field_relevant_ticket_manager + - field.field.eventseries.default.field_screen_names - field.field.eventseries.default.field_tags - field.field.eventseries.default.field_teaser_image - field.field.eventseries.default.field_teaser_text @@ -54,6 +55,7 @@ hidden: field_event_place: true field_event_state: true field_relevant_ticket_manager: true + field_screen_names: true field_tags: true field_teaser_image: true field_teaser_text: true diff --git a/config/sync/core.entity_view_display.eventseries.default.nav_spot.yml b/config/sync/core.entity_view_display.eventseries.default.nav_spot.yml index 1b544c9deb..80ad282bcf 100644 --- a/config/sync/core.entity_view_display.eventseries.default.nav_spot.yml +++ b/config/sync/core.entity_view_display.eventseries.default.nav_spot.yml @@ -15,6 +15,7 @@ dependencies: - field.field.eventseries.default.field_event_place - field.field.eventseries.default.field_event_state - field.field.eventseries.default.field_relevant_ticket_manager + - field.field.eventseries.default.field_screen_names - field.field.eventseries.default.field_tags - field.field.eventseries.default.field_teaser_image - field.field.eventseries.default.field_teaser_text @@ -71,6 +72,7 @@ hidden: field_event_place: true field_event_state: true field_relevant_ticket_manager: true + field_screen_names: true field_tags: true field_ticket_capacity: true field_ticket_categories: true diff --git a/config/sync/core.entity_view_display.eventseries.default.nav_teaser.yml b/config/sync/core.entity_view_display.eventseries.default.nav_teaser.yml index 71e746d476..631e43747c 100644 --- a/config/sync/core.entity_view_display.eventseries.default.nav_teaser.yml +++ b/config/sync/core.entity_view_display.eventseries.default.nav_teaser.yml @@ -15,6 +15,7 @@ dependencies: - field.field.eventseries.default.field_event_place - field.field.eventseries.default.field_event_state - field.field.eventseries.default.field_relevant_ticket_manager + - field.field.eventseries.default.field_screen_names - field.field.eventseries.default.field_tags - field.field.eventseries.default.field_teaser_image - field.field.eventseries.default.field_teaser_text @@ -62,6 +63,7 @@ hidden: field_event_place: true field_event_state: true field_relevant_ticket_manager: true + field_screen_names: true field_tags: true field_teaser_image: true field_ticket_capacity: true diff --git a/config/sync/dpl_event.settings.yml b/config/sync/dpl_event.settings.yml index 63541ed49b..3b61ae667f 100644 --- a/config/sync/dpl_event.settings.yml +++ b/config/sync/dpl_event.settings.yml @@ -1,2 +1,4 @@ -unpublish_schedule: 0 +unpublish_schedule: '21600' price_currency: DKK +unpublish_enable: 1 +unpublish_series_enable: 0 diff --git a/config/sync/field.field.eventinstance.default.field_screen_names.yml b/config/sync/field.field.eventinstance.default.field_screen_names.yml new file mode 100644 index 0000000000..951db12bd0 --- /dev/null +++ b/config/sync/field.field.eventinstance.default.field_screen_names.yml @@ -0,0 +1,29 @@ +uuid: 6cb51b10-df02-4bf8-aa68-ef641a1dd1a1 +langcode: en +status: true +dependencies: + config: + - field.storage.eventinstance.field_screen_names + - recurring_events.eventinstance_type.default + - taxonomy.vocabulary.screen_name +id: eventinstance.default.field_screen_names +field_name: field_screen_names +entity_type: eventinstance +bundle: default +label: 'Screen names' +description: 'Select which screens to display this event on. ' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + screen_name: screen_name + sort: + field: name + direction: asc + auto_create: false + auto_create_bundle: '' +field_type: entity_reference diff --git a/config/sync/field.field.eventseries.default.field_screen_names.yml b/config/sync/field.field.eventseries.default.field_screen_names.yml new file mode 100644 index 0000000000..9a18a3a6a5 --- /dev/null +++ b/config/sync/field.field.eventseries.default.field_screen_names.yml @@ -0,0 +1,29 @@ +uuid: 1587448d-7660-4bd9-849c-d0de6318a5a2 +langcode: en +status: true +dependencies: + config: + - field.storage.eventseries.field_screen_names + - recurring_events.eventseries_type.default + - taxonomy.vocabulary.screen_name +id: eventseries.default.field_screen_names +field_name: field_screen_names +entity_type: eventseries +bundle: default +label: 'Screen names' +description: 'Select which screens to display this event on.' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + screen_name: screen_name + sort: + field: name + direction: asc + auto_create: false + auto_create_bundle: '' +field_type: entity_reference diff --git a/config/sync/field.storage.eventinstance.field_screen_names.yml b/config/sync/field.storage.eventinstance.field_screen_names.yml new file mode 100644 index 0000000000..2b810586cd --- /dev/null +++ b/config/sync/field.storage.eventinstance.field_screen_names.yml @@ -0,0 +1,20 @@ +uuid: b56885e7-70a1-4449-af48-edd59248dc55 +langcode: en +status: true +dependencies: + module: + - recurring_events + - taxonomy +id: eventinstance.field_screen_names +field_name: field_screen_names +entity_type: eventinstance +type: entity_reference +settings: + target_type: taxonomy_term +module: core +locked: false +cardinality: -1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/config/sync/field.storage.eventseries.field_screen_names.yml b/config/sync/field.storage.eventseries.field_screen_names.yml new file mode 100644 index 0000000000..7f091ae6c1 --- /dev/null +++ b/config/sync/field.storage.eventseries.field_screen_names.yml @@ -0,0 +1,20 @@ +uuid: 10baea55-1be7-453c-9578-13ad99e319a7 +langcode: en +status: true +dependencies: + module: + - recurring_events + - taxonomy +id: eventseries.field_screen_names +field_name: field_screen_names +entity_type: eventseries +type: entity_reference +settings: + target_type: taxonomy_term +module: core +locked: false +cardinality: -1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/config/sync/field_inheritance.field_inheritance.eventinstance_default_event_screen_names.yml b/config/sync/field_inheritance.field_inheritance.eventinstance_default_event_screen_names.yml new file mode 100644 index 0000000000..6e24788193 --- /dev/null +++ b/config/sync/field_inheritance.field_inheritance.eventinstance_default_event_screen_names.yml @@ -0,0 +1,14 @@ +uuid: 96438ecf-b991-4e51-b0be-860c23dfc8cf +langcode: en +status: true +dependencies: { } +id: eventinstance_default_event_screen_names +label: 'Event screen names' +type: fallback +sourceEntityType: eventseries +sourceEntityBundle: default +sourceField: field_screen_names +destinationEntityType: eventinstance +destinationEntityBundle: default +destinationField: field_screen_names +plugin: entity_reference_inheritance diff --git a/config/sync/language.content_settings.taxonomy_term.screen_name.yml b/config/sync/language.content_settings.taxonomy_term.screen_name.yml new file mode 100644 index 0000000000..0022f290f9 --- /dev/null +++ b/config/sync/language.content_settings.taxonomy_term.screen_name.yml @@ -0,0 +1,11 @@ +uuid: 1775adfc-d12c-49ab-964a-71e30d949c91 +langcode: en +status: true +dependencies: + config: + - taxonomy.vocabulary.screen_name +id: taxonomy_term.screen_name +target_entity_type_id: taxonomy_term +target_bundle: screen_name +default_langcode: da +language_alterable: false diff --git a/config/sync/taxonomy.vocabulary.screen_name.yml b/config/sync/taxonomy.vocabulary.screen_name.yml new file mode 100644 index 0000000000..39cb31843d --- /dev/null +++ b/config/sync/taxonomy.vocabulary.screen_name.yml @@ -0,0 +1,29 @@ +uuid: 956b17d2-80b6-410b-8f23-b728b068287a +langcode: da +status: true +dependencies: + module: + - scheduler + - taxonomy_unique +third_party_settings: + scheduler: + expand_fieldset: when_required + fields_display_mode: vertical_tab + publish_enable: false + publish_past_date: error + publish_past_date_created: false + publish_required: false + publish_revision: false + publish_touch: false + show_message_after_update: true + unpublish_enable: false + unpublish_required: false + unpublish_revision: false + taxonomy_unique: + enabled: false + message: 'Term "%term" already exists in vocabulary "%vocabulary".' +name: 'Screen name' +vid: screen_name +description: 'Screens to display content on' +weight: 0 +new_revision: false diff --git a/config/sync/user.role.administrator.yml b/config/sync/user.role.administrator.yml index 42b4d76937..f8a8d4e7cc 100644 --- a/config/sync/user.role.administrator.yml +++ b/config/sync/user.role.administrator.yml @@ -19,6 +19,7 @@ dependencies: - taxonomy.vocabulary.breadcrumb_structure - taxonomy.vocabulary.categories - taxonomy.vocabulary.opening_hours_categories + - taxonomy.vocabulary.screen_name - taxonomy.vocabulary.tags - taxonomy.vocabulary.webform_email_categories module: @@ -140,6 +141,7 @@ permissions: - 'create terms in breadcrumb_structure' - 'create terms in categories' - 'create terms in opening_hours_categories' + - 'create terms in screen_name' - 'create terms in tags' - 'create terms in webform_email_categories' - 'create url aliases' @@ -183,6 +185,7 @@ permissions: - 'delete terms in breadcrumb_structure' - 'delete terms in categories' - 'delete terms in opening_hours_categories' + - 'delete terms in screen_name' - 'delete terms in tags' - 'delete terms in webform_email_categories' - 'disable cookie information consent' @@ -216,6 +219,7 @@ permissions: - 'edit terms in breadcrumb_structure' - 'edit terms in categories' - 'edit terms in opening_hours_categories' + - 'edit terms in screen_name' - 'edit terms in tags' - 'edit terms in webform_email_categories' - 'edit themes novel' diff --git a/config/sync/user.role.local_administrator.yml b/config/sync/user.role.local_administrator.yml index 2afcdbb9c1..6751389e4b 100644 --- a/config/sync/user.role.local_administrator.yml +++ b/config/sync/user.role.local_administrator.yml @@ -19,6 +19,7 @@ dependencies: - taxonomy.vocabulary.breadcrumb_structure - taxonomy.vocabulary.categories - taxonomy.vocabulary.opening_hours_categories + - taxonomy.vocabulary.screen_name - taxonomy.vocabulary.tags - taxonomy.vocabulary.webform_email_categories module: @@ -113,6 +114,7 @@ permissions: - 'create terms in breadcrumb_structure' - 'create terms in categories' - 'create terms in opening_hours_categories' + - 'create terms in screen_name' - 'create terms in tags' - 'create terms in webform_email_categories' - 'create url aliases' @@ -183,6 +185,7 @@ permissions: - 'edit terms in breadcrumb_structure' - 'edit terms in categories' - 'edit terms in opening_hours_categories' + - 'edit terms in screen_name' - 'edit terms in tags' - 'edit terms in webform_email_categories' - 'edit themes novel' diff --git a/config/sync/views.view.events.yml b/config/sync/views.view.events.yml index fc06ebc12e..385282804e 100644 --- a/config/sync/views.view.events.yml +++ b/config/sync/views.view.events.yml @@ -161,8 +161,12 @@ display: options: perm: 'access content' cache: - type: none - options: { } + type: search_api_time + options: + results_lifespan: 3600 + results_lifespan_custom: 0 + output_lifespan: 3600 + output_lifespan_custom: 0 empty: area: id: area @@ -377,5 +381,7 @@ display: - url.query_args - user.permissions tags: + - 'config:facets.facet.branch' + - 'config:facets.facet.event_categories' - 'config:search_api.index.events' - 'search_api_list:events' diff --git a/openapi.json b/openapi.json index f942b0242b..12ccc8d8fa 100644 --- a/openapi.json +++ b/openapi.json @@ -1079,6 +1079,14 @@ "description": "An absolute URL provided by the third party where editorial users can administer the event. Accessing this URL should require authentication." } } + }, + "screen_names": { + "type": "array", + "description": "The screens this event should be shown on.", + "items": { + "type": "string", + "description": "A screen name." + } } }, "required": ["uuid", "title", "created_at", "updated_at", "url", "state", "date_time"] diff --git a/package.json b/package.json index c113e39bf7..20eb212102 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,11 @@ "@lhci/cli": "^0.8", "@testing-library/cypress": "^10.0.2", "@types/node": "^18.11.11", - "@typescript-eslint/eslint-plugin": "^8.17.0", - "@typescript-eslint/parser": "^8.17.0", + "@typescript-eslint/eslint-plugin": "^8.18.0", + "@typescript-eslint/parser": "^8.18.0", "chrome-launcher": "^0.15.1", - "cypress": "^13.16.0", - "cypress-if": "^1.13.1", + "cypress": "^13.16.1", + "cypress-if": "^1.13.2", "cypress-plugin-api": "^2.11.2", "dayjs": "^1.11.13", "eslint": "^8.57.1", @@ -24,7 +24,7 @@ "pa11y-ci": "https://github.com/pa11y/pa11y-ci/archive/5c842cf1b9fe2867b70ff5354851d985be8d71c4.tar.gz", "prettier": "^2.7.1", "typescript": "^5.7.2", - "wiremock-rest-client": "^1.10.0" + "wiremock-rest-client": "^1.11.0" }, "scripts": { "wiremock:create-mappings": "yarn wiremock:build && node wiremock/build/createMappings.js", diff --git a/packages/cms-api/Model/EventsGET200ResponseInner.php b/packages/cms-api/Model/EventsGET200ResponseInner.php index ef7ce54079..e2850fb076 100644 --- a/packages/cms-api/Model/EventsGET200ResponseInner.php +++ b/packages/cms-api/Model/EventsGET200ResponseInner.php @@ -240,6 +240,18 @@ class EventsGET200ResponseInner */ protected ?EventPATCHRequestExternalData $externalData = null; + /** + * The screens this event should be shown on. + * + * @var string[]|null + * @SerializedName("screen_names") + * @Assert\All({ + * @Assert\Type("string") + * }) + * @Type("array") + */ + protected ?array $screenNames = null; + /** * Constructor * @param array|null $data Associated array of property values initializing the model @@ -266,6 +278,7 @@ public function __construct(array $data = null) $this->series = array_key_exists('series', $data) ? $data['series'] : $this->series; $this->body = array_key_exists('body', $data) ? $data['body'] : $this->body; $this->externalData = array_key_exists('externalData', $data) ? $data['externalData'] : $this->externalData; + $this->screenNames = array_key_exists('screenNames', $data) ? $data['screenNames'] : $this->screenNames; } } @@ -762,6 +775,32 @@ public function setExternalData(?EventPATCHRequestExternalData $externalData = n return $this; } + + /** + * Gets screenNames. + * + * @return string[]|null + */ + public function getScreenNames(): ?array + { + return $this->screenNames; + } + + + + /** + * Sets screenNames. + * + * @param string[]|null $screenNames The screens this event should be shown on. + * + * @return $this + */ + public function setScreenNames(?array $screenNames = null): self + { + $this->screenNames = $screenNames; + + return $this; + } } diff --git a/patches/dont-check-fileowner.patch b/patches/dont-check-fileowner.patch new file mode 100644 index 0000000000..8e707c08da --- /dev/null +++ b/patches/dont-check-fileowner.patch @@ -0,0 +1,52 @@ +diff --git a/modules/update/src/Form/UpdateReady.php b/modules/update/src/Form/UpdateReady.php +index 779ad5b5a1..f02098037b 100644 +--- a/modules/update/src/Form/UpdateReady.php ++++ b/modules/update/src/Form/UpdateReady.php +@@ -145,12 +145,9 @@ class UpdateReady extends FormBase { + ]; + } + +- // If the owner of the last directory we extracted is the same as the +- // owner of our configuration directory (e.g. sites/default) where we're +- // trying to install the code, there's no need to prompt for FTP/SSH +- // credentials. Instead, we instantiate a Drupal\Core\FileTransfer\Local +- // and invoke update_authorize_run_update() directly. +- if (fileowner($project_real_location) == fileowner($this->sitePath)) { ++ // Modified for DPL. The file owner check didn't work for us as owners ++ // doesn't match in our case, but the files can be moved just fine. ++ if (TRUE) { + $this->moduleHandler->loadInclude('update', 'inc', 'update.authorize'); + $filetransfer = new Local($this->root, \Drupal::service('file_system')); + $response = update_authorize_run_update($filetransfer, $updates); +diff --git a/modules/update/update.manager.inc b/modules/update/update.manager.inc +index 97333a0825..fe5ec5f02f 100644 +--- a/modules/update/update.manager.inc ++++ b/modules/update/update.manager.inc +@@ -325,17 +325,14 @@ function update_manager_batch_project_get($project, $url, &$context) { + * @see install_check_requirements() + */ + function update_manager_local_transfers_allowed() { +- $file_system = \Drupal::service('file_system'); +- // Compare the owner of a webserver-created temporary file to the owner of +- // the configuration directory to determine if local transfers will be +- // allowed. +- $temporary_file = \Drupal::service('file_system')->tempnam('temporary://', 'update_'); +- $site_path = \Drupal::getContainer()->getParameter('site.path'); +- $local_transfers_allowed = fileowner($temporary_file) === fileowner($site_path); +- +- // Clean up. If this fails, we can ignore it (since this is just a temporary +- // file anyway). +- @$file_system->unlink($temporary_file); +- +- return $local_transfers_allowed; ++ // Patch for DPL. Normally this checks if a temporary file created is owned by ++ // the same user as `sites/`, but that's pretty simplistic and ++ // will fail in quite valid cases (for instance if the webserver has write ++ // access through group permissions). In our case, we know that uploaded ++ // modules can be moved to our `sites/default/files/modules_local` (which is ++ // symlinked from `modules/`), but we can't really fix this properly as this ++ // function doesn't know whether it's a module, theme or something else ++ // entirely that we're checking for. So rather than trying to cook up some ++ // generic solution that'll fail in some cases anyway, we just return true. ++ return TRUE; + } diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 41e5c41856..38cb5bc890 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -26,6 +26,8 @@ parameters: - '#Function .*_theme_suggestions_.*\(\) has parameter .* with no value type specified in iterable type array\.#' # Drupal hook_page_attachments functions uses page array which we cannot provide more detailed typing of. - '#Function .*_page_attachments\(\) has parameter \$page with no value type specified in iterable type array\.#' + # Drupal hook_module_implements_alter functions uses implementations array which we cannot provide more detailed typing of. + - '#Function .*_module_implements_alter\(\) has parameter \$implementations with no value type specified in iterable type array\.#' # Drupal hook_requirements() implementation returns array which we cannot provide more detailed typing of. - '#Function .*_requirements\(\) return type has no value type specified in iterable type array\.#' # Drupal hook_schema() implementation returns array which we cannot provide more detailed typing of. diff --git a/web/modules/custom/dpl_admin/assets/dpl_admin.css b/web/modules/custom/dpl_admin/assets/dpl_admin.css index 23d45a5e52..a8bc606253 100644 --- a/web/modules/custom/dpl_admin/assets/dpl_admin.css +++ b/web/modules/custom/dpl_admin/assets/dpl_admin.css @@ -176,6 +176,20 @@ } } +/** + We use the password policy module, which shows it's own password restrictions. + We want to hide the standard drupal password suggestions, as they are + confusing, as they may give conflicting information. + We need to make sure that inline styling also gets overriden, hence [style] + and !important. + */ +.user-form { + .password-suggestions, + .password-suggestions[style] { + display: none !important; + } +} + /** Hide default action button on confirm form. Editors should focus on the date-related changes. @@ -184,3 +198,12 @@ body:has(.eventseries-form--confirm) .form-actions { display: none; } + +/** + A very simple element, used in Drupal forms when displaying warnings. + */ +.dpl-form-warning { + color: #d80404; + font-weight: bold; + max-width: 500px; +} diff --git a/web/modules/custom/dpl_admin/dpl_admin.module b/web/modules/custom/dpl_admin/dpl_admin.module index 73c938b19b..023f682b74 100644 --- a/web/modules/custom/dpl_admin/dpl_admin.module +++ b/web/modules/custom/dpl_admin/dpl_admin.module @@ -216,7 +216,56 @@ function _dpl_admin_form_alter_node_page(array &$form, FormStateInterface $form_ $form['field_hero_title']['#states']['invisible'] = $inactive_state; $form['field_subtitle']['#states']['invisible'] = $inactive_state; } +} +/** + * Implements hook_form_FORM_ID_alter() for the user add/edit form. + * + * Re-ordering the user edit form, to make the password demands clearer. + * + * @param array $form + * See the $form in dpl_admin_form_alter(). + */ +function _dpl_admin_form_alter_user_form(array &$form, FormStateInterface $form_state, string $form_id): void { + // We're setting the numbers high, to make sure they show up last, in this + // order. + $form['account']['current_pass']['#weight'] = 997; + $form['account']['pass']['#weight'] = 998; + $form['account']['password_policy_status']['#weight'] = 999; +} + +/** + * Implements hook_module_implements_alter(). + * + * Make sure the dpl_admin form_alter happens last, after any other contrib + * modules. This is necessary for us to alter the password policy position. + */ +function dpl_admin_module_implements_alter(array &$implementations, string $hook): void { + if ($hook == 'form_alter') { + $group = $implementations['dpl_admin']; + unset($implementations['dpl_admin']); + $implementations['dpl_admin'] = $group; + } +} + +/** + * Implements hook_form_FORM_ID_alter(). + * + * Add basic styling classes to the "reset password" page, as it does not + * have any Gin styling. + */ +function dpl_admin_form_user_pass_reset_alter(array &$form, FormStateInterface $form_state, string $form_id): void { + $form['#attributes']['class'][] = 'rich-text'; + $form['#attributes']['class'][] = 'dpl-form'; + $form['title'] = [ + '#type' => 'markup', + '#prefix' => '

', + '#suffix' => '

', + '#markup' => t('Reset password', [], ['context' => 'DPL admin']), + '#weight' => '-999', + ]; + + $form['actions']['submit']['#attributes']['class'] = ['btn-primary', 'btn-filled btn-small', 'dpl-button']; } /** @@ -243,6 +292,10 @@ function dpl_admin_form_alter(array &$form, FormStateInterface $form_state, stri if (in_array($form_id, ['node_page_form', 'node_page_edit_form'])) { _dpl_admin_form_alter_node_page($form, $form_state, $form_id); } + + if (in_array($form_id, ['user_register_form', 'user_form'])) { + _dpl_admin_form_alter_user_form($form, $form_state, $form_id); + } } /** diff --git a/web/modules/custom/dpl_event/dpl_event.install b/web/modules/custom/dpl_event/dpl_event.install index 2917df63b5..c68ec473d7 100644 --- a/web/modules/custom/dpl_event/dpl_event.install +++ b/web/modules/custom/dpl_event/dpl_event.install @@ -6,6 +6,8 @@ */ use Drupal\Core\Field\BaseFieldDefinition; +use Drupal\dpl_event\Form\SettingsForm; +use Drupal\dpl_event\Workflows\UnpublishSchedule; use Drupal\drupal_typed\DrupalTyped; use Drupal\field\Entity\FieldConfig; use Drupal\field\Entity\FieldStorageConfig; @@ -18,6 +20,7 @@ use Drupal\locale\StringDatabaseStorage; function dpl_event_install(): void { _dpl_event_create_mock_title(); _dpl_event_add_weekday_translations(); + _dpl_event_set_scheduler_settings(); } /** @@ -67,6 +70,45 @@ function dpl_event_update_10004(): string { return _dpl_event_add_weekday_translations(); } +/** + * Set default values of event-unpublishing-schedule settings, and re-schedule. + */ +function dpl_event_update_10005(): string { + return _dpl_event_set_scheduler_settings(); +} + +/** + * Set default values of event-unpublishing-schedule settings, and re-schedule. + */ +function _dpl_event_set_scheduler_settings(): string { + $config_name = SettingsForm::CONFIG_NAME; + + $config = \Drupal::configFactory()->getEditable($config_name); + + $existing_schedule = $config->get('unpublish_schedule'); + + // If we have no existing schedule set, set it as default to 6 hours. + $schedule_time = !empty($existing_schedule) ? $existing_schedule : 21600; + + // If no schedule is set already, we'll disable the setting. + $unpublish_enable = ($existing_schedule != 0); + + $config->set('unpublish_schedule', $schedule_time); + $config->set('unpublish_enable', $unpublish_enable); + + // This was originally enabled for all sites, but as we no longer recommend + // it, we'll set the default to false. + // The libraries will be informed of this in the changelog. + $config->set('unpublish_series_enable', FALSE); + + $config->save(); + + $unpublish_scheduler = DrupalTyped::service(UnpublishSchedule::class, 'dpl_event.unpublish_schedule'); + $count = $unpublish_scheduler->rescheduleAll(); + + return "Enabled new unpublishing settings. $count events has been rescheduled."; +} + /** * Add a mock title field to eventinstance, to fix entity reference fields. * diff --git a/web/modules/custom/dpl_event/dpl_event.module b/web/modules/custom/dpl_event/dpl_event.module index 4c319f3466..73d129d506 100644 --- a/web/modules/custom/dpl_event/dpl_event.module +++ b/web/modules/custom/dpl_event/dpl_event.module @@ -8,15 +8,29 @@ use Drupal\Core\Datetime\DrupalDateTime; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\FieldableEntityInterface; +use Drupal\Core\Entity\Query\QueryInterface; +use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Url; +use Drupal\dpl_event\Entity\EventInstance; use Drupal\dpl_event\EventState; -use Drupal\dpl_event\EventWrapper; +use Drupal\dpl_event\Form\SettingsForm; +use Drupal\dpl_event\ReoccurringDateFormatter; use Drupal\dpl_event\Workflows\OccurredSchedule; use Drupal\dpl_event\Workflows\UnpublishSchedule; use Drupal\drupal_typed\DrupalTyped; -use Drupal\recurring_events\Entity\EventInstance; use Drupal\recurring_events\Entity\EventSeries; -use Safe\DateTime; + +/** + * Implements hook_entity_bundle_info_alter(). + * + * @param mixed[] $bundles + * Bundle info for altering. + */ +function dpl_event_entity_bundle_info_alter(array &$bundles): void { + if (isset($bundles['eventinstance']['default'])) { + $bundles['eventinstance']['default']['class'] = EventInstance::class; + } +} /** * Implements hook_cron_job_scheduler_info(). @@ -43,7 +57,7 @@ function dpl_event_eventinstance_insert(EntityInterface $entity): void { return; } - (new EventWrapper($entity))->isActive() && $occurred_schedule->scheduleOccurred($entity); + $entity->isActive() && $occurred_schedule->scheduleOccurred($entity); $unpublish_schedule->scheduleUnpublication($entity); } @@ -56,15 +70,15 @@ function dpl_event_eventinstance_update(EntityInterface $entity): void { if (!$entity instanceof EventInstance) { return; } - $updated_event = new EventWrapper($entity); + if (isset($entity->original) && $entity->original instanceof EventInstance) { // If there are no changes to the date then skip updating schedules. - if ($updated_event->hasSameDate($entity->original)) { + if ($entity->hasSameDate($entity->original)) { return; } } - $updated_event->isActive() && $occurred_schedule->scheduleOccurred($entity); + $entity->isActive() && $occurred_schedule->scheduleOccurred($entity); $unpublish_schedule->scheduleUnpublication($entity); } @@ -92,8 +106,7 @@ function dpl_event_preprocess_field(array &$variables): void { return; } - $event_wrapper = new EventWrapper($entity); - $event_state = $event_wrapper->getState(); + $event_state = $entity->getState(); // Check if the event state is valid. If not, return early. if (!($event_state instanceof EventState)) { @@ -182,30 +195,23 @@ function dpl_event_preprocess_eventseries(array &$variables): void { return; } - $variables['formatted_date'] = - \Drupal::service('dpl_event.reoccurring_date_formatter') - ->getSeriesDateString($event_series); + $service = DrupalTyped::service(ReoccurringDateFormatter::class, 'dpl_event.reoccurring_date_formatter'); + $upcoming_ids = $service->getUpcomingEventIds($event_series); + + $variables['formatted_date'] = $service->getSeriesDateString($event_series); - if ($event_series->getInstanceCount() < 2) { + if (count($upcoming_ids) < 2) { return; } - // Load event instances & filter out past events. - $eventinstances_in_series = $event_series->get('event_instances')->referencedEntities(); - $current_date = (new DateTime())->setTime(0, 0, 0); - - $eventinstances_in_series_filtered = array_filter($eventinstances_in_series, function ($eventInstance) use ($current_date) { - $event_start_date = new DateTime($eventInstance->get('date')->start_date); - return $event_start_date >= $current_date; - }); - - $eventinstances_in_series_filtered = array_values($eventinstances_in_series_filtered); - + $instance_storage = \Drupal::entityTypeManager()->getStorage('eventinstance'); + $event_instances = $instance_storage->loadMultiple($upcoming_ids); $viewBuilder = \Drupal::entityTypeManager()->getViewBuilder('eventinstance'); $variables['event_instances'] = []; - foreach ($eventinstances_in_series_filtered as $index => $eventInstance) { - $viewMode = $index === 0 ? 'list_teaser_stacked_parent' : 'stacked_event'; - $renderable_instance = $viewBuilder->view($eventInstance, $viewMode); + + foreach ($event_instances as $index => $event_instance) { + $view_mode = $index === 0 ? 'list_teaser_stacked_parent' : 'stacked_event'; + $renderable_instance = $viewBuilder->view($event_instance, $view_mode); $variables['event_instances'][] = $renderable_instance; } @@ -266,6 +272,7 @@ function dpl_event_preprocess_eventinstance(array &$variables): void { $variables['datetime_attribute'] = $date_formatter->format($start_time->getTimestamp(), DATE_ATOM); } if ($end_time instanceof DrupalDateTime) { + $variables['expired'] = ($end_time->getTimestamp() < \Drupal::time()->getCurrentTime()); $variables['end_time'] = $date_formatter->format($end_time->getTimestamp(), 'custom', 'H:i'); } } @@ -287,3 +294,53 @@ function dpl_event_gin_content_form_routes() : array { 'entity.eventinstance.edit_form', ]; } + +/** + * Implements hook_entity_query_TAG_alter(). + * + * Deny access to the screen name vocabulary when the feature is disabled. + * + * This is to totally hide the vocabulary when the feature is disabled. + * + * hook_entity_query_TAG_alter() is the way to hook into `accessCheck(TRUE)`. + */ +function dpl_event_entity_query_taxonomy_vocabulary_alter(QueryInterface $query): void { + if (!\Drupal::config(SettingsForm::CONFIG_NAME)->get('enable_screen_name')) { + $query->condition('vid', 'screen_name', '<>'); + } +} + +/** + * Implements hook_form_alter(). + * + * Alter event forms to hide screen names when the feature is disabled. + */ +function dpl_event_form_alter(array &$form, FormStateInterface $form_state, string $form_id): void { + $forms = [ + 'eventseries_default_edit_form', + 'eventseries_default_add_form', + 'eventinstance_default_edit_form', + 'eventinstance_default_add_form', + ]; + if (!in_array($form_id, $forms)) { + return; + } + + if (!isset($form['field_screen_names'])) { + return; + } + + // Undo select2s adding of help text. + if (isset($form['field_screen_names']['widget']['#description']) && + is_array($form['field_screen_names']['widget']['#description']) && + is_array($form['field_screen_names']['widget']['#description']['#items'])) { + $form['field_screen_names']['widget']['#description'] = + $form['field_screen_names']['widget']['#description']['#items'][0]; + } + + if (\Drupal::config(SettingsForm::CONFIG_NAME)->get('enable_screen_name')) { + return; + } + + $form['field_screen_names']['#access'] = FALSE; +} diff --git a/web/modules/custom/dpl_event/dpl_event.services.yml b/web/modules/custom/dpl_event/dpl_event.services.yml index 4a47f1a01e..55e44bee02 100644 --- a/web/modules/custom/dpl_event/dpl_event.services.yml +++ b/web/modules/custom/dpl_event/dpl_event.services.yml @@ -45,6 +45,9 @@ services: - { name: access_check, applies_to: _access_event_series_instances_tab } dpl_event.event_series_redirect: class: Drupal\dpl_event\EventSubscriber\EventSeriesRedirect + arguments: + - '@entity_type.manager' + - '@dpl_event.reoccurring_date_formatter' tags: - { name: event_subscriber } dpl_event.event_instance_edit_redirect: diff --git a/web/modules/custom/dpl_event/src/EventWrapper.php b/web/modules/custom/dpl_event/src/Entity/EventInstance.php similarity index 83% rename from web/modules/custom/dpl_event/src/EventWrapper.php rename to web/modules/custom/dpl_event/src/Entity/EventInstance.php index 58c1011a8f..c014a240b7 100644 --- a/web/modules/custom/dpl_event/src/EventWrapper.php +++ b/web/modules/custom/dpl_event/src/Entity/EventInstance.php @@ -1,33 +1,21 @@ getStartDate() == $otherWrapper->getStartDate() && - $this->getEndDate() == $otherWrapper->getEndDate(); + public function hasSameDate(EventInstance $other): bool { + return $this->getStartDate() == $other->getStartDate() && + $this->getEndDate() == $other->getEndDate(); } /** @@ -74,7 +61,7 @@ public function hasSameDate(EventInstance $otherEvent): bool { * The part of the date to get. */ private function getDate(string $value): \DateTimeInterface { - $event_date = $this->event->get('date')->get(0); + $event_date = $this->get('date')->get(0); if (!$event_date) { throw new \LogicException("Unable to retrieve date from event instance"); } @@ -109,7 +96,7 @@ public function getBranches(): ?array { */ public function getDescription(): ?string { /** @var \Drupal\paragraphs\ParagraphInterface[] $paragraphs */ - $paragraphs = $this->event->get('event_paragraphs')->referencedEntities(); + $paragraphs = $this->get('event_paragraphs')->referencedEntities(); foreach ($paragraphs as $paragraph) { if ($paragraph->bundle() === 'text_body') { @@ -120,6 +107,25 @@ public function getDescription(): ?string { return NULL; } + /** + * Getting associated screen names. + * + * @return string[] + * The screen names. + */ + public function getScreenNames(): array { + $names = []; + + /** @var \Drupal\taxonomy\TermInterface[] $screens */ + $screens = $this->get('event_screen_names')->referencedEntities(); + + foreach ($screens as $screen) { + $names[] = $screen->getName(); + } + + return $names; + } + /** * Get the EventState object of an eventinstance. */ @@ -204,9 +210,9 @@ public function isFreeToAttend(): bool { * which ever is newer. */ public function getUpdatedDate(): ?DateTime { - $series = $this->event->getEventSeries(); + $series = $this->getEventSeries(); - $changed_instance = $this->event->getChangedTime(); + $changed_instance = $this->getChangedTime(); $changed_series = $series->getChangedTime(); // Setting the timestamp to whichever is the larger. @@ -231,8 +237,8 @@ public function getUpdatedDate(): ?DateTime { */ public function getField(string $field_name): ?FieldItemListInterface { // First, let's look up the custom field - does it already have a value? - if ($this->event->hasField($field_name)) { - $field = $this->event->get($field_name); + if ($this->hasField($field_name)) { + $field = $this->get($field_name); if (!$field->isEmpty()) { return $field; diff --git a/web/modules/custom/dpl_event/src/EventSubscriber/EventSeriesRedirect.php b/web/modules/custom/dpl_event/src/EventSubscriber/EventSeriesRedirect.php index ae23154cec..8487e297d4 100644 --- a/web/modules/custom/dpl_event/src/EventSubscriber/EventSeriesRedirect.php +++ b/web/modules/custom/dpl_event/src/EventSubscriber/EventSeriesRedirect.php @@ -2,6 +2,8 @@ namespace Drupal\dpl_event\EventSubscriber; +use Drupal\Core\Entity\EntityTypeManagerInterface; +use Drupal\dpl_event\ReoccurringDateFormatter; use Drupal\recurring_events\Entity\EventInstance; use Drupal\recurring_events\Entity\EventSeries; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -10,25 +12,43 @@ use Symfony\Component\HttpKernel\KernelEvents; /** - * Redirects requests for single instance event series to that instance. + * Redirect to AND from eventseries, depending on the situation. + * + * - If accessing an eventseries with a single active instance, redirect to + * that instance + * - If failing to access an unpublished eventinstance, redirect to the + * parent series. * * @package Drupal\dpl_event\EventSubscriber */ class EventSeriesRedirect implements EventSubscriberInterface { + /** + * {@inheritdoc} + */ + public function __construct( + private EntityTypeManagerInterface $entityTypeManager, + private ReoccurringDateFormatter $reoccurringDateFormatter, + ) {} + /** * {@inheritdoc} */ public static function getSubscribedEvents(): array { return [ - KernelEvents::REQUEST => 'checkEventSeriesRedirect', + KernelEvents::REQUEST => [ + ['checkEventSeriesRedirect'], + ], + // Only target users that end up on an unpublished eventinstance page, + // without being allowed to see it. + KernelEvents::EXCEPTION => [ + ['checkEventInstanceRedirect'], + ], ]; } /** - * Redirects the visit to an event series to the event instance if there is. - * - * Only one instance. + * Redirects the visit to an event series to the event instance if only 1. * * This is necessary because if a user visits an event series page, but there * is only one instance in the series, they should be redirected to the event @@ -39,20 +59,56 @@ public static function getSubscribedEvents(): array { * The request event. */ public function checkEventSeriesRedirect(RequestEvent $event): void { - $request = $event->getRequest(); $route_name = $request->attributes->get('_route'); - $eventSeries = $request->attributes->get('eventseries'); + $event_series = $request->attributes->get('eventseries'); - if ($route_name !== 'entity.eventseries.canonical' || !$eventSeries instanceof EventSeries || $eventSeries->getInstanceCount() > 1) { + if ($route_name !== 'entity.eventseries.canonical' || !$event_series instanceof EventSeries) { return; } - $eventInstances = $eventSeries->get('event_instances')->referencedEntities(); - if (count($eventInstances) === 1 && $eventInstances[0] instanceof EventInstance) { - $response = new RedirectResponse($eventInstances[0]->toUrl()->toString()); + $upcoming_ids = $this->reoccurringDateFormatter->getUpcomingEventIds($event_series); + + // Only redirect, if we can find a single eventinstance - otherwise, we + // want to stay on the series display. + if (count($upcoming_ids) != 1) { + return; + } + + $event_instance_id = reset($upcoming_ids); + $event_instance = $this->entityTypeManager->getStorage('eventinstance')->load($event_instance_id); + + if ($event_instance instanceof EventInstance) { + $response = new RedirectResponse($event_instance->toUrl()->toString()); $event->setResponse($response); } } + /** + * Redirect unpublished eventinstances to eventseries. + * + * @param \Symfony\Component\HttpKernel\Event\RequestEvent $event + * The response event. + */ + public function checkEventInstanceRedirect(RequestEvent $event): void { + $request = $event->getRequest(); + + if ($request->attributes->get('_route') !== 'entity.eventinstance.canonical') { + return; + } + + $event_instance = $request->attributes->get('eventinstance'); + + if (!($event_instance instanceof EventInstance) || $event_instance->isPublished()) { + return; + } + + // At this stage, we know we're on an unpublished eventinstance. + // Look up the eventseries, and redirect to it. + $event_series = $event_instance->getEventSeries(); + + $response = new RedirectResponse($event_series->toUrl()->toString()); + $event->setResponse($response); + } + } diff --git a/web/modules/custom/dpl_event/src/Form/SettingsForm.php b/web/modules/custom/dpl_event/src/Form/SettingsForm.php index f7c2e63a2c..14fe149c18 100644 --- a/web/modules/custom/dpl_event/src/Form/SettingsForm.php +++ b/web/modules/custom/dpl_event/src/Form/SettingsForm.php @@ -72,12 +72,21 @@ public function buildForm(array $form, FormStateInterface $form_state): array { ], ]; + $form['enable_screen_name'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Enable screen names'), + '#default_value' => $config->get('enable_screen_name'), + '#description' => $this->t('Enable screen names on events. Requires an external system to actually fetch and display the events on real physical screens.'), + ]; + $form['unpublish'] = [ '#type' => 'fieldset', '#title' => $this->t('Automatic unpublication', [], ['context' => 'DPL event']), ]; $period = [ + // 1 hour + 3600, // 6 hours 21600, // 12 hours @@ -98,14 +107,66 @@ public function buildForm(array $form, FormStateInterface $form_state): array { 15552000, ]; $period = array_map([$this->dateFormatter, 'formatInterval'], array_combine($period, $period)); + + $form['unpublish']['unpublish_enable'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Unpublish eventinstances when they have occured (recommended)', [], ['context' => 'DPL event']), + '#default_value' => $config->get('unpublish_enable'), + ]; + + $form['unpublish']['unpublish_disable_warning'] = [ + '#type' => 'container', + // js-form-wrapper is important - otherwise, Drupal states will not work. + '#prefix' => '
', + '#markup' => $this->t('Notice - if you do not choose that eventinstances get unpublished, they may show up in automatic and manual lists, across the site.', [], ['context' => 'DPL event']), + '#suffix' => '
', + '#states' => [ + 'visible' => [ + ':input[name="unpublish_enable"]' => ['checked' => FALSE], + ], + ], + ]; + $form['unpublish']['unpublish_schedule'] = [ '#type' => 'select', - '#title' => $this->t('Schedule', [], ['context' => "DPL event"]), + '#title' => $this->t('How much time should pass after an eventinstance has occurred before it should be unpublished?', [], ['context' => "DPL event"]), '#default_value' => $config->get('unpublish_schedule'), '#options' => $period, - '#empty_option' => $this->t('Automatic unpublication disabled', [], ['context' => "DPL event"]), - '#empty_value' => 0, - '#description' => $this->t('How much time should pass after an event has occurred before it should be unpublished automatically.', [], ['context' => "DPL event"]), + '#states' => [ + 'visible' => [ + ':input[name="unpublish_enable"]' => ['checked' => TRUE], + ], + ], + ]; + + $form['unpublish']['unpublish_series_enable'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Unpublish the series when all instances have occurred (not recommended)', [], ['context' => "DPL event"]), + '#default_value' => $config->get('unpublish_series_enable'), + // Only display the field when unpublish schedule has a non-0 value. + '#states' => [ + 'visible' => [ + ':input[name="unpublish_enable"]' => ['checked' => TRUE], + ], + ], + ]; + + $form['unpublish']['unpublish_series_enable_warning'] = [ + '#type' => 'container', + // js-form-wrapper is important - otherwise, Drupal states will not work. + '#prefix' => '
', + '#markup' => $this->t('Notice - if series get unpublished, old instance links will no longer work. If you however keep the series published, expired instances will redirect to the associated series.', [], ['context' => 'DPL event']), + '#suffix' => '
', + '#states' => [ + 'visible' => [ + ':input[name="unpublish_enable"]' => ['checked' => TRUE], + // PHPCS doesn't understand Drupal's weird way of doing states. + // phpcs:disable Squiz.Arrays.ArrayDeclaration.NoKeySpecified + 'and', + // phpcs:enable Squiz.Arrays.ArrayDeclaration.NoKeySpecified + ':input[name="unpublish_series_enable"]' => ['checked' => TRUE], + ], + ], ]; return parent::buildForm($form, $form_state); @@ -117,7 +178,10 @@ public function buildForm(array $form, FormStateInterface $form_state): array { public function submitForm(array &$form, FormStateInterface $form_state): void { $this->config(self::CONFIG_NAME) ->set('price_currency', $form_state->getValue('price_currency')) + ->set('unpublish_enable', $form_state->getValue('unpublish_enable')) ->set('unpublish_schedule', $form_state->getValue('unpublish_schedule')) + ->set('unpublish_series_enable', $form_state->getValue('unpublish_series_enable')) + ->set('enable_screen_name', $form_state->getValue('enable_screen_name')) ->save(); parent::submitForm($form, $form_state); diff --git a/web/modules/custom/dpl_event/src/Plugin/rest/resource/v1/EventResource.php b/web/modules/custom/dpl_event/src/Plugin/rest/resource/v1/EventResource.php index 63d9bcd4bf..f9e3045ebc 100644 --- a/web/modules/custom/dpl_event/src/Plugin/rest/resource/v1/EventResource.php +++ b/web/modules/custom/dpl_event/src/Plugin/rest/resource/v1/EventResource.php @@ -5,8 +5,8 @@ use DanskernesDigitaleBibliotek\CMS\Api\Model\EventPATCHRequest; use DanskernesDigitaleBibliotek\CMS\Api\Model\EventPATCHRequestExternalData; use Drupal\Component\Utility\NestedArray; +use Drupal\dpl_event\Entity\EventInstance; use Drupal\dpl_event\EventState; -use Drupal\recurring_events\Entity\EventInstance; use Symfony\Component\HttpFoundation\Exception\BadRequestException; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; diff --git a/web/modules/custom/dpl_event/src/Plugin/rest/resource/v1/EventsResource.php b/web/modules/custom/dpl_event/src/Plugin/rest/resource/v1/EventsResource.php index af9555ac95..21701bdb29 100644 --- a/web/modules/custom/dpl_event/src/Plugin/rest/resource/v1/EventsResource.php +++ b/web/modules/custom/dpl_event/src/Plugin/rest/resource/v1/EventsResource.php @@ -6,8 +6,8 @@ use Drupal\Core\Cache\CacheableMetadata; use Drupal\Core\Cache\CacheableResponse; use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface; +use Drupal\dpl_event\Entity\EventInstance; use Drupal\drupal_typed\RequestTyped; -use Drupal\recurring_events\Entity\EventInstance; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; @@ -245,6 +245,14 @@ public function getPluginDefinition(): array { ], ], ], + 'screen_names' => [ + 'type' => 'array', + 'description' => 'The screens this event should be shown on.', + 'items' => [ + 'type' => 'string', + 'description' => 'A screen name.', + ], + ], ], 'required' => ['uuid', 'title', 'created_at', 'updated_at', 'url', 'state', 'date_time'], ], diff --git a/web/modules/custom/dpl_event/src/ReoccurringDateFormatter.php b/web/modules/custom/dpl_event/src/ReoccurringDateFormatter.php index de78e641f3..79abeb1ebe 100644 --- a/web/modules/custom/dpl_event/src/ReoccurringDateFormatter.php +++ b/web/modules/custom/dpl_event/src/ReoccurringDateFormatter.php @@ -90,19 +90,12 @@ public function getSeriesDateString(EventSeries $event_series): string|null { } /** - * Retrieves the upcoming event details for a given event series. - * - * @param \Drupal\recurring_events\Entity\EventSeries $event_series - * The event series object. + * Finding the IDs of all events that are in the future. * - * @return null|array{'start': \Drupal\Core\Datetime\DrupalDateTime, 'end': \Drupal\Core\Datetime\DrupalDateTime, 'upcoming_ids': array} - * An array containing the following keys: - * - start: The start date of the upcoming event as a DrupalDateTime object. - * - end: The end date of the upcoming event as a DrupalDateTime object. - * - upcoming_ids: An array of upcoming event instance IDs. - * Returns NULL if the start and end dates are not found. + * @return array + * An array of matching eventinstance IDs. */ - public function getUpcomingEventDetails(EventSeries $event_series): array|null { + public function getUpcomingEventIds(EventSeries $event_series): array { $date = new DrupalDateTime(); $formatted = $date->format(DateTimeItemInterface::DATETIME_STORAGE_FORMAT); @@ -113,12 +106,28 @@ public function getUpcomingEventDetails(EventSeries $event_series): array|null { ->condition('eventseries_id', $event_series->id()) ->condition('date.value', $formatted, '>=') ->accessCheck(TRUE) + ->condition('status', TRUE) ->sort('date.value', 'ASC') ->execute(); - if (empty($upcoming_ids)) { - return NULL; - } + return $upcoming_ids; + } + + /** + * Retrieves the upcoming event details for a given event series. + * + * @param \Drupal\recurring_events\Entity\EventSeries $event_series + * The event series object. + * + * @return null|array{'start': \Drupal\Core\Datetime\DrupalDateTime, 'end': \Drupal\Core\Datetime\DrupalDateTime, 'upcoming_ids': array} + * An array containing the following keys: + * - start: The start date of the upcoming event as a DrupalDateTime object. + * - end: The end date of the upcoming event as a DrupalDateTime object. + * - upcoming_ids: An array of upcoming event instance IDs. + * Returns NULL if the start and end dates are not found. + */ + public function getUpcomingEventDetails(EventSeries $event_series): array|null { + $upcoming_ids = $this->getUpcomingEventIds($event_series); // Load the first event instance - the remaining IDs are useful later on, // when we want to check if it is alone or not. @@ -141,10 +150,16 @@ public function getUpcomingEventDetails(EventSeries $event_series): array|null { /** @var \Drupal\datetime_range\Plugin\Field\FieldType\DateRangeItem $event_instance_date */ $event_instance_date = $event_instance->get('date')->first(); + /** @var \Drupal\Core\Datetime\DrupalDateTime $start_date */ + $start_date = $event_instance_date->get('start_date')->getValue(); + + /** @var \Drupal\Core\Datetime\DrupalDateTime $end_date */ + $end_date = $event_instance_date->get('end_date')->getValue(); + // Return the dates, and the related IDs. return [ - 'start' => $event_instance_date->get('start_date')->getValue(), - 'end' => $event_instance_date->get('end_date')->getValue(), + 'start' => $start_date, + 'end' => $end_date, 'upcoming_ids' => $upcoming_ids, ]; } diff --git a/web/modules/custom/dpl_event/src/Services/EventRestMapper.php b/web/modules/custom/dpl_event/src/Services/EventRestMapper.php index fef806c268..b4270618da 100644 --- a/web/modules/custom/dpl_event/src/Services/EventRestMapper.php +++ b/web/modules/custom/dpl_event/src/Services/EventRestMapper.php @@ -13,12 +13,11 @@ use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\File\FileUrlGeneratorInterface; -use Drupal\dpl_event\EventWrapper; +use Drupal\dpl_event\Entity\EventInstance; use Drupal\dpl_event\Form\SettingsForm; use Drupal\file\FileInterface; use Drupal\media\MediaInterface; use Drupal\paragraphs\ParagraphInterface; -use Drupal\recurring_events\Entity\EventInstance; use Safe\DateTime; /** @@ -26,11 +25,6 @@ */ class EventRestMapper { - /** - * EventWrapper, a suite of eventinstance helper methods. - */ - private EventWrapper $eventWrapper; - /** * The eventinstance. */ @@ -49,7 +43,6 @@ public function __construct( */ public function getResponse(EventInstance $event_instance): EventsGET200ResponseInner { $this->event = $event_instance; - $this->eventWrapper = new EventWrapper($this->event); return new EventsGET200ResponseInner([ 'title' => $this->getValue('title'), @@ -57,8 +50,8 @@ public function getResponse(EventInstance $event_instance): EventsGET200Response 'url' => $this->event->toUrl()->setAbsolute(TRUE)->toString(TRUE)->getGeneratedUrl(), 'ticketManagerRelevance' => !empty($this->getSeriesValue('field_relevant_ticket_manager')), 'description' => $this->getValue('event_description'), - 'body' => $this->eventWrapper->getDescription(), - 'state' => $this->eventWrapper->getState()?->value, + 'body' => $this->event->getDescription(), + 'state' => $this->event->getState()?->value, 'image' => $this->getImage(), 'branches' => $this->getBranches(), 'address' => $this->getAddress(), @@ -67,12 +60,13 @@ public function getResponse(EventInstance $event_instance): EventsGET200Response 'ticketCapacity' => $this->getValue('event_ticket_capacity'), 'ticketCategories' => $this->getTicketCategories(), 'createdAt' => $this->getDateField('created'), - 'updatedAt' => $this->eventWrapper->getUpdatedDate(), + 'updatedAt' => $this->event->getUpdatedDate(), 'dateTime' => $this->getDate(), 'externalData' => $this->getExternalData(), 'series' => new EventsGET200ResponseInnerSeries([ 'uuid' => $this->event->getEventSeries()->uuid(), ]), + 'screenNames' => $this->event->getScreenNames(), ]); } @@ -85,7 +79,7 @@ public function getResponse(EventInstance $event_instance): EventsGET200Response private function getBranches(): array { $names = []; - $branches = $this->eventWrapper->getBranches() ?? []; + $branches = $this->event->getBranches() ?? []; foreach ($branches as $branch) { $label = $branch->getTitle(); @@ -131,7 +125,7 @@ private function getExternalData(): EventPATCHRequestExternalData { * Helper, getting the event instance date in correct format. */ private function getDate(): ?EventsGET200ResponseInnerDateTime { - $field = $this->eventWrapper->getField('date'); + $field = $this->event->getField('date'); if (!($field instanceof FieldItemListInterface)) { return NULL; @@ -169,7 +163,7 @@ private function getTicketCategories(): array { $categories = []; - $field = $this->eventWrapper->getField('event_ticket_categories'); + $field = $this->event->getField('event_ticket_categories'); if (!($field instanceof FieldItemListInterface)) { return $categories; @@ -260,7 +254,7 @@ private function getDateField(string $field_name): ?DateTime { * An array of string values. */ private function getMultiValue(string $field_name): array { - $field = $this->eventWrapper->getField($field_name); + $field = $this->event->getField($field_name); if (!($field instanceof FieldItemListInterface)) { return []; @@ -277,7 +271,7 @@ private function getMultiValue(string $field_name): array { */ private function getValue(string $field_name): ?string { - $field = $this->eventWrapper->getField($field_name); + $field = $this->event->getField($field_name); if (!($field instanceof FieldItemListInterface)) { return NULL; @@ -313,7 +307,7 @@ private function getSeriesValue(string $field_name): ?string { * Get the event image, loading the file and generating the original URL. */ private function getImage(): ?EventsGET200ResponseInnerImage { - $media_field = $this->eventWrapper->getField('event_image'); + $media_field = $this->event->getField('event_image'); if (!($media_field instanceof FieldItemListInterface)) { return NULL; diff --git a/web/modules/custom/dpl_event/src/Workflows/OccurredSchedule.php b/web/modules/custom/dpl_event/src/Workflows/OccurredSchedule.php index 224fe95d05..0874c66d45 100644 --- a/web/modules/custom/dpl_event/src/Workflows/OccurredSchedule.php +++ b/web/modules/custom/dpl_event/src/Workflows/OccurredSchedule.php @@ -3,11 +3,10 @@ namespace Drupal\dpl_event\Workflows; use Drupal\Component\Datetime\TimeInterface; +use Drupal\dpl_event\Entity\EventInstance; use Drupal\dpl_event\EventState; -use Drupal\dpl_event\EventWrapper; use Drupal\job_scheduler\Entity\JobSchedule; use Drupal\job_scheduler\JobSchedulerInterface; -use Drupal\recurring_events\Entity\EventInstance; use Drupal\recurring_events\EventInstanceStorageInterface; use Psr\Log\LoggerInterface; @@ -50,7 +49,7 @@ public function callback(JobSchedule $job): void { if (!$event || !$event instanceof EventInstance) { return; } - if ((new EventWrapper($event))->isActive()) { + if ($event->isActive()) { $event->set("field_event_state", EventState::Occurred); $event->save(); } @@ -61,7 +60,7 @@ public function callback(JobSchedule $job): void { */ public function scheduleOccurred(EventInstance $event): void { $nowTimestamp = $this->time->getCurrentTime(); - $eventEndDate = (new EventWrapper($event))->getEndDate(); + $eventEndDate = $event->getEndDate(); $job = [ 'name' => self::JOB_SCHEDULE_NAME, diff --git a/web/modules/custom/dpl_event/src/Workflows/UnpublishSchedule.php b/web/modules/custom/dpl_event/src/Workflows/UnpublishSchedule.php index 72f0c885ca..b64bd05c2d 100644 --- a/web/modules/custom/dpl_event/src/Workflows/UnpublishSchedule.php +++ b/web/modules/custom/dpl_event/src/Workflows/UnpublishSchedule.php @@ -7,11 +7,10 @@ use Drupal\Component\Datetime\TimeInterface; use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Logger\LoggerChannelInterface; -use Drupal\dpl_event\EventWrapper; +use Drupal\dpl_event\Entity\EventInstance; use Drupal\dpl_event\Form\SettingsForm; use Drupal\job_scheduler\Entity\JobSchedule; use Drupal\job_scheduler\JobSchedulerInterface; -use Drupal\recurring_events\Entity\EventInstance; use Drupal\recurring_events\EventInstanceStorageInterface; /** @@ -50,6 +49,17 @@ public function getSchedule(): array { * Callback to execute scheduled unpublication. */ public function callback(JobSchedule $job): void { + $config = $this->configFactory->get(SettingsForm::CONFIG_NAME); + + $enabled = (boolean) $config->get('unpublish_enable'); + + // If the automatic unpublication is disabled, we will skip past this job. + // This should technically not happen, as updating the settings will trigger + // rescheduleAll() on all eventinstances, but this is a nice fallback. + if (!$enabled) { + return; + } + $event = $this->eventInstanceStorage->load($job->getId()); if (!$event || !$event instanceof EventInstance) { throw new \UnexpectedValueException("Unable to load event instance {$job->getId()} for automatic unpublication"); @@ -57,14 +67,26 @@ public function callback(JobSchedule $job): void { $event->setUnpublished()->save(); - // If all instances in the series are unpublished then also unpublish the - // series. + // Detect if site wishes series to be unpublished when all instances are + // unpublished. + $seriesUnpublishingEnabled = (boolean) $config->get('unpublish_series_enable'); + + if (!$seriesUnpublishingEnabled) { + return; + } + + // Count the number of published eventinstances, and if it is 0, unpublish + // the series. $eventSeries = $event->getEventSeries(); - $allEventInstances = $eventSeries->get('event_instances')->referencedEntities(); - $publishedInstances = array_filter($allEventInstances, function (EventInstance $event) { - return $event->isPublished(); - }); - if (empty($publishedInstances)) { + + $publishedEventInstanceIds = ($this->eventInstanceStorage->getQuery()) + ->accessCheck(FALSE) + ->condition('eventseries_id', $eventSeries->id()) + ->condition('status', 1) + ->count() + ->execute(); + + if (empty($publishedEventInstanceIds)) { $eventSeries->setUnpublished()->save(); } } @@ -74,10 +96,11 @@ public function callback(JobSchedule $job): void { */ public function scheduleUnpublication(EventInstance $event): void { $config = $this->configFactory->get(SettingsForm::CONFIG_NAME); + $enabled = (boolean) $config->get('unpublish_enable'); $schedule = (int) $config->get('unpublish_schedule'); $now_timestamp = $this->time->getCurrentTime(); - $event_end_date = (new EventWrapper($event))->getEndDate(); + $event_end_date = $event->getEndDate(); $unpublication_date = (\DateTimeImmutable::createFromInterface($event_end_date))->modify("+{$schedule} seconds"); $unpublication_timestamp = $unpublication_date->getTimestamp(); @@ -94,9 +117,10 @@ public function scheduleUnpublication(EventInstance $event): void { // Remove any preexisting job with the same name, type and id. $this->jobScheduler->remove($job); + // If automatic unpublication is enabled and needed then schedule a new // unpublication. - if ($schedule > 0 && $event->isPublished()) { + if ($enabled && $schedule > 0 && $event->isPublished()) { $this->jobScheduler->set($job); $this->logger->debug( @@ -109,22 +133,24 @@ public function scheduleUnpublication(EventInstance $event): void { /** * Reschedule all event instances for unpublication. * - * This will update schedules for all events even those that where not + * This will update schedules for all events even those that were not * scheduled in the past. */ - public function rescheduleAll(): void { + public function rescheduleAll(): int { $this->jobScheduler->removeAll(self::JOB_SCHEDULE_NAME, self::JOB_SCHEDULE_TYPE); $publishedEventInstanceIds = ($this->eventInstanceStorage->getQuery()) ->accessCheck(FALSE) ->condition('status', 1) ->execute(); - /** @var \Drupal\recurring_events\Entity\EventInstance[] $publishedEventInstances */ + /** @var \Drupal\dpl_event\Entity\EventInstance[] $publishedEventInstances */ $publishedEventInstances = $this->eventInstanceStorage->loadMultiple($publishedEventInstanceIds); array_walk($publishedEventInstances, function (EventInstance $event) { $this->scheduleUnpublication($event); }); + + return count($publishedEventInstanceIds); } } diff --git a/web/modules/custom/dpl_redia_legacy/src/Controller/RssFeeds/EventsController.php b/web/modules/custom/dpl_redia_legacy/src/Controller/RssFeeds/EventsController.php index 0f2b24f13b..31b4a64676 100644 --- a/web/modules/custom/dpl_redia_legacy/src/Controller/RssFeeds/EventsController.php +++ b/web/modules/custom/dpl_redia_legacy/src/Controller/RssFeeds/EventsController.php @@ -77,7 +77,7 @@ private function getItems(): array { ->sort('date.value'); $ids = $query->execute(); - /** @var \Drupal\recurring_events\Entity\EventInstance[] $events */ + /** @var \Drupal\dpl_event\Entity\EventInstance[] $events */ $events = $storage->loadMultiple($ids); $items = []; diff --git a/web/modules/custom/dpl_redia_legacy/src/RediaEvent.php b/web/modules/custom/dpl_redia_legacy/src/RediaEvent.php index 1d6ff2ed1b..e55aac0d66 100644 --- a/web/modules/custom/dpl_redia_legacy/src/RediaEvent.php +++ b/web/modules/custom/dpl_redia_legacy/src/RediaEvent.php @@ -5,10 +5,9 @@ use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Datetime\DrupalDateTime; use Drupal\Core\Field\FieldItemListInterface; -use Drupal\dpl_event\EventWrapper; +use Drupal\dpl_event\Entity\EventInstance; use Drupal\dpl_event\PriceFormatter; use Drupal\node\NodeInterface; -use Drupal\recurring_events\Entity\EventInstance; /** * An event object, containing the properties the RSS feed needs. @@ -41,11 +40,9 @@ class RediaEvent extends ControllerBase { public string $promoted; public function __construct(EventInstance $event_instance, PriceFormatter $price_formatter) { - $event_wrapper = new EventWrapper($event_instance); - - $branch = $event_wrapper->getBranches()[0] ?? NULL; - $start_date = $event_wrapper->getStartDate(); - $end_date = $event_wrapper->getEndDate(); + $branch = $event_instance->getBranches()[0] ?? NULL; + $start_date = $event_instance->getStartDate(); + $end_date = $event_instance->getEndDate(); $changed_date = DrupalDateTime::createFromFormat('U', strval($event_instance->getChangedTime())); @@ -57,11 +54,11 @@ public function __construct(EventInstance $event_instance, PriceFormatter $price } $this->title = $event_instance->label(); - $this->description = $event_wrapper->getDescription(); + $this->description = $event_instance->getDescription(); $this->author = $event_instance->getOwner()->get('field_author_name')->getString(); $this->id = $event_instance->id(); $this->date = $changed_date->format('r'); - $this->subtitle = $event_wrapper->getField('event_description')?->getString(); + $this->subtitle = $event_instance->getField('event_description')?->getString(); $this->startTime = $start_date->format('U'); $this->endTime = $end_date->format('U'); $this->media = NULL; @@ -73,10 +70,10 @@ public function __construct(EventInstance $event_instance, PriceFormatter $price } $this->branch = $branch; - $this->bookingUrl = $event_wrapper->getLink(); + $this->bookingUrl = $event_instance->getLink(); - if (!$event_wrapper->isFreeToAttend()) { - $prices = $event_wrapper->getTicketPrices(); + if (!$event_instance->isFreeToAttend()) { + $prices = $event_instance->getTicketPrices(); $this->prices = $price_formatter->formatRawPriceRange($prices); } else { diff --git a/web/modules/custom/dpl_update/dpl_update.deploy.php b/web/modules/custom/dpl_update/dpl_update.deploy.php index 7bf214307e..c5f15cec75 100644 --- a/web/modules/custom/dpl_update/dpl_update.deploy.php +++ b/web/modules/custom/dpl_update/dpl_update.deploy.php @@ -250,3 +250,10 @@ function dpl_update_deploy_field_relevant_ticket_manager(): string { function dpl_update_deploy_update_term_url_aliases(): string { return _dpl_update_generate_url_aliases('taxonomy_term'); } + +/** + * Link new event_screen_names inheritance on eventinstances. + */ +function dpl_update_update_screen_name_field_inheritance(): string { + return _dpl_update_field_inheritance('event_screen_names'); +} diff --git a/web/modules/custom/dpl_update/dpl_update.install b/web/modules/custom/dpl_update/dpl_update.install index 4991bd4402..44cddb426d 100644 --- a/web/modules/custom/dpl_update/dpl_update.install +++ b/web/modules/custom/dpl_update/dpl_update.install @@ -109,6 +109,10 @@ function dpl_update_install(): string { // $messages[] = dpl_update_update_10025() $messages[] = dpl_update_update_10026(); $messages[] = dpl_update_update_10027(); + $messages[] = dpl_update_update_10028(); + $messages[] = dpl_update_update_10029(); + $messages[] = dpl_update_update_10030(); + return implode('\r\n', $messages); } @@ -333,3 +337,18 @@ function dpl_update_update_10028(): string { function dpl_update_update_10029(): string { return _dpl_update_install_modules(['dpl_logging']); } + +/** + * Add initial translation for event display. + */ +function dpl_update_update_10030(): string { + $return = _dpl_update_update_translation('Expired', 'Afholdt', 'DPL event'); + + $return .= _dpl_update_update_translation( + 'Date', + 'Dato', + 'DPL event' + ); + + return $return; +} diff --git a/web/profiles/dpl_cms/translations/da.combined.po b/web/profiles/dpl_cms/translations/da.combined.po index 535d79eb29..51262de096 100644 --- a/web/profiles/dpl_cms/translations/da.combined.po +++ b/web/profiles/dpl_cms/translations/da.combined.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2024-12-03 17:44+0100\n" -"PO-Revision-Date: 2024-12-03 17:44+0100\n" +"POT-Creation-Date: 2024-12-10 13:13+0100\n" +"PO-Revision-Date: 2024-12-10 13:13+0100\n" "Last-Translator: NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -20,13 +20,13 @@ msgid "Search content" msgstr "Søg indhold" msgid "Search the website" -msgstr "" +msgstr "Search the website" msgid "Search" msgstr "Søg" msgid "Open link in new window/tab" -msgstr "" +msgstr "Åbner link i nyt vindue eller tab" msgid "" "You can find modules and Edit " "the breadcrumb \"@breadcrumb_title\"

" msgstr "" +"

Du er i gang med at slette \"@title\". Denne side er " +"liket til brødkrummen \"@breadcrumb_title\".\n" +"
Du kan ikke slette dette indhold før du erstatter siden i " +"\"Content to link to\" feltet i \"@breadcrumb_title\".\n" +"
Rediger brødkrummen \"@breadcrumb_title\"

" msgctxt "DPL Breadcrumbs" msgid "" @@ -324,43 +336,47 @@ msgstr "" msgctxt "Unilogin configuration" msgid "Unilogin configuration" -msgstr "" +msgstr "Unilogin configuration" msgctxt "Unilogin configuration" msgid "UniLogin API endpoint URL." -msgstr "" +msgstr "UniLogin API endpoint URL." msgctxt "Unilogin configuration" msgid "The UniLogin API endpoint url." -msgstr "" +msgstr "The UniLogin API endpoint url." msgctxt "Unilogin configuration" msgid "UniLogin API wellknown endpoint URL" -msgstr "" +msgstr "Kendt Unilogin API slutpunkturl" msgctxt "Unilogin configuration" msgid "The UniLogin API wellknown endpoint url." -msgstr "" +msgstr "The UniLogin API wellknown endpoint url." msgctxt "Unilogin configuration" msgid "UniLogin API client ID." -msgstr "" +msgstr "UniLogin API client ID." msgctxt "Unilogin configuration" msgid "The UniLogin API client ID." msgstr "" +"\n" +"The UniLogin API client ID." msgctxt "Unilogin configuration" msgid "UniLogin API client secret." -msgstr "" +msgstr "UniLogin API client secret." msgctxt "Unilogin configuration" msgid "The UniLogin API client secret." msgstr "" +"\n" +"The UniLogin API client secret." msgctxt "DPL admin UX" msgid "Event" -msgstr "" +msgstr "Arrangement" msgctxt "DPL related content" msgid "Related content" @@ -999,7 +1015,7 @@ msgstr "Fiktive personer" msgctxt "Search Result" msgid "Game platform" -msgstr "" +msgstr "Spilplatform" msgctxt "Search Result" msgid "Genre and form" @@ -1223,7 +1239,7 @@ msgstr "Udgiver" msgctxt "advanced search" msgid "remove row @inputNumber" -msgstr "" +msgstr "Fjern række @inputNumber" msgctxt "advanced search" msgid "reset" @@ -1726,7 +1742,7 @@ msgstr "Fejl i bestilling af digital kopi" msgctxt "Work Page" msgid "Internal error" -msgstr "" +msgstr "Intern fejl" msgctxt "Work Page" msgid "Close Order digital copy modal" @@ -3478,19 +3494,19 @@ msgstr "Antal elementer der vises i en liste på mobil" msgctxt "DPL logging" msgid "New roles added to user: @roles" -msgstr "" +msgstr "Nye roller tilføjet til bruger: @roles" msgctxt "DPL logging" msgid "Old roles removed from user: @roles" -msgstr "" +msgstr "Gamle roller fjernet fra bruger: @roles" msgctxt "DPL logging" msgid "Password was updated" -msgstr "" +msgstr "Adgangskoden blev opdateret" msgctxt "DPL logging" msgid "@label (@key): @original_value changed to @value" -msgstr "" +msgstr "@label (@key): @original_value ændret til @value" msgid "Mock-title field" msgstr "Mock-titelfelt" @@ -3499,6 +3515,8 @@ msgid "" "This is a mock title field, unused and read only. It is required, for " "eventinstances to work with entity reference autocomplete fields." msgstr "" +"This is a mock title field, unused and read only. It is required, for " +"eventinstances to work with entity reference autocomplete fields." msgid "Get tickets" msgstr "Hent billetter" @@ -3547,13 +3565,15 @@ msgstr "Næste" msgctxt "DPL event" msgid "Price Currency" -msgstr "" +msgstr "Pris (valuta)" msgctxt "DPL event" msgid "" "The currency that is used whenever prices are displayed - both on the " "website, but also in the event API." msgstr "" +"The currency that is used whenever prices are displayed - both on the " +"website, but also in the event API." msgctxt "DPL event" msgid "Danish kroner" @@ -3563,25 +3583,44 @@ msgctxt "DPL event" msgid "Euros" msgstr "Euro" +msgid "Enable screen names" +msgstr "" + +msgid "" +"Enable screen names on events. Requires an external system to actually fetch " +"and display the events on real physical screens." +msgstr "" + msgctxt "DPL event" msgid "Automatic unpublication" msgstr "Automatisk afpublicering" msgctxt "DPL event" -msgid "Schedule" -msgstr "Planlæg" +msgid "Unpublish eventinstances when they have occured (recommended)" +msgstr "" + +msgctxt "DPL event" +msgid "" +"Notice - if you do not choose that eventinstances get unpublished, they may " +"show up in automatic and manual lists, across the site." +msgstr "" + +msgctxt "DPL event" +msgid "" +"How much time should pass after an eventinstance has occurred before it " +"should be unpublished?" +msgstr "" msgctxt "DPL event" -msgid "Automatic unpublication disabled" -msgstr "Automatisk afpublicering slået fra" +msgid "Unpublish the series when all instances have occurred (not recommended)" +msgstr "" msgctxt "DPL event" msgid "" -"How much time should pass after an event has occurred before it should be " -"unpublished automatically." +"Notice - if series get unpublished, old instance links will no longer work. " +"If you however keep the series published, expired instances will redirect to " +"the associated series." msgstr "" -"Hvor længe skal der gå fra et arrangement er afholdt, til det skal " -"afpubliceres automatisk?" msgctxt "DPL Event" msgid "Use the address from associated branch as fallback." @@ -3811,13 +3850,16 @@ msgstr "" msgctxt "Material search" msgid "Error retrieving saved data. Inputs not found." -msgstr "" +msgstr "Fejl ved hentning af gemte data. Intet indhold fundet." msgctxt "Material search" msgid "" "Something went wrong when trying to find the previously saved values. Please " "try again. If the problem persists, something could be wrong with the app." msgstr "" +"Der gik noget galt i forbindelse med forsøget på at finde tidligere gemte " +"data. Prøv venligst igen. Hvis problemet opstår igen, kunne det skyldes " +"problemer med appen." msgid "Work ID" msgstr "VærkID" @@ -3844,12 +3886,16 @@ msgstr "Vælg materialetype" msgid "List of DPL-Go Unilogin configuration." msgstr "" +"\n" +"List of DPL-Go Unilogin configuration." msgid "DPL Configuration." -msgstr "" +msgstr "DPL Configuration." msgid "DPL Configuration" msgstr "" +"\n" +"DPL Configuration" msgctxt "DPL admin UX" msgid "" @@ -4009,6 +4055,15 @@ msgid "" " You can add an external url " "(starting with \"http://\" or \"https://\")." msgstr "" +"The link with information about opening hours.
\n" +" If no link is added, the opening " +"hours sidebar modal is enabled.
\n" +" You can add a relative url (e.g. /" +"takster).
\n" +" You can search for an internal url. " +"
\n" +" You can add an external url " +"(starting with \"http://\" or \"https://\")." msgctxt "Library Agency Configuration" msgid "Expiration warning" @@ -4125,7 +4180,7 @@ msgid "Get campaign matching search result facets" msgstr "Hent kampagne som matcher facetter fra søgeresultatet" msgid "DPL Linkit with options" -msgstr "" +msgstr "DPL Linkit with options" msgid "Generate proxy url" msgstr "Generate proxy URL / Generer proxy URL" @@ -4176,7 +4231,7 @@ msgid "Work id with type" msgstr "VærkID med type" msgid "DPL configuration schema extensions for GraphQL Compose." -msgstr "" +msgstr "DPL configuration schema extensions for GraphQL Compose." msgid "dpl_campaign" msgstr "dpl_campaign" @@ -4189,22 +4244,22 @@ msgstr "" "Apps" msgid "DPL Link" -msgstr "" +msgstr "DPL Link" msgid "Add functionality to link field" -msgstr "" +msgstr "Add functionality to link field" msgid "Webmaster" -msgstr "" +msgstr "Webmaster" msgid "Webmaster library support functionality" -msgstr "" +msgstr "Webmaster library support functionality" msgid "Add new or update module" -msgstr "" +msgstr "Add new or update module" msgid "Install or update module" -msgstr "" +msgstr "Install or update module" msgid "Article" msgstr "Artikel" @@ -4241,10 +4296,10 @@ msgid "Set auth redirect paths for patrons" msgstr "Indstil sti til omdirigering ved autorisering af slutbrugere" msgid "DPL Search" -msgstr "" +msgstr "DPL Search" msgid "Handling the search pages." -msgstr "" +msgstr "Handling the search pages." msgid "Add content" msgstr "Tilføj indhold" @@ -4359,18 +4414,20 @@ msgstr "Brødkrummer og automatiske URL-aliasser, baseret på indholdsstruktur." msgid "DPL UniLogin" msgstr "" +"\n" +"DPL UniLogin" msgid "Module containing unilogin configuration" -msgstr "" +msgstr "Module containing unilogin configuration" msgid "UniLogin configuration" -msgstr "" +msgstr "UniLogin configuration" msgid "Change UniLogin configuration" -msgstr "" +msgstr "Change UniLogin configuration" msgid "Unilogin configuration" -msgstr "" +msgstr "Unilogin configuration" msgid "DPL related content - test suite" msgstr "DPL relateret indhold - test suite" @@ -4418,13 +4475,13 @@ msgid "Configure the host names and replacement patterns for proxy urls." msgstr "Indstillinger for proxy URL'er" msgid "DPL Redia Legacy feeds" -msgstr "" +msgstr "DPL Redia Legacy feeds" msgid "Various legacy integrations, used for the Redia App." -msgstr "" +msgstr "Various legacy integrations, used for the Redia App." msgid "Redia APP Event" -msgstr "" +msgstr "Redia APP Event" msgid "Patron registration" msgstr "Brugeroprettelse" @@ -4551,7 +4608,7 @@ msgid "Example content for DPL Breadcrumb" msgstr "Eksempelindhold for DPL breadcrumb" msgid "This module was used for breadcrumb content, it is now deprecated." -msgstr "" +msgstr "This module was used for breadcrumb content, it is now deprecated." msgid "DPL favorites list material component" msgstr "DPL huskeliste materialekomponent" @@ -4658,10 +4715,10 @@ msgid "A module that handles cookie functionality." msgstr "En modul, der håndterer cookie-funktionalitet." msgid "DPL logging" -msgstr "" +msgstr "DPL logging" msgid "Logging custom DDF events, such as updates to users." -msgstr "" +msgstr "Logging custom DDF events, such as updates to users." msgid "Event settings" msgstr "Arrangementsindstillinger" @@ -4676,10 +4733,10 @@ msgid "Custom handling related to events." msgstr "Indstillinger for arrangementer" msgid "DPL Consumers" -msgstr "" +msgstr "DPL Consumers" msgid "Module for adding consumers to DPL CMS" -msgstr "" +msgstr "Module for adding consumers to DPL CMS" msgid "Footer Settings" msgstr "Footerindstillinger" @@ -4713,9 +4770,11 @@ msgstr "Integration til FBI API, https://fbi-api.dbc.dk/." msgid "DPL GraphQL" msgstr "" +"\n" +"DPL GraphQL" msgid "Module used for handling graphql functionality." -msgstr "" +msgstr "Module used for handling graphql functionality." msgid "DPL Cache settings" msgstr "DPL cache-indstillinger" @@ -4819,7 +4878,7 @@ msgstr "Efternavn" msgctxt "Address label" msgid "Organization" -msgstr "" +msgstr "Organisation" msgctxt "Address label" msgid "Address line 1" @@ -4831,7 +4890,7 @@ msgstr "Adresse linje 2" msgctxt "Address label" msgid "Address line 3" -msgstr "" +msgstr "Adresselinie 3 " msgctxt "Address label" msgid "Postal code" @@ -4863,7 +4922,7 @@ msgstr "Gadenavn linie 2" msgctxt "Address label" msgid "Street address line 3" -msgstr "" +msgstr "Gadenavn 3" msgctxt "Address label" msgid "Cedex" @@ -4891,7 +4950,7 @@ msgstr "Kommune" msgctxt "Address label" msgid "Do/Si" -msgstr "" +msgstr "Co" msgctxt "Address label" msgid "Emirate" @@ -4915,7 +4974,7 @@ msgstr "Provins" msgctxt "Address label" msgid "Region" -msgstr "" +msgstr "Region (anvendes ikke i DK)" msgctxt "Address label" msgid "State" @@ -4935,7 +4994,7 @@ msgstr "Forstad" msgctxt "Address label" msgid "Town/City" -msgstr "" +msgstr "By" msgctxt "Address label" msgid "Neighborhood" @@ -4943,7 +5002,7 @@ msgstr "Nabolag" msgctxt "Address label" msgid "Village/Township" -msgstr "" +msgstr "Landsby" msgctxt "Address label" msgid "Townland" @@ -5037,7 +5096,7 @@ msgid "The second line of the address block" msgstr "Adresselinje 2" msgid "The third line of the address block" -msgstr "" +msgstr "Den tredie linie i adressen" msgid "The organization" msgstr "Organisationen" @@ -5099,19 +5158,19 @@ msgid "Shown" msgstr "Vist" msgid "Wrapper type" -msgstr "" +msgstr "Wrapper type" msgid "Wrapper type: @wrapper_type" msgstr "Wrapper type: @wrapper_type" msgid "Container (invisible)" -msgstr "" +msgstr "Oversigt (usynlig)" msgid "Details (collapsible)" -msgstr "" +msgstr "Detaljer (kan foldes sammen)" msgid "Fieldset (non-collapsible)" -msgstr "" +msgstr "Felter (ikke sammenklappelige) " msgid "Display the subdivision name instead of the subdivision code" msgstr "Vis underafdelingsnavnet i stedet for underafdelingskoden" @@ -5248,28 +5307,28 @@ msgid "Langcode" msgstr "Langcode" msgid "Administrative area" -msgstr "" +msgstr "Administrativt område" msgid "Locality" msgstr "Lokalitet" msgid "Dependent locality" -msgstr "" +msgstr "Dependent locality" msgid "Postal code" msgstr "Postnummer" msgid "Sorting code" -msgstr "" +msgstr "Sorting code" msgid "Address line 1" -msgstr "" +msgstr "Adresselinje 1" msgid "Address line 2" -msgstr "" +msgstr "Adresselinje 2" msgid "Address line 3" -msgstr "" +msgstr "Adresselinje 3" msgid "Organization" msgstr "Organisation" @@ -5278,7 +5337,7 @@ msgid "Given name" msgstr "Fornavn" msgid "Additional name" -msgstr "" +msgstr "Navn (ved flere navne)" msgid "Family name" msgstr "Efternavn" @@ -5759,6 +5818,11 @@ msgid "" "single form element. Sort order should first be exposed by selecting " "Allow people to choose the sort order." msgstr "" +"Combines the sort by options and order (ascending or descending) into a " +"single list. Use this to display \"Option1 (ascending)\", \"Option1 " +"(descending)\", \"Option2 (ascending)\", \"Option2 (descending)\" in a " +"single form element. Sort order should first be exposed by selecting " +"Allow people to choose the sort order." msgid "Rewrite the text displayed" msgstr "Genskriv den viste tekst" @@ -5828,13 +5892,13 @@ msgid "Minimum" msgstr "Minimum" msgid "Adds a min attribute to the input field." -msgstr "" +msgstr "Adds a min attribute to the input field." msgid "Maximum" msgstr "Maksimum" msgid "Adds a max attribute to the input field." -msgstr "" +msgstr "Adds a max attribute to the input field." msgid "Add select all/none links" msgstr "Tilføj vælg alle/ingen links" @@ -5904,12 +5968,14 @@ msgstr "" "bindestreger i den aktuelle tekst." msgid "Rewrite the text displayed based on key" -msgstr "" +msgstr "Rewrite the text displayed based on key" msgid "" "Change behavior of \"Rewrite the text displayed\" to overwrite labels based " "on option key. eg. All|New label" msgstr "" +"Change behavior of \"Rewrite the text displayed\" to overwrite labels based " +"on option key. eg. All|New label" msgid "Make filter options collapsible" msgstr "Gør filterindstillinger sammenklappelige" @@ -5918,13 +5984,16 @@ msgid "Puts the filter options in a collapsible details element." msgstr "Placerer filtermulighederne i et sammenklappeligt detaljeelement." msgid "Disable the automatic opening of collapsed filters with selections" -msgstr "" +msgstr "Disable the automatic opening of collapsed filters with selections" msgid "" "When a selection is made, by default the collapsed filter will be set to " "open. If you provide an alternative means for the user to see filter " "selections, you can the default open behavior by enabling this." msgstr "" +"When a selection is made, by default the collapsed filter will be set to " +"open. If you provide an alternative means for the user to see filter " +"selections, you can the default open behavior by enabling this." msgid "Range minimum" msgstr "Minimal rækkevidde" @@ -5933,6 +6002,8 @@ msgid "" "The minimum allowed value for the range slider. It can be positive, " "negative, or zero and have up to 11 decimal places." msgstr "" +"The minimum allowed value for the range slider. It can be positive, " +"negative, or zero and have up to 11 decimal places." msgid "Range maximum" msgstr "Maksimal rækkevidde" @@ -5941,6 +6012,8 @@ msgid "" "The maximum allowed value for the range slider. It can be positive, " "negative, or zero and have up to 11 decimal places." msgstr "" +"The maximum allowed value for the range slider. It can be positive, " +"negative, or zero and have up to 11 decimal places." msgid "Step" msgstr "Trin" @@ -5969,13 +6042,13 @@ msgid "None" msgstr "Ingen" msgid "Slow (600 ms)" -msgstr "" +msgstr "Langsom (600 ms)" msgid "Normal (400 ms)" -msgstr "" +msgstr "Normal (400 ms)" msgid "Fast (200 ms)" -msgstr "" +msgstr "Hurtig (200 ms)" msgid "" "Whether to slide handle smoothly when user click outside handle on the bar." @@ -5998,7 +6071,7 @@ msgid "Vertical" msgstr "Vertikal" msgid "The orientation of the range slider." -msgstr "" +msgstr "The orientation of the range slider." msgid "The slider max value must be greater than the slider min value." msgstr "Sliderens maks. værdi skal være større end sliderens min. værdi." @@ -6099,7 +6172,7 @@ msgid "Checkboxes/Radio Buttons" msgstr "Afkrydsningsfelter" msgid "Sliders" -msgstr "" +msgstr "Sliders" msgid "" "Provides advanced options (e.g. links, checkboxes, or other widgets) to " @@ -7767,6 +7840,7 @@ msgstr "Entity Host Base Field ERR" msgid "" "Entity host with base field definition using entity_reference_revisions." msgstr "" +"Entity host with base field definition using entity_reference_revisions." msgid "Delete orphaned composite entities" msgstr "Delete orphaned composite entities" @@ -7779,34 +7853,34 @@ msgstr "" "Revisions felter." msgid "Enum class" -msgstr "" +msgstr "Enum class" msgid "Backed enum class to get the allowed values from." msgstr "Understøttet enum-klasse for at få tilladte værdier fra." msgid "Enum" -msgstr "" +msgstr "Enum" msgid "An instance of the enum or enum-like class." -msgstr "" +msgstr "An instance of the enum or enum-like class." msgid "Enum (integer)" -msgstr "" +msgstr "Enum (integer)" msgid "This field stores integer values from a backed enum." -msgstr "" +msgstr "This field stores integer values from a backed enum." msgid "Enum (text)" -msgstr "" +msgstr "Enum (text)" msgid "This field stores text values from a backed enum." -msgstr "" +msgstr "This field stores text values from a backed enum." msgid "Text" msgstr "Tekst" msgid "Enum Field" -msgstr "" +msgstr "Enum Field" msgid "Create list fields based on PHP enums" msgstr "Opret listefelter baseret på PHP enums" @@ -7836,10 +7910,10 @@ msgid "Field Group" msgstr "Feltgruppe" msgid "jQuery UI Accordion is deprecated" -msgstr "" +msgstr "jQuery UI Accordion is deprecated" msgid "This module is deprecated, as the Jquery UI library is EOL." -msgstr "" +msgstr "This module is deprecated, as the Jquery UI library is EOL." msgid "" "Fieldgroup will, as the name implies, group fields together. All fieldable " @@ -7847,6 +7921,10 @@ msgid "" "together. Fieldgroup comes with default HTML wrappers like vertical tabs, " "horizontal tabs, fieldsets or div wrappers." msgstr "" +"Fieldgroup will, as the name implies, group fields together. All fieldable " +"entities will have the possibility to add groups to wrap their fields " +"together. Fieldgroup comes with default HTML wrappers like vertical tabs, " +"horizontal tabs, fieldsets or div wrappers." msgid "" "The field group project is a follow-up on the field group module in By moving " "field group to a separate module, this may open some new perspectives." msgstr "" +"The field group project is a follow-up on the field group module in CCK. The release will only exist for Drupal 7 release " +"and higher, so since the existence of the Fields API in core.
By moving " +"field group to a separate module, this may open some new perspectives." msgid "More Information" msgstr "Mere Information" @@ -7862,6 +7944,8 @@ msgid "" "For more information about this module feel free to visit the module page." msgstr "" +"For more information about this module feel free to visit the module page." msgid "The \"jquery_ui_accordion\" module has been installed." msgstr "\"jquery_ui_accordion\" modulet er installeret." @@ -7882,10 +7966,10 @@ msgid "The group %label has been deleted from the %type content type." msgstr "Gruppen %label er blevet slettet fra %type indholdstypen." msgid "Body is a child of %group" -msgstr "" +msgstr "Body is a child of %group" msgid "Div that contains fields with no access is not shown." -msgstr "" +msgstr "Div that contains fields with no access is not shown." msgid "Horizontal Tabs" msgstr "Horisontale faner" @@ -7921,10 +8005,10 @@ msgstr "" "Vis denne feltgruppe, selvom de indeholdte felter i øjeblikket er tomme." msgid "Allow HTML in label" -msgstr "" +msgstr "Allow HTML in label" msgid "Allows using (XSS-filtered) HTML in the label (e.g. icons)." -msgstr "" +msgstr "Allows using (XSS-filtered) HTML in the label (e.g. icons)." msgid "ID" msgstr "ID" @@ -7936,7 +8020,7 @@ msgid "Show Empty Fields" msgstr "Vis tomme felter" msgid "Allow HTML in label: @label_as_html" -msgstr "" +msgstr "Allow HTML in label: @label_as_html" msgid "Id: @id" msgstr "Id: @id" @@ -8026,7 +8110,7 @@ msgid "Direction" msgstr "Retning" msgid "Width Breakpoint" -msgstr "" +msgstr "Width Breakpoint" msgid "" "Auto-disable the Tabs widget if the window width is equal or smaller than " @@ -8048,7 +8132,7 @@ msgid "Bundle" msgstr "Bundle" msgid "Parent name" -msgstr "" +msgstr "Forældrenavn" msgid "Region" msgstr "Region" @@ -8116,12 +8200,16 @@ msgstr "Feltgruppe @group klonet." msgid "Accordion (Deprecated)" msgstr "" +"\n" +"Accordion (Deprecated)" msgid "This fieldgroup renders child groups as jQuery accordion." msgstr "Denne feltgruppe renderer undergrupper som en jQuery accordion." msgid "Accordion Item (Deprecated)" msgstr "" +"\n" +"Accordion Item (Deprecated)" msgid "This fieldgroup renders the content in a div, part of accordion group." msgstr "" @@ -8162,20 +8250,26 @@ msgid "" "This fieldgroup renders the inner content in a fieldset with the title as " "legend." msgstr "" +"This fieldgroup renders the inner content in a fieldset with the title as " +"legend." msgid "Tabs" msgstr "Faner" msgid "This fieldgroup renders child groups in its own tabs wrapper." msgstr "" +"\n" +"This fieldgroup renders child groups in its own tabs wrapper." msgid "Field Group: Accordion formatter (Deprecated)" -msgstr "" +msgstr "Field Group: Accordion formatter (Deprecated)" msgid "" "Provides the option to render groups as accordion. This module is deprecated " "as Jquery UI is EOL." msgstr "" +"Provides the option to render groups as accordion. This module is deprecated " +"as Jquery UI is EOL." msgid "Provides the ability to group your fields on both form and display." msgstr "" @@ -8183,12 +8277,14 @@ msgstr "" msgid "Field Group Test" msgstr "" +"\n" +"Field Group Test" msgid "Test module for Field Group" msgstr "Testmodul for feltgruppe" msgid "Field Group Migrate" -msgstr "" +msgstr "Field Group Migrate" msgid "Provides the ability to migrate field groups from D6/D7 to D8." msgstr "Leverer muligheden for at migrere feltgrupper fra D6/D7 til D8." @@ -8245,13 +8341,15 @@ msgid "Inherit" msgstr "Arv" msgid "Prepend" -msgstr "" +msgstr "Prepend" msgid "Append" msgstr "Tilføj" msgid "Fallback" msgstr "" +"\n" +"Fallback" msgid "-- Select --" msgstr "--Vælg--" @@ -8431,7 +8529,7 @@ msgid "format" msgstr "format" msgid "Entity Reference Field Inheritance" -msgstr "" +msgstr "Entity Reference Field Inheritance" msgid "Default Field Inheritance" msgstr "Standard feltarv" @@ -8469,7 +8567,7 @@ msgid "Test Node" msgstr "Test Node" msgid "Source image with fid=%fid not confirmed as valid." -msgstr "" +msgstr "Source image with fid=%fid not confirmed as valid." msgid "Focal Point Preview Image" msgstr "Fokuspunkt forhåndsvisningsbillede" @@ -8502,6 +8600,7 @@ msgstr "Forhåndsvisning af billeder" msgid "" "Source image with fid=%fid not confirmed as valid while checking access." msgstr "" +"Source image with fid=%fid not confirmed as valid while checking access." msgid "Display preview link" msgstr "Vis forhåndsvisningslink" @@ -8540,7 +8639,7 @@ msgstr "" "forskydningerne er i procent. Eksempel: 25,75" msgid "File not found." -msgstr "" +msgstr "File not found." msgid "Image (Focal Point)" msgstr "Billede (Fokuspunkt)" @@ -8552,10 +8651,10 @@ msgid "Scales and crops image while keeping its focal point close to centered." msgstr "Skalerer og beskærer billedet, mens fokuspunktet holdes tæt på midten." msgid "Focal Point Crop by Width" -msgstr "" +msgstr "Focal Point Crop by Width" msgid "Crops image while keeping its focal point and the original height." -msgstr "" +msgstr "Crops image while keeping its focal point and the original height." msgid "Focal Point Crop" msgstr "Fokuspunkt beskæring" @@ -8991,10 +9090,10 @@ msgid "External URL @url" msgstr "Ekstern URL @url" msgid "External URL" -msgstr "" +msgstr "Ekstern URL" msgid "Adds https:// to URL." -msgstr "" +msgstr "Tilføj https// til URL" msgid "Include unpublished: @include_unpublished" msgstr "Inkluder upubliceret: @include_unpublished" @@ -9158,13 +9257,13 @@ msgid "Show edit button" msgstr "Vis redigeringsknap" msgid "Edit form mode: @form_mode" -msgstr "" +msgstr "Edit form mode: @form_mode" msgid "Form mode" msgstr "Formulartilstand" msgid "You can select in which mode edit form will be rendered." -msgstr "" +msgstr "You can select in which mode edit form will be rendered." msgid "Edit media item" msgstr "Rediger medieelement" @@ -13223,7 +13322,7 @@ msgstr "Brug off-canvas dialog" msgctxt "Paragraphs Editor Enhancements" msgid "Tiles" -msgstr "" +msgstr "Felter" msgctxt "Paragraphs Editor Enhancements" msgid "List" @@ -13306,12 +13405,14 @@ msgid "Create and manage Paragraphs categories." msgstr "Opret og administrer Paragraphs kategorier." msgid "Show collapse all button" -msgstr "" +msgstr "Show collapse all button" msgid "" "Disable the collapse all button when using inline entity forms in your " "paragraph types." msgstr "" +"Disable the collapse all button when using inline entity forms in your " +"paragraph types." msgid "Enable confirmation on paragraphs remove" msgstr "Aktiver bekræftelse ved fjernelse af paragraphs" @@ -13407,7 +13508,7 @@ msgid "Event Instance" msgstr "Arrangementinstans" msgid "Event Instance tokens from the Recurring Events Registration module." -msgstr "" +msgstr "Event Instance tokens from the Recurring Events Registration module." msgid "Register URL" msgstr "Registrér URL" @@ -13425,7 +13526,7 @@ msgid "Registrant" msgstr "Deltager" msgid "Registrant tokens from the Recurring Events Registration module." -msgstr "" +msgstr "Registrant tokens from the Recurring Events Registration module." msgid "Registrant Email" msgstr "Deltagerens email" @@ -13446,13 +13547,15 @@ msgid "The URL to delete a registrant." msgstr "URL'en til at slette en registreret." msgid "Registrant event instance" -msgstr "" +msgstr "Registrant event instance" msgid "The eventinstance associated with a registrant" msgstr "Arrangementsinstansen associeret med en deltager" msgid "Registrant event series" msgstr "" +"\n" +"Registrant event series" msgid "The eventseries associated with a registrant" msgstr "Arrangementsserien associeret med en deltager" @@ -13700,10 +13803,10 @@ msgid "Successfully deleted @count registrants(s)." msgstr "Vellykket slettet @count deltager(e)." msgid "No orphaned registrants found." -msgstr "" +msgstr "No orphaned registrants found." msgid "Delete Orphaned Registrants" -msgstr "" +msgstr "Delete Orphaned Registrants" msgid "" "By submitting this form you will be contacting %registered registrants and/" @@ -13796,6 +13899,8 @@ msgstr "" msgid "Registrant Items" msgstr "" +"\n" +"Registrant Items" msgid "" "Enter the number of items to show per page in the default registrant listing " @@ -13808,7 +13913,7 @@ msgid "PHP date/time format" msgstr "PHP dato/tidsformat" msgid "Registrant Date Format" -msgstr "" +msgstr "Registrant Date Format" msgid "Enter the @link used when listing registrants. Default is F jS, Y h:iA." msgstr "" @@ -14371,7 +14476,7 @@ msgid "No default subject configured for @key emails in @config_name." msgstr "Ingen standard emne konfigureret for @key emails i @config_name." msgid "No default body configured for @key emails in @config_name." -msgstr "" +msgstr "No default body configured for @key emails in @config_name." msgid "Default revision" msgstr "Standard revidering" @@ -14394,6 +14499,8 @@ msgstr "Giv en kort beskrivelse af dine ændringer." msgid "Registrants have been converted to be revisionable." msgstr "" +"\n" +"Registrants have been converted to be revisionable." msgid "Registration Availability" msgstr "Deltagertilgængelighed" @@ -14419,6 +14526,8 @@ msgstr "Antal deltagere på venteliste til en arrangementsinstans." msgid "The type of registration allowed for the series." msgstr "" +"\n" +"The type of registration allowed for the series." msgid "Event iCalendar Link" msgstr "Arrangement iCalendar link" @@ -14465,6 +14574,8 @@ msgid "" "The global position for the event. The value must be two semicolon-separated " "float values." msgstr "" +"The global position for the event. The value must be two semicolon-separated " +"float values." msgid "Location" msgstr "Lokation" @@ -14514,6 +14625,8 @@ msgstr "" msgid "Revision Date Changes" msgstr "" +"\n" +"Revision Date Changes" msgid "" "Recurrence configuration has been changed in this revision, as a result if " @@ -14698,6 +14811,9 @@ msgid "" "now-unrelevant instances will be deleted, along with any custom changes made " "to these instances. This action cannot be undone." msgstr "" +"Recurrence configuration has been changed. New instances may be created, and " +"now-unrelevant instances will be deleted, along with any custom changes made " +"to these instances. This action cannot be undone." msgid "Not published" msgstr "Ikke udgivet" @@ -14872,19 +14988,19 @@ msgstr "" "deltagertype." msgid "Successfully deleted @type: @label." -msgstr "" +msgstr "@type: @label blev slettet." msgid "Successfully deleted @count instance(s)." msgstr "Sletning af @count instanser blev gennemført." msgid "No orphaned instances found." -msgstr "" +msgstr "No orphaned instances found." msgid "Unable to determine" msgstr "Ude af stand til at bestemme" msgid "Delete Orphaned Instances" -msgstr "" +msgstr "Delete Orphaned Instances" msgid "Are you sure you want to revert to the revision from %revision-date?" msgstr "Ønsker du at vende tilbage til versionen fra %revision-date?" @@ -14927,13 +15043,13 @@ msgid "Event Series Minimum Time" msgstr "Minimumstid" msgid "Enter the earliest an event can start." -msgstr "" +msgstr "Angiv hvornår arrangementet tidligst kan finde sted" msgid "Event Series Maximum Time" msgstr "Maximumstid" msgid "Enter the latest an event can start." -msgstr "" +msgstr "Angive hvornår arrangementet senest kan finde sted" msgid "Event Series Date Format" msgstr "Arrangementseries datoformat" @@ -15021,7 +15137,7 @@ msgstr "" "grænseværdi" msgid "Event Instance Threshold Message" -msgstr "" +msgstr "Event Instance Threshold Message" msgid "" "Enter the message to be displayed. Use @total as a placeholder for the " @@ -15031,7 +15147,7 @@ msgstr "" "af instanser, der oprettes." msgid "Event Instance Threshold Prevent Save" -msgstr "" +msgstr "Event Instance Threshold Prevent Save" msgid "Prevent saving a series if the threshold is exceeded?" msgstr "Forhindre at gemme en serie, hvis tærsklen overskrides?" @@ -15108,7 +15224,7 @@ msgid "Day Occurrence" msgstr "Dag i måneden" msgid "Which occurrence of the day(s) of the week should event take place" -msgstr "" +msgstr "Which occurrence of the day(s) of the week should event take place" msgid "Day of Month" msgstr "Dag i måned" @@ -15145,6 +15261,8 @@ msgstr "Varigheden af arrangementerne" msgid "Duration Units" msgstr "" +"\n" +"Duration Units" msgid "The duration unites of the events" msgstr "Arrangementernes varighed forenes" @@ -15589,7 +15707,7 @@ msgid "@label (@argument)" msgstr "@label (@argument)" msgid "Tokens for the eventinstance entity type." -msgstr "" +msgstr "Tokens for the eventinstance entity type." msgid "Event Instance Inherited Title" msgstr "Arvet titel for arrangementsinstans" @@ -15684,6 +15802,8 @@ msgstr "Arrangementinstans enhed" msgid "EventInstance Date Compact" msgstr "" +"\n" +"EventInstance Date Compact" msgid "Display the date of the referenced eventinstance using Date Compact." msgstr "Vis datoen for den refererede arrangement-instans med Date Compact." @@ -15897,10 +16017,12 @@ msgid "Configure Event Instance Types" msgstr "Konfigurer arrangementsinstans-typer" msgid "Orphaned Event Instances" -msgstr "" +msgstr "Orphaned Event Instances" msgid "Delete orphaned event instances" msgstr "" +"\n" +"Delete orphaned event instances" msgid "Add event" msgstr "Tilføj arrangement" @@ -15931,10 +16053,12 @@ msgid "" msgstr "Konkurrencen bliver først afpubliceret, når alle præmier er vundet." msgid "currently in daylight saving mode" -msgstr "" +msgstr "currently in daylight saving mode" msgid "not in daylight saving mode" msgstr "" +"\n" +"not in daylight saving mode" msgid "" "In most cases the server time should match Coordinated Universal Time " @@ -16389,7 +16513,7 @@ msgid "Config Update for actions" msgstr "Config opdatering for handlinger" msgid "Enable Config Update Reports" -msgstr "" +msgstr "Enable Config Update Reports" msgid "" "Action '%action_id' is missing. Use Config Update to " @@ -16444,6 +16568,8 @@ msgstr "Udgiv feltet vist for: @list" msgid "Unpublish On field displayed for: @list" msgstr "" +"\n" +"Unpublish On field displayed for: @list" msgid "Publish On field hidden for: @list" msgstr "Udgiv feltet skjult for: @list" @@ -16464,6 +16590,11 @@ msgid "" "Any actions performed during the lightweight cron run will always be logged " "regardless of this setting." msgstr "" +"When this option is checked, Scheduler will write an entry to the log every " +"time the lightweight cron process is started and completed. This is useful " +"during set up and testing, but can result in a large number of log entries. " +"Any actions performed during the lightweight cron run will always be logged " +"regardless of this setting." msgid "Lightweight cron access key" msgstr "Adgangsnøgle for letvægtscron" @@ -16608,6 +16739,12 @@ msgid "" "an independent cron job which only runs the scheduler process and does not " "execute any cron tasks defined by Drupal core or any other modules." msgstr "" +"When you have set up Drupal's standard crontab job cron.php then Scheduler " +"will be executed during each cron run. However, if you would like finer " +"granularity to scheduler, but don't want to run Drupal's cron more often " +"then you can use the lightweight cron handler provided by Scheduler. This is " +"an independent cron job which only runs the scheduler process and does not " +"execute any cron tasks defined by Drupal core or any other modules." msgid "" "Scheduler's cron is at /scheduler/cron/{access-key} and a sample crontab " @@ -16726,7 +16863,7 @@ msgstr "" "under redigering %type @plural" msgid "Expand fieldset or vertical tab" -msgstr "" +msgstr "Expand fieldset or vertical tab" msgid "Expand only when a scheduled date exists or when a date is required" msgstr "" @@ -16808,6 +16945,7 @@ msgstr "Mediefeltdatabaser" msgid "Relationship to access the Media fields that are not on Media Revision." msgstr "" +"Relationship to access the Media fields that are not on Media Revision." msgid "Media Field" msgstr "Media-felt" @@ -16831,6 +16969,7 @@ msgstr "Schedulerdatoer" msgid "" "Fieldset containing Scheduler Publish-on and Unpublish-on date input fields" msgstr "" +"Fieldset containing Scheduler Publish-on and Unpublish-on date input fields" msgid "Scheduler: publish on" msgstr "Planlægning: Udgiv den" @@ -16858,6 +16997,8 @@ msgstr "Datoen for, hvornår %type bliver afpubliceret." msgid "Node form scheduler" msgstr "" +"\n" +"Node form scheduler" msgid "Scheduler date options on the Node form." msgstr "Scheduler datoindstillinger på node-formularen." @@ -16902,7 +17043,7 @@ msgid "Node type is enabled for scheduled unpublishing" msgstr "Node type er aktiveret for planlagt afpublicering" msgid "Datetime Timestamp for Scheduler" -msgstr "" +msgstr "Datetime Timestamp for Scheduler" msgid "" "An optional datetime field. Does not fill in the current datetime if left " @@ -16969,7 +17110,7 @@ msgid "Support module for general Scheduler testing." msgstr "Supportmodul for generel Scheduler-testning." msgid "Scheduler API Legacy Test" -msgstr "" +msgstr "Scheduler API Legacy Test" msgid "Sub-module containing the legacy hook implementations." msgstr "Undermodul indeholdende de gamle hook-implementeringer." @@ -17131,7 +17272,7 @@ msgid "Telephone Formatter" msgstr "Telefonformater" msgid "Formats telephone fields using google's libphonenumber library" -msgstr "" +msgstr "Formats telephone fields using google's libphonenumber library" msgid "" "There are errors with some installed themes. Visit the Note that this could cause some long page load times when loading " "many pages." msgstr "" +"When initially loading a page beyond the first, this option will load all " +"pages up to the requested page instead of just the requested page. So, if " +"you have the pager set to 10 items per page, and you load the page with ?" +"page=2 in the url, you will get page 0, 1 and 2 loaded for a total of 30 " +"items. Note that this could cause some long page load times when loading " +"many pages." msgid "Infinite Scroll" msgstr "Infinite scroll" @@ -18191,6 +18340,8 @@ msgstr "Vis flere" msgid "Search button" msgstr "" +"\n" +"Search button" msgid "Error warning icon" msgstr "Fejl advarsel ikon" @@ -18449,6 +18600,12 @@ msgctxt "" msgid "Event details" msgstr "" +msgctxt "" +"core.entity_form_display.eventinstance.default.default:third_party_settings:" +"field_group:group_infoscreen:label" +msgid "Infoscreen" +msgstr "" + msgctxt "" "core.entity_form_display.eventinstance.default.default:content:" "field_event_paragraphs:settings:title" @@ -18491,6 +18648,12 @@ msgctxt "" msgid "Event details" msgstr "" +msgctxt "" +"core.entity_form_display.eventseries.default.default:third_party_settings:" +"field_group:group_infoscreen:label" +msgid "Infoscreen" +msgstr "" + msgctxt "" "core.entity_form_display.eventseries.default.default:content:" "field_event_paragraphs:settings:title" @@ -19194,6 +19357,14 @@ msgid "" "that points to where you can edit the content in their system." msgstr "" +msgctxt "field.field.eventinstance.default.field_screen_names:label" +msgid "Screen names" +msgstr "" + +msgctxt "field.field.eventinstance.default.field_screen_names:description" +msgid "Select which screens to display this event on. " +msgstr "" + msgctxt "field.field.eventinstance.default.field_tags:label" msgid "Tags" msgstr "" @@ -19310,6 +19481,14 @@ msgctxt "" msgid "Off" msgstr "" +msgctxt "field.field.eventseries.default.field_screen_names:label" +msgid "Screen names" +msgstr "" + +msgctxt "field.field.eventseries.default.field_screen_names:description" +msgid "Select which screens to display this event on." +msgstr "" + msgctxt "field.field.eventseries.default.field_tags:label" msgid "Tags" msgstr "" @@ -21268,11 +21447,11 @@ msgstr "Brugeroprettelse" msgctxt "password_policy.password_policy.admins:label" msgid "Admins" -msgstr "" +msgstr "Admin" msgctxt "password_policy.password_policy.non_admins:label" msgid "Non-admins" -msgstr "" +msgstr "Ikke-admin" msgctxt "pathauto.pattern.breadcrumb_pattern:label" msgid "Breadcrumb pattern" @@ -21308,7 +21487,7 @@ msgstr "Indhold" msgctxt "search_api.index.content_events:name" msgid "Content + Events" -msgstr "" +msgstr "Arrangementsnavn" msgctxt "search_api.index.events:name" msgid "Events" @@ -21320,27 +21499,27 @@ msgstr "DB Søgning" msgctxt "simple_oauth.oauth2_token.bundle.access_token:label" msgid "Access Token" -msgstr "" +msgstr "Access token" msgctxt "simple_oauth.oauth2_token.bundle.access_token:description" msgid "The access token type." -msgstr "" +msgstr "Access token type" msgctxt "simple_oauth.oauth2_token.bundle.auth_code:label" msgid "Auth code" -msgstr "" +msgstr "Auth-kode" msgctxt "simple_oauth.oauth2_token.bundle.auth_code:description" msgid "The auth code type." -msgstr "" +msgstr "Auth-kode-type" msgctxt "simple_oauth.oauth2_token.bundle.refresh_token:label" msgid "Refresh token" -msgstr "" +msgstr "Genindlæg token" msgctxt "simple_oauth.oauth2_token.bundle.refresh_token:description" msgid "The refresh token type." -msgstr "" +msgstr "The refresh token type." msgctxt "system.action.eventinstance_break_lock_action:label" msgid "Break lock eventinstance" @@ -21548,6 +21727,14 @@ msgctxt "taxonomy.vocabulary.opening_hours_categories:description" msgid "Kategorier af åbningstider, f.eks. \"Åbent\" eller \"Telefontid\"" msgstr "Kategorier af åbningstider, f.eks. \"Åbent\" eller \"Telefontid\"" +msgctxt "taxonomy.vocabulary.screen_name:name" +msgid "Screen name" +msgstr "Screen name" + +msgctxt "taxonomy.vocabulary.screen_name:description" +msgid "Screens to display content on" +msgstr "Screens to display content on" + msgctxt "taxonomy.vocabulary.tags:name" msgid "Tags" msgstr "Tags" diff --git a/web/themes/custom/novel/templates/components/full-event.html.twig b/web/themes/custom/novel/templates/components/full-event.html.twig index ca8276f289..0a0620c241 100644 --- a/web/themes/custom/novel/templates/components/full-event.html.twig +++ b/web/themes/custom/novel/templates/components/full-event.html.twig @@ -5,7 +5,7 @@ title: label, teaser_text: teaser_text, categories: categories, - date: date, + date: expired ? 'Expired'|t({}, {'context': 'DPL event'}) : date, media: image.0, baseIconPath: baseIconPath, cta: cta diff --git a/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig b/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig index 757664ee05..3980a5956b 100644 --- a/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig +++ b/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig @@ -1,5 +1,9 @@ {% set date = eventinstance.get('date').get(0) %} {% set description_items = [ + { + label: 'Date'|t({}, {'context': 'DPL event'}), + value: content.date + }, { label: "Time"|trans, value: date ? date.get('start_date').getValue().getTimestamp()|format_date('custom', 'H:i') ~ ' - ' ~ date.get('end_date').getValue().getTimestamp()|format_date('custom', 'H:i') : null @@ -38,4 +42,5 @@ 'teaser_text': content.event_teaser_text, 'tags': content.event_tags, 'event_instances': event_instances, + 'expired': expired } only %} diff --git a/yarn.lock b/yarn.lock index c8ac81cfc1..3c109d296a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -318,62 +318,62 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^8.17.0": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.17.0.tgz#2ee073c421f4e81e02d10e731241664b6253b23c" - integrity sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w== +"@typescript-eslint/eslint-plugin@^8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.0.tgz#0901933326aea4443b81df3f740ca7dfc45c7bea" + integrity sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.17.0" - "@typescript-eslint/type-utils" "8.17.0" - "@typescript-eslint/utils" "8.17.0" - "@typescript-eslint/visitor-keys" "8.17.0" + "@typescript-eslint/scope-manager" "8.18.0" + "@typescript-eslint/type-utils" "8.18.0" + "@typescript-eslint/utils" "8.18.0" + "@typescript-eslint/visitor-keys" "8.18.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@^8.17.0": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.17.0.tgz#2ee972bb12fa69ac625b85813dc8d9a5a053ff52" - integrity sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg== +"@typescript-eslint/parser@^8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.18.0.tgz#a1c9456cbb6a089730bf1d3fc47946c5fb5fe67b" + integrity sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q== dependencies: - "@typescript-eslint/scope-manager" "8.17.0" - "@typescript-eslint/types" "8.17.0" - "@typescript-eslint/typescript-estree" "8.17.0" - "@typescript-eslint/visitor-keys" "8.17.0" + "@typescript-eslint/scope-manager" "8.18.0" + "@typescript-eslint/types" "8.18.0" + "@typescript-eslint/typescript-estree" "8.18.0" + "@typescript-eslint/visitor-keys" "8.18.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.17.0": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz#a3f49bf3d4d27ff8d6b2ea099ba465ef4dbcaa3a" - integrity sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg== +"@typescript-eslint/scope-manager@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz#30b040cb4557804a7e2bcc65cf8fdb630c96546f" + integrity sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw== dependencies: - "@typescript-eslint/types" "8.17.0" - "@typescript-eslint/visitor-keys" "8.17.0" + "@typescript-eslint/types" "8.18.0" + "@typescript-eslint/visitor-keys" "8.18.0" -"@typescript-eslint/type-utils@8.17.0": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz#d326569f498cdd0edf58d5bb6030b4ad914e63d3" - integrity sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw== +"@typescript-eslint/type-utils@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.18.0.tgz#6f0d12cf923b6fd95ae4d877708c0adaad93c471" + integrity sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow== dependencies: - "@typescript-eslint/typescript-estree" "8.17.0" - "@typescript-eslint/utils" "8.17.0" + "@typescript-eslint/typescript-estree" "8.18.0" + "@typescript-eslint/utils" "8.18.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@8.17.0": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.17.0.tgz#ef84c709ef8324e766878834970bea9a7e3b72cf" - integrity sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA== +"@typescript-eslint/types@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.18.0.tgz#3afcd30def8756bc78541268ea819a043221d5f3" + integrity sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA== -"@typescript-eslint/typescript-estree@8.17.0": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz#40b5903bc929b1e8dd9c77db3cb52cfb199a2a34" - integrity sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw== +"@typescript-eslint/typescript-estree@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz#d8ca785799fbb9c700cdff1a79c046c3e633c7f9" + integrity sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg== dependencies: - "@typescript-eslint/types" "8.17.0" - "@typescript-eslint/visitor-keys" "8.17.0" + "@typescript-eslint/types" "8.18.0" + "@typescript-eslint/visitor-keys" "8.18.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -381,22 +381,22 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@8.17.0": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.17.0.tgz#41c05105a2b6ab7592f513d2eeb2c2c0236d8908" - integrity sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w== +"@typescript-eslint/utils@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.18.0.tgz#48f67205d42b65d895797bb7349d1be5c39a62f7" + integrity sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.17.0" - "@typescript-eslint/types" "8.17.0" - "@typescript-eslint/typescript-estree" "8.17.0" + "@typescript-eslint/scope-manager" "8.18.0" + "@typescript-eslint/types" "8.18.0" + "@typescript-eslint/typescript-estree" "8.18.0" -"@typescript-eslint/visitor-keys@8.17.0": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz#4dbcd0e28b9bf951f4293805bf34f98df45e1aa8" - integrity sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg== +"@typescript-eslint/visitor-keys@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz#7b6d33534fa808e33a19951907231ad2ea5c36dd" + integrity sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw== dependencies: - "@typescript-eslint/types" "8.17.0" + "@typescript-eslint/types" "8.18.0" eslint-visitor-keys "^4.2.0" "@ungap/structured-clone@^1.2.0": @@ -1432,10 +1432,10 @@ csstype@^3.1.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== -cypress-if@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/cypress-if/-/cypress-if-1.13.1.tgz#8dec152d5bce20b054b4bba63bf4b287f6d517ca" - integrity sha512-lm+fYzTAgSWvXFRaBKFmEjzm1BomWa381fT+DESaD3QwrXC7OPdaXZOyE/3wvGaSILQaWkmjEb9nehANWotRGQ== +cypress-if@^1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/cypress-if/-/cypress-if-1.13.2.tgz#e33e175e3d181b234da368b90bc951683e4d6e88" + integrity sha512-qW42/GC9ORZNDcKpk5R8aF/AAmdRH8fwkX2ZO/SzeC7P3ogzmNRTObykUlAQITsMMpo65PqacJ0/LFMA5gyzrg== dependencies: debug "^4.3.4" @@ -1449,10 +1449,10 @@ cypress-plugin-api@^2.11.2: set-cookie-parser "^2.5.1" vue "^3.2.41" -cypress@^13.16.0: - version "13.16.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.16.0.tgz#7674ca33941f9da58f15fd4e3456856d87730970" - integrity sha512-g6XcwqnvzXrqiBQR/5gN+QsyRmKRhls1y5E42fyOvsmU7JuY+wM6uHJWj4ZPttjabzbnRvxcik2WemR8+xT6FA== +cypress@^13.16.1: + version "13.16.1" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.16.1.tgz#82e776f6ad2037ccce6b6feabed768615c476258" + integrity sha512-17FtCaz0cx7ssWYKXzGB0Vub8xHwpVPr+iPt2fHhLMDhVAPVrplD+rTQsZUsfb19LVBn5iwkEUFjQ1yVVJXsLA== dependencies: "@cypress/request" "^3.0.6" "@cypress/xvfb" "^1.2.4" @@ -3723,12 +3723,7 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== -nanoid@^3.3.1: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - -nanoid@^3.3.6: +nanoid@^3.3.1, nanoid@^3.3.6: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== @@ -5390,10 +5385,10 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" -wiremock-rest-client@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/wiremock-rest-client/-/wiremock-rest-client-1.10.0.tgz#3372e5454a0d5f05386f3dab78499ec34fefe5fe" - integrity sha512-Xv7mDaakcsAxaFYfIltgK/sM87lawSUIP8oKhxmFByu0EBaNxO6JO+8zH6tWn3iP0pU9rDjoWVxQCy5hez1N8Q== +wiremock-rest-client@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/wiremock-rest-client/-/wiremock-rest-client-1.11.0.tgz#40d0833189ec36ff21274eeb18fe7063e4b7f21f" + integrity sha512-2EBj80RJdwJNpCnetjUwkdTgnMW4Bq8sFdtR84hmjFZPhW2eE0HmBfhxTztTQ2PtoGOoqIlXh6VK2fvD4pYQ6Q== dependencies: commander "^6.2.1" cross-fetch "^3.1.5"