diff --git a/README.md b/README.md index 902cba83..bf0a0e43 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,17 @@ -# InfoFinland Drupal 9 site +# InfoFinland Drupal site -Drupal 9 website for the InfoFinland project. +Drupal website for the InfoFinland project. ## Environments -Env | Branch | Drush alias | URL | Notes ---- | ------ | ----------- | --- | ----- +Env | Branch | Drush alias | URL | Notes +--- | ------ | ----------- |---------------------------------------| ----- development | * | - | https://drupal-infofinland.docker.so/ | Local development environment -production | main | @main | TBD | Not implemented yet +production | main | @main | https://infofinland.fi |   + +## Instance specific features + +[The Infofinland frontend](https://github.com/City-of-Helsinki/infofinland-ui/) is built using Next.js. Some Next.js drupal modules conflict with `helfi_platform_config`. To work around this, a special [`infofinland_dummy` module](./patches/helfi_platform_config/composer.json) is used, which replaces problematic modules. This module allows the compatible parts of `helfi_platform_config` to be used. ## Requirements @@ -235,12 +239,12 @@ Check for coding style violantions by running `$ make lint-drupal` ### Gitflow workflow The Gitflow workflow is followed, with the following conventions: -**Main branch**: `develop`. All feature branches are created from `develop` and merged back with pull requests. All new code must be added with pull requests, not committed directly. +**Main branch**: `dev`. All feature branches are created from `dev` and merged back with pull requests. All new code must be added with pull requests, not committed directly. **Production branch:** `main`. Code running in production. Code is merged to `main` with release and hotfix branches. -**Feature branches**: For example, `feature/IFU-000-add-content-type`, Use Jira ticket number in the branch name. Always created from and merged back to `develop` with pull requests after code review and testing. +**Feature branches**: For example, `feature/IFU-000-add-content-type`, Use Jira ticket number in the branch name. Always created from and merged back to `dev` with pull requests after code review and testing. **Release branches**: Code for future and currently developed releases. Should include the version number, for example: `1.1.0` -**Hotfix branches**: Branches for small fixes to production code. Should include the word hotfix, for example: `IFU-hotfix-drupal-updates`. Remember to also merge these back to `develop`. +**Hotfix branches**: Branches for small fixes to production code. Should include the word hotfix, for example: `IFU-hotfix-drupal-updates`. Remember to also merge these back to `dev`. diff --git a/composer.json b/composer.json index 4a4eec25..54a46083 100644 --- a/composer.json +++ b/composer.json @@ -9,37 +9,22 @@ "require": { "composer/installers": "^1.9", "cweagans/composer-patches": "^1.6.7", - "drupal/admin_toolbar": "^3.0", - "drupal/allowed_formats": "^2.0", - "drupal/ckeditor5_paste_filter": "^1.0", "drupal/ckeditor_bidi": "^4.0", "drupal/color_field": "^3.0", "drupal/config_filter": "^2.0", - "drupal/config_ignore": "^3.0", - "drupal/config_rewrite": "^1.4", "drupal/config_update": "^2.0", "drupal/consumer_image_styles": "^4.0", "drupal/consumers": "^1.12", "drupal/core": "^10.3", "drupal/core-composer-scaffold": "^10.3", - "drupal/crop": "^2.2", - "drupal/default_content": "2.0.0-alpha2", - "drupal/diff": "^1.0", - "drupal/elasticsearch_connector": "^7.0.0@alpha", - "drupal/entity_browser": "^2.8", - "drupal/entity_usage": "^2.0@beta", "drupal/environment_indicator": "^4.0", - "drupal/eu_cookie_compliance": "^1.19", "drupal/features": "^3.12", - "drupal/field_group": "^3.2", - "drupal/focal_point": "^2.0", "drupal/gin": "^3.0", - "drupal/hal": "^2.0", "drupal/hdbt": "^5.6.24", - "drupal/helfi_api_base": "^2.7", "drupal/helfi_azure_fs": "^2.0", "drupal/helfi_drupal_tools": "dev-main", - "drupal/image_style_quality": "^1.4", + "drupal/helfi_platform_config": "^4.6.5", + "drupal/infofinland_dummy": "*", "drupal/inline_entity_form": "^1.0@RC", "drupal/jsonapi_extras": "^3.19", "drupal/jsonapi_menu_items": "^1.2", @@ -48,28 +33,14 @@ "drupal/mailsystem": "^4.3", "drupal/media_entity_browser": "^2.0", "drupal/media_entity_soundcloud": "^3.1", - "drupal/menu_link_attributes": "^1.2", - "drupal/metatag": "^2.0", "drupal/migrate_source_csv": "^3.4", "drupal/next": "^1.4", "drupal/obfuscate": "^2.0", - "drupal/paragraphs": "^1.13", - "drupal/paragraphs_asymmetric_translation_widgets": "^1.0", "drupal/password_policy": "^4.0", - "drupal/pathauto": "^1.9", "drupal/queue_ui": "^3.0", - "drupal/raven": "^4.0", - "drupal/readonly_field_widget": "^1.4", - "drupal/redirect": "^1.8", "drupal/redis": "^1.5", "drupal/restui": "^1.21", - "drupal/role_delegation": "^1.2", - "drupal/scheduler": "^1.4", - "drupal/search_api": "^1.3", - "drupal/select2": "^1.13", - "drupal/simple_sitemap": "^4.0", "drupal/smtp": "^1.0", - "drupal/social_media": "^2.0", "drupal/subrequests": "^3.0", "drupal/token_filter": "^2.0", "drupal/ultimate_cron": "^2.0@alpha", @@ -136,19 +107,13 @@ "hasTranslationChanges on multiple languages outside of saving process is costly (https://drupal.org/i/3007031)": "https://git.drupalcode.org/project/drupal/-/merge_requests/197.diff", "Deleting a translation leaves behind orphaned revisions (https://drupal.org/i/2815779)": "https://www.drupal.org/files/issues/2019-11-25/8x9x-2815779-19.patch", "PoStreamReader::readLine() throws an error on module install (https://drupal.org/i/3301239)": "https://www.drupal.org/files/issues/2023-01-17/drupal_core-PoStreamReader_readLine_throws_an_error_on_module_install-3301239-7.patch", - "[#UHF-7008] Add multilingual support for caching basefield definitions (https://drupal.org/i/3114824)": "https://www.drupal.org/files/issues/2020-02-20/3114824_2.patch", - "[#UHF-7008] Core localization file download URL is wrong (https://drupal.org/i/3022876)": "https://git.drupalcode.org/project/drupal/-/commit/40a96136b2dfe4322338508dffa636f6cb407900.patch", "Cannot save or publish originating node or translations (https://drupal.org/i/3285657)": "https://www.drupal.org/files/issues/2022-06-14/core9.2-node-lock-translations-2744851.patch" }, - "drupal/diff": { - "Revision overview form problem (https://www.drupal.org/i/3390329)": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/05989cc82b2817de994ad4e9289ccb777f71f23f/patches/diff_8.x_1.3_revision_overview_form.patch" - }, "drupal/paragraphs": { - "Paragraphs asymmetric translation support (https://drupal.org/i/2904705#comment-13836790)": "https://www.drupal.org/files/issues/2023-09-27/paragraphs_support_asym_translations-2904705-141.patch", "[#UHF-2059] Enhancements for the Admin UI": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/fdccb32397cc6fa19b4d0077b21a2b18aa6be297/patches/helfi_customizations_for_paragraphs_widget_8.x-1.12.patch" }, - "drupal/publication_date": { - "[#UHF-7721] Fixed node preview when publication date is not set. (https://drupal.org/i/3074373)": "https://www.drupal.org/files/issues/2022-12-20/publication_date_is_required_for_completing_the_form-3074373-11.patch" + "drupal/subrequests": { + "Get same results on different request (https://drupal.org/i/3049395)": "https://www.drupal.org/files/issues/2024-08-06/subrequests-3049395-change-request-type.patch" }, "drupal/subrequests": { "Get same results on different request": "https://www.drupal.org/files/issues/2024-08-06/subrequests-3049395-change-request-type.patch" @@ -191,6 +156,10 @@ } }, "repositories": [ + { + "type": "path", + "url": "./patches/helfi_platform_config" + }, { "type": "composer", "url": "https://repository.drupal.hel.ninja" diff --git a/composer.lock b/composer.lock index 1b923cda..6bd87d2c 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": "5eab3e81895dbab08aa5de957a72f418", + "content-hash": "4ccc37814800b7ea56e3ea4bedbfb5b2", "packages": [ { "name": "asm89/stack-cors", @@ -184,32 +184,40 @@ "time": "2024-06-06T17:36:37+00:00" }, { - "name": "clue/stream-filter", - "version": "v1.7.0", + "name": "chillerlan/php-qrcode", + "version": "4.4.1", "source": { "type": "git", - "url": "https://github.com/clue/stream-filter.git", - "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" + "url": "https://github.com/chillerlan/php-qrcode.git", + "reference": "f5e243f3b61a60934780579430a951460f40888d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", - "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", + "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/f5e243f3b61a60934780579430a951460f40888d", + "reference": "f5e243f3b61a60934780579430a951460f40888d", "shasum": "" }, "require": { - "php": ">=5.3" + "chillerlan/php-settings-container": "^2.1.4 || ^3.1", + "ext-mbstring": "*", + "php": "^7.4 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + "phan/phan": "^5.4", + "phpmd/phpmd": "^2.15", + "phpunit/phpunit": "^9.6", + "setasign/fpdf": "^1.8.2", + "squizlabs/php_codesniffer": "^3.8" + }, + "suggest": { + "chillerlan/php-authenticator": "Yet another Google authenticator! Also creates URIs for mobile apps.", + "setasign/fpdf": "Required to use the QR FPDF output.", + "simple-icons/simple-icons": "SVG icons that you can use to embed as logos in the QR Code" }, "type": "library", "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "Clue\\StreamFilter\\": "src/" + "chillerlan\\QRCode\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -218,36 +226,235 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering" + "name": "Kazuhiko Arase", + "homepage": "https://github.com/kazuhikoarase" + }, + { + "name": "Smiley", + "email": "smiley@chillerlan.net", + "homepage": "https://github.com/codemasher" + }, + { + "name": "Contributors", + "homepage": "https://github.com/chillerlan/php-qrcode/graphs/contributors" } ], - "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/stream-filter", + "description": "A QR code generator with a user friendly API. PHP 7.4+", + "homepage": "https://github.com/chillerlan/php-qrcode", "keywords": [ - "bucket brigade", - "callback", - "filter", - "php_user_filter", - "stream", - "stream_filter_append", - "stream_filter_register" + "phpqrcode", + "qr", + "qr code", + "qrcode", + "qrcode-generator" ], "support": { - "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.7.0" + "issues": "https://github.com/chillerlan/php-qrcode/issues", + "source": "https://github.com/chillerlan/php-qrcode/tree/4.4.1" }, "funding": [ { - "url": "https://clue.engineering/support", + "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4", "type": "custom" }, { - "url": "https://github.com/clue", - "type": "github" + "url": "https://ko-fi.com/codemasher", + "type": "ko_fi" + } + ], + "time": "2024-01-06T16:56:58+00:00" + }, + { + "name": "chillerlan/php-settings-container", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/chillerlan/php-settings-container.git", + "reference": "95ed3e9676a1d47cab2e3174d19b43f5dbf52681" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/95ed3e9676a1d47cab2e3174d19b43f5dbf52681", + "reference": "95ed3e9676a1d47cab2e3174d19b43f5dbf52681", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^8.1" + }, + "require-dev": { + "phpmd/phpmd": "^2.15", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-deprecation-rules": "^1.2", + "phpunit/phpunit": "^10.5", + "squizlabs/php_codesniffer": "^3.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "chillerlan\\Settings\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Smiley", + "email": "smiley@chillerlan.net", + "homepage": "https://github.com/codemasher" + } + ], + "description": "A container class for immutable settings objects. Not a DI container.", + "homepage": "https://github.com/chillerlan/php-settings-container", + "keywords": [ + "Settings", + "configuration", + "container", + "helper" + ], + "support": { + "issues": "https://github.com/chillerlan/php-settings-container/issues", + "source": "https://github.com/chillerlan/php-settings-container" + }, + "funding": [ + { + "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4", + "type": "custom" + }, + { + "url": "https://ko-fi.com/codemasher", + "type": "ko_fi" + } + ], + "time": "2024-07-16T11:13:48+00:00" + }, + { + "name": "christian-riesen/otp", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/ChristianRiesen/otp.git", + "reference": "aab865ae6d356993ad9d51f8a7e8f32b8a54730a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ChristianRiesen/otp/zipball/aab865ae6d356993ad9d51f8a7e8f32b8a54730a", + "reference": "aab865ae6d356993ad9d51f8a7e8f32b8a54730a", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2", + "paragonie/random_compat": ">=1", + "php": ">=5.6.0", + "symfony/polyfill-php56": "^1" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.11 || ^6.0.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Otp\\": "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": "One Time Passwords, hotp and totp according to RFC4226 and RFC6238", + "homepage": "https://github.com/ChristianRiesen/otp", + "keywords": [ + "googleauthenticator", + "hotp", + "otp", + "rfc4226", + "rfc6238", + "totp" + ], + "support": { + "issues": "https://github.com/ChristianRiesen/otp/issues", + "source": "https://github.com/ChristianRiesen/otp/tree/2.7.0" + }, + "time": "2021-02-23T20:13:30+00:00" + }, + { + "name": "commerceguys/addressing", + "version": "v1.4.2", + "source": { + "type": "git", + "url": "https://github.com/commerceguys/addressing.git", + "reference": "406c7b5f0fbe4f6a64155c0fe03b1adb34d01308" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/commerceguys/addressing/zipball/406c7b5f0fbe4f6a64155c0fe03b1adb34d01308", + "reference": "406c7b5f0fbe4f6a64155c0fe03b1adb34d01308", + "shasum": "" + }, + "require": { + "doctrine/collections": "^1.2 || ^2.0", + "php": ">=7.3" + }, + "require-dev": { + "ext-json": "*", + "mikey179/vfsstream": "^1.6.10", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.6", + "symfony/validator": "^4.4 || ^5.4 || ^6.0" + }, + "suggest": { + "symfony/validator": "to validate addresses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "CommerceGuys\\Addressing\\": "src" } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bojan Zivanovic" + }, + { + "name": "Damien Tournoud" + } + ], + "description": "Addressing library powered by CLDR and Google's address data.", + "keywords": [ + "address", + "internationalization", + "localization", + "postal" ], - "time": "2023-12-20T15:40:13+00:00" + "support": { + "issues": "https://github.com/commerceguys/addressing/issues", + "source": "https://github.com/commerceguys/addressing/tree/v1.4.2" + }, + "time": "2023-02-15T10:11:14+00:00" }, { "name": "composer/installers", @@ -1263,6 +1470,92 @@ }, "time": "2024-09-05T10:15:52+00:00" }, + { + "name": "doctrine/collections", + "version": "2.2.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1", + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "ext-json": "*", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/2.2.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", + "type": "tidelift" + } + ], + "time": "2024-04-18T06:56:21+00:00" + }, { "name": "doctrine/deprecations", "version": "1.1.3", @@ -1389,59 +1682,169 @@ "time": "2024-02-05T11:35:39+00:00" }, { - "name": "drupal/admin_toolbar", - "version": "3.5.0", + "name": "dompdf/php-font-lib", + "version": "1.0.0", "source": { "type": "git", - "url": "https://git.drupalcode.org/project/admin_toolbar.git", - "reference": "3.5.0" + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "991d6a954f6bbd7e41022198f00586b230731441" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/admin_toolbar-3.5.0.zip", - "reference": "3.5.0", - "shasum": "099e8d4dc98e1d551b4f9cffdc39599eb8ad04e8" + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/991d6a954f6bbd7e41022198f00586b230731441", + "reference": "991d6a954f6bbd7e41022198f00586b230731441", + "shasum": "" }, "require": { - "drupal/core": "^9.5 || ^10 || ^11" + "ext-mbstring": "*", + "php": "^7.1 || ^8.0" }, "require-dev": { - "drupal/admin_toolbar_tools": "*" + "symfony/phpunit-bridge": "^3 || ^4 || ^5 || ^6" }, - "type": "drupal-module", - "extra": { - "drupal": { - "version": "3.5.0", - "datestamp": "1722639094", - "security-coverage": { - "status": "covered", - "message": "Covered by Drupal's security advisory policy" - } + "type": "library", + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" } }, - "notification-url": "https://packages.drupal.org/8/downloads", + "notification-url": "https://packagist.org/downloads/", "license": [ - "GPL-2.0-or-later" + "LGPL-2.1-or-later" ], "authors": [ { - "name": "Wilfrid Roze (eme)", - "homepage": "https://www.drupal.org/u/eme", - "role": "Maintainer" - }, - { - "name": "Romain Jarraud (romainj)", - "homepage": "https://www.drupal.org/u/romainj", - "role": "Maintainer" - }, - { - "name": "Adrian Cid Almaguer (adriancid)", - "homepage": "https://www.drupal.org/u/adriancid", - "email": "adriancid@gmail.com", - "role": "Maintainer" - }, - { - "name": "Mohamed Anis Taktak (matio89)", + "name": "The FontLib Community", + "homepage": "https://github.com/dompdf/php-font-lib/blob/master/AUTHORS.md" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/dompdf/php-font-lib", + "support": { + "issues": "https://github.com/dompdf/php-font-lib/issues", + "source": "https://github.com/dompdf/php-font-lib/tree/1.0.0" + }, + "time": "2024-04-29T13:40:38+00:00" + }, + { + "name": "drupal/address", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/address.git", + "reference": "8.x-1.12" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/address-8.x-1.12.zip", + "reference": "8.x-1.12", + "shasum": "67dd4699040aabf0cd6169e437706fa6a39b0b3a" + }, + "require": { + "commerceguys/addressing": "^1.4.2", + "drupal/core": "^9.2 || ^10", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "drupal/token": "^1.0" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-1.12", + "datestamp": "1684710176", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "bojanz", + "homepage": "https://www.drupal.org/user/86106" + }, + { + "name": "Centarro", + "homepage": "https://www.drupal.org/user/3661446" + }, + { + "name": "dww", + "homepage": "https://www.drupal.org/user/46549" + }, + { + "name": "jsacksick", + "homepage": "https://www.drupal.org/user/972218" + }, + { + "name": "rszrama", + "homepage": "https://www.drupal.org/user/49344" + } + ], + "description": "Provides functionality for storing, validating and displaying international postal addresses.", + "homepage": "http://drupal.org/project/address", + "support": { + "source": "https://git.drupalcode.org/project/address" + } + }, + { + "name": "drupal/admin_toolbar", + "version": "3.5.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/admin_toolbar.git", + "reference": "3.5.0" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/admin_toolbar-3.5.0.zip", + "reference": "3.5.0", + "shasum": "099e8d4dc98e1d551b4f9cffdc39599eb8ad04e8" + }, + "require": { + "drupal/core": "^9.5 || ^10 || ^11" + }, + "require-dev": { + "drupal/admin_toolbar_tools": "*" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "3.5.0", + "datestamp": "1722639094", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Wilfrid Roze (eme)", + "homepage": "https://www.drupal.org/u/eme", + "role": "Maintainer" + }, + { + "name": "Romain Jarraud (romainj)", + "homepage": "https://www.drupal.org/u/romainj", + "role": "Maintainer" + }, + { + "name": "Adrian Cid Almaguer (adriancid)", + "homepage": "https://www.drupal.org/u/adriancid", + "email": "adriancid@gmail.com", + "role": "Maintainer" + }, + { + "name": "Mohamed Anis Taktak (matio89)", "homepage": "https://www.drupal.org/u/matio89", "role": "Maintainer" }, @@ -1534,6 +1937,101 @@ "issues": "https://www.drupal.org/project/issues/allowed_formats" } }, + { + "name": "drupal/ckeditor", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/ckeditor.git", + "reference": "1.0.2" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/ckeditor-1.0.2.zip", + "reference": "1.0.2", + "shasum": "fec2ca9ad852a00c7b9584cb6040dc860364c481" + }, + "require": { + "drupal/core": "^9.4 || ^10" + }, + "require-dev": { + "drupal/classy": "*" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "1.0.2", + "datestamp": "1695740655", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "dczepierga", + "homepage": "https://www.drupal.org/user/911466" + }, + { + "name": "hass", + "homepage": "https://www.drupal.org/user/85918" + }, + { + "name": "jcisio", + "homepage": "https://www.drupal.org/user/210762" + }, + { + "name": "Jorrit", + "homepage": "https://www.drupal.org/user/161217" + }, + { + "name": "lauriii", + "homepage": "https://www.drupal.org/user/1078742" + }, + { + "name": "Magnus", + "homepage": "https://www.drupal.org/user/73919" + }, + { + "name": "mkesicki", + "homepage": "https://www.drupal.org/user/922884" + }, + { + "name": "nod_", + "homepage": "https://www.drupal.org/user/598310" + }, + { + "name": "p.wiaderny", + "homepage": "https://www.drupal.org/user/2956619" + }, + { + "name": "vokiel", + "homepage": "https://www.drupal.org/user/2793801" + }, + { + "name": "Wim Leers", + "homepage": "https://www.drupal.org/user/99777" + }, + { + "name": "wwalc", + "homepage": "https://www.drupal.org/user/184556" + }, + { + "name": "xjm", + "homepage": "https://www.drupal.org/user/65776" + } + ], + "description": "WYSIWYG editing for rich text fields using CKEditor.", + "homepage": "https://www.drupal.org/project/ckeditor", + "support": { + "source": "https://git.drupalcode.org/project/ckeditor" + } + }, { "name": "drupal/ckeditor5_paste_filter", "version": "1.0.1", @@ -2034,18 +2532,90 @@ "source": "https://git.drupalcode.org/project/consumers" } }, + { + "name": "drupal/content_lock", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/content_lock.git", + "reference": "8.x-2.4" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/content_lock-8.x-2.4.zip", + "reference": "8.x-2.4", + "shasum": "99d149e530555aae12b44292efe5887d373e862e" + }, + "require": { + "drupal/core": "^9.0 || ^10.0" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-2.4", + "datestamp": "1715783058", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "alexpott", + "homepage": "https://www.drupal.org/user/157725" + }, + { + "name": "AstonVictor", + "homepage": "https://www.drupal.org/user/3466615" + }, + { + "name": "chr.fritsch", + "homepage": "https://www.drupal.org/user/2103716" + }, + { + "name": "daniel.bosen", + "homepage": "https://www.drupal.org/user/404865" + }, + { + "name": "ergonlogic", + "homepage": "https://www.drupal.org/user/368613" + }, + { + "name": "mfb", + "homepage": "https://www.drupal.org/user/12302" + }, + { + "name": "pandaski", + "homepage": "https://www.drupal.org/user/1987218" + }, + { + "name": "volkerk", + "homepage": "https://www.drupal.org/user/57527" + } + ], + "description": "Prevents multiple users from trying to edit a content entity simultaneously to prevent edit conflicts.", + "homepage": "https://www.drupal.org/project/content_lock", + "support": { + "source": "https://git.drupalcode.org/project/content_lock" + } + }, { "name": "drupal/core", - "version": "10.3.3", + "version": "10.3.5", "source": { "type": "git", "url": "https://github.com/drupal/core.git", - "reference": "900f85d93564fa8bea99519c11b564b22df7fb97" + "reference": "831a269a4d99957638977ec325c3346f896d9f08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core/zipball/900f85d93564fa8bea99519c11b564b22df7fb97", - "reference": "900f85d93564fa8bea99519c11b564b22df7fb97", + "url": "https://api.github.com/repos/drupal/core/zipball/831a269a4d99957638977ec325c3346f896d9f08", + "reference": "831a269a4d99957638977ec325c3346f896d9f08", "shasum": "" }, "require": { @@ -2091,7 +2661,7 @@ "symfony/serializer": "^6.4", "symfony/validator": "^6.4", "symfony/yaml": "^6.4", - "twig/twig": "^3.9.3" + "twig/twig": "^3.14.0" }, "conflict": { "drush/drush": "<12.4.3" @@ -2194,22 +2764,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.3" + "source": "https://github.com/drupal/core/tree/10.3.5" }, - "time": "2024-09-05T08:50:05+00:00" + "time": "2024-09-12T09:45:37+00:00" }, { "name": "drupal/core-composer-scaffold", - "version": "10.3.2", + "version": "10.3.5", "source": { "type": "git", "url": "https://github.com/drupal/core-composer-scaffold.git", - "reference": "a1a186caeb89899143e0c6912ccee9d3d7181dbe" + "reference": "f58ab5c0d02d275c5aa226c4505b457e41b161cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/a1a186caeb89899143e0c6912ccee9d3d7181dbe", - "reference": "a1a186caeb89899143e0c6912ccee9d3d7181dbe", + "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/f58ab5c0d02d275c5aa226c4505b457e41b161cc", + "reference": "f58ab5c0d02d275c5aa226c4505b457e41b161cc", "shasum": "" }, "require": { @@ -2244,9 +2814,9 @@ "drupal" ], "support": { - "source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.2" + "source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.5" }, - "time": "2024-05-11T08:21:39+00:00" + "time": "2024-08-22T14:31:34+00:00" }, { "name": "drupal/crop", @@ -2307,33 +2877,33 @@ }, { "name": "drupal/ctools", - "version": "4.1.0", + "version": "4.0.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/ctools.git", - "reference": "4.1.0" + "reference": "4.0.0" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/ctools-4.1.0.zip", - "reference": "4.1.0", - "shasum": "69f5889cf557df9e55519390e6a95cfa31b67874" + "url": "https://ftp.drupal.org/files/projects/ctools-4.0.0.zip", + "reference": "4.0.0", + "shasum": "1401d8ea364c0fbaf36b09e990c8a7a570e8e800" }, "require": { - "drupal/core": "^9.5 || ^10 || ^11" + "drupal/core": "^9.2 || ^10" }, "type": "drupal-module", "extra": { "drupal": { - "version": "4.1.0", - "datestamp": "1718144949", + "version": "4.0.0", + "datestamp": "1659118616", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" } }, "branch-alias": { - "dev-8.x-3.x": "3.x-dev" + "dev-4.x": "4.x-dev" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -2367,8 +2937,9 @@ "role": "Maintainer" }, { - "name": "joelpittet", - "homepage": "https://www.drupal.org/user/160302" + "name": "Joël (joelpittet)", + "homepage": "https://www.drupal.org/u/joelpittet", + "role": "Maintainer" }, { "name": "merlinofchaos", @@ -2640,41 +3211,200 @@ } }, { - "name": "drupal/elasticsearch_connector", - "version": "7.0.0-alpha5", + "name": "drupal/easy_breadcrumb", + "version": "2.0.8", "source": { "type": "git", - "url": "https://git.drupalcode.org/project/elasticsearch_connector.git", - "reference": "8.x-7.0-alpha5" + "url": "https://git.drupalcode.org/project/easy_breadcrumb.git", + "reference": "2.0.8" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/elasticsearch_connector-8.x-7.0-alpha5.zip", - "reference": "8.x-7.0-alpha5", - "shasum": "75456c31f48d76b176d81f258aa589987cd16b87" + "url": "https://ftp.drupal.org/files/projects/easy_breadcrumb-2.0.8.zip", + "reference": "2.0.8", + "shasum": "49bfd9b8b0ec664963d05e360449876745cf2868" }, "require": { - "drupal/core": "^9.2 || ^10", - "ext-curl": "*", - "makinacorpus/php-lucene": "^1.0.2", - "nodespark/des-connector": "7.x-dev" - }, - "require-dev": { - "behat/mink-selenium2-driver": "^1.3", - "bex/behat-screenshot": "^1.2", - "drupal/coder": "^8.2", - "drupal/drupal-extension": "master-dev", - "drupal/search_api": "^1.4", - "phpmd/phpmd": "^2.6", - "phpmetrics/phpmetrics": "^2.3" + "drupal/core": "^9.2 || ^10 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-7.0-alpha5", - "datestamp": "1718962853", + "version": "2.0.8", + "datestamp": "1723545040", "security-coverage": { - "status": "not-covered", + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Neslee Canil Pinto", + "homepage": "https://www.drupal.org/u/neslee-canil-pinto", + "role": "Maintainer" + }, + { + "name": "Greg Boggs", + "homepage": "https://www.drupal.org/u/greg-boggs", + "role": "Maintainer" + }, + { + "name": "diamondsea", + "homepage": "https://www.drupal.org/user/430714" + }, + { + "name": "greg boggs", + "homepage": "https://www.drupal.org/user/153069" + }, + { + "name": "hmartens", + "homepage": "https://www.drupal.org/user/622826" + }, + { + "name": "loopduplicate", + "homepage": "https://www.drupal.org/user/717290" + }, + { + "name": "neslee canil pinto", + "homepage": "https://www.drupal.org/user/3580850" + }, + { + "name": "nickdickinsonwilde", + "homepage": "https://www.drupal.org/user/3094661" + }, + { + "name": "rakesh.gectcr", + "homepage": "https://www.drupal.org/user/1177822" + }, + { + "name": "renatog", + "homepage": "https://www.drupal.org/user/3326031" + }, + { + "name": "sonemonu", + "homepage": "https://www.drupal.org/user/1667988" + }, + { + "name": "spuky", + "homepage": "https://www.drupal.org/user/209353" + }, + { + "name": "tatarbj", + "homepage": "https://www.drupal.org/user/649590" + } + ], + "description": "Adds configuration to the system breadcrumbs.", + "homepage": "https://www.drupal.org/project/easy_breadcrumb", + "support": { + "source": "https://git.drupalcode.org/project/easy_breadcrumb", + "issues": "https://www.drupal.org/project/issues/easy_breadcrumb" + } + }, + { + "name": "drupal/editoria11y", + "version": "2.1.18", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/editoria11y.git", + "reference": "2.1.18" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/editoria11y-2.1.18.zip", + "reference": "2.1.18", + "shasum": "ebdb25f92c2d77681661216ca3abebbc710b662a" + }, + "require": { + "drupal/core": "^9 || ^10 || ^11" + }, + "conflict": { + "drupal/csp": "<1.24" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "2.1.18", + "datestamp": "1716399461", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "John Jameson", + "homepage": "https://www.drupal.org/u/itmaybejj", + "role": "Maintainer" + }, + { + "name": "Brian Osborne", + "homepage": "https://www.drupal.org/u/bkosborne", + "role": "Maintainer" + }, + { + "name": "Jason Partyka", + "homepage": "https://www.drupal.org/u/partyka", + "role": "Maintainer" + }, + { + "name": "See other contributors", + "homepage": "https://www.drupal.org/node/3187132/committers", + "role": "contributor" + } + ], + "description": "Editoria11y (\"editorial accessibility\") is a user-friendly accessibility checker.", + "homepage": "https://drupal.org/project/editoria11y", + "support": { + "source": "https://git.drupalcode.org/project/editoria11y", + "issues": "https://drupal.org/project/issues/editoria11y" + } + }, + { + "name": "drupal/elasticsearch_connector", + "version": "7.0.0-alpha5", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/elasticsearch_connector.git", + "reference": "8.x-7.0-alpha5" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/elasticsearch_connector-8.x-7.0-alpha5.zip", + "reference": "8.x-7.0-alpha5", + "shasum": "75456c31f48d76b176d81f258aa589987cd16b87" + }, + "require": { + "drupal/core": "^9.2 || ^10", + "ext-curl": "*", + "makinacorpus/php-lucene": "^1.0.2", + "nodespark/des-connector": "7.x-dev" + }, + "require-dev": { + "behat/mink-selenium2-driver": "^1.3", + "bex/behat-screenshot": "^1.2", + "drupal/coder": "^8.2", + "drupal/drupal-extension": "master-dev", + "drupal/search_api": "^1.4", + "phpmd/phpmd": "^2.6", + "phpmetrics/phpmetrics": "^2.3" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-7.0-alpha5", + "datestamp": "1718962853", + "security-coverage": { + "status": "not-covered", "message": "Project has not opted into security advisory coverage!" } } @@ -2714,6 +3444,76 @@ "issues": "https://www.drupal.org/project/issues/elasticsearch_connector" } }, + { + "name": "drupal/encrypt", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/encrypt.git", + "reference": "8.x-3.1" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/encrypt-8.x-3.1.zip", + "reference": "8.x-3.1", + "shasum": "357ca7fcf9879af66b5d0c5593da080f19664f17" + }, + "require": { + "drupal/core": "^8 || ^9 || ^10", + "drupal/key": "*" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-3.1", + "datestamp": "1669655248", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + }, + "drush": { + "services": { + "drush.services.yml": "^9 || ^10 || ^11" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "alexpott", + "homepage": "https://www.drupal.org/user/157725" + }, + { + "name": "greggles", + "homepage": "https://www.drupal.org/user/36762" + }, + { + "name": "nerdstein", + "homepage": "https://www.drupal.org/user/1557710" + }, + { + "name": "rlhawk", + "homepage": "https://www.drupal.org/user/352283" + }, + { + "name": "theunraveler", + "homepage": "https://www.drupal.org/user/71548" + }, + { + "name": "zzolo", + "homepage": "https://www.drupal.org/user/147331" + } + ], + "description": "Provides an API for two-way encryption.", + "homepage": "https://www.drupal.org/project/encrypt", + "support": { + "source": "https://git.drupalcode.org/project/encrypt" + } + }, { "name": "drupal/entity", "version": "1.5.0", @@ -3336,13 +4136,21 @@ ], "authors": [ { - "name": "Anybody", + "name": "anybody", "homepage": "https://www.drupal.org/user/291091" }, { - "name": "Hydra", + "name": "grevil", + "homepage": "https://www.drupal.org/user/3668491" + }, + { + "name": "hydra", "homepage": "https://www.drupal.org/user/647364" }, + { + "name": "joevagyok", + "homepage": "https://www.drupal.org/user/2876343" + }, { "name": "jyve", "homepage": "https://www.drupal.org/user/591438" @@ -3367,6 +4175,56 @@ "issues": "https://www.drupal.org/project/issues/field_group" } }, + { + "name": "drupal/file_mdm", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/file_mdm.git", + "reference": "3.1.0" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/file_mdm-3.1.0.zip", + "reference": "3.1.0", + "shasum": "fa7709137705a693c4d5329035612473045a19d3" + }, + "require": { + "dompdf/php-font-lib": "^1", + "drupal/core": "^10.3 | ^11", + "fileeye/pel": "^0.10.0" + }, + "require-dev": { + "drupal/vendor_stream_wrapper": "^2.0.4", + "fileeye/linuxlibertine-fonts": "^5.3" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "3.1.0", + "datestamp": "1718086268", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "mondrake", + "homepage": "https://www.drupal.org/user/1307444" + } + ], + "description": "Provides a service to manage file metadata.", + "homepage": "https://www.drupal.org/project/file_mdm", + "support": { + "source": "https://git.drupalcode.org/project/file_mdm" + } + }, { "name": "drupal/flysystem", "version": "2.1.0-rc6", @@ -3943,47 +4801,223 @@ "time": "2024-08-16T09:24:27+00:00" }, { - "name": "drupal/image_style_quality", - "version": "1.6.0", + "name": "drupal/helfi_platform_config", + "version": "4.6.5", "source": { "type": "git", - "url": "https://git.drupalcode.org/project/image_style_quality.git", - "reference": "8.x-1.6" + "url": "https://github.com/City-of-Helsinki/drupal-helfi-platform-config.git", + "reference": "3a3d6c22a312a1f126b8aa97cc4de137b541955b" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/image_style_quality-8.x-1.6.zip", - "reference": "8.x-1.6", - "shasum": "262f63471c3765eb7c944476f18b27fb82bdeaa1" + "url": "https://api.github.com/repos/City-of-Helsinki/drupal-helfi-platform-config/zipball/3a3d6c22a312a1f126b8aa97cc4de137b541955b", + "reference": "3a3d6c22a312a1f126b8aa97cc4de137b541955b", + "shasum": "" }, "require": { - "drupal/core": "^8 || ^9 || ^10", - "php": ">=7.4" - }, - "require-dev": { - "drupal/imagemagick": "*", - "drupal/imagick": "*" + "drupal/admin_toolbar": "^3.0", + "drupal/allowed_formats": "^2.0", + "drupal/ckeditor": "^1.0", + "drupal/ckeditor5_paste_filter": "^1.0", + "drupal/config_ignore": "^3.0", + "drupal/config_rewrite": "^1.4", + "drupal/content_lock": "^2.2", + "drupal/core": "^10", + "drupal/core-composer-scaffold": "^10", + "drupal/crop": "^2.1", + "drupal/default_content": "^2.0.0-alpha2", + "drupal/diff": "^1.0", + "drupal/easy_breadcrumb": "^2.0", + "drupal/editoria11y": "^2.0", + "drupal/elasticsearch_connector": "^7.0@alpha", + "drupal/entity_browser": "^2.5", + "drupal/entity_usage": "^2.0@beta", + "drupal/eu_cookie_compliance": "^1.24", + "drupal/external_entities": "^2.0@beta", + "drupal/field_group": "^3.1", + "drupal/focal_point": "^2.0", + "drupal/gin_toolbar": "^1.0@rc", + "drupal/hal": "^2.0", + "drupal/helfi_api_base": "*", + "drupal/helfi_tpr": "*", + "drupal/image_style_quality": "^1.4", + "drupal/imagecache_external": "^3.0", + "drupal/imagemagick": "^3.4", + "drupal/jquery_ui": "^1.6", + "drupal/jquery_ui_draggable": "^2.0", + "drupal/linkit": "^6.0", + "drupal/media_entity_file_replace": "^1.0", + "drupal/menu_block_current_language": "^2.0", + "drupal/menu_link_attributes": "^1.2", + "drupal/metatag": "^2", + "drupal/oembed_providers": "^2.0", + "drupal/paragraphs": "^1.12", + "drupal/paragraphs_asymmetric_translation_widgets": "^1.0", + "drupal/pathauto": "^1.8", + "drupal/publication_date": "^2.0@beta", + "drupal/rdf": "^2.0", + "drupal/readonly_field_widget": "^1.0", + "drupal/real_aes": "^2.6", + "drupal/redirect": "^1.6", + "drupal/role_delegation": "^1.1", + "drupal/scheduler": "^1.3", + "drupal/search_api": "^1.0", + "drupal/select2": "^1.12", + "drupal/simple_sitemap": "^4.0", + "drupal/siteimprove": "^2.0", + "drupal/social_media": "^2.0", + "drupal/stage_file_proxy": "^2", + "drupal/stomp": "^2.0", + "drupal/tfa": "^1.7", + "drupal/token": "^1.9", + "drupal/translatable_menu_link_uri": "^2.0", + "drupal/view_unpublished": "^1.0", + "drupal/views_bulk_edit": "^2.7", + "drupal/views_bulk_operations": "^4.1", + "ext-curl": "*", + "league/uri": "^6.0", + "php": "^8.1" }, - "suggest": { - "drupal/imagemagick": "*", - "drupal/imagick": "*" + "conflict": { + "drupal/core": "<10.3", + "drupal/core-composer-scaffold": "<10.3", + "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" }, "type": "drupal-module", "extra": { - "drupal": { - "version": "8.x-1.6", - "datestamp": "1679497333", - "security-coverage": { - "status": "covered", - "message": "Covered by Drupal's security advisory policy" + "patches": { + "drupal/content_lock": { + "[#UHF-4553] Fix unlock content button redirect": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/82081691e4a6d05b3716052d5fff46a04027bdc3/patches/content-lock-uhf-4553.patch" + }, + "drupal/core": { + "[#UHF-181] Hide untranslated menu links (https://www.drupal.org/project/drupal/issues/3091246)": "https://www.drupal.org/files/issues/2023-12-18/3091246--allow-menu-tree-manipulators-alter--24.patch", + "[#UHF-3812] Ajax exposed filters not working for multiple instances of the same Views block placed on one page (https://www.drupal.org/project/drupal/issues/3163299)": "https://www.drupal.org/files/issues/2023-05-07/3163299-104-D10.patch", + "[#UHF-4325] Strip whitespaces from twig debug comments": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/ebee28c484e86152970b3f5534b7080831322316/patches/drupal_core_strip_debug_mode_whitespaces_10.3.x.patch", + "[#UHF-7008] Core localization file download URL is wrong (https://www.drupal.org/project/drupal/issues/3022876)": "https://git.drupalcode.org/project/drupal/-/commit/40a96136b2dfe4322338508dffa636f6cb407900.patch", + "[#UHF-7008] Add multilingual support for caching basefield definitions (https://www.drupal.org/project/drupal/issues/3114824)": "https://www.drupal.org/files/issues/2020-02-20/3114824_2.patch", + "[#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" + }, + "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" + }, + "drupal/eu_cookie_compliance": { + "[#UHF-885] Helfi-specific customizations to EU Cookie Compliance": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/923b35f699820b544397a35b7696570e101cd02c/patches/eu_cookie_compliance_block_8.x-1.24.patch", + "[#UHF-8720] Missing config schema for dependencies (https://www.drupal.org/i/3330024)": "https://www.drupal.org/files/issues/2022-12-28/config_dependencies_schema-3330024-2.patch" + }, + "drupal/diff": { + "Revision overview form problem (https://www.drupal.org/i/3390329)": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/05989cc82b2817de994ad4e9289ccb777f71f23f/patches/diff_8.x_1.3_revision_overview_form.patch" + }, + "drupal/paragraphs": { + "https://www.drupal.org/project/paragraphs/issues/2904705#comment-13836790": "https://www.drupal.org/files/issues/2020-09-25/2904705-115.patch", + "[#UHF-2059] Enhancements for the Admin UI": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/fdccb32397cc6fa19b4d0077b21a2b18aa6be297/patches/helfi_customizations_for_paragraphs_widget_8.x-1.12.patch" + }, + "drupal/view_unpublished": { + "[#UHF-9256] Fix missing dynamic permission dependencies.": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/cbb944ae79643ba7ed895db3fac7f3b3d90ac850/patches/view_unpublished_permissions_missing_dependencies.patch" } } }, - "notification-url": "https://packages.drupal.org/8/downloads", "license": [ "GPL-2.0-or-later" ], - "authors": [ + "description": "HELfi platform config", + "support": { + "source": "https://github.com/City-of-Helsinki/drupal-helfi-platform-config/tree/4.6.5", + "issues": "https://github.com/City-of-Helsinki/drupal-helfi-platform-config/issues" + }, + "time": "2024-09-20T10:40:37+00:00" + }, + { + "name": "drupal/helfi_tpr", + "version": "2.3.8", + "source": { + "type": "git", + "url": "https://github.com/City-of-Helsinki/drupal-module-helfi-tpr.git", + "reference": "b64f239e7b8379cbc97dfc28d35e8c3f2db80162" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/City-of-Helsinki/drupal-module-helfi-tpr/zipball/b64f239e7b8379cbc97dfc28d35e8c3f2db80162", + "reference": "b64f239e7b8379cbc97dfc28d35e8c3f2db80162", + "shasum": "" + }, + "require": { + "drupal/address": "~1.0", + "drupal/helfi_api_base": "*", + "drupal/readonly_field_widget": "^1.0", + "drupal/twig_tweak": "^2.0 || ^3.0", + "drupal/views_infinite_scroll": "^2.0", + "php": "^8.0" + }, + "conflict": { + "drupal/helfi_api_base": "<2.6.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "donatj/mock-webserver": "dev-master", + "drupal/coder": "^8.3", + "phpspec/prophecy-phpunit": "^2" + }, + "type": "drupal-module", + "license": [ + "GPL-2.0-or-later" + ], + "description": "TPR integration", + "support": { + "source": "https://github.com/City-of-Helsinki/drupal-module-helfi-tpr/tree/2.3.8", + "issues": "https://github.com/City-of-Helsinki/drupal-module-helfi-tpr/issues" + }, + "time": "2024-03-25T06:40:36+00:00" + }, + { + "name": "drupal/image_style_quality", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/image_style_quality.git", + "reference": "8.x-1.6" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/image_style_quality-8.x-1.6.zip", + "reference": "8.x-1.6", + "shasum": "262f63471c3765eb7c944476f18b27fb82bdeaa1" + }, + "require": { + "drupal/core": "^8 || ^9 || ^10", + "php": ">=7.4" + }, + "require-dev": { + "drupal/imagemagick": "*", + "drupal/imagick": "*" + }, + "suggest": { + "drupal/imagemagick": "*", + "drupal/imagick": "*" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-1.6", + "datestamp": "1679497333", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ { "name": "Chris Charlton", "homepage": "https://www.drupal.org/user/17089" @@ -4003,6 +5037,161 @@ "source": "https://git.drupalcode.org/project/image_style_quality" } }, + { + "name": "drupal/imagecache_external", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/imagecache_external.git", + "reference": "3.0.4" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/imagecache_external-3.0.4.zip", + "reference": "3.0.4", + "shasum": "0a6fc7f66f6ab39beb787ae0a5923009911de55d" + }, + "require": { + "drupal/core": "^10.1 || ^11" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "3.0.4", + "datestamp": "1722719303", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "BarisW", + "homepage": "https://www.drupal.org/user/107229" + }, + { + "name": "larowlan", + "homepage": "https://www.drupal.org/user/395439" + }, + { + "name": "swentel", + "homepage": "https://www.drupal.org/user/107403" + } + ], + "description": "Allows you to fetch external images and use image styles on them.", + "homepage": "https://www.drupal.org/project/imagecache_external", + "support": { + "source": "https://git.drupalcode.org/project/imagecache_external" + } + }, + { + "name": "drupal/imagemagick", + "version": "3.7.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/imagemagick.git", + "reference": "8.x-3.7" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/imagemagick-8.x-3.7.zip", + "reference": "8.x-3.7", + "shasum": "2698db0ccc4a76d44ebbbfcabe9e70d25ae3db9b" + }, + "require": { + "drupal/core": "^10.1", + "drupal/file_mdm": "^3", + "drupal/sophron": "^2.0.2" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-3.7", + "datestamp": "1706096705", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Chris Charlton", + "homepage": "https://www.drupal.org/user/17089" + }, + { + "name": "chx", + "homepage": "https://www.drupal.org/user/9446" + }, + { + "name": "claudiu.cristea", + "homepage": "https://www.drupal.org/user/56348" + }, + { + "name": "dman", + "homepage": "https://www.drupal.org/user/33240" + }, + { + "name": "dopry", + "homepage": "https://www.drupal.org/user/22202" + }, + { + "name": "drewish", + "homepage": "https://www.drupal.org/user/34869" + }, + { + "name": "gdl", + "homepage": "https://www.drupal.org/user/507326" + }, + { + "name": "mondrake", + "homepage": "https://www.drupal.org/user/1307444" + }, + { + "name": "quicksketch", + "homepage": "https://www.drupal.org/user/35821" + }, + { + "name": "sun", + "homepage": "https://www.drupal.org/user/54136" + }, + { + "name": "walkah", + "homepage": "https://www.drupal.org/user/1531" + } + ], + "description": "Provides an image toolkit to integrate ImageMagick with the Image API.", + "homepage": "https://www.drupal.org/project/imagemagick", + "support": { + "source": "https://git.drupalcode.org/project/imagemagick" + } + }, + { + "name": "drupal/infofinland_dummy", + "version": "dev-UHF-10045", + "dist": { + "type": "path", + "url": "./patches/helfi_platform_config", + "reference": "99f16b73b0d8c2ac86e8a79d5cf4b4139ed87eab" + }, + "replace": { + "drupal/external_entities": "*" + }, + "type": "drupal-module", + "description": "Circumvents dependency issues when installing helfi_platform_config.", + "transport-options": { + "relative": true + } + }, { "name": "drupal/inline_entity_form", "version": "1.0.0-rc17", @@ -4096,28 +5285,27 @@ } }, { - "name": "drupal/jsonapi_extras", - "version": "3.25.0", + "name": "drupal/jquery_ui", + "version": "1.7.0", "source": { "type": "git", - "url": "https://git.drupalcode.org/project/jsonapi_extras.git", - "reference": "8.x-3.25" + "url": "https://git.drupalcode.org/project/jquery_ui.git", + "reference": "8.x-1.7" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/jsonapi_extras-8.x-3.25.zip", - "reference": "8.x-3.25", - "shasum": "ba557127ca560dbf3fae68f76c7720137857f167" + "url": "https://ftp.drupal.org/files/projects/jquery_ui-8.x-1.7.zip", + "reference": "8.x-1.7", + "shasum": "3f893843ec30fed18fa1b0cb326e51880b0cb686" }, "require": { - "drupal/core": "^9.2 || ^10", - "e0ipso/shaper": "^1" + "drupal/core": "^9.2 || ^10 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-3.25", - "datestamp": "1717340217", + "version": "8.x-1.7", + "datestamp": "1717002098", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -4130,57 +5318,91 @@ ], "authors": [ { - "name": "Mateu Aguiló Bosch", - "homepage": "https://www.drupal.org/user/3366066", - "email": "mateu.aguilo.bosch@gmail.com" + "name": "bnjmnm", + "homepage": "https://www.drupal.org/user/2369194" }, { - "name": "Martin Kolar", - "homepage": "https://www.drupal.org/u/mkolar" + "name": "jjeff", + "homepage": "https://www.drupal.org/user/17190" }, { - "name": "Karel Majzlik", - "homepage": "https://www.drupal.org/u/karlos007" + "name": "lauriii", + "homepage": "https://www.drupal.org/user/1078742" }, { - "name": "Björn Brala", - "homepage": "https://www.drupal.org/u/bbrala" + "name": "litwol", + "homepage": "https://www.drupal.org/user/78134" + }, + { + "name": "mfb", + "homepage": "https://www.drupal.org/user/12302" + }, + { + "name": "mfer", + "homepage": "https://www.drupal.org/user/25701" + }, + { + "name": "mikelutz", + "homepage": "https://www.drupal.org/user/2972409" + }, + { + "name": "nod_", + "homepage": "https://www.drupal.org/user/598310" + }, + { + "name": "phenaproxima", + "homepage": "https://www.drupal.org/user/205645" + }, + { + "name": "RobLoach", + "homepage": "https://www.drupal.org/user/61114" + }, + { + "name": "sun", + "homepage": "https://www.drupal.org/user/54136" + }, + { + "name": "webchick", + "homepage": "https://www.drupal.org/user/24967" + }, + { + "name": "Wim Leers", + "homepage": "https://www.drupal.org/user/99777" + }, + { + "name": "zrpnr", + "homepage": "https://www.drupal.org/user/1448368" } ], - "description": "JSON:API Extras provides a means to override and provide limited configurations to the default zero-configuration implementation provided by the JSON:API module.", - "homepage": "https://www.drupal.org/project/jsonapi_extras", + "description": "Provides jQuery UI library.", + "homepage": "https://www.drupal.org/project/jquery_ui", "support": { - "source": "https://git.drupalcode.org/project/jsonapi_extras" + "source": "https://git.drupalcode.org/project/jquery_ui" } }, { - "name": "drupal/jsonapi_menu_items", - "version": "1.2.6", + "name": "drupal/jquery_ui_draggable", + "version": "2.1.0", "source": { "type": "git", - "url": "https://git.drupalcode.org/project/jsonapi_menu_items.git", - "reference": "1.2.6" + "url": "https://git.drupalcode.org/project/jquery_ui_draggable.git", + "reference": "2.1.0" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/jsonapi_menu_items-1.2.6.zip", - "reference": "1.2.6", - "shasum": "5c682259cfe1e14bcc06dfdbabcf4bc251bdfd5e" + "url": "https://ftp.drupal.org/files/projects/jquery_ui_draggable-2.1.0.zip", + "reference": "2.1.0", + "shasum": "0d014cfff20993d8051efb8f6c9093a4fe5136f3" }, "require": { - "drupal/core": "^9.5 || ^10 || ^11", - "drupal/jsonapi_resources": "^1.0" - }, - "require-dev": { - "drupal/jsonapi_hypermedia": "^1.6", - "drupal/menu_item_extras": "^3.0", - "drupal/menu_link_config": "^1.0" + "drupal/core": "^9.2 || ^10 || ^11", + "drupal/jquery_ui": "^1.7" }, "type": "drupal-module", "extra": { "drupal": { - "version": "1.2.6", - "datestamp": "1722543501", + "version": "2.1.0", + "datestamp": "1717015492", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -4193,16 +5415,132 @@ ], "authors": [ { - "name": "acbramley", - "homepage": "https://www.drupal.org/user/1036766" - }, - { - "name": "Deciphered", - "homepage": "https://www.drupal.org/user/103796" + "name": "bnjmnm", + "homepage": "https://www.drupal.org/user/2369194" }, { - "name": "larowlan", - "homepage": "https://www.drupal.org/user/395439" + "name": "lauriii", + "homepage": "https://www.drupal.org/user/1078742" + }, + { + "name": "zrpnr", + "homepage": "https://www.drupal.org/user/1448368" + } + ], + "description": "Provides jQuery UI Draggable library.", + "homepage": "https://www.drupal.org/project/jquery_ui_draggable", + "support": { + "source": "https://git.drupalcode.org/project/jquery_ui_draggable" + } + }, + { + "name": "drupal/jsonapi_extras", + "version": "3.25.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/jsonapi_extras.git", + "reference": "8.x-3.25" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/jsonapi_extras-8.x-3.25.zip", + "reference": "8.x-3.25", + "shasum": "ba557127ca560dbf3fae68f76c7720137857f167" + }, + "require": { + "drupal/core": "^9.2 || ^10", + "e0ipso/shaper": "^1" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-3.25", + "datestamp": "1717340217", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Mateu Aguiló Bosch", + "homepage": "https://www.drupal.org/user/3366066", + "email": "mateu.aguilo.bosch@gmail.com" + }, + { + "name": "Martin Kolar", + "homepage": "https://www.drupal.org/u/mkolar" + }, + { + "name": "Karel Majzlik", + "homepage": "https://www.drupal.org/u/karlos007" + }, + { + "name": "Björn Brala", + "homepage": "https://www.drupal.org/u/bbrala" + } + ], + "description": "JSON:API Extras provides a means to override and provide limited configurations to the default zero-configuration implementation provided by the JSON:API module.", + "homepage": "https://www.drupal.org/project/jsonapi_extras", + "support": { + "source": "https://git.drupalcode.org/project/jsonapi_extras" + } + }, + { + "name": "drupal/jsonapi_menu_items", + "version": "1.2.6", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/jsonapi_menu_items.git", + "reference": "1.2.6" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/jsonapi_menu_items-1.2.6.zip", + "reference": "1.2.6", + "shasum": "5c682259cfe1e14bcc06dfdbabcf4bc251bdfd5e" + }, + "require": { + "drupal/core": "^9.5 || ^10 || ^11", + "drupal/jsonapi_resources": "^1.0" + }, + "require-dev": { + "drupal/jsonapi_hypermedia": "^1.6", + "drupal/menu_item_extras": "^3.0", + "drupal/menu_link_config": "^1.0" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "1.2.6", + "datestamp": "1722543501", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "acbramley", + "homepage": "https://www.drupal.org/user/1036766" + }, + { + "name": "Deciphered", + "homepage": "https://www.drupal.org/user/103796" + }, + { + "name": "larowlan", + "homepage": "https://www.drupal.org/user/395439" }, { "name": "mglaman", @@ -4279,6 +5617,77 @@ "source": "https://git.drupalcode.org/project/jsonapi_resources" } }, + { + "name": "drupal/key", + "version": "1.19.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/key.git", + "reference": "8.x-1.19" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/key-8.x-1.19.zip", + "reference": "8.x-1.19", + "shasum": "ee8f7b8f8babd381f1e4423dccede94b4eb5985c" + }, + "require": { + "drupal/core": ">=8.9 <12" + }, + "require-dev": { + "drush/drush": ">=9" + }, + "suggest": { + "drush/drush": ">=11" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-1.19", + "datestamp": "1720053341", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + }, + "drush": { + "services": { + "drush.services.yml": ">=9" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Cellar Door", + "homepage": "https://www.drupal.org/user/658076" + }, + { + "name": "crashtest_", + "homepage": "https://www.drupal.org/user/261457" + }, + { + "name": "nerdstein", + "homepage": "https://www.drupal.org/user/1557710" + }, + { + "name": "rlhawk", + "homepage": "https://www.drupal.org/user/352283" + } + ], + "description": "Provides the ability to manage site-wide keys", + "homepage": "http://drupal.org/project/key", + "keywords": [ + "Drupal" + ], + "support": { + "source": "https://git.drupalcode.org/project/key", + "issues": "http://drupal.org/project/key" + } + }, { "name": "drupal/legal", "version": "3.0.2", @@ -4540,6 +5949,54 @@ "source": "https://git.drupalcode.org/project/media_entity_browser" } }, + { + "name": "drupal/media_entity_file_replace", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/media_entity_file_replace.git", + "reference": "8.x-1.3" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/media_entity_file_replace-8.x-1.3.zip", + "reference": "8.x-1.3", + "shasum": "cfc0d500aba8b6ade547c9a17173f9a89fde02d0" + }, + "require": { + "drupal/core": "^10 || ^11" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-1.3", + "datestamp": "1724336085", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "bkosborne", + "homepage": "https://www.drupal.org/user/788032" + }, + { + "name": "joevagyok", + "homepage": "https://www.drupal.org/user/2876343" + } + ], + "description": "Allows content editors to easily replace source files associated with any file-based media entity, preserving the original filename.", + "homepage": "https://www.drupal.org/project/media_entity_file_replace", + "support": { + "source": "https://git.drupalcode.org/project/media_entity_file_replace" + } + }, { "name": "drupal/media_entity_soundcloud", "version": "3.2.0", @@ -4606,6 +6063,59 @@ "issues": "https://drupal.org/project/issues/media_entity_soundcloud" } }, + { + "name": "drupal/menu_block_current_language", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/menu_block_current_language.git", + "reference": "2.0.0" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/menu_block_current_language-2.0.0.zip", + "reference": "2.0.0", + "shasum": "d4bfa75c4894f484eebedc4d7c2a29e787075a4e" + }, + "require": { + "drupal/core": "^9.3 || ^10", + "php": ">=8.0" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "2.0.0", + "datestamp": "1685438166", + "security-coverage": { + "status": "not-covered", + "message": "Project has not opted into security advisory coverage!" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "hkirsman", + "homepage": "https://www.drupal.org/user/1860980" + }, + { + "name": "lauriii", + "homepage": "https://www.drupal.org/user/1078742" + }, + { + "name": "tuutti", + "homepage": "https://www.drupal.org/user/1114264" + } + ], + "description": "Filters out all the menu links that does not have translation for the current language.", + "homepage": "http://drupal.org/project/menu_block_current_language", + "support": { + "source": "https://git.drupalcode.org/project/menu_block_current_language" + } + }, { "name": "drupal/menu_link_attributes", "version": "1.5.0", @@ -4720,7 +6230,7 @@ "role": "Developer" }, { - "name": "Dave Reid", + "name": "dave reid", "homepage": "https://www.drupal.org/user/53892" } ], @@ -4989,22 +6499,73 @@ } }, { - "name": "drupal/paragraphs", - "version": "1.18.0", + "name": "drupal/oembed_providers", + "version": "2.2.0", "source": { "type": "git", - "url": "https://git.drupalcode.org/project/paragraphs.git", - "reference": "8.x-1.18" + "url": "https://git.drupalcode.org/project/oembed_providers.git", + "reference": "2.2.0" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/paragraphs-8.x-1.18.zip", - "reference": "8.x-1.18", - "shasum": "594e2937ea5c95fc88b60420590c4d83f5cd71ee" + "url": "https://ftp.drupal.org/files/projects/oembed_providers-2.2.0.zip", + "reference": "2.2.0", + "shasum": "318bafadd5e9b74a593f08e252dc5ea6dec98cd2" }, "require": { - "drupal/core": "^10.2 || ^11", - "drupal/entity_reference_revisions": "~1.3" + "drupal/core": "^10|^11" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "2.2.0", + "datestamp": "1723853165", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Chris Burge", + "homepage": "https://www.drupal.org/u/chris-burge", + "role": "Maintainer" + } + ], + "description": "Allows site builders and developers to manage oEmbed providers.", + "homepage": "https://drupal.org/project/oembed_providers", + "keywords": [ + "Drupal", + "Media", + "oEmbed" + ], + "support": { + "source": "https://git.drupalcode.org/project/oembed_providers", + "issues": "https://www.drupal.org/project/issues/oembed_providers" + } + }, + { + "name": "drupal/paragraphs", + "version": "1.18.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/paragraphs.git", + "reference": "8.x-1.18" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/paragraphs-8.x-1.18.zip", + "reference": "8.x-1.18", + "shasum": "594e2937ea5c95fc88b60420590c4d83f5cd71ee" + }, + "require": { + "drupal/core": "^10.2 || ^11", + "drupal/entity_reference_revisions": "~1.3" }, "require-dev": { "drupal/block_field": "1.x-dev", @@ -5284,6 +6845,70 @@ "documentation": "https://www.drupal.org/docs/8/modules/pathauto" } }, + { + "name": "drupal/publication_date", + "version": "2.0.0-beta8", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/publication_date.git", + "reference": "8.x-2.0-beta8" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/publication_date-8.x-2.0-beta8.zip", + "reference": "8.x-2.0-beta8", + "shasum": "1e40fc97a4582c364a8971e16448775c30441fe7" + }, + "require": { + "drupal/core": "^9.1 || ^10" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-2.0-beta8", + "datestamp": "1715850299", + "security-coverage": { + "status": "not-covered", + "message": "Beta releases are not covered by Drupal security advisories." + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "Clever Age", + "homepage": "https://www.drupal.org/user/547746" + }, + { + "name": "dgtlmoon", + "homepage": "https://www.drupal.org/user/25027" + }, + { + "name": "jstoller", + "homepage": "https://www.drupal.org/user/99012" + }, + { + "name": "Sheldon Rampton", + "homepage": "https://www.drupal.org/user/13085" + }, + { + "name": "tmarly", + "homepage": "https://www.drupal.org/user/159040" + }, + { + "name": "webflo", + "homepage": "https://www.drupal.org/user/254778" + } + ], + "description": "Add a field containing the publication date.", + "homepage": "https://www.drupal.org/project/publication_date", + "support": { + "source": "https://git.drupalcode.org/project/publication_date" + } + }, { "name": "drupal/queue_ui", "version": "3.1.4", @@ -5369,42 +6994,37 @@ }, { "name": "drupal/raven", - "version": "4.0.33", + "version": "5.0.17", "source": { "type": "git", "url": "https://git.drupalcode.org/project/raven.git", - "reference": "4.0.33" + "reference": "5.0.17" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/raven-4.0.33.zip", - "reference": "4.0.33", - "shasum": "74f556f4d2f6615508a08491b517ca98b69c971c" + "url": "https://ftp.drupal.org/files/projects/raven-5.0.17.zip", + "reference": "5.0.17", + "shasum": "3be77024ab4edac4964ed5a4590f4e9eb5031346" }, "require": { - "drupal/core": "^8 || ^9 || ^10", - "sentry/sdk": "^3.3" + "drupal/core": "^10.1 || ^11", + "sentry/sentry": "^4.4" }, "require-dev": { "drupal/csp": "^1.17 || ^2.0", "drupal/monitoring": "^1.13", "drupal/seckit": "^2.0", - "drush/drush": "^10.6 || ^11.0 || ^12.0 || ^13.0" + "drush/drush": "^11.0 || ^12.0 || ^13.0" }, "type": "drupal-module", "extra": { "drupal": { - "version": "4.0.33", - "datestamp": "1723776384", + "version": "5.0.17", + "datestamp": "1723776489", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" } - }, - "drush": { - "services": { - "drush.services.yml": "^9 || ^10 || ^11 || ^12" - } } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -5435,6 +7055,83 @@ } ] }, + { + "name": "drupal/rdf", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/rdf.git", + "reference": "2.1.1" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/rdf-2.1.1.zip", + "reference": "2.1.1", + "shasum": "9c897d1313abdabbe80806d79643faffaa0b2466" + }, + "require": { + "drupal/core": "^9.4 || ^10.0", + "easyrdf/easyrdf": "^0.9 || ^1.0" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "2.1.1", + "datestamp": "1666340902", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Arto", + "homepage": "https://www.drupal.org/user/26089" + }, + { + "name": "bbrala", + "homepage": "https://www.drupal.org/user/3366066" + }, + { + "name": "bhuga", + "homepage": "https://www.drupal.org/user/186547" + }, + { + "name": "febbraro", + "homepage": "https://www.drupal.org/user/43670" + }, + { + "name": "jmiccolis", + "homepage": "https://www.drupal.org/user/31731" + }, + { + "name": "linclark", + "homepage": "https://www.drupal.org/user/396253" + }, + { + "name": "miglius", + "homepage": "https://www.drupal.org/user/18741" + }, + { + "name": "scor", + "homepage": "https://www.drupal.org/user/52142" + }, + { + "name": "smustgrave", + "homepage": "https://www.drupal.org/user/3252890" + } + ], + "description": "Enriches your content with metadata to let other applications (e.g. search engines, aggregators) better understand its relationships and attributes", + "homepage": "https://www.drupal.org/project/rdf", + "support": { + "source": "https://git.drupalcode.org/project/rdf" + } + }, { "name": "drupal/readonly_field_widget", "version": "1.5.0", @@ -5479,6 +7176,60 @@ "source": "https://git.drupalcode.org/project/readonly_field_widget" } }, + { + "name": "drupal/real_aes", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/real_aes.git", + "reference": "8.x-2.6" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/real_aes-8.x-2.6.zip", + "reference": "8.x-2.6", + "shasum": "c18f40c69beadac60836032a127e53d5c0cd0a57" + }, + "require": { + "defuse/php-encryption": "^2.0", + "drupal/core": "^8 || ^9 || ^10 || ^11", + "drupal/encrypt": "^3.0" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-2.6", + "datestamp": "1719066076", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Heine", + "homepage": "https://www.drupal.org/user/17943" + }, + { + "name": "nerdstein", + "homepage": "https://www.drupal.org/user/1557710" + }, + { + "name": "rlhawk", + "homepage": "https://www.drupal.org/user/352283" + } + ], + "description": "Provides an Authenticated AES encryption method for Encrypt through the Defuse PHP Encryption library.", + "homepage": "https://www.drupal.org/project/real_aes", + "support": { + "source": "https://git.drupalcode.org/project/real_aes" + } + }, { "name": "drupal/redirect", "version": "1.10.0", @@ -5663,26 +7414,29 @@ }, { "name": "drupal/role_delegation", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/role_delegation.git", - "reference": "8.x-1.2" + "reference": "8.x-1.3" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/role_delegation-8.x-1.2.zip", - "reference": "8.x-1.2", - "shasum": "08095bada0f492e70d32fcf357a8c01825ca81fc" + "url": "https://ftp.drupal.org/files/projects/role_delegation-8.x-1.3.zip", + "reference": "8.x-1.3", + "shasum": "e03d9c82d509a2630750e50a3452bd70ca1c55a6" }, "require": { - "drupal/core": "^9.2 || ^10" + "drupal/core": "^10.3 || ^11" + }, + "require-dev": { + "drupal/action": "^0.2" }, "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-1.2", - "datestamp": "1644487627", + "version": "8.x-1.3", + "datestamp": "1726236826", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -5700,7 +7454,7 @@ "role": "Maintainer" }, { - "name": "JeroenT", + "name": "jeroent", "homepage": "https://www.drupal.org/user/2228934" } ], @@ -6034,6 +7788,85 @@ "issues": "https://drupal.org/project/issues/simple_sitemap" } }, + { + "name": "drupal/siteimprove", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/siteimprove.git", + "reference": "2.0.2" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/siteimprove-2.0.2.zip", + "reference": "2.0.2", + "shasum": "9e716fcd5ae3e7b23a1c8a9bdc6a0980085c2642" + }, + "require": { + "drupal/core": "^9.2 || ^10" + }, + "require-dev": { + "drupal/domain_access": "*" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "2.0.2", + "datestamp": "1704376526", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "bartvig", + "homepage": "https://www.drupal.org/user/3107079" + }, + { + "name": "beltofte", + "homepage": "https://www.drupal.org/user/151799" + }, + { + "name": "cbccharlie", + "homepage": "https://www.drupal.org/user/616836" + }, + { + "name": "Hjalteschurmann", + "homepage": "https://www.drupal.org/user/3730405" + }, + { + "name": "kreynen", + "homepage": "https://www.drupal.org/user/48877" + }, + { + "name": "rofejo", + "homepage": "https://www.drupal.org/user/3284851" + }, + { + "name": "Siteimprove", + "homepage": "https://www.drupal.org/user/3521441" + }, + { + "name": "tlyngej", + "homepage": "https://www.drupal.org/user/413139" + } + ], + "description": "Integration with Siteimprove.", + "homepage": "https://www.drupal.org/project/siteimprove", + "keywords": [ + "Drupal" + ], + "support": { + "source": "https://git.drupalcode.org/project/siteimprove", + "issues": "https://www.drupal.org/project/issues/siteimprove" + } + }, { "name": "drupal/smtp", "version": "1.4.0", @@ -6166,6 +7999,228 @@ "issues": "https://www.drupal.org/project/issues/social_media" } }, + { + "name": "drupal/sophron", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/sophron.git", + "reference": "2.1.0" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/sophron-2.1.0.zip", + "reference": "2.1.0", + "shasum": "0742562897ae9b202e472a1edef75844b6452e39" + }, + "require": { + "drupal/core": "^10.2 || ^11", + "fileeye/mimemap": "^2.1.1" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "2.1.0", + "datestamp": "1718011690", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "autoload": { + "psr-4": { + "Drupal\\sophron\\": "src/" + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "mondrake", + "homepage": "https://www.drupal.org/user/1307444" + } + ], + "description": "Provides an extensive MIME types management API", + "homepage": "https://www.drupal.org/project/sophron", + "support": { + "source": "https://git.drupalcode.org/project/sophron" + } + }, + { + "name": "drupal/stage_file_proxy", + "version": "2.1.5", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/stage_file_proxy.git", + "reference": "2.1.5" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/stage_file_proxy-2.1.5.zip", + "reference": "2.1.5", + "shasum": "6f5974c106d45211e54945e4d9f5bbf8ec6699de" + }, + "require": { + "drupal/core": "^9 || ^10", + "php": ">=8" + }, + "require-dev": { + "drupal/coder": "^8.3", + "drush/drush": "^11 || ^12" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "2.1.5", + "datestamp": "1719499510", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + }, + "drush": { + "services": { + "stage_file_proxy.drush.services.yml": "^11" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "scripts": { + "phpcs": [ + "vendor/bin/phpcs -p ." + ], + "phpcbf": [ + "vendor/bin/phpcbf -p ." + ], + "test": [ + "@phpcs" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "BarisW", + "homepage": "https://www.drupal.org/user/107229" + }, + { + "name": "geek-merlin", + "homepage": "https://www.drupal.org/user/229048" + }, + { + "name": "greggles", + "homepage": "https://www.drupal.org/user/36762" + }, + { + "name": "markdorison", + "homepage": "https://www.drupal.org/user/346106" + }, + { + "name": "moshe weitzman", + "homepage": "https://www.drupal.org/user/23" + }, + { + "name": "msonnabaum", + "homepage": "https://www.drupal.org/user/75278" + }, + { + "name": "netaustin", + "homepage": "https://www.drupal.org/user/199298" + }, + { + "name": "robwilmshurst", + "homepage": "https://www.drupal.org/user/144488" + }, + { + "name": "smustgrave", + "homepage": "https://www.drupal.org/user/3252890" + } + ], + "description": "Provides stage_file_proxy module.", + "homepage": "https://www.drupal.org/project/stage_file_proxy", + "support": { + "source": "https://git.drupalcode.org/project/stage_file_proxy" + } + }, + { + "name": "drupal/stomp", + "version": "2.0.0-alpha4", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/stomp.git", + "reference": "2.0.0-alpha4" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/stomp-2.0.0-alpha4.zip", + "reference": "2.0.0-alpha4", + "shasum": "624db88867009eab5da9ccc259a396eb79927809" + }, + "require": { + "drupal/core": "^9 || ^10 || ^11", + "php": "^8.1", + "stomp-php/stomp-php": "^5.0" + }, + "conflict": { + "drush/drush": "<11.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "drupal/coder": "^8.3", + "drush/drush": "^11.6 || ^12", + "jangregor/phpstan-prophecy": "dev-master", + "mglaman/phpstan-drupal": "^1.2", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "1.11.x-dev", + "phpstan/phpstan-deprecation-rules": "1.2.x-dev" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "2.0.0-alpha4", + "datestamp": "1711347968", + "security-coverage": { + "status": "not-covered", + "message": "Alpha releases are not covered by Drupal security advisories." + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "alexpott", + "homepage": "https://www.drupal.org/user/157725" + }, + { + "name": "legovaer", + "homepage": "https://www.drupal.org/user/1327142" + }, + { + "name": "tayzlor", + "homepage": "https://www.drupal.org/user/274980" + }, + { + "name": "tsphethean", + "homepage": "https://www.drupal.org/user/881620" + }, + { + "name": "tuutti", + "homepage": "https://www.drupal.org/user/1114264" + } + ], + "description": "Integrate Drupal with an external STOMP or AMQP message queue, such as ActiveMQ.", + "homepage": "https://www.drupal.org/project/stomp", + "support": { + "source": "https://git.drupalcode.org/project/stomp" + } + }, { "name": "drupal/subrequests", "version": "3.0.12", @@ -6219,6 +8274,94 @@ "source": "https://git.drupalcode.org/project/subrequests" } }, + { + "name": "drupal/tfa", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/tfa.git", + "reference": "8.x-1.7" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/tfa-8.x-1.7.zip", + "reference": "8.x-1.7", + "shasum": "a5e70d146da5bc44f97bfe6fbbda61cc8310fa87" + }, + "require": { + "chillerlan/php-qrcode": "^1.0.9 || ^2.0 || ^3.2 || ^4.0", + "christian-riesen/otp": "^2.1", + "drupal/core": "^8 || ^9 || ^10", + "drupal/encrypt": "~3.0", + "php": ">=7.0" + }, + "require-dev": { + "drupal/encrypt": "*", + "drupal/key": "*", + "drupal/services": "^4 || ^5", + "drush/drush": "^10 || ^11 || ^12", + "mglaman/phpstan-drupal": "^1.1", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.1", + "phpstan/phpstan-phpunit": "^1.3" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-1.7", + "datestamp": "1713484490", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + }, + "drush": { + "services": { + "drush.services.yml": "^9 || ^10 || ^11" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "cmlara", + "homepage": "https://www.drupal.org/user/1790054" + }, + { + "name": "coltrane", + "homepage": "https://www.drupal.org/user/91990" + }, + { + "name": "daggerhart", + "homepage": "https://www.drupal.org/user/167806" + }, + { + "name": "greggles", + "homepage": "https://www.drupal.org/user/36762" + }, + { + "name": "jcnventura", + "homepage": "https://www.drupal.org/user/122464" + }, + { + "name": "nerdstein", + "homepage": "https://www.drupal.org/user/1557710" + }, + { + "name": "poker10", + "homepage": "https://www.drupal.org/user/272316" + } + ], + "description": "Pluggable provider of two factor authentication for Drupal", + "homepage": "https://www.drupal.org/project/tfa", + "support": { + "source": "https://git.drupalcode.org/project/tfa" + } + }, { "name": "drupal/token", "version": "1.15.0", @@ -6361,6 +8504,54 @@ "source": "https://git.drupalcode.org/project/token_filter" } }, + { + "name": "drupal/translatable_menu_link_uri", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/translatable_menu_link_uri.git", + "reference": "2.1.0" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/translatable_menu_link_uri-2.1.0.zip", + "reference": "2.1.0", + "shasum": "3bafa0a19761524560a2d232c945f10643e91053" + }, + "require": { + "drupal/core": "^8 || ^9 || ^10" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "2.1.0", + "datestamp": "1694361965", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "jsobiecki", + "homepage": "https://www.drupal.org/user/112744" + }, + { + "name": "wiktorb", + "homepage": "https://www.drupal.org/user/762836" + } + ], + "description": "This module enables support for translation of link field in menu_link_content entity.", + "homepage": "https://www.drupal.org/project/translatable_menu_link_uri", + "support": { + "source": "https://git.drupalcode.org/project/translatable_menu_link_uri" + } + }, { "name": "drupal/twig_tweak", "version": "3.4.0", @@ -6487,12 +8678,270 @@ } }, { - "name": "drupal/webform", - "version": "6.2.7", + "name": "drupal/view_unpublished", + "version": "1.3.0", "source": { "type": "git", - "url": "https://git.drupalcode.org/project/webform.git", - "reference": "6.2.7" + "url": "https://git.drupalcode.org/project/view_unpublished.git", + "reference": "8.x-1.3" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/view_unpublished-8.x-1.3.zip", + "reference": "8.x-1.3", + "shasum": "7dd4411c53866585ac6319d147ab11d214d55877" + }, + "require": { + "drupal/core": "^9.4 || ^10 || ^11" + }, + "require-dev": { + "drupal/coder": "^8.3.18", + "phpcompatibility/php-compatibility": "10.x-dev@dev" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-1.3", + "datestamp": "1724503131", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Agnes Chisholm", + "homepage": "https://www.drupal.org/user/173461", + "email": "amaria@chisholmtech.com" + }, + { + "name": "fathima.asmat", + "homepage": "https://www.drupal.org/user/3622664" + }, + { + "name": "tobiasb", + "homepage": "https://www.drupal.org/user/183956" + } + ], + "description": "Select which roles should be able to see unpublished nodes.", + "homepage": "https://www.drupal.org/project/view_unpublished", + "support": { + "source": "https://git.drupalcode.org/project/view_unpublished" + } + }, + { + "name": "drupal/views_bulk_edit", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/views_bulk_edit.git", + "reference": "8.x-2.9" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/views_bulk_edit-8.x-2.9.zip", + "reference": "8.x-2.9", + "shasum": "db45a8cc9ac629859374b24974eafcef257e4387" + }, + "require": { + "drupal/core": "^9.4 || ^10" + }, + "require-dev": { + "drupal/views_bulk_operations": "~4.2.4" + }, + "suggest": { + "drupal/views_bulk_operations": "Get VBO for all the views benefits like batching, ability to select all view results or persistent selection across pages" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-2.9", + "datestamp": "1690222256", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "Marcin Grabias", + "homepage": "https://www.drupal.org/u/graber" + }, + { + "name": "benjy", + "homepage": "https://www.drupal.org/user/1852732" + }, + { + "name": "graber", + "homepage": "https://www.drupal.org/user/1599440" + }, + { + "name": "grevil", + "homepage": "https://www.drupal.org/user/3668491" + }, + { + "name": "joseph.olstad", + "homepage": "https://www.drupal.org/user/1321830" + } + ], + "description": "Allows bulk edition of entity field values.", + "homepage": "https://www.drupal.org/project/views_bulk_edit", + "support": { + "source": "https://git.drupalcode.org/project/views_bulk_edit", + "issues": "https://www.drupal.org/project/issues/views_bulk_edit?version=8.x" + } + }, + { + "name": "drupal/views_bulk_operations", + "version": "4.2.7", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/views_bulk_operations.git", + "reference": "4.2.7" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/views_bulk_operations-4.2.7.zip", + "reference": "4.2.7", + "shasum": "25c9fa531ac49664a361fdd2202eec0a6e53bc61" + }, + "require": { + "drupal/core": "^9.4 || ^10 || ^11", + "php": ">=7.4.0" + }, + "require-dev": { + "drush/drush": "^12" + }, + "suggest": { + "drush/drush": "^11 || ^12" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "4.2.7", + "datestamp": "1717665214", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + }, + "drush": { + "services": { + "drush.services.yml": "^10 || ^11" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Marcin Grabias", + "homepage": "https://www.drupal.org/u/graber" + }, + { + "name": "Graber", + "homepage": "https://www.drupal.org/user/1599440" + }, + { + "name": "joelpittet", + "homepage": "https://www.drupal.org/user/160302" + } + ], + "description": "Adds an ability to perform bulk operations on selected entities from view results. Provides an API to create such operations.", + "homepage": "https://www.drupal.org/project/views_bulk_operations", + "support": { + "source": "https://git.drupalcode.org/project/views_bulk_operations/-/tree/8.x-3.x", + "issues": "https://www.drupal.org/project/issues/views_bulk_operations?version=8.x", + "docs": "https://www.drupal.org/docs/8/modules/views-bulk-operations-vbo" + } + }, + { + "name": "drupal/views_infinite_scroll", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/views_infinite_scroll.git", + "reference": "2.0.3" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/views_infinite_scroll-2.0.3.zip", + "reference": "2.0.3", + "shasum": "3c56969f71256300226118a0f35bad66ab41306c" + }, + "require": { + "drupal/core": "^10.1 || ^11" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "2.0.3", + "datestamp": "1724335951", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "anybody", + "homepage": "https://www.drupal.org/user/291091" + }, + { + "name": "grevil", + "homepage": "https://www.drupal.org/user/3668491" + }, + { + "name": "Honza Pobořil", + "homepage": "https://www.drupal.org/user/123612" + }, + { + "name": "neslee canil pinto", + "homepage": "https://www.drupal.org/user/3580850" + }, + { + "name": "Remon", + "homepage": "https://www.drupal.org/user/143827" + }, + { + "name": "sam152", + "homepage": "https://www.drupal.org/user/1485048" + }, + { + "name": "thomas.frobieter", + "homepage": "https://www.drupal.org/user/409335" + } + ], + "description": "A pager which allows an infinite scroll effect for views.", + "homepage": "https://www.drupal.org/project/views_infinite_scroll", + "support": { + "source": "https://git.drupalcode.org/project/views_infinite_scroll" + } + }, + { + "name": "drupal/webform", + "version": "6.2.7", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/webform.git", + "reference": "6.2.7" }, "dist": { "type": "zip", @@ -6932,6 +9381,81 @@ }, "time": "2021-05-19T09:42:57+00:00" }, + { + "name": "easyrdf/easyrdf", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/easyrdf/easyrdf.git", + "reference": "c7b0a9dbcb211eb7de03ee99ff5b52d17f2a8e64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/easyrdf/easyrdf/zipball/c7b0a9dbcb211eb7de03ee99ff5b52d17f2a8e64", + "reference": "c7b0a9dbcb211eb7de03ee99ff5b52d17f2a8e64", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "ext-pcre": "*", + "ext-xmlreader": "*", + "lib-libxml": "*", + "php": ">=7.1.0" + }, + "require-dev": { + "code-lts/doctum": "^5", + "ml/json-ld": "~1.0", + "phpunit/phpunit": "^7", + "semsol/arc2": "^2.4", + "squizlabs/php_codesniffer": "3.*", + "zendframework/zend-http": "~2.3" + }, + "suggest": { + "ml/json-ld": "~1.0", + "semsol/arc2": "~2.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "EasyRdf\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nicholas Humfrey", + "email": "njh@aelius.com", + "homepage": "http://www.aelius.com/njh/", + "role": "Developer" + }, + { + "name": "Alexey Zakhlestin", + "email": "indeyets@gmail.com", + "homepage": "http://indeyets.ru/", + "role": "Developer" + } + ], + "description": "EasyRdf is a PHP library designed to make it easy to consume and produce RDF.", + "homepage": "http://www.easyrdf.org/", + "keywords": [ + "Linked Data", + "RDF", + "Semantic Web", + "Turtle", + "rdfa", + "sparql" + ], + "support": { + "forum": "http://groups.google.com/group/easyrdf/", + "issues": "http://github.com/easyrdf/easyrdf/issues", + "source": "https://github.com/easyrdf/easyrdf/tree/1.1.1" + }, + "time": "2020-12-02T08:47:31+00:00" + }, { "name": "egulias/email-validator", "version": "4.0.2", @@ -7238,33 +9762,154 @@ "time": "2023-11-17T15:01:25+00:00" }, { - "name": "firebase/php-jwt", - "version": "v6.10.1", + "name": "fileeye/mimemap", + "version": "2.1.2", "source": { "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "500501c2ce893c824c801da135d02661199f60c5" + "url": "https://github.com/FileEye/MimeMap.git", + "reference": "2cb60da59d5c6fb881a78b481d513c4c68a1a93c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5", - "reference": "500501c2ce893c824c801da135d02661199f60c5", + "url": "https://api.github.com/repos/FileEye/MimeMap/zipball/2cb60da59d5c6fb881a78b481d513c4c68a1a93c", + "reference": "2cb60da59d5c6fb881a78b481d513c4c68a1a93c", "shasum": "" }, "require": { - "php": "^8.0" + "php": ">=7.4" }, "require-dev": { - "guzzlehttp/guzzle": "^7.4", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", - "psr/cache": "^2.0||^3.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0" - }, - "suggest": { - "ext-sodium": "Support EdDSA (Ed25519) signatures", - "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + "composer-runtime-api": "^2.0.0", + "sebastian/comparator": ">=4", + "sebastian/diff": ">=4", + "symfony/console": ">=5.4", + "symfony/filesystem": ">=5.4", + "symfony/var-dumper": ">=5.4", + "symfony/yaml": ">=5.4" + }, + "bin": [ + "bin/fileeye-mimemap" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "FileEye\\MimeMap\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "description": "A PHP library to handle MIME Content-Type fields and their related file extensions.", + "homepage": "https://github.com/FileEye/MimeMap", + "keywords": [ + "mime", + "mime-database", + "mime-parser", + "mime-type" + ], + "support": { + "issues": "https://github.com/FileEye/MimeMap/issues", + "source": "https://github.com/FileEye/MimeMap/tree/2.1.2" + }, + "time": "2024-06-29T16:52:07+00:00" + }, + { + "name": "fileeye/pel", + "version": "0.10.0", + "source": { + "type": "git", + "url": "https://github.com/FileEye/pel.git", + "reference": "5da1e6ab73508056f0abb79f560d20a315d1aefe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FileEye/pel/zipball/5da1e6ab73508056f0abb79f560d20a315d1aefe", + "reference": "5da1e6ab73508056f0abb79f560d20a315d1aefe", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "require-dev": { + "ext-exif": "*", + "ext-gd": "*", + "php-coveralls/php-coveralls": ">=2.7", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3.11", + "phpunit/phpunit": "^8 || ^9", + "squizlabs/php_codesniffer": ">=3.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "lsolesen\\pel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0" + ], + "authors": [ + { + "name": "Lars Olesen", + "email": "lars@intraface.dk", + "homepage": "http://intraface.dk", + "role": "Developer" + }, + { + "name": "Martin Geisler", + "email": "martin@geisler.net", + "homepage": "http://geisler.net", + "role": "Developer" + } + ], + "description": "PHP Exif Library. A library for reading and writing Exif headers in JPEG and TIFF images using PHP.", + "homepage": "https://github.com/FileEye/pel", + "keywords": [ + "exif", + "image" + ], + "support": { + "issues": "https://github.com/FileEye/pel/issues", + "source": "https://github.com/FileEye/pel/tree/0.10.0" + }, + "time": "2024-01-11T19:11:58+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v6.10.1", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "500501c2ce893c824c801da135d02661199f60c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5", + "reference": "500501c2ce893c824c801da135d02661199f60c5", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^2.0||^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" }, "type": "library", "autoload": { @@ -7811,64 +10456,6 @@ ], "time": "2024-07-18T11:15:46+00:00" }, - { - "name": "http-interop/http-factory-guzzle", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/http-interop/http-factory-guzzle.git", - "reference": "8f06e92b95405216b237521cc64c804dd44c4a81" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/8f06e92b95405216b237521cc64c804dd44c4a81", - "reference": "8f06e92b95405216b237521cc64c804dd44c4a81", - "shasum": "" - }, - "require": { - "guzzlehttp/psr7": "^1.7||^2.0", - "php": ">=7.3", - "psr/http-factory": "^1.0" - }, - "provide": { - "psr/http-factory-implementation": "^1.0" - }, - "require-dev": { - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^9.5" - }, - "suggest": { - "guzzlehttp/psr7": "Includes an HTTP factory starting in version 2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Factory\\Guzzle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "An HTTP Factory using Guzzle PSR7", - "keywords": [ - "factory", - "http", - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/http-interop/http-factory-guzzle/issues", - "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.0" - }, - "time": "2021-07-21T13:50:14+00:00" - }, { "name": "jean85/pretty-package-versions", "version": "2.0.6", @@ -8645,44 +11232,54 @@ }, { "name": "league/uri", - "version": "7.4.1", + "version": "6.8.0", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", - "reference": "bedb6e55eff0c933668addaa7efa1e1f2c417cc4" + "reference": "a700b4656e4c54371b799ac61e300ab25a2d1d39" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/bedb6e55eff0c933668addaa7efa1e1f2c417cc4", - "reference": "bedb6e55eff0c933668addaa7efa1e1f2c417cc4", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/a700b4656e4c54371b799ac61e300ab25a2d1d39", + "reference": "a700b4656e4c54371b799ac61e300ab25a2d1d39", "shasum": "" }, "require": { - "league/uri-interfaces": "^7.3", - "php": "^8.1" + "ext-json": "*", + "league/uri-interfaces": "^2.3", + "php": "^8.1", + "psr/http-message": "^1.0.1" }, "conflict": { "league/uri-schemes": "^1.0" }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^v3.9.5", + "nyholm/psr7": "^1.5.1", + "php-http/psr7-integration-tests": "^1.1.1", + "phpbench/phpbench": "^1.2.6", + "phpstan/phpstan": "^1.8.5", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.1.1", + "phpstan/phpstan-strict-rules": "^1.4.3", + "phpunit/phpunit": "^9.5.24", + "psr/http-factory": "^1.0.1" + }, "suggest": { - "ext-bcmath": "to improve IPV4 host parsing", - "ext-fileinfo": "to create Data URI from file contennts", - "ext-gmp": "to improve IPV4 host parsing", - "ext-intl": "to handle IDN host with the best performance", - "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", - "league/uri-components": "Needed to easily manipulate URI objects components", - "php-64bit": "to improve IPV4 host parsing", - "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + "ext-fileinfo": "Needed to create Data URI from a filepath", + "ext-intl": "Needed to improve host validation", + "league/uri-components": "Needed to easily manipulate URI objects", + "psr/http-factory": "Needed to use the URI factory" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "7.x-dev" + "dev-master": "6.x-dev" } }, "autoload": { "psr-4": { - "League\\Uri\\": "" + "League\\Uri\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -8722,8 +11319,8 @@ "support": { "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", - "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/7.4.1" + "issues": "https://github.com/thephpleague/uri/issues", + "source": "https://github.com/thephpleague/uri/tree/6.8.0" }, "funding": [ { @@ -8731,44 +11328,46 @@ "type": "github" } ], - "time": "2024-03-23T07:42:40+00:00" + "time": "2022-09-13T19:58:47+00:00" }, { "name": "league/uri-interfaces", - "version": "7.4.1", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "8d43ef5c841032c87e2de015972c06f3865ef718" + "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/8d43ef5c841032c87e2de015972c06f3865ef718", - "reference": "8d43ef5c841032c87e2de015972c06f3865ef718", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/00e7e2943f76d8cb50c7dfdc2f6dee356e15e383", + "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383", "shasum": "" }, "require": { - "ext-filter": "*", - "php": "^8.1", - "psr/http-factory": "^1", - "psr/http-message": "^1.1 || ^2.0" + "ext-json": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.19", + "phpstan/phpstan": "^0.12.90", + "phpstan/phpstan-phpunit": "^0.12.19", + "phpstan/phpstan-strict-rules": "^0.12.9", + "phpunit/phpunit": "^8.5.15 || ^9.5" }, "suggest": { - "ext-bcmath": "to improve IPV4 host parsing", - "ext-gmp": "to improve IPV4 host parsing", - "ext-intl": "to handle IDN host with the best performance", - "php-64bit": "to improve IPV4 host parsing", - "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + "ext-intl": "to use the IDNA feature", + "symfony/intl": "to use the IDNA feature via Symfony Polyfill" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "7.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { "psr-4": { - "League\\Uri\\": "" + "League\\Uri\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -8782,32 +11381,17 @@ "homepage": "https://nyamsprod.com" } ], - "description": "Common interfaces and classes for URI representation and interaction", - "homepage": "https://uri.thephpleague.com", + "description": "Common interface for URI representation", + "homepage": "http://github.com/thephpleague/uri-interfaces", "keywords": [ - "data-uri", - "file-uri", - "ftp", - "hostname", - "http", - "https", - "parse_str", - "parse_url", - "psr-7", - "query-string", - "querystring", "rfc3986", "rfc3987", - "rfc6570", "uri", - "url", - "ws" + "url" ], "support": { - "docs": "https://uri.thephpleague.com", - "forum": "https://thephpleague.slack.com", - "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/7.4.1" + "issues": "https://github.com/thephpleague/uri-interfaces/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/2.3.0" }, "funding": [ { @@ -8815,7 +11399,7 @@ "type": "github" } ], - "time": "2024-03-23T07:42:40+00:00" + "time": "2021-06-28T04:27:21+00:00" }, { "name": "makinacorpus/php-lucene", @@ -9468,6 +12052,73 @@ }, "time": "2021-12-15T12:32:42+00:00" }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.7.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "52a0d99e69f56b9ec27ace92ba56897fe6993105" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/52a0d99e69f56b9ec27ace92ba56897fe6993105", + "reference": "52a0d99e69f56b9ec27ace92ba56897fe6993105", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "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" + }, { "name": "paragonie/random_compat", "version": "v9.99.100", @@ -9670,488 +12321,105 @@ "notification-url": "https://packagist.org/downloads/", "include-path": [ "src/" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@php.net", - "role": "Lead" - } - ], - "description": "Minimal set of PEAR core files to be used as composer dependency", - "support": { - "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR", - "source": "https://github.com/pear/pear-core-minimal" - }, - "time": "2024-03-16T18:41:45+00:00" - }, - { - "name": "pear/pear_exception", - "version": "v1.0.2", - "source": { - "type": "git", - "url": "https://github.com/pear/PEAR_Exception.git", - "reference": "b14fbe2ddb0b9f94f5b24cf08783d599f776fff0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pear/PEAR_Exception/zipball/b14fbe2ddb0b9f94f5b24cf08783d599f776fff0", - "reference": "b14fbe2ddb0b9f94f5b24cf08783d599f776fff0", - "shasum": "" - }, - "require": { - "php": ">=5.2.0" - }, - "require-dev": { - "phpunit/phpunit": "<9" - }, - "type": "class", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "PEAR/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "." - ], - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Helgi Thormar", - "email": "dufuz@php.net" - }, - { - "name": "Greg Beaver", - "email": "cellog@php.net" - } - ], - "description": "The PEAR Exception base class.", - "homepage": "https://github.com/pear/PEAR_Exception", - "keywords": [ - "exception" - ], - "support": { - "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR_Exception", - "source": "https://github.com/pear/PEAR_Exception" - }, - "time": "2021-03-21T15:43:46+00:00" - }, - { - "name": "phootwork/collection", - "version": "v3.2.2", - "source": { - "type": "git", - "url": "https://github.com/phootwork/collection.git", - "reference": "46dde20420fba17766c89200bc3ff91d3e58eafa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phootwork/collection/zipball/46dde20420fba17766c89200bc3ff91d3e58eafa", - "reference": "46dde20420fba17766c89200bc3ff91d3e58eafa", - "shasum": "" - }, - "require": { - "phootwork/lang": "^3.0", - "php": ">=8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "phootwork\\collection\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Thomas Gossmann", - "homepage": "http://gos.si" - } - ], - "description": "The phootwork library fills gaps in the php language and provides better solutions than the existing ones php offers.", - "homepage": "https://phootwork.github.io/collection/", - "keywords": [ - "Array object", - "Text object", - "collection", - "collections", - "json", - "list", - "map", - "queue", - "set", - "stack", - "xml" - ], - "support": { - "issues": "https://github.com/phootwork/phootwork/issues", - "source": "https://github.com/phootwork/collection/tree/v3.2.2" - }, - "time": "2022-08-27T12:51:24+00:00" - }, - { - "name": "phootwork/lang", - "version": "v3.2.2", - "source": { - "type": "git", - "url": "https://github.com/phootwork/lang.git", - "reference": "baaf154ae7d521ebeee5e89105f5b12b0f234597" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phootwork/lang/zipball/baaf154ae7d521ebeee5e89105f5b12b0f234597", - "reference": "baaf154ae7d521ebeee5e89105f5b12b0f234597", - "shasum": "" - }, - "require": { - "php": ">=8.0", - "symfony/polyfill-mbstring": "^1.12", - "symfony/polyfill-php81": "^1.22" - }, - "type": "library", - "autoload": { - "psr-4": { - "phootwork\\lang\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Thomas Gossmann", - "homepage": "http://gos.si" - } - ], - "description": "Missing PHP language constructs", - "homepage": "https://phootwork.github.io/lang/", - "keywords": [ - "array", - "comparator", - "comparison", - "string" - ], - "support": { - "issues": "https://github.com/phootwork/phootwork/issues", - "source": "https://github.com/phootwork/lang/tree/v3.2.2" - }, - "time": "2023-05-26T05:37:59+00:00" - }, - { - "name": "php-http/client-common", - "version": "2.7.1", - "source": { - "type": "git", - "url": "https://github.com/php-http/client-common.git", - "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/1e19c059b0e4d5f717bf5d524d616165aeab0612", - "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0", - "php-http/httplug": "^2.0", - "php-http/message": "^1.6", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0 || ^2.0", - "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0", - "symfony/polyfill-php80": "^1.17" - }, - "require-dev": { - "doctrine/instantiator": "^1.1", - "guzzlehttp/psr7": "^1.4", - "nyholm/psr7": "^1.2", - "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", - "phpspec/prophecy": "^1.10.2", - "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" - }, - "suggest": { - "ext-json": "To detect JSON responses with the ContentTypePlugin", - "ext-libxml": "To detect XML responses with the ContentTypePlugin", - "php-http/cache-plugin": "PSR-6 Cache plugin", - "php-http/logger-plugin": "PSR-3 Logger plugin", - "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Client\\Common\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Common HTTP Client implementations and tools for HTTPlug", - "homepage": "http://httplug.io", - "keywords": [ - "client", - "common", - "http", - "httplug" - ], - "support": { - "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.7.1" - }, - "time": "2023-11-30T10:31:25+00:00" - }, - { - "name": "php-http/discovery", - "version": "1.19.4", - "source": { - "type": "git", - "url": "https://github.com/php-http/discovery.git", - "reference": "0700efda8d7526335132360167315fdab3aeb599" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/0700efda8d7526335132360167315fdab3aeb599", - "reference": "0700efda8d7526335132360167315fdab3aeb599", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0|^2.0", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "nyholm/psr7": "<1.0", - "zendframework/zend-diactoros": "*" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "*", - "psr/http-factory-implementation": "*", - "psr/http-message-implementation": "*" - }, - "require-dev": { - "composer/composer": "^1.0.2|^2.0", - "graham-campbell/phpspec-skip-example-extension": "^5.0", - "php-http/httplug": "^1.0 || ^2.0", - "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", - "sebastian/comparator": "^3.0.5 || ^4.0.8", - "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" - }, - "type": "composer-plugin", - "extra": { - "class": "Http\\Discovery\\Composer\\Plugin", - "plugin-optional": true - }, - "autoload": { - "psr-4": { - "Http\\Discovery\\": "src/" - }, - "exclude-from-classmap": [ - "src/Composer/Plugin.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", - "homepage": "http://php-http.org", - "keywords": [ - "adapter", - "client", - "discovery", - "factory", - "http", - "message", - "psr17", - "psr7" - ], - "support": { - "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.19.4" - }, - "time": "2024-03-29T13:00:05+00:00" - }, - { - "name": "php-http/httplug", - "version": "2.4.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/httplug.git", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0", - "php-http/promise": "^1.1", - "psr/http-client": "^1.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", - "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", + ], "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Eric GELOEN", - "email": "geloen.eric@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" + "name": "Christian Weiske", + "email": "cweiske@php.net", + "role": "Lead" } ], - "description": "HTTPlug, the HTTP client abstraction for PHP", - "homepage": "http://httplug.io", - "keywords": [ - "client", - "http" - ], + "description": "Minimal set of PEAR core files to be used as composer dependency", "support": { - "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/2.4.0" + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR", + "source": "https://github.com/pear/pear-core-minimal" }, - "time": "2023-04-14T15:10:03+00:00" + "time": "2024-03-16T18:41:45+00:00" }, { - "name": "php-http/message", - "version": "1.16.1", + "name": "pear/pear_exception", + "version": "v1.0.2", "source": { "type": "git", - "url": "https://github.com/php-http/message.git", - "reference": "5997f3289332c699fa2545c427826272498a2088" + "url": "https://github.com/pear/PEAR_Exception.git", + "reference": "b14fbe2ddb0b9f94f5b24cf08783d599f776fff0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/5997f3289332c699fa2545c427826272498a2088", - "reference": "5997f3289332c699fa2545c427826272498a2088", + "url": "https://api.github.com/repos/pear/PEAR_Exception/zipball/b14fbe2ddb0b9f94f5b24cf08783d599f776fff0", + "reference": "b14fbe2ddb0b9f94f5b24cf08783d599f776fff0", "shasum": "" }, "require": { - "clue/stream-filter": "^1.5", - "php": "^7.2 || ^8.0", - "psr/http-message": "^1.1 || ^2.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0" + "php": ">=5.2.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.6", - "ext-zlib": "*", - "guzzlehttp/psr7": "^1.0 || ^2.0", - "laminas/laminas-diactoros": "^2.0 || ^3.0", - "php-http/message-factory": "^1.0.2", - "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", - "slim/slim": "^3.0" + "phpunit/phpunit": "<9" }, - "suggest": { - "ext-zlib": "Used with compressor/decompressor streams", - "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", - "laminas/laminas-diactoros": "Used with Diactoros Factories", - "slim/slim": "Used with Slim Framework PSR-7 implementation" + "type": "class", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } }, - "type": "library", "autoload": { - "files": [ - "src/filters.php" - ], - "psr-4": { - "Http\\Message\\": "src/" - } + "classmap": [ + "PEAR/" + ] }, "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "." + ], "license": [ - "MIT" + "BSD-2-Clause" ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "Helgi Thormar", + "email": "dufuz@php.net" + }, + { + "name": "Greg Beaver", + "email": "cellog@php.net" } ], - "description": "HTTP Message related tools", - "homepage": "http://php-http.org", + "description": "The PEAR Exception base class.", + "homepage": "https://github.com/pear/PEAR_Exception", "keywords": [ - "http", - "message", - "psr-7" + "exception" ], "support": { - "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.16.1" + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR_Exception", + "source": "https://github.com/pear/PEAR_Exception" }, - "time": "2024-03-07T13:22:09+00:00" + "time": "2021-03-21T15:43:46+00:00" }, { - "name": "php-http/message-factory", - "version": "1.1.0", + "name": "phootwork/collection", + "version": "v3.2.2", "source": { "type": "git", - "url": "https://github.com/php-http/message-factory.git", - "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57" + "url": "https://github.com/phootwork/collection.git", + "reference": "46dde20420fba17766c89200bc3ff91d3e58eafa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57", - "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "url": "https://api.github.com/repos/phootwork/collection/zipball/46dde20420fba17766c89200bc3ff91d3e58eafa", + "reference": "46dde20420fba17766c89200bc3ff91d3e58eafa", "shasum": "" }, "require": { - "php": ">=5.4", - "psr/http-message": "^1.0 || ^2.0" + "phootwork/lang": "^3.0", + "php": ">=8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, "autoload": { "psr-4": { - "Http\\Message\\": "src/" + "phootwork\\collection\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -10160,51 +12428,54 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "Thomas Gossmann", + "homepage": "http://gos.si" } ], - "description": "Factory interfaces for PSR-7 HTTP Message", - "homepage": "http://php-http.org", + "description": "The phootwork library fills gaps in the php language and provides better solutions than the existing ones php offers.", + "homepage": "https://phootwork.github.io/collection/", "keywords": [ - "factory", - "http", - "message", - "stream", - "uri" + "Array object", + "Text object", + "collection", + "collections", + "json", + "list", + "map", + "queue", + "set", + "stack", + "xml" ], "support": { - "issues": "https://github.com/php-http/message-factory/issues", - "source": "https://github.com/php-http/message-factory/tree/1.1.0" + "issues": "https://github.com/phootwork/phootwork/issues", + "source": "https://github.com/phootwork/collection/tree/v3.2.2" }, - "abandoned": "psr/http-factory", - "time": "2023-04-14T14:16:17+00:00" + "time": "2022-08-27T12:51:24+00:00" }, { - "name": "php-http/promise", - "version": "1.3.1", + "name": "phootwork/lang", + "version": "v3.2.2", "source": { "type": "git", - "url": "https://github.com/php-http/promise.git", - "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" + "url": "https://github.com/phootwork/lang.git", + "reference": "baaf154ae7d521ebeee5e89105f5b12b0f234597" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", - "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "url": "https://api.github.com/repos/phootwork/lang/zipball/baaf154ae7d521ebeee5e89105f5b12b0f234597", + "reference": "baaf154ae7d521ebeee5e89105f5b12b0f234597", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", - "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" + "php": ">=8.0", + "symfony/polyfill-mbstring": "^1.12", + "symfony/polyfill-php81": "^1.22" }, "type": "library", "autoload": { "psr-4": { - "Http\\Promise\\": "src/" + "phootwork\\lang\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -10213,24 +12484,23 @@ ], "authors": [ { - "name": "Joel Wurtz", - "email": "joel.wurtz@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "Thomas Gossmann", + "homepage": "http://gos.si" } ], - "description": "Promise used for asynchronous HTTP requests", - "homepage": "http://httplug.io", + "description": "Missing PHP language constructs", + "homepage": "https://phootwork.github.io/lang/", "keywords": [ - "promise" + "array", + "comparator", + "comparison", + "string" ], "support": { - "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.3.1" + "issues": "https://github.com/phootwork/phootwork/issues", + "source": "https://github.com/phootwork/lang/tree/v3.2.2" }, - "time": "2024-03-15T13:55:21+00:00" + "time": "2023-05-26T05:37:59+00:00" }, { "name": "phpmailer/phpmailer", @@ -10422,16 +12692,16 @@ }, { "name": "phrity/util-errorhandler", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/sirn-se/phrity-util-errorhandler.git", - "reference": "4016d9f9615a4c602f525b0542e4835e316a42e4" + "reference": "483228156e06673963902b1cc1e6bd9541ab4d5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sirn-se/phrity-util-errorhandler/zipball/4016d9f9615a4c602f525b0542e4835e316a42e4", - "reference": "4016d9f9615a4c602f525b0542e4835e316a42e4", + "url": "https://api.github.com/repos/sirn-se/phrity-util-errorhandler/zipball/483228156e06673963902b1cc1e6bd9541ab4d5e", + "reference": "483228156e06673963902b1cc1e6bd9541ab4d5e", "shasum": "" }, "require": { @@ -10467,9 +12737,9 @@ ], "support": { "issues": "https://github.com/sirn-se/phrity-util-errorhandler/issues", - "source": "https://github.com/sirn-se/phrity-util-errorhandler/tree/1.1.0" + "source": "https://github.com/sirn-se/phrity-util-errorhandler/tree/1.1.1" }, - "time": "2024-03-05T19:32:14+00:00" + "time": "2024-09-12T06:49:16+00:00" }, { "name": "psr/cache", @@ -10833,16 +13103,16 @@ }, { "name": "psr/log", - "version": "3.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "79dff0b268932c640297f5208d6298f71855c03e" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/79dff0b268932c640297f5208d6298f71855c03e", - "reference": "79dff0b268932c640297f5208d6298f71855c03e", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { @@ -10877,9 +13147,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.1" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2024-08-21T13:31:24+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "psy/psysh", @@ -11211,112 +13481,42 @@ ], "time": "2024-03-02T06:30:58+00:00" }, - { - "name": "sentry/sdk", - "version": "3.6.0", - "source": { - "type": "git", - "url": "https://github.com/getsentry/sentry-php-sdk.git", - "reference": "24c235ff2027401cbea099bf88689e1a1f197c7a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/24c235ff2027401cbea099bf88689e1a1f197c7a", - "reference": "24c235ff2027401cbea099bf88689e1a1f197c7a", - "shasum": "" - }, - "require": { - "http-interop/http-factory-guzzle": "^1.0", - "sentry/sentry": "^3.22", - "symfony/http-client": "^4.3|^5.0|^6.0|^7.0" - }, - "type": "metapackage", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sentry", - "email": "accounts@sentry.io" - } - ], - "description": "This is a metapackage shipping sentry/sentry with a recommended HTTP client.", - "homepage": "http://sentry.io", - "keywords": [ - "crash-reporting", - "crash-reports", - "error-handler", - "error-monitoring", - "log", - "logging", - "sentry" - ], - "support": { - "issues": "https://github.com/getsentry/sentry-php-sdk/issues", - "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.6.0" - }, - "funding": [ - { - "url": "https://sentry.io/", - "type": "custom" - }, - { - "url": "https://sentry.io/pricing/", - "type": "custom" - } - ], - "time": "2023-12-04T10:49:33+00:00" - }, { "name": "sentry/sentry", - "version": "3.22.1", + "version": "4.9.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "8859631ba5ab15bc1af420b0eeed19ecc6c9d81d" + "reference": "788ec170f51ebb22f2809a1e3f78b19ccd39b70d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/8859631ba5ab15bc1af420b0eeed19ecc6c9d81d", - "reference": "8859631ba5ab15bc1af420b0eeed19ecc6c9d81d", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/788ec170f51ebb22f2809a1e3f78b19ccd39b70d", + "reference": "788ec170f51ebb22f2809a1e3f78b19ccd39b70d", "shasum": "" }, "require": { + "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "guzzlehttp/promises": "^1.5.3|^2.0", + "guzzlehttp/psr7": "^1.8.4|^2.1.1", "jean85/pretty-package-versions": "^1.5|^2.0.4", "php": "^7.2|^8.0", - "php-http/async-client-implementation": "^1.0", - "php-http/client-common": "^1.5|^2.0", - "php-http/discovery": "^1.15", - "php-http/httplug": "^1.1|^2.0", - "php-http/message": "^1.5", - "php-http/message-factory": "^1.1", - "psr/http-factory": "^1.0", - "psr/http-factory-implementation": "^1.0", "psr/log": "^1.0|^2.0|^3.0", - "symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0|^7.0", - "symfony/polyfill-php80": "^1.17" + "symfony/options-resolver": "^4.4.30|^5.0.11|^6.0|^7.0" }, "conflict": { - "php-http/client-common": "1.8.0", "raven/raven": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.19|3.4.*", + "friendsofphp/php-cs-fixer": "^3.4", + "guzzlehttp/promises": "^1.0|^2.0", "guzzlehttp/psr7": "^1.8.4|^2.1.1", - "http-interop/http-factory-guzzle": "^1.0", "monolog/monolog": "^1.6|^2.0|^3.0", - "nikic/php-parser": "^4.10.3", - "php-http/mock-client": "^1.3", "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.3", - "phpstan/phpstan-phpunit": "^1.0", "phpunit/phpunit": "^8.5.14|^9.4", - "symfony/phpunit-bridge": "^5.2|^6.0", + "symfony/phpunit-bridge": "^5.2|^6.0|^7.0", "vimeo/psalm": "^4.17" }, "suggest": { @@ -11341,7 +13541,7 @@ "email": "accounts@sentry.io" } ], - "description": "A PHP SDK for Sentry (http://sentry.io)", + "description": "PHP SDK for Sentry (http://sentry.io)", "homepage": "http://sentry.io", "keywords": [ "crash-reporting", @@ -11350,11 +13550,13 @@ "error-monitoring", "log", "logging", - "sentry" + "profiling", + "sentry", + "tracing" ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/3.22.1" + "source": "https://github.com/getsentry/sentry-php/tree/4.9.0" }, "funding": [ { @@ -11366,7 +13568,7 @@ "type": "custom" } ], - "time": "2023-11-13T11:47:28+00:00" + "time": "2024-08-08T14:40:50+00:00" }, { "name": "steverhoades/oauth2-openid-connect-server", @@ -11413,6 +13615,79 @@ }, "time": "2023-09-08T16:15:47+00:00" }, + { + "name": "stomp-php/stomp-php", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/stomp-php/stomp-php.git", + "reference": "cf1fbd79cf48b9701909e42205f1d968cec6ff7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stomp-php/stomp-php/zipball/cf1fbd79cf48b9701909e42205f1d968cec6ff7a", + "reference": "cf1fbd79cf48b9701909e42205f1d968cec6ff7a", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Stomp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Dejan Bosnanac", + "email": "dejan@nighttale.net", + "homepage": "http://www.nighttale.net" + }, + { + "name": "Sören Rohweder", + "email": "s.rohweder@blage.net", + "homepage": "http://www.monofone.de" + }, + { + "name": "Jens Radtke", + "email": "swefl@fin-sn.de", + "homepage": "http://www.fin-sn.de" + } + ], + "description": "stomp support for PHP", + "homepage": "http://github.com/stomp-php/stomp-php", + "keywords": [ + "activeMQ", + "apollomq", + "jms", + "messaging", + "rabbitmq", + "stomp" + ], + "support": { + "issues": "https://github.com/stomp-php/stomp-php/issues", + "source": "https://github.com/stomp-php/stomp-php/tree/5.1.0" + }, + "funding": [ + { + "url": "https://github.com/jmglsn", + "type": "github" + }, + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2023-06-19T17:34:28+00:00" + }, { "name": "symfony/console", "version": "v6.4.11", @@ -12016,178 +14291,6 @@ ], "time": "2024-08-13T14:27:37+00:00" }, - { - "name": "symfony/http-client", - "version": "v7.1.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client.git", - "reference": "a8f8d60b30b331cf4b743b3632e5acdba3f8285c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/a8f8d60b30b331cf4b743b3632e5acdba3f8285c", - "reference": "a8f8d60b30b331cf4b743b3632e5acdba3f8285c", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-client-contracts": "^3.4.1", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "php-http/discovery": "<1.15", - "symfony/http-foundation": "<6.4" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "3.0" - }, - "require-dev": { - "amphp/amp": "^2.5", - "amphp/http-client": "^4.2.1", - "amphp/http-tunnel": "^1.0", - "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4|^2.0", - "nyholm/psr7": "^1.0", - "php-http/httplug": "^1.0|^2.0", - "psr/http-client": "^1.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/rate-limiter": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "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": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", - "homepage": "https://symfony.com", - "keywords": [ - "http" - ], - "support": { - "source": "https://github.com/symfony/http-client/tree/v7.1.4" - }, - "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": "2024-08-26T06:32:37+00:00" - }, - { - "name": "symfony/http-client-contracts", - "version": "v3.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "20414d96f391677bf80078aa55baece78b82647d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/20414d96f391677bf80078aa55baece78b82647d", - "reference": "20414d96f391677bf80078aa55baece78b82647d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "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": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.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": "2024-04-18T09:32:20+00:00" - }, { "name": "symfony/http-foundation", "version": "v6.4.10", @@ -13093,40 +15196,32 @@ "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php73", - "version": "v1.31.0", + "name": "symfony/polyfill-php56", + "version": "v1.20.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + "url": "https://github.com/symfony/polyfill-php56.git", + "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", - "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675", + "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.1" }, - "type": "library", + "type": "metapackage", "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -13141,7 +15236,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -13150,7 +15245,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php56/tree/v1.20.0" }, "funding": [ { @@ -13166,20 +15261,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2020-10-23T14:02:19+00:00" }, { - "name": "symfony/polyfill-php80", + "name": "symfony/polyfill-php73", "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { @@ -13197,7 +15292,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Polyfill\\Php73\\": "" }, "classmap": [ "Resources/stubs" @@ -13208,10 +15303,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -13221,7 +15312,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -13230,7 +15321,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" }, "funding": [ { @@ -16656,48 +18747,127 @@ "url": "https://github.com/phar-io/version.git", "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.19.4", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "0700efda8d7526335132360167315fdab3aeb599" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/0700efda8d7526335132360167315fdab3aeb599", + "reference": "0700efda8d7526335132360167315fdab3aeb599", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" }, - "require": { - "php": "^7.2 || ^8.0" + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true }, - "type": "library", "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Library for handling version information and constraints", + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.19.4" }, - "time": "2022-02-21T01:04:05+00:00" + "time": "2024-03-29T13:00:05+00:00" }, { "name": "php-http/guzzle7-adapter", @@ -16761,6 +18931,115 @@ }, "time": "2021-03-09T07:35:15+00:00" }, + { + "name": "php-http/httplug", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.4.0" + }, + "time": "2023-04-14T15:10:03+00:00" + }, + { + "name": "php-http/promise", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.3.1" + }, + "time": "2024-03-15T13:55:21+00:00" + }, { "name": "phpdocumentor/reflection-common", "version": "2.2.0", @@ -19365,6 +21644,86 @@ ], "time": "2024-08-13T14:27:37+00:00" }, + { + "name": "symfony/polyfill-php80", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.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": "2024-09-09T11:45:10+00:00" + }, { "name": "symfony/polyfill-php82", "version": "v1.30.0", @@ -19555,8 +21914,6 @@ "aliases": [], "minimum-stability": "dev", "stability-flags": { - "drupal/elasticsearch_connector": 15, - "drupal/entity_usage": 10, "drupal/helfi_drupal_tools": 20, "drupal/inline_entity_form": 5, "drupal/ultimate_cron": 15, diff --git a/conf/cmi/core.extension.yml b/conf/cmi/core.extension.yml index df899f73..6c6e1b50 100644 --- a/conf/cmi/core.extension.yml +++ b/conf/cmi/core.extension.yml @@ -44,6 +44,9 @@ module: helfi_api_base: 0 helfi_azure_fs: 0 helfi_ckeditor: 0 + helfi_platform_config: 0 + helfi_user_roles: 0 + helfi_users: 0 image: 0 image_style_quality: 0 infofinland_admin_tools: 0 @@ -65,6 +68,7 @@ module: media_entity_browser: 0 media_entity_soundcloud: 0 media_library: 0 + menu_block_current_language: 0 menu_link_attributes: 0 menu_link_content: 0 menu_ui: 0 diff --git a/conf/cmi/raven.settings.yml b/conf/cmi/raven.settings.yml index 3e43e54b..7a35e85b 100644 --- a/conf/cmi/raven.settings.yml +++ b/conf/cmi/raven.settings.yml @@ -44,4 +44,4 @@ tunnel: false modules: false cron_monitor_id: '' profiles_sample_rate: null -disable_deprecated_alter: false +http_compression: true diff --git a/conf/cmi/user.role.authenticated.yml b/conf/cmi/user.role.authenticated.yml index 6d9d7d80..069f81bf 100644 --- a/conf/cmi/user.role.authenticated.yml +++ b/conf/cmi/user.role.authenticated.yml @@ -16,7 +16,7 @@ dependencies: _core: default_config_hash: 83Nuup-6oYkkdAsvg3nrR2pBOgtTXEV1JrzpCCLkYLM id: authenticated -label: 'Sisäänkirjautunut käyttäjä' +label: 'Authenticated user' weight: 1 is_admin: false permissions: diff --git a/conf/cmi/user.role.editor.yml b/conf/cmi/user.role.editor.yml new file mode 100644 index 00000000..0eec10d2 --- /dev/null +++ b/conf/cmi/user.role.editor.yml @@ -0,0 +1,14 @@ +uuid: c6a73a1b-05c1-4edc-95b4-ad2b33467af7 +langcode: en +status: true +dependencies: { } +_core: + default_config_hash: NCarMlsKnDtHl8NrvTJRPEF3KAztLAHBHDo-H2Om7So +id: editor +label: Editor +weight: 4 +is_admin: null +permissions: + - 'access user profiles' + - 'cancel account' + - 'change own username' diff --git a/conf/cmi/user.role.read_only.yml b/conf/cmi/user.role.read_only.yml new file mode 100644 index 00000000..e407d0f6 --- /dev/null +++ b/conf/cmi/user.role.read_only.yml @@ -0,0 +1,11 @@ +uuid: 372a4da0-8ce4-4835-9487-df069ffb6bd6 +langcode: en +status: true +dependencies: { } +_core: + default_config_hash: deQJrlqgsebK2qYi7RWmSwYprA60SnU9obIWHY77pjI +id: read_only +label: 'Read only' +weight: 2 +is_admin: null +permissions: { } diff --git a/conf/cmi/user.role.super_administrator.yml b/conf/cmi/user.role.super_administrator.yml new file mode 100644 index 00000000..c66fcae4 --- /dev/null +++ b/conf/cmi/user.role.super_administrator.yml @@ -0,0 +1,11 @@ +uuid: 9c78e18c-6f27-4f85-ae37-aac945c7ca73 +langcode: en +status: true +dependencies: { } +_core: + default_config_hash: LNvKATaki4LZWPT-lLO1HHvXXtMON6JYVVNn4Fcr8ss +id: super_administrator +label: 'Super administrator' +weight: 7 +is_admin: true +permissions: { } diff --git a/patches/helfi_platform_config/composer.json b/patches/helfi_platform_config/composer.json new file mode 100644 index 00000000..619566e3 --- /dev/null +++ b/patches/helfi_platform_config/composer.json @@ -0,0 +1,8 @@ +{ + "name": "drupal/infofinland_dummy", + "description": "Circumvents dependency issues when installing helfi_platform_config.", + "type": "drupal-module", + "replace": { + "drupal/external_entities": "*" + } +} diff --git a/patches/revision_overview_form.patch b/patches/revision_overview_form.patch deleted file mode 100644 index 3064c2d4..00000000 --- a/patches/revision_overview_form.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff --git a/src/Form/RevisionOverviewForm.php b/src/Form/RevisionOverviewForm.php -index 45c2c66..4ff4f3b 100755 ---- a/src/Form/RevisionOverviewForm.php -+++ b/src/Form/RevisionOverviewForm.php -@@ -209,7 +209,12 @@ class RevisionOverviewForm extends FormBase { - } - /** @var \Drupal\Core\Entity\ContentEntityInterface $revision */ - if ($revision = $node_storage->loadRevision($vid)) { -- if ($revision->hasTranslation($langcode) && $revision->getTranslation($langcode)->isRevisionTranslationAffected()) { -+ // Added key-check to always show the current revision on revision list. -+ // Check this issue: https://www.drupal.org/project/drupal/issues/3390329. -+ if ( -+ $revision->hasTranslation($langcode) && $revision->getTranslation($langcode)->isRevisionTranslationAffected() || -+ $key === 0 && $revision->hasTranslation($langcode) -+ ) { - $username = array( - '#theme' => 'username', - '#account' => $revision->getRevisionUser(), diff --git a/public/modules/custom/helfi_ckeditor/.eslintignore b/public/modules/custom/helfi_ckeditor/.eslintignore deleted file mode 100644 index b46ea72c..00000000 --- a/public/modules/custom/helfi_ckeditor/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/**/* -webpack.config.js diff --git a/public/modules/custom/helfi_ckeditor/.eslintrc.json b/public/modules/custom/helfi_ckeditor/.eslintrc.json deleted file mode 100644 index b3086593..00000000 --- a/public/modules/custom/helfi_ckeditor/.eslintrc.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "root": true, - "env": { - "browser": true, - "node": true, - "es6": true - }, - "extends": [ - "airbnb-base", - "prettier", - "plugin:import/recommended" - ], - "plugins": [ - "jsdoc" - ], - "parserOptions": { - "ecmaVersion": 2022, - "sourceType": "module" - }, - "globals": { - "Drupal": true, - "drupalSettings": true, - "drupalTranslations": true, - "jQuery": true, - "_": true, - "Cookies": true, - "Backbone": true, - "Modernizr": true, - "Popper": true, - "Shepherd": true, - "Sortable": true, - "once": true, - "CKEDITOR": true, - "tabbable": true - }, - "rules": { - "arrow-spacing": ["warn", { "before": true, "after": true }], - "comma-spacing": ["warn", { "before": false, "after": true }], - "consistent-return": ["off"], - "import/no-extraneous-dependencies": ["error", {"devDependencies": true}], - "lines-between-class-members": ["error", "always", { "exceptAfterSingleLine": true }], - "max-nested-callbacks": ["warn", 5], - "no-plusplus": [ - "warn", - { - "allowForLoopAfterthoughts": true - } - ], - "no-param-reassign": ["off"], - "no-prototype-builtins": ["off"], - "no-unused-vars": ["warn"], - "no-underscore-dangle": ["off"], - "no-whitespace-before-property": "warn", - "object-curly-spacing": ["error", "always"], - "operator-linebreak": [ - "error", - "after", - { "overrides": { "?": "ignore", ":": "ignore" } } - ], - "prefer-arrow-callback":["off"], - "quotes": ["warn", "single"], - "semi": ["error", "always"], - "space-in-parens": ["warn", "never"], - "space-before-function-paren": ["error", "never"], - "valid-jsdoc": [ - "warn", - { - "prefer": { - "returns": "return", - "property": "prop" - }, - "requireReturn": false - } - ] - } -} diff --git a/public/modules/custom/helfi_ckeditor/.gitignore b/public/modules/custom/helfi_ckeditor/.gitignore deleted file mode 100644 index 64186563..00000000 --- a/public/modules/custom/helfi_ckeditor/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -!.eslintrc.json -!.eslintignore diff --git a/public/modules/custom/helfi_ckeditor/.nvmrc b/public/modules/custom/helfi_ckeditor/.nvmrc deleted file mode 100644 index 209e3ef4..00000000 --- a/public/modules/custom/helfi_ckeditor/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -20 diff --git a/public/modules/custom/helfi_ckeditor/.prettierrc.json b/public/modules/custom/helfi_ckeditor/.prettierrc.json deleted file mode 100644 index 4cfea19b..00000000 --- a/public/modules/custom/helfi_ckeditor/.prettierrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "printWidth": 120, - "singleQuote": true -} \ No newline at end of file diff --git a/public/modules/custom/helfi_ckeditor/README.md b/public/modules/custom/helfi_ckeditor/README.md deleted file mode 100644 index bb40db1c..00000000 --- a/public/modules/custom/helfi_ckeditor/README.md +++ /dev/null @@ -1,85 +0,0 @@ -# Hel.fi CKEditor - -This is copied from Helfi-platform config -module version 4.3.26. -https://github.com/City-of-Helsinki/drupal-helfi-platform-config/tree/4.3.26/modules/helfi_ckeditor - -Requirements for developing: -- [NodeJS](https://nodejs.org/en/) -- [NPM](https://npmjs.com/) -- optional [NVM](https://github.com/nvm-sh/nvm) - -## Commands - -| Command | Description | -|---------------|-----------------------------------------------------------------------------------| -| nvm use | Uses correct Node version chosen for the theme compiler. | -| npm i | Install dependencies and link local packages. | -| npm run watch | Compile styles and js for development environment. and watch file changes. | -| npm run build | Build packages for production. Minify CSS/JS. | - -Set up the developing environment by running - - nvm use - npm i - -Explanations for commands. -- `nvm use` : Install and use the correct version of Node. -- `npm i` : As stated above; Install dependencies and link local packages. - -Related files. -- `.nvmrc` : Defines the node version used to compile the theme. -- `package.json and package-lock.json` : Defines the node modules and scripts for compiling the theme. -- `webpack.config.js` : Configuration file for the webpack-tool - -## Known issues - -### My CKEditor plugin custom elements/attributes do not appear on the "Allowed HTML tags" list -This is a [known problem](https://www.drupal.org/project/drupal/issues/3271045). -Just untick and tick the `Limit allowed HTML tags and correct faulty HTML` checkbox in the text format you're adding the plugin to. For example: `/admin/config/content/formats/manage/full_html` - -### Pasting an anchor link to source removes nearly all attributes from anchor -You need to wrap the anchor to paragraph element to retain the attributes. -F.e. `Test` --> `

