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 %}
{% include '@hdbt/component/remote-video.twig' with { video: content.field_video,