diff --git a/.github/workflows/artifact.yml b/.github/workflows/artifact.yml
index 969bfa81..c964e0b2 100644
--- a/.github/workflows/artifact.yml
+++ b/.github/workflows/artifact.yml
@@ -7,37 +7,4 @@ on:
name: Build artifacts
jobs:
build:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
-
- - name: Install and start Stonehenge
- run: |
- git clone -b 5.x https://github.com/druidfi/stonehenge.git ~/stonehenge
- cd ~/stonehenge && make up
-
- # This must be done after we start Stonehenge.
- - name: Setup Docker compose environment variables
- run: |
- echo "COMPOSE_FILE=compose.yaml:compose.ci.yaml" >> $GITHUB_ENV
-
- - name: Start project
- run: make up
-
- - name: Build project
- run: docker compose exec app bash -c "composer install --no-interaction"
-
- - name: Setup drupal and save database dump
- run: |
- docker compose exec app bash -c "drush si -y && drush cr"
- docker compose exec app bash -c "drush si --existing-config -y"
- docker compose exec app bash -c "drush cr"
- docker compose exec app bash -c "drush cim -y"
- docker compose exec app bash -c "drush sql-dump --result-file=/app/latest.sql"
-
- - name: Upload latest database dump
- uses: actions/upload-artifact@v4
- with:
- name: latest.sql
- path: latest.sql
- retention-days: 10
+ uses: city-of-helsinki/drupal-gh-actions/.github/workflows/build-artifact.yml@main
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 232aff57..33177f0a 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -5,78 +5,4 @@ on:
name: CI
jobs:
tests:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
-
- - name: Make sure configuration was exported in correct language (en or und)
- run: |
- OUTPUT=$(grep -oP '^langcode: \b(?!(?:en|und)\b)\w+' conf -R || true)
-
- if [ ! -z "$OUTPUT" ]; then
- echo "Found configuration that does not match the pattern 'langcode: (en|und)':" >> $GITHUB_STEP_SUMMARY
- echo "$OUTPUT" >> $GITHUB_STEP_SUMMARY
- exit 1
- fi
-
- - name: Install and start Stonehenge
- run: |
- git clone -b 5.x https://github.com/druidfi/stonehenge.git ~/stonehenge
- cd ~/stonehenge && make up
-
- # This must be done after we start Stonehenge.
- - name: Setup Docker compose environment variables
- run: |
- echo "COMPOSE_FILE=compose.yaml:compose.ci.yaml" >> $GITHUB_ENV
- echo "COMPOSE_PROFILES=" >> $GITHUB_ENV
-
- - name: Start project
- run: make up
-
- - name: Build project
- run: docker compose exec app bash -c "composer install --no-interaction"
-
- - name: Scan security updates
- run: docker compose exec app bash -c "composer audit"
-
- - name: Check that subtheme is not built with dev mode
- run: docker compose exec app bash -c "if grep -q 'sourceMappingURL=' -R public/themes/custom/hdbt_subtheme/dist/css; then exit 1; fi"
-
- - name: Run PHPCS
- run: |
- docker compose exec app bash -c "vendor/bin/phpcs public/modules/custom/"
- docker compose exec app bash -c "vendor/bin/phpcs public/themes/custom/"
-
- - name: Run phpstan
- run: docker compose exec app bash -c "vendor/bin/phpstan analyze"
-
- - name: Download latest dump
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: gh run download -n latest.sql
-
- - name: Install Drupal
- run: |
- docker compose exec app bash -c "mysql --user=drupal --password=drupal --database=drupal --host=db --port=3306 -A < latest.sql"
- docker compose exec app bash -c "drush deploy"
-
- - name: Run PHPUnit tests
- run: |
- docker compose exec app bash -c "mkdir -p /app/results"
-
- if [ -d "tests/" ]; then
- docker compose exec app bash -c "composer test-php tests/"
- fi
- docker compose exec app bash -c "composer test-php public/modules/custom"
-
- - name: Export logs
- if: always()
- run: docker compose logs app > results/service.log
-
- - name: Create an artifact from test report
- uses: actions/upload-artifact@v4
- if: always()
- with:
- name: results
- path: results/
- retention-days: 1
+ uses: city-of-helsinki/drupal-gh-actions/.github/workflows/project-tests.yml@main
diff --git a/.github/workflows/update-config.yml b/.github/workflows/update-config.yml
index 64af8562..f8e0cf0a 100644
--- a/.github/workflows/update-config.yml
+++ b/.github/workflows/update-config.yml
@@ -3,106 +3,8 @@ on:
repository_dispatch:
types: [config_change]
name: Update config
-env:
- GH_TOKEN: ${{ github.token }}
jobs:
update-config:
- runs-on: ubuntu-latest
- container:
- image: ghcr.io/city-of-helsinki/drupal-web:8.3
- options: --hostname app --user 1001
- services:
- db:
- image: mysql:8
- env:
- MYSQL_USER: drupal
- MYSQL_PASSWORD: drupal
- MYSQL_DATABASE: drupal
- MYSQL_ROOT_PASSWORD: drupal
- ports:
- - 3306:3306
-
- steps:
- - uses: actions/checkout@v4
-
- - name: Check if required secrets are set
- env:
- AUTOMATIC_UPDATE_TOKEN: ${{ secrets.AUTOMATIC_UPDATE_TOKEN }}
- if: env.AUTOMATIC_UPDATE_TOKEN == ''
- run: exit 1
-
- - name: Download latest dump
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: |
- gh run download -n latest.sql
-
- - name: Prepare setup
- run: |
- # We install Drupal from existing dump, so locale_install() hook
- # is never fired. Make sure the translations folder exists.
- mkdir -p public/sites/default/files/translations -p
-
- - name: Build project
- run: |
- composer install --no-interaction
- $(drush sql:connect) < latest.sql
- drush cim -y && drush updb -y && drush cr
- composer update drupal/helfi_* drupal/hdbt* -W --no-interaction
- drush cr
-
- # Update translations from localize.drupal.org and helfi-modules
- # before running update hooks to reduce clutter in configuration files.
- drush locale:check && drush locale:update
- drush updb -y
-
- # Update translations from helfi_platform_config. These translations
- # consists of overrides for non customised translations and will
- # override current translation with a non customised translation.
- drush helfi:locale-import helfi_platform_config
- drush cex -y
-
- # Update platform
- drush helfi:tools:update-platform
-
- - name: Check module versions
- id: module-status
- run: |
- MODE="delete"
- drush helfi:tools:check-composer-versions $GITHUB_WORKSPACE/composer.lock --format=markdown_table >> $GITHUB_STEP_SUMMARY && EXIT_CODE=$? || EXIT_CODE=$?
- if [ "$EXIT_CODE" -eq 3 ]; then
- MODE="upsert"
- echo " " >> $GITHUB_STEP_SUMMARY
- echo ":warning: Failed to install the latest version of the packages listed above" >> $GITHUB_STEP_SUMMARY
- echo " " >> $GITHUB_STEP_SUMMARY
- echo "Please run \`composer why-not drupal/package_name package_version\` to see why." >> $GITHUB_STEP_SUMMARY
- fi
- echo "MODE=$MODE" >> $GITHUB_OUTPUT
- cat $GITHUB_STEP_SUMMARY > /tmp/pr-message.txt
-
- - name: Create Pull Request
- uses: peter-evans/create-pull-request@v6
- with:
- commit-message: Update configuration
- token: ${{ secrets.AUTOMATIC_UPDATE_TOKEN }}
- title: Automatic update
- labels: auto-update
- body: |
- - Updated active configuration.
- - Updated platform
- branch: update-configuration
-
- - name: Attempt to find PR
- env:
- BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
- id: find-pr
- run: echo "number=$(gh pr list --base ${BRANCH_NAME} --head update-configuration --json number --jq '.[].number')" >> $GITHUB_OUTPUT
-
- - name: Comment PR
- uses: thollander/actions-comment-pull-request@v2
- if: ${{ steps.find-pr.outputs.number != '' }}
- with:
- comment_tag: status
- mode: ${{ steps.module-status.outputs.MODE }}
- filePath: /tmp/pr-message.txt
- pr_number: ${{ steps.find-pr.outputs.number }}
+ uses: city-of-helsinki/drupal-gh-actions/.github/workflows/update-config.yml@main
+ secrets:
+ automatic_update_token: ${{ secrets.AUTOMATIC_UPDATE_TOKEN }}
diff --git a/composer.lock b/composer.lock
index 2fb7fff0..ba6050b0 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": "d5c892f4c13dc81a0b7e75e8a1880bb3",
+ "content-hash": "74445a5c4d101aa778d506df099724ce",
"packages": [
{
"name": "asm89/stack-cors",
@@ -326,28 +326,88 @@
],
"time": "2024-07-16T11:13:48+00:00"
},
+ {
+ "name": "christian-riesen/base32",
+ "version": "1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ChristianRiesen/base32.git",
+ "reference": "2e82dab3baa008e24a505649b0d583c31d31e894"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ChristianRiesen/base32/zipball/2e82dab3baa008e24a505649b0d583c31d31e894",
+ "reference": "2e82dab3baa008e24a505649b0d583c31d31e894",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.17",
+ "phpstan/phpstan": "^0.12",
+ "phpunit/phpunit": "^8.5.13 || ^9.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Base32\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Riesen",
+ "email": "chris.riesen@gmail.com",
+ "homepage": "http://christianriesen.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Base32 encoder/decoder according to RFC 4648",
+ "homepage": "https://github.com/ChristianRiesen/base32",
+ "keywords": [
+ "base32",
+ "decode",
+ "encode",
+ "rfc4648"
+ ],
+ "support": {
+ "issues": "https://github.com/ChristianRiesen/base32/issues",
+ "source": "https://github.com/ChristianRiesen/base32/tree/1.6.0"
+ },
+ "time": "2021-02-26T10:19:33+00:00"
+ },
{
"name": "christian-riesen/otp",
- "version": "2.7.0",
+ "version": "2.3.0",
"source": {
"type": "git",
"url": "https://github.com/ChristianRiesen/otp.git",
- "reference": "aab865ae6d356993ad9d51f8a7e8f32b8a54730a"
+ "reference": "83f941e1ad6f7a2ff318e30cbf5b3219e63a9a62"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ChristianRiesen/otp/zipball/aab865ae6d356993ad9d51f8a7e8f32b8a54730a",
- "reference": "aab865ae6d356993ad9d51f8a7e8f32b8a54730a",
+ "url": "https://api.github.com/repos/ChristianRiesen/otp/zipball/83f941e1ad6f7a2ff318e30cbf5b3219e63a9a62",
+ "reference": "83f941e1ad6f7a2ff318e30cbf5b3219e63a9a62",
"shasum": ""
},
"require": {
- "paragonie/constant_time_encoding": "^1|^2",
- "paragonie/random_compat": ">=1",
- "php": ">=5.6.0",
- "symfony/polyfill-php56": "^1"
+ "christian-riesen/base32": "^1.0",
+ "php": ">=5.4.0"
},
"require-dev": {
- "phpunit/phpunit": "^5.7.11 || ^6.0.5"
+ "phpunit/phpunit": "^4.8"
+ },
+ "suggest": {
+ "paragonie/random_compat": "Optional polyfill for a more secure random generator for pre PHP7 versions"
},
"type": "library",
"extra": {
@@ -384,9 +444,9 @@
],
"support": {
"issues": "https://github.com/ChristianRiesen/otp/issues",
- "source": "https://github.com/ChristianRiesen/otp/tree/2.7.0"
+ "source": "https://github.com/ChristianRiesen/otp/tree/master"
},
- "time": "2021-02-23T20:13:30+00:00"
+ "time": "2017-01-08T16:58:00+00:00"
},
{
"name": "commerceguys/addressing",
@@ -1757,7 +1817,7 @@
"homepage": "https://www.drupal.org/user/86106"
},
{
- "name": "Centarro",
+ "name": "centarro",
"homepage": "https://www.drupal.org/user/3661446"
},
{
@@ -2257,16 +2317,16 @@
},
{
"name": "drupal/core",
- "version": "10.3.10",
+ "version": "10.4.1",
"source": {
"type": "git",
"url": "https://github.com/drupal/core.git",
- "reference": "3ebb71e9c4ef0c13f683353547551fca49f9a144"
+ "reference": "0aeb6303b33d813a68ea78c40466715d9fcfac46"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/drupal/core/zipball/3ebb71e9c4ef0c13f683353547551fca49f9a144",
- "reference": "3ebb71e9c4ef0c13f683353547551fca49f9a144",
+ "url": "https://api.github.com/repos/drupal/core/zipball/0aeb6303b33d813a68ea78c40466715d9fcfac46",
+ "reference": "0aeb6303b33d813a68ea78c40466715d9fcfac46",
"shasum": ""
},
"require": {
@@ -2312,7 +2372,7 @@
"symfony/serializer": "^6.4",
"symfony/validator": "^6.4",
"symfony/yaml": "^6.4",
- "twig/twig": "^3.14.2"
+ "twig/twig": "^3.15.0"
},
"conflict": {
"drush/drush": "<12.4.3"
@@ -2415,22 +2475,22 @@
],
"description": "Drupal is an open source content management platform powering millions of websites and applications.",
"support": {
- "source": "https://github.com/drupal/core/tree/10.3.10"
+ "source": "https://github.com/drupal/core/tree/10.4.1"
},
- "time": "2024-11-22T12:51:33+00:00"
+ "time": "2025-01-06T23:26:38+00:00"
},
{
"name": "drupal/core-composer-scaffold",
- "version": "10.3.10",
+ "version": "10.4.1",
"source": {
"type": "git",
"url": "https://github.com/drupal/core-composer-scaffold.git",
- "reference": "f58ab5c0d02d275c5aa226c4505b457e41b161cc"
+ "reference": "db17b59620ce1c142a34dc017d9e696ce4771e55"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/f58ab5c0d02d275c5aa226c4505b457e41b161cc",
- "reference": "f58ab5c0d02d275c5aa226c4505b457e41b161cc",
+ "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/db17b59620ce1c142a34dc017d9e696ce4771e55",
+ "reference": "db17b59620ce1c142a34dc017d9e696ce4771e55",
"shasum": ""
},
"require": {
@@ -2465,9 +2525,9 @@
"drupal"
],
"support": {
- "source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.10"
+ "source": "https://github.com/drupal/core-composer-scaffold/tree/10.4.1"
},
- "time": "2024-08-22T14:31:34+00:00"
+ "time": "2024-08-22T14:31:30+00:00"
},
{
"name": "drupal/crop",
@@ -2966,17 +3026,17 @@
},
{
"name": "drupal/editoria11y",
- "version": "2.1.21",
+ "version": "2.2.0",
"source": {
"type": "git",
"url": "https://git.drupalcode.org/project/editoria11y.git",
- "reference": "2.1.21"
+ "reference": "2.2.0"
},
"dist": {
"type": "zip",
- "url": "https://ftp.drupal.org/files/projects/editoria11y-2.1.21.zip",
- "reference": "2.1.21",
- "shasum": "6ec1bb5cfa15408e3372d7e0d0a1355030a9f20b"
+ "url": "https://ftp.drupal.org/files/projects/editoria11y-2.2.0.zip",
+ "reference": "2.2.0",
+ "shasum": "fc06c2b27be7432f4692e37c787fa935e9d4f9f7"
},
"require": {
"drupal/core": "^9 || ^10 || ^11"
@@ -2987,8 +3047,8 @@
"type": "drupal-module",
"extra": {
"drupal": {
- "version": "2.1.21",
- "datestamp": "1731602531",
+ "version": "2.2.0",
+ "datestamp": "1736189388",
"security-coverage": {
"status": "covered",
"message": "Covered by Drupal's security advisory policy"
@@ -3233,7 +3293,7 @@
"homepage": "https://www.drupal.org/user/2416470"
},
{
- "name": "TR",
+ "name": "tr",
"homepage": "https://www.drupal.org/user/202830"
}
],
@@ -3636,17 +3696,17 @@
},
{
"name": "drupal/externalauth",
- "version": "2.0.6",
+ "version": "2.0.7",
"source": {
"type": "git",
"url": "https://git.drupalcode.org/project/externalauth.git",
- "reference": "2.0.6"
+ "reference": "2.0.7"
},
"dist": {
"type": "zip",
- "url": "https://ftp.drupal.org/files/projects/externalauth-2.0.6.zip",
- "reference": "2.0.6",
- "shasum": "0dbc9fbab0901e940d52b239e08f031797f6bd2a"
+ "url": "https://ftp.drupal.org/files/projects/externalauth-2.0.7.zip",
+ "reference": "2.0.7",
+ "shasum": "93c2b15f21172f931bb81cc365c828c12be377c3"
},
"require": {
"drupal/core": "^9.5 || ^10 || ^11"
@@ -3654,8 +3714,8 @@
"type": "drupal-module",
"extra": {
"drupal": {
- "version": "2.0.6",
- "datestamp": "1720689758",
+ "version": "2.0.7",
+ "datestamp": "1735897906",
"security-coverage": {
"status": "covered",
"message": "Covered by Drupal's security advisory policy"
@@ -3955,30 +4015,30 @@
},
{
"name": "drupal/gin",
- "version": "3.0.0-rc11",
+ "version": "4.0.2",
"source": {
"type": "git",
"url": "https://git.drupalcode.org/project/gin.git",
- "reference": "8.x-3.0-rc11"
+ "reference": "4.0.2"
},
"dist": {
"type": "zip",
- "url": "https://ftp.drupal.org/files/projects/gin-8.x-3.0-rc11.zip",
- "reference": "8.x-3.0-rc11",
- "shasum": "532000cb8497412fb4b26efc362c7fc9efc44546"
+ "url": "https://ftp.drupal.org/files/projects/gin-4.0.2.zip",
+ "reference": "4.0.2",
+ "shasum": "501f167bd7009cffa29848a918b3982cb0a8245b"
},
"require": {
- "drupal/core": "^9 || ^10 || ^11",
- "drupal/gin_toolbar": "^1.0@beta"
+ "drupal/core": "^10 || ^11",
+ "drupal/gin_toolbar": "^2.0"
},
"type": "drupal-theme",
"extra": {
"drupal": {
- "version": "8.x-3.0-rc11",
- "datestamp": "1719568502",
+ "version": "4.0.2",
+ "datestamp": "1735405135",
"security-coverage": {
- "status": "not-covered",
- "message": "RC releases are not covered by Drupal security advisories."
+ "status": "covered",
+ "message": "Covered by Drupal's security advisory policy"
}
}
},
@@ -4021,17 +4081,17 @@
},
{
"name": "drupal/gin_toolbar",
- "version": "1.0.0-rc6",
+ "version": "2.0.0",
"source": {
"type": "git",
"url": "https://git.drupalcode.org/project/gin_toolbar.git",
- "reference": "8.x-1.0-rc6"
+ "reference": "2.0.0"
},
"dist": {
"type": "zip",
- "url": "https://ftp.drupal.org/files/projects/gin_toolbar-8.x-1.0-rc6.zip",
- "reference": "8.x-1.0-rc6",
- "shasum": "542def14b9a5435efb4e021d384fa3f7b0fc6e78"
+ "url": "https://ftp.drupal.org/files/projects/gin_toolbar-2.0.0.zip",
+ "reference": "2.0.0",
+ "shasum": "2befeab2de9f7953b76b1a36c9bfb6a7e3987b11"
},
"require": {
"drupal/core": "^9 || ^10 || ^11"
@@ -4039,11 +4099,11 @@
"type": "drupal-module",
"extra": {
"drupal": {
- "version": "8.x-1.0-rc6",
- "datestamp": "1718368950",
+ "version": "2.0.0",
+ "datestamp": "1734698921",
"security-coverage": {
- "status": "not-covered",
- "message": "RC releases are not covered by Drupal security advisories."
+ "status": "covered",
+ "message": "Covered by Drupal's security advisory policy"
}
}
},
@@ -4138,16 +4198,16 @@
},
{
"name": "drupal/hdbt",
- "version": "6.8.23",
+ "version": "6.8.34",
"source": {
"type": "git",
"url": "https://github.com/City-of-Helsinki/drupal-hdbt.git",
- "reference": "b14bd481f81a0be27eaf3ab2a1db0c2a86c66511"
+ "reference": "9216d2943483e75e9f5d9ed11eba03e836c93f98"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/City-of-Helsinki/drupal-hdbt/zipball/b14bd481f81a0be27eaf3ab2a1db0c2a86c66511",
- "reference": "b14bd481f81a0be27eaf3ab2a1db0c2a86c66511",
+ "url": "https://api.github.com/repos/City-of-Helsinki/drupal-hdbt/zipball/9216d2943483e75e9f5d9ed11eba03e836c93f98",
+ "reference": "9216d2943483e75e9f5d9ed11eba03e836c93f98",
"shasum": ""
},
"require": {
@@ -4166,42 +4226,34 @@
"Drupal"
],
"support": {
- "source": "https://github.com/City-of-Helsinki/drupal-hdbt/tree/6.8.23",
+ "source": "https://github.com/City-of-Helsinki/drupal-hdbt/tree/6.8.34",
"issues": "https://github.com/City-of-Helsinki/drupal-hdbt/issues"
},
- "time": "2024-12-17T07:20:53+00:00"
+ "time": "2025-01-14T10:26:39+00:00"
},
{
"name": "drupal/hdbt_admin",
- "version": "3.2.11",
+ "version": "3.3.0",
"source": {
"type": "git",
"url": "https://github.com/City-of-Helsinki/drupal-hdbt-admin.git",
- "reference": "a0d89ce0318306edac0cde747367217ed53b2196"
+ "reference": "5a8a9fdb5e390a30d7224e1c336874c080f11f96"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/City-of-Helsinki/drupal-hdbt-admin/zipball/a0d89ce0318306edac0cde747367217ed53b2196",
- "reference": "a0d89ce0318306edac0cde747367217ed53b2196",
+ "url": "https://api.github.com/repos/City-of-Helsinki/drupal-hdbt-admin/zipball/5a8a9fdb5e390a30d7224e1c336874c080f11f96",
+ "reference": "5a8a9fdb5e390a30d7224e1c336874c080f11f96",
"shasum": ""
},
"require": {
"drupal/admin_toolbar": "^3.0",
- "drupal/gin": "^3.0@rc"
+ "drupal/gin": "^4.0"
},
"conflict": {
- "drupal/gin": ">3.0.0-rc11",
"drupal/helfi_api_base": "<2.7.6",
"drupal/helfi_platform_config": "<4.3"
},
"type": "drupal-theme",
- "extra": {
- "patches": {
- "drupal/gin": {
- "[#UHF-10892] Gin sidebar nextsibling issue. (https://www.drupal.org/i/3460390)": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-hdbt-admin/d3e6cb08315b8df38696489d2c8f406a67f224b8/patches/gin-3460390-sidebar-nextsibling-innerhtml-rc11.patch"
- }
- }
- },
"license": [
"GPL-2.0+"
],
@@ -4210,10 +4262,10 @@
"Drupal"
],
"support": {
- "source": "https://github.com/City-of-Helsinki/drupal-hdbt-admin/tree/3.2.11",
+ "source": "https://github.com/City-of-Helsinki/drupal-hdbt-admin/tree/3.3.0",
"issues": "https://github.com/City-of-Helsinki/drupal-hdbt-admin/issues"
},
- "time": "2024-12-17T08:36:44+00:00"
+ "time": "2025-01-08T11:54:15+00:00"
},
{
"name": "drupal/health_check",
@@ -4315,16 +4367,16 @@
},
{
"name": "drupal/helfi_azure_fs",
- "version": "2.0.9",
+ "version": "2.0.10",
"source": {
"type": "git",
"url": "https://github.com/City-of-Helsinki/drupal-module-helfi-azure-fs.git",
- "reference": "88aedf8ae9ba1216069fdb2e69366dd6b87c0a38"
+ "reference": "f8715d98b7db4a0c5ab671256fbda8e0c3316e31"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/City-of-Helsinki/drupal-module-helfi-azure-fs/zipball/88aedf8ae9ba1216069fdb2e69366dd6b87c0a38",
- "reference": "88aedf8ae9ba1216069fdb2e69366dd6b87c0a38",
+ "url": "https://api.github.com/repos/City-of-Helsinki/drupal-module-helfi-azure-fs/zipball/f8715d98b7db4a0c5ab671256fbda8e0c3316e31",
+ "reference": "f8715d98b7db4a0c5ab671256fbda8e0c3316e31",
"shasum": ""
},
"require": {
@@ -4354,10 +4406,10 @@
],
"description": "Helfi - Azure FS",
"support": {
- "source": "https://github.com/City-of-Helsinki/drupal-module-helfi-azure-fs/tree/2.0.9",
+ "source": "https://github.com/City-of-Helsinki/drupal-module-helfi-azure-fs/tree/2.0.10",
"issues": "https://github.com/City-of-Helsinki/drupal-module-helfi-azure-fs/issues"
},
- "time": "2024-10-28T13:45:59+00:00"
+ "time": "2025-01-07T07:19:06+00:00"
},
{
"name": "drupal/helfi_drupal_tools",
@@ -4483,16 +4535,16 @@
},
{
"name": "drupal/helfi_platform_config",
- "version": "4.10.5",
+ "version": "4.12.3",
"source": {
"type": "git",
"url": "https://github.com/City-of-Helsinki/drupal-helfi-platform-config.git",
- "reference": "7c52e541f43948f3ad5603a07690f946c6604241"
+ "reference": "fb0ab912a4fe38d695cbfeb84ee623ea644dd6a2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/City-of-Helsinki/drupal-helfi-platform-config/zipball/7c52e541f43948f3ad5603a07690f946c6604241",
- "reference": "7c52e541f43948f3ad5603a07690f946c6604241",
+ "url": "https://api.github.com/repos/City-of-Helsinki/drupal-helfi-platform-config/zipball/fb0ab912a4fe38d695cbfeb84ee623ea644dd6a2",
+ "reference": "fb0ab912a4fe38d695cbfeb84ee623ea644dd6a2",
"shasum": ""
},
"require": {
@@ -4517,7 +4569,7 @@
"drupal/external_entities": "^2.0@beta",
"drupal/field_group": "^3.1",
"drupal/focal_point": "^2.0",
- "drupal/gin_toolbar": "^1.0@rc",
+ "drupal/gin_toolbar": "^2.0",
"drupal/hal": "^2.0",
"drupal/helfi_api_base": "*",
"drupal/helfi_tpr": "*",
@@ -4561,12 +4613,10 @@
"ruflin/elastica": "^8.0"
},
"conflict": {
- "drupal/core": ">=10.4.0",
- "drupal/core-composer-scaffold": ">=10.4.0",
- "drupal/core-dev": ">=10.4.0",
+ "drupal/core": "<10.4",
+ "drupal/core-composer-scaffold": "<10.4",
"drupal/ctools": "<3.11 || ^4.0.1",
"drupal/default_content": ">2.0.0-alpha2",
- "drupal/gin_toolbar": ">1.0.0-rc6",
"drupal/helfi_media_map": "*",
"drupal/stage_file_proxy": "<2.1.5",
"drush/drush": "<12"
@@ -4589,8 +4639,7 @@
"[#UHF-7008] Admin toolbar and contextual links should always be rendered in the admin language (https://www.drupal.org/project/drupal/issues/2313309)": "https://www.drupal.org/files/issues/2023-12-19/2313309-179.patch",
"[#UHF-9388] Process configuration translation files for custom modules (https://www.drupal.org/i/2845437)": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/fd68277191b8f8ec290e53b5fbbae699b2260384/patches/drupal-2845437-process-custom-module-translation-config-10.3.x.patch",
"[#UHF-9690] Allow updating lists when switching from allowed values to allowed values function (https://www.drupal.org/i/2873353)": "https://www.drupal.org/files/issues/2021-05-18/allow-allowed-values-function-update-D9-2873353_1.patch",
- "[#UHF-9952, #UHF-9980] Duplicate
tags (https://www.drupal.org/i/3083786)": "https://www.drupal.org/files/issues/2024-08-08/3083786--mr-8066--10-3-backport.patch",
- "[#UHF-10716] Ensure consistent ordering when calculating library asset order (https://www.drupal.org/i/3467860)": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/955e2fc9493c6574ab070187b8a5a8634da7daab/patches/drupal-3467860-optimized-js-assets-mismatch.patch"
+ "[#UHF-9952, #UHF-9980] Duplicate
tags (https://www.drupal.org/i/3083786)": "https://www.drupal.org/files/issues/2024-08-08/3083786--mr-8066--10-3-backport.patch"
},
"drupal/default_content": {
"https://www.drupal.org/project/default_content/issues/2640734#comment-14638943": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/main/patches/default_content_2.0.0-alpha2-2640734_manual_imports-e164a354.patch"
@@ -4619,10 +4668,10 @@
],
"description": "HELfi platform config",
"support": {
- "source": "https://github.com/City-of-Helsinki/drupal-helfi-platform-config/tree/4.10.5",
+ "source": "https://github.com/City-of-Helsinki/drupal-helfi-platform-config/tree/4.12.3",
"issues": "https://github.com/City-of-Helsinki/drupal-helfi-platform-config/issues"
},
- "time": "2024-12-18T08:08:55+00:00"
+ "time": "2025-01-13T06:44:52+00:00"
},
{
"name": "drupal/helfi_proxy",
@@ -4671,16 +4720,16 @@
},
{
"name": "drupal/helfi_tpr",
- "version": "2.3.10",
+ "version": "2.3.11",
"source": {
"type": "git",
"url": "https://github.com/City-of-Helsinki/drupal-module-helfi-tpr.git",
- "reference": "d98687373b1cb4647ad576403e470f049c7a4d3c"
+ "reference": "f7c04cdf1c4bfed2d075457429b66906828ffefa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/City-of-Helsinki/drupal-module-helfi-tpr/zipball/d98687373b1cb4647ad576403e470f049c7a4d3c",
- "reference": "d98687373b1cb4647ad576403e470f049c7a4d3c",
+ "url": "https://api.github.com/repos/City-of-Helsinki/drupal-module-helfi-tpr/zipball/f7c04cdf1c4bfed2d075457429b66906828ffefa",
+ "reference": "f7c04cdf1c4bfed2d075457429b66906828ffefa",
"shasum": ""
},
"require": {
@@ -4706,23 +4755,23 @@
],
"description": "TPR integration",
"support": {
- "source": "https://github.com/City-of-Helsinki/drupal-module-helfi-tpr/tree/2.3.10",
+ "source": "https://github.com/City-of-Helsinki/drupal-module-helfi-tpr/tree/2.3.11",
"issues": "https://github.com/City-of-Helsinki/drupal-module-helfi-tpr/issues"
},
- "time": "2024-11-29T09:43:38+00:00"
+ "time": "2025-01-10T08:30:42+00:00"
},
{
"name": "drupal/helfi_tunnistamo",
- "version": "3.0.9",
+ "version": "3.0.10",
"source": {
"type": "git",
"url": "https://github.com/City-of-Helsinki/drupal-module-helfi-tunnistamo.git",
- "reference": "8a489629636fef00d5fab73009b37a4b6fb7a266"
+ "reference": "13b645c119dc15b4707b31cde55baeb4a41dd29b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/City-of-Helsinki/drupal-module-helfi-tunnistamo/zipball/8a489629636fef00d5fab73009b37a4b6fb7a266",
- "reference": "8a489629636fef00d5fab73009b37a4b6fb7a266",
+ "url": "https://api.github.com/repos/City-of-Helsinki/drupal-module-helfi-tunnistamo/zipball/13b645c119dc15b4707b31cde55baeb4a41dd29b",
+ "reference": "13b645c119dc15b4707b31cde55baeb4a41dd29b",
"shasum": ""
},
"require": {
@@ -4739,10 +4788,10 @@
],
"description": "Tunnistamo integration",
"support": {
- "source": "https://github.com/City-of-Helsinki/drupal-module-helfi-tunnistamo/tree/3.0.9",
+ "source": "https://github.com/City-of-Helsinki/drupal-module-helfi-tunnistamo/tree/3.0.10",
"issues": "https://github.com/City-of-Helsinki/drupal-module-helfi-tunnistamo/issues"
},
- "time": "2024-09-03T07:23:36+00:00"
+ "time": "2024-12-20T10:35:33+00:00"
},
{
"name": "drupal/image_style_quality",
@@ -5638,17 +5687,17 @@
},
{
"name": "drupal/openid_connect",
- "version": "3.0.0-alpha4",
+ "version": "3.0.0-alpha5",
"source": {
"type": "git",
"url": "https://git.drupalcode.org/project/openid_connect.git",
- "reference": "3.0.0-alpha4"
+ "reference": "3.0.0-alpha5"
},
"dist": {
"type": "zip",
- "url": "https://ftp.drupal.org/files/projects/openid_connect-3.0.0-alpha4.zip",
- "reference": "3.0.0-alpha4",
- "shasum": "3239f8a2e5fc98de1be7561309cb12153ef5b7c9"
+ "url": "https://ftp.drupal.org/files/projects/openid_connect-3.0.0-alpha5.zip",
+ "reference": "3.0.0-alpha5",
+ "shasum": "6bca4f7ac0f675370008a0631095722347379b04"
},
"require": {
"drupal/core": "^9.5 || ^10.2 || ^11",
@@ -5659,8 +5708,8 @@
"type": "drupal-module",
"extra": {
"drupal": {
- "version": "3.0.0-alpha4",
- "datestamp": "1734043889",
+ "version": "3.0.0-alpha5",
+ "datestamp": "1735590945",
"security-coverage": {
"status": "not-covered",
"message": "Alpha releases are not covered by Drupal security advisories."
@@ -5906,11 +5955,11 @@
],
"authors": [
{
- "name": "Berdir",
+ "name": "berdir",
"homepage": "https://www.drupal.org/user/214652"
},
{
- "name": "Dave Reid",
+ "name": "dave reid",
"homepage": "https://www.drupal.org/user/53892"
},
{
@@ -6060,17 +6109,17 @@
},
{
"name": "drupal/raven",
- "version": "6.0.13",
+ "version": "6.0.14",
"source": {
"type": "git",
"url": "https://git.drupalcode.org/project/raven.git",
- "reference": "6.0.13"
+ "reference": "6.0.14"
},
"dist": {
"type": "zip",
- "url": "https://ftp.drupal.org/files/projects/raven-6.0.13.zip",
- "reference": "6.0.13",
- "shasum": "7b92e693dae63859457ba734c57382511b91af86"
+ "url": "https://ftp.drupal.org/files/projects/raven-6.0.14.zip",
+ "reference": "6.0.14",
+ "shasum": "4533faf65caad0068c6bb818f29b3151645a9686"
},
"require": {
"drupal/core": "^10.2 || ^11",
@@ -6078,14 +6127,15 @@
},
"require-dev": {
"drupal/csp": "^1.17 || ^2.0",
+ "drupal/monitoring": "^1.13",
"drupal/seckit": "^2.0",
"drush/drush": "^11.0 || ^12.0 || ^13.0"
},
"type": "drupal-module",
"extra": {
"drupal": {
- "version": "6.0.13",
- "datestamp": "1734389510",
+ "version": "6.0.14",
+ "datestamp": "1735930900",
"security-coverage": {
"status": "covered",
"message": "Covered by Drupal's security advisory policy"
@@ -6334,7 +6384,7 @@
],
"authors": [
{
- "name": "Berdir",
+ "name": "berdir",
"homepage": "https://www.drupal.org/user/214652"
},
{
@@ -6342,7 +6392,7 @@
"homepage": "https://www.drupal.org/user/53892"
},
{
- "name": "Kristen Pol",
+ "name": "kristen pol",
"homepage": "https://www.drupal.org/user/8389"
},
{
@@ -7890,16 +7940,16 @@
},
{
"name": "egulias/email-validator",
- "version": "4.0.2",
+ "version": "4.0.3",
"source": {
"type": "git",
"url": "https://github.com/egulias/EmailValidator.git",
- "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e"
+ "reference": "b115554301161fa21467629f1e1391c1936de517"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e",
- "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b115554301161fa21467629f1e1391c1936de517",
+ "reference": "b115554301161fa21467629f1e1391c1936de517",
"shasum": ""
},
"require": {
@@ -7945,7 +7995,7 @@
],
"support": {
"issues": "https://github.com/egulias/EmailValidator/issues",
- "source": "https://github.com/egulias/EmailValidator/tree/4.0.2"
+ "source": "https://github.com/egulias/EmailValidator/tree/4.0.3"
},
"funding": [
{
@@ -7953,7 +8003,7 @@
"type": "github"
}
],
- "time": "2023-10-06T06:47:41+00:00"
+ "time": "2024-12-27T00:36:43+00:00"
},
{
"name": "elastic/transport",
@@ -8015,16 +8065,16 @@
},
{
"name": "elasticsearch/elasticsearch",
- "version": "v8.16.0",
+ "version": "v8.17.0",
"source": {
"type": "git",
"url": "https://github.com/elastic/elasticsearch-php.git",
- "reference": "ab0fdb43f9e69f0d0539028d8b0b56cdf3328d85"
+ "reference": "6cd0fe6a95fdb7198a2795624927b094813b3d8b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/ab0fdb43f9e69f0d0539028d8b0b56cdf3328d85",
- "reference": "ab0fdb43f9e69f0d0539028d8b0b56cdf3328d85",
+ "url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/6cd0fe6a95fdb7198a2795624927b094813b3d8b",
+ "reference": "6cd0fe6a95fdb7198a2795624927b094813b3d8b",
"shasum": ""
},
"require": {
@@ -8067,9 +8117,9 @@
],
"support": {
"issues": "https://github.com/elastic/elasticsearch-php/issues",
- "source": "https://github.com/elastic/elasticsearch-php/tree/v8.16.0"
+ "source": "https://github.com/elastic/elasticsearch-php/tree/v8.17.0"
},
- "time": "2024-11-14T22:23:33+00:00"
+ "time": "2024-12-18T11:00:27+00:00"
},
{
"name": "ezyang/htmlpurifier",
@@ -9896,16 +9946,16 @@
},
{
"name": "nikic/php-parser",
- "version": "v5.3.1",
+ "version": "v5.4.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b"
+ "reference": "447a020a1f875a434d62f2a401f53b82a396e494"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b",
- "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494",
+ "reference": "447a020a1f875a434d62f2a401f53b82a396e494",
"shasum": ""
},
"require": {
@@ -9948,22 +9998,22 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0"
},
- "time": "2024-10-08T18:51:32+00:00"
+ "time": "2024-12-30T11:07:19+00:00"
},
{
"name": "open-telemetry/api",
- "version": "1.1.2",
+ "version": "1.2.0",
"source": {
"type": "git",
"url": "https://github.com/opentelemetry-php/api.git",
- "reference": "04c85a1e41a3d59fa9bdc801a5de1df6624b95ed"
+ "reference": "351a30baa79699de3de3a814c8ccc7b52ccdfb1d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/04c85a1e41a3d59fa9bdc801a5de1df6624b95ed",
- "reference": "04c85a1e41a3d59fa9bdc801a5de1df6624b95ed",
+ "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/351a30baa79699de3de3a814c8ccc7b52ccdfb1d",
+ "reference": "351a30baa79699de3de3a814c8ccc7b52ccdfb1d",
"shasum": ""
},
"require": {
@@ -10020,7 +10070,7 @@
"issues": "https://github.com/open-telemetry/opentelemetry-php/issues",
"source": "https://github.com/open-telemetry/opentelemetry-php"
},
- "time": "2024-11-16T04:32:30+00:00"
+ "time": "2025-01-08T23:50:34+00:00"
},
{
"name": "open-telemetry/context",
@@ -10083,24 +10133,24 @@
},
{
"name": "paragonie/constant_time_encoding",
- "version": "v2.7.0",
+ "version": "v3.0.0",
"source": {
"type": "git",
"url": "https://github.com/paragonie/constant_time_encoding.git",
- "reference": "52a0d99e69f56b9ec27ace92ba56897fe6993105"
+ "reference": "df1e7fde177501eee2037dd159cf04f5f301a512"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/52a0d99e69f56b9ec27ace92ba56897fe6993105",
- "reference": "52a0d99e69f56b9ec27ace92ba56897fe6993105",
+ "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512",
+ "reference": "df1e7fde177501eee2037dd159cf04f5f301a512",
"shasum": ""
},
"require": {
- "php": "^7|^8"
+ "php": "^8"
},
"require-dev": {
- "phpunit/phpunit": "^6|^7|^8|^9",
- "vimeo/psalm": "^1|^2|^3|^4"
+ "phpunit/phpunit": "^9",
+ "vimeo/psalm": "^4|^5"
},
"type": "library",
"autoload": {
@@ -10146,7 +10196,7 @@
"issues": "https://github.com/paragonie/constant_time_encoding/issues",
"source": "https://github.com/paragonie/constant_time_encoding"
},
- "time": "2024-05-08T12:18:48+00:00"
+ "time": "2024-05-08T12:36:18+00:00"
},
{
"name": "paragonie/random_compat",
@@ -11765,16 +11815,16 @@
},
{
"name": "symfony/console",
- "version": "v6.4.15",
+ "version": "v6.4.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd"
+ "reference": "799445db3f15768ecc382ac5699e6da0520a0a04"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/f1fc6f47283e27336e7cebb9e8946c8de7bff9bd",
- "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd",
+ "url": "https://api.github.com/repos/symfony/console/zipball/799445db3f15768ecc382ac5699e6da0520a0a04",
+ "reference": "799445db3f15768ecc382ac5699e6da0520a0a04",
"shasum": ""
},
"require": {
@@ -11839,7 +11889,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v6.4.15"
+ "source": "https://github.com/symfony/console/tree/v6.4.17"
},
"funding": [
{
@@ -11855,7 +11905,7 @@
"type": "tidelift"
}
],
- "time": "2024-11-06T14:19:14+00:00"
+ "time": "2024-12-07T12:07:30+00:00"
},
{
"name": "symfony/dependency-injection",
@@ -11957,12 +12007,12 @@
},
"type": "library",
"extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
"branch-alias": {
"dev-main": "3.5-dev"
- },
- "thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
}
},
"autoload": {
@@ -12007,16 +12057,16 @@
},
{
"name": "symfony/error-handler",
- "version": "v6.4.14",
+ "version": "v6.4.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
- "reference": "9e024324511eeb00983ee76b9aedc3e6ecd993d9"
+ "reference": "37ad2380e8c1a8cf62a1200a5c10080b679b446c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/9e024324511eeb00983ee76b9aedc3e6ecd993d9",
- "reference": "9e024324511eeb00983ee76b9aedc3e6ecd993d9",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/37ad2380e8c1a8cf62a1200a5c10080b679b446c",
+ "reference": "37ad2380e8c1a8cf62a1200a5c10080b679b446c",
"shasum": ""
},
"require": {
@@ -12062,7 +12112,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/error-handler/tree/v6.4.14"
+ "source": "https://github.com/symfony/error-handler/tree/v6.4.17"
},
"funding": [
{
@@ -12078,7 +12128,7 @@
"type": "tidelift"
}
],
- "time": "2024-11-05T15:34:40+00:00"
+ "time": "2024-12-06T13:30:51+00:00"
},
{
"name": "symfony/event-dispatcher",
@@ -12180,12 +12230,12 @@
},
"type": "library",
"extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
"branch-alias": {
"dev-main": "3.5-dev"
- },
- "thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
}
},
"autoload": {
@@ -12304,16 +12354,16 @@
},
{
"name": "symfony/finder",
- "version": "v6.4.13",
+ "version": "v6.4.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958"
+ "reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/daea9eca0b08d0ed1dc9ab702a46128fd1be4958",
- "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7",
+ "reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7",
"shasum": ""
},
"require": {
@@ -12348,7 +12398,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v6.4.13"
+ "source": "https://github.com/symfony/finder/tree/v6.4.17"
},
"funding": [
{
@@ -12364,7 +12414,7 @@
"type": "tidelift"
}
],
- "time": "2024-10-01T08:30:56+00:00"
+ "time": "2024-12-29T13:51:37+00:00"
},
{
"name": "symfony/http-foundation",
@@ -12445,16 +12495,16 @@
},
{
"name": "symfony/http-kernel",
- "version": "v6.4.16",
+ "version": "v6.4.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "8838b5b21d807923b893ccbfc2cbeda0f1bc00f0"
+ "reference": "c5647393c5ce11833d13e4b70fff4b571d4ac710"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/8838b5b21d807923b893ccbfc2cbeda0f1bc00f0",
- "reference": "8838b5b21d807923b893ccbfc2cbeda0f1bc00f0",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c5647393c5ce11833d13e4b70fff4b571d4ac710",
+ "reference": "c5647393c5ce11833d13e4b70fff4b571d4ac710",
"shasum": ""
},
"require": {
@@ -12539,7 +12589,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.16"
+ "source": "https://github.com/symfony/http-kernel/tree/v6.4.17"
},
"funding": [
{
@@ -12555,7 +12605,7 @@
"type": "tidelift"
}
],
- "time": "2024-11-27T12:49:36+00:00"
+ "time": "2024-12-31T14:49:31+00:00"
},
{
"name": "symfony/mailer",
@@ -12639,16 +12689,16 @@
},
{
"name": "symfony/mime",
- "version": "v6.4.13",
+ "version": "v6.4.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
- "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855"
+ "reference": "ea87c8850a54ff039d3e0ab4ae5586dd4e6c0232"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mime/zipball/1de1cf14d99b12c7ebbb850491ec6ae3ed468855",
- "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/ea87c8850a54ff039d3e0ab4ae5586dd4e6c0232",
+ "reference": "ea87c8850a54ff039d3e0ab4ae5586dd4e6c0232",
"shasum": ""
},
"require": {
@@ -12704,7 +12754,7 @@
"mime-type"
],
"support": {
- "source": "https://github.com/symfony/mime/tree/v6.4.13"
+ "source": "https://github.com/symfony/mime/tree/v6.4.17"
},
"funding": [
{
@@ -12720,7 +12770,7 @@
"type": "tidelift"
}
],
- "time": "2024-10-25T15:07:50+00:00"
+ "time": "2024-12-02T11:09:41+00:00"
},
{
"name": "symfony/options-resolver",
@@ -12894,8 +12944,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -13270,74 +13320,6 @@
],
"time": "2024-09-09T11:45:10+00:00"
},
- {
- "name": "symfony/polyfill-php56",
- "version": "v1.20.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-php56.git",
- "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675",
- "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1"
- },
- "type": "metapackage",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- },
- "branch-alias": {
- "dev-main": "1.20-dev"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-php56/tree/v1.20.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2020-10-23T14:02:19+00:00"
- },
{
"name": "symfony/polyfill-php81",
"version": "v1.31.0",
@@ -13915,12 +13897,12 @@
},
"type": "library",
"extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
"branch-alias": {
"dev-main": "3.5-dev"
- },
- "thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
}
},
"autoload": {
@@ -14079,12 +14061,12 @@
},
"type": "library",
"extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
"branch-alias": {
"dev-main": "3.5-dev"
- },
- "thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
}
},
"autoload": {
@@ -14140,16 +14122,16 @@
},
{
"name": "symfony/validator",
- "version": "v6.4.16",
+ "version": "v6.4.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/validator.git",
- "reference": "9b0d1988b56511706bc91d96ead39acd77aaf34d"
+ "reference": "a3c19a0e542d427c207e22242043ef35b5b99a2c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/validator/zipball/9b0d1988b56511706bc91d96ead39acd77aaf34d",
- "reference": "9b0d1988b56511706bc91d96ead39acd77aaf34d",
+ "url": "https://api.github.com/repos/symfony/validator/zipball/a3c19a0e542d427c207e22242043ef35b5b99a2c",
+ "reference": "a3c19a0e542d427c207e22242043ef35b5b99a2c",
"shasum": ""
},
"require": {
@@ -14217,7 +14199,7 @@
"description": "Provides tools to validate values",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/validator/tree/v6.4.16"
+ "source": "https://github.com/symfony/validator/tree/v6.4.17"
},
"funding": [
{
@@ -14233,7 +14215,7 @@
"type": "tidelift"
}
],
- "time": "2024-11-27T09:48:51+00:00"
+ "time": "2024-12-29T12:50:19+00:00"
},
{
"name": "symfony/var-dumper",
@@ -14569,16 +14551,16 @@
},
{
"name": "twig/twig",
- "version": "v3.17.1",
+ "version": "v3.18.0",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
- "reference": "677ef8da6497a03048192aeeb5aa3018e379ac71"
+ "reference": "acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/677ef8da6497a03048192aeeb5aa3018e379ac71",
- "reference": "677ef8da6497a03048192aeeb5aa3018e379ac71",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50",
+ "reference": "acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50",
"shasum": ""
},
"require": {
@@ -14633,7 +14615,7 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
- "source": "https://github.com/twigphp/Twig/tree/v3.17.1"
+ "source": "https://github.com/twigphp/Twig/tree/v3.18.0"
},
"funding": [
{
@@ -14645,7 +14627,7 @@
"type": "tidelift"
}
],
- "time": "2024-12-12T09:58:10+00:00"
+ "time": "2024-12-29T10:51:50+00:00"
},
{
"name": "twistor/flysystem-stream-wrapper",
diff --git a/conf/cmi/editoria11y.settings.yml b/conf/cmi/editoria11y.settings.yml
index 26bafa37..35671244 100644
--- a/conf/cmi/editoria11y.settings.yml
+++ b/conf/cmi/editoria11y.settings.yml
@@ -1,12 +1,14 @@
_core:
default_config_hash: NGxFi-xycxrzrGVZtCUl7MACi0jVRk130tNabvIN6ng
content_root: ''
+assertiveness: smart
no_load: ''
-ignore_containers: ''
embedded_content_warning: ''
-allow_overflow: ''
-assertiveness: smart
download_links: ''
ignore_link_strings: ''
-hidden_handlers: ''
link_ignore_selector: 'svg.ext, svg.mailto, .link-purpose-text'
+hidden_handlers: ''
+disable_live: false
+live_h2: 'form[id^="node-"] #edit-body-wrapper .ck-content'
+ignore_containers: ''
+allow_overflow: ''
diff --git a/conf/cmi/file.settings.yml b/conf/cmi/file.settings.yml
index 089565dd..14a3bd7e 100644
--- a/conf/cmi/file.settings.yml
+++ b/conf/cmi/file.settings.yml
@@ -5,7 +5,7 @@ description:
length: 128
icon:
directory: core/modules/file/icons
-make_unused_managed_files_temporary: false
+make_unused_managed_files_temporary: true
filename_sanitization:
transliterate: true
replace_whitespace: true
diff --git a/conf/cmi/openid_connect.settings.yml b/conf/cmi/openid_connect.settings.yml
index f8c3ac4d..43d163d8 100644
--- a/conf/cmi/openid_connect.settings.yml
+++ b/conf/cmi/openid_connect.settings.yml
@@ -5,3 +5,4 @@ end_session_enabled: true
user_login_display: above
userinfo_mappings:
timezone: zoneinfo
+role_mappings: { }
diff --git a/public/modules/custom/helfi_rekry_content/helfi_rekry_content.install b/public/modules/custom/helfi_rekry_content/helfi_rekry_content.install
index 471f81c5..027c192a 100644
--- a/public/modules/custom/helfi_rekry_content/helfi_rekry_content.install
+++ b/public/modules/custom/helfi_rekry_content/helfi_rekry_content.install
@@ -431,3 +431,18 @@ function helfi_rekry_content_update_9010(): void {
$entityUsageConfig->save();
}
}
+
+/**
+ * UHF-10406: Clear video migration map.
+ */
+function helfi_rekry_content_update_9011(): void {
+ $database = \Drupal::database();
+ $migrations = ['helfi_rekry_videos'];
+
+ foreach ($migrations as $migration) {
+ $table_name = 'migrate_map_' . $migration;
+ $database
+ ->schema()
+ ->dropTable($table_name);
+ }
+}
diff --git a/public/modules/custom/helfi_rekry_content/helfi_rekry_content.module b/public/modules/custom/helfi_rekry_content/helfi_rekry_content.module
index 11c6efd7..913e72ad 100644
--- a/public/modules/custom/helfi_rekry_content/helfi_rekry_content.module
+++ b/public/modules/custom/helfi_rekry_content/helfi_rekry_content.module
@@ -15,6 +15,8 @@ use Drupal\helfi_platform_config\DTO\ParagraphTypeCollection;
use Drupal\helfi_rekry_content\Entity\JobListing;
use Drupal\media\OEmbed\ProviderException;
use Drupal\media\OEmbed\ResourceException;
+use Drupal\media\OEmbed\ResourceFetcherInterface;
+use Drupal\media\OEmbed\UrlResolverInterface;
use Drupal\migrate\MigrateSkipRowException;
use Drupal\node\NodeInterface;
use Drupal\paragraphs\ParagraphInterface;
@@ -148,37 +150,37 @@ function _helfi_rekry_content_get_media_image(string|NULL $fid = NULL): ?string
/**
* Validate and return video url, used in migration.
*
- * @param string|null $url
+ * @param string $url
* The video url.
*
- * @return string|null
- * Valid video url or null
+ * @return string
+ * Valid video url
*
* @throws \Drupal\migrate\MigrateSkipRowException
*/
-function _helfi_rekry_content_get_video_url(string|NULL $url = NULL): ?string {
+function _helfi_rekry_content_get_video_url(string $url): string {
try {
/** @var \Drupal\media\OEmbed\UrlResolverInterface $resolver */
- $resolver = \Drupal::service('media.oembed.url_resolver');
+ $resolver = \Drupal::service(UrlResolverInterface::class);
$provider = $resolver->getProviderByUrl($url);
if (!in_array($provider->getName(), ['YouTube', 'Icareus Suite'])) {
- throw new MigrateSkipRowException();
+ throw new MigrateSkipRowException(save_to_map: FALSE);
}
}
catch (ResourceException | ProviderException $e) {
\Drupal::logger('helfi_rekry_content')
->notice('Video embed url "' . $url . '" failed validation with message: ' . $e->getMessage());
- throw new MigrateSkipRowException();
+ throw new MigrateSkipRowException(save_to_map: FALSE);
}
// Ticket #UHF-9069 prevent migrating bad oembed links.
try {
// Use the same validation used in field validation.
$resource_url = $resolver->getResourceUrl($url);
- \Drupal::service('media.oembed.resource_fetcher')
+ \Drupal::service(ResourceFetcherInterface::class)
->fetchResource($resource_url);
return $url;
}
@@ -187,7 +189,7 @@ function _helfi_rekry_content_get_video_url(string|NULL $url = NULL): ?string {
\Drupal::logger('helfi_rekry_content')
->error('Bad video url rejected by oembed-validation: ' . $url);
- throw new MigrateSkipRowException();
+ throw new MigrateSkipRowException(save_to_map: FALSE);
}
}
@@ -205,43 +207,27 @@ function _helfi_rekry_content_sanitize_video_url(string $url): string {
return $url;
}
- if (!str_contains($url, "://")) {
- $url = "https://$url";
- }
-
- // OEmbed does not accept YouTube embed links.
- if (preg_match("/youtube\.com\/embed\/([\w\-_]+)$/", $url, $matches)) {
- $url = sprintf("https://youtube.com/watch?v=%s", $matches[1]);
+ // Some valid YouTube links are not recognized by drupal/oembed_providers
+ // module, which triggers additional network requests that attempt to sniff
+ // oembed links directly from YouTube. However, YouTube does not like
+ // automated traffic from datacenters, so these requests often fail in
+ // production.
+ //
+ // This regex tries to pick video id from following patters and
+ // formats the links to the expected format.
+ //
+ // Features:
+ // - https:// or www. missing.
+ // - youtube.com/v/[id].
+ // - youtu.be/[id] short links.
+ // - youtube.com/embed/[id].
+ if (preg_match("/youtu(?:.*\/v\/|.*v=|\.be\/|.*\/embed\/)([A-Za-z0-9_\-]{11})/", $url, $matches)) {
+ $url = sprintf("https://www.youtube.com/watch?v=%s", $matches[1]);
}
return $url;
}
-/**
- * Get video mid by video url.
- *
- * @param string $url
- * The video url.
- *
- * @return string|null
- * The mid or null
- */
-function _helfi_rekry_content_lookup_video_mid(string $url): ?string {
- $ids = \Drupal::entityQuery('media')
- ->condition('bundle', 'remote_video')
- ->condition('field_media_oembed_video', $url)
- ->range(0, 1)
- ->latestRevision()
- ->accessCheck(FALSE)
- ->execute();
-
- if (!empty($ids)) {
- return reset($ids);
- }
-
- return NULL;
-}
-
/**
* Get node id by recruitment id.
*
@@ -268,7 +254,7 @@ function _helfi_rekry_content_lookup_job_nid(string $id): ?string {
}
/**
- * Add http protocol to urls, since api response might not have themm.
+ * Add http protocol to urls, since api response might not have them.
*
* @param string|null $url
* The url.
diff --git a/public/modules/custom/helfi_rekry_content/migrations/job_listing_videos.yml b/public/modules/custom/helfi_rekry_content/migrations/job_listing_videos.yml
index b654580e..3bc54fdc 100644
--- a/public/modules/custom/helfi_rekry_content/migrations/job_listing_videos.yml
+++ b/public/modules/custom/helfi_rekry_content/migrations/job_listing_videos.yml
@@ -11,28 +11,18 @@ migration_tags:
migration_group: helfi_rekry_content
label: 'HELfi Rekry - Job listing videos'
source:
- ids:
- id:
- type: string
- video:
- type: string
plugin: helbit_open_jobs
- track_changes: true
fields:
- -
- name: id
- label: Id
- selector: jobAdvertisement/id
-
name: video
label: Video
selector: jobAdvertisement/embedLink
- -
- name: title
- label: Title
- selector: jobAdvertisement/title
+ ids:
+ video:
+ type: string
+ langcode:
+ type: string
process:
- name: title
field_media_oembed_video:
-
plugin: skip_on_empty
diff --git a/public/modules/custom/helfi_rekry_content/migrations/job_listings.yml b/public/modules/custom/helfi_rekry_content/migrations/job_listings.yml
index 39345e2b..5dd97fee 100644
--- a/public/modules/custom/helfi_rekry_content/migrations/job_listings.yml
+++ b/public/modules/custom/helfi_rekry_content/migrations/job_listings.yml
@@ -198,18 +198,15 @@ process:
field_original_language:
plugin: default_value
default_value: null
- field_video/target_id:
- -
- plugin: skip_on_empty
+ field_video:
+ - plugin: skip_on_empty
method: process
source: video
- -
- plugin: callback
- callable: _helfi_rekry_content_sanitize_video_url
- source: video
- -
- plugin: callback
- callable: _helfi_rekry_content_lookup_video_mid
+ - plugin: migration_lookup
+ migration: helfi_rekry_videos
+ source:
+ - video
+ - langcode
field_organization_name: organization_name
field_postal_area: postal_area
field_postal_code: postal_code
diff --git a/public/modules/custom/helfi_rekry_content/src/Entity/JobListing.php b/public/modules/custom/helfi_rekry_content/src/Entity/JobListing.php
index e02a3321..b485353b 100644
--- a/public/modules/custom/helfi_rekry_content/src/Entity/JobListing.php
+++ b/public/modules/custom/helfi_rekry_content/src/Entity/JobListing.php
@@ -124,12 +124,12 @@ public function getCityDescriptions() : array {
/**
* Get organization taxonomy term.
*
- * @return \Drupal\taxonomy\TermInterface|bool
+ * @return \Drupal\taxonomy\TermInterface|false
* Returns the organization taxonomy term or false if not set.
*
* @throws \Drupal\Core\TypedData\Exception\MissingDataException
*/
- public function getOrganization() : TermInterface|bool {
+ public function getOrganization() : TermInterface|FALSE {
$organization_id = '';
// Get the organization id from the migrated field.
@@ -153,7 +153,8 @@ public function getOrganization() : TermInterface|bool {
$organization = $this->entityTypeManager()
->getStorage('taxonomy_term')
->load($organization_id);
- return $organization;
+
+ return $organization ?? FALSE;
}
catch (\Exception $e) {
return FALSE;
@@ -257,7 +258,10 @@ public function getOrganizationDescription() : FilteredMarkup|string {
}
// If not and the organization description is empty,
// check if the organization taxonomy description is set and use it.
- elseif ($organization_description->isEmpty() && !$organization->get('description')->isEmpty()) {
+ elseif (
+ $organization_description->isEmpty() &&
+ $organization && !$organization->get('description')->isEmpty()
+ ) {
$organization_description = $organization->get('description');
}
diff --git a/public/modules/custom/helfi_rekry_content/tests/src/Kernel/JobMigrationTest.php b/public/modules/custom/helfi_rekry_content/tests/src/Kernel/JobMigrationTest.php
new file mode 100644
index 00000000..002b6759
--- /dev/null
+++ b/public/modules/custom/helfi_rekry_content/tests/src/Kernel/JobMigrationTest.php
@@ -0,0 +1,94 @@
+assertEquals($expected, \_helfi_rekry_content_sanitize_video_url($videoUrl));
+ }
+ }
+
+ /**
+ * Test video URL validation.
+ */
+ public function testVideoValidationExceptions(): void {
+ $urlResolver = $this->prophesize(UrlResolverInterface::class);
+ $urlResolver->getProviderByUrl(Argument::any())
+ ->willThrow(ProviderException::class);
+
+ $this->container->set(UrlResolverInterface::class, $urlResolver->reveal());
+
+ $this->expectException(MigrateSkipRowException::class);
+ _helfi_rekry_content_get_video_url('some-url');
+ }
+
+ /**
+ * Test video URL validation with unknown provider.
+ */
+ public function testVideoValidationProvider(): void {
+ $provider = new Provider('Some provider', 'https://example.com', [
+ ['url' => 'https://example.com/oembed'],
+ ]);
+
+ $urlResolver = $this->prophesize(UrlResolverInterface::class);
+ $urlResolver->getProviderByUrl(Argument::any())
+ ->willReturn($provider);
+
+ $this->container->set(UrlResolverInterface::class, $urlResolver->reveal());
+
+ $this->expectException(MigrateSkipRowException::class);
+ _helfi_rekry_content_get_video_url('some-url');
+ }
+
+ /**
+ * Data provider for testVideoUrlSanitization().
+ */
+ public static function videoUrlData(): array {
+ return [
+ ['', [' ']],
+ [
+ 'https://www.youtube.com/watch?v=g2eYKMjE8ew',
+ [
+ 'youtube.com/watch?v=g2eYKMjE8ew',
+ 'youtu.be/g2eYKMjE8ew',
+ 'youtu.be/?v=g2eYKMjE8ew',
+ 'https://youtube.com/embed/g2eYKMjE8ew',
+ 'https://youtube.com/watch?v=g2eYKMjE8ew',
+ 'https://www.youtube.com/watch?v=g2eYKMjE8ew',
+ 'https://www.youtube.com/watch?foo=bar&v=g2eYKMjE8ew&bar=foo',
+ ],
+ ],
+ ];
+ }
+
+}
diff --git a/public/themes/custom/hdbt_subtheme/dist/css/styles.min.css b/public/themes/custom/hdbt_subtheme/dist/css/styles.min.css
index d1ac2e53..99808543 100644
--- a/public/themes/custom/hdbt_subtheme/dist/css/styles.min.css
+++ b/public/themes/custom/hdbt_subtheme/dist/css/styles.min.css
@@ -1 +1 @@
-.job-listing__organization-name{--line-height: 1.5555555556;font-size:1.125rem;font-weight:400;line-height:var(--line-height);display:flex;margin-top:16px}@media(min-width: 768px){.job-listing__organization-name{margin-top:24px}}.organization{display:flex;margin-right:8px;position:relative}.organization::after{content:","}.organization:last-child{margin-right:0}.organization:last-child::after{display:none}.job-listing__item{padding-left:16px;padding-right:16px}@media(min-width: 768px){.job-listing__item{padding-left:32px;padding-right:32px}}.job-listing__link-wrapper{margin-top:16px}@media(min-width: 768px){.job-listing__link-wrapper{margin-top:24px}}.job-listing__link-wrapper.job-listing__link-wrapper--last{margin-top:32px}@media(min-width: 768px){.job-listing__link-wrapper.job-listing__link-wrapper--last{margin-top:48px}}.job-listing__link{width:100%}@media(min-width: 768px){.job-listing__link{width:auto}}.job-listing__job-description{--line-height: 1.5555555556;font-size:1.125rem;font-weight:400;line-height:var(--line-height);margin-top:16px}@media(min-width: 768px){.job-listing__job-description{margin-top:48px}}.job-listing__job-description p:first-child{margin-top:0}.job-listing__salary-class__content{--line-height: 1.5555555556;font-size:1.125rem;font-weight:400;line-height:var(--line-height)}.job-listing__sidebar{background-color:var(--hdbt-color-palette--secondary)}.job-listing__organization-information,.job-listing__city-description{padding:24px}.job-listing__image img{display:block;height:auto;max-width:100%;overflow:hidden}.job-listing__image .image-placeholder{padding-bottom:66.67%}.job-listing__organization,.job-listing__city-description-title{--line-height: 1.5;font-size:1rem;font-weight:700;line-height:var(--line-height);margin-top:0}@media(min-width: 992px){.job-listing__organization,.job-listing__city-description-title{--line-height: 1.5555555556;font-size:1.125rem;font-weight:700}}.job-listing__organization-description,.job-listing__city-description-text{--line-height: 1.5;font-size:1rem;font-weight:400;line-height:var(--line-height);margin-top:8px}.job-listing__organization-description p:first-child,.job-listing__city-description-text p:first-child{margin-top:0}.node--type-job-listing .component--remote-video{margin-top:32px}@media(min-width: 992px){.node--type-job-listing .component--remote-video{margin-top:48px}}.node--type-job-listing.node--view-mode-full .content-tags{margin-top:24px}.block--of-interest{background-color:#e6e6e6;padding:80px 0;margin-top:64px;margin-bottom:calc((50px + 48px)*-1)}.block--of-interest .block--of-interest__content-container{max-width:1296px;padding-left:16px;padding-right:16px;margin:auto}@media(min-width: 768px){.block--of-interest .block--of-interest__content-container{max-width:1328px}}@media(min-width: 768px){.block--of-interest .block--of-interest__content-container{padding-left:32px;padding-right:32px}}.block--of-interest h2{margin-bottom:48px;margin-top:0}.block--of-interest .block--of-interest__more-link{margin-top:48px}.component--job-listing-search{background-color:#f7f7f8}.layout-main-wrapper>*:last-child .component--job-listing-search:last-child{margin-bottom:-115px;padding-bottom:55px}.job-listing-search__result-actions{align-items:flex-end;display:flex;justify-content:space-between}.component--job-listing-search .component__container{padding-bottom:32px;padding-top:32px}@media(min-width: 768px){.component--job-listing-search .component__container{padding-bottom:64px;padding-top:64px}}.job-listing-search__sort{min-width:283px}.job-listing-search__result--list{margin-top:24px}@media(min-width: 768px){.job-listing-search__result--list{margin-top:32px}}.job-search-form{margin-bottom:32px}.job-search-form__title{margin-bottom:32px}@media(min-width: 992px){.job-search-form__dropdowns__upper{margin-left:-12px;margin-right:-12px;display:flex}.job-search-form__dropdowns__upper>*{margin-left:12px;margin-right:12px}}.job-search-form__dropdown li+li{margin-top:0}@media(min-width: 992px){.job-search-form__dropdown--upper{width:50%}}.job-search-form__filter{margin-bottom:16px;width:100%}@media(min-width: 992px){.job-search-form__filter{margin-bottom:24px}}.job-search-form__checkboxes{border:none;margin-bottom:16px;padding:0}@media(min-width: 992px){.job-search-form__checkboxes{display:flex}}fieldset .job-search-form__checkbox{--background-selected: var(--hdbt-color-black)}fieldset .job-search-form__checkbox:not(:first-of-type){margin-top:32px}@media(min-width: 992px){fieldset .job-search-form__checkbox:not(:first-of-type){margin-left:16px;margin-top:0}}.job-search-form__checkboxes-legend,.job-search__no-results__heading{--line-height: 1.5;font-size:1rem;font-weight:700;line-height:var(--line-height);margin-bottom:16px}@media(min-width: 992px){.job-search-form__checkboxes-legend,.job-search__no-results__heading{--line-height: 1.5555555556;font-size:1.125rem;font-weight:700}}.job-search-form__selections-container{list-style-type:none}button.job-search-form__remove-selection-button:not(:disabled){background-color:rgba(0,0,0,0);border:1px solid #000;border-radius:48px;padding:12px 20px 12px;--color-hover-focus: var(--hdbt-text-color);color:var(--hdbt-color-black)}button.job-search-form__remove-selection-button:not(:disabled):hover,button.job-search-form__remove-selection-button:not(:disabled):active{background-color:#000;border-color:#000;color:#fff}button.job-search-form__remove-selection-button:not(:disabled):focus,button.job-search-form__remove-selection-button:not(:disabled):active{border-color:#000;outline:2px solid #000;outline-offset:2px}.job-search-form__remove-selection-button span{padding:0}.job-search-form__selections-wrapper button.job-search-form__remove-selection-button>div{margin-right:0}.job-search-form__clear-all{margin-top:0}.job-search-form__clear-all .job-search-form__clear-all-button{--background-color-hover: transparent;--background-color-focus: transparent;--background-color-hover-focus: transparent;--border-color-hover: var(--hdbt-color-black);--border-color-focus: var(--hdbt-color-black);--border-color-hover-focus: var(--hdbt-color-black);--color: var(--hdbt-color-black);--color-hover: var(--hdbt-color-black);--color-focus: var(--hdbt-color-black);--color-hover-focus: var(--hdbt-color-black);--focus-outline-color: var(--hdbt-color-black)}.job-search-form__search-monitor{margin-bottom:32px}.job-search-form__search-monitor div[role=heading]{flex:0 1 auto}.job-search-form__search-monitor{background-color:var(--color-fog-light);padding:32px}.job-search-form__search-monitor__heading{margin-top:0}.job-search-form__search-monitor__heading.focus-visible{outline:2px solid #000;outline-offset:8px}.job-search-form__search-monitor__heading:focus-visible{outline:2px solid #000;outline-offset:8px}.job-search-form__search-monitor__content>p{--line-height: 1.5555555556;font-size:1.125rem;font-weight:400;line-height:var(--line-height);margin-top:24px}.job-search-form__search-monitor__content[aria-hidden=true]{display:none}.job-search-form__search-monitor__content__heading{margin-top:32px}.job-search-form__search-monitor__terms-link{--line-height: 1.5;font-size:1rem;font-weight:400;line-height:var(--line-height)}.job-search-form__search-monitor__terms-link.focus-visible{outline:2px solid #000;outline-offset:4px}.job-search-form__search-monitor__terms-link:focus-visible{outline:2px solid #000;outline-offset:4px}.job-search-form__search-monitor__terms::after{content:"*";margin-left:4px}.job-search-form__search-monitor__error{margin-top:32px}.job-search-form__search-monitor__error>div.focus-visible{outline:3px solid #000;outline-offset:8px}.job-search-form__search-monitor__error>div:focus-visible{outline:3px solid #000;outline-offset:8px}.hakuvahti-confirmation .components{margin-top:24px}.hakuvahti-confirmation p{--line-height: 1.5;font-size:1.25rem;font-weight:400;line-height:var(--line-height)}@media(min-width: 992px){.hakuvahti-confirmation p{--line-height: 1.5;font-size:1.375rem;font-weight:400}}.hakuvahti-confirmation p:first-child{margin-top:0}.hakuvahti-confirmation .page-divider{padding-left:0}.hakuvahti-confirmation .form-submit{margin-top:32px}@media(min-width: 768px){.hakuvahti-confirmation .form-submit{margin-top:64px}}
+.job-listing__organization-name{--line-height: 1.5555555556;font-size:1.125rem;font-weight:400;line-height:var(--line-height);display:flex;margin-top:16px}@media(min-width: 768px){.job-listing__organization-name{margin-top:24px}}.organization{display:flex;margin-right:8px;position:relative}.organization::after{content:","}.organization:last-child{margin-right:0}.organization:last-child::after{display:none}.job-listing__item{padding-left:16px;padding-right:16px}@media(min-width: 768px){.job-listing__item{padding-left:32px;padding-right:32px}}.job-listing__link-wrapper{margin-top:16px}@media(min-width: 768px){.job-listing__link-wrapper{margin-top:24px}}.job-listing__link-wrapper.job-listing__link-wrapper--last{margin-top:32px}@media(min-width: 768px){.job-listing__link-wrapper.job-listing__link-wrapper--last{margin-top:48px}}.job-listing__link{width:100%}@media(min-width: 768px){.job-listing__link{width:auto}}.job-listing__job-description{--line-height: 1.5555555556;font-size:1.125rem;font-weight:400;line-height:var(--line-height);margin-top:16px}@media(min-width: 768px){.job-listing__job-description{margin-top:48px}}.job-listing__job-description p:first-child{margin-top:0}.job-listing__salary-class__content{--line-height: 1.5555555556;font-size:1.125rem;font-weight:400;line-height:var(--line-height)}.job-listing__sidebar{background-color:var(--hdbt-color-palette--secondary)}.job-listing__organization-information,.job-listing__city-description{padding:24px}.job-listing__image img{display:block;height:auto;max-width:100%;overflow:hidden}.job-listing__image .image-placeholder{padding-bottom:66.67%}.job-listing__organization,.job-listing__city-description-title{--line-height: 1.5;font-size:1rem;font-weight:700;line-height:var(--line-height);letter-spacing:.0125rem;margin-top:0}@media(min-width: 992px){.job-listing__organization,.job-listing__city-description-title{--line-height: 1.5555555556;font-size:1.125rem;font-weight:700}}.job-listing__organization-description,.job-listing__city-description-text{--line-height: 1.5;font-size:1rem;font-weight:400;line-height:var(--line-height);margin-top:8px}.job-listing__organization-description p:first-child,.job-listing__city-description-text p:first-child{margin-top:0}.node--type-job-listing .component--remote-video{margin-top:32px}@media(min-width: 992px){.node--type-job-listing .component--remote-video{margin-top:48px}}.node--type-job-listing.node--view-mode-full .content-tags{margin-top:24px}.block--of-interest{background-color:#e6e6e6;padding:80px 0;margin-top:64px;margin-bottom:calc((50px + 48px)*-1)}.block--of-interest .block--of-interest__content-container{max-width:1296px;padding-left:16px;padding-right:16px;margin:auto}@media(min-width: 768px){.block--of-interest .block--of-interest__content-container{max-width:1328px}}@media(min-width: 768px){.block--of-interest .block--of-interest__content-container{padding-left:32px;padding-right:32px}}.block--of-interest h2{margin-bottom:48px;margin-top:0}.block--of-interest .block--of-interest__more-link{margin-top:48px}.component--job-listing-search{background-color:#f7f7f8}.layout-main-wrapper>*:last-child .component--job-listing-search:last-child{margin-bottom:-115px;padding-bottom:55px}.job-listing-search__result-actions{align-items:flex-end;display:flex;justify-content:space-between}.component--job-listing-search .component__container{padding-bottom:32px;padding-top:32px}@media(min-width: 768px){.component--job-listing-search .component__container{padding-bottom:64px;padding-top:64px}}.job-listing-search__sort{min-width:283px}.job-listing-search__result--list{margin-top:24px}@media(min-width: 768px){.job-listing-search__result--list{margin-top:32px}}.job-search-form{margin-bottom:32px}.job-search-form__title{margin-bottom:32px}@media(min-width: 992px){.job-search-form__dropdowns__upper{margin-left:-12px;margin-right:-12px;display:flex}.job-search-form__dropdowns__upper>*{margin-left:12px;margin-right:12px}}.job-search-form__dropdown li+li{margin-top:0}@media(min-width: 992px){.job-search-form__dropdown--upper{width:50%}}.job-search-form__filter{margin-bottom:16px;width:100%}@media(min-width: 992px){.job-search-form__filter{margin-bottom:24px}}.job-search-form__checkboxes{border:none;margin-bottom:16px;padding:0}@media(min-width: 992px){.job-search-form__checkboxes{display:flex}}fieldset .job-search-form__checkbox{--background-selected: var(--hdbt-color-black)}fieldset .job-search-form__checkbox:not(:first-of-type){margin-top:32px}@media(min-width: 992px){fieldset .job-search-form__checkbox:not(:first-of-type){margin-left:16px;margin-top:0}}.job-search-form__checkboxes-legend,.job-search__no-results__heading{--line-height: 1.5;font-size:1rem;font-weight:700;line-height:var(--line-height);letter-spacing:.0125rem;margin-bottom:16px}@media(min-width: 992px){.job-search-form__checkboxes-legend,.job-search__no-results__heading{--line-height: 1.5555555556;font-size:1.125rem;font-weight:700}}.job-search-form__selections-container{list-style-type:none}button.job-search-form__remove-selection-button:not(:disabled){background-color:rgba(0,0,0,0);border:1px solid #000;border-radius:48px;padding:12px 20px 12px;--color-hover-focus: var(--hdbt-text-color);color:var(--hdbt-color-black)}button.job-search-form__remove-selection-button:not(:disabled):hover,button.job-search-form__remove-selection-button:not(:disabled):active{background-color:#000;border-color:#000;color:#fff}button.job-search-form__remove-selection-button:not(:disabled):focus,button.job-search-form__remove-selection-button:not(:disabled):active{border-color:#000;outline:2px solid #000;outline-offset:2px}.job-search-form__remove-selection-button span{padding:0}.job-search-form__selections-wrapper button.job-search-form__remove-selection-button>div{margin-right:0}.job-search-form__clear-all{margin-top:0}.job-search-form__clear-all .job-search-form__clear-all-button{--background-color-hover: transparent;--background-color-focus: transparent;--background-color-hover-focus: transparent;--border-color-hover: var(--hdbt-color-black);--border-color-focus: var(--hdbt-color-black);--border-color-hover-focus: var(--hdbt-color-black);--color: var(--hdbt-color-black);--color-hover: var(--hdbt-color-black);--color-focus: var(--hdbt-color-black);--color-hover-focus: var(--hdbt-color-black);--focus-outline-color: var(--hdbt-color-black)}.job-search-form__search-monitor{margin-bottom:32px}.job-search-form__search-monitor div[role=heading]{flex:0 1 auto}.job-search-form__search-monitor{background-color:var(--color-fog-light);padding:32px}.job-search-form__search-monitor__heading{margin-top:0}.job-search-form__search-monitor__heading.focus-visible{outline:2px solid #000;outline-offset:8px}.job-search-form__search-monitor__heading:focus-visible{outline:2px solid #000;outline-offset:8px}.job-search-form__search-monitor__content>p{--line-height: 1.5555555556;font-size:1.125rem;font-weight:400;line-height:var(--line-height);margin-top:24px}.job-search-form__search-monitor__content[aria-hidden=true]{display:none}.job-search-form__search-monitor__content__heading{margin-top:32px}.job-search-form__search-monitor__terms-link{--line-height: 1.5;font-size:1rem;font-weight:400;line-height:var(--line-height)}.job-search-form__search-monitor__terms-link.focus-visible{outline:2px solid #000;outline-offset:4px}.job-search-form__search-monitor__terms-link:focus-visible{outline:2px solid #000;outline-offset:4px}.job-search-form__search-monitor__terms::after{content:"*";margin-left:4px}.job-search-form__search-monitor__error{margin-top:32px}.job-search-form__search-monitor__error>div.focus-visible{outline:3px solid #000;outline-offset:8px}.job-search-form__search-monitor__error>div:focus-visible{outline:3px solid #000;outline-offset:8px}.hakuvahti-confirmation .components{margin-top:24px}.hakuvahti-confirmation p{--line-height: 1.5;font-size:1.25rem;font-weight:400;line-height:var(--line-height)}@media(min-width: 992px){.hakuvahti-confirmation p{--line-height: 1.5;font-size:1.375rem;font-weight:400}}.hakuvahti-confirmation p:first-child{margin-top:0}.hakuvahti-confirmation .page-divider{padding-left:0}.hakuvahti-confirmation .form-submit{margin-top:32px}@media(min-width: 768px){.hakuvahti-confirmation .form-submit{margin-top:64px}}
diff --git a/public/themes/custom/hdbt_subtheme/package-lock.json b/public/themes/custom/hdbt_subtheme/package-lock.json
index 85e70e7a..d59e785a 100644
--- a/public/themes/custom/hdbt_subtheme/package-lock.json
+++ b/public/themes/custom/hdbt_subtheme/package-lock.json
@@ -3344,9 +3344,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001669",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz",
- "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==",
+ "version": "1.0.30001692",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
+ "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==",
"funding": [
{
"type": "opencollective",
@@ -3360,7 +3360,8 @@
"type": "github",
"url": "https://github.com/sponsors/ai"
}
- ]
+ ],
+ "license": "CC-BY-4.0"
},
"node_modules/chalk": {
"version": "2.4.2",
@@ -6844,15 +6845,16 @@
}
},
"node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
diff --git a/public/themes/custom/hdbt_subtheme/postcss.config.js b/public/themes/custom/hdbt_subtheme/postcss.config.js
index a63f4e47..ac82679f 100644
--- a/public/themes/custom/hdbt_subtheme/postcss.config.js
+++ b/public/themes/custom/hdbt_subtheme/postcss.config.js
@@ -5,7 +5,15 @@ module.exports = {
plugins: [
// Plugins for PostCSS
['autoprefixer', { sourceMap: isDev }], // Parses CSS and adds vendor prefixes.
- 'postcss-preset-env', // Convert modern CSS into something most browsers can understand.
+ [
+ 'postcss-preset-env', // Convert modern CSS into something most browsers can understand.
+ {
+ stage: 2, // Use stage 2 CSS features.
+ features: {
+ 'logical-properties-and-values': false // Disable the conversion of css logical properties such as padding-inline.
+ },
+ },
+ ],
'postcss-nested', // Unwrap nested rules like how Sass does it.
'postcss-nesting', // Nest style rules inside each other, following the CSS Nesting specification.
require('./postcss.plugins'), // Strip inline comments.
diff --git a/public/themes/custom/hdbt_subtheme/templates/layout/node--job-listing.html.twig b/public/themes/custom/hdbt_subtheme/templates/layout/node--job-listing.html.twig
index e7f25c09..f7df30b0 100644
--- a/public/themes/custom/hdbt_subtheme/templates/layout/node--job-listing.html.twig
+++ b/public/themes/custom/hdbt_subtheme/templates/layout/node--job-listing.html.twig
@@ -181,7 +181,7 @@
{% endif %}
- {% if content.field_video|render %}
+ {% if content.field_video|render|spaceless %}