Test

` - -### The `
` and `` source order in `
` - -Altering the source order of `
` and `
` elements within a `
` in CKEditor 5 can be a challenging task. This is mainly because it involves the behavior of the ckeditor5-table component. -The [table-layout-post-fixer](https://github.com/ckeditor/ckeditor5/blob/331d1e7a04729284efbb55937fd97a452488dc8d/packages/ckeditor5-table/src/converters/table-caption-post-fixer.ts#L59) is responsible for "fixing" the source order by moving the `
` after the `
` element (or in the end of table model). -This post-fixer is executed every time there is a change event, even when a custom post-fixer attempting to address the issue has already run. This situation can potentially result in an infinite loop. - -If one attempts to remove or prevent the table-layout-post-fixer, it can result in a CKEditorError: "mapping-model-position-view-parent-not-found." and a bunch of other issues. Given that the simple task of rearranging the source order of these elements is rather complex, it has been decided to handle this source order adjustment in the frontend to avoid the issues associated with post-fixers in CKEditor 5. - -### Translations -The CKEditor translations are in use only for the `helfiLanguageSelector` plugin. - -This is because of `Drupal.t()` not being able to translate string variables and all the language names are sent to CKEditor via the dynamic plugin config. Also, the [ckeditor5-dev-translations](https://github.com/ckeditor/ckeditor5-dev/tree/master/packages/ckeditor5-dev-translations) tool cannot append all custom plugin translations to a single file or separated files based on plugin name. Instead, it will override the previous plugins' translations. - -Tip: Use `Drupal.t()` when creating new CKEditor5 plugins. If you need the CKEditor `locale.t()`, then move your plugin and the webpack config to a separate module to ease up the developing process. - -### Translations are imported but not working in CKEditor -The translations for JS are handled by locale.module: `locale_js_translate()`. This function is executed when CKEditor configuration form is saved or when `locale_js_alter()` detects a placeholder file `core/modules/locale/locale.translation.js`. However, CKEditor plugins that are loaded as libraries are not included in this process as they are not associated with any render array. Consequently, the `AssetResolver::getJsAssets()` fails to locate the JS files, resulting in the absence of the `Drupal.t()` functions. This will manifest as missing translations in `window.drupalTranslations`. - -To resolve this issue, you can manually invoke the `locale_js_translate()` function with an array containing your built JS files. Here's an example how to implement this solution: -``` - // Update translations manually as CKEditor plugin translations might not - // get translated due to libraries not being loaded via render arrays. - foreach ([ - 'modules/contrib/helfi_platform_config/modules/helfi_ckeditor/assets/js/build/helfiLanguageSelector.js', - 'modules/contrib/helfi_platform_config/modules/helfi_ckeditor/assets/js/build/helfiLink.js', - 'modules/contrib/helfi_platform_config/modules/helfi_ckeditor/assets/js/build/helfiQuote.js', - ] as $file) { - _locale_parse_js_file($file); - } -```` - -As a side note, when `Drupal.t()` function is used with a context, one should not use variable as a context string. The locale scraper won't be able to find the context in this case. - -Incorrect: -``` -const contextText = 'My custom context'; -const variable = Drupal.t('Example', {}, {context: contextText}); -```` -Correct: -``` -const variable = Drupal.t('Example', {}, {context: 'My custom context'}); -``` diff --git a/public/modules/custom/helfi_ckeditor/assets/css/helfi_language_selector_plugin.admin.css b/public/modules/custom/helfi_ckeditor/assets/css/helfi_language_selector_plugin.admin.css deleted file mode 100644 index 84028a63..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/css/helfi_language_selector_plugin.admin.css +++ /dev/null @@ -1,3 +0,0 @@ -.ckeditor5-toolbar-button-helfiLanguageSelector { - background-image: url(../icons/helfiLanguageSelector.svg); -} diff --git a/public/modules/custom/helfi_ckeditor/assets/css/helfi_language_selector_plugin.css b/public/modules/custom/helfi_ckeditor/assets/css/helfi_language_selector_plugin.css deleted file mode 100644 index c9d6afe6..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/css/helfi_language_selector_plugin.css +++ /dev/null @@ -1,24 +0,0 @@ -/* TomSelect input field */ -.ck.ck-dropdown__panel .ts-control input { - width: 100%; - border: 0 none; - padding: 8px; - margin-left: 16px; -} - -.ck.ck-dropdown__panel .ts-control input:only-child { - margin-left: 0; -} - -/* The language span indicators in ckeditor */ -.ck span[lang] { - margin-left: 4px; - margin-right: 4px; - outline: 2px dotted #005799; - outline-offset: 1px; -} -.ck span[lang]::after{ - color:#005799; - content:" (" attr(lang) ")"; - font-size:.75rem -} diff --git a/public/modules/custom/helfi_ckeditor/assets/css/helfi_link_plugin.css b/public/modules/custom/helfi_ckeditor/assets/css/helfi_link_plugin.css deleted file mode 100644 index 62cb9f01..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/css/helfi_link_plugin.css +++ /dev/null @@ -1,235 +0,0 @@ -.ck.ck-balloon-panel.helfi-contextual-balloon { - border-radius: 10px !important; - height: auto; - left: 50vw !important; - max-width: 700px; - min-width: 380px; - position: fixed; - top: 50vh !important; - transform: translate(-50%, -50%); - width: 50vw; - z-index: 10001; -} - -.ck.ck-balloon-panel.helfi-contextual-balloon .ck-labeled-field-view { - max-width: 600px; - margin: 1rem !important; -} - -/* Hide panel arrows. */ -.ck.ck-balloon-panel.helfi-contextual-balloon.ck-balloon-panel_with-arrow::before, -.ck.ck-balloon-panel.helfi-contextual-balloon.ck-balloon-panel_with-arrow::after { - display: none; -} - -/* Helfi link form */ -.ck.ck-responsive-form.helfi-link-form { - padding: 0; -} - -/* Dropdown */ -.ck.helfi-link--icon, -.ck.helfi-link--design, -.ck.helfi-link--protocol { - max-width: 160px !important; -} - -.ck.helfi-link--icon .ck-labeled-field-view__input-wrapper, -.ck.helfi-link--design .ck-labeled-field-view__input-wrapper, -.ck.helfi-link--protocol .ck-labeled-field-view__input-wrapper { - background-color: #fff; - border-radius: .5rem; - border: 1px solid #8e929c; - box-sizing: border-box; - color: #222330; - min-height: 3rem; /* iOS. */ - padding: 0; - transition: .15s cubic-bezier(.19, 1, .22, 1); -} - -.ck.helfi-link--icon .ck-labeled-field-view__input-wrapper .ck.ck-label, -.ck.helfi-link--design .ck-labeled-field-view__input-wrapper .ck.ck-label, -.ck.helfi-link--protocol .ck-labeled-field-view__input-wrapper .ck.ck-label { - transform: unset !important; - max-width: unset !important; - position: absolute; - font-size: 15px; - left: 10px !important; - top: 14px !important; -} - -.ck.helfi-link--icon .ck-labeled-field-view__input-wrapper > .ck.ck-dropdown, -.ck.helfi-link--design .ck-labeled-field-view__input-wrapper > .ck.ck-dropdown, -.ck.helfi-link--protocol .ck-labeled-field-view__input-wrapper > .ck.ck-dropdown { - height: 100%; - width: 100%; -} - -.ck.helfi-link--icon .ck-labeled-field-view__input-wrapper > .ck.ck-dropdown .ck-dropdown__button, -.ck.helfi-link--design .ck-labeled-field-view__input-wrapper > .ck.ck-dropdown .ck-dropdown__button, -.ck.helfi-link--protocol .ck-labeled-field-view__input-wrapper > .ck.ck-dropdown .ck-dropdown__button { - min-height: 45px; - justify-content: flex-end; -} - -.ck.helfi-link--icon .ck-labeled-field-view__input-wrapper .ck.ck-dropdown .ck-dropdown__arrow, -.ck.helfi-link--design .ck-labeled-field-view__input-wrapper .ck.ck-dropdown .ck-dropdown__arrow, -.ck.helfi-link--protocol .ck-labeled-field-view__input-wrapper .ck.ck-dropdown .ck-dropdown__arrow { - right: 10px; - width: 15px; - position: absolute; -} - -.ck.helfi-link--icon .ck-labeled-field-view__input-wrapper > .ck.ck-dropdown .ck-dropdown__button.ck-on .ck-dropdown__arrow, -.ck.helfi-link--design .ck-labeled-field-view__input-wrapper > .ck.ck-dropdown .ck-dropdown__button.ck-on .ck-dropdown__arrow, -.ck.helfi-link--protocol .ck-labeled-field-view__input-wrapper > .ck.ck-dropdown .ck-dropdown__button.ck-on .ck-dropdown__arrow { - transform: rotate(180deg); -} - -.ck.helfi-link--icon .ck-list, -.ck.helfi-link--design .ck-list, -.ck.helfi-link--protocol .ck-list { - margin: 0 !important; -} - -/* Link field select list dropdown */ -.ck-helfi-link-select-list.ts-wrapper { - margin: 1rem !important; -} - -.ck-helfi-link-select-list .ts-control { - padding: calc(0.5rem - 1px) calc(0.75rem - 1px); -} - -/* Link field select list dropdown input */ -.ck-helfi-link-select-list .ts-control input { - width: 100%; - border: 0 none; -} - -/* Hide TomSelect if original select list is hidden. */ -select.tomselected.is-hidden + .ts-wrapper { - display: none; -} - -/* Advanced settings - Details */ -/* Mimic the .claro-details styles. */ -.ck-helfi-link-details { - background-color: #fff; - border-radius: .5rem; - border: 1px solid #d4d4d8; - box-shadow: none; - color: #232429; - display: block; - margin: 1rem !important; - padding: 0.5rem 0; - position: relative; -} - -.ck-helfi-link-details[open] { - padding-bottom: 1rem; -} - -/* Mimic the .claro-details__summary styles. */ -.ck-helfi-link-details__summary { - -ms-hyphens: auto; - -webkit-hyphens: auto; - background-color: transparent; - box-sizing: border-box; - color: #434343; - cursor: pointer; - font-size: 1rem; - font-weight: 500; - hyphens: auto; - line-height: 1rem; - list-style: none; - padding: .8rem 1rem .8rem 3rem; - position: relative; - transition: background-color 0.12s ease-in-out; - word-wrap: break-word; -} - -/* Mimic the .claro-details__summary styles. */ -.ck-helfi-link-details__summary::before { - position: absolute; - top: 50%; - left: 1rem; /* LTR */ - display: inline-block; - width: 1rem; - height: 1rem; - margin-top: -0.5rem; - content: ""; - transition: transform 0.12s ease-in 0s; - transform: rotate(90deg); /* LTR */ - text-align: center; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3e%3cpath d='M5.21 1.314L3.79 2.723l5.302 5.353-5.303 5.354 1.422 1.408 6.697-6.762z' fill='%23545560'/%3e%3c/svg%3e"); - background-size: contain; -} - -/* Mimic the .claro-details__summary styles. */ -.ck-helfi-link-details__summary[aria-expanded=true]::before { - transform: rotate(-90deg); /* LTR */ -} - -/* Mimic styles from Claro .form-element with Gin variables */ -.ck.helfi-link-form .ck-labeled-field-view input.ck-input { - appearance: none; - background-color: #fff; - border-radius: .5rem; - border: 1px solid #8e929c; - box-sizing: border-box; - color: #222330; - font-size: 1rem; - line-height: 1.5rem; - max-width: 100%; - min-height: 3rem; /* iOS. */ - padding: calc(0.75rem - 1px) calc(1rem - 1px); - transition: .15s cubic-bezier(.19, 1, .22, 1); -} - -/* Input field description help text */ -.ck .helfi-link-form .ck-labeled-field-view__status, -.ck .helfi-link-form__field_description { - display: block !important; - font-size: 0.75rem !important; - line-height: 1.5; - margin-top: 0.2rem; - max-width: fit-content; - white-space: normal !important; -} - -.ck .helfi-link-form .ck-labeled-field-view__status:not(.ck-labeled-field-view__status_error) { - color: #55565b !important; -} - -.ck .helfi-link-form__field_description a { - cursor: pointer; - color: #0a6eb4; -} - -/* Input checkboxes. */ -.ck .helfi-link-checkbox { - margin-left: 1rem !important; - margin-top: 1rem; -} - -.ck .helfi-link-checkbox label { - line-height: 1.5rem; - padding-left: 0.4rem !important; -} - -/* Save and cancel buttons */ -.ck.ck-responsive-form.helfi-link-form .ck.ck-button { - margin: 0; - cursor: pointer; -} - -/* Links inside the ckeditor. */ -.ck-content .link { - cursor: text; -} - -/* CKEditor introduced "powered by ckeditor" -logo. Hide it. */ -.ck-powered-by { - display: none; -} diff --git a/public/modules/custom/helfi_ckeditor/assets/css/helfi_quote_plugin.admin.css b/public/modules/custom/helfi_ckeditor/assets/css/helfi_quote_plugin.admin.css deleted file mode 100644 index 081068b7..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/css/helfi_quote_plugin.admin.css +++ /dev/null @@ -1,3 +0,0 @@ -.ckeditor5-toolbar-button-helfiQuote { - background-image: url(../icons/helfiQuote.svg); -} diff --git a/public/modules/custom/helfi_ckeditor/assets/css/helfi_quote_plugin.css b/public/modules/custom/helfi_ckeditor/assets/css/helfi_quote_plugin.css deleted file mode 100644 index 5f93728a..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/css/helfi_quote_plugin.css +++ /dev/null @@ -1,74 +0,0 @@ -/* Helfi Textarea */ -.ck.ck-dropdown__panel .ck-helfi-quote-form { - min-width: 400px; -} - -/* Mimic styles from Claro .form-element with Gin variables */ -.ck.ck-helfi-quote-form .ck-helfi-textarea textarea, -.ck.ck-helfi-quote-form .ck-labeled-field-view input.ck-input { - appearance: none; - background-color: #fff; - border-radius: .5rem; - border: 1px solid #8e929c; - box-sizing: border-box; - color: #222330; - font-size: 1rem; - line-height: 1.5rem; - max-width: 100%; - min-height: 3rem; /* iOS. */ - padding: calc(0.75rem - 1px) calc(1rem - 1px); - transition: .15s cubic-bezier(.19, 1, .22, 1); -} - -.ck.ck-dropdown__panel .ck-helfi-quote-form .ck-helfi-textarea label { - top: 16px !important; - left: 16px !important; -} - -.ck.ck-dropdown__panel .ck-helfi-quote-form .ck-helfi-textarea textarea, -.ck.ck-dropdown__panel .ck-helfi-quote-form > .ck-labeled-field-view { - margin: 16px 16px 0; -} - -.ck.ck-dropdown__panel .ck-helfi-quote-form label.ck-label { - font-size: 1rem; -} - -.ck.ck-dropdown__panel .ck-helfi-quote-form textarea.ck-input:not(.ck-input_is-empty) + label.ck-label, -.ck.ck-dropdown__panel .ck-helfi-quote-form textarea.ck-input_focused + label.ck-label { - color: #222330 !important; - padding: 0 0.35em !important; - background: #fff !important; - font-size: 1rem; - font-weight: 400; - line-height: normal; - max-width: 100% !important; - overflow: hidden; - pointer-events: none; - text-overflow: ellipsis; - transform: translate(calc(0.6em * 0.8),-6px) scale(.75) !important; - transform-origin: 0 0; - transition: transform var(--ck-labeled-field-view-transition),padding var(--ck-labeled-field-view-transition),background var(--ck-labeled-field-view-transition); -} - -.ck.ck-dropdown__panel .ck-helfi-quote-form .ck-button { - border-radius: 0; - border-top: 1px solid var(--ck-color-base-border); - margin: 16px 0 0; - padding: var(--ck-spacing-standard); - width: 50%; -} - -.ck.ck-dropdown__panel .ck-helfi-quote-form .ck-button:after { - bottom: -1px; - content: ""; - position: absolute; - right: -1px; - top: -1px; - width: 0; - z-index: 1; -} - -.ck.ck-dropdown__panel .ck-helfi-quote-form .ck-button:nth-last-child(2):after { - border-right: 1px solid var(--ck-color-base-border); -} diff --git a/public/modules/custom/helfi_ckeditor/assets/css/tom_select.css b/public/modules/custom/helfi_ckeditor/assets/css/tom_select.css deleted file mode 100644 index 7ce0027e..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/css/tom_select.css +++ /dev/null @@ -1,224 +0,0 @@ -/** - * Tom Select v2.2.2 altered to suit City of Helsinki needs. - */ - -/* Select element styles */ -.ts-hidden-accessible { - border: 0 !important; - clip: rect(0 0 0 0) !important; - clip-path: inset(50%) !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - width: 1px !important; - white-space: nowrap !important; -} - -/* TS wrapper styles */ -.ts-wrapper { - color: #222330; - background-color: #fff; - font-size: 1rem; - position: relative; - width: fit-content; - min-width: 300px; -} - -/* TS control div styles */ -.ts-control { - align-items: center; - border-radius: 6px; - border: 1px solid #8e929c; - box-shadow: 0 1px 2px rgba(18,18,18,.25); - cursor: pointer; - display: flex; - min-height: 38px; - overflow: hidden; - padding: calc(0.75rem - 1px) calc(1rem - 1px); - z-index: 1; -} - -/* Deselect button */ -.ts-control .remove { - cursor: pointer; - float: right; - color: #222330; - font-weight: bold; - padding: 7px 10px 7px 7px; -} - -/* Items placeholder styles */ -.plugin-dropdown_input input.items-placeholder { - border: 0 none !important; - box-shadow: none !important; - cursor: pointer; - width: 100%; -} - -.plugin-dropdown_input.has-items input.items-placeholder, -.plugin-dropdown_input.dropdown-active input.items-placeholder { - display: none !important; -} - -/* Dropdown styles*/ -.ts-dropdown { - background: #fff; - border-bottom: 1px solid #8e929c; - border-left: 1px solid #8e929c; - border-radius: 0 0 3px 3px; - border-right: 1px solid #8e929c; - border-top: 0 none; - box-shadow: 0 1px 2px rgba(18,18,18,.25); - box-sizing: border-box; - left: 0; - position: absolute; - top: 100%; - width: 100%; - z-index: 10; -} - -.ts-dropdown [data-selectable] { - cursor: pointer; - overflow: hidden; -} -.ts-dropdown [data-selectable] .highlight { - background: rgba(125, 168, 208, 0.2); - border-radius: 1px; -} -.ts-dropdown .option, -.ts-dropdown .optgroup-header, -.ts-dropdown .no-results, -.ts-dropdown .create { - padding: 7px; -} -.ts-dropdown .option, .ts-dropdown [data-disabled], .ts-dropdown [data-disabled] [data-selectable].option { - cursor: inherit; - opacity: 0.5; -} -.ts-dropdown [data-selectable].option { - opacity: 1; - cursor: pointer; -} -.ts-dropdown .optgroup:first-child .optgroup-header { - border-top: 0 none; -} -.ts-dropdown .optgroup-header { - color: #303030; - background: #fff; - cursor: default; -} -.ts-dropdown .active { - background-color: #5897fb; - color: white; -} -.ts-dropdown .active.create { - color: #495c68; -} -.ts-dropdown .create { - color: rgba(48, 48, 48, 0.5); -} - -.ts-dropdown-content { - overflow-y: auto; - overflow-x: hidden; - max-height: 200px; - scroll-behavior: smooth; -} - -/* Dropdown input styles */ -.plugin-dropdown_input .dropdown-input { - display: block; - padding: 8px 8px; - box-shadow: none; - width: calc(100% - 16px); - background: transparent; -} - -/* Icon styles */ -.ts-control .hel-icon, -.ts-dropdown .hel-icon { - --icon-proportions: 36px; - background-color: #000; - content:""; - order: 2; - display:inline-block; - height:var(--icon-proportions); - -webkit-mask-repeat:no-repeat; - mask-repeat:no-repeat; - -webkit-mask-size:var(--icon-proportions); - mask-size:var(--icon-proportions); - min-height:var(--icon-proportions); - min-width:var(--icon-proportions); - position:static; - width:var(--icon-proportions); -} - -.ts-control .hel-icon--name, -.ts-dropdown .hel-icon--name { - order: 3; -} - -.ts-dropdown .active .hel-icon { - background-color: #fff; -} - -/* Miscellaneous styles */ -.input-hidden .ts-control > input { - opacity: 0; - position: absolute; - left: -10000px; -} - -/* CKE reset overrides */ -.cke_reset_all .ts-control .item, -.cke_reset_all .ts-control .items-placeholder, -.cke_reset_all .ts-dropdown-content .option, -.cke_reset_all .ts-dropdown .dropdown-input-wrap, -.cke_reset_all .ts-dropdown .highlight { - font-size: 1rem; -} - -.cke_reset_all .ts-wrapper { - color: #222330; - font-size: 1rem !important; -} - -.cke_reset_all .ts-control { - align-items: center; - border-radius: 6px; - border: 1px solid #8e929c; - box-shadow: 0 1px 2px rgba(18,18,18,.25); - min-height: 38px; - overflow: hidden; - padding: calc(0.75rem - 1px) calc(1rem - 1px); - z-index: 1; -} - -.cke_reset_all .ts-dropdown { - background: #fff; - border: 1px solid #8e929c; - box-shadow: 0 1px 2px rgba(18,18,18,.25); - box-sizing: border-box; - width: 100%; -} - -.cke_reset_all .ts-control[aria-expanded=true] { - display: none; -} -.cke_reset_all .ts-control[aria-expanded=false] { - display: flex; -} - -.cke_reset_all .dropdown-input, -.cke_reset_all .hel-icon--name, -.cke_reset_all .ts-control .items-placeholder { - font-size: 1rem !important; -} - -.cke_reset_all .ts-control .remove { - cursor: pointer; - float: right; - color: #222330; - font-weight: bold; - padding: 7px 10px 7px 7px; -} diff --git a/public/modules/custom/helfi_ckeditor/assets/icons/helfiLanguageSelector.svg b/public/modules/custom/helfi_ckeditor/assets/icons/helfiLanguageSelector.svg deleted file mode 100644 index c1af275b..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/icons/helfiLanguageSelector.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/public/modules/custom/helfi_ckeditor/assets/icons/helfiQuote.svg b/public/modules/custom/helfi_ckeditor/assets/icons/helfiQuote.svg deleted file mode 100644 index 3ff60480..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/icons/helfiQuote.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/public/modules/custom/helfi_ckeditor/assets/js/build/helfiLanguageSelector.js b/public/modules/custom/helfi_ckeditor/assets/js/build/helfiLanguageSelector.js deleted file mode 100644 index 47ae7c80..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/build/helfiLanguageSelector.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.helfiLanguageSelector=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/utils.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/utils.js")},"ckeditor5/src/widget.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function i(n){var a=t[n];if(void 0!==a)return a.exports;var r=t[n]={exports:{}};return e[n](r,r.exports,i),r.exports}i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var n={};return(()=>{"use strict";i.d(n,{default:()=>m});var e=i("ckeditor5/src/core.js"),t=i("ckeditor5/src/widget.js"),a=i("ckeditor5/src/utils.js");function r(e,t){return`${e}:${t=t||(0,a.getLanguageDirection)(e)}`}function o(e){const[t,i]=e.split(":");return{languageCode:t,textDirection:i}}class s extends e.Command{execute({languageCode:e,textDirection:t}){const{model:i}=this.editor,n=i.document,{selection:a}=n,o=!!e&&r(e,t);i.change((e=>{const t=a.getFirstPosition(),n=t.textNode||t.nodeBefore;if(a.isCollapsed)o?e.setSelectionAttribute("helfiLanguageSelector",o):n?e.removeAttribute("helfiLanguageSelector",e.createRangeOn(n)):e.removeSelectionAttribute("helfiLanguageSelector");else{const t=i.schema.getValidRanges(a.getRanges(),"helfiLanguageSelector");let n=t.next();for(;!n.done;){const i=n.value;o?e.setAttribute("helfiLanguageSelector",o,i):e.removeAttribute("helfiLanguageSelector",i),n=t.next()}}}))}refresh(){const{model:e}=this.editor,{selection:t}=e.document;this.value=this._getValueFromFirstAllowedNode(),this.isEnabled=e.schema.checkAttributeInSelection(t,"helfiLanguageSelector")}_getValueFromFirstAllowedNode(){const{model:e}=this.editor,{schema:t}=e,{selection:i}=e.document;if(i.isCollapsed)return i.getAttribute("helfiLanguageSelector")||!1;const n=i.getRanges();let a=n.next();for(;!a.done;){const e=a.value.getItems();let i=e.next();for(;!i.done;){const n=i.value;if(t.checkAttribute(n,"helfiLanguageSelector"))return n.getAttribute("helfiLanguageSelector")||!1;i=e.next()}a=n.next()}return!1}}class l extends e.Plugin{static get requires(){return[t.Widget]}static get pluginName(){return"HelfiLanguageSelectorEditing"}init(){const{editor:e}=this,{conversion:t}=this.editor;e.model.schema.extend("$text",{allowAttributes:"helfiLanguageSelector"}),e.model.schema.setAttributeProperties("helfiLanguageSelector",{copyOnEnter:!0}),t.for("upcast").elementToAttribute({model:{key:"helfiLanguageSelector",value:e=>{const t=e.getAttribute("lang")??"",i=e.getAttribute("dir")??"";return r(t.toLowerCase(),i.toLowerCase())}},view:{name:"span",attributes:{lang:/[\s\S]+/}}}),t.for("downcast").attributeToElement({model:"helfiLanguageSelector",view:(e,{writer:t},i)=>{if(!e)return;if(!i.item.is("$textProxy")&&!i.item.is("documentSelection"))return;const{languageCode:n,textDirection:a}=o(e);return t.createAttributeElement("span",{lang:n,dir:a})}}),e.commands.add("helfiLanguageSelectorCommand",new s(e))}}var c=i("ckeditor5/src/ui.js");class u extends c.View{constructor(e,t){super(e,t);const i=this.bindTemplate,{t:n}=e;this.editor=t,this.set("isOpen",!1),this.set("label"),this.set("id",null),this.setTemplate({tag:"select",attributes:{id:i.to("id"),class:["ck-helfi-select-list",i.if("isOpen","ck-is-open",(e=>e))],open:i.if("isOpen"),placeholder:n("Select language")},on:{keydown:i.to((e=>{e.target===this.element&&e.keyCode===(0,a.getCode)("space")&&(this.isOpen=!this.isOpen)}))}})}focus(){this.element.focus()}}function d(e){if(!e)return;const{languageCode:t}=o(e);return t||void 0}class g extends e.Plugin{constructor(e){super(e),this.editor=e,this.advancedChildren=new a.Collection,this.helfiLanguageSelectorConfig=this.editor.config.get("helfiLanguageSelector"),this.languageList=this.helfiLanguageSelectorConfig?.language_list,this.updateSelection=!1,function(e){const{t}=e;t("Afrikaans"),t("Albanian"),t("Amharic"),t("Arabic"),t("Armenian"),t("Asturian"),t("Azerbaijani"),t("Bahasa Malaysia"),t("Basque"),t("Belarusian"),t("Bengali"),t("Bosnian"),t("Bulgarian"),t("Burmese"),t("Catalan"),t("Chichewa"),t("Chinese"),t("Chinese, Simplified"),t("Chinese, Traditional"),t("Corsican"),t("Croatian"),t("Czech"),t("Danish"),t("Dutch"),t("Dzongkha"),t("English"),t("Esperanto"),t("Estonian"),t("Faeroese"),t("Filipino"),t("Finnish"),t("French"),t("Frisian"),t("Frisian, Western"),t("Gaelic"),t("Galician"),t("Georgian"),t("German"),t("Greek"),t("Gujarati"),t("Haitian Creole"),t("Hausa"),t("Hebrew"),t("Hindi"),t("Hungarian"),t("Icelandic"),t("Igbo"),t("Indonesian"),t("Irish"),t("Italian"),t("Japanese"),t("Javanese"),t("Kannada"),t("Kazakh"),t("Khmer"),t("Kinyarwanda"),t("Korean"),t("Kurdish (Kurmanji)"),t("Kurdish"),t("Kyrgyz"),t("Lao"),t("Latin"),t("Latvian"),t("Lithuanian"),t("Luxembourgish"),t("Macedonian"),t("Malagasy"),t("Malay"),t("Malayalam"),t("Maltese"),t("Maori"),t("Marathi"),t("Mongolian"),t("Myanmar (Burmese)"),t("Nepali"),t("Norwegian"),t("Odia (Oriya)"),t("Pashto"),t("Persian"),t("Polish"),t("Portuguese"),t("Punjabi"),t("Romanian"),t("Russian"),t("Sami"),t("Samoan"),t("Serbian"),t("Sesotho"),t("Shona"),t("Sindhi"),t("Sinhala"),t("Slovak"),t("Slovenian"),t("Somali"),t("Spanish"),t("Sundanese"),t("Swahili"),t("Swedish"),t("Swiss German"),t("Tajik"),t("Tamil"),t("Tamil, Sri Lanka"),t("Tatar"),t("Telugu"),t("Thai"),t("Tibetan"),t("Turkish"),t("Turkmen"),t("Tuvan"),t("Ukrainian"),t("Urdu"),t("Uyghur"),t("Uzbek"),t("Vietnamese"),t("Welsh"),t("Xhosa"),t("Yiddish"),t("Yoruba"),t("Zulu"),t("Norwegian Bokmål"),t("Norwegian Nynorsk"),t("Occitan"),t("Persian, Farsi")}(e.locale)}init(){const{editor:e}=this,{t}=e.locale,i=t("Remove language from text"),n=t("Select language");e.ui.componentFactory.add("helfiLanguageSelector",(a=>{const r=(0,c.createDropdown)(a);let o,s;r.buttonView.set({label:n,icon:'\n\n\n\t\n\t\n\t\n\t\n\t\n\t\n\n',tooltip:!0}),r.extendTemplate({attributes:{class:["helfi-language-selector"]}}),r.panelView.extendTemplate({attributes:{class:["helfi-language-selector__dropdown-panel","ck-reset_all-excluded"]}});const l=this.editor.commands.get("helfiLanguageSelectorCommand");return r.on("change:isOpen",(()=>{if(s?.options&&(l.value&&!s.items.includes(d(l.value))?s.setValue([d(l.value)],!0):!l.value&&s.items.length>0&&s.clear()),o)return;o=new u(a,this.editor),r.panelView.children.add(o),r.panelPosition="sw",o.delegate("execute").to(r);const n=(e,t)=>`\n \n ${t(e.title)}\n \n `,c={plugins:{remove_button:{title:i}},valueField:"languageCode",labelField:"title",searchField:"title",sortField:"title",maxOptions:null,items:[d(l.value)],options:[this.languageList.map((e=>({...e,title:t(e.title)})))],create:!1,render:{option:(e,t)=>n(e,t),item:(e,t)=>n(e,t)},onItemAdd:t=>{l.value!==t&&(l.execute({languageCode:t,textDirection:this.languageList.find((e=>e.languageCode===t)).textDirection}),e.editing.view.focus())},onItemRemove:()=>{l.value&&(l.execute({languageCode:!1}),e.editing.view.focus())}};s=new TomSelect(o.element,c)})),r}))}}class h extends e.Plugin{static get requires(){return[l,g]}}const m={HelfiLanguageSelector:h}})(),n=n.default})())); \ No newline at end of file diff --git a/public/modules/custom/helfi_ckeditor/assets/js/build/helfiLink.js b/public/modules/custom/helfi_ckeditor/assets/js/build/helfiLink.js deleted file mode 100644 index f70615c2..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/build/helfiLink.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.helfiLink=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/typing.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/typing.js")},"ckeditor5/src/ui.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/utils.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/utils.js")},"ckeditor5/src/widget.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function i(n){var s=t[n];if(void 0!==s)return s.exports;var l=t[n]={exports:{}};return e[n](l,l.exports,i),l.exports}i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var n={};return(()=>{"use strict";i.d(n,{default:()=>w});var e=i("ckeditor5/src/core.js"),t=i("ckeditor5/src/widget.js"),s=i("ckeditor5/src/typing.js");const l=(e,t)=>{let i;if("/"===e||""===e)return!1;try{i=new URL(e)}catch(t){if(i=new URL(`https://${e}`),!/https?:\/\/(?:www\.)?[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/.test(i))return!1}const n=i.hostname;return!t.some((e=>e.startsWith("*.")&&n.endsWith(e.slice(2))||e===n))},o=e=>{try{const t=new URL(e);return("tel:"===t.protocol||"mailto:"===t.protocol)&&t.protocol.replace(":","")}catch(e){return!1}},r={linkIcon:{label:Drupal.t("Icon",{},{context:"CKEditor5 Helfi Link plugin"}),machineName:"icon",selectListOptions:{},type:"select",group:"advanced",isVisible:!1,viewAttribute:"data-hds-icon-start"},linkVariant:{label:Drupal.t("Design"),machineName:"variant",selectListOptions:{link:Drupal.t("Normal link",{},{context:"CKEditor5 Helfi Link plugin"}),primary:Drupal.t("Button primary"),secondary:Drupal.t("Button secondary"),supplementary:Drupal.t("Button supplementary")},type:"select",group:"advanced",isVisible:!0,viewAttribute:"data-hds-variant"},linkButton:{machineName:"data-hds-component",type:"static",viewAttribute:"data-hds-component"},linkProtocol:{label:Drupal.t("Protocol",{},{context:"CKEditor5 Helfi Link plugin"}),machineName:"protocol",selectListOptions:{https:"https://",tel:"tel:",mailto:"mailto:"},type:"select",group:"helper",viewAttribute:"data-protocol",isVisible:!0},linkNewWindowConfirm:{label:Drupal.t("The link meets the accessibility requirements",{},{context:"CKEditor5 Helfi Link plugin"}),description:Drupal.t('I have made sure that the description of this link clearly states that it will open in a new tab. See WCAG 3.2.5 accessibility requirement (the link opens in a new tab).',{"@wcag-techniques":"https://www.w3.org/WAI/WCAG21/Techniques/general/G200.html"},{context:"CKEditor5 Helfi Link plugin"}),machineName:"link-new-window-confirm",viewAttribute:{target:"_blank"},type:"checkbox",group:"advanced",isVisible:!1},linkNewWindow:{label:Drupal.t("Open in new window/tab",{},{context:"CKEditor5 Helfi Link plugin"}),machineName:"link-new-window",type:"checkbox",group:"advanced",isVisible:!0},linkIsExternal:{machineName:"data-is-external",type:"static",viewAttribute:"data-is-external"}};class a extends e.Plugin{static get requires(){return[t.Widget]}static get pluginName(){return"HelfiLinkEditing"}init(){Object.keys(r).forEach((e=>{r[e].machineName&&(this._convertAttribute(e,r[e].viewAttribute),this._removeAttributeOnUnlinkCommandExecute(e),this._refreshAttributeValue(e))})),this._defineHelfiButtonConverters(),this._addAttributeOnLinkCommandExecute(Object.keys(r))}_convertAttribute(e,t){const{editor:i}=this;if(t)if(i.model.schema.extend("$text",{allowAttributes:e}),i.conversion.for("downcast").attributeToElement({model:e,view:(e,{writer:i})=>{const n={};e&&"object"==typeof t?n[Object.keys(t)]=t[Object.keys(t)]:n[t]=e;const s=i.createAttributeElement("a",n,{priority:5});return i.setCustomProperty("link",!0,s),s}}),"object"==typeof t){const i=Object.keys(t)[0],n=t[Object.keys(t)];this.editor.conversion.for("upcast").attributeToAttribute({view:{name:"a",key:i,value:n},model:{key:e,value:e=>!(!e.hasAttribute(i)||e.getAttribute(i)!==n)}})}else"linkIsExternal"===e||"linkProtocol"===e?i.conversion.for("upcast").elementToAttribute({view:"a",model:{key:e,value:t=>{if(!t.hasAttribute("href"))return null;const i=t.getAttribute("href"),{whiteListedDomains:n}=this.editor.config.get("link");if(!n||!i)return null;const s=l(i,n),r=o(i);return r&&"linkProtocol"===e?r:!(!s||"linkIsExternal"!==e)||null}},converterPriority:"high"}):i.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:{[t]:!0}},model:{key:e,value:e=>e.getAttribute(t)}})}_removeAttributeOnUnlinkCommandExecute(e){const{editor:t}=this,{model:i}=this.editor,{selection:n}=i.document,l=t.commands.get("unlink");let o=!1;l.on("execute",(l=>{o||(l.stop(),i.change((()=>{o=!0,t.execute("unlink"),o=!1,i.change((t=>{let l;l=n.isCollapsed?[(0,s.findAttributeRange)(n.getFirstPosition(),e,n.getAttribute(e),i)]:i.schema.getValidRanges(n.getRanges(),e),Array.isArray(l)&&l.forEach((i=>t.removeAttribute(e,i)))}))})))}),{priority:"high"})}_refreshAttributeValue(e){const{editor:t}=this,{model:i}=this.editor,{selection:n}=i.document,s=t.commands.get("link");s.set(e,null),i.document.on("change",(()=>{s[e]=n.getAttribute(e)}))}_defineHelfiButtonConverters(){const{editor:e}=this;e.model.schema.isRegistered("tableCell")&&e.model.schema.extend("tableCell",{allowContentOf:"$block"});const t=e=>{const t=e.split(" "),i=t.find((e=>e.startsWith("hds-button--"))),n=t.find((e=>e.endsWith("hds-button")));return i?i.replace("hds-button--",""):n?"primary":null};e.conversion.for("upcast").elementToElement({view:{name:"a"},model:e=>{const t=Array.from(e.getChildren()).find((e=>"span"===e.name&&e.hasClass("hds-button__label")));if(t){const i=Array.from(e.getChildren()),n=i.length;n>0&&e._removeChildren(0,n),i.forEach((t=>{if("span"===t.name&&t.hasClass("hel-icon")){const i=(e=>{let t=!1,i=e.next();for(;!i.done;){const n=i.value;if(n&&n.startsWith("hel-icon--")){t=n.replace("hel-icon--","");break}i=e.next()}return t})(t.getClassNames());i&&e._setAttribute("data-hds-icon-start",i)}})),Array.from(t.getChildren()).forEach((t=>{e._appendChild(t)}))}const i=Array.from(e.getChildren()).find((e=>!(!e.name||"span"!==e.name)&&(!e.getAttribute("dir")&&!e.getAttribute("lang")&&e)));return i&&(e._removeChildren(i.index,1),Array.from(i.getChildren()).forEach((t=>{e._appendChild(t)}))),e.hasAttribute("data-protocol")&&e.getAttribute("data-protocol").startsWith("http")&&e._removeAttribute("data-protocol"),e},converterPriority:"highest"}),e.conversion.for("upcast").attributeToAttribute({view:{name:"a",key:"data-design"},model:{key:"linkVariant",value:e=>{let i;return e.hasClass("hds-button")&&(i=t([...e._classes].join(" ")),i||(i=t(e.getAttribute("data-design")))),i&&"primary"===i&&(i=null),i}}}),e.conversion.for("upcast").attributeToAttribute({view:{name:"a",key:"data-design"},model:{key:"linkButton",value:e=>{let i;return e.hasClass("hds-button")&&(i=t([...e._classes].join(" ")),i||(i=t(e.getAttribute("data-design")))),!!i&&"button"}}}),e.conversion.for("upcast").attributeToAttribute({view:{name:"a",key:"class",value:"hds-button"},model:{key:"linkButton",value:"button"}}),e.conversion.for("upcast").attributeToAttribute({view:{name:"a",key:"data-protocol"},model:{key:"linkProtocol",value:e=>{return"https"!==(t=e.getAttribute("data-protocol"))&&"http"!==t&&t;var t}},converterPriority:"highest"}),e.conversion.for("upcast").attributeToAttribute({view:{name:"a",key:"data-selected-icon"},model:{key:"linkIcon"}})}_addAttributeOnLinkCommandExecute(e){const{editor:t}=this,i=t.commands.get("link");let n=!1;i.on("execute",((i,s)=>{if(s.length<3)return;if(n)return void(n=!1);i.stop(),n=!0;const l=s[s.length-1],{model:o}=t,{selection:r}=o.document;o.change((i=>{t.execute("link",...s),e.forEach((e=>{if(r.isCollapsed){const t=e=>{const t=e.textNode||e.nodeBefore;if(!t){const t=i.createRange(e);return i.setSelection(t),t}return i.createRangeOn(t)};l[e]?i.setAttribute(e,l[e],t(r.getFirstPosition())):i.removeAttribute(e,t(r.getFirstPosition())),i.removeSelectionAttribute(e)}else{const t=o.schema.getValidRanges(r.getRanges(),e);let n=t.next();for(;!n.done;){const s=n.value;l[e]?i.setAttribute(e,l[e],s):i.removeAttribute(e,s),n=t.next()}}}))}))}),{priority:"high"})}}var c=i("ckeditor5/src/ui.js"),d=i("ckeditor5/src/utils.js");class h extends c.View{constructor(e){super(e);const t=this.bindTemplate;this.set("class"),this.set("isVisible",!0),this.set("isChecked",!1),this.set("label"),this.set("description"),this.set("id",null),this.set("tabindex",-1),this.children=this.createCollection(),this.labelView=this._createLabelView(),this.checkboxInputView=this._createCheckboxInputView(),this.checkboxSpanToggle=this._createCheckboxSpanToggleView(),this.bind("isVisible").to(this,"updateVisibility"),this.bind("isChecked").to(this,"updateChecked"),this.setTemplate({tag:"div",attributes:{class:["form-type--checkbox","helfi-link-checkbox",t.if("isVisible","is-hidden",(e=>!e)),t.to("class")]},on:{keydown:t.to((e=>{e.target===this.element&&e.keyCode===(0,d.getCode)("space")&&(this.isChecked=!this.isChecked)}))},children:this.children})}render(){super.render(),this.children.add(this.checkboxInputView),this.children.add(this.checkboxSpanToggle),this.children.add(this.labelView)}focus(){this.element.focus()}_createCheckboxInputView(){const e=new c.View,t=this.bindTemplate;return e.setTemplate({tag:"input",attributes:{type:"checkbox",id:t.to("id"),checked:t.if("isChecked")},on:{change:t.to((e=>{this.isChecked=e.target.checked}))}}),e}_createCheckboxSpanToggleView(){const e=new c.View,t=this.bindTemplate;return e.setTemplate({tag:"span",attributes:{class:["checkbox-toggle"],id:t.to("id")},children:[{tag:"span",attributes:{class:["checkbox-toggle__inner"]}}]}),e}_createLabelView(){const e=new c.View;return e.setTemplate({tag:"label",attributes:{for:this.bindTemplate.to("id")},children:[{text:this.bindTemplate.to("label")}]}),e}updateVisibility(e){e?this.element.classList.remove("is-hidden"):this.element.classList.add("is-hidden")}updateChecked(e){e!==this.isChecked&&this.checkboxInputView?.element?.click()}}class u extends c.View{constructor(e,t){super(e.locale),this.options=t,this.tomSelect=!1,this.linkCommandConfig=e.config.get("link"),this.loadedIcons=this.linkCommandConfig?.loadedIcons,this.set("isVisible",!1),this.bind("isVisible").to(this,"updateVisibility");const i=this.bindTemplate;this.set("isOpen",!1),this.set("label"),this.set("id",null),this.setTemplate({tag:"select",attributes:{id:i.to("id"),class:["ck-helfi-link-select-list"],"data-placeholder":this.options.label,autocomplete:"off"},on:{keydown:i.to((e=>{e.target===this.element&&e.keyCode===(0,d.getCode)("space")&&(this.isOpen=!this.isOpen)}))}})}updateVisibility(e){e?(this.tomSelect?.wrapper?.classList.remove("is-hidden"),this.element.classList.remove("is-hidden")):(this.tomSelect?.wrapper?.classList.add("is-hidden"),this.element.classList.add("is-hidden"))}render(){super.render()}focus(){this.element.focus()}selectListDefaultOptions(){return{valueField:"option",labelField:"name",searchField:"title",maxItems:1,placeholder:this.options.label,create:!1}}}class m extends u{renderTomSelect(e,t){if(!this.tomSelect&&e){const e=super.selectListDefaultOptions(),i=(e,t)=>`\n \n ${t(e.title)}\n \n `,n={...e,options:Object.keys(t).map((e=>({option:e,title:t[e]}))),render:{option:(e,t)=>i(e,t),item:(e,t)=>i(e,t)}};this.tomSelect=new TomSelect(this.element,n)}}}class p extends c.View{constructor(e,t){super(e),this.advancedChildren=t;const i=this.bindTemplate;this.set("isOpen",!1),this.set("label"),this.set("id",null),this.children=this.createCollection(),this.detailsSummary=this._createDetailsSummary(),this.setTemplate({tag:"details",attributes:{id:i.to("id"),class:["ck-helfi-link-details",i.if("isOpen","ck-is-open",(e=>e))],open:i.if("isOpen")},on:{keydown:i.to((e=>{e.target===this.element&&e.keyCode===(0,d.getCode)("space")&&(this.isOpen=!this.isOpen)}))},children:this.children})}render(){super.render(),this.children.add(this.detailsSummary),this.children.addMany(this.advancedChildren)}focus(){this.element.focus()}_createDetailsSummary(){const e=new c.View;return e.setTemplate({tag:"summary",attributes:{role:"button",class:["ck-helfi-link-details__summary"],tabindex:0},children:[{text:this.bindTemplate.to("label")}]}),e}}class b extends u{renderTomSelect(e,t){if(!this.tomSelect&&e){const e=super.selectListDefaultOptions(),i=(e,t)=>`\n \n ${t(e.title)}\n \n `,n={...e,plugins:{dropdown_input:{},remove_button:{title:"Remove this item"}},options:Object.keys(t).map((e=>({option:e,title:t[e]}))),render:{option:(e,t)=>i(e,t),item:(e,t)=>i(e,t)}};this.tomSelect=new TomSelect(this.element,n)}}}class k extends u{renderTomSelect(e){if(!this.tomSelect&&e){const e=super.selectListDefaultOptions(),t=(e,t)=>`\n \n \n ${t(e.name)}\n \n `,i={...e,plugins:{dropdown_input:{},remove_button:{title:"Remove this item"}},valueField:"icon",searchField:["name"],options:Object.keys(this.loadedIcons).map((e=>({icon:e,name:this.loadedIcons[e]}))),render:{option:(e,i)=>t(e,i),item:(e,i)=>t(e,i)}};this.tomSelect=new TomSelect(this.element,i)}}}class f extends e.Plugin{constructor(e){super(e),this.editor=e,this.advancedChildren=new d.Collection,this.formElements=r,this.helfiContextualBalloonInitialized=!1}init(){this.editor.plugins.get("LinkUI")._createViews&&this.editor.plugins.get("LinkUI")._createViews(),this._addContextualBalloonClass(),this.editor.plugins.get("ContextualBalloon").on("change:visibleView",((e,t,i,n)=>{const s=this.editor.plugins.get("LinkUI").formView;if(i===n||i!==s||!this.helfiContextualBalloonInitialized)return;const l=Object.keys(this.formElements).reverse();l.forEach((e=>{if(!this.formElements[e].machineName)return;const t=this._createFormField(e,s);this.formElements[e].group&&"advanced"===this.formElements[e].group&&void 0!==t&&this.advancedChildren.add(t)})),this._createAdvancedSettingsAccordion(s),l.forEach((e=>{this.formElements[e].machineName&&this._handleDataLoadingIntoFormField(e,s)})),s.urlInputView.infoText||(s.urlInputView.infoText=Drupal.t("Start typing to find content.",{},{context:"CKEditor5 Helfi Link plugin"})),this._handleCheckboxes(s),this._handleFormFieldSubmit(l)}))}_addContextualBalloonClass(){const{editor:e}=this;e.plugins.get("ContextualBalloon").on("set:visibleView",((t,i,n,s)=>{const l=e.plugins.get("LinkUI").formView;if(n===s||n!==l)return;const o=this.editor.plugins.get("ContextualBalloon");o.hasView(l)&&!o.view.element.classList.contains("helfi-contextual-balloon")&&(l.template.attributes.class.push("helfi-link-form"),l.template.attributes.class.push("ck-reset_all-excluded"),o.remove(n),o.add({view:l,position:o._getBalloonPosition(),balloonClassName:"helfi-contextual-balloon",withArrow:!1}),this.helfiContextualBalloonInitialized=!0)}))}_createSelectList(e,t,i){const{editor:n}=this;let s={};switch(e){case"linkProtocol":s=new m(n,t),i.urlInputView.on("change:isEmpty",((e,t,i)=>{s.updateVisibility(i)}));break;case"linkVariant":s=new b(n,t);break;case"linkIcon":s=new k(n,t),i.linkVariant.on("change:isEmpty",((e,t,i)=>{s.updateVisibility(i)}))}return s.set({isVisible:t.isVisible,id:t.machineName,label:t.label}),s}_createAdvancedSettingsAccordion(e){if(e.advancedSettings)return e.advancedSettings.element.open=!1,e.advancedSettings.detailsSummary.element.ariaExpanded=!1,e.advancedSettings.detailsSummary.element.ariaPressed=!1,e.advancedSettings;const{editor:t}=this,i=new p(t.locale,this.advancedChildren);return i.set({label:Drupal.t("Advanced settings",{},{context:"CKEditor5 Helfi Link plugin"}),id:"advanced-settings",isOpen:!1}),e.children.add(i,2),e.urlInputView.errorText&&(e.urlInputView.errorText=""),e.advancedSettings=i,e.advancedSettings}_createCheckbox(e){const t=new h(this.editor.locale),i=this.formElements[e];return t.set({isVisible:i.isVisible,tooltip:!0,class:"ck-find-checkboxes__box",id:i.machineName,label:i.label}),t}_createFormField(e,t){const{editor:i}=this,n=this.formElements[e],s=i.commands.get("link");if(!t[e]){let l={};switch(n.type){case"select":l=this._createSelectList(e,n,t);break;case"checkbox":l=this._createCheckbox(e);break;case"static":l=!1;break;default:l=new c.LabeledFieldView(i.locale,c.createLabeledInputText)}if(!l)return;return l.machineName=e,l.class=`helfi-link--${n.machineName}`,l.label=n.label,n.description&&(l.infoText=n.description),n.group&&"advanced"===n.group||t.children.add(l,"select"===n.type?0:1),t._focusables.add(l,1),t.focusTracker.add(l.element),t[e]=l,"checkbox"===n.type&&t[e].checkboxInputView.bind("isChecked").to(s,e),"input"===n.type&&t[e].fieldView.bind("value").to(s,e),"linkProtocol"!==e||t.urlInputView.isEmpty||t[e].updateVisibility(!1),t[e]}}_handleDataLoadingIntoFormField(e,t){const{editor:i}=this,n=i.commands.get("link"),s=this.formElements[e];if(void 0!==t[e])switch(s.type){case"static":return;case"checkbox":{const i=!!n.linkNewWindowConfirm;t[e].updateChecked(i),t.linkNewWindowConfirm&&t.linkNewWindowConfirm.updateVisibility(i);break}case"select":t[e].renderTomSelect(t[e].element,s?.selectListOptions),"linkIcon"===e&&t[e].tomSelect.on("initialize",(()=>{t[e].updateVisibility(!1)})),t[e].tomSelect.clear(),n[e]&&t[e].tomSelect.addItem(n[e],!0),"linkProtocol"===e&&t[e].tomSelect.on("item_add",(i=>{t.urlInputView.isEmpty&&(t.urlInputView.fieldView.value=s.selectListOptions[i],t.urlInputView.focus(),t[e].tomSelect.clear())})),"linkVariant"===e&&("button"!==n.linkButton||n[e]&&"primary"!==n[e]||t[e].tomSelect.addItem("primary",!0),n.linkVariant||"button"===n.linkButton||t?.linkIcon.updateVisibility(!1),t[e].tomSelect.on("item_remove",(()=>{t?.linkIcon.tomSelect.clear(),t?.linkIcon.updateVisibility(!1)})),t[e].tomSelect.on("item_add",(e=>{t?.linkIcon.updateVisibility("link"!==e),"link"===e&&t?.linkIcon.tomSelect.clear()})));break;default:t[e].fieldView.element.value=n[e]||""}}_handleCheckboxes(e){if(this.formElements.linkNewWindowConfirm&&this.formElements.linkNewWindow&&e&&e.linkNewWindow&&e.linkNewWindowConfirm&&e.linkNewWindowConfirm.element){if(!e.linkNewWindowConfirm.element.querySelector(".helfi-link-form__field_description")){const t=document.createElement("div");t.innerHTML=this.formElements.linkNewWindowConfirm.description,t.classList.add("helfi-link-form__field_description"),e.linkNewWindowConfirm.element.appendChild(t)}e.linkNewWindow.on("change:isChecked",((t,i,n)=>{e?.linkNewWindowConfirm.updateChecked(!1),e?.linkNewWindowConfirm.updateVisibility(n)}))}}_handleFormFieldSubmit(e){const{editor:t}=this,{selection:i}=t.model.document,n=t.plugins.get("LinkUI").formView,s=t.commands.get("link");this.listenTo(n,"submit",(t=>{n.urlInputView?.fieldView?.element?.value||(n.urlInputView.errorText=Drupal.t("The link URL field cannot be empty.",{},{context:"CKEditor5 Helfi Link plugin"}),t.stop());const{whiteListedDomains:r}=this.editor.config.get("link"),a=n.urlInputView?.fieldView?.element?.value,c=e.reduce(((e,t)=>{switch(t){case"linkVariant":{const i=n?.[t]?.tomSelect.getValue();if(!i||"link"===i)return e;if("primary"===i)return e.linkButton="button",e;e[t]=i,e.linkButton="button";break}case"linkIcon":e[t]=n?.[t]?.tomSelect.getValue();break;case"linkProtocol":if(!r||!a)break;o(a)&&(e[t]=o(a));break;case"linkIsExternal":if(!r||!a)break;if(!o(a)&&l(a,r)){e[t]=l(a,r);break}break;default:e[t]=n?.[t]?.fieldView?.element?.value??""}return"checkbox"===this.formElements[t].type&&(e[t]=n?.[t]?.checkboxInputView?.element?.checked),e}),{});i.isCollapsed&&!n.urlInputView?.fieldView?.element?.value&&c.linkId&&(n.urlInputView.errorText=Drupal.t("When there is no selection, the link URL must be provided. To add a link without a URL, first select text in the editor and then proceed with adding the link.",{},{context:"CKEditor5 Helfi Link plugin"}),t.stop()),c.linkNewWindowConfirm&&c.linkNewWindow||(c.linkNewWindowConfirm=!1,c.linkNewWindow=!1,n.linkNewWindowConfirm.checkboxInputView.element.checked&&n.linkNewWindowConfirm.checkboxInputView.element.click(),n.linkNewWindow.checkboxInputView.element.checked&&n.linkNewWindow.checkboxInputView.element.click()),s.once("execute",((e,t)=>{if(t.length<3)t.push(c);else{if(3!==t.length)throw Error("The link command has more than 3 arguments.");Object.assign(t[2],c)}}),{priority:"highest"})}),{priority:"high"})}}class g extends e.Plugin{static get requires(){return[a,f]}}const w={HelfiLink:g}})(),n=n.default})())); \ No newline at end of file diff --git a/public/modules/custom/helfi_ckeditor/assets/js/build/helfiQuote.js b/public/modules/custom/helfi_ckeditor/assets/js/build/helfiQuote.js deleted file mode 100644 index 26e3c293..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/build/helfiQuote.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.helfiQuote=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/utils.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/utils.js")},"ckeditor5/src/widget.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function i(o){var s=t[o];if(void 0!==s)return s.exports;var r=t[o]={exports:{}};return e[o](r,r.exports,i),r.exports}i.d=(e,t)=>{for(var o in t)i.o(t,o)&&!i.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var o={};return(()=>{"use strict";i.d(o,{default:()=>h});var e=i("ckeditor5/src/core.js"),t=i("ckeditor5/src/widget.js");class s extends e.Command{execute({quoteText:e,author:t}){const{model:i}=this.editor;i.change((o=>{e&&i.insertContent(function(e,t,i){const o=e.createElement("helfiQuote"),s=e.createElement("helfiQuoteText"),r=e.createElement("helfiQuoteFooter"),n=e.createElement("helfiQuoteFooterCite");return e.append(s,o),e.insertText(t,s),i&&(e.append(r,o),e.append(n,r),e.insertText(i,n)),o}(o,e,t))}))}refresh(){const{model:e}=this.editor,{selection:t}=e.document,i=e.schema.findAllowedParent(t.getFirstPosition(),"helfiQuote");this.isEnabled=null!==i}}class r extends e.Plugin{static get requires(){return[t.Widget]}init(){const{editor:e}=this;this._defineSchema(),this._defineConverters(),e.commands.add("helfiQuoteCommand",new s(e))}static get pluginName(){return"HelfiQuoteEditing"}_defineSchema(){const{schema:e}=this.editor.model;e.register("helfiQuote",{isObject:!0,allowWhere:"$block"}),e.register("helfiQuoteText",{isLimit:!0,allowIn:"helfiQuote",allowContentOf:"$block"}),e.register("helfiQuoteFooter",{isLimit:!0,allowIn:"helfiQuote",allowContentOf:"$block"}),e.register("helfiQuoteFooterCite",{isLimit:!0,allowIn:"helfiQuoteFooter",allowContentOf:"$block"})}_defineConverters(){const{conversion:e}=this.editor,i=(t,i,o=null)=>{const s={dataAttributes:{name:i,attributes:{[o]:""}},classes:{name:i,classes:[o]}};Object.keys(s).forEach((i=>{const o=s[i];e.for("upcast").elementToElement({view:o,model:t})}))};i("helfiQuote","blockquote","quote"),i("helfiQuote","blockquote","data-helfi-quote"),i("helfiQuoteText","p","quote__text"),i("helfiQuoteText","p","data-helfi-quote-text"),i("helfiQuoteFooter","footer","quote__author"),i("helfiQuoteFooter","footer","data-helfi-quote-author"),i("helfiQuoteFooterCite","footer");const o=(i,o,s={},r=!1)=>{const n=r?"createContainerElement":"createEditableElement";e.for("dataDowncast").elementToElement({model:i,view:(e,{writer:t})=>t[n](o,s)}),e.for("editingDowncast").elementToElement({model:i,view:(e,{writer:i})=>{const l=i[n](o,s);return r?(0,t.toWidget)(l,i):(0,t.toWidgetEditable)(l,i)}})};o("helfiQuote","blockquote",{"data-helfi-quote":""},!0),o("helfiQuoteText","p",{"data-helfi-quote-text":""}),o("helfiQuoteFooter","footer",{"data-helfi-quote-author":""},!0),o("helfiQuoteFooterCite","cite")}}var n=i("ckeditor5/src/ui.js");var l=i("ckeditor5/src/utils.js");class a extends n.View{constructor(e,t){super(e,t),this.textAreaLabel=Drupal.t("Quotation",{},{context:"CKEditor5 Helfi Quote plugin"}),this.set("value",void 0),this.set("id",void 0),this.set("label"),this.focusTracker=new l.FocusTracker,this.bind("isFocused").to(this.focusTracker),this.set("isEmpty",!0),this.children=this.createCollection(),this.textArea=this._createTextareaView(e),this.setTemplate({tag:"div",attributes:{class:["ck-helfi-textarea"]},children:this.children})}render(){super.render(),this.children.add(this.textArea),this.focusTracker.add(this.textArea),this.focusTracker.add(this.textArea.fieldView.element),this._setDomElementValue(this.value),this._updateValue()}destroy(){super.destroy(),this.value="",this.focusTracker.destroy()}_createTextareaView(e){const t=this.bindTemplate,i=new n.LabeledFieldView(e,((e,i)=>{const o=new n.View(e.locale);return o.setTemplate({tag:"textarea",attributes:{rows:5,cols:40,id:i,class:["ck","ck-input","ck-helfi-textarea",t.if("isEmpty","ck-input_is-empty"),t.if("isFocused","ck-input_focused")]},on:{input:t.to(((...e)=>{this.fire("input",...e),this._updateValue()})),change:t.to(this._updateValue.bind(this))}}),o.bind("isFocused").to(e,"isFocused"),e.bind("isFocused").to(o,"isFocused"),o}));return i.label=this.textAreaLabel,i}focus(){this.textArea.fieldView.element.focus()}_setDomElementValue(e){this.element.value=e||0===e?e:"",this.textArea.fieldView.element.value=this.element.value}_updateValue(){this.value=!!this.textArea.fieldView.element.value&&this.textArea.fieldView.element.value,this.isEmpty=!this.value}updateValueBasedOnSelection(e=""){this.isEmpty=!e,this._setDomElementValue(e)}}class u extends n.View{constructor(t,i){super(t,i),this.editor=i,this.textAreaView=new a(t,i),this.authorInputView=new n.LabeledFieldView(i.locale,n.createLabeledInputText),this.authorInputView.label=Drupal.t("Source / author",{},{context:"CKEditor5 Helfi Quote plugin"}),this.saveButtonView=this._createButton(Drupal.t("Save",{},{context:"CKEditor5 Helfi Quote plugin"}),e.icons.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(Drupal.t("Cancel",{},{context:"CKEditor5 Helfi Quote plugin"}),e.icons.cancel,"ck-button-cancel","cancel"),this.keystrokes=new l.KeystrokeHandler,this.children=this.createCollection(),this.setTemplate({tag:"form",attributes:{class:["ck","ck-helfi-quote-form"],tabindex:"-1"},children:this.children})}render(){super.render(),(0,n.submitHandler)({view:this}),this.children.add(this.textAreaView),this.children.add(this.authorInputView),this.children.add(this.saveButtonView),this.children.add(this.cancelButtonView),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.saveButtonView.focus(),this.editor.editing.view.focus(),this.textAreaView.destroy()}focus(){this?.textAreaView?.children?.first?.fieldView?.element.focus()}_createButton(e,t,i,o=!1){const s=new n.ButtonView(this.locale);return s.set({label:e,icon:t,tooltip:!0}),s.extendTemplate({attributes:{class:i}}),o&&s.delegate("execute").to(this,o),s}}class d extends e.Plugin{constructor(e){super(e),this.editor=e,this.updateSelection=!1,this.quoteFormView=!1,this.dropdownView=!1}init(){const{editor:e}=this,t=Drupal.t("Add a quote",{},{context:"CKEditor5 Helfi Quote plugin"});e.ui.componentFactory.add("helfiQuote",(e=>{const i=this.editor.commands.get("helfiQuoteCommand");return this.dropdownView=(0,n.createDropdown)(e),this.dropdownView.buttonView.set({label:t,icon:'\n\n\n \n\n',tooltip:!0}),this.dropdownView.buttonView.unbind("isEnabled"),this.dropdownView.buttonView.bind("isEnabled").to(i,"isEnabled"),this.dropdownView.extendTemplate({attributes:{class:["helfi-quote"]}}),this.dropdownView.panelView.extendTemplate({attributes:{class:["helfi-quote__dropdown-panel","ck-reset_all-excluded"]}}),this.dropdownView.on("change:isOpen",(()=>{this.quoteFormView||(this.quoteFormView=new u(e,this.editor),this.listenTo(this.quoteFormView,"submit",(()=>{const e=this.quoteFormView.textAreaView.textArea.fieldView.element.value||!1,t=this.quoteFormView.authorInputView.fieldView.element.value||!1;i.execute({quoteText:e,author:t}),this._closeFormView()})),this.listenTo(this.quoteFormView,"cancel",(()=>{this._closeFormView()})),this.quoteFormView.keystrokes.set("Esc",((e,t)=>{this._closeFormView(),t()})),this.dropdownView.panelView.children.add(this.quoteFormView),this.dropdownView.panelPosition="sw",this.quoteFormView.delegate("execute").to(this.dropdownView),this.quoteFormView.focus())})),this.dropdownView.on("change:isOpen",(()=>{this._updateQuoteDefaultValues()})),this.dropdownView}))}_updateQuoteDefaultValues(){const{model:e}=this.editor,{selection:t}=e.document;if(this.quoteFormView)if(t.isCollapsed)this.quoteFormView.textAreaView.updateValueBasedOnSelection(),this.quoteFormView.authorInputView.isEmpty=!0,this.quoteFormView.authorInputView.fieldView.element.value="";else{const e=t.getRanges();let i=e.next();for(;!i.done;){const t=i.value.getItems();let o=t.next();for(;!o.done;){const e=o.value;e.data&&("helfiQuoteText"!==e.textNode?.parent?.name&&"paragraph"!==e.textNode?.parent?.name||this.quoteFormView.textAreaView.updateValueBasedOnSelection(e.data),this.quoteFormView.authorInputView.isEmpty="helfiQuoteFooterCite"!==e.textNode?.parent?.name,this.quoteFormView.authorInputView.fieldView.element.value="helfiQuoteFooterCite"===e.textNode?.parent?.name?e.data:"",this.quoteFormView.focus()),o=t.next()}i=e.next()}}}_closeFormView(){this.quoteFormView.textAreaView.textArea.fieldView.element.value=null,this.quoteFormView.authorInputView.fieldView.element.value=null,this.dropdownView&&(this.dropdownView.isOpen=!1)}}class c extends e.Plugin{static get requires(){return[r,d]}}const h={HelfiQuote:c}})(),o=o.default})())); \ No newline at end of file diff --git a/public/modules/custom/helfi_ckeditor/assets/js/build/helfiTable.js b/public/modules/custom/helfi_ckeditor/assets/js/build/helfiTable.js deleted file mode 100644 index 0969e28e..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/build/helfiTable.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.helfiTable=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,r)=>{e.exports=r("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/widget.js":(e,t,r)=>{e.exports=r("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function r(o){var i=t[o];if(void 0!==i)return i.exports;var n=t[o]={exports:{}};return e[o](n,n.exports,r),n.exports}r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var o={};return(()=>{"use strict";r.d(o,{default:()=>n});var e=r("ckeditor5/src/core.js"),t=r("ckeditor5/src/widget.js");class i extends e.Plugin{static get pluginName(){return"HelfiTableCaptionPlugin"}init(){const{editor:e}=this,{conversion:r}=e,o=e.plugins.get("TableUtils"),i=(e={})=>(r,{writer:i})=>{const n=r.getAttribute("headingRows")||0,l=[];n>0&&l.push(i.createContainerElement("thead",null,i.createSlot((e=>e.is("element","tableRow")&&e.indexe.is("element","tableRow")&&e.index>=n))));const s=i.createContainerElement("figure",{class:"table",tabindex:0},[i.createContainerElement("table",null,l),i.createSlot((e=>!e.is("element","tableRow")))]);return e.asWidget?(a=s,i.setCustomProperty("table",!0,a),(0,t.toWidget)(a,i,{hasSelectionHandle:!0})):s;var a};r.for("editingDowncast").elementToStructure({model:{name:"table",attributes:["headingRows"]},view:i({asWidget:!0}),converterPriority:"high"}),r.for("dataDowncast").elementToStructure({model:{name:"table",attributes:["headingRows"]},view:i(),converterPriority:"high"})}}const n={HelfiTable:i}})(),o=o.default})())); \ No newline at end of file diff --git a/public/modules/custom/helfi_ckeditor/assets/js/build/translations/fi.js b/public/modules/custom/helfi_ckeditor/assets/js/build/translations/fi.js deleted file mode 100644 index c503fc12..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/build/translations/fi.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){const i=a.fi=a.fi||{};i.dictionary=Object.assign(i.dictionary||{},{Afrikaans:"afrikaans",Albanian:"albania",Amharic:"amhara",Arabic:"arabia",Armenian:"armenia",Asturian:"asturia",Azerbaijani:"azeri","Bahasa Malaysia":"malaiji",Basque:"baski",Belarusian:"valkovenäjä",Bengali:"bengali",Bosnian:"bosnia",Bulgarian:"bulgaria",Burmese:"burma",Catalan:"katalaani",Chichewa:"njandža",Chinese:"kiina","Chinese, Simplified":"kiina, yksinkertainen","Chinese, Traditional":"kiina, perinteinen",Corsican:"korsika",Croatian:"kroatia",Czech:"tsekki",Danish:"tanska",Dutch:"hollanti",Dzongkha:"dzongkha",English:"englanti",Esperanto:"esperanto",Estonian:"viro",Faeroese:"fäärin kieli",Filipino:"tagalog",Finnish:"suomi",French:"ranska",Frisian:"friisi","Frisian, Western":"friisi, länsimainen",Gaelic:"gaeli",Galician:"galicia",Georgian:"gruusia",German:"saksa",Greek:"kreikka",Gujarati:"gujarati","Haitian Creole":"haitinkreoli",Hausa:"hausa",Hebrew:"heprea",Hindi:"hindi",Hungarian:"unkari",Icelandic:"islanti",Igbo:"igbo",Indonesian:"indonesia",Irish:"iiri",Italian:"italia",Japanese:"japani",Javanese:"jaava",Kannada:"kannada",Kazakh:"kazakki",Khmer:"khmer",Kinyarwanda:"kinyarwanda",Korean:"korea",Kurdish:"kurdi","Kurdish (Kurmanji)":"kurdi",Kyrgyz:"kyrgyz",Lao:"lao",Latin:"latina",Latvian:"latvia",Lithuanian:"liettua",Luxembourgish:"luxemburg",Macedonian:"makedonia",Malagasy:"malagasy",Malay:"malaiji",Malayalam:"malayalam",Maltese:"malta",Maori:"maori",Marathi:"marathi",Mongolian:"mongolia","Myanmar (Burmese)":"burma",Nepali:"nepali",Norwegian:"norja","Norwegian Bokmål":"kirjanorja","Norwegian Nynorsk":"uusnorja",Occitan:"oksitaani","Odia (Oriya)":"odia (orija",Pashto:"pashto",Persian:"persia","Persian, Farsi":"persia, farsi",Polish:"puola",Portuguese:"portugali",Punjabi:"punjabi","Remove language from text":"Poista kieli tekstistä",Romanian:"romania",Russian:"venäjä",Sami:"saami",Samoan:"samoa","Select language":"Valitse kieli",Serbian:"serbia",Sesotho:"sesotho",Shona:"shona",Sindhi:"sindhi",Sinhala:"sinhali",Slovak:"slovakia",Slovenian:"slovenia",Somali:"somali",Spanish:"espanja",Sundanese:"sundaneesi",Swahili:"swahili",Swedish:"ruotsi","Swiss German":"sveitsin saksa",Tajik:"tadžikki",Tamil:"tamili","Tamil, Sri Lanka":"tamili, Sri Lanka",Tatar:"tataari",Telugu:"telugu",Thai:"thai",Tibetan:"tiibetin kieli",Turkish:"turkki",Turkmen:"turkmeeni",Tuvan:"tuva",Ukrainian:"ukraina",Urdu:"urdu",Uyghur:"uiguuri",Uzbek:"uzbekki",Vietnamese:"vietnam",Welsh:"kymri",Xhosa:"xhosa",Yiddish:"jiddiš",Yoruba:"joruba",Zulu:"zulu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/modules/custom/helfi_ckeditor/assets/js/build/translations/sv.js b/public/modules/custom/helfi_ckeditor/assets/js/build/translations/sv.js deleted file mode 100644 index 512dae9c..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/build/translations/sv.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){const i=a.sv=a.sv||{};i.dictionary=Object.assign(i.dictionary||{},{Afrikaans:"afrikaans",Albanian:"albanska",Amharic:"amhariska",Arabic:"arabiska",Armenian:"armeniska",Asturian:"asturiska",Azerbaijani:"azerbajdzjanska","Bahasa Malaysia":"malaysiska",Basque:"baskiska",Belarusian:"vitryska",Bengali:"bengali",Bosnian:"bosniska",Bulgarian:"bulgariska",Burmese:"burmesiska",Catalan:"katalanska",Chichewa:"chichewa",Chinese:"kinesiska","Chinese, Simplified":"kinesiska, förenklad","Chinese, Traditional":"kinesiska, traditionell",Corsican:"korsiska",Croatian:"kroatiska",Czech:"tjeckiska",Danish:"danska",Dutch:"nederländska",Dzongkha:"dzongkha",English:"engelska",Esperanto:"esperanto",Estonian:"estniska",Faeroese:"faeroese",Filipino:"filippinska",Finnish:"finska",French:"franska",Frisian:"frisiska","Frisian, Western":"frisiska, västerländska",Gaelic:"gaeliska",Galician:"galiciska",Georgian:"georgiska",German:"tyska",Greek:"grekiska",Gujarati:"gujarati","Haitian Creole":"haitiska",Hausa:"hausa",Hebrew:"hebreiska",Hindi:"hindi",Hungarian:"ungerska",Icelandic:"isländska",Igbo:"igbo",Indonesian:"indonesiska",Irish:"irländska",Italian:"italienska",Japanese:"japanska",Javanese:"javanesiska",Kannada:"kanaresiska",Kazakh:"kazakiska",Khmer:"khmer",Kinyarwanda:"kinyarwanda",Korean:"koreanska",Kurdish:"kurdiska","Kurdish (Kurmanji)":"kurdiska",Kyrgyz:"kirgiziska",Lao:"laotiska",Latin:"latin",Latvian:"lettiska",Lithuanian:"litauiska",Luxembourgish:"luxemburgska",Macedonian:"makedonska",Malagasy:"malagassiska",Malay:"malaysiska",Malayalam:"malayalam",Maltese:"maltesiska",Maori:"maori",Marathi:"marathi",Mongolian:"mongoliska","Myanmar (Burmese)":"burmesiska",Nepali:"nepali",Norwegian:"norska","Norwegian Bokmål":"norskt bokmål","Norwegian Nynorsk":"nynorsk",Occitan:"occitanska","Odia (Oriya)":"oriya (odia)",Pashto:"pashto",Persian:"persiska","Persian, Farsi":"persiska, farsi",Polish:"polska",Portuguese:"portugisiska",Punjabi:"punjabi","Remove language from text":"Ta bort språk från text",Romanian:"rumänska",Russian:"ryska",Sami:"sami",Samoan:"samoanska","Select language":"Välja språk",Serbian:"serbiska",Sesotho:"sesotho",Shona:"shona",Sindhi:"sindhi",Sinhala:"singalesiska",Slovak:"slovakiska",Slovenian:"slovenska",Somali:"somaliska",Spanish:"spanska",Sundanese:"sundanesiska",Swahili:"swahili",Swedish:"svenska","Swiss German":"schweizisk tysk",Tajik:"tadzjikiska",Tamil:"tamil","Tamil, Sri Lanka":"tamil, Sri Lanka",Tatar:"tatariska",Telugu:"telugu",Thai:"thailändska",Tibetan:"tibetanska",Turkish:"turkiska",Turkmen:"turkmeniska",Tuvan:"tuvaska",Ukrainian:"ukrainska",Urdu:"urdu",Uyghur:"uiguriska",Uzbek:"uzbekiska",Vietnamese:"vietnamesiska",Welsh:"walesiska",Xhosa:"xhosa",Yiddish:"jiddisch",Yoruba:"yoruba",Zulu:"zul"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/README.md b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/README.md deleted file mode 100644 index 069a09eb..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/README.md +++ /dev/null @@ -1,9 +0,0 @@ -This helfiLanguageSelector plugin is largely based on CKEditor 5's -[block plugin widget tutorial](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/tutorials/implementing-a-block-widget.html), but with added documentation to facilitate better understanding -of CKEditor 5 plugin development and other minor changes. - -Within `/src` are the multiple files that will be used by the build process to -become a CKEditor 5 plugin in `/build`. Technically, everything in these files -could be in a single `index.js` - the only file the MUST be present is -`/src/index.js`. However, splitting the plugin into concern-specific files has -maintainability benefits. diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/lang/translations/en.po b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/lang/translations/en.po deleted file mode 100644 index 881a1e48..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/lang/translations/en.po +++ /dev/null @@ -1,374 +0,0 @@ -msgid "" -msgstr "" - -msgid "Select language" -msgstr "Select language" - -msgid "Remove language from text" -msgstr "Remove language from text" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Amharic" -msgstr "Amharic" - -msgid "Arabic" -msgstr "Arabic" - -msgid "Asturian" -msgstr "Asturian" - -msgid "Azerbaijani" -msgstr "Azerbaijani" - -msgid "Bahasa Malaysia" -msgstr "Bahasa Malaysia" - -msgid "Belarusian" -msgstr "Belarusian" - -msgid "Bulgarian" -msgstr "Bulgarian" - -msgid "Burmese" -msgstr "Bulgarian" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Bosnian" -msgstr "Bosnian" - -msgid "Catalan" -msgstr "Catalan" - -msgid "Chinese, Simplified" -msgstr "Chinese, Simplified" - -msgid "Chinese, Traditional" -msgstr "Chinese, Traditional" - -msgid "Corsican" -msgstr "Corsican" - -msgid "Czech" -msgstr "Czech" - -msgid "Welsh" -msgstr "Welsh" - -msgid "Danish" -msgstr "Danish" - -msgid "German" -msgstr "German" - -msgid "Greek" -msgstr "Greek" - -msgid "English" -msgstr "English" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanish" - -msgid "Estonian" -msgstr "Estonian" - -msgid "Basque" -msgstr "Basque" - -msgid "Persian" -msgstr "Persian" - -msgid "Finnish" -msgstr "Finnish" - -msgid "Faeroese" -msgstr "Faeroese" - -msgid "French" -msgstr "French" - -msgid "Frisian" -msgstr "Frisian" - -msgid "Frisian, Western" -msgstr "Frisian, Western" - -msgid "Irish" -msgstr "Irish" - -msgid "Gaelic" -msgstr "Gaelic" - -msgid "Galician" -msgstr "Galician" - -msgid "Gujarati" -msgstr "Gujarati" - -msgid "Hausa" -msgstr "Hausa" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croatian" - -msgid "Haitian Creole" -msgstr "Haitian Creole" - -msgid "Hungarian" -msgstr "Hungarian" - -msgid "Armenian" -msgstr "Armenian" - -msgid "Indonesian" -msgstr "Indonesian" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Icelandic" -msgstr "Icelandic" - -msgid "Italian" -msgstr "Italian" - -msgid "Hebrew" -msgstr "Hebrew" - -msgid "Japanese" -msgstr "Japanese" - -msgid "Javanese" -msgstr "Javanese" - -msgid "Georgian" -msgstr "Georgian" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Korean" - -msgid "Kurdish" -msgstr "Kurdish" - -msgid "Kurdish (Kurmanji)" -msgstr "Kurdish (Kurmanji)" - -msgid "Kyrgyz" -msgstr "Kyrgyz" - -msgid "Latin" -msgstr "Latin" - -msgid "Luxembourgish" -msgstr "Luxembourgish" - -msgid "Lao" -msgstr "Lao" - -msgid "Lithuanian" -msgstr "Lithuanian" - -msgid "Latvian" -msgstr "Latvian" - -msgid "Malagasy" -msgstr "Malagasy" - -msgid "Maori" -msgstr "Maori" - -msgid "Macedonian" -msgstr "Macedonian" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolian" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malay" - -msgid "Maltese" -msgstr "Maltese" - -msgid "Myanmar (Burmese)" -msgstr "Myanmar (Burmese)" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Dutch" - -msgid "Norwegian" -msgstr "Norwegian" - -msgid "Norwegian Bokmål" -msgstr "Norwegian Bokmål" - -msgid "Norwegian Nynorsk" -msgstr "Norwegian Nynorsk" - -msgid "Occitan" -msgstr "Occitan" - -msgid "Persian, Farsi" -msgstr "Persian, Farsi" - -msgid "Chichewa" -msgstr "Chichewa" - -msgid "Odia (Oriya)" -msgstr "Odia (Oriya)" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polish" - -msgid "Pashto" -msgstr "Pashto" - -msgid "Portuguese" -msgstr "Portuguese" - -msgid "Romanian" -msgstr "Romanian" - -msgid "Russian" -msgstr "Russian" - -msgid "Kinyarwanda" -msgstr "Kinyarwanda" - -msgid "Sindhi" -msgstr "Sindhi" - -msgid "Sami" -msgstr "Sami" - -msgid "Sinhala" -msgstr "Sinhala" - -msgid "Slovak" -msgstr "Slovak" - -msgid "Slovenian" -msgstr "Slovenian" - -msgid "Samoan" -msgstr "Samoan" - -msgid "Shona" -msgstr "Shona" - -msgid "Somali" -msgstr "Somali" - -msgid "Albanian" -msgstr "Albanian" - -msgid "Serbian" -msgstr "Serbian" - -msgid "Sesotho" -msgstr "Sesotho" - -msgid "Sundanese" -msgstr "Sundanese" - -msgid "Swedish" -msgstr "Swedish" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Swiss German" -msgstr "Swiss German" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Tamil, Sri Lanka" -msgstr "Tamil, Sri Lanka" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tajik" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "Turkmen" - -msgid "Filipino" -msgstr "Filipino" - -msgid "Tibetan" -msgstr "Tibetan" - -msgid "Turkish" -msgstr "Turkish" - -msgid "Tuvan" -msgstr "Tuvan" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Uyghur" -msgstr "Uyghur" - -msgid "Ukrainian" -msgstr "Ukrainian" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbek" - -msgid "Vietnamese" -msgstr "Vietnamese" - -msgid "Xhosa" -msgstr "Xhosa" - -msgid "Yiddish" -msgstr "Yiddish" - -msgid "Yoruba" -msgstr "Yoruba" - -msgid "Chinese" -msgstr "Chinese" - -msgid "Zulu" -msgstr "Zulu" diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/lang/translations/fi.po b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/lang/translations/fi.po deleted file mode 100644 index 6af03bc7..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/lang/translations/fi.po +++ /dev/null @@ -1,377 +0,0 @@ -msgid "" -msgstr "" - -msgid "Select language" -msgstr "Valitse kieli" - -msgid "Remove language from text" -msgstr "Poista kieli tekstistä" - -msgid "Afrikaans" -msgstr "afrikaans" - -msgid "Amharic" -msgstr "amhara" - -msgid "Asturian" -msgstr "asturia" - -msgid "Arabic" -msgstr "arabia" - -msgid "Azerbaijani" -msgstr "azeri" - -msgid "Bahasa Malaysia" -msgstr "malaiji" - -msgid "Belarusian" -msgstr "valkovenäjä" - -msgid "Bulgarian" -msgstr "bulgaria" - -msgid "Burmese" -msgstr "burma" - -msgid "Bengali" -msgstr "bengali" - -msgid "Bosnian" -msgstr "bosnia" - -msgid "Catalan" -msgstr "katalaani" - -msgid "Chinese, Simplified" -msgstr "kiina, yksinkertainen" - -msgid "Chinese, Traditional" -msgstr "kiina, perinteinen" - -msgid "Corsican" -msgstr "korsika" - -msgid "Czech" -msgstr "tsekki" - -msgid "Dzongkha" -msgstr "dzongkha" - -msgid "Welsh" -msgstr "kymri" - -msgid "Danish" -msgstr "tanska" - -msgid "German" -msgstr "saksa" - -msgid "Greek" -msgstr "kreikka" - -msgid "English" -msgstr "englanti" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "espanja" - -msgid "Estonian" -msgstr "viro" - -msgid "Basque" -msgstr "baski" - -msgid "Persian" -msgstr "persia" - -msgid "Finnish" -msgstr "suomi" - -msgid "Faeroese" -msgstr "fäärin kieli" - -msgid "French" -msgstr "ranska" - -msgid "Frisian" -msgstr "friisi" - -msgid "Frisian, Western" -msgstr "friisi, länsimainen" - -msgid "Irish" -msgstr "iiri" - -msgid "Gaelic" -msgstr "gaeli" - -msgid "Galician" -msgstr "galicia" - -msgid "Gujarati" -msgstr "gujarati" - -msgid "Hausa" -msgstr "hausa" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "kroatia" - -msgid "Haitian Creole" -msgstr "haitinkreoli" - -msgid "Hungarian" -msgstr "unkari" - -msgid "Armenian" -msgstr "armenia" - -msgid "Indonesian" -msgstr "indonesia" - -msgid "Igbo" -msgstr "igbo" - -msgid "Icelandic" -msgstr "islanti" - -msgid "Italian" -msgstr "italia" - -msgid "Hebrew" -msgstr "heprea" - -msgid "Japanese" -msgstr "japani" - -msgid "Javanese" -msgstr "jaava" - -msgid "Georgian" -msgstr "gruusia" - -msgid "Kazakh" -msgstr "kazakki" - -msgid "Khmer" -msgstr "khmer" - -msgid "Kannada" -msgstr "kannada" - -msgid "Korean" -msgstr "korea" - -msgid "Kurdish" -msgstr "kurdi" - -msgid "Kurdish (Kurmanji)" -msgstr "kurdi" - -msgid "Kyrgyz" -msgstr "kyrgyz" - -msgid "Latin" -msgstr "latina" - -msgid "Luxembourgish" -msgstr "luxemburg" - -msgid "Lao" -msgstr "lao" - -msgid "Lithuanian" -msgstr "liettua" - -msgid "Latvian" -msgstr "latvia" - -msgid "Malagasy" -msgstr "malagasy" - -msgid "Maori" -msgstr "maori" - -msgid "Macedonian" -msgstr "makedonia" - -msgid "Malayalam" -msgstr "malayalam" - -msgid "Mongolian" -msgstr "mongolia" - -msgid "Marathi" -msgstr "marathi" - -msgid "Malay" -msgstr "malaiji" - -msgid "Maltese" -msgstr "malta" - -msgid "Myanmar (Burmese)" -msgstr "burma" - -msgid "Nepali" -msgstr "nepali" - -msgid "Dutch" -msgstr "hollanti" - -msgid "Norwegian" -msgstr "norja" - -msgid "Norwegian Bokmål" -msgstr "kirjanorja" - -msgid "Norwegian Nynorsk" -msgstr "uusnorja" - -msgid "Occitan" -msgstr "oksitaani" - -msgid "Persian, Farsi" -msgstr "persia, farsi" - -msgid "Chichewa" -msgstr "njandža" - -msgid "Odia (Oriya)" -msgstr "odia (orija" - -msgid "Punjabi" -msgstr "punjabi" - -msgid "Polish" -msgstr "puola" - -msgid "Pashto" -msgstr "pashto" - -msgid "Portuguese" -msgstr "portugali" - -msgid "Romanian" -msgstr "romania" - -msgid "Russian" -msgstr "venäjä" - -msgid "Kinyarwanda" -msgstr "kinyarwanda" - -msgid "Sindhi" -msgstr "sindhi" - -msgid "Sami" -msgstr "saami" - -msgid "Sinhala" -msgstr "sinhali" - -msgid "Slovak" -msgstr "slovakia" - -msgid "Slovenian" -msgstr "slovenia" - -msgid "Samoan" -msgstr "samoa" - -msgid "Shona" -msgstr "shona" - -msgid "Somali" -msgstr "somali" - -msgid "Albanian" -msgstr "albania" - -msgid "Serbian" -msgstr "serbia" - -msgid "Sesotho" -msgstr "sesotho" - -msgid "Sundanese" -msgstr "sundaneesi" - -msgid "Swedish" -msgstr "ruotsi" - -msgid "Swahili" -msgstr "swahili" - -msgid "Swiss German" -msgstr "sveitsin saksa" - -msgid "Tamil" -msgstr "tamili" - -msgid "Tamil, Sri Lanka" -msgstr "tamili, Sri Lanka" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "tadžikki" - -msgid "Thai" -msgstr "thai" - -msgid "Turkmen" -msgstr "turkmeeni" - -msgid "Filipino" -msgstr "tagalog" - -msgid "Tatar" -msgstr "tataari" - -msgid "Tibetan" -msgstr "tiibetin kieli" - -msgid "Turkish" -msgstr "turkki" - -msgid "Tuvan" -msgstr "tuva" - -msgid "Uyghur" -msgstr "uiguuri" - -msgid "Ukrainian" -msgstr "ukraina" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "uzbekki" - -msgid "Vietnamese" -msgstr "vietnam" - -msgid "Xhosa" -msgstr "xhosa" - -msgid "Yiddish" -msgstr "jiddiš" - -msgid "Yoruba" -msgstr "joruba" - -msgid "Chinese" -msgstr "kiina" - -msgid "Zulu" -msgstr "zulu" diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/lang/translations/sv.po b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/lang/translations/sv.po deleted file mode 100644 index 78d044d8..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/lang/translations/sv.po +++ /dev/null @@ -1,377 +0,0 @@ -msgid "" -msgstr "" - -msgid "Select language" -msgstr "Välja språk" - -msgid "Remove language from text" -msgstr "Ta bort språk från text" - -msgid "Afrikaans" -msgstr "afrikaans" - -msgid "Amharic" -msgstr "amhariska" - -msgid "Arabic" -msgstr "arabiska" - -msgid "Asturian" -msgstr "asturiska" - -msgid "Azerbaijani" -msgstr "azerbajdzjanska" - -msgid "Bahasa Malaysia" -msgstr "malaysiska" - -msgid "Belarusian" -msgstr "vitryska" - -msgid "Bulgarian" -msgstr "bulgariska" - -msgid "Burmese" -msgstr "burmesiska" - -msgid "Bengali" -msgstr "bengali" - -msgid "Bosnian" -msgstr "bosniska" - -msgid "Catalan" -msgstr "katalanska" - -msgid "Chinese, Simplified" -msgstr "kinesiska, förenklad" - -msgid "Chinese, Traditional" -msgstr "kinesiska, traditionell" - -msgid "Corsican" -msgstr "korsiska" - -msgid "Czech" -msgstr "tjeckiska" - -msgid "Welsh" -msgstr "walesiska" - -msgid "Danish" -msgstr "danska" - -msgid "Dzongkha" -msgstr "dzongkha" - -msgid "German" -msgstr "tyska" - -msgid "Greek" -msgstr "grekiska" - -msgid "English" -msgstr "engelska" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "spanska" - -msgid "Estonian" -msgstr "estniska" - -msgid "Basque" -msgstr "baskiska" - -msgid "Persian" -msgstr "persiska" - -msgid "Finnish" -msgstr "finska" - -msgid "Faeroese" -msgstr "faeroese" - -msgid "French" -msgstr "franska" - -msgid "Frisian" -msgstr "frisiska" - -msgid "Frisian, Western" -msgstr "frisiska, västerländska" - -msgid "Irish" -msgstr "irländska" - -msgid "Gaelic" -msgstr "gaeliska" - -msgid "Galician" -msgstr "galiciska" - -msgid "Gujarati" -msgstr "gujarati" - -msgid "Hausa" -msgstr "hausa" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "kroatiska" - -msgid "Haitian Creole" -msgstr "haitiska" - -msgid "Hungarian" -msgstr "ungerska" - -msgid "Armenian" -msgstr "armeniska" - -msgid "Indonesian" -msgstr "indonesiska" - -msgid "Igbo" -msgstr "igbo" - -msgid "Icelandic" -msgstr "isländska" - -msgid "Italian" -msgstr "italienska" - -msgid "Hebrew" -msgstr "hebreiska" - -msgid "Japanese" -msgstr "japanska" - -msgid "Javanese" -msgstr "javanesiska" - -msgid "Georgian" -msgstr "georgiska" - -msgid "Kazakh" -msgstr "kazakiska" - -msgid "Khmer" -msgstr "khmer" - -msgid "Kannada" -msgstr "kanaresiska" - -msgid "Korean" -msgstr "koreanska" - -msgid "Kurdish" -msgstr "kurdiska" - -msgid "Kurdish (Kurmanji)" -msgstr "kurdiska" - -msgid "Kyrgyz" -msgstr "kirgiziska" - -msgid "Latin" -msgstr "latin" - -msgid "Luxembourgish" -msgstr "luxemburgska" - -msgid "Lao" -msgstr "laotiska" - -msgid "Lithuanian" -msgstr "litauiska" - -msgid "Latvian" -msgstr "lettiska" - -msgid "Malagasy" -msgstr "malagassiska" - -msgid "Maori" -msgstr "maori" - -msgid "Macedonian" -msgstr "makedonska" - -msgid "Malayalam" -msgstr "malayalam" - -msgid "Mongolian" -msgstr "mongoliska" - -msgid "Marathi" -msgstr "marathi" - -msgid "Malay" -msgstr "malaysiska" - -msgid "Maltese" -msgstr "maltesiska" - -msgid "Myanmar (Burmese)" -msgstr "burmesiska" - -msgid "Nepali" -msgstr "nepali" - -msgid "Dutch" -msgstr "nederländska" - -msgid "Norwegian" -msgstr "norska" - -msgid "Norwegian Bokmål" -msgstr "norskt bokmål" - -msgid "Norwegian Nynorsk" -msgstr "nynorsk" - -msgid "Occitan" -msgstr "occitanska" - -msgid "Persian, Farsi" -msgstr "persiska, farsi" - -msgid "Chichewa" -msgstr "chichewa" - -msgid "Odia (Oriya)" -msgstr "oriya (odia)" - -msgid "Punjabi" -msgstr "punjabi" - -msgid "Polish" -msgstr "polska" - -msgid "Pashto" -msgstr "pashto" - -msgid "Portuguese" -msgstr "portugisiska" - -msgid "Romanian" -msgstr "rumänska" - -msgid "Russian" -msgstr "ryska" - -msgid "Kinyarwanda" -msgstr "kinyarwanda" - -msgid "Sindhi" -msgstr "sindhi" - -msgid "Sami" -msgstr "sami" - -msgid "Sinhala" -msgstr "singalesiska" - -msgid "Slovak" -msgstr "slovakiska" - -msgid "Slovenian" -msgstr "slovenska" - -msgid "Samoan" -msgstr "samoanska" - -msgid "Shona" -msgstr "shona" - -msgid "Somali" -msgstr "somaliska" - -msgid "Albanian" -msgstr "albanska" - -msgid "Serbian" -msgstr "serbiska" - -msgid "Sesotho" -msgstr "sesotho" - -msgid "Sundanese" -msgstr "sundanesiska" - -msgid "Swedish" -msgstr "svenska" - -msgid "Swahili" -msgstr "swahili" - -msgid "Swiss German" -msgstr "schweizisk tysk" - -msgid "Tamil" -msgstr "tamil" - -msgid "Tamil, Sri Lanka" -msgstr "tamil, Sri Lanka" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "tadzjikiska" - -msgid "Thai" -msgstr "thailändska" - -msgid "Turkmen" -msgstr "turkmeniska" - -msgid "Filipino" -msgstr "filippinska" - -msgid "Tatar" -msgstr "tatariska" - -msgid "Tibetan" -msgstr "tibetanska" - -msgid "Turkish" -msgstr "turkiska" - -msgid "Tuvan" -msgstr "tuvaska" - -msgid "Uyghur" -msgstr "uiguriska" - -msgid "Ukrainian" -msgstr "ukrainska" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "uzbekiska" - -msgid "Vietnamese" -msgstr "vietnamesiska" - -msgid "Xhosa" -msgstr "xhosa" - -msgid "Yiddish" -msgstr "jiddisch" - -msgid "Yoruba" -msgstr "yoruba" - -msgid "Chinese" -msgstr "kinesiska" - -msgid "Zulu" -msgstr "zul" diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/helfiLanguageSelector.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/helfiLanguageSelector.js deleted file mode 100644 index e3b4b804..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/helfiLanguageSelector.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * @file This is what CKEditor refers to as a master (glue) plugin. Its role is - * just to load the “editing” and “UI” components of this Plugin. Those - * components could be included in this file, but - * - * I.e, this file's purpose is to integrate all the separate parts of the plugin - * before it's made discoverable via index.js. - */ -// The contents of helfiLanguageSelectorUI and helfiLanguageSelector editing -// could be included in this file, but it is recommended to separate -// these concerns in different files. -import { Plugin } from 'ckeditor5/src/core'; -import HelfiLanguageSelectorEditing from './helfiLanguageSelectorEditing'; -import HelfiLanguageSelectorUi from './helfiLanguageSelectorUi'; - -export default class HelfiLanguageSelector extends Plugin { - // Note that helfiLanguageSelectorEditing and helfiLanguageSelectorUI also - // extend `Plugin`, but these are not seen as individual plugins by CKEditor5. - // CKEditor 5 will only discover the plugins explicitly exported in index.js. - static get requires() { - return [ - HelfiLanguageSelectorEditing, - HelfiLanguageSelectorUi - ]; - } - -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/helfiLanguageSelectorEditing.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/helfiLanguageSelectorEditing.js deleted file mode 100644 index ebbb4997..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/helfiLanguageSelectorEditing.js +++ /dev/null @@ -1,88 +0,0 @@ -/** - * @file A view to model and model to view converters for helfiLanguageSelector. - */ -import { Plugin } from 'ckeditor5/src/core'; -import { Widget } from 'ckeditor5/src/widget'; -import { stringifyLanguageAttribute, parseLanguageAttribute } from './utils/utils'; -import HelfiLanguageSelectorCommand from './ui/helfiLanguageSelectorCommand'; - -/** - * CKEditor 5 plugins do not work directly with the DOM. They are defined as - * plugin-specific data models that are then converted to markup that - * is inserted in the DOM. - * - * This file has the logic for defining the helfiLanguageSelector model, - * and for how it is converted to standard DOM markup. - */ -export default class HelfiLanguageSelectorEditing extends Plugin { - static get requires() { - return [ Widget ]; - } - - /** - * @inheritdoc - */ - static get pluginName() { - return 'HelfiLanguageSelectorEditing'; - } - - /** - * @inheritDoc - */ - init() { - const { editor } = this; - const { conversion } = this.editor; - - // Add helfiLanguageSelector model as an allowed attribute for '$text' nodes. - editor.model.schema.extend('$text', { allowAttributes: 'helfiLanguageSelector' }); - editor.model.schema.setAttributeProperties('helfiLanguageSelector', { - copyOnEnter: true - }); - - // Define 'upcast' converter for helfiLanguageSelector. - conversion.for('upcast').elementToAttribute({ - model: { - key: 'helfiLanguageSelector', - value: (viewElement) => { - const languageCode = viewElement.getAttribute('lang') ?? ''; - const textDirection = viewElement.getAttribute('dir') ?? ''; - return stringifyLanguageAttribute(languageCode.toLowerCase(), textDirection.toLowerCase()); - } - }, - view: { - name: 'span', - attributes: { lang: /[\s\S]+/ } - } - }); - - // Define 'downcast' converter for helfiLanguageSelector. - conversion.for('downcast').attributeToElement({ - model: 'helfiLanguageSelector', - view: (attributeValue, { writer }, data) => { - - if (!attributeValue) { - return; - } - - if (!data.item.is('$textProxy') && !data.item.is('documentSelection')) { - return; - } - - const { languageCode, textDirection } = parseLanguageAttribute(attributeValue); - - return writer.createAttributeElement('span', { - lang: languageCode, - dir: textDirection - }); - } - }); - - // Add helfiLanguageSelectorCommand. - editor.commands.add( - 'helfiLanguageSelectorCommand', - new HelfiLanguageSelectorCommand(editor), - ); - - } - -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/helfiLanguageSelectorUi.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/helfiLanguageSelectorUi.js deleted file mode 100644 index a191db00..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/helfiLanguageSelectorUi.js +++ /dev/null @@ -1,168 +0,0 @@ -/** - * @file registers the helfiLanguageSelectorUi plugin and binds functionality to it. - */ -import { Plugin } from 'ckeditor5/src/core'; -import { createDropdown } from 'ckeditor5/src/ui'; -import { Collection } from 'ckeditor5/src/utils'; -import icon from '../../../../icons/helfiLanguageSelector.svg'; -import LanguageSelectListView from './ui/languageSelectListView'; -import { parseLanguageAttribute } from './utils/utils'; -import translationWarmer from './utils/translationWarmer'; - -/** - * Helper function for getting the current active language code. - * - * @param {string} languageAttribute The language attribute. - * @return {*} Returns the language code if found. - */ -function getCommandValue(languageAttribute) { - if (!languageAttribute) { return; } - const { languageCode } = parseLanguageAttribute(languageAttribute); - if (languageCode) { - return languageCode; - } -} - -export default class HelfiLanguageSelectorUi extends Plugin { - - constructor(editor) { - super(editor); - this.editor = editor; - this.advancedChildren = new Collection(); - this.helfiLanguageSelectorConfig = this.editor.config.get('helfiLanguageSelector'); - this.languageList = this.helfiLanguageSelectorConfig?.language_list; - this.updateSelection = false; - translationWarmer(editor.locale); - } - - init() { - const { editor } = this; - const { t } = editor.locale; - const removeTitle = t('Remove language from text'); - const defaultTitle = t('Select language'); - - // Register the helfiLanguageSelector toolbar button. - editor.ui.componentFactory.add('helfiLanguageSelector', (locale) => { - - // Create the dropdown view. - const dropdownView = createDropdown(locale); - - // Create the toolbar button. - dropdownView.buttonView.set({ - label: defaultTitle, - icon, - tooltip: true, - }); - - // Add class for the dropdown view. - dropdownView.extendTemplate({ - attributes: { - class: [ 'helfi-language-selector'] - } - }); - - // Add custom classes for the dropdown panel view. - dropdownView.panelView.extendTemplate({ - attributes: { - class: [ - 'helfi-language-selector__dropdown-panel', - 'ck-reset_all-excluded', - ] - } - }); - - let selectListView; - let tomSelect; - const languageCommand = this.editor.commands.get('helfiLanguageSelectorCommand'); - - dropdownView.on('change:isOpen', () => { - - if (tomSelect?.options) { - // Set current language as the selected language in tomSelect. - if ( - languageCommand.value && - !tomSelect.items.includes(getCommandValue(languageCommand.value)) - ) { - tomSelect.setValue([ getCommandValue(languageCommand.value) ], true); - } - // Clear the selections in case there is no current language. - else if (!languageCommand.value && tomSelect.items.length > 0) { - tomSelect.clear(); - } - } - - // No need to reinitialize the select list view. - if (selectListView) { - return; - } - - // Create the select list view and add it to the dropdown panel view. - selectListView = new LanguageSelectListView(locale, this.editor); - dropdownView.panelView.children.add(selectListView); - dropdownView.panelPosition = 'sw'; - - // Delegate the execute command from selectListView to dropdownView. - selectListView.delegate('execute').to(dropdownView); - - // The template for the Tom Select options and selected items. - const renderTemplate = (item, escape) => ` - - ${escape(item.title)} - - `; - - // Settings for the Tom Select. - const settings = { - plugins: { - remove_button: { - title: removeTitle, - } - }, - valueField: 'languageCode', - labelField: 'title', - searchField: 'title', - sortField: 'title', - maxOptions: null, - items: [ getCommandValue(languageCommand.value) ], - options: [ - this.languageList.map((language) => ({ ...language, title: t(language.title) })), - ], - create: false, - // Custom rendering functions for options and items - render: { - option: (item, escape) => renderTemplate(item, escape), - item: (item, escape) => renderTemplate(item, escape), - }, - // If the language selection has changed, execute the language command. - onItemAdd: (languageCode) => { - if (languageCommand.value !== languageCode) { - languageCommand.execute({ - languageCode, - textDirection: this.languageList.find( - (language) => language.languageCode === languageCode - ).textDirection, - }); - editor.editing.view.focus(); - } - }, - // If the language selection has been removed, - // execute the language command. - onItemRemove: () => { - if (languageCommand.value) { - languageCommand.execute({ - languageCode: false, - }); - editor.editing.view.focus(); - } - }, - }; - - /* global TomSelect */ - tomSelect = new TomSelect(selectListView.element, settings); - }); - - return dropdownView; - }); - } - -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/index.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/index.js deleted file mode 100644 index 661f6ef0..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/index.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * @file The build process always expects an index.js file. Anything exported - * here will be recognized by CKEditor 5 as an available plugin. Multiple - * plugins can be exported in this one file. - * - * I.e. this file's purpose is to make plugin(s) discoverable. - */ - -import HelfiLanguageSelector from './helfiLanguageSelector'; - -export default { - HelfiLanguageSelector, -}; diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/ui/helfiLanguageSelectorCommand.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/ui/helfiLanguageSelectorCommand.js deleted file mode 100644 index cb074b02..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/ui/helfiLanguageSelectorCommand.js +++ /dev/null @@ -1,110 +0,0 @@ -/** - * @file defines HelfiLanguageSelectorCommand, which is executed when the - * language selector toolbar button is pressed. - */ -import { Command } from 'ckeditor5/src/core'; -import { stringifyLanguageAttribute } from '../utils/utils'; - -export default class HelfiLanguageSelectorCommand extends Command { - - /** - * Executes the command. Applies the attribute to the selection or removes it from the selection. - * - * If `languageCode` is set to `false`, it will remove attributes. - * Otherwise, the attribute will be added. - * - * @param {string} languageCode The language code to be applied to the model. - * @param {string} textDirection The language text direction. - */ - execute({ languageCode, textDirection }) { - const { model } = this.editor; - const doc = model.document; - const { selection } = doc; - const value = languageCode ? stringifyLanguageAttribute(languageCode, textDirection) : false; - - model.change(writer => { - const firstPosition = selection.getFirstPosition(); - const node = firstPosition.textNode || firstPosition.nodeBefore; - - // If only the cursor is selected. - if (selection.isCollapsed) { - if (value) { - // Write the value to selection. - writer.setSelectionAttribute('helfiLanguageSelector', value); - } else if (node) { - // If there is no value, we should remove the helfiLanguageSelector - // attributes. If there is node found, remove the attributes from the - // whole node surrounding the selection. - writer.removeAttribute('helfiLanguageSelector', writer.createRangeOn(node)); - } else { - // Remove the helfiLanguageSelector attributes from current selection. - writer.removeSelectionAttribute('helfiLanguageSelector'); - } - // When there is a selection range selected. - } else { - const ranges = model.schema.getValidRanges(selection.getRanges(), 'helfiLanguageSelector'); - let range = ranges.next(); - - while (!range.done) { - const currentRange = range.value; - - if (value) { - // Write the value to selection. - writer.setAttribute('helfiLanguageSelector', value, currentRange); - } else { - // Remove the helfiLanguageSelector attributes from the current selection range. - writer.removeAttribute('helfiLanguageSelector', currentRange); - } - // Move to the next value. - range = ranges.next(); - } - } - }); - } - - /** - * @inheritDoc - */ - refresh() { - const { model } = this.editor; - const { selection } = model.document; - - this.value = this._getValueFromFirstAllowedNode(); - this.isEnabled = model.schema.checkAttributeInSelection(selection, 'helfiLanguageSelector'); - } - - /** - * Returns the attribute value of the first node in the selection that allows the attribute. - * For a collapsed selection it returns the selection attribute. - * - * @return {string|false} The attribute value or false. - */ - _getValueFromFirstAllowedNode() { - const { model } = this.editor; - const { schema } = model; - const { selection } = model.document; - - if (selection.isCollapsed) { - return selection.getAttribute('helfiLanguageSelector') || false; - } - - const ranges = selection.getRanges(); - let range = ranges.next(); - - while (!range.done) { - const currentRange = range.value; - const items = currentRange.getItems(); - let currentItem = items.next(); - - while (!currentItem.done) { - const item = currentItem.value; - if (schema.checkAttribute(item, 'helfiLanguageSelector')) { - return item.getAttribute('helfiLanguageSelector') || false; - } - currentItem = items.next(); - } - range = ranges.next(); - } - return false; - } -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/ui/languageSelectListView.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/ui/languageSelectListView.js deleted file mode 100644 index 87e614f5..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/ui/languageSelectListView.js +++ /dev/null @@ -1,54 +0,0 @@ -import { View } from 'ckeditor5/src/ui'; -import { getCode } from 'ckeditor5/src/utils'; - -/** - * The LanguageSelectListView class. - */ -export default class LanguageSelectListView extends View { - - /** - * @inheritDoc - */ - constructor(locale, editor) { - super(locale, editor); - const bind = this.bindTemplate; - const { t } = locale; - - this.editor = editor; - - this.set('isOpen', false); - this.set('label'); - this.set('id', null); - - this.setTemplate({ - tag: 'select', - attributes: { - id: bind.to('id'), - class: [ - 'ck-helfi-select-list', - bind.if('isOpen', 'ck-is-open', isOpen => isOpen) - ], - open: bind.if('isOpen'), - placeholder: t('Select language'), - }, - on: { - keydown: bind.to(evt => { - // Need to check target. Otherwise, we would handle space press on - // input[type=text] and it would change checked property - // twice due to default browser handling kicking in too. - if (evt.target === this.element && evt.keyCode === getCode('space')) { - this.isOpen = !this.isOpen; - } - }), - }, - }); - } - - /** - * Focuses the {@link #element} of the details. - */ - focus() { - this.element.focus(); - } - -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/utils/translationWarmer.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/utils/translationWarmer.js deleted file mode 100644 index 556cfdeb..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/utils/translationWarmer.js +++ /dev/null @@ -1,141 +0,0 @@ -/** - * @file defines translationWarmer function. - * The translationWarmer function is workaround for creating translations for - * languages. - * - * As the ckeditor5-dev-translations will pick up only translations which - * are called via t() function, none of the languages would get translated - * without running this function. - * - * If you have an idea how to fix this, please do. - * - * @param {Object} locale The localization services instance. - */ -export default function translationWarmer(locale) { - const { t } = locale; - // Run all the languages through t() to trigger the ckeditor5-dev-utils - // during build. - t('Afrikaans'); - t('Albanian'); - t('Amharic'); - t('Arabic'); - t('Armenian'); - t('Asturian'); - t('Azerbaijani'); - t('Bahasa Malaysia'); - t('Basque'); - t('Belarusian'); - t('Bengali'); - t('Bosnian'); - t('Bulgarian'); - t('Burmese'); - t('Catalan'); - t('Chichewa'); - t('Chinese'); - t('Chinese, Simplified'); - t('Chinese, Traditional'); - t('Corsican'); - t('Croatian'); - t('Czech'); - t('Danish'); - t('Dutch'); - t('Dzongkha'); - t('English'); - t('Esperanto'); - t('Estonian'); - t('Faeroese'); - t('Filipino'); - t('Finnish'); - t('French'); - t('Frisian'); - t('Frisian, Western'); - t('Gaelic'); - t('Galician'); - t('Georgian'); - t('German'); - t('Greek'); - t('Gujarati'); - t('Haitian Creole'); - t('Hausa'); - t('Hebrew'); - t('Hindi'); - t('Hungarian'); - t('Icelandic'); - t('Igbo'); - t('Indonesian'); - t('Irish'); - t('Italian'); - t('Japanese'); - t('Javanese'); - t('Kannada'); - t('Kazakh'); - t('Khmer'); - t('Kinyarwanda'); - t('Korean'); - t('Kurdish (Kurmanji)'); - t('Kurdish'); - t('Kyrgyz'); - t('Lao'); - t('Latin'); - t('Latvian'); - t('Lithuanian'); - t('Luxembourgish'); - t('Macedonian'); - t('Malagasy'); - t('Malay'); - t('Malayalam'); - t('Maltese'); - t('Maori'); - t('Marathi'); - t('Mongolian'); - t('Myanmar (Burmese)'); - t('Nepali'); - t('Norwegian'); - t('Odia (Oriya)'); - t('Pashto'); - t('Persian'); - t('Polish'); - t('Portuguese'); - t('Punjabi'); - t('Romanian'); - t('Russian'); - t('Sami'); - t('Samoan'); - t('Serbian'); - t('Sesotho'); - t('Shona'); - t('Sindhi'); - t('Sinhala'); - t('Slovak'); - t('Slovenian'); - t('Somali'); - t('Spanish'); - t('Sundanese'); - t('Swahili'); - t('Swedish'); - t('Swiss German'); - t('Tajik'); - t('Tamil'); - t('Tamil, Sri Lanka'); - t('Tatar'); - t('Telugu'); - t('Thai'); - t('Tibetan'); - t('Turkish'); - t('Turkmen'); - t('Tuvan'); - t('Ukrainian'); - t('Urdu'); - t('Uyghur'); - t('Uzbek'); - t('Vietnamese'); - t('Welsh'); - t('Xhosa'); - t('Yiddish'); - t('Yoruba'); - t('Zulu'); - t('Norwegian Bokmål'); - t('Norwegian Nynorsk'); - t('Occitan'); - t('Persian, Farsi'); -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/utils/utils.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/utils/utils.js deleted file mode 100644 index 23cb5ed7..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLanguageSelector/src/utils/utils.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @file defines stringifyLanguageAttribute and parseLanguageAttribute functions. - * These functions are based on CKEditor5/language plugin. - */ -import { getLanguageDirection } from 'ckeditor5/src/utils'; - -/** - * Returns the language attribute value in a human-readable text format. - * - * @param {string} languageCode The language code. - * @param {string} textDirection The language text direction. - * @return {string} Returns the human-readable text of lang and dir. - */ -export function stringifyLanguageAttribute(languageCode, textDirection) { - textDirection = textDirection || getLanguageDirection(languageCode); - return `${ languageCode }:${ textDirection }`; -} - -/** - * Retrieves language properties converted to attribute value by - * the stringifyLanguageAttribute function. - * - * @param {string} str The attribute value. - * @return {{textDirection: *, languageCode: *}} The object with properties: - * * languageCode - The language code in the ISO 639 format. - * * textDirection - The language text direction. - */ -export function parseLanguageAttribute(str) { - const [ languageCode, textDirection ] = str.split(':'); - return { languageCode, textDirection }; -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/README.md b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/README.md deleted file mode 100644 index d142a61e..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/README.md +++ /dev/null @@ -1,10 +0,0 @@ -This helfiLink plugin is largely based on CKEditor 5's -[block plugin widget tutorial](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/tutorials/implementing-a-block-widget.html), -but with added documentation to facilitate better understanding of CKEditor 5 -plugin development and other minor changes. - -Within `/src` are the multiple files that will be used by the build process to -become a CKEditor 5 plugin in `/build`. Technically, everything in these files -could be in a single `index.js` - the only file the MUST be present is -`/src/index.js`. However, splitting the plugin into concern-specific files has -maintainability benefits. diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/formElements.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/formElements.js deleted file mode 100644 index 00c63866..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/formElements.js +++ /dev/null @@ -1,69 +0,0 @@ -const formElements = { - linkIcon: { - label: Drupal.t('Icon', {}, { context: 'CKEditor5 Helfi Link plugin' }), - machineName: 'icon', - selectListOptions: {}, - type: 'select', - group: 'advanced', - isVisible: false, - viewAttribute: 'data-hds-icon-start', - }, - linkVariant: { - label: Drupal.t('Design'), - machineName: 'variant', - selectListOptions: { - link: Drupal.t('Normal link', {}, { context: 'CKEditor5 Helfi Link plugin' }), - primary: Drupal.t('Button primary'), - secondary: Drupal.t('Button secondary'), - supplementary: Drupal.t('Button supplementary'), - }, - type: 'select', - group: 'advanced', - isVisible: true, - viewAttribute: 'data-hds-variant', - }, - linkButton: { - machineName: 'data-hds-component', - type: 'static', - viewAttribute: 'data-hds-component', - }, - linkProtocol: { - label: Drupal.t('Protocol', {}, { context: 'CKEditor5 Helfi Link plugin' }), - machineName: 'protocol', - selectListOptions: { - https: 'https://', - tel: 'tel:', - mailto: 'mailto:', - }, - type: 'select', - group: 'helper', - viewAttribute: 'data-protocol', - isVisible: true, - }, - linkNewWindowConfirm: { - label: Drupal.t('The link meets the accessibility requirements', {}, { context: 'CKEditor5 Helfi Link plugin' }), - description: Drupal.t('I have made sure that the description of this link clearly states that it will open in a new tab. See WCAG 3.2.5 accessibility requirement (the link opens in a new tab).', { - '@wcag-techniques': 'https://www.w3.org/WAI/WCAG21/Techniques/general/G200.html', - }, { context: 'CKEditor5 Helfi Link plugin' }), - machineName: 'link-new-window-confirm', - viewAttribute: { - 'target': '_blank', - }, - type: 'checkbox', - group: 'advanced', - isVisible: false, - }, - linkNewWindow: { - label: Drupal.t('Open in new window/tab', {}, { context: 'CKEditor5 Helfi Link plugin' }), - machineName: 'link-new-window', - type: 'checkbox', - group: 'advanced', - isVisible: true, - }, - linkIsExternal: { - machineName: 'data-is-external', - type: 'static', - viewAttribute: 'data-is-external', - }, -}; -export default formElements; diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/helfiLink.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/helfiLink.js deleted file mode 100644 index d1c56f0e..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/helfiLink.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * @file This is what CKEditor refers to as a master (glue) plugin. Its role is - * just to load the “editing” and “UI” components of this Plugin. Those - * components could be included in this file, but - * - * I.e, this file's purpose is to integrate all the separate parts of the plugin - * before it's made discoverable via index.js. - */ -// cSpell:ignore HelfiLinkEditing HelfiLinkUi - -// The contents of HelfiLinkUI and HelfiLink editing could be included in this -// file, but it is recommended to separate these concerns in different files. -import { Plugin } from 'ckeditor5/src/core'; -import HelfiLinkEditing from './helfiLinkEditing'; -import HelfiLinkUi from './helfiLinkUi'; - -export default class HelfiLink extends Plugin { - // Note that HelfiLinkEditing and HelfiLinkUI also extend `Plugin`, but these - // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only - // discover the plugins explicitly exported in index.js. - static get requires() { - return [HelfiLinkEditing, HelfiLinkUi]; - } - -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/helfiLinkEditing.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/helfiLinkEditing.js deleted file mode 100644 index b184cd07..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/helfiLinkEditing.js +++ /dev/null @@ -1,585 +0,0 @@ -/** - * @file A view to model and model to view converters for HelfiLink. - */ -import { Plugin } from 'ckeditor5/src/core'; -import { Widget } from 'ckeditor5/src/widget'; -import { findAttributeRange } from 'ckeditor5/src/typing'; -import { isUrlExternal, parseProtocol } from './utils/utils'; -import formElements from './formElements'; - -/** - * CKEditor 5 plugins do not work directly with the DOM. They are defined as - * plugin-specific data models that are then converted to markup that - * is inserted in the DOM. - * - * This file has the logic for defining the HelfiLink model, and for how it is - * converted to standard DOM markup. - */ -export default class HelfiLinkEditing extends Plugin { - static get requires() { - return [Widget]; - } - - /** - * @inheritdoc - */ - static get pluginName() { - return 'HelfiLinkEditing'; - } - - init() { - Object.keys(formElements).forEach(modelName => { - if (!formElements[modelName].machineName) { return; } - - // Create conversions for model <-> view. - this._convertAttribute(modelName, formElements[modelName].viewAttribute); - - // Remove attributes when unlink button is clicked. - this._removeAttributeOnUnlinkCommandExecute(modelName); - - // Refresh attribute values. - this._refreshAttributeValue(modelName); - }); - - // Define conversions from old link button markup to new button markup. - this._defineHelfiButtonConverters(); - - // Add attributes to linkCommand during its execution. - this._addAttributeOnLinkCommandExecute(Object.keys(formElements)); - } - - /** - * Convert models and attributes between model <-> view. - * - * @param {string} modelName The model name. - * @param {string|object} viewAttribute The view attribute name. - */ - _convertAttribute(modelName, viewAttribute) { - const { editor } = this; - - // Nothing to be done if there are no viewAttribute. - if (!viewAttribute) { return; } - - // Add current model as an allowed attribute for '$text' nodes. - editor.model.schema.extend('$text', { allowAttributes: modelName }); - - // Convert attributes for downcast. - // Model --> View (DOM / Data). - editor.conversion.for('downcast').attributeToElement({ - model: modelName, - view: (modelAttributeValue, { writer }) => { - const attributeValues = {}; - - // Create attribute values based on the type of view attributes types. - if (modelAttributeValue && typeof viewAttribute === 'object') { - attributeValues[Object.keys(viewAttribute)] = viewAttribute[Object.keys(viewAttribute)]; - } else { - attributeValues[viewAttribute] = modelAttributeValue; - } - - // Create the anchor element with the current attributes. - const linkViewElement = writer.createAttributeElement('a', attributeValues, { priority: 5 }); - - // Without it the isLinkElement() will not recognize the link - // and the UI will not show up when the user clicks a link. - writer.setCustomProperty('link', true, linkViewElement); - - return linkViewElement; - }, - }); - - // Handle upcast separately for attributes with object as their definitions. - if (typeof viewAttribute === 'object') { - const viewAttributeKey = Object.keys(viewAttribute)[0]; - const viewAttributeValue = viewAttribute[Object.keys(viewAttribute)]; - - // Convert attributes for upcast. - // View (DOM / Data) --> Model. - this.editor.conversion.for('upcast').attributeToAttribute({ - view: { - name: 'a', - key: viewAttributeKey, - value: viewAttributeValue, - }, - model: { - key: modelName, - value: (viewElement) => !!(viewElement.hasAttribute(viewAttributeKey) && - viewElement.getAttribute(viewAttributeKey) === viewAttributeValue) - }, - }); - } - else if (modelName === 'linkIsExternal' || modelName === 'linkProtocol') { - editor.conversion.for('upcast').elementToAttribute({ - view: 'a', - model: { - key: modelName, - value: viewElement => { - // Check if the view element has an 'href' attribute. - if (!viewElement.hasAttribute('href')) { - return null; // No 'href' attribute, so return null. - } - - // Get the 'href' attribute value. - const url = viewElement.getAttribute('href'); - - // Get whitelisted domains. - const { whiteListedDomains } = this.editor.config.get('link'); - - // Check if 'whiteListedDomains' is not defined or empty. - if (!whiteListedDomains || !url) { - return null; - } - - const isExternal = isUrlExternal(url, whiteListedDomains); - const protocol = parseProtocol(url); - - if (protocol && modelName === 'linkProtocol') { - return protocol; // Return the scheme as 'linkProtocol'. - } - if (isExternal && modelName === 'linkIsExternal') { - return true; // Return true for 'linkIsExternal'. - } - - return null; // Return null for other cases. - }, - }, - converterPriority: 'high', // Set the converter priority. - }); - } - else { - // View (DOM / Data) --> Model. - editor.conversion.for('upcast').elementToAttribute({ - view: { - name: 'a', - attributes: { - [ viewAttribute ]: true - } - }, - model: { - key: modelName, - value: viewElement => viewElement.getAttribute(viewAttribute) - } - }); - } - } - - /** - * Remove attributes on unlink command execution. - * - * @param {string} modelName The model name. - */ - _removeAttributeOnUnlinkCommandExecute(modelName) { - const { editor } = this; - const { model } = this.editor; - const { selection } = model.document; - const unlinkCommand = editor.commands.get('unlink'); - - let isUnlinkingInProgress = false; - - // Make sure all changes are in a single undo step. - // Cancel the original unlink first in the high priority. - unlinkCommand.on('execute', evt => { - if (isUnlinkingInProgress) { - return; - } - - evt.stop(); - - // This single block wraps all changes that should be in a single undo step. - model.change(() => { - // Now, in this single "undo block" let the unlink command flow naturally. - isUnlinkingInProgress = true; - - // Do the unlinking within a single undo step. - editor.execute('unlink'); - - // Let's make sure the next unlinking will also be handled. - isUnlinkingInProgress = false; - - // The actual integration that removes the attribute. - model.change(writer => { - let ranges; - - // Get ranges from collapsed selection. - if (selection.isCollapsed) { - ranges = [ findAttributeRange( - selection.getFirstPosition(), - modelName, - selection.getAttribute(modelName), - model - ) ]; - } - // Get ranges from selected elements. - else { - ranges = model.schema.getValidRanges(selection.getRanges(), modelName); - } - - // Remove the attribute from specified ranges. - if (Array.isArray(ranges)) { - ranges.forEach(range => writer.removeAttribute(modelName, range)); - } - }); - }); - }, { priority: 'high' }); - } - - /** - * Keep the attributes updated whenever editor model changes. - * - * @param {string} modelName The model name. - */ - _refreshAttributeValue(modelName) { - const { editor } = this; - const { model } = this.editor; - const { selection } = model.document; - const linkCommand = editor.commands.get('link'); - - linkCommand.set(modelName, null); - - model.document.on('change', () => { - linkCommand[modelName] = selection.getAttribute(modelName); - }); - } - - /** - * Helfi link button aka HDS-button converters. - * - * With these cast-converters we're able to convert CKEditor 4 markup... - * - * @code - * - * - * Link text - * - * @endcode - * - * ...to this CKEditor5 markup: - * @code - * Link text - * @endcode - * - * The model will be the following. Check formElements for all defined - * custom attribute models. - * @code - * - * Link text - * - * @endcode - */ - _defineHelfiButtonConverters() { - const { editor } = this; - - // Allow link attributes in table cells. - if (editor.model.schema.isRegistered('tableCell')) { - editor.model.schema.extend('tableCell', { allowContentOf: '$block' }); - } - - /** - * Convert the variant from button classes to a usable string. - * - * @param {string} classes Button classes as a string - * @return {string|null} Return the variant as a string or null. - */ - const convertVariants = (classes) => { - const parts = classes.split(' '); // Split the string by spaces - const variantFound = parts.find(part => part.startsWith('hds-button--')); - const hdsButtonFound = parts.find(part => part.endsWith('hds-button')); - - if (variantFound) { - return variantFound.replace('hds-button--', ''); - } - - if (hdsButtonFound) { - return 'primary'; - } - - return null; - }; - - /** - * Convert the icon from icon span classes to a usable string. - * - * @param {Iterable} items Icon span classes as a string - * @return {string|false} Return the icon as a string or null. - */ - const convertIcons = (items) => { - let icon = false; - let next = items.next(); - while (!next.done) { - const item = next.value; - if (item && item.startsWith('hel-icon--')) { - icon = item.replace('hel-icon--', ''); - break; - } - next = items.next(); - } - return icon; - }; - - // Remove obsolete elements from the anchor tag. - editor.conversion.for('upcast').elementToElement({ - view: { name: 'a' }, - model: (viewElement) => { - const helfiButtonLabel = Array.from(viewElement.getChildren()).find( - child => - child.name === 'span' && - child.hasClass('hds-button__label') - ); - - // Check if current anchor has a hds-button__label span and convert it - // to simple text if it exists. - if (helfiButtonLabel) { - const anchorChildren = Array.from(viewElement.getChildren()); - const numOfChildren = anchorChildren.length; - - // Remove the span elements from anchor. - if (numOfChildren > 0) { - viewElement._removeChildren(0, numOfChildren); - } - - // Convert possible icon span to data-hds-icon-start. - anchorChildren.forEach(child => { - if (child.name === 'span' && child.hasClass('hel-icon')) { - const icon = convertIcons(child.getClassNames()); - if (icon) { - viewElement._setAttribute('data-hds-icon-start', icon); - } - } - }); - - // Add the former span hds-button__label contents to anchor. - Array.from(helfiButtonLabel.getChildren()).forEach(child => { - viewElement._appendChild(child); - }); - } - - // Check if there are obsolete elements inside the anchor - // and clear them as well. - const orphanedSpan = Array.from(viewElement.getChildren()).find( - element => { - // Check only an existence of span elements. - if (element.name && element.name === 'span') { - - // Let only language attributes pass, - // otherwise return the element. - if ( - element.getAttribute('dir') || - element.getAttribute('lang') - ) { - return false; - } - return element; - } - return false; - } - ); - - // Remove the orphaned and insert its children to the . - if (orphanedSpan) { - viewElement._removeChildren(orphanedSpan.index, 1); - Array.from(orphanedSpan.getChildren()).forEach(child => { - viewElement._appendChild(child); - }); - } - - // Remove obsolete data-protocol attributes. - if ( - viewElement.hasAttribute('data-protocol') && - viewElement.getAttribute('data-protocol').startsWith('http') - ) { - viewElement._removeAttribute('data-protocol'); - } - return viewElement; - }, - converterPriority: 'highest', - }); - - // Convert CKE4 data-design attribute to linkVariant model. - editor.conversion.for('upcast').attributeToAttribute({ - view: { - name: 'a', - key: 'data-design' - }, - model: { - key: 'linkVariant', - value: (viewElement) => { - let match; - - // Trust classes instead of old data-design attribute. - if (viewElement.hasClass('hds-button')) { - match = convertVariants([...viewElement._classes].join(' ')); - if (!match) { - match = convertVariants(viewElement.getAttribute('data-design')); - } - } - - // We don't need primary variant. - if (match && match === 'primary') { - match = null; - } - return match; - } - } - }); - - // Convert CKE4 data-design attribute to linkButton model. - editor.conversion.for('upcast').attributeToAttribute({ - view: { - name: 'a', - key: 'data-design' - }, - model: { - key: 'linkButton', - value: (viewElement) => { - let match; - - // Trust classes instead of old data-design attribute. - if (viewElement.hasClass('hds-button')) { - match = convertVariants([...viewElement._classes].join(' ')); - if (!match) { - match = convertVariants(viewElement.getAttribute('data-design')); - } - } - return match ? 'button' : false; - } - } - }); - - // Convert CKE4 "hds-button" class attribute to linkButton model. - editor.conversion.for('upcast').attributeToAttribute({ - view: { - name: 'a', - key: 'class', - value: 'hds-button' - }, - model: { - key: 'linkButton', - value: 'button', - } - }); - - // Convert data-protocol attribute to linkProtocol model. - editor.conversion.for('upcast').attributeToAttribute({ - view: { - name: 'a', - key: 'data-protocol' - }, - model: { - key: 'linkProtocol', - value: (viewElement) => { - // If protocol is http or https, remove it as we don't need them. - const handleProtocol = (protocol) => ( - protocol === 'https' || protocol === 'http' - ) ? false : protocol; - return handleProtocol(viewElement.getAttribute('data-protocol')); - } - }, - converterPriority: 'highest', - }); - - // Convert data-selected-icon attribute to linkIcon model. - editor.conversion.for('upcast').attributeToAttribute({ - view: { - name: 'a', - key: 'data-selected-icon', - }, - model: { - key: 'linkIcon', - } - }); - } - - /** - * Add attributes to linkCommand during its execution. - * - * @param {object} modelNames All model names. - */ - _addAttributeOnLinkCommandExecute(modelNames) { - const { editor } = this; - const linkCommand = editor.commands.get('link'); - let linkCommandExecuting = false; - - linkCommand.on('execute', (evt, args) => { - // Custom handling is only required if an attribute was passed - // into editor.execute('link', ...). - if (args.length < 3) { - return; - } - if (linkCommandExecuting) { - linkCommandExecuting = false; - return; - } - - // If the additional attribute was passed, we stop the default execution - // of the LinkCommand. We're going to create Model#change() block for undo - // and execute the LinkCommand together with setting the attribute. - evt.stop(); - - // Prevent infinite recursion by keeping records of when link command - // is being executed by this function. - linkCommandExecuting = true; - const attributeValues = args[args.length - 1]; - const { model } = editor; - const { selection } = model.document; - - // Wrapping the original command execution in a model.change() to make - // sure there's a single undo step when the attribute is added. - model.change(writer => { - editor.execute('link', ...args); - - // Determine the selection range and add/remove the attributes to the - // node or range. - modelNames.forEach(modelName => { - if (selection.isCollapsed) { - // Get the current selection textNode or the nodeBefore the selection. - // If neither are available, create a range from root position. - const writtenRange = (position) => { - const node = position.textNode || position.nodeBefore; - if (!node) { - const range = writer.createRange(position); - writer.setSelection(range); - return range; - } - return writer.createRangeOn(node); - }; - - // Set or remove attributes. - if (attributeValues[modelName]) { - writer.setAttribute(modelName, attributeValues[modelName], writtenRange(selection.getFirstPosition())); - } else { - writer.removeAttribute(modelName, writtenRange(selection.getFirstPosition())); - } - writer.removeSelectionAttribute(modelName); - } else { - const ranges = model.schema.getValidRanges(selection.getRanges(), modelName); - let range = ranges.next(); - - while (!range.done) { - const currentRange = range.value; - - if (attributeValues[modelName]) { - writer.setAttribute(modelName, attributeValues[modelName], currentRange); - } else { - writer.removeAttribute(modelName, currentRange); - } - range = ranges.next(); - } - } - }); - }); - }, { priority: 'high' }); - } -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/helfiLinkUi.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/helfiLinkUi.js deleted file mode 100644 index 1f238f3a..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/helfiLinkUi.js +++ /dev/null @@ -1,633 +0,0 @@ -/** - * @file registers the HelfiLinkUi plugin and binds functionality to it. - */ - -import { Plugin } from 'ckeditor5/src/core'; -import { - createLabeledInputText, - LabeledFieldView, -} from 'ckeditor5/src/ui'; - -import { Collection } from 'ckeditor5/src/utils'; -import HelfiCheckBoxView from './ui/helfiCheckBoxView'; -import HelfiLinkProtocolView from './ui/helfiLinkProtocolView'; -import formElements from './formElements'; -import HelfiDetailsView from './ui/helfiDetailsView'; -import HelfiLinkVariantView from './ui/helfiLinkVariantView'; -import HelfiLinkIconView from './ui/helfiLinkIconView'; -import { isUrlExternal, parseProtocol } from './utils/utils'; - -export default class HelfiLinkUi extends Plugin { - - constructor(editor) { - super(editor); - this.editor = editor; - this.advancedChildren = new Collection(); - this.formElements = formElements; - this.helfiContextualBalloonInitialized = false; - } - - init() { - // TRICKY: Work-around until the CKEditor team offers a better solution: - // Force the ContextualBalloon to get instantiated early. - // https://github.com/ckeditor/ckeditor5/commit/c276c45a934e4ad7c2a8ccd0bd9a01f6442d4cd3#diff-1753317a1a0b947ca8b66581b533616a5309f6d4236a527b9d21ba03e13a78d8. - if (this.editor.plugins.get('LinkUI')._createViews) { - this.editor.plugins.get('LinkUI')._createViews(); - } - - // Add a wrapper classes for the link form view. - this._addContextualBalloonClass(); - - // Copy the same solution from LinkUI as pointed out on - // https://www.drupal.org/project/drupal/issues/3317769#comment-14985648 and - // https://git.drupalcode.org/project/drupal/-/merge_requests/2909/diffs?commit_id=cc2cece3be1a9513b02a53d8a6862a6841ef4d5a. - this.editor.plugins - .get('ContextualBalloon') - .on('change:visibleView', (evt, propertyName, newValue, oldValue) => { - - // Get the LinkUI form view. - const linkFormView = this.editor.plugins.get('LinkUI').formView; - - // Check that we're handling the last linkFormView. - // The 'set:visibleView' will trigger twice as we need to set - // the contextual balloon classes in _addContextualBalloonClass(). - if ( - newValue === oldValue || - newValue !== linkFormView || - !this.helfiContextualBalloonInitialized - ) { - return; - } - - // Add custom fields from formElements. - const models = Object.keys(this.formElements).reverse(); - - // Iterate through formElements and create fields accordingly. - models.forEach(modelName => { - // Skip form elements without machine names. - if (!this.formElements[modelName].machineName) { return; } - - // Create form fields. - const formField = this._createFormField(modelName, linkFormView); - - // If form field is marked as part of advanced settings, - // add it to advancedChildren object. - if ( - this.formElements[modelName].group && - this.formElements[modelName].group === 'advanced' && - typeof formField !== 'undefined' - ) { - this.advancedChildren.add(formField); - } - }); - - // Move all fields with group:advanced setting to under advanced - // settings accordion. - this._createAdvancedSettingsAccordion(linkFormView); - - // Iterate through formElements and load data from LinkCommand plugin - // to each form field. This needs to be run after the - // _createAdvancedSettingsAccordion() as TomSelect library requires - // rendered markup to attach itself to. - models.forEach(modelName => { - // Skip form elements without machine names. - if (!this.formElements[modelName].machineName) { return; } - - // Load existing data into form field. - this._handleDataLoadingIntoFormField(modelName, linkFormView); - }); - - // Add a descriptive text to URL input field. - if (!linkFormView.urlInputView.infoText) { - linkFormView.urlInputView.infoText = Drupal.t( - 'Start typing to find content.', - {}, - { context: 'CKEditor5 Helfi Link plugin' } - ); - } - - // Add logic to checkboxes. - this._handleCheckboxes(linkFormView); - - // Handle form field submit. - this._handleFormFieldSubmit(models); - }); - } - - /** - * Add a wrapper class to the contextual balloon panel when the LinkUI button - * has been clicked. - * - * Note! This hacky way of removing and re-adding the link form view was the - * only way to add class to its surrounding contextual balloon at the time - * this plugin customization was being developed. - */ - _addContextualBalloonClass() { - const { editor } = this; - - // Copy the same solution from LinkUI as pointed out on - // https://www.drupal.org/project/drupal/issues/3317769#comment-14985648 and - // https://git.drupalcode.org/project/drupal/-/merge_requests/2909/diffs?commit_id=cc2cece3be1a9513b02a53d8a6862a6841ef4d5a. - editor.plugins - .get('ContextualBalloon') - .on('set:visibleView', (evt, propertyName, newValue, oldValue) => { - // Add a wrapper classes for the link form view. - const linkFormView = editor.plugins.get('LinkUI').formView; - if (newValue === oldValue || newValue !== linkFormView) { - return; - } - - const contextualBalloonPlugin = this.editor.plugins.get('ContextualBalloon'); - - if ( - !contextualBalloonPlugin.hasView(linkFormView) || - contextualBalloonPlugin.view.element.classList.contains('helfi-contextual-balloon') - ) { - return; - } - - linkFormView.template.attributes.class.push('helfi-link-form'); - linkFormView.template.attributes.class.push('ck-reset_all-excluded'); - - // There should be an easier way to add classes to contextual balloon - // plugin than removing and adding the view with custom settings. - contextualBalloonPlugin.remove(newValue); - contextualBalloonPlugin.add({ - view: linkFormView, - position: contextualBalloonPlugin._getBalloonPosition(), - balloonClassName: 'helfi-contextual-balloon', - withArrow: false, - }); - this.helfiContextualBalloonInitialized = true; - }); - } - - /** - * Create select list for protocol selection field. - * - * @param {string} modelName The model name. - * @param {object} options The select list options. - * @param {formView} linkFormView The link form view. - * @return {HelfiLinkProtocolView} Return the protocol view. - */ - _createSelectList(modelName, options, linkFormView) { - const { editor } = this; - let selectListView = {}; - - switch (modelName) { - case 'linkProtocol': - selectListView = new HelfiLinkProtocolView(editor, options); - - // Hide the Protocol field view by setting isVisible to false - linkFormView.urlInputView.on('change:isEmpty', (evt, name, value) => { - selectListView.updateVisibility(value); - }); - break; - - case 'linkVariant': - selectListView = new HelfiLinkVariantView(editor, options); - break; - - case 'linkIcon': - selectListView = new HelfiLinkIconView(editor, options); - - // Hide the linkIcon if the design field is empty. - linkFormView.linkVariant.on('change:isEmpty', (evt, name, value) => { - selectListView.updateVisibility(value); - }); - break; - - default: - break; - } - - // Apply configurations for the select list view. - selectListView.set({ - isVisible: options.isVisible, - id: options.machineName, - label: options.label, - }); - - return selectListView; - } - - /** - * Create advanced settings (details/summary) view and handle the initial - * state for it. - * - * @param {formView} linkFormView The link form view. - * @return {HelfiDetailsView} Returns the details view. - */ - _createAdvancedSettingsAccordion(linkFormView) { - // The advanced settings (details summary element) is not bound to - // any element. It is needed to close manually initially. - // Also return early if the advanced settings has already been created. - if (linkFormView.advancedSettings) { - linkFormView.advancedSettings.element.open = false; - linkFormView.advancedSettings.detailsSummary.element.ariaExpanded = false; - linkFormView.advancedSettings.detailsSummary.element.ariaPressed = false; - return linkFormView.advancedSettings; - } - - const { editor } = this; - const advancedSettings = new HelfiDetailsView(editor.locale, this.advancedChildren); - - advancedSettings.set({ - label: Drupal.t('Advanced settings', {}, { context: 'CKEditor5 Helfi Link plugin' }), - id: 'advanced-settings', - isOpen: false, - }); - - // Add advanced settings (details summary) to linkFormView - // after the linkHref field; 2. - linkFormView.children.add(advancedSettings, 2); - - // Remove the error text if user has managed to make an error on last go. - if (linkFormView.urlInputView.errorText) { - linkFormView.urlInputView.errorText = ''; - } - - linkFormView.advancedSettings = advancedSettings; - return linkFormView.advancedSettings; - } - - /** - * Create checkboxes. - * - * @param {string} modelName The model name. - * @return {HelfiCheckBoxView} Returns the checkbox view. - */ - _createCheckbox(modelName) { - const checkboxView = new HelfiCheckBoxView(this.editor.locale); - const options = this.formElements[modelName]; - - // Define the dropdown items - checkboxView.set({ - isVisible: options.isVisible, - tooltip: true, - class: 'ck-find-checkboxes__box', - id: options.machineName, - label: options.label, - }); - - return checkboxView; - } - - /** - * Create form fields based on form elements. - * - * @param {string} modelName The model name. - * @param {formView} linkFormView The link form view. - * @return {*} Returns current field view. - */ - _createFormField(modelName, linkFormView) { - const { editor } = this; - const options = this.formElements[modelName]; - const linkCommand = editor.commands.get('link'); - - if (!linkFormView[modelName]) { - let fieldView = {}; - - // Create fields based on their types. - switch (options.type) { - case 'select': - fieldView = this._createSelectList(modelName, options, linkFormView); - break; - case 'checkbox': - fieldView = this._createCheckbox(modelName); - break; - case 'static': - // Do nothing for static group. - fieldView = false; - break; - default: - fieldView = new LabeledFieldView(editor.locale, createLabeledInputText); - break; - } - - if (!fieldView) { - return; - } - - // Add basic information for the field. - fieldView.machineName = modelName; - fieldView.class = `helfi-link--${options.machineName}`; - fieldView.label = options.label; - - // Add help texts for the field. - if (options.description) { - fieldView.infoText = options.description; - } - - // Handle advanced settings separately. - if (!options.group || options.group !== 'advanced') { - linkFormView.children.add(fieldView, options.type === 'select' ? 0 : 1); - } - - // Track the focus of the field elements. - linkFormView._focusables.add(fieldView, 1); - linkFormView.focusTracker.add(fieldView.element); - linkFormView[modelName] = fieldView; - - // Bind isChecked values of checkboxInputViews to the linkCommand. - if (options.type === 'checkbox') { - linkFormView[modelName].checkboxInputView.bind('isChecked').to(linkCommand, modelName); - } - - // Bind field values of LabeledFieldViews to the linkCommand. - if (options.type === 'input') { - linkFormView[modelName].fieldView.bind('value').to(linkCommand, modelName); - } - - // Initially hide the linkProtocol field if the URL has been set. - if (modelName === 'linkProtocol' && !linkFormView.urlInputView.isEmpty) { - linkFormView[modelName].updateVisibility(false); - } - return linkFormView[modelName]; - } - } - - /** - * Handle data loading into form field. - * - * @param {string} modelName The model name. - * @param {formView} linkFormView The link form view. - */ - _handleDataLoadingIntoFormField(modelName, linkFormView) { - const { editor } = this; - const linkCommand = editor.commands.get('link'); - const options = this.formElements[modelName]; - - if (typeof linkFormView[modelName] !== 'undefined') { - switch (options.type) { - // We don't need to handle data loading for static types. - case 'static': - return; - - // Bind isChecked values of checkboxInputViews to the linkCommand. - case 'checkbox': { - // Set the link new window checkbox initial value and the link new - // window confirmation checkbox values based on the value - // of the element's linkNewWindowConfirm model. The link new window - // confirmation gets its value from attribute. - const isChecked = !!(linkCommand.linkNewWindowConfirm); - - // Set initial value of current "link new window" and - // "link new window confirmation" based on isChecked value. - linkFormView[modelName].updateChecked(isChecked); - if (linkFormView.linkNewWindowConfirm) { - linkFormView.linkNewWindowConfirm.updateVisibility(isChecked); - } - break; - } - - case 'select': - // Initialize TomSelect for current select list. - linkFormView[modelName].renderTomSelect( - linkFormView[modelName].element, - options?.selectListOptions - ); - - // Add the default value for link icon. - if (modelName === 'linkIcon') { - linkFormView[modelName].tomSelect.on('initialize', () => { - linkFormView[modelName].updateVisibility(false); - }); - } - - // Clear the selected values from the select list. - linkFormView[modelName].tomSelect.clear(); - - // Mark the default value as selected item. - if (linkCommand[modelName]) { - linkFormView[modelName].tomSelect.addItem(linkCommand[modelName], true); - } - - // Add the protocol as URL input, if protocol has been selected. - if (modelName === 'linkProtocol') { - linkFormView[modelName].tomSelect.on('item_add', (selection) => { - if (linkFormView.urlInputView.isEmpty) { - linkFormView.urlInputView.fieldView.value = options.selectListOptions[selection]; - linkFormView.urlInputView.focus(); - linkFormView[modelName].tomSelect.clear(); - } - }); - } - - // Add the default value for link variant. - if (modelName === 'linkVariant') { - - // It was decided to remove "primary" variable from anchor tag and - // attach "primary" button styles to data-hds-component variable. - // Add the "primary" as default value if - // data-hds-component="button" is found. - if ( - linkCommand.linkButton === 'button' && - (!linkCommand[modelName] || linkCommand[modelName] === 'primary') - ) { - linkFormView[modelName].tomSelect.addItem('primary', true); - } - - // Hide the link icon form field if there is no variant selected. - if (!linkCommand.linkVariant && linkCommand.linkButton !== 'button') { - linkFormView?.linkIcon.updateVisibility(false); - } - - // Hide the link icon form field if the variant is removed. - linkFormView[modelName].tomSelect.on('item_remove', () => { - linkFormView?.linkIcon.tomSelect.clear(); - linkFormView?.linkIcon.updateVisibility(false); - }); - - // Show the link icon form field if the variant is selected. - linkFormView[modelName].tomSelect.on('item_add', (selection) => { - linkFormView?.linkIcon.updateVisibility(selection !== 'link'); - - if (selection === 'link') { - linkFormView?.linkIcon.tomSelect.clear(); - } - }); - } - break; - - default: - // Note: Copy & pasted from LinkUI. - // https://github.com/ckeditor/ckeditor5/blob/f0a093339631b774b2d3422e2a579e27be79bbeb/packages/ckeditor5-link/src/linkui.js#L333-L333 - linkFormView[modelName].fieldView.element.value = linkCommand[modelName] || ''; - } - } - } - - /** - * Handle link new window and link new window confirmation checkboxes - * when user is checking/unchecking them. - * - * @param {formView} linkFormView The link form view. - */ - _handleCheckboxes(linkFormView) { - if ( - !this.formElements.linkNewWindowConfirm || - !this.formElements.linkNewWindow || - !linkFormView || - !linkFormView.linkNewWindow || - !linkFormView.linkNewWindowConfirm || - !linkFormView.linkNewWindowConfirm.element - ) { - return; - } - - // Handle linkNewWindowConfirm checkbox description. - if (!linkFormView.linkNewWindowConfirm.element.querySelector('.helfi-link-form__field_description')) { - const description = document.createElement('div'); - description.innerHTML = this.formElements.linkNewWindowConfirm.description; - description.classList.add('helfi-link-form__field_description'); - linkFormView.linkNewWindowConfirm.element.appendChild(description); - } - - // Handle link new window and link new window confirmation checkbox linkages. - linkFormView.linkNewWindow.on('change:isChecked', (evt, name, value) => { - // Whenever the link new window checkbox is clicked, we want to ask - // confirmation from the user. Uncheck the confirmation checkbox. - linkFormView?.linkNewWindowConfirm.updateChecked(false); - - // Update the "link new window confirmation" visibility based on the - // value of "link new window" checkbox. - linkFormView?.linkNewWindowConfirm.updateVisibility(value); - }); - } - - /** - * Handle form field submit. - * - * @param {object} models The models. - */ - _handleFormFieldSubmit(models) { - const { editor } = this; - const { selection } = editor.model.document; - const linkFormView = editor.plugins.get('LinkUI').formView; - const linkCommand = editor.commands.get('link'); - - // Listen to linkFormView submit and inject form field values to - // linkCommand arguments. - this.listenTo(linkFormView, 'submit', (evt) => { - // Check for Link URL existence. - if (!linkFormView.urlInputView?.fieldView?.element?.value) { - linkFormView.urlInputView.errorText = Drupal.t( - 'The link URL field cannot be empty.', - {}, - { context: 'CKEditor5 Helfi Link plugin' } - ); - evt.stop(); - } - - // Get whitelisted domains. - const { whiteListedDomains } = this.editor.config.get('link'); - - // Get current href value of the link. - const href = linkFormView.urlInputView?.fieldView?.element?.value; - - // Massage values for the link conversions. - const values = models.reduce((state, model) => { - switch (model) { - case 'linkVariant': { - const selectedValue = linkFormView?.[model]?.tomSelect.getValue(); - - // Return current state if link design has not been selected or - // link design is "link". - if (!selectedValue || selectedValue === 'link') { - return state; - } - - // Set linkButton model variable if the link design is "primary". - // Return the state as we don't want to print out - // data-hds-variant="primary" to the anchor tag. - if (selectedValue === 'primary') { - state.linkButton = 'button'; - return state; - } - - // Set current selection to the state and set "button" as the - // linkButton model value. - state[model] = selectedValue; - state.linkButton = 'button'; - break; - } - - case 'linkIcon': - state[model] = linkFormView?.[model]?.tomSelect.getValue(); - break; - - case 'linkProtocol': - if (!whiteListedDomains || !href) { break; } - - if (parseProtocol(href)) { - state[model] = parseProtocol(href); - } - break; - - case 'linkIsExternal': - if (!whiteListedDomains || !href) { break; } - - if (!parseProtocol(href) && isUrlExternal(href, whiteListedDomains)) { - state[model] = isUrlExternal(href, whiteListedDomains); - break; - } - break; - - default: - state[model] = linkFormView?.[model]?.fieldView?.element?.value ?? ''; - } - - if (this.formElements[model].type === 'checkbox') { - state[model] = linkFormView?.[model]?.checkboxInputView?.element?.checked; - } - - return state; - }, {}); - - // Explain the link logic to user if they are trying to add link id to - // a collapsed selection. - if ( - selection.isCollapsed && - !linkFormView.urlInputView?.fieldView?.element?.value && - values.linkId - ) { - linkFormView.urlInputView.errorText = Drupal.t( - 'When there is no selection, the link URL must be provided. To add a link without a URL, first select text in the editor and then proceed with adding the link.', - {}, - { context: 'CKEditor5 Helfi Link plugin' } - ); - evt.stop(); - } - - // Double-check if either of the checkbox values is not checked and - // set both to false accordingly. - if (!values.linkNewWindowConfirm || !values.linkNewWindow) { - values.linkNewWindowConfirm = false; - values.linkNewWindow = false; - - // Trigger the change event by clicking the element. - if (linkFormView.linkNewWindowConfirm.checkboxInputView.element.checked) { - linkFormView.linkNewWindowConfirm.checkboxInputView.element.click(); - } - // Trigger the change event by clicking the element. - if (linkFormView.linkNewWindow.checkboxInputView.element.checked) { - linkFormView.linkNewWindow.checkboxInputView.element.click(); - } - } - - // Stop the execution of the link command caused by closing the form. - // Inject the attribute values. - linkCommand.once('execute', (execEvt, args) => { - if (args.length < 3) { - args.push(values); - } else if (args.length === 3) { - Object.assign(args[2], values); - } else { - throw Error('The link command has more than 3 arguments.'); - } - }, { priority: 'highest' }); - }, { priority: 'high' }); - } - -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/index.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/index.js deleted file mode 100644 index 88214d18..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/index.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * @file The build process always expects an index.js file. Anything exported - * here will be recognized by CKEditor 5 as an available plugin. Multiple - * plugins can be exported in this one file. - * - * I.e. this file's purpose is to make plugin(s) discoverable. - */ - -import HelfiLink from './helfiLink'; - -export default { - HelfiLink, -}; diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiCheckBoxView.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiCheckBoxView.js deleted file mode 100644 index 96fdde49..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiCheckBoxView.js +++ /dev/null @@ -1,265 +0,0 @@ -import { View } from 'ckeditor5/src/ui'; -import { getCode } from 'ckeditor5/src/utils'; - -/** - * The HelfiLink checkbox view class. - */ -export default class HelfiCheckBoxView extends View { - /** - * @inheritDoc - */ - constructor(locale) { - super(locale); - const bind = this.bindTemplate; - - /** - * (Optional) The additional CSS class set on the button. - * - * @observable - * @member {String} #class - */ - this.set('class'); - - /** - * Controls whether the checkbox view is visible. Visible by default, the checkboxes are hidden - * using a CSS class. - * - * @observable - * @default true - * @member {Boolean} #isVisible - */ - this.set('isVisible', true); - - /** - * Indicates whether a related checkbox is checked. - * - * @observable - * @default false - * @member {Boolean} #isChecked - */ - this.set('isChecked', false); - - /** - * The text of the label associated with the checkbox view. - * - * @observable - * @member {String} #label - */ - this.set('label'); - - /** - * The text of the label associated with the checkbox view. - * - * @observable - * @member {String} #label - */ - this.set('description'); - - /** - * The HTML `id` attribute to be assigned to the checkbox. - * - * @observable - * @default null - * @member {String|null} #id - */ - this.set('id', null); - - /** - * (Optional) Controls the `tabindex` HTML attribute of the checkbox. By default, the checkbox is focusable - * but is not included in the Tab order. - * - * @observable - * @default -1 - * @member {String} #tabindex - */ - this.set('tabindex', -1); - - /** - * The collection of the child views inside of the checkbox {@link #element}. - * - * @readonly - * @member {module:ui/viewcollection~ViewCollection} - */ - this.children = this.createCollection(); - - /** - * The label of the checkbox view. It is configurable using the {@link #label label attribute}. - * - * @readonly - * @member {module:ui/view~View} #labelView - */ - this.labelView = this._createLabelView(); - - /** - * The input of the checkbox view. - * - * @readonly - * @member {module:ui/view~View} #checkboxInputView - */ - this.checkboxInputView = this._createCheckboxInputView(); - - this.checkboxSpanToggle = this._createCheckboxSpanToggleView(); - - // Bind isVisible to updateVisibility method. - this.bind('isVisible').to(this, 'updateVisibility'); - - // Bind isChecked to updateChecked method. - this.bind('isChecked').to(this, 'updateChecked'); - - this.setTemplate({ - tag: 'div', - - attributes: { - class: [ - 'form-type--checkbox', - 'helfi-link-checkbox', - bind.if('isVisible', 'is-hidden', value => !value), - bind.to('class'), - ], - }, - - on: { - keydown: bind.to(evt => { - // Need to check target. Otherwise, we would handle space press on - // input[type=text] and it would change checked property twice due - // to default browser handling kicking in too. - if (evt.target === this.element && evt.keyCode === getCode('space')) { - this.isChecked = !this.isChecked; - } - }), - }, - children: this.children - }); - } - - /** - * @inheritDoc - */ - render() { - super.render(); - - this.children.add(this.checkboxInputView); - this.children.add(this.checkboxSpanToggle); - this.children.add(this.labelView); - } - - /** - * Focuses the {@link #element} of the checkbox. - */ - focus() { - this.element.focus(); - } - - /** - * Creates a checkbox input view instance and binds it with checkbox attributes. - * - * @return {module:ui/view~View} Returns checkbox input view. - */ - _createCheckboxInputView() { - const checkboxInputView = new View(); - const bind = this.bindTemplate; - - checkboxInputView.setTemplate({ - tag: 'input', - attributes: { - type: 'checkbox', - id: bind.to('id'), - 'checked': bind.if('isChecked'), - }, - on: { - change: bind.to(evt => { - this.isChecked = evt.target.checked; - }) - } - }); - - return checkboxInputView; - } - - /** - * Creates a checkbox toggle span. - * - * @return {module:ui/view~View} Returns checkbox span toggle view. - */ - _createCheckboxSpanToggleView() { - const checkboxSpanToggleView = new View(); - const bind = this.bindTemplate; - - /** - * Markup: - * - * - * - */ - checkboxSpanToggleView.setTemplate({ - tag: 'span', - attributes: { - class: [ - 'checkbox-toggle', - ], - id: bind.to('id'), - }, - children: [ - { - tag: 'span', - attributes: { - class: [ - 'checkbox-toggle__inner' - ], - }, - }, - ], - }); - - return checkboxSpanToggleView; - } - - /** - * Creates a label view instance and binds it with checkbox attributes. - * - * @return {module:ui/view~View} Returns checkbox label view. - */ - _createLabelView() { - const labelView = new View(); - - labelView.setTemplate({ - tag: 'label', - - attributes: { - for: this.bindTemplate.to('id') - }, - - children: [ - { - text: this.bindTemplate.to('label') - } - ] - }); - - return labelView; - } - - /** - * Update the visibility of the view based on the isVisible property - * - * @param {boolean} value The boolean value to be set to isVisible property. - */ - updateVisibility(value) { - if (value) { - this.element.classList.remove('is-hidden'); - } else { - this.element.classList.add('is-hidden'); - } - } - - /** - * Update the visibility of the view based on the isVisible property - * - * @param {boolean} value The boolean value to be set to isVisible property. - */ - updateChecked(value) { - if (value !== this.isChecked) { - this.checkboxInputView?.element?.click(); - } - } -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiDetailsView.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiDetailsView.js deleted file mode 100644 index ea9fc9b3..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiDetailsView.js +++ /dev/null @@ -1,122 +0,0 @@ -import { View } from 'ckeditor5/src/ui'; -import { getCode } from 'ckeditor5/src/utils'; - -/** - * The HelfiLink details view class. - */ -export default class HelfiDetailsView extends View { - /** - * @inheritDoc - */ - constructor(locale, children) { - super(locale); - this.advancedChildren = children; - const bind = this.bindTemplate; - - /** - * Controls whether the details view is enabled, i.e. it can be clicked and can execute an action. - * - * @observable - * @default true - * @member {Boolean} #isEnabled - */ - this.set('isOpen', false); - - /** - * The text of the label associated with the details view. - * - * @observable - * @member {String} #label - */ - this.set('label'); - - /** - * The HTML `id` attribute to be assigned to the details. - * - * @observable - * @default null - * @member {String|null} #id - */ - this.set('id', null); - - /** - * The collection of the child views inside the details {@link #element}. - * - * @readonly - * @member {module:ui/viewcollection~ViewCollection} - */ - this.children = this.createCollection(); - - /** - * The input of the details view. - * - * @readonly - * @member {module:ui/view~View} #detailsInputView - */ - this.detailsSummary = this._createDetailsSummary(); - - this.setTemplate({ - tag: 'details', - - attributes: { - id: bind.to('id'), - class: [ - 'ck-helfi-link-details', - bind.if('isOpen', 'ck-is-open', isOpen => isOpen) - ], - open: bind.if('isOpen'), - }, - - on: { - keydown: bind.to(evt => { - // Need to check target. Otherwise, we would handle space press on - // input[type=text] and it would change checked property - // twice due to default browser handling kicking in too. - if (evt.target === this.element && evt.keyCode === getCode('space')) { - this.isOpen = !this.isOpen; - } - }), - }, - children: this.children, - }); - } - - /** - * @inheritDoc - */ - render() { - super.render(); - - this.children.add(this.detailsSummary); - this.children.addMany(this.advancedChildren); - } - - /** - * Focuses the {@link #element} of the details. - */ - focus() { - this.element.focus(); - } - - _createDetailsSummary() { - const detailsSummaryView = new View(); - - detailsSummaryView.setTemplate({ - tag: 'summary', - attributes: { - role: 'button', - class: [ - 'ck-helfi-link-details__summary', - ], - 'tabindex': 0, - }, - children: [ - { - text: this.bindTemplate.to('label') - } - ], - }); - return detailsSummaryView; - } - -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiLinkBaseView.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiLinkBaseView.js deleted file mode 100644 index d3a89e1a..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiLinkBaseView.js +++ /dev/null @@ -1,130 +0,0 @@ -import { View } from 'ckeditor5/src/ui'; -import { getCode } from 'ckeditor5/src/utils'; - -/** - * The HelfiLink base view class. - */ -export default class HelfiLinkBaseView extends View { - - /** - * @inheritDoc - */ - constructor(editor, options) { - super(editor.locale); - - this.options = options; - this.tomSelect = false; - - this.linkCommandConfig = editor.config.get('link'); - this.loadedIcons = this.linkCommandConfig?.loadedIcons; - - // Initialize the isVisible property - this.set('isVisible', false); - - // Add a CSS class to the view when isVisible is false - this.bind('isVisible').to(this, 'updateVisibility'); - - const bind = this.bindTemplate; - - /** - * Controls whether the details view is enabled, i.e. it can be clicked and can execute an action. - * - * @observable - * @default true - * @member {Boolean} #isEnabled - */ - this.set('isOpen', false); - - /** - * The text of the label associated with the details view. - * - * @observable - * @member {String} #label - */ - this.set('label'); - - /** - * The HTML `id` attribute to be assigned to the details. - * - * @observable - * @default null - * @member {String|null} #id - */ - this.set('id', null); - - /** - * The collection of the child views inside the details {@link #element}. - * - * @readonly - * @member {module:ui/viewcollection~ViewCollection} - */ - this.setTemplate({ - tag: 'select', - - attributes: { - id: bind.to('id'), - class: [ - 'ck-helfi-link-select-list', - ], - 'data-placeholder': this.options.label, - autocomplete: 'off', - }, - on: { - keydown: bind.to(evt => { - // Need to check target. Otherwise, we would handle space press on - // input[type=text] and it would change checked property - // twice due to default browser handling kicking in too. - if (evt.target === this.element && evt.keyCode === getCode('space')) { - this.isOpen = !this.isOpen; - } - }), - }, - }); - - } - - /** - * Update the visibility of the view based on isVisible property. - * - * @param {boolean} value Truthy value of visibility. - */ - updateVisibility(value) { - if (value) { - this.tomSelect?.wrapper?.classList.remove('is-hidden'); - this.element.classList.remove('is-hidden'); - } else { - this.tomSelect?.wrapper?.classList.add('is-hidden'); - this.element.classList.add('is-hidden'); - } - } - - /** - * @inheritDoc - */ - render() { - super.render(); - } - - /** - * Focuses the {@link #element} of the details. - */ - focus() { - this.element.focus(); - } - - /** - * Default options for the Tom Select. - * - * @return {object} Default options as an object. - */ - selectListDefaultOptions() { - return { - valueField: 'option', - labelField: 'name', - searchField: 'title', - maxItems: 1, - placeholder: this.options.label, - create: false, - }; - } -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiLinkIconView.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiLinkIconView.js deleted file mode 100644 index 02fd2e1e..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiLinkIconView.js +++ /dev/null @@ -1,55 +0,0 @@ -import HelfiLinkBaseView from './helfiLinkBaseView'; - -/** - * The HelfiLink details view class. - */ -export default class HelfiLinkIconView extends HelfiLinkBaseView { - - /** - * Render function for the Tom Select library. - * - * @param {string} element The element. - if (!this.tomSelect && element) { - - const defaultConfig = super.selectListDefaultOptions(); - - // The template for the Tom Select options and selected items. - const renderTemplate = (item, escape) => ` - - - ${escape(item.name)} - - `; - - // Settings for the Tom Select. - const settings = { - ...defaultConfig, - plugins: { - dropdown_input: {}, - remove_button: { - title: 'Remove this item', - } - }, - valueField: 'icon', - searchField: ['name'], - options: Object.keys(this.loadedIcons).map(icon => ({ - icon, - name: this.loadedIcons[icon] - })), - // Custom rendering functions for options and items - render: { - option: (item, escape) => renderTemplate(item, escape), - item: (item, escape) => renderTemplate(item, escape), - }, - }; - - /* global TomSelect */ - this.tomSelect = new TomSelect(this.element, settings); - } - } - -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiLinkProtocolView.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiLinkProtocolView.js deleted file mode 100644 index 7b1b6b56..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiLinkProtocolView.js +++ /dev/null @@ -1,48 +0,0 @@ -import HelfiLinkBaseView from './helfiLinkBaseView'; - -/** - * The HelfiLink details view class. - */ -export default class HelfiLinkProtocolView extends HelfiLinkBaseView { - - - - /** - * Render function for the Tom Select library. - * - * @param {string} element The element. - if (!this.tomSelect && element) { - - const defaultConfig = super.selectListDefaultOptions(); - - // The template for the Tom Select options and selected items. - const renderTemplate = (item, escape) => ` - - ${escape(item.title)} - - `; - - // Settings for the Tom Select. - const settings = { - ...defaultConfig, - options: Object.keys(options).map(option => ({ - option, - title: options[option] - })), - // Custom rendering functions for options and items - render: { - option: (item, escape) => renderTemplate(item, escape), - item: (item, escape) => renderTemplate(item, escape), - }, - }; - /* global TomSelect */ - this.tomSelect = new TomSelect(this.element, settings); - } - } - -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiLinkVariantView.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiLinkVariantView.js deleted file mode 100644 index 222a5b2f..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/ui/helfiLinkVariantView.js +++ /dev/null @@ -1,51 +0,0 @@ -import HelfiLinkBaseView from './helfiLinkBaseView'; - -/** - * The HelfiLink details view class. - */ -export default class HelfiLinkVariantView extends HelfiLinkBaseView { - - /** - * Render function for the Tom Select library. - * - * @param {string} element The element. - if (!this.tomSelect && element) { - const defaultConfig = super.selectListDefaultOptions(); - - // The template for the Tom Select options and selected items. - const renderTemplate = (item, escape) => ` - - ${escape(item.title)} - - `; - // Settings for the Tom Select. - const settings = { - ...defaultConfig, - plugins: { - dropdown_input: {}, - remove_button: { - title: 'Remove this item', - } - }, - options: Object.keys(options).map(option => ({ - option, - title: options[option] - })), - // Custom rendering functions for options and items - render: { - option: (item, escape) => renderTemplate(item, escape), - item: (item, escape) => renderTemplate(item, escape), - }, - }; - - /* global TomSelect */ - this.tomSelect = new TomSelect(this.element, settings); - } - } - -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/utils/utils.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/utils/utils.js deleted file mode 100644 index 0d9d1784..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiLink/src/utils/utils.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @file defines isUrlExternal and parseProtocol functions. - */ - -/** - * Returns true if the URL matches the provided domains list. - * - * @param {string} string The URL as string. - * @param {array} domains The domains list as an array. - * @return {boolean} Returns either true or false, depending on the existence. - */ -export const isUrlExternal = (string, domains) => { - let url; - // Early return on . - if (string === '/' || string === '') { - return false; - } - - const isInternal = (testUrl) => { - const urlRegex = /https?:\/\/(?:www\.)?[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/; - const isMatch = urlRegex.test(testUrl); - return !isMatch; - }; - - try { - url = new URL(string); - } catch (_) { - url = new URL(`https://${string}`); - if (isInternal(url)) { - return false; - } - } - - const host = url.hostname; - return !domains.some(domain => ( - (domain.startsWith('*.') && host.endsWith(domain.slice(2))) || - domain === host - )); -}; - -/** - * Retrieves the tel or mailto protocol from given URL. - * - * @param {string} url The URL as string. - * @return {string|boolean} The protocol as a string or false. - */ -export const parseProtocol = url => { - try { - const parsedURL = new URL(url); - return (parsedURL.protocol === 'tel:' || parsedURL.protocol === 'mailto:') - ? parsedURL.protocol.replace(':', '') - : false; - } catch (_) { - return false; // We only need to return tel or mailto protocols. - } -}; diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/README.md b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/README.md deleted file mode 100644 index d8fc211d..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/README.md +++ /dev/null @@ -1,9 +0,0 @@ -This helfiQuote plugin is largely based on CKEditor 5's -[block plugin widget tutorial](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/tutorials/implementing-a-block-widget.html), but with added documentation to facilitate better understanding -of CKEditor 5 plugin development and other minor changes. - -Within `/src` are the multiple files that will be used by the build process to -become a CKEditor 5 plugin in `/build`. Technically, everything in these files -could be in a single `index.js` - the only file the MUST be present is -`/src/index.js`. However, splitting the plugin into concern-specific files has -maintainability benefits. diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/helfiQuote.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/helfiQuote.js deleted file mode 100644 index 51242e58..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/helfiQuote.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * @file This is what CKEditor refers to as a master (glue) plugin. Its role is - * just to load the “editing” and “UI” components of this Plugin. Those - * components could be included in this file, but - * - * I.e, this file's purpose is to integrate all the separate parts of the plugin - * before it's made discoverable via index.js. - */ - -// The contents of helfiQuoteUI and helfiQuote editing -// could be included in this file, but it is recommended to separate -// these concerns in different files. -import { Plugin } from 'ckeditor5/src/core'; -import HelfiQuoteEditing from './helfiQuoteEditing'; -import HelfiQuoteUi from './helfiQuoteUi'; - -export default class HelfiQuote extends Plugin { - // Note that helfiQuoteEditing and helfiQuoteUI also - // extend `Plugin`, but these are not seen as individual plugins by CKEditor5. - // CKEditor 5 will only discover the plugins explicitly exported in index.js. - static get requires() { - return [ - HelfiQuoteEditing, - HelfiQuoteUi - ]; - } -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/helfiQuoteEditing.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/helfiQuoteEditing.js deleted file mode 100644 index c5dd96e2..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/helfiQuoteEditing.js +++ /dev/null @@ -1,216 +0,0 @@ -/** - * @file A view to model and model to view converters for helfiQuote. - */ -import { Plugin } from 'ckeditor5/src/core'; -import { toWidget, toWidgetEditable, Widget } from 'ckeditor5/src/widget'; -import HelfiQuoteCommand from './ui/helfiQuoteCommand'; - -/** - * CKEditor 5 plugins do not work directly with the DOM. They are defined as - * plugin-specific data models that are then converted to markup that - * is inserted in the DOM. - * - * CKEditor5 internally interacts with the helfiQuote as this model: - * - * - * - * - * - * - * - * Which is converted for the browser/user as this markup - *
- *

- *
- *
- * - * This file has the logic for defining the helfiQuote model, - * and for how it is converted to standard DOM markup. - */ -export default class HelfiQuoteEditing extends Plugin { - static get requires() { - return [ Widget ]; - } - - init() { - const { editor } = this; - - this._defineSchema(); - this._defineConverters(); - - // Add helfiQuoteCommand. - editor.commands.add( - 'helfiQuoteCommand', - new HelfiQuoteCommand(editor), - ); - } - - /** - * @inheritdoc - */ - static get pluginName() { - return 'HelfiQuoteEditing'; - } - - /** - * This registers the structure that will be seen by CKE5 as - * - * - * - * - * - * - * - * - * The logic in _defineConverters() will determine how this is converted to - * markup. - */ - _defineSchema() { - - const { schema } = this.editor.model; - - schema.register('helfiQuote', { - // Behaves like a self-contained object. - isObject: true, - // Allow in places where other blocks are allowed. - allowWhere: '$block', - }); - - schema.register('helfiQuoteText', { - // This creates a boundary for external actions such as clicking - // and keypress. For example, when the cursor is inside this blockquote, - // the keyboard shortcut for "select all" will be limited to the contents - // of the box. - isLimit: true, - // This is only to be used within helfiQuote. - allowIn: 'helfiQuote', - // Allow content that is allowed in blocks (e.g. text with attributes). - allowContentOf: '$block', - }); - - schema.register('helfiQuoteFooter', { - isLimit: true, - // This is only to be used within helfiQuote. - allowIn: 'helfiQuote', - // Allow content that is allowed in blocks (e.g. text with attributes). - allowContentOf: '$block', - }); - - schema.register('helfiQuoteFooterCite', { - isLimit: true, - // This is only to be used within helfiQuoteFooter. - allowIn: 'helfiQuoteFooter', - // Allow content that is allowed in blocks (e.g. text with attributes). - allowContentOf: '$block', - }); - } - - /** - * Converters determine how CKEditor 5 models are converted into markup and - * vice-versa. - * - *
- *

- *
- *
- */ - _defineConverters() { - // Converters are registered via the central editor object. - const { conversion } = this.editor; - - // Upcast Converters: determine how existing HTML is interpreted by the - // editor. These trigger when an editor instance loads. - const convertUpcast = (modelName, viewName, attribute = null) => { - const variants = { - 'dataAttributes': { - name: viewName, - attributes: { - [attribute]: '', - } - }, - 'classes': { - name: viewName, - classes: [ - attribute, - ] - }, - }; - Object.keys(variants).forEach(variant => { - const upcastView = variants[variant]; - conversion.for('upcast').elementToElement({ - view: upcastView, - model: modelName, - }); - }); - }; - - // If
or
is present - // in the existing markup processed by CKEditor, then CKEditor recognizes - // and loads it as a model. - // Instances of are saved as - //
{{inner content}}
. - convertUpcast('helfiQuote', 'blockquote', 'quote'); - convertUpcast('helfiQuote', 'blockquote', 'data-helfi-quote'); - - // If

or

is present in - // the existing markup processed by CKEditor, then CKEditor recognizes - // and loads it as a model, provided it is a child element - // of , as required by the schema. - // Instances of are saved as - //

{{inner content}}

. - convertUpcast('helfiQuoteText', 'p', 'quote__text'); - convertUpcast('helfiQuoteText', 'p', 'data-helfi-quote-text'); - - // If
or
- // is present in the existing markup processed by CKEditor, then CKEditor - // recognizes and loads it as a model, provided it is - // a child element of , as required by the schema. - // Instances of are saved as - //
{{inner content}}. - convertUpcast('helfiQuoteFooter', 'footer', 'quote__author'); - convertUpcast('helfiQuoteFooter', 'footer', 'data-helfi-quote-author'); - - // If is present in the existing markup - // processed by CKEditor, then CKEditor recognizes and loads it as a - // model, provided it is a child element of - // , as required by the schema. - // Instances of are saved as - // {{inner content}}. - convertUpcast('helfiQuoteFooterCite', 'footer'); - - // Downcast Converters: converts stored model data into HTML. - const convertDowncast = (model, elementType, attributes = {}, container = false) => { - const converterFunction = container ? 'createContainerElement' : 'createEditableElement'; - - // These trigger when content is saved. - conversion.for('dataDowncast').elementToElement({ - model, - view: (modelElement, { writer: viewWriter }) => - viewWriter[converterFunction](elementType, attributes), - }); - - // Editing Downcast Converters. These render the content to the user for - // editing, i.e. this determines what gets seen in the editor. These trigger - // after the Data Upcast Converters, and are re-triggered any time there - // are changes to any of the models' properties. - conversion.for('editingDowncast').elementToElement({ - model, - view: (modelElement, { writer: viewWriter }) => { - const element = viewWriter[converterFunction](elementType, attributes); - return container - ? toWidget(element, viewWriter) - : toWidgetEditable(element, viewWriter); - }, - }); - }; - - // Convert the model into a
container element. - convertDowncast('helfiQuote', 'blockquote', { 'data-helfi-quote': '' }, true); - // Convert the model into an editable

element. - convertDowncast('helfiQuoteText', 'p', { 'data-helfi-quote-text': '' }); - // Convert the model into a container

element. - convertDowncast('helfiQuoteFooter', 'footer', { 'data-helfi-quote-author': '' }, true); - // Convert the model into an editable element. - convertDowncast('helfiQuoteFooterCite', 'cite'); - } -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/helfiQuoteUi.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/helfiQuoteUi.js deleted file mode 100644 index a0ea7284..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/helfiQuoteUi.js +++ /dev/null @@ -1,165 +0,0 @@ -/** - * @file registers the helfiQuoteUi plugin and binds functionality to it. - */ -import { Plugin } from 'ckeditor5/src/core'; -import { createDropdown } from 'ckeditor5/src/ui'; -import icon from '../../../../icons/helfiQuote.svg'; -import HelfiQuoteForm from './ui/helfiQuoteForm'; - -export default class HelfiQuoteUi extends Plugin { - - constructor(editor) { - super(editor); - this.editor = editor; - this.updateSelection = false; - this.quoteFormView = false; - this.dropdownView = false; - } - - init() { - const { editor } = this; - const defaultTitle = Drupal.t('Add a quote', {}, { context: 'CKEditor5 Helfi Quote plugin' }); - - // Register the helfiQuote toolbar button. - editor.ui.componentFactory.add('helfiQuote', (locale) => { - const quoteCommand = this.editor.commands.get('helfiQuoteCommand'); - - // Create the dropdown view. - this.dropdownView = createDropdown(locale); - - // Create the toolbar button. - this.dropdownView.buttonView.set({ - label: defaultTitle, - icon, - tooltip: true, - }); - - // Rebind the state of the button to quoteCommand isEnabled observable. - this.dropdownView.buttonView.unbind('isEnabled'); - this.dropdownView.buttonView.bind('isEnabled').to(quoteCommand, 'isEnabled'); - - // Add class for the dropdown view. - this.dropdownView.extendTemplate({ - attributes: { - class: [ 'helfi-quote'] - } - }); - - // Add custom classes for the dropdown panel view. - this.dropdownView.panelView.extendTemplate({ - attributes: { - class: [ - 'helfi-quote__dropdown-panel', - 'ck-reset_all-excluded', - ] - } - }); - - // Act on when dropdownView is opened. - this.dropdownView.on('change:isOpen', () => { - - // No need to reinitialize the select list view. - if (this.quoteFormView) { return; } - - // Initialize the quoteFormView. - this.quoteFormView = new HelfiQuoteForm(locale, this.editor); - - // Execute link command after clicking the "Save" button. - this.listenTo(this.quoteFormView, 'submit', () => { - const quoteText = this.quoteFormView.textAreaView.textArea.fieldView.element.value || false; - const author = this.quoteFormView.authorInputView.fieldView.element.value || false; - quoteCommand.execute({ quoteText, author }); - this._closeFormView(); - }); - - // Hide the panel after clicking the "Cancel" button. - this.listenTo(this.quoteFormView, 'cancel', () => { - this._closeFormView(); - }); - - // Close the panel on esc key press when the **form has focus**. - this.quoteFormView.keystrokes.set('Esc', (data, cancel) => { - this._closeFormView(); - cancel(); - }); - - // Add the quoteFormView to dropdown panelView and set it to south-west. - this.dropdownView.panelView.children.add(this.quoteFormView); - this.dropdownView.panelPosition = 'sw'; - - // Delegate the execute command from this.quoteFormView to this.dropdownView. - this.quoteFormView.delegate('execute').to(this.dropdownView); - - this.quoteFormView.focus(); - }); - - // Add selected text to QuoteView or if there is a selection - // or edit existing Quote. - this.dropdownView.on('change:isOpen', () => { - this._updateQuoteDefaultValues(); - }); - - return this.dropdownView; - }); - - } - - /** - * Add the selected text to Quote as a default value or edit existing Quote. - */ - _updateQuoteDefaultValues() { - const { model } = this.editor; - const { selection } = model.document; - - // If there is a non collapsed selection, use the selection data as - // the default value for the textarea (quote text). - if (this.quoteFormView) { - if (!selection.isCollapsed) { - const ranges = selection.getRanges(); - let range = ranges.next(); - - while (!range.done) { - const currentRange = range.value; - const items = currentRange.getItems(); - let currentItem = items.next(); - - while (!currentItem.done) { - const item = currentItem.value; - if (item.data) { - if ( - item.textNode?.parent?.name === 'helfiQuoteText' || - item.textNode?.parent?.name === 'paragraph' - ) { - this.quoteFormView.textAreaView.updateValueBasedOnSelection(item.data); - } - this.quoteFormView.authorInputView.isEmpty = item.textNode?.parent?.name !== 'helfiQuoteFooterCite'; - this.quoteFormView.authorInputView.fieldView.element.value = item.textNode?.parent?.name === 'helfiQuoteFooterCite' ? item.data : ''; - - this.quoteFormView.focus(); - } - currentItem = items.next(); - } - range = ranges.next(); - } - } - else { - this.quoteFormView.textAreaView.updateValueBasedOnSelection(); - this.quoteFormView.authorInputView.isEmpty = true; - this.quoteFormView.authorInputView.fieldView.element.value = ''; - } - } - } - - /** - * Closes the form view and resets the quoteText and authorInput fields. - */ - _closeFormView() { - this.quoteFormView.textAreaView.textArea.fieldView.element.value = null; - this.quoteFormView.authorInputView.fieldView.element.value = null; - - if (this.dropdownView) { - this.dropdownView.isOpen = false; - } - } - -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/index.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/index.js deleted file mode 100644 index 99a0a1a3..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/index.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * @file The build process always expects an index.js file. Anything exported - * here will be recognized by CKEditor 5 as an available plugin. Multiple - * plugins can be exported in this one file. - * - * I.e. this file's purpose is to make plugin(s) discoverable. - */ - -import HelfiQuote from './helfiQuote'; - -export default { - HelfiQuote, -}; diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/ui/helfiQuoteCommand.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/ui/helfiQuoteCommand.js deleted file mode 100644 index c938dbf9..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/ui/helfiQuoteCommand.js +++ /dev/null @@ -1,79 +0,0 @@ -/** - * @file defines helfiQuoteCommand, which is executed when the quote toolbar - * button is pressed. - */ -import { Command } from 'ckeditor5/src/core'; - -/** - * Create the helfiQuote element for the editor. - * - * @param {object} writer The model writer. - * @param {string} quoteText The quote text. - * @param {string} author The Source / author. - * @return {*} Returns the element to be added to the editor. - */ -function createQuote(writer, quoteText, author) { - const helfiQuote = writer.createElement('helfiQuote'); - const helfiQuoteText = writer.createElement('helfiQuoteText'); - const helfiQuoteFooter = writer.createElement('helfiQuoteFooter'); - const helfiQuoteFooterCite = writer.createElement('helfiQuoteFooterCite'); - - // Append the quote text and author elements to the helfiQuote. - writer.append(helfiQuoteText, helfiQuote); - writer.insertText(quoteText, helfiQuoteText); - - // Do not add the author if it's not available. - if (author) { - writer.append(helfiQuoteFooter, helfiQuote); - writer.append(helfiQuoteFooterCite, helfiQuoteFooter); - writer.insertText(author, helfiQuoteFooterCite); - } - - // Return the element to be added to the editor. - return helfiQuote; -} - -export default class HelfiQuoteCommand extends Command { - - /** - * Executes the command. - * Insert * at the current selection position - * in a way that will result in creating a valid model structure. - * - * @param {string} quoteText The quote text. - * @param {string} author The Source / author. - */ - execute({ quoteText, author }) { - const { model } = this.editor; - - model.change(writer => { - if (!quoteText) { return; } - model.insertContent(createQuote(writer, quoteText, author)); - }); - } - - /** - * @inheritDoc - */ - refresh() { - const { model } = this.editor; - const { selection } = model.document; - - // Determine if the cursor (selection) is in a position where adding a - // helfiQuote is permitted. This is based on the schema of the model(s) - // currently containing the cursor. - const allowedIn = model.schema.findAllowedParent( - selection.getFirstPosition(), - 'helfiQuote', - ); - - // If the cursor is not in a location where a helfiQuote can be added, - // return null so the quote toolbar button cannot be clicked. - this.isEnabled = allowedIn !== null; - - // Set value based on selection to set it as default value for the - // new quote. - // this.value = this._getValueFromFirstAllowedNode(); - } - -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/ui/helfiQuoteForm.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/ui/helfiQuoteForm.js deleted file mode 100644 index 66a71cac..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/ui/helfiQuoteForm.js +++ /dev/null @@ -1,136 +0,0 @@ -import { - ButtonView, - createLabeledInputText, - LabeledFieldView, - submitHandler, - View -} from 'ckeditor5/src/ui'; -import { KeystrokeHandler } from 'ckeditor5/src/utils'; -import { icons } from 'ckeditor5/src/core'; -import TextareaView from './helfiTextareaView'; - -/** - * The textareaView class. - */ -export default class HelfiQuoteForm extends View { - - /** - * @inheritDoc - */ - constructor(locale, editor) { - super(locale, editor); - - this.editor = editor; - this.textAreaView = new TextareaView(locale, editor); - - this.authorInputView = new LabeledFieldView(editor.locale, createLabeledInputText); - this.authorInputView.label = Drupal.t('Source / author', {}, { context: 'CKEditor5 Helfi Quote plugin' }); - - this.saveButtonView = this._createButton( - Drupal.t('Save', {}, { context: 'CKEditor5 Helfi Quote plugin' }), - icons.check, - 'ck-button-save' - ); - this.saveButtonView.type = 'submit'; - - this.cancelButtonView = this._createButton( - Drupal.t('Cancel', {}, { context: 'CKEditor5 Helfi Quote plugin' }), - icons.cancel, - 'ck-button-cancel', - 'cancel' - ); - - this.keystrokes = new KeystrokeHandler(); - this.children = this.createCollection(); - - this.setTemplate({ - tag: 'form', - - attributes: { - class: [ 'ck', 'ck-helfi-quote-form' ], - - // https://github.com/ckeditor/ckeditor5-link/issues/90 - tabindex: '-1' - }, - - children: this.children - }); - } - - /** - * @inheritDoc - */ - render() { - super.render(); - - submitHandler({ - view: this - }); - - this.children.add(this.textAreaView); - this.children.add(this.authorInputView); - this.children.add(this.saveButtonView); - this.children.add(this.cancelButtonView); - - this.keystrokes.listenTo(this.element); - } - - /** - * @inheritDoc - */ - destroy() { - super.destroy(); - - // Blur the input element before removing it from DOM - // to prevent issues in some browsers. - // See https://github.com/ckeditor/ckeditor5/issues/1501. - this.saveButtonView.focus(); - - // Because the form has an input which has focus, the focus must be - // brought back to the editor. Otherwise, it would be lost. - this.editor.editing.view.focus(); - - // Handle also HelfiTextareaView destroy. - this.textAreaView.destroy(); - } - - /** - * Focuses the textarea field when the quote form is opened. - */ - focus() { - this?.textAreaView?.children?.first?.fieldView?.element.focus(); - } - - /** - * Creates a button view. - * - * @param {string} label The button label. - * @param {string} icon The button icon. - * @param {string} className The additional button CSS class name. - * @param {string|boolean} eventName An event name that the `ButtonView#execute` event will be delegated to. - * @return {ButtonView} The button view instance. - */ - _createButton(label, icon, className, eventName = false) { - const button = new ButtonView(this.locale); - - button.set({ - label, - icon, - tooltip: true - }); - - button.extendTemplate({ - attributes: { - class: className - } - }); - - if (eventName) { - button.delegate('execute').to(this, eventName); - } - - return button; - } - - -} diff --git a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/ui/helfiTextareaView.js b/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/ui/helfiTextareaView.js deleted file mode 100644 index 549791af..00000000 --- a/public/modules/custom/helfi_ckeditor/assets/js/ckeditor5_plugins/helfiQuote/src/ui/helfiTextareaView.js +++ /dev/null @@ -1,147 +0,0 @@ -import { LabeledFieldView, View } from 'ckeditor5/src/ui'; -import { FocusTracker } from 'ckeditor5/src/utils'; - -/** - * The textareaView class. - */ -export default class TextareaView extends View { - - /** - * @inheritDoc - */ - constructor(locale, editor) { - super(locale, editor); - - this.textAreaLabel = Drupal.t('Quotation', {}, { context: 'CKEditor5 Helfi Quote plugin' }); - - this.set('value', undefined); - this.set('id', undefined); - - this.set('label'); - - this.focusTracker = new FocusTracker(); - this.bind('isFocused').to(this.focusTracker); - this.set('isEmpty', true); - - this.children = this.createCollection(); - this.textArea = this._createTextareaView(locale); - - this.setTemplate({ - tag: 'div', - attributes: { - class: [ - 'ck-helfi-textarea', - ], - }, - children: this.children, - }); - } - - /** - * @inheritDoc - */ - render() { - super.render(); - this.children.add(this.textArea); - this.focusTracker.add(this.textArea); - this.focusTracker.add(this.textArea.fieldView.element); - - this._setDomElementValue(this.value); - this._updateValue(); - } - - /** - * @inheritDoc - */ - destroy() { - super.destroy(); - this.value = ''; - this.focusTracker.destroy(); - } - - /** - * Creates a textarea element. - * - * @param {Object} locale The localization services instance. - * @return {LabeledFieldView} The labeled field view for the textarea. - */ - _createTextareaView(locale) { - const bind = this.bindTemplate; - - const labeledTextareaView = new LabeledFieldView(locale, (labeledFieldView, viewUid) => { - const textareaView = new View(labeledFieldView.locale); - - /** - *