diff --git a/.gitignore b/.gitignore index db56f02565..85db037008 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,6 @@ public/sites/default/local.services.yml ## testing results *coverage.xml html-coverage + +# Ignore the folder created by Visual Studio Code +*:Zone.Identifier* diff --git a/README.md b/README.md index 2694a3b942..4cedebc70a 100644 --- a/README.md +++ b/README.md @@ -6,14 +6,13 @@ This project offers citizens a way to apply for different city grants for their ## Environments -Env | Branch | Url ------- |-----------| ----- -local | * | [https://hel-fi-drupal-grant-applications.docker.so/](https://hel-fi-drupal-grant-applications.docker.so/) -development | * | [https://avustukset.dev.hel.ninja](https://avustukset.dev.hel.ninja) -testing | develop | [https://avustukset.test.hel.ninja](https://avustukset.test.hel.ninja) -staging | release/* | [https://avustukset.stage.hel.ninja](https://avustukset.stage.hel.ninja) -production | main | [https://avustukset.hel.fi](https://avustukset.hel.fi) (https://nginx-avustusasiointi-prod.apps.platta.hel.fi/ before release) - +| Env | Branch | Url | +|-------------|--------------------------|------------------------------------------------------------------------------------------------------------| +| local | `*` | [https://hel-fi-drupal-grant-applications.docker.so/](https://hel-fi-drupal-grant-applications.docker.so/) | +| development | `*` | [https://avustukset.dev.hel.ninja](https://avustukset.dev.hel.ninja) | +| testing | `dev` | [https://avustukset.test.hel.ninja](https://avustukset.test.hel.ninja) | +| staging | `main` | [https://avustukset.stage.hel.ninja](https://avustukset.stage.hel.ninja) | +| production | `refs/tags/YYYY-MM-DD.X` | [https://avustukset.hel.fi](https://avustukset.hel.fi) | ## Requirements diff --git a/azure-pipelines-prod.yml b/azure-pipelines-prod.yml deleted file mode 100644 index a64ea8dd7c..0000000000 --- a/azure-pipelines-prod.yml +++ /dev/null @@ -1,37 +0,0 @@ -# File: drupal-helfi/azure-pipelines.yml - -# Continuous integration (CI) triggers cause a pipeline to run whenever you push -# an update to the specified branches or you push specified tags. -trigger: - batch: true - branches: - include: - - main - paths: - exclude: - - README.md - -# Pull request (PR) triggers cause a pipeline to run whenever a pull request is -# opened with one of the specified target branches, or when updates are made to -# such a pull request. -# -# GitHub creates a new ref when a pull request is created. The ref points to a -# merge commit, which is the merged code between the source and target branches -# of the pull request. -# -# Opt out of pull request validation -pr: none - -# By default, use self-hosted agents -pool: Default - -resources: - repositories: - # Azure DevOps repository - - repository: avustusasiointi-pipelines - type: git - # project/repository - name: avustusasiointi/avustusasiointi-pipelines - -extends: - template: azure-pipelines-drupal-prod.yml@avustusasiointi-pipelines diff --git a/azure-pipelines-staging.yml b/azure-pipelines-staging.yml deleted file mode 100644 index d8f731ef88..0000000000 --- a/azure-pipelines-staging.yml +++ /dev/null @@ -1,38 +0,0 @@ -# File: drupal-helfi/azure-pipelines.yml - -# Continuous integration (CI) triggers cause a pipeline to run whenever you push -# an update to the specified branches or you push specified tags. -trigger: - branches: - include: - - release/* - exclude: - - release/old* - paths: - exclude: - - README.md - -# Pull request (PR) triggers cause a pipeline to run whenever a pull request is -# opened with one of the specified target branches, or when updates are made to -# such a pull request. -# -# GitHub creates a new ref when a pull request is created. The ref points to a -# merge commit, which is the merged code between the source and target branches -# of the pull request. -# -# Opt out of pull request validation -pr: none - -# By default, use self-hosted agents -pool: Default - -resources: - repositories: - # Azure DevOps repository - - repository: avustusasiointi-pipelines - type: git - # project/repository - name: avustusasiointi/avustusasiointi-pipelines - -extends: - template: azure-pipelines-drupal-staging.yml@avustusasiointi-pipelines diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index aac0767b3c..0000000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,28 +0,0 @@ -# File: drupal-helfi/azure-pipelines.yml - -# Continuous integration (CI) triggers cause a pipeline to run whenever you push -# an update to the specified branches or you push specified tags. -trigger: - branches: - include: - - dev - paths: - exclude: - - README.md - -# By default, use self-hosted agents -pool: Default - -# Opting out of pull request validation -pr: none - -resources: - repositories: - # Azure DevOps repository - - repository: avustusasiointi-pipelines - type: git - # project/repository - name: avustusasiointi/avustusasiointi-pipelines - -extends: - template: azure-pipelines-drupal.yml@drupal-helfi diff --git a/compose.yaml b/compose.yaml index 99f55b2751..c680d449c0 100644 --- a/compose.yaml +++ b/compose.yaml @@ -163,7 +163,7 @@ services: chromium: # @todo Update this to newer version once minkphp supports Selenium 4. # @see https://github.com/minkphp/MinkSelenium2Driver/pull/372 - image: selenium/standalone-chrome:106.0 + image: seleniarm/standalone-chromium:106.0 networks: - internal profiles: diff --git a/composer.json b/composer.json index 5247d4dba9..c9e785219f 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,6 @@ "drupal/helfi_audit_log": "^0.9", "drupal/helfi_azure_fs": "^2", "drupal/helfi_drupal_tools": "dev-main", - "drupal/helfi_formtool_embed": "dev-develop", "drupal/helfi_gdpr_api": "^0.9", "drupal/helfi_helsinki_profiili": "^0.9.27", "drupal/helfi_platform_config": "^4.4", diff --git a/composer.lock b/composer.lock index e1cda871e5..d12e87a4fa 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": "8c0754a03ad8e1e9a27cbc8b5220de66", + "content-hash": "38071525925e6bd7d00e824da7bdc2fb", "packages": [ { "name": "asm89/stack-cors", @@ -314,29 +314,29 @@ }, { "name": "chillerlan/php-qrcode", - "version": "4.4.1", + "version": "4.4.2", "source": { "type": "git", "url": "https://github.com/chillerlan/php-qrcode.git", - "reference": "f5e243f3b61a60934780579430a951460f40888d" + "reference": "345ed8e4ffb56e6b3fcd9f42e3970b9026fa6ce4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/f5e243f3b61a60934780579430a951460f40888d", - "reference": "f5e243f3b61a60934780579430a951460f40888d", + "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/345ed8e4ffb56e6b3fcd9f42e3970b9026fa6ce4", + "reference": "345ed8e4ffb56e6b3fcd9f42e3970b9026fa6ce4", "shasum": "" }, "require": { - "chillerlan/php-settings-container": "^2.1.4 || ^3.1", + "chillerlan/php-settings-container": "^2.1.6 || ^3.2.1", "ext-mbstring": "*", "php": "^7.4 || ^8.0" }, "require-dev": { - "phan/phan": "^5.4", + "phan/phan": "^5.4.5", "phpmd/phpmd": "^2.15", "phpunit/phpunit": "^9.6", "setasign/fpdf": "^1.8.2", - "squizlabs/php_codesniffer": "^3.8" + "squizlabs/php_codesniffer": "^3.11" }, "suggest": { "chillerlan/php-authenticator": "Yet another Google authenticator! Also creates URIs for mobile apps.", @@ -379,19 +379,15 @@ ], "support": { "issues": "https://github.com/chillerlan/php-qrcode/issues", - "source": "https://github.com/chillerlan/php-qrcode/tree/4.4.1" + "source": "https://github.com/chillerlan/php-qrcode/tree/4.4.2" }, "funding": [ - { - "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4", - "type": "custom" - }, { "url": "https://ko-fi.com/codemasher", "type": "ko_fi" } ], - "time": "2024-01-06T16:56:58+00:00" + "time": "2024-11-15T15:36:24+00:00" }, { "name": "chillerlan/php-settings-container", @@ -1450,16 +1446,16 @@ }, { "name": "devizzent/cebe-php-openapi", - "version": "1.0.3", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/DEVizzent/cebe-php-openapi.git", - "reference": "b5a5de835dcb1642094fe76568451bd73b8fc0ab" + "reference": "9ae960c072eda54d8d0eb9dc14c1e6d815167347" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DEVizzent/cebe-php-openapi/zipball/b5a5de835dcb1642094fe76568451bd73b8fc0ab", - "reference": "b5a5de835dcb1642094fe76568451bd73b8fc0ab", + "url": "https://api.github.com/repos/DEVizzent/cebe-php-openapi/zipball/9ae960c072eda54d8d0eb9dc14c1e6d815167347", + "reference": "9ae960c072eda54d8d0eb9dc14c1e6d815167347", "shasum": "" }, "require": { @@ -1471,6 +1467,9 @@ "conflict": { "symfony/yaml": "3.4.0 - 3.4.4 || 4.0.0 - 4.4.17 || 5.0.0 - 5.1.9 || 5.2.0" }, + "replace": { + "cebe/php-openapi": "1.7.0" + }, "require-dev": { "apis-guru/openapi-directory": "1.0.0", "cebe/indent": "*", @@ -1478,7 +1477,7 @@ "oai/openapi-specification-3.0": "3.0.3", "oai/openapi-specification-3.1": "3.1.0", "phpstan/phpstan": "^0.12.0", - "phpunit/phpunit": "^6.5 || ^7.5 || ^8.5 || ^9.4" + "phpunit/phpunit": "^6.5 || ^7.5 || ^8.5 || ^9.4 || ^11.4" }, "bin": [ "bin/php-openapi" @@ -1519,7 +1518,7 @@ "issues": "https://github.com/DEVizzent/cebe-php-openapi/issues", "source": "https://github.com/DEVizzent/cebe-php-openapi" }, - "time": "2024-01-10T11:41:55+00:00" + "time": "2024-10-30T05:57:15+00:00" }, { "name": "dflydev/dot-access-data", @@ -2317,17 +2316,17 @@ }, { "name": "drupal/admin_toolbar", - "version": "3.5.0", + "version": "3.5.1", "source": { "type": "git", "url": "https://git.drupalcode.org/project/admin_toolbar.git", - "reference": "3.5.0" + "reference": "3.5.1" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/admin_toolbar-3.5.0.zip", - "reference": "3.5.0", - "shasum": "099e8d4dc98e1d551b4f9cffdc39599eb8ad04e8" + "url": "https://ftp.drupal.org/files/projects/admin_toolbar-3.5.1.zip", + "reference": "3.5.1", + "shasum": "b5215109836f7fade374fef531231e36c1c9b945" }, "require": { "drupal/core": "^9.5 || ^10 || ^11" @@ -2338,8 +2337,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "3.5.0", - "datestamp": "1722639094", + "version": "3.5.1", + "datestamp": "1730409973", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -3113,16 +3112,16 @@ }, { "name": "drupal/core", - "version": "10.3.10", + "version": "10.3.9", "source": { "type": "git", "url": "https://github.com/drupal/core.git", - "reference": "3ebb71e9c4ef0c13f683353547551fca49f9a144" + "reference": "42a6516491b4793158542a2326dc6ad1fe2aa5bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core/zipball/3ebb71e9c4ef0c13f683353547551fca49f9a144", - "reference": "3ebb71e9c4ef0c13f683353547551fca49f9a144", + "url": "https://api.github.com/repos/drupal/core/zipball/42a6516491b4793158542a2326dc6ad1fe2aa5bd", + "reference": "42a6516491b4793158542a2326dc6ad1fe2aa5bd", "shasum": "" }, "require": { @@ -3271,13 +3270,13 @@ ], "description": "Drupal is an open source content management platform powering millions of websites and applications.", "support": { - "source": "https://github.com/drupal/core/tree/10.3.10" + "source": "https://github.com/drupal/core/tree/10.3.9" }, - "time": "2024-11-22T12:51:33+00:00" + "time": "2024-11-20T17:59:45+00:00" }, { "name": "drupal/core-composer-scaffold", - "version": "10.3.6", + "version": "10.3.9", "source": { "type": "git", "url": "https://github.com/drupal/core-composer-scaffold.git", @@ -3321,7 +3320,7 @@ "drupal" ], "support": { - "source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.6" + "source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.9" }, "time": "2024-08-22T14:31:34+00:00" }, @@ -4103,17 +4102,17 @@ }, { "name": "drupal/editoria11y", - "version": "2.1.19", + "version": "2.1.21", "source": { "type": "git", "url": "https://git.drupalcode.org/project/editoria11y.git", - "reference": "2.1.19" + "reference": "2.1.21" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/editoria11y-2.1.19.zip", - "reference": "2.1.19", - "shasum": "0ccf651071837e1ee6fcfb8fbb1c279d2fc1bc27" + "url": "https://ftp.drupal.org/files/projects/editoria11y-2.1.21.zip", + "reference": "2.1.21", + "shasum": "6ec1bb5cfa15408e3372d7e0d0a1355030a9f20b" }, "require": { "drupal/core": "^9 || ^10 || ^11" @@ -4124,8 +4123,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "2.1.19", - "datestamp": "1726514804", + "version": "2.1.21", + "datestamp": "1731602531", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -4167,38 +4166,43 @@ }, { "name": "drupal/elasticsearch_connector", - "version": "7.0.0-alpha5", + "version": "8.0.0-alpha2", "source": { "type": "git", "url": "https://git.drupalcode.org/project/elasticsearch_connector.git", - "reference": "8.x-7.0-alpha5" + "reference": "8.0.0-alpha2" }, "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/elasticsearch_connector-8.0.0-alpha2.zip", + "reference": "8.0.0-alpha2", + "shasum": "35928100f913b7a1d57a362b528071034f2ae1ff" }, "require": { - "drupal/core": "^9.2 || ^10", - "ext-curl": "*", - "makinacorpus/php-lucene": "^1.0.2", - "nodespark/des-connector": "7.x-dev" + "drupal/core": "^9 || ^10 | ^11", + "drupal/search_api": "^1.23", + "elasticsearch/elasticsearch": "^8", + "makinacorpus/php-lucene": "^1.1", + "php": "^8" }, "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/coder": "^8.3", + "drupal/devel": "^4.0|^5.0", + "drupal/geofield": "1.x-dev", + "drush/drush": "^12.0 || ^13", + "phayes/geophp": "^1.2" + }, + "suggest": { + "drupal/facets": "Provides facetted search.", + "drupal/search_api_autocomplete": "Provides auto complete for search boxes.", + "drupal/search_api_location": "Provides location searches.", + "drupal/search_api_spellcheck": "Provides spell checking and 'Did You Mean?'." }, "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-7.0-alpha5", - "datestamp": "1718962853", + "version": "8.0.0-alpha2", + "datestamp": "1722668348", "security-coverage": { "status": "not-covered", "message": "Project has not opted into security advisory coverage!" @@ -4207,18 +4211,16 @@ }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { - "name": "Nikolay Ignatov", - "homepage": "http://www.nodespark.com", - "email": "nignatov@nodespark.com", - "role": "Creator and Maintainer" + "name": "lachezar.valchev", + "homepage": "https://www.drupal.org/user/1482368" }, { - "name": "See other contributors", - "homepage": "https://www.drupal.org/node/2159059/committers" + "name": "mparker17", + "homepage": "https://www.drupal.org/user/536298" }, { "name": "skek", @@ -4233,11 +4235,10 @@ "homepage": "https://www.drupal.org/user/257311" } ], - "description": "Elasticsearch Connector module for Drupal.", + "description": "Provides an ElasticSearch backend for Search API.", "homepage": "https://www.drupal.org/project/elasticsearch_connector", "support": { - "source": "https://github.com/nodespark/elasticsearch_connector", - "issues": "https://www.drupal.org/project/issues/elasticsearch_connector" + "source": "https://git.drupalcode.org/project/elasticsearch_connector" } }, { @@ -4381,17 +4382,17 @@ }, { "name": "drupal/entity_browser", - "version": "2.11.0", + "version": "2.12.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/entity_browser.git", - "reference": "8.x-2.11" + "reference": "8.x-2.12" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/entity_browser-8.x-2.11.zip", - "reference": "8.x-2.11", - "shasum": "4ead3d3f9f6365fbc25cfbd0edcc5e0a9cc52e02" + "url": "https://ftp.drupal.org/files/projects/entity_browser-8.x-2.12.zip", + "reference": "8.x-2.12", + "shasum": "eeafb55f02317c63b17d71913cb918e6341b7c0d" }, "require": { "drupal/core": "^10.2 || ^11" @@ -4413,8 +4414,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-2.11", - "datestamp": "1723378138", + "version": "8.x-2.12", + "datestamp": "1730631838", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -4454,7 +4455,7 @@ "homepage": "https://www.drupal.org/user/471638" }, { - "name": "Primsi", + "name": "primsi", "homepage": "https://www.drupal.org/user/282629" }, { @@ -4516,7 +4517,7 @@ ], "authors": [ { - "name": "Berdir", + "name": "berdir", "homepage": "https://www.drupal.org/user/214652" }, { @@ -4637,7 +4638,7 @@ ], "authors": [ { - "name": "Lullabot", + "name": "lullabot", "homepage": "https://www.drupal.org/user/3815489" }, { @@ -4645,7 +4646,7 @@ "homepage": "https://www.drupal.org/user/1288796" }, { - "name": "seanB", + "name": "seanb", "homepage": "https://www.drupal.org/user/545912" } ], @@ -5248,17 +5249,17 @@ }, { "name": "drupal/focal_point", - "version": "2.1.1", + "version": "2.1.2", "source": { "type": "git", "url": "https://git.drupalcode.org/project/focal_point.git", - "reference": "2.1.1" + "reference": "2.1.2" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/focal_point-2.1.1.zip", - "reference": "2.1.1", - "shasum": "f8c24bb4257f784176e79ec6f2b4c11ed46391e0" + "url": "https://ftp.drupal.org/files/projects/focal_point-2.1.2.zip", + "reference": "2.1.2", + "shasum": "5f8ffadd37748506c8f00314b1d45c947eb27cf7" }, "require": { "drupal/core": "^9.3 || ^10 || ^11", @@ -5270,8 +5271,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "2.1.1", - "datestamp": "1721126807", + "version": "2.1.2", + "datestamp": "1731556344", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -5486,16 +5487,16 @@ }, { "name": "drupal/hdbt", - "version": "6.7.19", + "version": "6.8.10", "source": { "type": "git", "url": "https://github.com/City-of-Helsinki/drupal-hdbt.git", - "reference": "2fadf070e0fee0baf582073856f47f9c62669d17" + "reference": "2427bb6c2988c157285e685308e16f0c66e8d5e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/City-of-Helsinki/drupal-hdbt/zipball/2fadf070e0fee0baf582073856f47f9c62669d17", - "reference": "2fadf070e0fee0baf582073856f47f9c62669d17", + "url": "https://api.github.com/repos/City-of-Helsinki/drupal-hdbt/zipball/2427bb6c2988c157285e685308e16f0c66e8d5e1", + "reference": "2427bb6c2988c157285e685308e16f0c66e8d5e1", "shasum": "" }, "require": { @@ -5514,23 +5515,23 @@ "Drupal" ], "support": { - "source": "https://github.com/City-of-Helsinki/drupal-hdbt/tree/6.7.19", + "source": "https://github.com/City-of-Helsinki/drupal-hdbt/tree/6.8.10", "issues": "https://github.com/City-of-Helsinki/drupal-hdbt/issues" }, - "time": "2024-10-23T10:00:39+00:00" + "time": "2024-11-22T12:52:59+00:00" }, { "name": "drupal/hdbt_admin", - "version": "3.2.5", + "version": "3.2.10", "source": { "type": "git", "url": "https://github.com/City-of-Helsinki/drupal-hdbt-admin.git", - "reference": "f3284d00c7cb52126c727b744ccac5108195544c" + "reference": "36437872af9f46e205ec7aff2ff27115e9c6edf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/City-of-Helsinki/drupal-hdbt-admin/zipball/f3284d00c7cb52126c727b744ccac5108195544c", - "reference": "f3284d00c7cb52126c727b744ccac5108195544c", + "url": "https://api.github.com/repos/City-of-Helsinki/drupal-hdbt-admin/zipball/36437872af9f46e205ec7aff2ff27115e9c6edf1", + "reference": "36437872af9f46e205ec7aff2ff27115e9c6edf1", "shasum": "" }, "require": { @@ -5543,6 +5544,13 @@ "drupal/helfi_platform_config": "<4.3" }, "type": "drupal-theme", + "extra": { + "patches": { + "drupal/gin": { + "[#UHF-10892] Gin sidebar nextsibling issue. (https://www.drupal.org/i/3460390)": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-hdbt-admin/d3e6cb08315b8df38696489d2c8f406a67f224b8/patches/gin-3460390-sidebar-nextsibling-innerhtml-rc11.patch" + } + } + }, "license": [ "GPL-2.0+" ], @@ -5551,10 +5559,10 @@ "Drupal" ], "support": { - "source": "https://github.com/City-of-Helsinki/drupal-hdbt-admin/tree/3.2.5", + "source": "https://github.com/City-of-Helsinki/drupal-hdbt-admin/tree/3.2.10", "issues": "https://github.com/City-of-Helsinki/drupal-hdbt-admin/issues" }, - "time": "2024-10-11T08:52:57+00:00" + "time": "2024-11-19T13:01:05+00:00" }, { "name": "drupal/health_check", @@ -5608,16 +5616,16 @@ }, { "name": "drupal/helfi_api_base", - "version": "2.7.11", + "version": "2.7.17", "source": { "type": "git", "url": "https://github.com/City-of-Helsinki/drupal-module-helfi-api-base.git", - "reference": "77ba93f8f9b02bb3e74344e1de0c50caf4d1557c" + "reference": "d5d46f30b9ec1ccac5b5bac130097454232e35a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/City-of-Helsinki/drupal-module-helfi-api-base/zipball/77ba93f8f9b02bb3e74344e1de0c50caf4d1557c", - "reference": "77ba93f8f9b02bb3e74344e1de0c50caf4d1557c", + "url": "https://api.github.com/repos/City-of-Helsinki/drupal-module-helfi-api-base/zipball/d5d46f30b9ec1ccac5b5bac130097454232e35a8", + "reference": "d5d46f30b9ec1ccac5b5bac130097454232e35a8", "shasum": "" }, "require": { @@ -5639,7 +5647,9 @@ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", "dg/bypass-finals": "^1.0", "donatj/mock-webserver": "dev-master", - "drupal/coder": "^8.3" + "drupal/coder": "^8.3", + "drupal/elasticsearch_connector": "^8.0@alpha", + "drupal/search_api": "^1.0" }, "type": "drupal-module", "license": [ @@ -5647,10 +5657,10 @@ ], "description": "Helfi - API Base", "support": { - "source": "https://github.com/City-of-Helsinki/drupal-module-helfi-api-base/tree/2.7.11", + "source": "https://github.com/City-of-Helsinki/drupal-module-helfi-api-base/tree/2.7.17", "issues": "https://github.com/City-of-Helsinki/drupal-module-helfi-api-base/issues" }, - "time": "2024-10-23T08:01:57+00:00" + "time": "2024-11-22T08:27:20+00:00" }, { "name": "drupal/helfi_atv", @@ -5718,16 +5728,16 @@ }, { "name": "drupal/helfi_azure_fs", - "version": "2.0.8", + "version": "2.0.9", "source": { "type": "git", "url": "https://github.com/City-of-Helsinki/drupal-module-helfi-azure-fs.git", - "reference": "c1ce8909d3ab797bd75e391ed6d80c06b82799c9" + "reference": "88aedf8ae9ba1216069fdb2e69366dd6b87c0a38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/City-of-Helsinki/drupal-module-helfi-azure-fs/zipball/c1ce8909d3ab797bd75e391ed6d80c06b82799c9", - "reference": "c1ce8909d3ab797bd75e391ed6d80c06b82799c9", + "url": "https://api.github.com/repos/City-of-Helsinki/drupal-module-helfi-azure-fs/zipball/88aedf8ae9ba1216069fdb2e69366dd6b87c0a38", + "reference": "88aedf8ae9ba1216069fdb2e69366dd6b87c0a38", "shasum": "" }, "require": { @@ -5757,10 +5767,10 @@ ], "description": "Helfi - Azure FS", "support": { - "source": "https://github.com/City-of-Helsinki/drupal-module-helfi-azure-fs/tree/2.0.8", + "source": "https://github.com/City-of-Helsinki/drupal-module-helfi-azure-fs/tree/2.0.9", "issues": "https://github.com/City-of-Helsinki/drupal-module-helfi-azure-fs/issues" }, - "time": "2024-10-23T12:15:22+00:00" + "time": "2024-10-28T13:45:59+00:00" }, { "name": "drupal/helfi_drupal_tools", @@ -5847,36 +5857,6 @@ }, "time": "2024-10-23T10:28:01+00:00" }, - { - "name": "drupal/helfi_formtool_embed", - "version": "dev-develop", - "source": { - "type": "git", - "url": "https://github.com/City-of-Helsinki/drupal-module-helfi-form-tool-embed.git", - "reference": "535d08eba1b7cb3ae22b4002134c41c5c9c56b14" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/City-of-Helsinki/drupal-module-helfi-form-tool-embed/zipball/535d08eba1b7cb3ae22b4002134c41c5c9c56b14", - "reference": "535d08eba1b7cb3ae22b4002134c41c5c9c56b14", - "shasum": "" - }, - "type": "drupal-module", - "autoload": { - "psr-4": { - "Drupal\\HelfiFormtoolEmbed\\": "src/" - } - }, - "license": [ - "GPL-2.0-or-later" - ], - "description": "Embed form tool to Drupal", - "support": { - "source": "https://github.com/City-of-Helsinki/drupal-module-helfi-form-tool-embed/tree/develop", - "issues": "https://github.com/City-of-Helsinki/drupal-module-helfi-form-tool-embed/issues" - }, - "time": "2022-10-31T06:19:43+00:00" - }, { "name": "drupal/helfi_gdpr_api", "version": "0.9.8", @@ -5951,16 +5931,16 @@ }, { "name": "drupal/helfi_platform_config", - "version": "4.6.20", + "version": "4.8.0", "source": { "type": "git", "url": "https://github.com/City-of-Helsinki/drupal-helfi-platform-config.git", - "reference": "f5451a53f0e83dcf1fc811c9ced0687f43cd4b7f" + "reference": "d93cdc55e761665a2bb68503f466ab376a745c10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/City-of-Helsinki/drupal-helfi-platform-config/zipball/f5451a53f0e83dcf1fc811c9ced0687f43cd4b7f", - "reference": "f5451a53f0e83dcf1fc811c9ced0687f43cd4b7f", + "url": "https://api.github.com/repos/City-of-Helsinki/drupal-helfi-platform-config/zipball/d93cdc55e761665a2bb68503f466ab376a745c10", + "reference": "d93cdc55e761665a2bb68503f466ab376a745c10", "shasum": "" }, "require": { @@ -5978,7 +5958,7 @@ "drupal/diff": "^1.0", "drupal/easy_breadcrumb": "^2.0", "drupal/editoria11y": "^2.0", - "drupal/elasticsearch_connector": "^7.0@alpha", + "drupal/elasticsearch_connector": "^8.0@alpha", "drupal/entity_browser": "^2.5", "drupal/entity_usage": "^2.0@beta", "drupal/eu_cookie_compliance": "1.24", @@ -6025,7 +6005,8 @@ "drupal/views_bulk_operations": "^4.1", "ext-curl": "*", "league/uri": "^6.0", - "php": "^8.1" + "php": "^8.1", + "ruflin/elastica": "^8.0" }, "conflict": { "drupal/core": "<10.3", @@ -6037,6 +6018,9 @@ "drupal/stage_file_proxy": "<2.1.5", "drush/drush": "<12" }, + "require-dev": { + "dg/bypass-finals": "^1.0" + }, "type": "drupal-module", "extra": { "patches": { @@ -6053,7 +6037,8 @@ "[#UHF-9388] Process configuration translation files for custom modules (https://www.drupal.org/i/2845437)": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/fd68277191b8f8ec290e53b5fbbae699b2260384/patches/drupal-2845437-process-custom-module-translation-config-10.3.x.patch", "[#UHF-9690] Allow updating lists when switching from allowed values to allowed values function (https://www.drupal.org/i/2873353)": "https://www.drupal.org/files/issues/2021-05-18/allow-allowed-values-function-update-D9-2873353_1.patch", "[#UHF-9952, #UHF-9980] Duplicate
tags (https://www.drupal.org/i/3083786)": "https://www.drupal.org/files/issues/2024-08-08/3083786--mr-8066--10-3-backport.patch", - "[#UHF-10716] Ensure consistent ordering when calculating library asset order (https://www.drupal.org/i/3467860)": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/955e2fc9493c6574ab070187b8a5a8634da7daab/patches/drupal-3467860-optimized-js-assets-mismatch.patch" + "[#UHF-10716] Ensure consistent ordering when calculating library asset order (https://www.drupal.org/i/3467860)": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/955e2fc9493c6574ab070187b8a5a8634da7daab/patches/drupal-3467860-optimized-js-assets-mismatch.patch", + "[#UHF-10967] Performance Degraded after update to twig 3.14.2 (https://www.drupal.org/project/drupal/issues/3487031)": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/90b44ce5a778d05bbe89f7eaca6412b7bd34efa0/patches/10177.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" @@ -6071,6 +6056,9 @@ }, "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" + }, + "drupal/elasticsearch_connector": { + "https://drupal.org/i/3486375": "https://raw.githubusercontent.com/City-of-Helsinki/drupal-helfi-platform-config/be8a1fba1a5ea2422154caf4fb7183dfc3917599/patches/3486375.patch" } } }, @@ -6079,10 +6067,10 @@ ], "description": "HELfi platform config", "support": { - "source": "https://github.com/City-of-Helsinki/drupal-helfi-platform-config/tree/4.6.20", + "source": "https://github.com/City-of-Helsinki/drupal-helfi-platform-config/tree/4.8.0", "issues": "https://github.com/City-of-Helsinki/drupal-helfi-platform-config/issues" }, - "time": "2024-10-24T12:01:48+00:00" + "time": "2024-11-20T11:35:52+00:00" }, { "name": "drupal/helfi_proxy", @@ -6131,16 +6119,16 @@ }, { "name": "drupal/helfi_tpr", - "version": "2.3.8", + "version": "2.3.9", "source": { "type": "git", "url": "https://github.com/City-of-Helsinki/drupal-module-helfi-tpr.git", - "reference": "b64f239e7b8379cbc97dfc28d35e8c3f2db80162" + "reference": "6cca3df5dc891c98ae40e8259856a343d9abd8ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/City-of-Helsinki/drupal-module-helfi-tpr/zipball/b64f239e7b8379cbc97dfc28d35e8c3f2db80162", - "reference": "b64f239e7b8379cbc97dfc28d35e8c3f2db80162", + "url": "https://api.github.com/repos/City-of-Helsinki/drupal-module-helfi-tpr/zipball/6cca3df5dc891c98ae40e8259856a343d9abd8ca", + "reference": "6cca3df5dc891c98ae40e8259856a343d9abd8ca", "shasum": "" }, "require": { @@ -6166,10 +6154,10 @@ ], "description": "TPR integration", "support": { - "source": "https://github.com/City-of-Helsinki/drupal-module-helfi-tpr/tree/2.3.8", + "source": "https://github.com/City-of-Helsinki/drupal-module-helfi-tpr/tree/2.3.9", "issues": "https://github.com/City-of-Helsinki/drupal-module-helfi-tpr/issues" }, - "time": "2024-03-25T06:40:36+00:00" + "time": "2024-11-07T13:09:51+00:00" }, { "name": "drupal/helfi_tunnistamo", @@ -6289,20 +6277,20 @@ }, { "name": "drupal/image_style_quality", - "version": "1.6.0", + "version": "1.7.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/image_style_quality.git", - "reference": "8.x-1.6" + "reference": "8.x-1.7" }, "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://ftp.drupal.org/files/projects/image_style_quality-8.x-1.7.zip", + "reference": "8.x-1.7", + "shasum": "3cb3d326e3df3b78cadc91bae1fd9de17dd27bc7" }, "require": { - "drupal/core": "^8 || ^9 || ^10", + "drupal/core": "^8 || ^9 || ^10 || ^11", "php": ">=7.4" }, "require-dev": { @@ -6316,8 +6304,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-1.6", - "datestamp": "1679497333", + "version": "8.x-1.7", + "datestamp": "1730925822", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -6338,7 +6326,7 @@ "homepage": "https://www.drupal.org/user/1463982" }, { - "name": "Sam152", + "name": "sam152", "homepage": "https://www.drupal.org/user/1485048" } ], @@ -7377,17 +7365,17 @@ }, { "name": "drupal/metatag", - "version": "2.0.2", + "version": "2.1.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/metatag.git", - "reference": "2.0.2" + "reference": "2.1.0" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/metatag-2.0.2.zip", - "reference": "2.0.2", - "shasum": "748013c50a0ed5e10359413bb3481392a0bf0d3f" + "url": "https://ftp.drupal.org/files/projects/metatag-2.1.0.zip", + "reference": "2.1.0", + "shasum": "c28fe2fdac68a9370a6af6cbafff4425dd5148f3" }, "require": { "drupal/core": "^9.4 || ^10 || ^11", @@ -7395,6 +7383,7 @@ "php": ">=8.0" }, "require-dev": { + "drupal/forum": "*", "drupal/hal": "^1 || ^2 || ^9", "drupal/metatag_dc": "*", "drupal/metatag_open_graph": "*", @@ -7406,8 +7395,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "2.0.2", - "datestamp": "1722869772", + "version": "2.1.0", + "datestamp": "1731004042", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -7567,17 +7556,17 @@ }, { "name": "drupal/oembed_providers", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://git.drupalcode.org/project/oembed_providers.git", - "reference": "2.2.0" + "reference": "2.2.1" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/oembed_providers-2.2.0.zip", - "reference": "2.2.0", - "shasum": "318bafadd5e9b74a593f08e252dc5ea6dec98cd2" + "url": "https://ftp.drupal.org/files/projects/oembed_providers-2.2.1.zip", + "reference": "2.2.1", + "shasum": "b98ffb8bb1b16756bcb7a7ea207dee3e5d414759" }, "require": { "drupal/core": "^10|^11" @@ -7585,8 +7574,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "2.2.0", - "datestamp": "1723853165", + "version": "2.2.1", + "datestamp": "1729877996", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -7779,7 +7768,7 @@ ], "authors": [ { - "name": "Berdir", + "name": "berdir", "homepage": "https://www.drupal.org/user/214652" }, { @@ -7799,7 +7788,7 @@ "homepage": "https://www.drupal.org/user/227761" }, { - "name": "Primsi", + "name": "primsi", "homepage": "https://www.drupal.org/user/282629" } ], @@ -8297,17 +8286,17 @@ }, { "name": "drupal/raven", - "version": "6.0.10", + "version": "6.0.11", "source": { "type": "git", "url": "https://git.drupalcode.org/project/raven.git", - "reference": "6.0.10" + "reference": "6.0.11" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/raven-6.0.10.zip", - "reference": "6.0.10", - "shasum": "df0cce5b87bd76ce933d88afd91ebcd75741d329" + "url": "https://ftp.drupal.org/files/projects/raven-6.0.11.zip", + "reference": "6.0.11", + "shasum": "117934d82d34efde8a50247406fcf83d475a2be5" }, "require": { "drupal/core": "^10.2 || ^11", @@ -8321,8 +8310,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "6.0.10", - "datestamp": "1728022661", + "version": "6.0.11", + "datestamp": "1730515647", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -8522,6 +8511,10 @@ "name": "nerdstein", "homepage": "https://www.drupal.org/user/1557710" }, + { + "name": "ptmkenny", + "homepage": "https://www.drupal.org/user/97885" + }, { "name": "rlhawk", "homepage": "https://www.drupal.org/user/352283" @@ -9442,17 +9435,17 @@ }, { "name": "drupal/stomp", - "version": "2.0.0-alpha4", + "version": "2.0.0-alpha5", "source": { "type": "git", "url": "https://git.drupalcode.org/project/stomp.git", - "reference": "2.0.0-alpha4" + "reference": "2.0.0-alpha5" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/stomp-2.0.0-alpha4.zip", - "reference": "2.0.0-alpha4", - "shasum": "624db88867009eab5da9ccc259a396eb79927809" + "url": "https://ftp.drupal.org/files/projects/stomp-2.0.0-alpha5.zip", + "reference": "2.0.0-alpha5", + "shasum": "5f904047325f8f55674c77e16f61a4807cb51f7e" }, "require": { "drupal/core": "^9 || ^10 || ^11", @@ -9465,18 +9458,18 @@ "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", "drupal/coder": "^8.3", - "drush/drush": "^11.6 || ^12", + "drush/drush": "^11.6 || ^12 || ^13", "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" + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.1" }, "type": "drupal-module", "extra": { "drupal": { - "version": "2.0.0-alpha4", - "datestamp": "1711347968", + "version": "2.0.0-alpha5", + "datestamp": "1731482648", "security-coverage": { "status": "not-covered", "message": "Alpha releases are not covered by Drupal security advisories." @@ -10073,17 +10066,17 @@ }, { "name": "drupal/views_bulk_operations", - "version": "4.3.1", + "version": "4.3.2", "source": { "type": "git", "url": "https://git.drupalcode.org/project/views_bulk_operations.git", - "reference": "4.3.1" + "reference": "4.3.2" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/views_bulk_operations-4.3.1.zip", - "reference": "4.3.1", - "shasum": "1089fe41ddb01313f34d55e19e8f3a5157889430" + "url": "https://ftp.drupal.org/files/projects/views_bulk_operations-4.3.2.zip", + "reference": "4.3.2", + "shasum": "b3d0ee06abb15520595b83324e93c5500d5dcef3" }, "require": { "drupal/core": "^10.3 || ^11" @@ -10100,8 +10093,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "4.3.1", - "datestamp": "1729683242", + "version": "4.3.2", + "datestamp": "1731070018", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -10830,198 +10823,137 @@ "time": "2023-10-06T06:47:41+00:00" }, { - "name": "elasticsearch/elasticsearch", - "version": "v7.17.2", - "source": { - "type": "git", - "url": "https://github.com/elastic/elasticsearch-php.git", - "reference": "2d302233f2bb0926812d82823bb820d405e130fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/2d302233f2bb0926812d82823bb820d405e130fc", - "reference": "2d302233f2bb0926812d82823bb820d405e130fc", - "shasum": "" - }, - "require": { - "ext-json": ">=1.3.7", - "ezimuel/ringphp": "^1.1.2", - "php": "^7.3 || ^8.0", - "psr/log": "^1|^2|^3" - }, - "require-dev": { - "ext-yaml": "*", - "ext-zip": "*", - "mockery/mockery": "^1.2", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.3", - "squizlabs/php_codesniffer": "^3.4", - "symfony/finder": "~4.0" - }, - "suggest": { - "ext-curl": "*", - "monolog/monolog": "Allows for client-level logging and tracing" - }, - "type": "library", - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Elasticsearch\\": "src/Elasticsearch/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0", - "LGPL-2.1-only" - ], - "authors": [ - { - "name": "Zachary Tong" - }, - { - "name": "Enrico Zimuel" - } - ], - "description": "PHP Client for Elasticsearch", - "keywords": [ - "client", - "elasticsearch", - "search" - ], - "support": { - "issues": "https://github.com/elastic/elasticsearch-php/issues", - "source": "https://github.com/elastic/elasticsearch-php/tree/v7.17.2" - }, - "time": "2023-04-21T15:31:12+00:00" - }, - { - "name": "ezimuel/guzzlestreams", - "version": "3.1.0", + "name": "elastic/transport", + "version": "v8.10.0", "source": { "type": "git", - "url": "https://github.com/ezimuel/guzzlestreams.git", - "reference": "b4b5a025dfee70d6cd34c780e07330eb93d5b997" + "url": "https://github.com/elastic/elastic-transport-php.git", + "reference": "8be37d679637545e50b1cea9f8ee903888783021" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ezimuel/guzzlestreams/zipball/b4b5a025dfee70d6cd34c780e07330eb93d5b997", - "reference": "b4b5a025dfee70d6cd34c780e07330eb93d5b997", + "url": "https://api.github.com/repos/elastic/elastic-transport-php/zipball/8be37d679637545e50b1cea9f8ee903888783021", + "reference": "8be37d679637545e50b1cea9f8ee903888783021", "shasum": "" }, "require": { - "php": ">=5.4.0" + "composer-runtime-api": "^2.0", + "open-telemetry/api": "^1.0", + "php": "^7.4 || ^8.0", + "php-http/discovery": "^1.14", + "php-http/httplug": "^2.3", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/log": "^1 || ^2 || ^3" }, "require-dev": { - "phpunit/phpunit": "~9.0" + "nyholm/psr7": "^1.5", + "open-telemetry/sdk": "^1.0", + "php-http/mock-client": "^1.5", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9.5", + "symfony/http-client": "^5.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, "autoload": { "psr-4": { - "GuzzleHttp\\Stream\\": "src/" + "Elastic\\Transport\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Fork of guzzle/streams (abandoned) to be used with elasticsearch-php", - "homepage": "http://guzzlephp.org/", + "description": "HTTP transport PHP library for Elastic products", "keywords": [ - "Guzzle", - "stream" + "PSR_17", + "elastic", + "http", + "psr-18", + "psr-7", + "transport" ], "support": { - "source": "https://github.com/ezimuel/guzzlestreams/tree/3.1.0" + "issues": "https://github.com/elastic/elastic-transport-php/issues", + "source": "https://github.com/elastic/elastic-transport-php/tree/v8.10.0" }, - "time": "2022-10-24T12:58:50+00:00" + "time": "2024-08-14T08:55:07+00:00" }, { - "name": "ezimuel/ringphp", - "version": "1.2.2", + "name": "elasticsearch/elasticsearch", + "version": "v8.16.0", "source": { "type": "git", - "url": "https://github.com/ezimuel/ringphp.git", - "reference": "7887fc8488013065f72f977dcb281994f5fde9f4" + "url": "https://github.com/elastic/elasticsearch-php.git", + "reference": "ab0fdb43f9e69f0d0539028d8b0b56cdf3328d85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ezimuel/ringphp/zipball/7887fc8488013065f72f977dcb281994f5fde9f4", - "reference": "7887fc8488013065f72f977dcb281994f5fde9f4", + "url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/ab0fdb43f9e69f0d0539028d8b0b56cdf3328d85", + "reference": "ab0fdb43f9e69f0d0539028d8b0b56cdf3328d85", "shasum": "" }, "require": { - "ezimuel/guzzlestreams": "^3.0.1", - "php": ">=5.4.0", - "react/promise": "~2.0" - }, - "replace": { - "guzzlehttp/ringphp": "self.version" + "elastic/transport": "^8.10", + "guzzlehttp/guzzle": "^7.0", + "php": "^7.4 || ^8.0", + "psr/http-client": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "psr/log": "^1|^2|^3" }, "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "~9.0" - }, - "suggest": { - "ext-curl": "Guzzle will use specific adapters if cURL is present" + "ext-yaml": "*", + "ext-zip": "*", + "mockery/mockery": "^1.5", + "nyholm/psr7": "^1.5", + "php-http/message-factory": "^1.0", + "php-http/mock-client": "^1.5", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9.5", + "psr/http-factory": "^1.0", + "symfony/finder": "~4.0", + "symfony/http-client": "^5.0|^6.0|^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, "autoload": { "psr-4": { - "GuzzleHttp\\Ring\\": "src/" + "Elastic\\Elasticsearch\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } + "description": "PHP Client for Elasticsearch", + "keywords": [ + "client", + "elastic", + "elasticsearch", + "search" ], - "description": "Fork of guzzle/RingPHP (abandoned) to be used with elasticsearch-php", "support": { - "source": "https://github.com/ezimuel/ringphp/tree/1.2.2" + "issues": "https://github.com/elastic/elasticsearch-php/issues", + "source": "https://github.com/elastic/elasticsearch-php/tree/v8.16.0" }, - "time": "2022-12-07T11:28:53+00:00" + "time": "2024-11-14T22:23:33+00:00" }, { "name": "ezyang/htmlpurifier", - "version": "v4.17.0", + "version": "v4.18.0", "source": { "type": "git", "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c" + "reference": "cb56001e54359df7ae76dc522d08845dc741621b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/bbc513d79acf6691fa9cf10f192c90dd2957f18c", - "reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/cb56001e54359df7ae76dc522d08845dc741621b", + "reference": "cb56001e54359df7ae76dc522d08845dc741621b", "shasum": "" }, "require": { - "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { "cerdic/css-tidy": "^1.7 || ^2.0", @@ -11063,9 +10995,9 @@ ], "support": { "issues": "https://github.com/ezyang/htmlpurifier/issues", - "source": "https://github.com/ezyang/htmlpurifier/tree/v4.17.0" + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.18.0" }, - "time": "2023-11-17T15:01:25+00:00" + "time": "2024-11-01T03:51:45+00:00" }, { "name": "fileeye/mimemap", @@ -11844,28 +11776,28 @@ }, { "name": "jean85/pretty-package-versions", - "version": "2.0.6", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4" + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4", - "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", "shasum": "" }, "require": { - "composer-runtime-api": "^2.0.0", - "php": "^7.1|^8.0" + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "jean85/composer-provided-replaced-stub-package": "^1.0", "phpstan/phpstan": "^1.4", - "phpunit/phpunit": "^7.5|^8.5|^9.4", - "vimeo/psalm": "^4.3" + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "vimeo/psalm": "^4.3 || ^5.0" }, "type": "library", "extra": { @@ -11897,9 +11829,9 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.0" }, - "time": "2024-03-08T09:58:59+00:00" + "time": "2024-11-18T16:19:46+00:00" }, { "name": "justinrainbow/json-schema", @@ -11968,16 +11900,16 @@ }, { "name": "league/container", - "version": "4.2.3", + "version": "4.2.4", "source": { "type": "git", "url": "https://github.com/thephpleague/container.git", - "reference": "72f9bebe7bd623007782a40f5ec305661ab706d8" + "reference": "7ea728b013b9a156c409c6f0fc3624071b742dec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/container/zipball/72f9bebe7bd623007782a40f5ec305661ab706d8", - "reference": "72f9bebe7bd623007782a40f5ec305661ab706d8", + "url": "https://api.github.com/repos/thephpleague/container/zipball/7ea728b013b9a156c409c6f0fc3624071b742dec", + "reference": "7ea728b013b9a156c409c6f0fc3624071b742dec", "shasum": "" }, "require": { @@ -12038,7 +11970,7 @@ ], "support": { "issues": "https://github.com/thephpleague/container/issues", - "source": "https://github.com/thephpleague/container/tree/4.2.3" + "source": "https://github.com/thephpleague/container/tree/4.2.4" }, "funding": [ { @@ -12046,7 +11978,7 @@ "type": "github" } ], - "time": "2024-10-23T12:06:58+00:00" + "time": "2024-11-10T12:42:13+00:00" }, { "name": "league/flysystem", @@ -12789,16 +12721,16 @@ }, { "name": "monolog/monolog", - "version": "3.7.0", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" + "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", - "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/32e515fdc02cdafbe4593e30a9350d486b125b67", + "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67", "shasum": "" }, "require": { @@ -12818,12 +12750,14 @@ "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^10.5.17", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", "predis/predis": "^1.1 || ^2", - "ruflin/elastica": "^7", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", "symfony/mailer": "^5.4 || ^6", "symfony/mime": "^5.4 || ^6" }, @@ -12874,7 +12808,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.7.0" + "source": "https://github.com/Seldaek/monolog/tree/3.8.0" }, "funding": [ { @@ -12886,7 +12820,7 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:40:51+00:00" + "time": "2024-11-12T13:57:08+00:00" }, { "name": "nesbot/carbon", @@ -13053,62 +12987,6 @@ }, "time": "2024-10-08T18:51:32+00:00" }, - { - "name": "nodespark/des-connector", - "version": "7.x-dev", - "source": { - "type": "git", - "url": "https://github.com/tuutti/des-connector.git", - "reference": "a075a6b9e54b5855d0a292d9266839312e6026dc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/tuutti/des-connector/zipball/a075a6b9e54b5855d0a292d9266839312e6026dc", - "reference": "a075a6b9e54b5855d0a292d9266839312e6026dc", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "ruflin/elastica": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^8.4.1 || ^9" - }, - "type": "library", - "autoload": { - "psr-4": { - "nodespark\\DESConnector\\": "src/DESConnector/" - } - }, - "autoload-dev": { - "psr-4": { - "nodespark\\DESConnector\\Test\\": "tests/" - } - }, - "license": [ - "LGPL-2.1" - ], - "authors": [ - { - "name": "Nikolay Ignatov", - "email": "nignatov@nodespark.com", - "homepage": "http://www.nodespark.com", - "role": "Creator and Maintainer" - }, - { - "name": "Lachezar Valchev", - "email": "lachezar.valchev@gmail.com", - "homepage": "https://drupal.org/u/lachezar.valchev", - "role": "Maintainer" - } - ], - "description": "An abstraction library for Elasticsearch Connector module for Drupal.", - "homepage": "https://github.com/nodespark/des-connector", - "support": { - "source": "https://github.com/nodespark/des-connector" - }, - "time": "2022-12-05T10:56:20+00:00" - }, { "name": "npm-asset/select2", "version": "4.0.13", @@ -13122,34 +13000,36 @@ ] }, { - "name": "nyholm/dsn", + "name": "oomphinc/composer-installers-extender", "version": "2.0.1", "source": { "type": "git", - "url": "https://github.com/Nyholm/dsn.git", - "reference": "9445621b426bac8c0ca161db8cd700da00a4e618" + "url": "https://github.com/oomphinc/composer-installers-extender.git", + "reference": "cbf4b6f9a24153b785d09eee755b995ba87bd5f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nyholm/dsn/zipball/9445621b426bac8c0ca161db8cd700da00a4e618", - "reference": "9445621b426bac8c0ca161db8cd700da00a4e618", + "url": "https://api.github.com/repos/oomphinc/composer-installers-extender/zipball/cbf4b6f9a24153b785d09eee755b995ba87bd5f9", + "reference": "cbf4b6f9a24153b785d09eee755b995ba87bd5f9", "shasum": "" }, "require": { + "composer-plugin-api": "^1.1 || ^2.0", + "composer/installers": "^1.0 || ^2.0", "php": ">=7.1" }, "require-dev": { - "symfony/phpunit-bridge": "^5.1" + "composer/composer": "^2.0", + "phpunit/phpunit": "^7.2", + "squizlabs/php_codesniffer": "^3.3" }, - "type": "library", + "type": "composer-plugin", "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } + "class": "OomphInc\\ComposerInstallersExtender\\Plugin" }, "autoload": { "psr-4": { - "Nyholm\\Dsn\\": "src/" + "OomphInc\\ComposerInstallersExtender\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -13158,86 +13038,149 @@ ], "authors": [ { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com" + "name": "Stephen Beemsterboer", + "email": "stephen@oomphinc.com", + "homepage": "https://github.com/balbuf" + }, + { + "name": "Nathan Dentzau", + "email": "nate@oomphinc.com", + "homepage": "http://oomph.is/ndentzau" } ], - "description": "Parse your DSN strings in a powerful and flexible way", - "homepage": "http://tnyholm.se", - "keywords": [ - "database", - "dsn", - "dsn parser", - "parser" - ], + "description": "Extend the composer/installers plugin to accept any arbitrary package type.", + "homepage": "http://www.oomphinc.com/", "support": { - "issues": "https://github.com/Nyholm/dsn/issues", - "source": "https://github.com/Nyholm/dsn/tree/2.0.1" + "issues": "https://github.com/oomphinc/composer-installers-extender/issues", + "source": "https://github.com/oomphinc/composer-installers-extender/tree/2.0.1" }, - "funding": [ + "time": "2021-12-15T12:32:42+00:00" + }, + { + "name": "open-telemetry/api", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/opentelemetry-php/api.git", + "reference": "87de95d926f46262885d0d390060c095af13e2e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/87de95d926f46262885d0d390060c095af13e2e5", + "reference": "87de95d926f46262885d0d390060c095af13e2e5", + "shasum": "" + }, + "require": { + "open-telemetry/context": "^1.0", + "php": "^7.4 || ^8.0", + "psr/log": "^1.1|^2.0|^3.0", + "symfony/polyfill-php80": "^1.26", + "symfony/polyfill-php81": "^1.26", + "symfony/polyfill-php82": "^1.26" + }, + "conflict": { + "open-telemetry/sdk": "<=1.0.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0.x-dev" + } + }, + "autoload": { + "files": [ + "Trace/functions.php" + ], + "psr-4": { + "OpenTelemetry\\API\\": "." + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ { - "url": "https://github.com/Nyholm", - "type": "github" + "name": "opentelemetry-php contributors", + "homepage": "https://github.com/open-telemetry/opentelemetry-php/graphs/contributors" } ], - "time": "2021-11-18T09:23:29+00:00" + "description": "API for OpenTelemetry PHP.", + "keywords": [ + "Metrics", + "api", + "apm", + "logging", + "opentelemetry", + "otel", + "tracing" + ], + "support": { + "chat": "https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V", + "docs": "https://opentelemetry.io/docs/php", + "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", + "source": "https://github.com/open-telemetry/opentelemetry-php" + }, + "time": "2024-02-06T01:32:25+00:00" }, { - "name": "oomphinc/composer-installers-extender", - "version": "2.0.1", + "name": "open-telemetry/context", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/oomphinc/composer-installers-extender.git", - "reference": "cbf4b6f9a24153b785d09eee755b995ba87bd5f9" + "url": "https://github.com/opentelemetry-php/context.git", + "reference": "0cba875ea1953435f78aec7f1d75afa87bdbf7f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/oomphinc/composer-installers-extender/zipball/cbf4b6f9a24153b785d09eee755b995ba87bd5f9", - "reference": "cbf4b6f9a24153b785d09eee755b995ba87bd5f9", + "url": "https://api.github.com/repos/opentelemetry-php/context/zipball/0cba875ea1953435f78aec7f1d75afa87bdbf7f3", + "reference": "0cba875ea1953435f78aec7f1d75afa87bdbf7f3", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1 || ^2.0", - "composer/installers": "^1.0 || ^2.0", - "php": ">=7.1" + "php": "^8.1", + "symfony/polyfill-php82": "^1.26" }, - "require-dev": { - "composer/composer": "^2.0", - "phpunit/phpunit": "^7.2", - "squizlabs/php_codesniffer": "^3.3" + "suggest": { + "ext-ffi": "To allow context switching in Fibers" }, - "type": "composer-plugin", + "type": "library", "extra": { - "class": "OomphInc\\ComposerInstallersExtender\\Plugin" + "branch-alias": { + "dev-main": "1.0.x-dev" + } }, "autoload": { + "files": [ + "fiber/initialize_fiber_handler.php" + ], "psr-4": { - "OomphInc\\ComposerInstallersExtender\\": "src/" + "OpenTelemetry\\Context\\": "." } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "Apache-2.0" ], "authors": [ { - "name": "Stephen Beemsterboer", - "email": "stephen@oomphinc.com", - "homepage": "https://github.com/balbuf" - }, - { - "name": "Nathan Dentzau", - "email": "nate@oomphinc.com", - "homepage": "http://oomph.is/ndentzau" + "name": "opentelemetry-php contributors", + "homepage": "https://github.com/open-telemetry/opentelemetry-php/graphs/contributors" } ], - "description": "Extend the composer/installers plugin to accept any arbitrary package type.", - "homepage": "http://www.oomphinc.com/", + "description": "Context implementation for OpenTelemetry PHP.", + "keywords": [ + "Context", + "opentelemetry", + "otel" + ], "support": { - "issues": "https://github.com/oomphinc/composer-installers-extender/issues", - "source": "https://github.com/oomphinc/composer-installers-extender/tree/2.0.1" + "chat": "https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V", + "docs": "https://opentelemetry.io/docs/php", + "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", + "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2021-12-15T12:32:42+00:00" + "time": "2024-08-21T00:29:20+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -13479,16 +13422,16 @@ }, { "name": "pear/pear-core-minimal", - "version": "v1.10.16", + "version": "v1.10.15", "source": { "type": "git", "url": "https://github.com/pear/pear-core-minimal.git", - "reference": "c0f51b45f50683bf5bbf558036854ebc9b54d033" + "reference": "ce0adade8b97561656ace07cdaac4751c271ea8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/c0f51b45f50683bf5bbf558036854ebc9b54d033", - "reference": "c0f51b45f50683bf5bbf558036854ebc9b54d033", + "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/ce0adade8b97561656ace07cdaac4751c271ea8c", + "reference": "ce0adade8b97561656ace07cdaac4751c271ea8c", "shasum": "" }, "require": { @@ -13524,7 +13467,7 @@ "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR", "source": "https://github.com/pear/pear-core-minimal" }, - "time": "2024-11-24T22:27:58+00:00" + "time": "2024-03-16T18:41:45+00:00" }, { "name": "pear/pear_exception", @@ -13689,6 +13632,194 @@ }, "time": "2024-10-03T13:43:19+00:00" }, + { + "name": "php-http/discovery", + "version": "1.20.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", + "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.20.0" + }, + "time": "2024-10-02T11:20:13+00:00" + }, + { + "name": "php-http/httplug", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4", + "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.1" + }, + "time": "2024-09-23T11:39:58+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": "phpowermove/docblock", "version": "v4.0", @@ -14712,78 +14843,6 @@ ], "time": "2024-04-27T21:32:50+00:00" }, - { - "name": "react/promise", - "version": "v2.11.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "1a8460931ea36dc5c76838fec5734d55c88c6831" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/1a8460931ea36dc5c76838fec5734d55c88c6831", - "reference": "1a8460931ea36dc5c76838fec5734d55c88c6831", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "keywords": [ - "promise", - "promises" - ], - "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.11.0" - }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2023-11-16T16:16:50+00:00" - }, { "name": "respect/stringifier", "version": "0.2.0", @@ -14964,46 +15023,40 @@ }, { "name": "ruflin/elastica", - "version": "7.3.2", + "version": "8.0.0", "source": { "type": "git", "url": "https://github.com/ruflin/Elastica.git", - "reference": "84ba137678707a1aa4242d12bad891dc38fa2608" + "reference": "2fc446e37847e84cd9f9be8e75fd2b322007ea43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ruflin/Elastica/zipball/84ba137678707a1aa4242d12bad891dc38fa2608", - "reference": "84ba137678707a1aa4242d12bad891dc38fa2608", + "url": "https://api.github.com/repos/ruflin/Elastica/zipball/2fc446e37847e84cd9f9be8e75fd2b322007ea43", + "reference": "2fc446e37847e84cd9f9be8e75fd2b322007ea43", "shasum": "" }, "require": { - "elasticsearch/elasticsearch": "^7.10", + "elastic/transport": "^8.8", + "elasticsearch/elasticsearch": "^8.4.1", "ext-json": "*", - "nyholm/dsn": "^2.0.0", - "php": "^7.2 || ^8.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0", - "symfony/polyfill-php73": "^1.19" + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/log": "^1.0 || ^2.0 || ^3.0" + }, + "conflict": { + "guzzlehttp/psr7": "<2.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^3.155", - "guzzlehttp/guzzle": "^6.3 || ^7.2", + "guzzlehttp/guzzle": "^7.2", "phpstan/phpstan": "^1.5", "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5.8 || ^9.4", + "phpunit/phpunit": "^9.5", "symfony/phpunit-bridge": "^6.0" }, "suggest": { "aws/aws-sdk-php": "Allow using IAM authentication with Amazon ElasticSearch Service", - "guzzlehttp/guzzle": "Allow using guzzle as transport", - "monolog/monolog": "Logging request" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.0.x-dev" - } + "monolog/monolog": "Logging request" }, + "type": "library", "autoload": { "psr-4": { "Elastica\\": "src/" @@ -15027,9 +15080,9 @@ ], "support": { "issues": "https://github.com/ruflin/Elastica/issues", - "source": "https://github.com/ruflin/Elastica/tree/7.3.2" + "source": "https://github.com/ruflin/Elastica/tree/8.0.0" }, - "time": "2024-03-11T14:11:50+00:00" + "time": "2024-05-29T11:45:23+00:00" }, { "name": "sebastian/diff", @@ -15099,16 +15152,16 @@ }, { "name": "sentry/sentry", - "version": "4.9.0", + "version": "4.10.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "788ec170f51ebb22f2809a1e3f78b19ccd39b70d" + "reference": "2af937d47d8aadb8dab0b1d7b9557e495dd12856" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/788ec170f51ebb22f2809a1e3f78b19ccd39b70d", - "reference": "788ec170f51ebb22f2809a1e3f78b19ccd39b70d", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/2af937d47d8aadb8dab0b1d7b9557e495dd12856", + "reference": "2af937d47d8aadb8dab0b1d7b9557e495dd12856", "shasum": "" }, "require": { @@ -15126,12 +15179,12 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.4", - "guzzlehttp/promises": "^1.0|^2.0", + "guzzlehttp/promises": "^2.0.3", "guzzlehttp/psr7": "^1.8.4|^2.1.1", "monolog/monolog": "^1.6|^2.0|^3.0", "phpbench/phpbench": "^1.0", "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^8.5.14|^9.4", + "phpunit/phpunit": "^8.5|^9.6", "symfony/phpunit-bridge": "^5.2|^6.0|^7.0", "vimeo/psalm": "^4.17" }, @@ -15172,7 +15225,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/4.9.0" + "source": "https://github.com/getsentry/sentry-php/tree/4.10.0" }, "funding": [ { @@ -15184,7 +15237,7 @@ "type": "custom" } ], - "time": "2024-08-08T14:40:50+00:00" + "time": "2024-11-06T07:44:19+00:00" }, { "name": "stomp-php/stomp-php", @@ -16220,16 +16273,16 @@ }, { "name": "symfony/options-resolver", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55" + "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55", - "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/85e95eeede2d41cd146146e98c9c81d9214cae85", + "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85", "shasum": "" }, "require": { @@ -16267,7 +16320,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.1.1" + "source": "https://github.com/symfony/options-resolver/tree/v7.1.6" }, "funding": [ { @@ -16283,7 +16336,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/polyfill-ctype", @@ -16835,17 +16888,17 @@ "time": "2020-10-23T14:02:19+00:00" }, { - "name": "symfony/polyfill-php73", + "name": "symfony/polyfill-php80", "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", - "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { @@ -16863,7 +16916,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" + "Symfony\\Polyfill\\Php80\\": "" }, "classmap": [ "Resources/stubs" @@ -16874,6 +16927,10 @@ "MIT" ], "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -16883,7 +16940,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 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -16892,7 +16949,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -16911,17 +16968,17 @@ "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php80", + "name": "symfony/polyfill-php81", "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { @@ -16939,7 +16996,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Polyfill\\Php81\\": "" }, "classmap": [ "Resources/stubs" @@ -16950,10 +17007,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -16963,7 +17016,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 8.1+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -16972,7 +17025,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" }, "funding": [ { @@ -16991,17 +17044,17 @@ "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php81", + "name": "symfony/polyfill-php82", "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + "url": "https://github.com/symfony/polyfill-php82.git", + "reference": "5d2ed36f7734637dacc025f179698031951b1692" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "url": "https://api.github.com/repos/symfony/polyfill-php82/zipball/5d2ed36f7734637dacc025f179698031951b1692", + "reference": "5d2ed36f7734637dacc025f179698031951b1692", "shasum": "" }, "require": { @@ -17019,7 +17072,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" + "Symfony\\Polyfill\\Php82\\": "" }, "classmap": [ "Resources/stubs" @@ -17039,7 +17092,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.2+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -17048,7 +17101,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php82/tree/v1.31.0" }, "funding": [ { @@ -20090,134 +20143,6 @@ ], "time": "2024-06-12T14:39:25+00:00" }, - { - "name": "open-telemetry/api", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/opentelemetry-php/api.git", - "reference": "87de95d926f46262885d0d390060c095af13e2e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/87de95d926f46262885d0d390060c095af13e2e5", - "reference": "87de95d926f46262885d0d390060c095af13e2e5", - "shasum": "" - }, - "require": { - "open-telemetry/context": "^1.0", - "php": "^7.4 || ^8.0", - "psr/log": "^1.1|^2.0|^3.0", - "symfony/polyfill-php80": "^1.26", - "symfony/polyfill-php81": "^1.26", - "symfony/polyfill-php82": "^1.26" - }, - "conflict": { - "open-telemetry/sdk": "<=1.0.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.0.x-dev" - } - }, - "autoload": { - "files": [ - "Trace/functions.php" - ], - "psr-4": { - "OpenTelemetry\\API\\": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "opentelemetry-php contributors", - "homepage": "https://github.com/open-telemetry/opentelemetry-php/graphs/contributors" - } - ], - "description": "API for OpenTelemetry PHP.", - "keywords": [ - "Metrics", - "api", - "apm", - "logging", - "opentelemetry", - "otel", - "tracing" - ], - "support": { - "chat": "https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V", - "docs": "https://opentelemetry.io/docs/php", - "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", - "source": "https://github.com/open-telemetry/opentelemetry-php" - }, - "time": "2024-02-06T01:32:25+00:00" - }, - { - "name": "open-telemetry/context", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/opentelemetry-php/context.git", - "reference": "e9d254a7c89885e63fd2fde54e31e81aaaf52b7c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/context/zipball/e9d254a7c89885e63fd2fde54e31e81aaaf52b7c", - "reference": "e9d254a7c89885e63fd2fde54e31e81aaaf52b7c", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0", - "symfony/polyfill-php80": "^1.26", - "symfony/polyfill-php81": "^1.26", - "symfony/polyfill-php82": "^1.26" - }, - "suggest": { - "ext-ffi": "To allow context switching in Fibers" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.0.x-dev" - } - }, - "autoload": { - "files": [ - "fiber/initialize_fiber_handler.php" - ], - "psr-4": { - "OpenTelemetry\\Context\\": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "opentelemetry-php contributors", - "homepage": "https://github.com/open-telemetry/opentelemetry-php/graphs/contributors" - } - ], - "description": "Context implementation for OpenTelemetry PHP.", - "keywords": [ - "Context", - "opentelemetry", - "otel" - ], - "support": { - "chat": "https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V", - "docs": "https://opentelemetry.io/docs/php", - "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", - "source": "https://github.com/open-telemetry/opentelemetry-php" - }, - "time": "2024-01-13T05:50:44+00:00" - }, { "name": "open-telemetry/exporter-otlp", "version": "1.0.4", @@ -20430,16 +20355,16 @@ }, { "name": "open-telemetry/sem-conv", - "version": "1.25.0", + "version": "1.27.1", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/sem-conv.git", - "reference": "23f457ba390847647a17068e0095d9ffe9a4824c" + "reference": "1dba705fea74bc0718d04be26090e3697e56f4e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/sem-conv/zipball/23f457ba390847647a17068e0095d9ffe9a4824c", - "reference": "23f457ba390847647a17068e0095d9ffe9a4824c", + "url": "https://api.github.com/repos/opentelemetry-php/sem-conv/zipball/1dba705fea74bc0718d04be26090e3697e56f4e6", + "reference": "1dba705fea74bc0718d04be26090e3697e56f4e6", "shasum": "" }, "require": { @@ -20483,7 +20408,7 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2024-04-09T23:31:35+00:00" + "time": "2024-08-28T09:20:31+00:00" }, { "name": "phar-io/manifest", @@ -20556,131 +20481,52 @@ "name": "phar-io/version", "version": "3.2.1", "source": { - "type": "git", - "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": "" - }, - "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.20.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/discovery.git", - "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", - "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", - "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": "*" + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, - "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" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" }, - "type": "composer-plugin", - "extra": { - "class": "Http\\Discovery\\Composer\\Plugin", - "plugin-optional": true + "require": { + "php": "^7.2 || ^8.0" }, + "type": "library", "autoload": { - "psr-4": { - "Http\\Discovery\\": "src/" - }, - "exclude-from-classmap": [ - "src/Composer/Plugin.php" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "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": "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" - ], + "description": "Library for handling version information and constraints", "support": { - "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.20.0" + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2024-10-02T11:20:13+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { "name": "php-http/guzzle7-adapter", @@ -20744,115 +20590,6 @@ }, "time": "2021-03-09T07:35:15+00:00" }, - { - "name": "php-http/httplug", - "version": "2.4.1", - "source": { - "type": "git", - "url": "https://github.com/php-http/httplug.git", - "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4", - "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4", - "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.1" - }, - "time": "2024-09-23T11:39:58+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", @@ -21819,6 +21556,79 @@ ], "time": "2024-07-10T11:45:39+00:00" }, + { + "name": "react/promise", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-05-24T10:39:05+00:00" + }, { "name": "sebastian/cli-parser", "version": "1.0.2", @@ -23454,21 +23264,21 @@ "time": "2024-06-21T16:04:15+00:00" }, { - "name": "symfony/polyfill-php82", - "version": "v1.30.0", + "name": "symfony/polyfill-php73", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php82.git", - "reference": "77ff49780f56906788a88974867ed68bc49fae5b" + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php82/zipball/77ff49780f56906788a88974867ed68bc49fae5b", - "reference": "77ff49780f56906788a88974867ed68bc49fae5b", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -23482,7 +23292,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php82\\": "" + "Symfony\\Polyfill\\Php73\\": "" }, "classmap": [ "Resources/stubs" @@ -23502,7 +23312,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.2+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -23511,7 +23321,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php82/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" }, "funding": [ { @@ -23527,7 +23337,7 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "theseer/tokenizer", @@ -23636,7 +23446,6 @@ "stability-flags": { "drupal/block_field": 5, "drupal/helfi_drupal_tools": 20, - "drupal/helfi_formtool_embed": 20, "drupal/multivalue_form_element": 10, "drupal/session_limit": 10 }, diff --git a/conf/cmi/core.entity_view_display.media.image.image_gallery.yml b/conf/cmi/core.entity_view_display.media.image.image_gallery.yml new file mode 100644 index 0000000000..d9bbd4dc35 --- /dev/null +++ b/conf/cmi/core.entity_view_display.media.image.image_gallery.yml @@ -0,0 +1,38 @@ +uuid: 276c125d-e2db-44ce-9576-21c45385e0dc +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.media.image_gallery + - field.field.media.image.field_media_image + - field.field.media.image.field_photographer + - media.type.image + - responsive_image.styles.image_gallery_1_1 + module: + - responsive_image +_core: + default_config_hash: Ky7rUnc3u7APd8dH1E5EogiDjUtvkJvq0ZHfgG6OlQw +id: media.image.image_gallery +targetEntityType: media +bundle: image +mode: image_gallery +content: + field_media_image: + type: responsive_image + label: hidden + settings: + responsive_image_style: image_gallery_1_1 + image_link: '' + image_loading: + attribute: eager + third_party_settings: { } + weight: 0 + region: content +hidden: + created: true + field_photographer: true + langcode: true + name: true + search_api_excerpt: true + thumbnail: true + uid: true diff --git a/conf/cmi/core.entity_view_mode.media.image_gallery.yml b/conf/cmi/core.entity_view_mode.media.image_gallery.yml new file mode 100644 index 0000000000..aede92c6fb --- /dev/null +++ b/conf/cmi/core.entity_view_mode.media.image_gallery.yml @@ -0,0 +1,13 @@ +uuid: c52c9e44-0d46-417c-a8d9-372120b2c68a +langcode: en +status: true +dependencies: + module: + - media +_core: + default_config_hash: X_EeW1ealqkAjjQhcc2ehkJxyT9VZ9QH5iTYi-6NeYY +id: media.image_gallery +label: 'Image gallery' +description: '' +targetEntityType: media +cache: true diff --git a/conf/cmi/field.field.paragraph.remote_video.field_remote_video_video_title.yml b/conf/cmi/field.field.paragraph.remote_video.field_remote_video_video_title.yml index e677c2fdeb..a875bf217d 100644 --- a/conf/cmi/field.field.paragraph.remote_video.field_remote_video_video_title.yml +++ b/conf/cmi/field.field.paragraph.remote_video.field_remote_video_video_title.yml @@ -6,14 +6,14 @@ dependencies: - field.storage.paragraph.field_remote_video_video_title - paragraphs.paragraphs_type.remote_video _core: - default_config_hash: wDlJqGu3PbMmNtmqsuYHGbmIklPbceZDVZ17ENs2vAg + default_config_hash: OetItkfP7vdKFfRMKUkRAiIavZrk78vEeZ0lYtv3kU8 id: paragraph.remote_video.field_remote_video_video_title field_name: field_remote_video_video_title entity_type: paragraph bundle: remote_video label: 'Title of the video' description: '' -required: false +required: true translatable: false default_value: { } default_value_callback: '' diff --git a/conf/cmi/filter.format.sidebar.yml b/conf/cmi/filter.format.sidebar.yml index 856a0de794..4c71b5ef49 100644 --- a/conf/cmi/filter.format.sidebar.yml +++ b/conf/cmi/filter.format.sidebar.yml @@ -1,7 +1,9 @@ uuid: 08dc13c1-c3be-4f15-abde-e23e88f4e4c5 langcode: en status: true -dependencies: { } +dependencies: + module: + - helfi_api_base name: Sidebar format: sidebar weight: 0 @@ -27,3 +29,9 @@ filters: status: true weight: 10 settings: { } + helfi_link_converter: + id: helfi_link_converter + provider: helfi_api_base + status: true + weight: -10 + settings: { } diff --git a/conf/cmi/filter.format.webform_default.yml b/conf/cmi/filter.format.webform_default.yml index d25ded5cc6..c5de45d1c3 100644 --- a/conf/cmi/filter.format.webform_default.yml +++ b/conf/cmi/filter.format.webform_default.yml @@ -2,10 +2,18 @@ uuid: 4ab1e9e9-3892-4151-8349-a3671950f4cc langcode: en status: true dependencies: + module: + - helfi_api_base enforced: module: - webform name: 'Webform (Default) - DO NOT EDIT' format: webform_default weight: 100 -filters: { } +filters: + helfi_link_converter: + id: helfi_link_converter + provider: helfi_api_base + status: true + weight: -10 + settings: { } diff --git a/conf/cmi/grants_metadata.settings.yml b/conf/cmi/grants_metadata.settings.yml index 1b97e04b44..fd564d5239 100644 --- a/conf/cmi/grants_metadata.settings.yml +++ b/conf/cmi/grants_metadata.settings.yml @@ -251,6 +251,16 @@ third_party_options: fi: 'KuvaErillis FI' en: 'KuvaErillis EN' sv: 'KuvaErillis SV' + 72: + id: SOTEPEYLEIS + code: SOTEPEYLEIS + dataDefinition: + definitionClass: Drupal\grants_metadata\TypedData\Definition\SotepeyleisDefinition + definitionId: grants_metadata_sotepeyleis + labels: + fi: 'Sosiaali-, terveys- ja pelastustoimen yleisavustus' + en: 'EN Sosiaali-, terveys- ja pelastustoimen yleisavustus' + sv: 'SV Sosiaali-, terveys- ja pelastustoimen yleisavustus' application_statuses: DRAFT: DRAFT SUBMITTED: SUBMITTED @@ -291,14 +301,14 @@ third_party_options: 44: 'Development grant' 45: 'Development grant for the Helsinki Model' 46: 'Development grant for basic arts education' - 47: 'Kulttuurin erityisavustus 1' - 48: 'Kulttuurin erityisavustus 2' - 49: 'Nuorison erityisavustus 1' - 50: 'Nuorison erityisavustus 2' - 51: 'Liikunnan erityisavustus 1' - 52: 'Liikunnan erityisavustus 2' - 53: 'Kulttuurin ja vapaa-ajan erityisavustus 1' - 54: 'Kulttuurin ja vapaa-ajan erityisavustus 2' + 47: 'Special grant for culture 1' + 48: 'Special grant for culture 2' + 49: 'Special grant for youth activities 1' + 50: 'Special grant for youth activities 2' + 51: 'Special grant for sports 1' + 52: 'Special grant for sports 2' + 53: 'Special grant for culture and leisure 1' + 54: 'Special grant for culture and leisure 2' langcode: en config_import_ignore: - 53 @@ -464,3 +474,9 @@ overridden_configuration: applicationOpen: '2024-01-03T11:08:26' applicationClose: '2029-07-30T11:19:00' disableCopying: 0 + - + 72: + grants_metadata: + applicationOpen: '2022-10-03T11:08:26' + applicationClose: '2029-07-30T11:19:00' + disableCopying: 0 diff --git a/conf/cmi/image.style.0.7_1086w_1630h_LQ.yml b/conf/cmi/image.style.0.7_1086w_1630h_LQ.yml new file mode 100644 index 0000000000..09db82eff8 --- /dev/null +++ b/conf/cmi/image.style.0.7_1086w_1630h_LQ.yml @@ -0,0 +1,26 @@ +uuid: 74ef3c22-d7ea-4cb1-8aab-01ba6b79bde5 +langcode: en +status: true +dependencies: + module: + - focal_point + - image_style_quality +_core: + default_config_hash: AeqLUQ96Cqn70SDi5us0fS8EdVFFfMUYhKl3Zf6DcBo +name: 0.7_1086w_1630h_LQ +label: 0.7_1086w_1630h_LQ +effects: + 1c1da0f4-bb6a-4f11-88eb-8cd33a8e0da2: + uuid: 1c1da0f4-bb6a-4f11-88eb-8cd33a8e0da2 + id: focal_point_scale_and_crop + weight: 1 + data: + width: 1086 + height: 1630 + crop_type: focal_point + c319bca0-92f7-4467-a5ec-1b902ce2be1b: + uuid: c319bca0-92f7-4467-a5ec-1b902ce2be1b + id: image_style_quality + weight: 2 + data: + quality: 65 diff --git a/conf/cmi/image.style.0.7_352w_572h.yml b/conf/cmi/image.style.0.7_352w_572h.yml new file mode 100644 index 0000000000..6aef21fe9d --- /dev/null +++ b/conf/cmi/image.style.0.7_352w_572h.yml @@ -0,0 +1,19 @@ +uuid: f0276d08-9181-4923-9b87-49e9bf5ee5f4 +langcode: en +status: true +dependencies: + module: + - focal_point +_core: + default_config_hash: cBN24Ntaz6rn8wtPWjCbT3-Hxq8qynjPGSmJFAV31Hk +name: 0.7_352w_572h +label: 0.7_352w_572h +effects: + 11ff7a5b-af0b-4eac-a4a3-7bc3b9ac6188: + uuid: 11ff7a5b-af0b-4eac-a4a3-7bc3b9ac6188 + id: focal_point_scale_and_crop + weight: 1 + data: + width: 352 + height: 572 + crop_type: focal_point diff --git a/conf/cmi/image.style.0.7_414w_621h.yml b/conf/cmi/image.style.0.7_414w_621h.yml new file mode 100644 index 0000000000..c93cd0363e --- /dev/null +++ b/conf/cmi/image.style.0.7_414w_621h.yml @@ -0,0 +1,19 @@ +uuid: 9ec716c1-6f6d-4d08-971f-a9d9230e43b7 +langcode: en +status: true +dependencies: + module: + - focal_point +_core: + default_config_hash: 9G0iI4Xc80IIrMDVw3MufI9ChwpU4MTr2DmAQBEsNww +name: 0.7_414w_621h +label: 0.7_414w_621h +effects: + dc8a6ee8-839c-4972-9eb8-5df5305dc75d: + uuid: dc8a6ee8-839c-4972-9eb8-5df5305dc75d + id: focal_point_scale_and_crop + weight: 1 + data: + width: 414 + height: 621 + crop_type: focal_point diff --git a/conf/cmi/image.style.0.7_543w_815h.yml b/conf/cmi/image.style.0.7_543w_815h.yml new file mode 100644 index 0000000000..b94f5f88f3 --- /dev/null +++ b/conf/cmi/image.style.0.7_543w_815h.yml @@ -0,0 +1,19 @@ +uuid: 6ff8a4a5-849c-4f94-8f22-1eb670793bdc +langcode: en +status: true +dependencies: + module: + - focal_point +_core: + default_config_hash: YnfcElLVLgfDdm94VOY-D0FddU7red0-u7cRiayv98Q +name: 0.7_543w_815h +label: 0.7_543w_815h +effects: + 6535b34f-21c8-4005-8561-d1936245e319: + uuid: 6535b34f-21c8-4005-8561-d1936245e319 + id: focal_point_scale_and_crop + weight: 1 + data: + width: 543 + height: 815 + crop_type: focal_point diff --git a/conf/cmi/image.style.0.7_704w_1144h_LQ.yml b/conf/cmi/image.style.0.7_704w_1144h_LQ.yml new file mode 100644 index 0000000000..74a2411b04 --- /dev/null +++ b/conf/cmi/image.style.0.7_704w_1144h_LQ.yml @@ -0,0 +1,26 @@ +uuid: 19aa2c22-c3e9-47cd-b767-9fca520ae4ba +langcode: en +status: true +dependencies: + module: + - focal_point + - image_style_quality +_core: + default_config_hash: pAcV7IybMiPiagIA-dUy4lmdI5voNIOyoE0Pkse5eV0 +name: 0.7_704w_1144h_LQ +label: 0.7_704w_1144h_LQ +effects: + 289822b3-1d38-43a4-a18e-0344b4ef9161: + uuid: 289822b3-1d38-43a4-a18e-0344b4ef9161 + id: focal_point_scale_and_crop + weight: 1 + data: + width: 704 + height: 1144 + crop_type: focal_point + c5118eb7-9ad5-4756-9515-d6358c38bd75: + uuid: c5118eb7-9ad5-4756-9515-d6358c38bd75 + id: image_style_quality + weight: 2 + data: + quality: 65 diff --git a/conf/cmi/image.style.0.7_828w_1242h_LQ.yml b/conf/cmi/image.style.0.7_828w_1242h_LQ.yml new file mode 100644 index 0000000000..445ae0479c --- /dev/null +++ b/conf/cmi/image.style.0.7_828w_1242h_LQ.yml @@ -0,0 +1,26 @@ +uuid: 5ebc2957-c7ca-4606-ba96-49486e6630e4 +langcode: en +status: true +dependencies: + module: + - focal_point + - image_style_quality +_core: + default_config_hash: mfxUI0GJzq_vdiXkYMnF9RUM07CwW2KKkEz14ofxTt8 +name: 0.7_828w_1242h_LQ +label: 0.7_828w_1242h_LQ +effects: + fb181588-37f9-4269-ae4e-7c93d76ffebe: + uuid: fb181588-37f9-4269-ae4e-7c93d76ffebe + id: focal_point_scale_and_crop + weight: 1 + data: + width: 828 + height: 1242 + crop_type: focal_point + a3284e2a-d636-4454-b7b6-3958d1db2b35: + uuid: a3284e2a-d636-4454-b7b6-3958d1db2b35 + id: image_style_quality + weight: 2 + data: + quality: 65 diff --git a/conf/cmi/image.style.1_1086w_1086h_LQ.yml b/conf/cmi/image.style.1_1086w_1086h_LQ.yml new file mode 100644 index 0000000000..c95dc13207 --- /dev/null +++ b/conf/cmi/image.style.1_1086w_1086h_LQ.yml @@ -0,0 +1,26 @@ +uuid: 9f76056d-d05c-40e9-9455-9caf237c2229 +langcode: en +status: true +dependencies: + module: + - focal_point + - image_style_quality +_core: + default_config_hash: mi1XUO2QcAKfZXGktQi8uH0YqSJQRPwztvP2d1hROLs +name: 1_1086w_1086h_LQ +label: 1_1086w_1086h_LQ +effects: + 3fe5b5a5-6dcd-4410-865d-22d39e20ae22: + uuid: 3fe5b5a5-6dcd-4410-865d-22d39e20ae22 + id: focal_point_scale_and_crop + weight: 1 + data: + width: 1086 + height: 1086 + crop_type: focal_point + 348c0fc5-7317-49a8-9a52-934e77165825: + uuid: 348c0fc5-7317-49a8-9a52-934e77165825 + id: image_style_quality + weight: 2 + data: + quality: 65 diff --git a/conf/cmi/image.style.1_414w_414h.yml b/conf/cmi/image.style.1_414w_414h.yml new file mode 100644 index 0000000000..21e0d11734 --- /dev/null +++ b/conf/cmi/image.style.1_414w_414h.yml @@ -0,0 +1,19 @@ +uuid: 0f96fcb7-856c-4d80-9a22-b1e88f44ca2b +langcode: en +status: true +dependencies: + module: + - focal_point +_core: + default_config_hash: hYrryvmZIFbqVuUffmELrMQU_CaSN30AKFOW_jHVzjA +name: 1_414w_414h +label: 1_414w_414h +effects: + 9ef8198f-6739-4a26-b0d7-157e42648cc4: + uuid: 9ef8198f-6739-4a26-b0d7-157e42648cc4 + id: focal_point_scale_and_crop + weight: 1 + data: + width: 414 + height: 414 + crop_type: focal_point diff --git a/conf/cmi/image.style.1_543w_543h.yml b/conf/cmi/image.style.1_543w_543h.yml new file mode 100644 index 0000000000..05eb86b0e3 --- /dev/null +++ b/conf/cmi/image.style.1_543w_543h.yml @@ -0,0 +1,19 @@ +uuid: ca8cb2c4-7e3c-4a4a-ae75-9520f628f369 +langcode: en +status: true +dependencies: + module: + - focal_point +_core: + default_config_hash: M4ETy7uSDV6Ww_h9CjHqPNr_G1ssAwvhYUP93h5drbs +name: 1_543w_543h +label: 1_543w_543h +effects: + ed62a58f-6f7b-47ff-b8c9-3574fb9abeba: + uuid: ed62a58f-6f7b-47ff-b8c9-3574fb9abeba + id: focal_point_scale_and_crop + weight: 1 + data: + width: 543 + height: 543 + crop_type: focal_point diff --git a/conf/cmi/image.style.1_828w_828h_LQ.yml b/conf/cmi/image.style.1_828w_828h_LQ.yml new file mode 100644 index 0000000000..2d33d9a48e --- /dev/null +++ b/conf/cmi/image.style.1_828w_828h_LQ.yml @@ -0,0 +1,26 @@ +uuid: d0a56f46-9d91-47a8-9269-57fda40b75ed +langcode: en +status: true +dependencies: + module: + - focal_point + - image_style_quality +_core: + default_config_hash: 5FDh9emCj1EzDriYUSM9-SHEBOkHjy6jkFjGruPs5Hw +name: 1_828w_828h_LQ +label: 1_828w_828h_LQ +effects: + c4554106-234a-4d04-a6cf-c7ae4f8886dd: + uuid: c4554106-234a-4d04-a6cf-c7ae4f8886dd + id: focal_point_scale_and_crop + weight: 1 + data: + width: 828 + height: 828 + crop_type: focal_point + ee011418-cb33-48a5-af34-10bfac5b3e64: + uuid: ee011418-cb33-48a5-af34-10bfac5b3e64 + id: image_style_quality + weight: 2 + data: + quality: 65 diff --git a/conf/cmi/language/en/webform.webform.hyte_yleisavustus.yml b/conf/cmi/language/en/webform.webform.hyte_yleisavustus.yml index 71e89f43f0..ccc44651e3 100644 --- a/conf/cmi/language/en/webform.webform.hyte_yleisavustus.yml +++ b/conf/cmi/language/en/webform.webform.hyte_yleisavustus.yml @@ -82,7 +82,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': ' Grant issuer' issuer_name: '#title': 'Issuer''s name' @@ -116,7 +115,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' diff --git a/conf/cmi/language/en/webform.webform.iakkaiden_kulttuuri_ja_liikunta.yml b/conf/cmi/language/en/webform.webform.iakkaiden_kulttuuri_ja_liikunta.yml new file mode 100644 index 0000000000..ff758a416b --- /dev/null +++ b/conf/cmi/language/en/webform.webform.iakkaiden_kulttuuri_ja_liikunta.yml @@ -0,0 +1,315 @@ +title: 'KUVA: grant application for the promotion of physical activity and cultural activities for the elderly' +elements: | + 1_hakijan_tiedot: + '#title': '1. Applicant details' + '#prev_button_label': Previous + '#next_button_label': Next + hakemusprofiili: + '#title': 'Retrieved information' + prh_markup: + '#markup': '

The information has been retrieved from your own profile.

' + hakijan_tiedot: + '#title': Applicant + contact_person_email_section: + '#title': Email + contact_markup: + '#markup': '

Provide here a community email address that is actively read. Contact requests related to the grant application, such as requests for further clarification and completion, will be sent to the email address.

' + email: + '#title': 'Email address' + '#help': '

Provide the email address to which you want the messages and notifications related to this application to be sent and which is actively read.

' + contact_person_section: + '#title': 'Contact person for the application' + contact_person: + '#title': 'Contact person' + contact_person_phone_number: + '#title': 'Phone number' + osoite: + '#title': Address + community_address: + '#title': Address + '#help': '

If you want to add, delete or change address information, save the application as a draft and go to maintain the address information in your own data.

' + '#community_address_select__title': 'Select the address' + tilinumero: + '#title': 'Account number' + bank_account: + '#title': 'Account number' + '#help': '

If you want to add, delete or change account number information, save the application as a draft and go to maintain the account number information in your own data.

' + '#account_number_select__title': 'Select the account number' + '#account_number__title': '' + toiminnasta_vastaavat_henkilot: + '#title': 'Persons responsible for operations' + community_officials: + '#help': "

If you want to add, delete or change people, save the application as a draft and go to maintain the people's information in your own data.

" + '#title': 'Persons responsible for operations' + '#multiple__add_more_button_label': 'Add person' + '#community_officials_select__title': 'Select official' + '#role__title': Role + '#email__title': 'Email address' + '#phone__title': 'Phone number' + 2_avustustiedot: + '#title': '2. Grant details' + avustuksen_tiedot: + '#title': 'Grant details' + acting_year: + '#title': 'Year for which I am applying for a grant' + avustuslajit: + '#title': 'Types of grant' + subventions: + '#title': Grants + grants_compensations_information: + '#markup': '

Only apply for one grant type at a time with each application.

' + kayttotarkoitus: + '#title': 'Purpose of use' + compensation_purpose: + '#title': 'Brief description of the purpose(s) of the grant(s) applied for' + '#help': '

Indicate the purpose for which the grant is applied for. If necessary, specify the different uses. Also tell us what is intended to be achieved with the grant and what goals are associated with the activities to be supported.

' + '#counter_maximum_message': '%d/5000 characters remaining' + other_grants_for_same_purpose: + '#title': 'Other grants received for the same purpose' + info_muut_samaan_tarkoitukseen_myonnetty: + '#markup': '

Indicate here only the grants received from somewhere other than the City of Helsinki in the current and two previous tax years.

An affirmative answer opens a further question
' + olemme_saaneet_muita_avustuksia: + '#title': 'We have received other grants' + '#options': + 1: 'Yes' + 0: 'No' + myonnetty_avustus: + '#title': 'Received grant' + '#multiple__no_items_message': '

No values entered. Add the new grant granted below.

' + '#multiple__add_more_button_label': 'Add received grant' + '#element': + issuer: + '#options': + 1: State + 4: Other + 5: Foundation + '#title': 'Grant issuer' + issuer_name: + '#title': "Issuer's name" + '#help': '

Which body has granted the grant (e.g. name of the ministry)

' + year: + '#title': Year + '#pattern_error': 'Only numbers' + amount: + '#title': 'Amount of grant granted' + purpose: + '#title': 'Description of intended use' + '#help': '

Give a brief description, for what purpose has the grant been granted?

' + '#counter_maximum_message': '%d/1000 characters remaining' + muut_samaan_tarkoitukseen_haetut_avustukset: + '#title': 'Other grants applied for to be used for the same purpose' + info_muut_samaan_tarkoitukseen_haettu: + '#markup': '

Indicate here only the grants that have been applied for from somewhere other than the City of Helsinki and for which the decisions have not been made yet.

An affirmative answer opens a further question
' + olemme_hakeneet_avustuksia_muualta_kuin_helsingin_kaupungilta: + '#title': 'We have applied for grants from somewhere other than the City of Helsinki' + '#options': + 1: 'Yes' + 0: 'No' + haettu_avustus_tieto: + '#title': 'Add new grant applied for' + '#multiple__no_items_message': '

No values entered. Add a new applied for grant below.

' + '#multiple__add_more_button_label': 'Add new grant applied for' + '#element': + issuer: + '#options': + 1: State + 4: Other + 5: Foundation + '#title': 'Grant issuer' + issuer_name: + '#title': "Issuer's name" + '#help': '

Which entity has granted the grant (e.g. name of the ministry)

' + year: + '#title': Year + '#pattern_error': 'Only numbers' + amount: + '#title': 'The amount of the grant applied for' + purpose: + '#title': 'Description of intended use' + '#help': '

Give a brief description, for what purpose has the grant been granted?

' + '#counter_maximum_message': '%d/1000 characters remaining' + 3_tarkemmat_tiedot: + '#title': '3. Information in more detail' + hankesuunnitelma_radios: + '#title': 'Is the 2nd part of the grant awarded in 2024 now being applied for?' + '#description': '

Grant decisions for 2024:

' + '#options': + 1: 'Yes' + 0: 'No' + ensisijainen_taiteen_ala: + '#title': 'Primary field of art' + '#help': '

Choose the option that best describes your activities.

' + '#options': + 'Design ja käsityö': 'Design and crafts' + 'Elokuva, valokuva ja media': 'Film, photography and media' + Kaupunkikulttuuri: 'Urban art and culture' + Kirjallisuus: Literature + 'Kuvataide ja sarjakuva': 'Visual arts and comics' + Monitaide: 'Multidisciplinary art' + Museo: Museum + Musiikki: Music + Muu: Other + Sirkus: Circus + Tanssi: Dance + Teatteri: Theatre + hankesuunnitelma_section: + '#title': '3.1 Project plan' + hankesuunnitelma_jatkohakemus: + '#title': 'Is the grant to be applied for a renewal application for an ongoing project?' + '#description': '

Only answer “yes” to this question if your community already has an ongoing project funded by the same grant and you are applying for additional funding for it.

' + '#options': + 1: 'Yes' + 0: 'No' + hankkeen_tarkoitus_tavoitteet: + '#title': 'Purpose and goals of the project' + '#counter_maximum_message': '%d/2500 characters remaining' + hankkeen_toimenpiteet_aikataulu: + '#title': 'What are the concrete measures of the project and the schedule for their implementation?' + '#counter_maximum_message': '%d/4000 characters remaining' + hankkeen_toimenpiteet_toteutus: + '#title': 'The concrete measures of the project are to be implemented between' + hankkeen_toimenpiteet_alkupvm: + '#title': 'Start date' + hankkeen_toimenpiteet_loppupvm: + '#title': 'End date' + hankkeen_keskeisimmat_kumppanit: + '#title': 'Specify the main partners of the project and their role in the project' + '#counter_maximum_message': '%d/2500 characters remaining' + haun_painopisteet_section: + '#title': '3.2 Emphases of the grant program' + haun_painopisteet_ohje: + '#markup': '

Which of the following areas of emphasis of the grant for the promotion of sport and physical activity for the elderly does the project cover?

One or more areas must be implemented in the project. PLEASE NOTE: Only select the areas that you will contribute to in the project in a concrete way.

' + haun_painopisteet_liikkumis_kehitys: + '#title': 'Does the project develop sport and physical activity opportunities or art and cultural activities in the immediate environment / area? How?' + '#counter_maximum_message': '%d/1250 characters remaining' + haun_painopisteet_digi_kehitys: + '#title': 'Does the project develop digital / remote cultural activities or activities that encourage people to exercise? How?' + '#counter_maximum_message': '%d/1250 characters remaining' + haun_painopisteet_vertais_kehitys: + '#title': 'Does the project develop volunteering / peer activities? How?' + '#counter_maximum_message': '%d/1250 characters remaining' + haun_painopisteet_kulttuuri_kehitys: + '#title': 'Does the project develop the skills of art and cultural operators or create new working methods / structures? How?' + '#counter_maximum_message': '%d/1250 characters remaining' + hankkeen_kohderyhmat_section: + '#title': '3.3 Project target groups' + hankkeen_kohderyhmat_kenelle: + '#title': 'Who is the project primarily aimed at?' + '#counter_maximum_message': '%d/1250 characters remaining' + hankkeen_kohderyhmat_erityisryhmat: + '#title': 'Does the project target a special group? For which special group? If not implemented, leave the field blank.' + '#counter_maximum_message': '%d/1250 characters remaining' + hankkeen_kohderyhmat_tavoitus: + '#title': 'How will the target groups of the project be reached?' + '#counter_maximum_message': '%d/1250 characters remaining' + hankkeen_kohderyhmat_konkretia: + '#title': 'How will the project promote the functional capacity and well-being of the selected target group with concrete measures?' + '#counter_maximum_message': '%d/1250 characters remaining' + hankkeen_kohderyhmat_osallisuus: + '#title': 'How does the project promote inclusion? What is the role of elderly people in the project?' + '#counter_maximum_message': '%d/1250 characters remaining' + hankkeen_kohderyhmat_osaaminen: + '#title': 'What kind of expertise do the project operators already have in working with the target group(s) in question?' + '#counter_maximum_message': '%d/1250 characters remaining' + hankkeen_kohderyhmat_postinrot: + '#title': 'In which postal code area(s) in Helsinki will the project be implemented? Please enter up to three (3) postal code areas in the field and separate them with a comma (,).' + hankkeen_kohderyhmat_miksi_alue: + '#title': 'Why is/are that particular area(s) selected?' + '#counter_maximum_message': '%d/1250 characters remaining' + hankkeen_riskit_section: + '#title': '3.4 Risks and analysis' + hankkeen_riskit_keskeisimmat: + '#title': 'What are the main risks from the point of view of project implementation?' + '#counter_maximum_message': '%d/2500 characters remaining' + hankkeen_riskit_seuranta: + '#title': 'How will monitoring and evaluation be carried out in the project?' + '#counter_maximum_message': '%d/2500 characters remaining' + hankkeen_riskit_vakiinnuttaminen: + '#title': 'Will the intended project activity be established as part of the basic activity of the applicant/other operator after the project? If yes, please describe in the text field how it will be established, otherwise leave the field blank.' + '#counter_maximum_message': '%d/2500 characters remaining' + hankkeen_valiarviointi_section: + '#title': '3.5 Mid-term evaluation of 2-year projects' + arviointi_markup: + '#markup': '

In this section, evaluate the activities of the project so far using the following questions. Applicants for the 2nd part of the grant must also attach to the application a cost centre report under “Other appendix” for the period 1 June - 31 December 2024.

' + arviointi_toteuma: + '#title': 'Has the project progressed according to plan? Please rate the project implementation so far on a scale of 1- 100% and justify your response.' + '#counter_maximum_message': '%d/1250 characters remaining' + '#description': 'Have there been significant changes in the project?' + arviointi_muutokset_talous: + '#title': 'In terms of economy; please specify' + '#counter_maximum_message': '%d/1250 characters remaining' + arviointi_muutokset_toiminta: + '#title': 'In terms of activity; please specify' + '#counter_maximum_message': '%d/1250 characters remaining' + arviointi_muutokset_aikataulu: + '#title': 'In terms of schedule; please specify' + '#counter_maximum_message': '%d/1250 characters remaining' + arviointi_haasteet: + '#title': 'Has the project faced operational challenges? If so, what type of challenges?' + '#counter_maximum_message': '%d/1250 characters remaining' + arviointi_saavutettavuus: + '#title': 'How have the activities reached the participants in relation to the goals?' + '#counter_maximum_message': '%d/1250 characters remaining' + arviointi_avustus_kaytto: + '#help': '

Grant conditions, section 10e: “A grant that has been granted must be returned to the City of Helsinki, the grant has not been used within the period as set down in the grant decision.”

' + '#title': 'Is the grant for the first project period expected to be used by the deadline of 31 May 2025? If not, please explain the reasons that led to this.' + '#counter_maximum_message': '%d/1250 characters remaining' + 4_talousarvio: + '#title': '4. Planned budget' + tulot_section: + '#title': '4.1 Incomes' + tulot: + '#title': Incomes + '#compensation__title': 'The applied grant (€)' + '#plannedOtherCompensations__title': 'Other grants (€)' + '#sales__title': 'Other incomes (€)' + '#ownFunding__title': 'The organizer’s own funding (€)' + talous_tulon_tyyppi: + '#title': 'Type of income' + '#help': '

Write down the type of income in question. Incomes can be, for example, other grants and admission or participation fees. Self financing has to be written down as an income even if the required self financing share is to be funded from the organisations overall operations.

' + '#multiple__add_more_button_label': 'Add new income' + menot_section: + '#title': '4.2 Expenses' + talous_menon_tyyppi: + '#title': 'Type of expense' + '#help': '

Write down the type of expense in question. Expenses can be, for example, rents and personnel costs.

' + '#multiple__add_more_button_label': 'Add new expense' + lisatiedot_ja_liitteet: + '#title': '5. Additional information and appendices' + lisatietoja_hakemukseen_liittyen: + '#title': 'Additional information concerning the application' + additional_information: + '#title': 'Additional information' + '#help': '

If necessary, you can write additional information or other justifications related to the application or report changes to the basic information

' + '#counter_maximum_message': '%d/5000 characters remaining' + liitteet: + '#title': Appendices + attachments_info: + '#markup': '

All the appendices listed in the call for applications must be submitted for the processing of the grant application. The grant application may be rejected if the appendices are not submitted. If any of the appendices is missing, let us know in the Further clarification on attachments section of the application.

Appendices previously submitted to the City of Helsinki

If the required appendices have already been submitted as appendices to another grant application addressed to the City of Helsinki, the same appendices do not need to be submitted again. The confirmed financial statements, annual report, action plan and budget of the community cannot be different from one application to another. In this case, under the submitted appendices, indicate “The appendix has been submitted as a single file or with another application”.

' + notification_attachments: + '#markup': '
The contents of the attachments cannot be viewed afterwards

Please note that you will not be able to open the attachments after you have attached them to the form. You will only see the file name of the attachment.

Although you cannot view the attachments afterwards, the attachments to the form are sent along with the other information on the form to the grant application processor.

' + extra_info: + '#title': 'Further clarification on attachments' + '#counter_maximum_message': '%d/5000 characters remaining' + muu_liite: + '#title': 'Other attachment' + '#multiple__add_more_button_label': 'Add attachment' + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + actions: + '#submit__label': Submit + '#draft__label': 'Save as draft' + '#wizard_prev__label': Previous + '#wizard_next__label': Next + '#preview_prev__label': Previous + '#preview_next__label': Preview + '#delete__label': 'Delete unfinished' +settings: + wizard_confirmation_label: '7. Complete' + wizard_prev_button_label: Previous + wizard_next_button_label: Next + preview_label: '6. Confirm, preview, and submit' + preview_title: 'Confirm, preview, and submit' diff --git a/conf/cmi/language/en/webform.webform.kasvatus_ja_koulutus_toiminta_av.yml b/conf/cmi/language/en/webform.webform.kasvatus_ja_koulutus_toiminta_av.yml index 4a52088f1a..baaa170e55 100644 --- a/conf/cmi/language/en/webform.webform.kasvatus_ja_koulutus_toiminta_av.yml +++ b/conf/cmi/language/en/webform.webform.kasvatus_ja_koulutus_toiminta_av.yml @@ -82,7 +82,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' diff --git a/conf/cmi/language/en/webform.webform.kasvatus_ja_koulutus_yleisavustu.yml b/conf/cmi/language/en/webform.webform.kasvatus_ja_koulutus_yleisavustu.yml index 9b176e5549..566f1b029a 100644 --- a/conf/cmi/language/en/webform.webform.kasvatus_ja_koulutus_yleisavustu.yml +++ b/conf/cmi/language/en/webform.webform.kasvatus_ja_koulutus_yleisavustu.yml @@ -84,7 +84,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': ' Grant issuer' issuer_name: '#title': 'Issuer''s name' diff --git a/conf/cmi/language/en/webform.webform.kaupunginkanslia_tyollisyysavust.yml b/conf/cmi/language/en/webform.webform.kaupunginkanslia_tyollisyysavust.yml index 4061c225c6..a46e043077 100644 --- a/conf/cmi/language/en/webform.webform.kaupunginkanslia_tyollisyysavust.yml +++ b/conf/cmi/language/en/webform.webform.kaupunginkanslia_tyollisyysavust.yml @@ -85,7 +85,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' @@ -119,7 +118,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' diff --git a/conf/cmi/language/en/webform.webform.kuva_projekti.yml b/conf/cmi/language/en/webform.webform.kuva_projekti.yml index 25b02d5ff3..ba2f2050b7 100644 --- a/conf/cmi/language/en/webform.webform.kuva_projekti.yml +++ b/conf/cmi/language/en/webform.webform.kuva_projekti.yml @@ -104,7 +104,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': ' Issuer''s name' diff --git a/conf/cmi/language/en/webform.webform.kuva_toiminta.yml b/conf/cmi/language/en/webform.webform.kuva_toiminta.yml index 44d3d0a7e6..ce138a5ff9 100644 --- a/conf/cmi/language/en/webform.webform.kuva_toiminta.yml +++ b/conf/cmi/language/en/webform.webform.kuva_toiminta.yml @@ -119,7 +119,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' diff --git a/conf/cmi/language/en/webform.webform.liikunta_laitosavustushakemus.yml b/conf/cmi/language/en/webform.webform.liikunta_laitosavustushakemus.yml index 088d568abd..a4b7d15624 100644 --- a/conf/cmi/language/en/webform.webform.liikunta_laitosavustushakemus.yml +++ b/conf/cmi/language/en/webform.webform.liikunta_laitosavustushakemus.yml @@ -82,7 +82,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' @@ -116,7 +115,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' diff --git a/conf/cmi/language/en/webform.webform.liikunta_toiminta_ja_tilankaytto.yml b/conf/cmi/language/en/webform.webform.liikunta_toiminta_ja_tilankaytto.yml index 59405d65b8..5b4d9d68ab 100644 --- a/conf/cmi/language/en/webform.webform.liikunta_toiminta_ja_tilankaytto.yml +++ b/conf/cmi/language/en/webform.webform.liikunta_toiminta_ja_tilankaytto.yml @@ -74,7 +74,7 @@ elements: | '#markup': 'Provide a report on the use of the grant received from the City of Helsinki. A report on the use of the grant must be drawn up for the grant concerning the previous accounting period. A report on the use should not be drawn up for the current accounting period. Providing the report on the use is a prerequisite for receiving the next grant. If no report on the use is provided, the grant will not be awarded or paid. A grant awarded may be recovered if the use of the previous grant has not been satisfactorily reported.' compensation_explanation: '#title': 'Report on the use of the grant' - '#help': 'The report on the use must briefly describe how the received grant has been used. The recipient must arrange its accounting in such a way that it is possible to monitor the use of the grant. For example, if a community has received a lease grant, the profit and loss account in the financial statements must show the grant in both income and expenses. Further information on the use of the grant can also be written in a separate attachment, which can be returned under Report on the use.' + '#help': '

The report on the use must briefly describe how the received grant has been used. The recipient must arrange its accounting in such a way that it is possible to monitor the use of the grant. Further information on the use of the grant can also be written in a separate attachment, which can be returned under Report on the use.

' '#counter_maximum_message': '%d/5000 characters remaining' kayttotarkoitus: '#title': 'Purpose of use' @@ -102,7 +102,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' @@ -119,7 +118,7 @@ elements: | tilankayttoavustus: '#title': 'Sports facility usage grant' maksetut_vuokrat_info: - '#markup': "

Summary of rent paid by the club/association for regular training slots elsewhere than in Sports Services’ own facilities, in the previous calendar year between 1 January and 31 December. The Rents paid for sports facilities section is mandatory if you are applying for a facility use grant.

\r\n" + '#markup': '

Summary of rent paid by the club/association for regular training slots elsewhere than in Sports Services’ own facilities. Declare the realized paid rent sum and total hours in the previous calendar year between 1 January and 31 December according to the facility use appendix. The Rents paid for sports facilities section is mandatory if you are applying for a facility use grant.

' liikuntatiloista_maksetut_vuokrat_fieldset: '#title': 'Rent paid for sports facilities' tuntimaara_yhteensa: @@ -127,7 +126,8 @@ elements: | vuokrat_yhteensa: '#title': 'Total / EUR' seuraavalle_vuodelle_suunniteltu_muutos_tilojen_kaytossa_tunnit_: - '#title': 'Change in the use of facilities planned for the next year, +/- hours and reason' + '#title': 'Significant change in the use of facilities planned for the next year, +/- hours and reason' + '#help': '

It is possible to include significant changes in the club’s use of sports facilities over the application period for consideration in the amount of the facility usage grant at our discretion. The following are considered significant changes: club mergers, a section(s) joining the club or leaving the club, renting or purchasing a new sports facility (attach the rental agreement to the application) or relinquishing control over or selling a sports facility.

' seuran_yhdistyksen_saamat_vuokrat_edellisen_kalenterivuoden_ajal: '#title': 'Rent received by the club/association in the previous calendar year between 1 January and 31 December' '#description': 'If the club/association receives rental income for its premises, report it here' @@ -225,8 +225,9 @@ elements: | '#help': 'In addition to the VOK 1 training arranged by regional sports organisations, the calculation accounts for the number of instructors and coaches who have completed a sports federation’s coach and instructor training that are at least equal in terms of level and content, or who have completed a basic qualification in sports instruction (vocational college), a degree in sports instruction (university of applied sciences) or a master’s degree in sports sciences (sports pedagogy or sports biology).' lajijaostot_helsinkilaisille_aktiiviharrastajille: '#title': 'Operating sport divisions for Helsinki residents' + '#help': '

In the practice hours section, do not report the training output of individual actives, but the actual practice hours organized for Helsinki residents belonging to the age group.

If the actual number of training hours for an age group cannot be ascertained (e.g. many mixed groups), can the share of that age group be calculated from the total number of hours based on the share of the number of active members from Helsinki in the age group out of the total number of active members from Helsinki. E.g. the total number of hours in the division (all mixed groups) is 100 hours, where 10 adults and 20 under 20-year-olds are active: the number of hours for adults is 33 hours and for under 20-year-olds 67 hours. However, the actual number of hours realized for the age group should be used primarily.

' lajijaostot_info: - '#markup': "

List the regular guided sports activities organised by the club/association by sport. Enter here the number of active members from Helsinki in the previous year, by sport, as well as their realized training hours.

\r\n" + '#markup': '

List the regular guided sports activities organised by the club/association by sport. Enter here the number of active members from Helsinki in the previous year, by sport, as well as their realized training hours by age group.

' club_section: '#multiple__add_more_button_label': 'Add new sport' '#multiple__item_label': 'sport' diff --git a/conf/cmi/language/en/webform.webform.nuorisotoiminta_projektiavustush.yml b/conf/cmi/language/en/webform.webform.nuorisotoiminta_projektiavustush.yml index e0dcf1f654..be997d96c2 100644 --- a/conf/cmi/language/en/webform.webform.nuorisotoiminta_projektiavustush.yml +++ b/conf/cmi/language/en/webform.webform.nuorisotoiminta_projektiavustush.yml @@ -82,7 +82,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': ' Grant issuer' issuer_name: '#title': 'Issuer''s name' @@ -115,7 +114,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' diff --git a/conf/cmi/language/en/webform.webform.nuortoimpalkka.yml b/conf/cmi/language/en/webform.webform.nuortoimpalkka.yml index b5c5689c0e..63a9f395b0 100644 --- a/conf/cmi/language/en/webform.webform.nuortoimpalkka.yml +++ b/conf/cmi/language/en/webform.webform.nuortoimpalkka.yml @@ -66,7 +66,7 @@ elements: | muut_samaan_tarkoitukseen_myonnetyt_avustukset: '#title': 'Other grants received for the same purpose' info_muut_samaan_tarkoitukseen_myonnetty: - '#text': "

Indicate here only the grants received from somewhere other than the City of Helsinki in the current and two previous tax years.

\r\n\r\n
\r\n
\r\n
An affirmative answer opens a further question
\r\n
\r\n
\r\n" + '#markup': "

Indicate here only the grants received from somewhere other than the City of Helsinki in the current and two previous tax years.

\r\n\r\n
\r\n
\r\n
An affirmative answer opens a further question
\r\n
\r\n
\r\n" olemme_saaneet_muita_avustuksia: '#title': 'We have received other grants' '#options': @@ -83,11 +83,10 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' - '#help': '

Which body has granted the grant (e.g. name of the ministry)

' + '#help': '

Which body has granted the grant (e.g. name of the ministry).

' year: '#title': Year '#pattern_error': 'Only numbers' @@ -100,7 +99,7 @@ elements: | muut_samaan_tarkoitukseen_haetut_avustukset: '#title': 'Other grants applied for to be used for the same purpose' info_muut_samaan_tarkoitukseen_haettu: - '#text': "

Indicate here only the grants that have been applied for from somewhere other than the City of Helsinki and for which the decisions have not been made yet.

\r\n\r\n
\r\n
\r\n
An affirmative answer opens a further question
\r\n
\r\n
\r\n" + '#markup': "

Indicate here only the grants that have been applied for from somewhere other than the City of Helsinki and for which the decisions have not been made yet.

\r\n\r\n
\r\n
\r\n
An affirmative answer opens a further question
\r\n
\r\n
\r\n" olemme_hakeneet_avustuksia_muualta_kuin_helsingin_kaupungilta: '#title': 'We have applied for grants from somewhere other than the City of Helsinki' '#options': @@ -117,7 +116,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' diff --git a/conf/cmi/language/en/webform.webform.sotepe_yleis.yml b/conf/cmi/language/en/webform.webform.sotepe_yleis.yml new file mode 100644 index 0000000000..4f4a941508 --- /dev/null +++ b/conf/cmi/language/en/webform.webform.sotepe_yleis.yml @@ -0,0 +1,295 @@ +title: 'General grants for social welfare, health care and rescue services' +elements: | + 1_hakijan_tiedot: + '#title': '1. Applicant details' + '#prev_button_label': 'Previous' + '#next_button_label': 'Next' + yhteiso_jolle_haetaan_avustusta: + '#title': 'Community for which the grant is being applied for' + prh_markup: + '#markup': '
The indicated information has been retrieved from the register of the Finnish Patent and Registration Office (PRH), and changing the information is only possible in the online service in question.
' + hakijan_tiedot: + '#title': Applicant + contact_person_email_section: + '#title': Email + contact_markup: + '#markup': 'Provide here a community email address that is actively read. Contact requests related to the grant application, such as requests for further clarification and completion, will be sent to the email address.' + email: + '#title': 'Email address' + '#help': 'Provide the email address to which you want the messages and notifications related to this application to be sent and which is actively read.' + contact_person_section: + '#title': 'Contact person for the application' + contact_person: + '#title': 'Contact person' + contact_person_phone_number: + '#title': 'Phone number' + osoite: + '#title': Address + community_address: + '#title': Address + '#help': 'If you want to add, delete or change address information, save the application as a draft and go to maintain the address information in your own data.' + '#community_address_select__title': 'Select the address' + tilinumero: + '#title': 'Account number' + bank_account: + '#title': 'Account number' + '#help': 'If you want to add, delete or change account number information, save the application as a draft and go to maintain the account number information in your own data.' + '#account_number_select__title': 'Select the account number' + '#account_number__title': '' + toiminnasta_vastaavat_henkilot: + '#title': 'Persons responsible for operations' + community_officials: + '#help': 'If you want to add, delete or change people, save the application as a draft and go to maintain the people's information in your own data.' + '#title': 'Persons responsible for operations' + '#multiple__add_more_button_label': 'Add person' + '#multiple__item_label': person + '#community_officials_select__title': 'Select official' + 2_avustustiedot: + '#title': '2. Grant details' + '#prev_button_label': 'Previous' + '#next_button_label': 'Next' + avustuksen_tiedot: + '#title': 'Grant details' + acting_year: + '#title': 'Year for which I am applying for a grant' + avustuslajit: + '#title': 'Types of grant' + subventions: + '#title': Grants + kayttotarkoitus: + '#title': 'Purpose of use' + compensation_purpose: + '#title': 'For what purpose will the grant be used?' + '#help': 'Provide a short description of the scope and nature of the activities to be carried out with the grant e.g. as follows:
How much or how often will you organise groups, events or other activities during the period of the grant? How many target group representatives do you expect to reach? In what areas of Helsinki will the activities be arranged? What kind of cooperation do you pursue with other operators in Helsinki?' + '#counter_maximum_message': '%d/5000 characters remaining' + who_benefits: + '#title': 'Who are the main beneficiaries of your activities?' + '#help': 'Describe who belong to your target group and possibly also how many target group members there are in your operational area. It is important that the target group description shows what kind of people you want and can reach or what kind of people and in what situation will benefit most from your activities.' + changes_on_success: + '#title': 'What kind of changes will take place if you succeed?' + '#help': 'Your activities may have many goals. Describe and assess the key changes you are seeking to achieve in your target group's functioning and in their everyday life, relationships or other aspects related to well-being and health or involvement, for example. So what will change if you have succeeded or what kind of phenomena do your activities prevent?' + results_of_activities: + '#title': 'What are the benefits of the activities to be supported?' + '#help': 'Briefly describe the effects of the activities and how they are achieved. You can describe the effects in the order in which they occur: which effects occur first and which after a little longer time. However, focus on the immediate effects of the activities.
You can indicate what is special about your activities or what (quality) factors need to be taken care of in order to achieve the desired effects. You can also describe how any cooperation you have pursued will contribute to achieving the effects.' + muut_samaan_tarkoitukseen_myonnetyt_avustukset: + '#title': 'Other grants received for the same purpose' + info_muut_samaan_tarkoitukseen_myonnetty: + '#markup': "

Indicate here only the grants received from somewhere other than the City of Helsinki in the current and two previous tax years.

\r\n\r\n
\r\n
\r\n
An affirmative answer opens a further question
\r\n
\r\n
\r\n" + olemme_saaneet_muita_avustuksia: + '#title': 'We have received other grants' + '#options': + 1: 'Yes' + 0: 'No' + myonnetty_avustus: + '#title': 'Received grant' + '#multiple__no_items_message': 'No values entered. Add the new grant granted below.' + '#multiple__add_more_button_label': 'Add new received grant' + '#element': + issuer: + '#options': + 1: State + 3: EU + 4: Other + 5: Foundation + '#title': ' Grant issuer' + issuer_name: + '#title': 'Issuer''s name' + '#help': 'Which body has granted the grant (e.g. name of the ministry)' + year: + '#title': Year + '#pattern_error': 'Enter a year between 1900 - 2100' + amount: + '#title': 'Amount of grant granted' + purpose: + '#title': ' Description of intended use' + '#help': 'Give a brief description, for what purpose has the grant been granted?' + '#counter_maximum_message': '%d/1000 characters remaining' + muut_samaan_tarkoitukseen_haetut_avustukset: + '#title': 'Other grants applied for to be used for the same purpose' + info_muut_samaan_tarkoitukseen_haettu: + '#markup': "

Indicate here only the grants that have been applied for from somewhere other than the City of Helsinki and for which the decisions have not been made yet.

\r\n\r\n
\r\n
\r\n
An affirmative answer opens a further question
\r\n
\r\n
\r\n" + olemme_hakeneet_avustuksia_muualta_kuin_helsingin_kaupungilta: + '#title': 'We have applied for grants from somewhere other than the City of Helsinki' + '#options': + 1: 'Yes' + 0: 'No' + haettu_avustus_tieto: + '#title': 'Add new grant applied for' + '#multiple__no_items_message': 'No values ​​entered. Add a new applied for grant below.' + '#multiple__add_more_button_label': 'Add new grant applied for' + '#element': + issuer: + '#options': + 1: State + 3: EU + 4: Other + 5: Foundation + '#title': 'Grant issuer' + issuer_name: + '#title': 'Issuer''s name' + '#help': 'Which body has granted the grant (e.g. name of the ministry)' + year: + '#title': Year + '#pattern_error': 'Enter a year between 1900 - 2100' + amount: + '#title': 'The amount of the grant applied for' + purpose: + '#title': 'Description of intended use' + '#help': 'Give a brief description, for what purpose has the grant been granted?' + '#counter_maximum_message': '%d/1000 characters remaining' + edellisen_avustuksen_kayttoselvitys: + '#title': 'Report on the use of the previous grant' + compensation_boolean_info: + '#markup': "
\r\n
\r\n
An affirmative answer opens a further question
\r\n
\r\n
\r\n" + compensation_boolean: + '#title': 'Report on the use of the grant I received in the previous year' + '#options': + - 'I have not received a grant from the City of Helsinki for the same purpose in the previous year.' + - 'I received a grant from the city of Helsinki for the same purpose last year.' + markup: + '#markup': 'Provide a report on the use of the grant received from the City of Helsinki. A report on the use of the grant must be drawn up for the grant concerning the previous accounting period. A report on the use should not be drawn up for the current accounting period. Providing the report on the use is a prerequisite for receiving the next grant. If no report on the use is provided, the grant will not be awarded or paid. A grant awarded may be recovered if the use of the previous grant has not been satisfactorily reported.' + compensation_explanation: + '#title': 'Report on the use of the grant' + '#help': 'The report on the use must briefly describe how the received grant has been used. The recipient must arrange its accounting in such a way that it is possible to monitor the use of the grant. For example, if a community has received a lease grant, the profit and loss account in the financial statements must show the grant in both income and expenses. Further information on the use of the grant can also be written in a separate attachment, which can be returned under Report on the use.' + '#counter_maximum_message': '%d/5000 characters remaining' + 3_yhteison_tiedot: + '#title': '3. Activities of the community' + '#prev_button_label': 'Previous' + '#next_button_label': 'Next' + business_info: + '#title': 'Description of activities' + business_purpose: + '#title': 'Description of activities' + '#help': 'If you want to add, remove or change the description of activities, save the application as a draft and go to your data to maintain the description of activities.' + '#counter_maximum_message': '%d/500 characters remaining' + community_practices_business: + '#title': 'Is the entity engaged in business?' + '#options': + 1: 'Yes' + 0: 'No' + ensimmainen_otsikko: + '#title': 'Membership fees' + fee_person: + '#title': 'Individual membership fee (€/year)' + fee_community: + '#title': 'Community member (€/year)' + jasenmaara: + '#title': 'Numbers of members' + jasenmaara_fieldset: + '#title': 'Numbers of members' + '#help': 'If the community has members, please list them here.' + members_applicant_person_global: + '#title': 'Total number of individual members' + '#help': 'How many individual members does the community currently have who have paid the membership fee?' + members_applicant_person_local: + '#title': 'Total number of individual members in Helsinki' + '#help': 'How many individual members does the community currently have in Helsinki who have paid the membership fee?' + members_applicant_community_global: + '#title': 'Community members' + '#help': 'How many community members does the community currently have who have paid the membership fee? Community members are non-individual members, such as associations, foundations, companies or municipalities.' + members_applicant_community_local: + '#title': 'Total number of community members in Helsinki' + '#help': 'How many community members does the community currently have in Helsinki who have paid the membership fee? Community members are non-individual members, such as associations, foundations, companies or municipalities.' + lisatiedot_ja_liitteet: + '#title': '4. Additional information and attachments' + lisatietoja_hakemukseen_liittyen: + '#title': 'Additional information concerning the application' + additional_information: + '#title': 'Additional information' + '#help': 'If necessary, you can write additional information or other justifications related to the application.' + '#counter_maximum_message': '%d/5000 characters remaining' + liitteet: + '#title': Attachments + attachments_info: + '#markup': |- +

All the attachments listed below must be submitted for the processing of the grant application. The grant application may be rejected if the attachments are not submitted. If any of the attachments is missing, let us know in the Further clarification on attachments section of the application. +

+

Required attachments

+

For the processing of the grant application, the required attachments are the confirmed attachments approved and signed by the community at its meeting for the previous accounting period and for the operating year for which the grant is being applied for. The attachments concerning the previous accounting period are the financial statements, the annual report, the audit or performance audit report and the minutes of the annual meeting. The attachments for the year for which the grant is being applied for are the budget and action plan.

+

Submission of several attachments as a single file

+

If you wish, you can submit several attachments as a single file under Financial statements or Budget. In this case, under the other attachment headings, indicate “The attachment has been submitted as a single file or with another application.”

+

Attachments previously submitted to the City of Helsinki

+

If the required attachments have already been submitted as attachments to another grant application addressed to the City of Helsinki, the same attachments do not need to be submitted again. The confirmed financial statements, annual report, action plan and budget of the community cannot be different from one application to another. In this case, under the submitted attachments, indicate “The attachment has been submitted as a single file or with another application”.

+ notification_attachments: + '#markup': "
\r\n
\r\n
The contents of the attachments cannot be viewed afterwards
\r\n\r\n
\r\n

Please note that you will not be able to open the attachments after you have attached them to the form. You will only see the file name of the attachment.

\r\n\r\n

Although you cannot view the attachments afterwards, the attachments to the form are sent along with the other information on the form to the grant application processor.

\r\n
\r\n
\r\n
\r\n" + yhteison_saannot: + '#title': 'Community Rules' + '#help': 'A new applicant or the rules have changed.' + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + vahvistettu_tilinpaatos: + '#title': 'Confirmed financial statements (for the previous accounting period)' + '#help': "The financial statements must include at least the profit and loss account and the balance sheet. An association must append to this section the financial statements confirmed and signed at the association’s annual meeting. \r\nThe community’s accounting period may be a calendar year or some other period. In the case of associations, their own rules state what the association’s accounting period is." + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + vahvistettu_toimintakertomus: + '#title': 'Confirmed annual report (for the previous accounting period)' + '#help': "An association must append to this section the annual report confirmed at the association’s annual meeting. If the annual report is part of the financial statements and you have already appended it to the form with the financial statements, it does not need to be appended here separately. In this case, under the annual report, indicate “The attachment has been submitted as a single file or with another application”." + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + vahvistettu_tilin_tai_toiminnantarkastuskertomus: + '#title': 'Confirmed audit or performance audit report (for the previous accounting period)' + '#help': "An association must append to this section the annual report confirmed at the association’s annual meeting. If the annual report is part of the financial statements and you have already appended it to the form with the financial statements, it does not need to be appended here separately. In this case, under the annual report, indicate “The attachment has been submitted as a single file or with another application”." + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + vuosikokouksen_poytakirja: + '#title': 'Minutes of the annual meeting confirming the financial statements for the previous accounting period' + '#help': 'Append here the minutes of the community meeting in which the financial statements for the previous accounting period are confirmed and discharge from liability granted. For associations, the financial statements are always confirmed at the association’s annual meeting. If the community is not required to have an annual meeting or other community meeting at which the financial statements should be approved and discharge from liability granted, this attachment does not need to be submitted.' + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + toimintasuunnitelma: + '#title': 'Action plan (for the year for which you are applying for a grant)' + '#help': 'Append here the action plan for the whole community.' + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + talousarvio: + '#title': 'Budget (for the year for which you are applying for a grant)' + '#help': 'Budget (for the year for which you are applying for a grant)' + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + extra_info: + '#title': 'Further clarification on attachments' + '#counter_maximum_message': '%d/5000 characters remaining' + muu_liite: + '#title': 'Other attachment' + '#multiple__add_more_button_label': 'Add attachment' + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + actions: + '#submit__label': Submit + '#draft__label': 'Save as draft' + '#wizard_prev__label': 'Previous' + '#wizard_next__label': 'Next' + '#preview_prev__label': 'Previous' + '#preview_next__label': 'Preview' + '#delete__label': ' Delete unfinished' +settings: + wizard_prev_button_label: Previous + wizard_next_button_label: Next + preview_label: '5. Confirm, preview, and submit' + preview_title: 'Confirm, preview, and submit' + wizard_confirmation_label: '6. Complete' diff --git a/conf/cmi/language/en/webform.webform.taide_ja_kulttuuri_kehittamisavu.yml b/conf/cmi/language/en/webform.webform.taide_ja_kulttuuri_kehittamisavu.yml index 6a02c17a6f..1445e29f01 100644 --- a/conf/cmi/language/en/webform.webform.taide_ja_kulttuuri_kehittamisavu.yml +++ b/conf/cmi/language/en/webform.webform.taide_ja_kulttuuri_kehittamisavu.yml @@ -126,7 +126,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': ' Issuer''s name' diff --git a/conf/cmi/language/en/webform.webform.taide_ja_kulttuuriavustukset_tai.yml b/conf/cmi/language/en/webform.webform.taide_ja_kulttuuriavustukset_tai.yml index 38bae87209..7f97d89e9b 100644 --- a/conf/cmi/language/en/webform.webform.taide_ja_kulttuuriavustukset_tai.yml +++ b/conf/cmi/language/en/webform.webform.taide_ja_kulttuuriavustukset_tai.yml @@ -91,7 +91,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' diff --git a/conf/cmi/language/en/webform.webform.yleisavustushakemus.yml b/conf/cmi/language/en/webform.webform.yleisavustushakemus.yml index 9460ee28c3..3c9378bc81 100644 --- a/conf/cmi/language/en/webform.webform.yleisavustushakemus.yml +++ b/conf/cmi/language/en/webform.webform.yleisavustushakemus.yml @@ -80,7 +80,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' @@ -114,7 +113,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' diff --git a/conf/cmi/language/en/webform.webform.ymparistopalvelut_yleisavustus.yml b/conf/cmi/language/en/webform.webform.ymparistopalvelut_yleisavustus.yml index 7ec7f0db9c..8bbdf3a774 100644 --- a/conf/cmi/language/en/webform.webform.ymparistopalvelut_yleisavustus.yml +++ b/conf/cmi/language/en/webform.webform.ymparistopalvelut_yleisavustus.yml @@ -83,7 +83,6 @@ elements: | 3: EU 4: Other 5: Foundation - 6: STEA '#title': 'Grant issuer' issuer_name: '#title': 'Issuer''s name' diff --git a/conf/cmi/language/fi/grants_metadata.settings.yml b/conf/cmi/language/fi/grants_metadata.settings.yml index 6acfc02f84..a13f128953 100644 --- a/conf/cmi/language/fi/grants_metadata.settings.yml +++ b/conf/cmi/language/fi/grants_metadata.settings.yml @@ -69,4 +69,12 @@ third_party_options: 44: Kehittämisavustus 45: 'Helsingin mallin kehittämisavustus' 46: 'Taiteen perusopetuksen kehittämisavustus' + 47: 'Kulttuurin erityisavustus 1' + 48: 'Kulttuurin erityisavustus 2' + 49: 'Nuorison erityisavustus 1' + 50: 'Nuorison erityisavustus 2' + 51: 'Liikunnan erityisavustus 1' + 52: 'Liikunnan erityisavustus 2' + 53: 'Kulttuurin ja vapaa-ajan erityisavustus 1' + 54: 'Kulttuurin ja vapaa-ajan erityisavustus 2' langcode: fi diff --git a/conf/cmi/language/sv/grants_metadata.settings.yml b/conf/cmi/language/sv/grants_metadata.settings.yml index a5e6eb9a86..b4644c778c 100644 --- a/conf/cmi/language/sv/grants_metadata.settings.yml +++ b/conf/cmi/language/sv/grants_metadata.settings.yml @@ -69,4 +69,12 @@ third_party_options: 44: Utvecklingsunderstöd 45: 'Utvecklingsunderstöd för Helsingforsmodellen' 46: 'Utvecklingsunderstöd för grundläggande konstundervisning' + 47: 'Specialunderstöd för kultur 1' + 48: 'Specialunderstöd för kultur 2' + 49: 'Specialunderstöd för ungdomsverksamhet 1' + 50: 'Specialunderstöd för ungdomsverksamhet 2' + 51: 'Specialunderstöd för idrott 1' + 52: 'Specialunderstöd för idrott 2' + 53: 'Specialunderstöd för kultur och fritid 1' + 54: 'Specialunderstöd för kultur och fritid 2' langcode: sv diff --git a/conf/cmi/language/sv/webform.webform.hyte_yleisavustus.yml b/conf/cmi/language/sv/webform.webform.hyte_yleisavustus.yml index c19f2645b4..4f1a00f00a 100644 --- a/conf/cmi/language/sv/webform.webform.hyte_yleisavustus.yml +++ b/conf/cmi/language/sv/webform.webform.hyte_yleisavustus.yml @@ -85,7 +85,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' @@ -119,7 +118,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' diff --git a/conf/cmi/language/sv/webform.webform.iakkaiden_kulttuuri_ja_liikunta.yml b/conf/cmi/language/sv/webform.webform.iakkaiden_kulttuuri_ja_liikunta.yml new file mode 100644 index 0000000000..be67445b87 --- /dev/null +++ b/conf/cmi/language/sv/webform.webform.iakkaiden_kulttuuri_ja_liikunta.yml @@ -0,0 +1,315 @@ +title: 'KUVA: ansökan om understöd för främjande av motion och kulturverksamhet hos äldre' +elements: | + 1_hakijan_tiedot: + '#title': '1. Sökandens uppgifter' + '#prev_button_label': Tidigare + '#next_button_label': Nästa + hakemusprofiili: + '#title': 'Hämtade uppgifter' + prh_markup: + '#markup': '

Informationen har hämtats från din profil.

' + hakijan_tiedot: + '#title': Sökande + contact_person_email_section: + '#title': E-post + contact_markup: + '#markup': '

Ange här samfundets e-postadress som läses aktivt. Till e-postadressen skickas kontaktförfrågningar som är relaterade till ansökan om understöd, såsom begäranden om tilläggsutredning och komplettering

' + email: + '#title': E-postadress + '#help': '

Ange en e-postadress dit meddelandena och begärandena relaterade till denna ansökan kommer att skickas och som läses aktivt.

' + contact_person_section: + '#title': 'Kontaktperson för ansökan' + contact_person: + '#title': Kontaktperson + contact_person_phone_number: + '#title': Telefonnummer + osoite: + '#title': Adress + community_address: + '#title': Adress + '#help': '

Om du vill lägga till, ta bort eller ändra adressuppgifter, spara ansökan som ett utkast och gå till att behålla adressuppgifterna i dina egna uppgifter.

' + '#community_address_select__title': 'Välj en adress' + tilinumero: + '#title': Kontonummer + bank_account: + '#title': Kontonummer + '#help': '

Om du vill lägga till, radera eller ändra kontonummerinformation, spara applikationen som ett utkast och gå till att behålla kontonummerinformationen i din egen data.

' + '#account_number_select__title': 'Välj ett kontonummer' + '#account_number__title': '' + toiminnasta_vastaavat_henkilot: + '#title': 'Personer som ansvarar för verksamheten' + community_officials: + '#help': '

Om du vill lägga till, ta bort eller ändra personer, spara applikationen som ett utkast och gå till att underhålla personernas information i din egen data.

' + '#title': 'Personer som ansvarar för verksamheten' + '#multiple__add_more_button_label': 'Lägg till en person' + '#community_officials_select__title': 'Välj motsvarande person' + '#role__title': Roll + '#email__title': E-post + '#phone__title': Telefonnummer + 2_avustustiedot: + '#title': '2. Uppgifter om understödet' + avustuksen_tiedot: + '#title': 'Uppgifter om understödet' + acting_year: + '#title': 'År för vilket jag ansöker om understöd' + avustuslajit: + '#title': Understöd + subventions: + '#title': 'Typ av stöd' + grants_compensations_information: + '#markup': '

Ansök alltid endast om en typ av understöd åt gången.

' + kayttotarkoitus: + '#title': 'Användningsän damål' + compensation_purpose: + '#title': 'En kort beskrivning av användningsändamålet för det/de understöd som ansöks' + '#help': '

Ange för vilket ändamål understödet ansöks och vid behov specificera de olika ändamålen. Ange också vad understödet är avsett för och vilka mål som är relaterade till den understödda verksamheten.

' + '#counter_maximum_message': '%d/5000 tecken kvar' + other_grants_for_same_purpose: + '#title': 'Övriga understöd som beviljats för samma ändamål' + info_muut_samaan_tarkoitukseen_myonnetty: + '#markup': '

Ange här endast de understöd som beviljats från annanstans
än Helsingfors stad under det innevarande beskattningsåret eller de föregående två beskattningsåren.

Ett jakande svar öppnar ytterligare en fråga
' + olemme_saaneet_muita_avustuksia: + '#title': 'Vi har fått andra understöd' + '#options': + 1: Ja + 0: Nej + myonnetty_avustus: + '#title': 'Bidrag beviljat' + '#multiple__no_items_message': '

Inga värden har angetts. Lägg till det nya beviljade bidraget nedan.

' + '#multiple__add_more_button_label': 'Lägg till understöd som beviljats' + '#element': + issuer: + '#options': + 1: Stat + 4: Övrig + 5: Fundament + '#title': Bidragsgivare + issuer_name: + '#title': 'Emittentens namn' + '#help': '

Vilket organ har beviljat bidraget (t.ex. namnet på departementet)

' + year: + '#title': År + '#pattern_error': 'Ange ett årtal' + amount: + '#title': 'Beviljat bidragsbelopp' + purpose: + '#title': 'Beskrivning av avsedd användning' + '#help': '

Ge en kort beskrivning, i vilket syfte har bidraget beviljats?

' + '#counter_maximum_message': '%d/1000 tecken kvar' + muut_samaan_tarkoitukseen_haetut_avustukset: + '#title': 'Övriga understöd som ansökts för samma ändamål' + info_muut_samaan_tarkoitukseen_haettu: + '#markup': '

Ange här endast de understöd som har ansökts från annanstans än Helsingfors stad, men beslut har ännu inte fattats.

Ett jakande svar öppnar ytterligare en fråga
' + olemme_hakeneet_avustuksia_muualta_kuin_helsingin_kaupungilta: + '#title': 'Vi har ansökt om understöd från annanstans än Helsingfors Stad' + '#options': + 1: Ja + 0: Nej + haettu_avustus_tieto: + '#title': 'Lägg till nytt understöd som ansökts' + '#multiple__no_items_message': '

Ei syötettyjä arvoja. Lisää uusi haettu avustus alta.

' + '#multiple__add_more_button_label': 'Lägg till nytt understöd som ansökts' + '#element': + issuer: + '#options': + 1: Stat + 4: Övrig + 5: Fundament + '#title': Bidragsgivare + issuer_name: + '#title': 'Emittentens namn' + '#help': '

Vilket organ har beviljat bidraget (t.ex. namnet på departementet)

' + year: + '#title': År + '#pattern_error': 'Ange ett årtal' + amount: + '#title': 'Beviljat bidragsbelopp' + purpose: + '#title': 'Beskrivning av avsedd användning' + '#help': '

Ge en kort beskrivning, i vilket syfte har bidraget beviljats?

' + '#counter_maximum_message': '%d/1000 tecken kvar' + 3_tarkemmat_tiedot: + '#title': '3. Mer detaljerad information' + hankesuunnitelma_radios: + '#title': 'Ansöker du nu om den andra delen av ett tvåårigt understöd som beviljades 2024?' + '#description': '

Beslut om understöd för 2024:

' + '#options': + 1: Ja + 0: Nej + ensisijainen_taiteen_ala: + '#title': 'Huvudsaklig konstart ' + '#help': '

Välj det alternativ, som bäst motsvarar er verksamhet.

' + '#options': + 'Design ja käsityö': 'Design och hantverk' + 'Elokuva, valokuva ja media': 'Film, fotokonst och media' + Kaupunkikulttuuri: Stadskultur + Kirjallisuus: Litteratur + 'Kuvataide ja sarjakuva': 'Bildkonst och seriekonst' + Monitaide: 'Tvärkonstnärlig verksamhet' + Museo: Museum + Musiikki: Musik + Muu: Annat + Sirkus: Cirkus + Tanssi: Dans + Teatteri: Teater + hankesuunnitelma_section: + '#title': '3.1 Projektplan' + hankesuunnitelma_jatkohakemus: + '#title': 'Är understödet du ansöker om en förlängning av ett pågående projekt?' + '#description': '

Svara bara ”ja” på den här frågan om din sammanslutning redan har ett pågående projekt som finansieras med samma understöd och du ansöker om fortsatt finansiering.

' + '#options': + 1: Ja + 0: Nej + hankkeen_tarkoitus_tavoitteet: + '#title': 'Syfte och mål med projektet' + '#counter_maximum_message': '%d/2500 tecken kvar' + hankkeen_toimenpiteet_aikataulu: + '#title': 'Vilka är de konkreta åtgärderna för projektet och tidtabellen för när de ska genomföras?' + '#counter_maximum_message': '%d/4000 tecken kvar' + hankkeen_toimenpiteet_toteutus: + '#title': 'Enligt planen ska de konkreta åtgärderna i projektet genomföras mellan' + hankkeen_toimenpiteet_alkupvm: + '#title': Startdatum + hankkeen_toimenpiteet_loppupvm: + '#title': Slutdatum + hankkeen_keskeisimmat_kumppanit: + '#title': 'Namnge de viktigaste samarbetspartnerna och deras roll i projektet' + '#counter_maximum_message': '%d/2500 tecken kvar' + haun_painopisteet_section: + '#title': '3.2 Tyngdpunkter för ansökan' + haun_painopisteet_ohje: + '#markup': '

Vilken av följande tyngdpunkter för understödet för främjande av idrott hos äldre är projektet inriktat på?

Projektet ska arbeta för en eller flera tyngdpunkter. OBS! Välj bara de tyngdpunkter som ni kommer att bidra till på ett konkret sätt genom projektet.

' + haun_painopisteet_liikkumis_kehitys: + '#title': 'Bidrar projektet till att utveckla möjligheter till idrott eller konst- och kulturverksamhet i närområdet/regionalt? På vilket sätt?' + '#counter_maximum_message': '%d/1250 tecken kvar' + haun_painopisteet_digi_kehitys: + '#title': 'Bidrar projektet till att utveckla kulturaktiviteter eller verksamhet som uppmuntrar till idrott som ordnas digitalt/på distans? På vilket sätt?' + '#counter_maximum_message': '%d/1250 tecken kvar' + haun_painopisteet_vertais_kehitys: + '#title': 'Bidrar projektet till att utveckla frivillig- /kamratverksamhet? På vilket sätt?' + '#counter_maximum_message': '%d/1250 tecken kvar' + haun_painopisteet_kulttuuri_kehitys: + '#title': 'Bidrar projektet till att utveckla kompetensen hos konst- och kulturaktörer eller skapa nya arbetssätt/strukturer? På vilket sätt?' + '#counter_maximum_message': '%d/1250 tecken kvar' + hankkeen_kohderyhmat_section: + '#title': '3.3 Projektets målgrupper' + hankkeen_kohderyhmat_kenelle: + '#title': 'Vem är den huvudsakliga målgruppen för projektet?' + '#counter_maximum_message': '%d/1250 tecken kvar' + hankkeen_kohderyhmat_erityisryhmat: + '#title': 'Riktar sig projektet till någon särskild grupp? Till vilken särskild grupp? Om svaret är ”nej”, lämna tomt.' + '#counter_maximum_message': '%d/1250 tecken kvar' + hankkeen_kohderyhmat_tavoitus: + '#title': 'Hur ska ni nå ut med projektet till målgrupperna?' + '#counter_maximum_message': '%d/1250 tecken kvar' + hankkeen_kohderyhmat_konkretia: + '#title': 'På vilket sätt bidrar projektet till att främja den valda målgruppens funktionsförmåga och välbefinnande genom konkreta åtgärder?' + '#counter_maximum_message': '%d/1250 tecken kvar' + hankkeen_kohderyhmat_osallisuus: + '#title': 'På vilket sätt främjar projektet delaktighet? Vilken roll har äldre personer i projektet?' + '#counter_maximum_message': '%d/1250 tecken kvar' + hankkeen_kohderyhmat_osaaminen: + '#title': 'Vilken kompetens har aktörerna i projektet i förväg att arbeta med målgruppen/- grupperna?' + '#counter_maximum_message': '%d/1250 tecken kvar' + hankkeen_kohderyhmat_postinrot: + '#title': 'Inom vilket/vilka postnummerområden i Helsingfors kommer projektet att genomföras? Ange upp till tre (3) postnummerområden och separera dem med kommatecken (,).' + hankkeen_kohderyhmat_miksi_alue: + '#title': 'Varför har ni valt just det/de områdena?' + '#counter_maximum_message': '%d/1250 tecken kvar' + hankkeen_riskit_section: + '#title': '3.4 Risker och analys' + hankkeen_riskit_keskeisimmat: + '#title': 'Vilka är de största riskerna när det gäller genomförande av projektet?' + '#counter_maximum_message': '%d/2500 tecken kvar' + hankkeen_riskit_seuranta: + '#title': 'Hur kommer ni att följa upp och utvärdera projektet?' + '#counter_maximum_message': '%d/2500 tecken kvar' + hankkeen_riskit_vakiinnuttaminen: + '#title': 'Är den planerade verksamheten för projektet avsedd att bli en permanent del av den grundläggande verksamheten hos den sökande/en annan aktör efter projektet? Om ja, beskriv i textrutan hur det här kommer att ske, lämna annars tomt.' + '#counter_maximum_message': '%d/2500 tecken kvar' + hankkeen_valiarviointi_section: + '#title': '3.5 Mellanutvärderin g av tvååriga projekt' + arviointi_markup: + '#markup': '

I den här delen ska du använda följande frågor för att utvärdera verksamheten inom projektet hittills. Om du ansöker om andra delen av understödet ska du även bifoga en
kostnadsställesrapport för perioden 1.6–31.12.2024 under Övriga bilagor.

' + arviointi_toteuma: + '#title': 'Har projektet framskridit enligt planen? Bedöm projektets resultat hittills på en skala 1–100 procent och motivera ditt svar.' + '#counter_maximum_message': '%d/1250 tecken kvar' + '#description': 'Har det skett några väsentliga förändringar i projektet?' + arviointi_muutokset_talous: + '#title': 'Gällande ekonomin; vilka?' + '#counter_maximum_message': '%d/1250 tecken kvar' + arviointi_muutokset_toiminta: + '#title': 'Gällande verksamheten; vilka?' + '#counter_maximum_message': '%d/1250 tecken kvar' + arviointi_muutokset_aikataulu: + '#title': 'Gällande tidsplanen; vilka?' + '#counter_maximum_message': '%d/1250 tecken kvar' + arviointi_haasteet: + '#title': 'Har projektet stött på utmaningar som har påverkat verksamheten? Om ja, vilka utmaningar?' + '#counter_maximum_message': '%d/1250 tecken kvar' + arviointi_saavutettavuus: + '#title': 'Hur har verksamheten nått ut till deltagarna i förhållande till målen?' + '#counter_maximum_message': '%d/1250 tecken kvar' + arviointi_avustus_kaytto: + '#help': '

Understödsvillkor, punkt 10 e: ”Beviljat understöd ska återbetalas till Helsingfors stad om understödet inte har använts inom den tid då det
enligt understödsbeslutet borde ha förbrukats.”

' + '#title': 'Kommer understödet för den första projektperioden att användas inom tidsfristen (31.5.2025)? Om inte, förklara orsakerna här.' + '#counter_maximum_message': '%d/1250 tecken kvar' + 4_talousarvio: + '#title': '4. Budget' + tulot_section: + '#title': '4.1 Inkomster' + tulot: + '#title': Inkomster + '#compensation__title': 'Ansökt stöd (€)' + '#plannedOtherCompensations__title': 'Övriga understöd (€)' + '#sales__title': 'Övriga egna inkomster (€)' + '#ownFunding__title': 'Egenfinansiering (€)' + talous_tulon_tyyppi: + '#title': 'Typ av inkomst ' + '#help': '

Skriv ner vilken typ av inkomst det gäller. Inkomster kan till exempel vara andra understöd och inträdes- eller
deltagaravgifter. Självfinansiering måste uppges som en inkomst även
om den självfinansierade delen finansieras med sökandes övrig verksamhet.

' + '#multiple__add_more_button_label': 'Lägg till en intäkt' + menot_section: + '#title': '4.2 Utgifter' + talous_menon_tyyppi: + '#title': 'Typ av utgift' + '#help': '

Skriv ner vilken typ av utgift det gäller. Utgifter kan till exempel vara andra lokalhyror och personalkostnader.

' + '#multiple__add_more_button_label': 'Lägg till en utgift' + lisatiedot_ja_liitteet: + '#title': '5. Ytterligare information och bilagor' + lisatietoja_hakemukseen_liittyen: + '#title': 'Ytterligare information för ansökan' + additional_information: + '#title': 'Ytterligare information' + '#help': '

Här kan du vid behov skriva ytterligare information eller andra motiveringar som rör ansökan eller meddela om ändringar i basuppgifterna.

' + '#counter_maximum_message': '%d/5000 tecken kvar' + liitteet: + '#title': Bilagor + attachments_info: + '#markup': '

Alla bilagor som anges i utlysningen måste lämnas in för behandling av ansökan om understöd. Ansökan om understöd kan avslås om bilagorna inte har lämnats in. Om någon av bilagorna saknas, meddela oss om det i punkten Ytterligare information om bilagor i ansökan.

Bilagor som tidigare lämnats in till Helsingfors stad

Om de erforderliga bilagorna redan har lämnats in som bilaga till en annan ansökan om understöd till Helsingfors stad, behöver samma bilagor inte lämnas in igen. Samfundets fastställda bokslut, verksamhetsberättelse, verksamhetsplan och budget får inte vara olika i bilagor till de olika ansökningarna. Ange i detta fall vid de inlämnade bilagorna att ”Bilagan har lämnats in som en fil eller i samband med en annan ansökan”.

' + notification_attachments: + '#markup': '
Innehållet i bilagorna kan inte granskas i efterhand

Observera att du inte kan öppna bilagorna efter att du har bifogat dem blanketten. Du ser bara bilagans filnamn.

Även om du inte kan granska innehållet i bilagorna i efterhand skickas bilagorna som bifogats blanketten med övriga uppgifter till personen som behandlar ansökan om understöd.

' + extra_info: + '#title': 'Ytterligare information om bilagorna' + '#counter_maximum_message': '%d/5000 tecken kvar' + muu_liite: + '#title': 'Annan bilaga' + '#multiple__add_more_button_label': 'Lägg till en bilaga' + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + actions: + '#submit__label': Skicka + '#draft__label': 'Spara som oavslutad' + '#wizard_prev__label': Tidigare + '#wizard_next__label': Nästa + '#preview_prev__label': Tidigare + '#preview_next__label': 'För förhandsvisning' + '#delete__label': 'Radera oavslutat' +settings: + wizard_confirmation_label: '7. Slutförd' + wizard_prev_button_label: Tidigare + wizard_next_button_label: Nästa + preview_label: '6. Bekräfta, förhandsgranska och skicka' + preview_title: 'Bekräfta, förhandsgranska och skicka' diff --git a/conf/cmi/language/sv/webform.webform.kasvatus_ja_koulutus_toiminta_av.yml b/conf/cmi/language/sv/webform.webform.kasvatus_ja_koulutus_toiminta_av.yml index cfc0cd2964..568dfd85ba 100644 --- a/conf/cmi/language/sv/webform.webform.kasvatus_ja_koulutus_toiminta_av.yml +++ b/conf/cmi/language/sv/webform.webform.kasvatus_ja_koulutus_toiminta_av.yml @@ -85,7 +85,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' diff --git a/conf/cmi/language/sv/webform.webform.kasvatus_ja_koulutus_yleisavustu.yml b/conf/cmi/language/sv/webform.webform.kasvatus_ja_koulutus_yleisavustu.yml index fa0f7d4b54..435b9a5907 100644 --- a/conf/cmi/language/sv/webform.webform.kasvatus_ja_koulutus_yleisavustu.yml +++ b/conf/cmi/language/sv/webform.webform.kasvatus_ja_koulutus_yleisavustu.yml @@ -87,7 +87,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' diff --git a/conf/cmi/language/sv/webform.webform.kaupunginkanslia_tyollisyysavust.yml b/conf/cmi/language/sv/webform.webform.kaupunginkanslia_tyollisyysavust.yml index 7d24e07b6b..b1bd2a72a9 100644 --- a/conf/cmi/language/sv/webform.webform.kaupunginkanslia_tyollisyysavust.yml +++ b/conf/cmi/language/sv/webform.webform.kaupunginkanslia_tyollisyysavust.yml @@ -88,7 +88,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' @@ -122,7 +121,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' diff --git a/conf/cmi/language/sv/webform.webform.kuva_projekti.yml b/conf/cmi/language/sv/webform.webform.kuva_projekti.yml index 2962bcbd20..16930ff1b1 100644 --- a/conf/cmi/language/sv/webform.webform.kuva_projekti.yml +++ b/conf/cmi/language/sv/webform.webform.kuva_projekti.yml @@ -107,7 +107,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' diff --git a/conf/cmi/language/sv/webform.webform.kuva_toiminta.yml b/conf/cmi/language/sv/webform.webform.kuva_toiminta.yml index 417f267211..40d69cdbda 100644 --- a/conf/cmi/language/sv/webform.webform.kuva_toiminta.yml +++ b/conf/cmi/language/sv/webform.webform.kuva_toiminta.yml @@ -121,7 +121,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' diff --git a/conf/cmi/language/sv/webform.webform.liikunta_laitosavustushakemus.yml b/conf/cmi/language/sv/webform.webform.liikunta_laitosavustushakemus.yml index 363a343e43..7c3b12d8d7 100644 --- a/conf/cmi/language/sv/webform.webform.liikunta_laitosavustushakemus.yml +++ b/conf/cmi/language/sv/webform.webform.liikunta_laitosavustushakemus.yml @@ -85,7 +85,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' @@ -119,7 +118,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' diff --git a/conf/cmi/language/sv/webform.webform.liikunta_toiminta_ja_tilankaytto.yml b/conf/cmi/language/sv/webform.webform.liikunta_toiminta_ja_tilankaytto.yml index 92016a206a..ab4e408957 100644 --- a/conf/cmi/language/sv/webform.webform.liikunta_toiminta_ja_tilankaytto.yml +++ b/conf/cmi/language/sv/webform.webform.liikunta_toiminta_ja_tilankaytto.yml @@ -79,7 +79,7 @@ elements: | '#markup': 'Ge en redovisning om understödet som fåtts från Helsingfors stad. Redovisningen görs om understödet som beviljats för den senaste avslutade räkenskapsperioden. Redovisning görs inte om den innevarande räkenskapsperioden. Redovisningen krävs för att få ett nytt understöd. Om en redovisning inte görs, kommer ett understöd inte att beviljas eller betalas ut. Det beviljade understödet kan återkrävas om användningen av det tidigare understödet inte har redogjorts för på ett tillfredsställande sätt.' compensation_explanation: '#title': 'Redovisning om användningen av understödet' - '#help': 'I redovisningen ska det kortfattat anges hur det beviljade understödet har använts. Understödstagaren ska ordna sin bokföring så att användningen av understödet kan följas där. Om samfundet till exempel har fått hyresunderstöd ska det av resultaträkningen i bokslutet framgå både intäkter och utgifter vad gäller understödet. Mer information om användningen av understödet kan också skrivas i en separat bilaga som kan lämnas som Redovisning-bilaga.' + '#help': '

I redovisningen ska det kortfattat anges hur det beviljade understödet har använts. Understödstagaren ska ordna sin bokföring så att användningen av understödet kan följas där. Mer information om användningen av understödet kan också skrivas i en separat bilaga som kan lämnas som Redovisning-bilaga.

' '#counter_maximum_message': '%d/5000 tecken kvar' kayttotarkoitus: '#title': 'Användningsända­mål' @@ -107,7 +107,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' @@ -124,7 +123,7 @@ elements: | tilankayttoavustus: '#title': 'Understöd för användning av idrottslokaler' maksetut_vuokrat_info: - '#markup': "

Sammanställning av de hyror som föreningen har betalatför regelbundna träningsskift förutom idrottstjänstens egna lokaler under föregående kalenderår 1.1. - 31.12.3. Avsnittet Hyror för idrottsanläggningar är obligatoriskt om du ansöker om understöd för användning av idrottslokaler.

\r\n" + '#markup': '

Sammanställning av de hyror som föreningen har betalat för regelbundna träningsskift förutom idrottstjänstens egna lokaler. Uppge de realiserade hyrorna och antalet timmar under föregående kalenderår 1.1. - 31.12. i enlighet med lokalanvändningsbilaga. Avsnittet Hyror betalda för idrottslokaler är obligatoriskt om du ansöker om understöd för användning av idrottslokaler.

' liikuntatiloista_maksetut_vuokrat_fieldset: '#title': 'Hyror betalda för idrottslokaler' tuntimaara_yhteensa: @@ -132,7 +131,8 @@ elements: | vuokrat_yhteensa: '#title': 'Totalt / EUR' seuraavalle_vuodelle_suunniteltu_muutos_tilojen_kaytossa_tunnit_: - '#title': 'Planerad ändring i användning av lokaler nästa år, +/- timmar och skäl' + '#title': 'Planerad väsentlig ändring i användning av lokaler nästa år, +/- timmar och skäl' + '#help': '

I beloppet av understödet för lokalanvändning kan enligt prövning beaktas väsentliga förändringar i föreningens användning av idrottslokaler rörande ansökningsåret. Med väsentliga förändringar avses: sammanslagning av föreningar, anslutning av en sektion eller sektioner till föreningen, avgång av en sektion eller sektioner från föreningen, en ny idrottslokal som hyrs av föreningen (hyresavtalet för lokalen i fråga ska bifogas ansökan) eller avstående från en idrottslokal som förvaltas eller ägs av föreningen.

' seuran_yhdistyksen_saamat_vuokrat_edellisen_kalenterivuoden_ajal: '#title': 'Föreningens hyresinkomster under föregående kalenderår 1.1. –31.12.' '#description': 'Om föreningen får hyresinkomster för sina lokaler, anges de här.' @@ -230,8 +230,9 @@ elements: | '#help': 'Utöver de VOK 1-utbildningar som ordnas av regionala idrottsorganisationer beaktas i beräkningen antalet handledare och tränare som har genomgått en utbildning för tränare och handledare som ordnas av ett grenförbund på minst motsvarande nivå och med motsvarande innehåll eller som har avlagt grundexamen i idrott, idrottsinstruktör (YH) eller magisterexamen i idrottsvetenskaper (idrottspedagogik eller motionsbiologi).' lajijaostot_helsinkilaisille_aktiiviharrastajille: '#title': 'Aktiva grengsektioner för helsingforsare' + '#help': '

I avsnittet träningstimmar, rapportera inte enskilda idrottsutövarnas träningsprestationer i timmar, utan de faktiska träningstimmar som organiserats för helsingforsare som tillhör åldersgruppen.

Om det faktiska antalet träningstimmar för en åldersgrupp inte kan fastställas (t. ex. många blandade träningsgrupper), kan andelen av den åldersgruppen beräknas från det totala antalet timmar baserat på andelen av antalet aktiva idrottsutövare från Helsingfors i åldersgruppen av det totala antalet aktiva idrottsutövare från Helsingfors. T. ex. totala antalet timmar i grensektionen (alla blandade grupper) är 100 timmar, där 10 vuxna och 20 under 20-åringar är aktiva: antalet timmar för vuxna är 33 timmar och för under 20-åringar 67 timmar. Det faktiska antalet realiserade timmar för åldersgruppen bör dock i första hand användas.

' lajijaostot_info: - '#markup': "

Regelbunden handledd idrottsverksamhet som ordnas av föreningen, enligt gren. Ange här antalet aktiva idrottsutövare från Helsingfors under föregående år, per sport, samt deras realiserade träningstimmar.

\r\n" + '#markup': '

Regelbunden handledd idrottsverksamhet som ordnas av föreningen, enligt gren. Ange här antalet aktiva idrottsutövare från Helsingfors under föregående år, per sport, samt deras realiserade träningstimmar per åldersgrupp.

' club_section: '#multiple__add_more_button_label': 'Lägg till en sport' '#multiple__item_label': 'sport' diff --git a/conf/cmi/language/sv/webform.webform.nuorisotoiminta_projektiavustush.yml b/conf/cmi/language/sv/webform.webform.nuorisotoiminta_projektiavustush.yml index d7cdb0433f..8e3c9497f4 100644 --- a/conf/cmi/language/sv/webform.webform.nuorisotoiminta_projektiavustush.yml +++ b/conf/cmi/language/sv/webform.webform.nuorisotoiminta_projektiavustush.yml @@ -86,7 +86,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' @@ -119,7 +118,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' diff --git a/conf/cmi/language/sv/webform.webform.nuortoimpalkka.yml b/conf/cmi/language/sv/webform.webform.nuortoimpalkka.yml index 401c25b623..970d0e6993 100644 --- a/conf/cmi/language/sv/webform.webform.nuortoimpalkka.yml +++ b/conf/cmi/language/sv/webform.webform.nuortoimpalkka.yml @@ -69,7 +69,7 @@ elements: | muut_samaan_tarkoitukseen_myonnetyt_avustukset: '#title': 'Övriga understöd som beviljats för samma ändamål' info_muut_samaan_tarkoitukseen_myonnetty: - '#text': "

Ange här endast de understöd som beviljats från annanstans än Helsingfors stad under det innevarande beskattningsåret eller de föregående två beskattningsåren.

\r\n\r\n
\r\n
\r\n
Ett jakande svar öppnar ytterligare en fråga
\r\n
\r\n
\r\n" + '#markup': "

Ange här endast de understöd som beviljats från annanstans än Helsingfors stad under det innevarande beskattningsåret eller de föregående två beskattningsåren.

\r\n\r\n
\r\n
\r\n
Ett jakande svar öppnar ytterligare en fråga
\r\n
\r\n
\r\n" olemme_saaneet_muita_avustuksia: '#title': 'Vi har fått andra understöd' '#options': @@ -86,11 +86,10 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' - '#help': '

Vilket organ har beviljat bidraget (t.ex. namnet på departementet)

' + '#help': '

Vilket organ har beviljat bidraget (t.ex. namnet på departementet).

' year: '#title': År '#pattern_error': 'Bara siffror' @@ -103,7 +102,7 @@ elements: | muut_samaan_tarkoitukseen_haetut_avustukset: '#title': 'Övriga understöd som ansökts för samma ändamål' info_muut_samaan_tarkoitukseen_haettu: - '#text': "

Ange här endast de understöd som har ansökts från annanstans än Helsingfors stad, men beslut har ännu inte fattats.

\r\n\r\n
\r\n
\r\n
Ett jakande svar öppnar ytterligare en fråga
\r\n
\r\n
\r\n" + '#markup': "

Ange här endast de understöd som har ansökts från annanstans än Helsingfors stad, men beslut har ännu inte fattats.

\r\n\r\n
\r\n
\r\n
Ett jakande svar öppnar ytterligare en fråga
\r\n
\r\n
\r\n" olemme_hakeneet_avustuksia_muualta_kuin_helsingin_kaupungilta: '#title': 'Vi har ansökt om understöd från annanstans än Helsingfors stad.' '#options': @@ -120,7 +119,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' diff --git a/conf/cmi/language/sv/webform.webform.sotepe_yleis.yml b/conf/cmi/language/sv/webform.webform.sotepe_yleis.yml new file mode 100644 index 0000000000..e78fbdb049 --- /dev/null +++ b/conf/cmi/language/sv/webform.webform.sotepe_yleis.yml @@ -0,0 +1,297 @@ +title: 'Allmänt understöd inom social-, hälsovårds- och räddningssektorn' +elements: | + 1_hakijan_tiedot: + '#title': '1. Sökandens uppgifter' + '#prev_button_label': '< Tidigare' + '#next_button_label': 'Nästa' + yhteiso_jolle_haetaan_avustusta: + '#title': 'Samfund för vilket understödet ansöks' + prh_markup: + '#markup': '
De markerade uppgifterna har hämtats från Patent- och registerstyrelsens register (PRH) och det är endast möjligt att ändra uppgifterna i nättjänsten i fråga.
' + hakijan_tiedot: + '#title': Sökande + contact_person_email_section: + '#title': E-post + contact_markup: + '#markup': 'Ange här samfundets e-postadress som läses aktivt. Till e-postadressen skickas kontaktförfrågningar som är relaterade till ansökan om understöd, såsom begäranden om tilläggsutredning och komplettering' + email: + '#title': E-postadress + '#help': 'Ange en e-postadress dit meddelandena och begärandena relaterade till denna ansökan kommer att skickas och som läses aktivt.' + contact_person_section: + '#title': 'Kontaktperson för ansökan' + contact_person: + '#title': Kontaktperson + contact_person_phone_number: + '#title': Telefonnummer + osoite: + '#title': Adress + community_address: + '#title': Adress + '#help': 'Om du vill lägga till, ta bort eller ändra adressuppgifter, spara ansökan som ett utkast och gå till att behålla adressuppgifterna i dina egna uppgifter.' + '#community_address_select__title': 'Välj en adress' + tilinumero: + '#title': Kontonummer + bank_account: + '#title': Kontonummer + '#help': 'Om du vill lägga till, radera eller ändra kontonummerinformation, spara applikationen som ett utkast och gå till att behålla kontonummerinformationen i din egen data.' + '#account_number_select__title': 'Välj ett kontonummer' + '#account_number__title': '' + toiminnasta_vastaavat_henkilot: + '#title': 'Personer som ansvarar för verksamheten' + community_officials: + '#help': 'Om du vill lägga till, ta bort eller ändra personer, spara applikationen som ett utkast och gå till att underhålla personernas information i din egen data.' + '#title': 'Personer som ansvarar för verksamheten' + '#multiple__add_more_button_label': 'Lägg till en person' + '#multiple__item_label': person + '#community_officials_select__title': 'Välj motsvarande person' + '#role__title': Roll + '#email__title': E-post + '#phone__title': Telefonnummer + 2_avustustiedot: + '#title': '2. Uppgifter om understödet' + '#prev_button_label': 'Tidigare' + '#next_button_label': 'Nästa' + avustuksen_tiedot: + '#title': 'Uppgifter om understödet' + acting_year: + '#title': 'År för vilket jag ansöker om understöd' + avustuslajit: + '#title': 'Understödskatego­rier' + subventions: + '#title': Understöd + kayttotarkoitus: + '#title': 'Användningsända­mål' + compensation_purpose: + '#title': 'Vad kommer understödet att användas till?' + '#help': 'Beskriv den verksamhet som ska genomföras med hjälp av understödet och verksamhetens omfattning i korthet exempelvis på följande sätt:
Hur mycket eller ofta ordnar ni grupper, evenemang eller annan verksamhet under den understödda perioden? Hur många representanter för målgruppen kommer ni att nå enligt er uppskattning? Inom vilka områden i Helsingfors kommer verksamheten att ordnas? På vilka sätt samarbetar ni med andra aktörer i Helsingfors?' + '#counter_maximum_message': '%d/5000 tecken kvar' + who_benefits: + '#title': 'Who are the main beneficiaries of your activities?' + '#help': 'Beskriv vem som hör till er målgrupp och eventuellt också hur många av dem som hör till er målgrupp det finns i ert verksamhetsområde. I beskrivningen av målgruppen är det viktigt att det framgår vilka slags människor just ni önskar och kan bemöta, eller de situationer i vilka människor får den största nyttan av er verksamhet.' + changes_on_success: + '#title': 'What kind of changes will take place if you succeed?' + '#help': 'Er verksamhet kan ha flera mål. Beskriv och bedöm här de centrala förändringar som ni eftersträvar exempelvis i er målgrupps funktionsförmåga, vardag, människorelationer eller andra aspekter som anknyter till välfärd och hälsa eller delaktighet. Vilka slags förändringar kommer det alltså att ske om ni lyckas eller vilka slags fenomen förebygger er verksamhet?' + results_of_activities: + '#title': 'What are the benefits of the activities to be supported?' + '#help': 'Beskriv kort vilka effekter som uppnås genom verksamheten och på vilket sätt de uppstår. Du kan beskriva effekterna i den ordning de sker: vilka effekter uppstår först och vilka efter en längre tid. Koncentrera dig dock på verksamhetens omedelbara effekter.
Du kan även berätta vad som är speciellt med er verksamhet eller vilka (kvalitets)faktorer som bör beaktas särskilt för att de effekter som eftersträvas ska uppnås. Du kan även beskriva hur något samarbete ni har främjar uppnåendet av effekterna.' + muut_samaan_tarkoitukseen_myonnetyt_avustukset: + '#title': 'Övriga understöd som beviljats för samma ändamål' + info_muut_samaan_tarkoitukseen_myonnetty: + '#markup': "

Ange här endast de understöd som beviljats från annanstans än Helsingfors stad under det innevarande beskattningsåret eller de föregående två beskattningsåren.

\r\n\r\n
\r\n
\r\n
Ett jakande svar öppnar ytterligare en fråga
\r\n
\r\n
\r\n" + olemme_saaneet_muita_avustuksia: + '#title': 'Vi har fått andra understöd' + '#options': + 1: Ja + 0: Nej + myonnetty_avustus: + '#title': 'Bidrag beviljat' + '#multiple__no_items_message': 'Inga värden har angetts. Lägg till det nya beviljade bidraget nedan.' + '#multiple__add_more_button_label': 'Lägg till understöd som beviljats' + '#element': + issuer: + '#options': + 1: Stat + 3: EU + 4: Övrig + 5: Fundament + '#title': Bidragsgivare + issuer_name: + '#title': 'Emittentens namn' + '#help': 'Vilket organ har beviljat bidraget (t.ex. namnet på departementet)' + year: + '#title': År + '#pattern_error': 'Ange ett årtal' + amount: + '#title': 'Beviljat bidragsbelopp' + purpose: + '#title': 'Beskrivning av avsedd användning' + '#help': 'Ge en kort beskrivning, i vilket syfte har bidraget beviljats?' + '#counter_maximum_message': '%d/1000 tecken kvar' + muut_samaan_tarkoitukseen_haetut_avustukset: + '#title': 'Övriga understöd som ansökts för samma ändamål' + info_muut_samaan_tarkoitukseen_haettu: + '#markup': "

Ange här endast de understöd som har ansökts från annanstans än Helsingfors stad, men beslut har ännu inte fattats.

\r\n\r\n
\r\n
\r\n
Ett jakande svar öppnar ytterligare en fråga
\r\n
\r\n
\r\n" + olemme_hakeneet_avustuksia_muualta_kuin_helsingin_kaupungilta: + '#title': 'Vi har ansökt om understöd från annanstans än Helsingfors stad.' + '#options': + 1: Ja + 0: Nej + haettu_avustus_tieto: + '#title': 'Lägg till nytt understöd som ansökts' + '#multiple__no_items_message': 'Inga värden har angetts. Lägg till ett nytt ansökt bidrag nedan.' + '#multiple__add_more_button_label': 'Lägg till nytt understöd som ansökts' + '#element': + issuer: + '#options': + 1: Stat + 3: EU + 4: Övrig + 5: Fundament + '#title': Bidragsgivare + issuer_name: + '#title': 'Emittentens namn' + '#help': 'Vilket organ har beviljat bidraget (t.ex. namnet på departementet)' + year: + '#title': År + '#pattern_error': 'Ange ett årtal' + amount: + '#title': 'Beviljat bidragsbelopp' + purpose: + '#title': 'Beskrivning av avsedd användning' + '#help': 'Ge en kort beskrivning, i vilket syfte har bidraget beviljats?' + '#counter_maximum_message': '%d/1000 tecken kvar' + edellisen_avustuksen_kayttoselvitys: + '#title': 'Redovisning om det tidigare understödet' + compensation_boolean_info: + '#markup': "
\r\n
\r\n
Ett jakande svar öppnar ytterligare en fråga
\r\n
\r\n
\r\n" + compensation_boolean: + '#title': 'Redovisning om understödet som jag fick under det föregående året' + '#options': + - 'Jag har inte fått bidrag från Helsingfors stad för samma ändamål föregående år.' + - 'Jag fick ett bidrag från Helsingfors stad för samma ändamål förra året.' + markup: + '#markup': 'Ge en redovisning om understödet som fåtts från Helsingfors stad. Redovisningen görs om understödet som beviljats för den senaste avslutade räkenskapsperioden. Redovisning görs inte om den innevarande räkenskapsperioden. Redovisningen krävs för att få ett nytt understöd. Om en redovisning inte görs, kommer ett understöd inte att beviljas eller betalas ut. Det beviljade understödet kan återkrävas om användningen av det tidigare understödet inte har redogjorts för på ett tillfredsställande sätt.' + compensation_explanation: + '#title': 'Redovisning om användningen av understödet' + '#help': 'I redovisningen ska det kortfattat anges hur det beviljade understödet har använts. Understödstagaren ska ordna sin bokföring så att användningen av understödet kan följas där. Om samfundet till exempel har fått hyresunderstöd ska det av resultaträkningen i bokslutet framgå både intäkter och utgifter vad gäller understödet. Mer information om användningen av understödet kan också skrivas i en separat bilaga som kan läggas till och skickas som Annan bilaga.' + '#counter_maximum_message': '%d/5000 tecken kvar' + 3_yhteison_tiedot: + '#title': '3. Samfundets verksamhet' + '#prev_button_label': 'Tidigare' + '#next_button_label': 'Nästa' + business_info: + '#title': Verksamhets­beskrivning + business_purpose: + '#title': Verksamhets­beskrivning + '#help': 'Om du vill lägga till, ta bort eller ändra verksamhetsbeskrivningen, spara ansökan som ett utkast och gå till dina uppgifter för att redigera verksamhetsbeskrivningen.' + '#counter_maximum_message': '%d/500 tecken kvar' + community_practices_business: + '#title': 'Bedriver samfundet affärsverksamhet' + '#options': + 1: Ja + 0: Nej + ensimmainen_otsikko: + '#title': Medlemsavgifter + fee_person: + '#title': 'Medlemsavgift för personmedlemmar (€/år)' + fee_community: + '#title': 'Samfundsmedlem (€/år)' + jasenmaara: + '#title': 'Antal medlemmar' + jasenmaara_fieldset: + '#title': Medlemskap + '#help': 'Om gruppen har medlemmar, vänligen ange dem här.' + members_applicant_person_global: + '#title': 'Personmedlemmar sammanlagt' + '#help': 'Hur många personmedlemmar som har betalat medlemsavgiften har samfundet för närvarande?' + members_applicant_person_local: + '#title': 'Personmedlemmar från Helsingfors sammanlagt' + '#help': 'Hur många personmedlemmar från Helsingfors som har betalat medlemsavgiften har samfundet för närvarande?' + members_applicant_community_global: + '#title': Samfundsmedlemmar + '#help': 'Hur många samfundsmedlemmar som har betalat medlemsavgiften har samfundet för närvarande? Samfundsmedlemmar är andra än personmedlemmar, såsom föreningar, stiftelser, företag eller kommuner.' + members_applicant_community_local: + '#title': 'Samfundsmedlemmar från Helsingfors sammanlagt' + '#help': 'Hur många samfundsmedlemmar från Helsingfors som har betalat medlemsavgiften har samfundet för närvarande? Samfundsmedlemmar är andra än personmedlemmar, såsom föreningar, stiftelser, företag eller kommuner.' + lisatiedot_ja_liitteet: + '#title': '4. Ytterligare information och bilagor' + lisatietoja_hakemukseen_liittyen: + '#title': 'Ytterligare information för ansökan' + additional_information: + '#title': 'Ytterligare information' + '#help': 'Här kan du vid behov skriva ytterligare information eller andra motiveringar som rör ansökan.' + '#counter_maximum_message': '%d/5000 tecken kvar' + liitteet: + '#title': Bilagor + attachments_info: + '#markup': |- +

Alla bilagor som anges nedan måste lämnas in för behandling av ansökan om understöd. Ansökan om understöd kan avslås om bilagorna inte har lämnats in. Om någon av bilagorna saknas, meddela oss om det i punkten Ytterligare information om bilagor i ansökan.

+

Erforderliga bilagor

+

För behandling av ansökan om understöd behövs styrkta bilagor från den föregående räkenskapsperioden som samfundet har godkänt och undertecknat vid sitt möte samt bilagor för det verksamhetsår för vilket understödet ansöks. Bilagorna från den föregående räkenskapsperioden är: bokslut, verksamhetsberättelse, revisionsberättelse och protokoll från årsstämman. Bilagorna för det år för vilket understödet ansöks är: budget och verksamhetsplan.

+

Inlämning av flera bilagor i en fil

+

Om du vill kan du lämna in flera bilagor i en fil i punkten Bokslut eller budget. Ange i detta fall vid andra bilagor att ”Bilagan har lämnats in som en fil eller i samband med en annan ansökan”.

+

Bilagor som tidigare lämnats in till Helsingfors stad

+

Om de erforderliga bilagorna redan har lämnats in som bilaga till en annan ansökan om understöd till Helsingfors stad, behöver samma bilagor inte lämnas in igen. Samfundets fastställda bokslut, verksamhetsberättelse, verksamhetsplan och budget får inte vara olika i bilagor till de olika ansökningarna. Ange i detta fall vid de inlämnade bilagorna att ”Bilagan har lämnats in som en fil eller i samband med en annan ansökan”.

+ notification_attachments: + '#markup': "
\r\n
\r\n
Innehållet i bilagorna kan inte granskas i efterhand
\r\n\r\n
\r\n

Observera att du inte kan öppna bilagorna efter att du har bifogat dem blanketten. Du ser bara bilagans filnamn.

\r\n\r\n

Även om du inte kan granska innehållet i bilagorna i efterhand skickas bilagorna som bifogats blanketten med övriga uppgifter till personen som behandlar ansökan om understöd.

\r\n
\r\n
\r\n
\r\n" + yhteison_saannot: + '#title': 'Samfundets stadgar' + '#help': 'En ny sökande eller reglerna har ändrats.' + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + vahvistettu_tilinpaatos: + '#title': 'Fastställt bokslut (för den föregående avslutade räkenskapsperioden)' + '#help': "Bokslutet ska innehålla minst resultaträkningen och balansräkningen. Samfundet ska till denna punkt lägga till bokslutet som godkänts och undertecknats vid samfundets medlemsmöte. Samfundets räkenskapsperiod kan vara ett kalenderår eller en annan period. Vad gäller samfund anges det i deras egna stadgar vad samfundets räkenskapsperiod är." + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + vahvistettu_toimintakertomus: + '#title': 'Fastställd verksamhetsberättelse (för den föregående avslutade räkenskapsperioden)' + '#help': "Samfundet ska till denna punkt bifoga verksamhetsberättelsen som godkänts och undertecknats vid samfundets medlemsmöte. Om verksamhetsberättelsen ingår i bokslutet och du redan har bifogat den blanketten, behöver den inte bifogas separat. Ange i detta fall vid verksamhetsberättelsen att ”Bilagan har lämnats in som en fil eller i samband med en annan ansökan”." + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + vahvistettu_tilin_tai_toiminnantarkastuskertomus: + '#title': 'Fastställd revisionsberättelse (för det föregående avslutade räkenskapsåret)' + '#help': "Bifoga den undertecknade revisionsberättelsen för samfundets senaste avslutade räkenskapsperiod här. Om den undertecknade revisionsberättelsen ingår i samfundets bokslut och du redan bifogat den till blanketten i samband med bokslutet, ange ”Bilagan har lämnats in som en fil eller i samband med en annan ansökan” här." + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + vuosikokouksen_poytakirja: + '#title': 'Protokoll från årsstämman med det godkända bokslutet för den föregående räkenskapsperioden' + '#help': 'Bifoga protokollet från samfundets möte här, där bokslutet för den föregående avslutade räkenskapsperioden har godkänts och ansvarsfrihet beviljats. Samfundens bokslut fastställs alltid vid samfundets medlemsmöte. Om samfundet inte är skyldigt att ha ett årsmöte eller annat samfundsmöte där bokslutet bör godkännas och ansvarsfrihet beviljas, behöver denna bilaga inte lämnas in.' + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + toimintasuunnitelma: + '#title': 'Verksamhetsplan (för det år du ansöker om understödet)' + '#help': 'Bifoga verksamhetsplanen för hela för samfundet här.' + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + talousarvio: + '#title': 'Budget (för det år du ansöker om understödet)' + '#help': 'Budget (för det år du ansöker om understödet)' + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + extra_info: + '#title': 'Ytterligare information om bilagorna' + '#counter_maximum_message': '%d/5000 tecken kvar' + muu_liite: + '#title': 'Annan bilaga' + '#multiple__add_more_button_label': 'Lägg till en bilaga' + '#attachmentName__title': '' + '#fileStatus__title': '' + '#fileType__title': '' + '#integrationID__title': '' + '#isAttachmentNew__title': '' + actions: + '#submit__label': Skicka + '#draft__label': 'Spara som oavslutad' + '#wizard_prev__label': 'Tidigare' + '#wizard_next__label': 'Nästa' + '#preview_prev__label': 'Tidigare' + '#preview_next__label': 'För förhandsvisning' + '#delete__label': ' Radera oavslutat' +settings: + wizard_prev_button_label: Tidigare + wizard_next_button_label: Nästa + preview_label: '5. Bekräfta, förhandsgranska och skicka' + preview_title: 'Bekräfta, förhandsgranska och skicka' + wizard_confirmation_label: '6. Slutförd' diff --git a/conf/cmi/language/sv/webform.webform.taide_ja_kulttuuri_kehittamisavu.yml b/conf/cmi/language/sv/webform.webform.taide_ja_kulttuuri_kehittamisavu.yml index ecf8d4620c..62fdc5fe86 100644 --- a/conf/cmi/language/sv/webform.webform.taide_ja_kulttuuri_kehittamisavu.yml +++ b/conf/cmi/language/sv/webform.webform.taide_ja_kulttuuri_kehittamisavu.yml @@ -129,7 +129,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' diff --git a/conf/cmi/language/sv/webform.webform.taide_ja_kulttuuriavustukset_tai.yml b/conf/cmi/language/sv/webform.webform.taide_ja_kulttuuriavustukset_tai.yml index 51e4b97aae..7327233be4 100644 --- a/conf/cmi/language/sv/webform.webform.taide_ja_kulttuuriavustukset_tai.yml +++ b/conf/cmi/language/sv/webform.webform.taide_ja_kulttuuriavustukset_tai.yml @@ -94,7 +94,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' diff --git a/conf/cmi/language/sv/webform.webform.yleisavustushakemus.yml b/conf/cmi/language/sv/webform.webform.yleisavustushakemus.yml index 67f569e281..25fe61efc0 100644 --- a/conf/cmi/language/sv/webform.webform.yleisavustushakemus.yml +++ b/conf/cmi/language/sv/webform.webform.yleisavustushakemus.yml @@ -85,7 +85,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' @@ -119,7 +118,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' diff --git a/conf/cmi/language/sv/webform.webform.ymparistopalvelut_yleisavustus.yml b/conf/cmi/language/sv/webform.webform.ymparistopalvelut_yleisavustus.yml index 4832d6732a..c7fddcabfc 100644 --- a/conf/cmi/language/sv/webform.webform.ymparistopalvelut_yleisavustus.yml +++ b/conf/cmi/language/sv/webform.webform.ymparistopalvelut_yleisavustus.yml @@ -87,7 +87,6 @@ elements: | 3: EU 4: Övrig 5: Fundament - 6: STEA '#title': Bidragsgivare issuer_name: '#title': 'Emittentens namn' diff --git a/conf/cmi/metatag.settings.yml b/conf/cmi/metatag.settings.yml index 4a857d7011..f260a90c78 100644 --- a/conf/cmi/metatag.settings.yml +++ b/conf/cmi/metatag.settings.yml @@ -16,3 +16,4 @@ entity_type_groups: basic: basic open_graph: open_graph twitter_cards: twitter_cards +tag_trim_end: '|.,-:;/+&([{"''' diff --git a/conf/cmi/responsive_image.styles.image_gallery_1_1.yml b/conf/cmi/responsive_image.styles.image_gallery_1_1.yml new file mode 100644 index 0000000000..4dfddfc68d --- /dev/null +++ b/conf/cmi/responsive_image.styles.image_gallery_1_1.yml @@ -0,0 +1,38 @@ +uuid: c0fef26d-9cc5-4756-b247-5a9c3f7b4550 +langcode: en +status: true +dependencies: + config: + - image.style.1_1086w_1086h_LQ + - image.style.1_414w_414h + - image.style.1_543w_543h + - image.style.1_828w_828h_LQ + module: + - helfi_image_styles +_core: + default_config_hash: 29_zAX_g0m2zPiaRWVs5QHweA-Yhu0_yQcb9LewDXMM +id: image_gallery_1_1 +label: 'Image gallery 1:1' +image_style_mappings: + - + image_mapping_type: image_style + image_mapping: 1_414w_414h + breakpoint_id: helfi_image_styles.m + multiplier: 1x + - + image_mapping_type: image_style + image_mapping: 1_828w_828h_LQ + breakpoint_id: helfi_image_styles.m + multiplier: 2x + - + image_mapping_type: image_style + image_mapping: 1_543w_543h + breakpoint_id: helfi_image_styles.xs + multiplier: 1x + - + image_mapping_type: image_style + image_mapping: 1_1086w_1086h_LQ + breakpoint_id: helfi_image_styles.xs + multiplier: 2x +breakpoint_group: helfi_image_styles +fallback_image_style: 1_414w_414h diff --git a/conf/cmi/responsive_image.styles.image_gallery_2_3.yml b/conf/cmi/responsive_image.styles.image_gallery_2_3.yml new file mode 100644 index 0000000000..f5a90b0cac --- /dev/null +++ b/conf/cmi/responsive_image.styles.image_gallery_2_3.yml @@ -0,0 +1,50 @@ +uuid: 4da06bdc-4ddf-479d-bd7a-e7ccbcf93a7e +langcode: en +status: true +dependencies: + config: + - image.style.0.7_1086w_1630h_LQ + - image.style.0.7_352w_572h + - image.style.0.7_414w_621h + - image.style.0.7_543w_815h + - image.style.0.7_704w_1144h_LQ + - image.style.0.7_828w_1242h_LQ + module: + - helfi_image_styles +_core: + default_config_hash: FsfbGbQamEyCjnhveCelHwebu8SHFK8rfWmoeeh7jEc +id: image_gallery_2_3 +label: 'Image gallery 2:3' +image_style_mappings: + - + image_mapping_type: image_style + image_mapping: 0.7_414w_621h + breakpoint_id: helfi_image_styles.m + multiplier: 1x + - + image_mapping_type: image_style + image_mapping: 0.7_828w_1242h_LQ + breakpoint_id: helfi_image_styles.m + multiplier: 2x + - + image_mapping_type: image_style + image_mapping: 0.7_352w_572h + breakpoint_id: helfi_image_styles.s + multiplier: 1x + - + image_mapping_type: image_style + image_mapping: 0.7_704w_1144h_LQ + breakpoint_id: helfi_image_styles.s + multiplier: 2x + - + image_mapping_type: image_style + image_mapping: 0.7_543w_815h + breakpoint_id: helfi_image_styles.xs + multiplier: 1x + - + image_mapping_type: image_style + image_mapping: 0.7_1086w_1630h_LQ + breakpoint_id: helfi_image_styles.xs + multiplier: 2x +breakpoint_group: helfi_image_styles +fallback_image_style: 0.7_414w_621h diff --git a/conf/cmi/responsive_image.styles.image_gallery_3_2.yml b/conf/cmi/responsive_image.styles.image_gallery_3_2.yml new file mode 100644 index 0000000000..02858796ef --- /dev/null +++ b/conf/cmi/responsive_image.styles.image_gallery_3_2.yml @@ -0,0 +1,50 @@ +uuid: 0011a33c-b46a-4354-af09-3ea3e656a790 +langcode: en +status: true +dependencies: + config: + - image.style.1.5_1120w_746h_LQ + - image.style.1.5_378w_252h + - image.style.1.5_452w_301h + - image.style.1.5_560w_373h + - image.style.1.5_756w_504h_LQ + - image.style.1.5_904w_602h_LQ + module: + - helfi_image_styles +_core: + default_config_hash: l_qdU6nExbacBLGCv5ZQHXE54vA49nRWaLcmwRL479U +id: image_gallery_3_2 +label: 'Image gallery 3:2' +image_style_mappings: + - + image_mapping_type: image_style + image_mapping: 1.5_452w_301h + breakpoint_id: helfi_image_styles.m + multiplier: 1x + - + image_mapping_type: image_style + image_mapping: 1.5_904w_602h_LQ + breakpoint_id: helfi_image_styles.m + multiplier: 2x + - + image_mapping_type: image_style + image_mapping: 1.5_378w_252h + breakpoint_id: helfi_image_styles.s + multiplier: 1x + - + image_mapping_type: image_style + image_mapping: 1.5_756w_504h_LQ + breakpoint_id: helfi_image_styles.s + multiplier: 2x + - + image_mapping_type: image_style + image_mapping: 1.5_560w_373h + breakpoint_id: helfi_image_styles.xs + multiplier: 1x + - + image_mapping_type: image_style + image_mapping: 1.5_1120w_746h_LQ + breakpoint_id: helfi_image_styles.xs + multiplier: 2x +breakpoint_group: helfi_image_styles +fallback_image_style: 1.5_452w_301h diff --git a/conf/cmi/webform.settings.yml b/conf/cmi/webform.settings.yml index 5011ceaaaf..af11329b16 100644 --- a/conf/cmi/webform.settings.yml +++ b/conf/cmi/webform.settings.yml @@ -24,9 +24,9 @@ settings: default_form_disable_inline_errors: false default_form_required: false default_form_required_label: 'Indicates required field' - default_form_unsaved: false + default_form_unsaved: true default_form_disable_back: false - default_form_submit_back: false + default_form_submit_back: true default_form_details_toggle: true default_form_file_limit: '' default_wizard_prev_button_label: Previous diff --git a/conf/cmi/webform.webform.asukasosallisuus_pienavustushake.yml b/conf/cmi/webform.webform.asukasosallisuus_pienavustushake.yml index 2fbfa8523a..ad82299cb1 100644 --- a/conf/cmi/webform.webform.asukasosallisuus_pienavustushake.yml +++ b/conf/cmi/webform.webform.asukasosallisuus_pienavustushake.yml @@ -265,7 +265,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: @@ -354,7 +353,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: @@ -637,9 +635,9 @@ settings: form_prepopulate_source_entity: false form_prepopulate_source_entity_required: false form_prepopulate_source_entity_type: '' - form_unsaved: false + form_unsaved: true form_disable_back: false - form_submit_back: false + form_submit_back: true form_disable_autocomplete: false form_novalidate: false form_disable_inline_errors: false diff --git a/conf/cmi/webform.webform.asukasosallisuus_yleis_ja_toimin.yml b/conf/cmi/webform.webform.asukasosallisuus_yleis_ja_toimin.yml index 594b01da19..c6b1c01061 100644 --- a/conf/cmi/webform.webform.asukasosallisuus_yleis_ja_toimin.yml +++ b/conf/cmi/webform.webform.asukasosallisuus_yleis_ja_toimin.yml @@ -271,7 +271,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: @@ -360,7 +359,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: @@ -757,9 +755,9 @@ settings: form_prepopulate_source_entity: false form_prepopulate_source_entity_required: false form_prepopulate_source_entity_type: '' - form_unsaved: false + form_unsaved: true form_disable_back: false - form_submit_back: false + form_submit_back: true form_disable_autocomplete: false form_novalidate: false form_disable_inline_errors: false diff --git a/conf/cmi/webform.webform.grants_handler.yml b/conf/cmi/webform.webform.grants_handler.yml index 29def5ffc9..bed09391bb 100644 --- a/conf/cmi/webform.webform.grants_handler.yml +++ b/conf/cmi/webform.webform.grants_handler.yml @@ -67,9 +67,9 @@ settings: form_prepopulate_source_entity: false form_prepopulate_source_entity_required: false form_prepopulate_source_entity_type: '' - form_unsaved: false + form_unsaved: true form_disable_back: false - form_submit_back: false + form_submit_back: true form_disable_autocomplete: false form_novalidate: false form_disable_inline_errors: false diff --git a/conf/cmi/webform.webform.hyte_yleisavustus.yml b/conf/cmi/webform.webform.hyte_yleisavustus.yml index 75267ef5cd..2450bdf09a 100644 --- a/conf/cmi/webform.webform.hyte_yleisavustus.yml +++ b/conf/cmi/webform.webform.hyte_yleisavustus.yml @@ -309,7 +309,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: diff --git a/conf/cmi/webform.webform.elderly_sports_and_culture.yml b/conf/cmi/webform.webform.iakkaiden_kulttuuri_ja_liikunta.yml similarity index 71% rename from conf/cmi/webform.webform.elderly_sports_and_culture.yml rename to conf/cmi/webform.webform.iakkaiden_kulttuuri_ja_liikunta.yml index 727b1593c8..ca85e6f327 100644 --- a/conf/cmi/webform.webform.elderly_sports_and_culture.yml +++ b/conf/cmi/webform.webform.iakkaiden_kulttuuri_ja_liikunta.yml @@ -1,5 +1,5 @@ -uuid: 6b799d6a-d01b-4f56-9075-59e76476952c -langcode: en +uuid: d6a6681d-87e8-4a48-aa5a-cb1c12bd160f +langcode: fi status: open dependencies: module: @@ -15,7 +15,7 @@ third_party_settings: registered_community: registered_community applicationTypeTerms: 62: '62' - applicationTargetGroup: '22' + applicationTargetGroup: '75' applicationOpen: null applicationClose: null applicationActingYearsType: fixed @@ -35,9 +35,9 @@ close: null uid: 1 template: false archive: false -id: elderly_sports_and_culture -title: 'Kuva: Grant for elderly sports and culture' -description: '

Kulttuurin ja vapaa-ajan erillisavustushakemus: Ikääntyneiden liikkumisen ja kulttuuritoiminnan avustus

' +id: iakkaiden_kulttuuri_ja_liikunta +title: 'KUVA: avustushakemus iäkkäiden ihmisten liikkumisen ja kulttuuritoiminnan edistämiseksi' +description: '

KUVAERILLIS

' categories: - Kehityksessä elements: |- @@ -120,6 +120,124 @@ elements: |- applicant_type: '#type': hidden '#title': 'Hakijan tyyppi' + kulttuuri1_summa: + '#type': grants_webform_summation_field + '#title': Kulttuuri1-summa + '#collect_field': + subventions%%amount: subventions%%amount + applicant_type: 0 + application_number: 0 + status: 0 + hakijan_tiedot: 0 + email: 0 + contact_person: 0 + contact_person_phone_number: 0 + community_address: 0 + bank_account: 0 + community_officials: 0 + acting_year: 0 + compensation_purpose: 0 + olemme_saaneet_muita_avustuksia: 0 + myonnetty_avustus: 0 + olemme_hakeneet_avustuksia_muualta_kuin_helsingin_kaupungilta: 0 + haettu_avustus_tieto: 0 + hankesuunnitelma_radios: 0 + hankesuunnitelma_jatkohakemus: 0 + hankkeen_tarkoitus_tavoitteet: 0 + hankkeen_toimenpiteet_aikataulu: 0 + hankkeen_toimenpiteet_alkupvm: 0 + hankkeen_toimenpiteet_loppupvm: 0 + hankkeen_keskeisimmat_kumppanit: 0 + haun_painopisteet_liikkumis_kehitys: 0 + haun_painopisteet_digi_kehitys: 0 + haun_painopisteet_vertais_kehitys: 0 + haun_painopisteet_kulttuuri_kehitys: 0 + hankkeen_kohderyhmat_kenelle: 0 + hankkeen_kohderyhmat_erityisryhmat: 0 + hankkeen_kohderyhmat_tavoitus: 0 + hankkeen_kohderyhmat_konkretia: 0 + hankkeen_kohderyhmat_osallisuus: 0 + hankkeen_kohderyhmat_osaaminen: 0 + hankkeen_kohderyhmat_postinrot: 0 + hankkeen_kohderyhmat_miksi_alue: 0 + hankkeen_riskit_keskeisimmat: 0 + hankkeen_riskit_seuranta: 0 + hankkeen_riskit_vakiinnuttaminen: 0 + arviointi_toteuma: 0 + arviointi_muutokset_talous: 0 + arviointi_muutokset_toiminta: 0 + arviointi_muutokset_aikataulu: 0 + arviointi_haasteet: 0 + arviointi_saavutettavuus: 0 + arviointi_avustus_kaytto: 0 + tulot: 0 + talous_tulon_tyyppi: 0 + talous_menon_tyyppi: 0 + additional_information: 0 + extra_info: 0 + muu_liite: 0 + '#subvention_type': '47' + '#data_type': euro + '#form_item': hidden + kulttuuri2_summa: + '#type': grants_webform_summation_field + '#title': Kulttuuri2-summa + '#collect_field': + subventions%%amount: subventions%%amount + applicant_type: 0 + application_number: 0 + status: 0 + hakijan_tiedot: 0 + email: 0 + contact_person: 0 + contact_person_phone_number: 0 + community_address: 0 + bank_account: 0 + community_officials: 0 + acting_year: 0 + compensation_purpose: 0 + olemme_saaneet_muita_avustuksia: 0 + myonnetty_avustus: 0 + olemme_hakeneet_avustuksia_muualta_kuin_helsingin_kaupungilta: 0 + haettu_avustus_tieto: 0 + hankesuunnitelma_radios: 0 + hankesuunnitelma_jatkohakemus: 0 + hankkeen_tarkoitus_tavoitteet: 0 + hankkeen_toimenpiteet_aikataulu: 0 + hankkeen_toimenpiteet_alkupvm: 0 + hankkeen_toimenpiteet_loppupvm: 0 + hankkeen_keskeisimmat_kumppanit: 0 + haun_painopisteet_liikkumis_kehitys: 0 + haun_painopisteet_digi_kehitys: 0 + haun_painopisteet_vertais_kehitys: 0 + haun_painopisteet_kulttuuri_kehitys: 0 + hankkeen_kohderyhmat_kenelle: 0 + hankkeen_kohderyhmat_erityisryhmat: 0 + hankkeen_kohderyhmat_tavoitus: 0 + hankkeen_kohderyhmat_konkretia: 0 + hankkeen_kohderyhmat_osallisuus: 0 + hankkeen_kohderyhmat_osaaminen: 0 + hankkeen_kohderyhmat_postinrot: 0 + hankkeen_kohderyhmat_miksi_alue: 0 + hankkeen_riskit_keskeisimmat: 0 + hankkeen_riskit_seuranta: 0 + hankkeen_riskit_vakiinnuttaminen: 0 + arviointi_toteuma: 0 + arviointi_muutokset_talous: 0 + arviointi_muutokset_toiminta: 0 + arviointi_muutokset_aikataulu: 0 + arviointi_haasteet: 0 + arviointi_saavutettavuus: 0 + arviointi_avustus_kaytto: 0 + tulot: 0 + talous_tulon_tyyppi: 0 + talous_menon_tyyppi: 0 + additional_information: 0 + extra_info: 0 + muu_liite: 0 + '#subvention_type': '48' + '#data_type': euro + '#form_item': hidden 1_hakijan_tiedot: '#type': webform_wizard_page '#title': '1. Hakijan tiedot' @@ -296,6 +414,7 @@ elements: |- compensation_purpose: '#type': textarea '#title': 'Lyhyt kuvaus haettavan / haettavien avustusten käyttötarkoituksista' + '#help': 'Kerro mitä tarkoitusta varten avustusta haetaan, erittele tarvittaessa eri käyttökohteet. Kerro myös mitä avustuksella on tarkoitus saada aikaiseksi ja millaisia tavoitteita avustettavaan toimintaan liittyy.' '#maxlength': 5000 '#required': true '#counter_type': character @@ -351,7 +470,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: @@ -440,7 +558,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: @@ -485,16 +602,54 @@ elements: |- '#title': '3. Tarkemmat tiedot' tarkemmat_tiedot_section: '#type': webform_section - '#title': '3.0 Tarkemmat tiedot' + '#title': ' ' hankesuunnitelma_radios: '#type': radios + '#required': true '#title': 'Haetaanko nyt vuonna 2024 myönnetyn kaksivuotisen avustuksen 2. osaa?' - '#help': 'Vastaa tähän kysymykseen "kyllä" vain siinä tapauksessa, jos yhteisölläsi on jo käynnissä oleva, samasta avustuksesta rahoitettu hanke ja haet sille jatkorahoitusta.' - '#description_display': before + '#description': '

Vuoden 2024 avustuspäätökset:

' + '#description_display': after '#options': 1: Kyllä 0: Ei '#default_value': '0' + ensisijainen_taiteen_ala: + '#type': select + '#title': 'Ensisijainen taiteenala' + '#help': 'Valitse pudotusvalikosta toimintaa parhaiten kuvaava vaihtoehto.' + '#options': + 'Design ja käsityö': 'Design ja käsityö' + 'Elokuva, valokuva ja media': 'Elokuva, valokuva ja media' + Kaupunkikulttuuri: Kaupunkikulttuuri + Kirjallisuus: Kirjallisuus + 'Kuvataide ja sarjakuva': 'Kuvataide ja sarjakuva' + Monitaide: Monitaide + Museo: Museo + Musiikki: Musiikki + Muu: Muu + Sirkus: Sirkus + Tanssi: Tanssi + Teatteri: Teatteri + '#wrapper_attributes': + class: + - webform-element-help--wrapper-short + '#states': + visible: + - ':input[name="kulttuuri1_summa"]': + value: + greater: '0' + - or + - ':input[name="kulttuuri2_summa"]': + value: + greater: '0' + required: + - ':input[name="kulttuuri1_summa"]': + value: + greater: '0' + - or + - ':input[name="kulttuuri2_summa"]': + value: + greater: '0' hankesuunnitelma_section: '#type': webform_section '#title': '3.1 Hankesuunnitelma' @@ -505,34 +660,46 @@ elements: |- hankesuunnitelma_jatkohakemus: '#type': radios '#title': 'Onko haettava avustus käynnissä olevan hankkeen jatkohakemus?' - '#description_display': before + '#description': '

Vastaa tähän kysymykseen "kyllä" vain siinä tapauksessa, jos yhteisölläsi on jo käynnissä oleva, samasta avustuksesta rahoitettu hanke ja haet sille jatkorahoitusta.

' + '#description_display': after '#options': 1: Kyllä 0: Ei '#default_value': '0' + '#states': + visible: + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': + value: '0' hankkeen_tarkoitus_tavoitteet: '#type': textarea '#title': 'Hankkeen tarkoitus ja tavoitteet' '#maxlength': 2500 - '#required': true '#counter_type': character '#counter_maximum': 2500 '#counter_maximum_message': '%d/2500 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_toimenpiteet_aikataulu: '#type': textarea '#title': 'Mitkä ovat hankkeen konkreettiset toimenpiteet ja niiden toteutusaikataulu?' '#maxlength': 4000 - '#required': true '#counter_type': character '#counter_maximum': 4000 '#counter_maximum_message': '%d/4000 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_toimenpiteet_toteutus: '#type': fieldset @@ -542,35 +709,41 @@ elements: |- - grants-fieldset '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_toimenpiteet_alkupvm: '#type': date '#title': Alkupäivämäärä - '#required': true '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_toimenpiteet_loppupvm: '#type': date '#title': Loppupäivämäärä - '#required': true '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_keskeisimmat_kumppanit: '#type': textarea '#title': 'Nimeä hankkeen keskeisimmät yhteistyökumppanit ja heidän roolinsa hankkeessa' '#maxlength': 2500 - '#required': true '#counter_type': character '#counter_maximum': 2500 '#counter_maximum_message': '%d/2500 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': value: '0' haun_painopisteet_section: '#type': webform_section @@ -579,11 +752,13 @@ elements: |- visible: ':input[name="hankesuunnitelma_radios"]': value: '0' - ':input[name="hankesuunnitelma_jatkohakemus"]': - value: '0' haun_painopisteet_ohje: '#type': webform_markup - '#markup': 'Hankkeessa tulee toteuttaa yhtä tai useampaa painopistettä. HUOM! Valitse vain ne painopisteet, joita edistätte hankkeessa konkreettisella tavalla. Jos hanke ei toteuta jotakin painopistettä, jätä tekstikenttä tyhjäksi.' + '#markup': 'Mihin seuraavista iäkkäiden liikkumisen ja kulttuuritoiminnan edistämisen avustuksen painopisteistä hanke vastaa?

Hankkeessa tulee toteuttaa yhtä tai useampaa painopistettä. HUOM! Valitse vain ne painopisteet, joita edistätte hankkeessa konkreettisella tavalla. Jos hanke ei toteuta jotakin painopistettä, jätä tekstikenttä tyhjäksi.

' + '#states': + visible: + ':input[name="hankesuunnitelma_radios"]': + value: '0' haun_painopisteet_liikkumis_kehitys: '#type': textarea '#title': 'Kehitetäänkö hankkeessa liikkumismahdollisuuksia tai taide- ja kulttuuritoimintaa lähiympäristössä / alueellisesti? Miten?' @@ -593,44 +768,43 @@ elements: |- '#counter_maximum_message': '%d/1250 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': value: '0' - '#required': true haun_painopisteet_digi_kehitys: '#type': textarea '#title': 'Kehitetäänkö hankkeessa digitaalisesti / etänä toteutettavia kulttuuritoimintoja tai liikkumiseen aktivoivaa toimintaa? Miten?' '#maxlength': 1250 - '#required': true '#counter_type': character '#counter_maximum': 1250 '#counter_maximum_message': '%d/1250 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': value: '0' haun_painopisteet_vertais_kehitys: '#type': textarea '#title': 'Kehitetäänkö hankkeessa vapaaehtois- / vertaistoimintaa? Miten?' '#maxlength': 1250 - '#required': true '#counter_type': character '#counter_maximum': 1250 '#counter_maximum_message': '%d/1250 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': value: '0' haun_painopisteet_kulttuuri_kehitys: '#type': textarea '#title': 'Kehitetäänkö hankkeessa taide- ja kulttuuritoimijoiden osaamista tai luodaanko uusia työtapoja / rakenteita? Miten?' '#maxlength': 1250 - '#required': true '#counter_type': character '#counter_maximum': 1250 '#counter_maximum_message': '%d/1250 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="kulttuuri1_summa"]': + value: + greater: '0' + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_kohderyhmat_section: '#type': webform_section @@ -639,84 +813,92 @@ elements: |- visible: ':input[name="hankesuunnitelma_radios"]': value: '0' - ':input[name="hankesuunnitelma_jatkohakemus"]': - value: '0' hankkeen_kohderyhmat_kenelle: '#type': textarea '#title': 'Kenelle hankkeen toiminta on pääasiallisesti suunnattu?' '#maxlength': 1250 - '#required': true '#counter_type': character '#counter_maximum': 1250 '#counter_maximum_message': '%d/1250 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_kohderyhmat_erityisryhmat: '#type': textarea - '#title': 'Kohdennetaanko hankkeessa toimintaa jollekin erityisryhmälle?' + '#title': 'Kohdennetaanko hankkeessa toimintaa jollekin erityisryhmälle? Mille erityisryhmälle? Jos ei toteuteta, niin jätetään tyhjäksi.' + '#description_display': after '#maxlength': 1250 - '#required': true '#counter_type': character '#counter_maximum': 1250 '#counter_maximum_message': '%d/1250 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_kohderyhmat_tavoitus: '#type': textarea '#title': 'Kuinka hankkeen kohderyhmät aiotaan tavoittaa?' '#maxlength': 1250 - '#required': true '#counter_type': character '#counter_maximum': 1250 '#counter_maximum_message': '%d/1250 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_kohderyhmat_konkretia: '#type': textarea '#title': 'Miten hankkeessa edistetään konkreettisin toimenpitein valitun kohderyhmän toimintakykyä ja hyvinvointia?' '#maxlength': 1250 - '#required': true '#counter_type': character '#counter_maximum': 1250 '#counter_maximum_message': '%d/1250 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_kohderyhmat_osallisuus: '#type': textarea '#title': 'Millä tavoin hankkeessa edistetään osallisuutta? Mikä ikäihmisten rooli hankkeessa on?' '#maxlength': 1250 - '#required': true '#counter_type': character '#counter_maximum': 1250 '#counter_maximum_message': '%d/1250 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_kohderyhmat_osaaminen: '#type': textarea '#title': 'Millaista osaamista kyseisen kohderyhmän/-ryhmien kanssa työskentelystä hanketoimijoilla on ennestään?' '#maxlength': 1250 - '#required': true '#counter_type': character '#counter_maximum': 1250 '#counter_maximum_message': '%d/1250 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_kohderyhmat_postinrot: '#type': textfield - '#title': 'Millä postinumeroalueella tai -alueilla Helsingissä hanke toteutetaan?' - '#required': true + '#title': 'Millä postinumeroalueella tai -alueilla Helsingissä hanke toteutetaan? Kirjaa kenttään enintään kolme (3) postinumeroaluetta ja erottele ne toisistaan pilkulla (,)' + '#description_display': after '#autocomplete': 'off' '#attributes': class: @@ -724,19 +906,24 @@ elements: |- '#size': 32 '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_kohderyhmat_miksi_alue: '#type': textarea '#title': 'Miksi juuri kyseinen alue / alueet on valittu?' '#maxlength': 1250 - '#required': true '#counter_type': character '#counter_maximum': 1250 '#counter_maximum_message': '%d/1250 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_riskit_section: '#type': webform_section @@ -745,52 +932,160 @@ elements: |- visible: ':input[name="hankesuunnitelma_radios"]': value: '0' - ':input[name="hankesuunnitelma_jatkohakemus"]': - value: '0' hankkeen_riskit_keskeisimmat: '#type': textarea '#title': 'Mitkä ovat hankkeen toteuttamisen näkökulmasta keskeisimmät riskit?' '#maxlength': 2500 - '#required': true '#counter_type': character '#counter_maximum': 2500 - '#counter_maximum_message': '%d/1250 merkkiä jäljellä' + '#counter_maximum_message': '%d/2500 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_riskit_seuranta: '#type': textarea '#title': 'Miten hankkeessa aiotaan toteuttaa seurantaa ja arviointia?' '#maxlength': 2500 - '#required': true '#counter_type': character '#counter_maximum': 2500 - '#counter_maximum_message': '%d/1250 merkkiä jäljellä' + '#counter_maximum_message': '%d/2500 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': + value: '0' + required: + ':input[name="hankesuunnitelma_radios"]': value: '0' hankkeen_riskit_vakiinnuttaminen: '#type': textarea - '#title': 'Onko hankkeen suunniteltu toiminta aikomus vakiinnuttaa osaksi hakijan/jonkun muun toimijan perustoimintaa hankkeen jälkeen?' - '#help': 'Jos kyllä, niin kuvaa tekstikenttään kuinka vakiinnuttaminen aiotaan tehdä, muuten jätä tyhjäksi.' + '#title': 'Onko hankkeen suunniteltu toiminta aikomus vakiinnuttaa osaksi hakijan/jonkun muun toimijan perustoimintaa hankkeen jälkeen? Jos kyllä, niin kuvaa tekstikenttään kuinka vakiinnuttaminen aiotaan tehdä, muuten jätä tyhjäksi.' '#maxlength': 2500 - '#required': true '#counter_type': character '#counter_maximum': 2500 - '#counter_maximum_message': '%d/1250 merkkiä jäljellä' + '#counter_maximum_message': '%d/2500 merkkiä jäljellä' '#states': visible: - ':input[name="hankesuunnitelma_jatkohakemus"]': + ':input[name="hankesuunnitelma_radios"]': value: '0' - unknown_for_now: + hankkeen_valiarviointi_section: '#type': webform_section - '#title': '3.5 puuttuva määritys' + '#title': '3.5 2-vuotisten hankkeiden väliarviointi' '#states': visible: ':input[name="hankesuunnitelma_radios"]': value: '1' + arviointi_markup: + '#type': webform_markup + '#markup': 'Arvioi tässä osiossa hankkeen tähänastista toimintaa seuraavien kysymysten avulla. Avustuksen 2. osaa hakevien tulee liittää hakemukselle Muu liite-kohtaan niin ikään kustannuspaikkaraportti ajanjaksolta 1.6.-31.12.2024' + '#states': + visible: + ':input[name="hankesuunnitelma_radios"]': + value: '1' + arviointi_toteuma: + '#type': textarea + '#title': 'Onko hanke edennyt suunnitelman mukaisesti? Arvioikaa hankkeen toteumaa tähän asti asteikolla 1-100% ja perustelkaa vastauksenne.' + '#description': 'Onko hankkeessa tapahtunut merkittäviä muutoksia?' + '#description_display': after + '#maxlength': 1250 + '#counter_type': character + '#counter_maximum': 1250 + '#counter_maximum_message': '%d/1250 merkkiä jäljellä' + '#states': + visible: + ':input[name="hankesuunnitelma_radios"]': + value: '1' + required: + ':input[name="hankesuunnitelma_radios"]': + value: '1' + arviointi_muutokset_talous: + '#type': textarea + '#title': 'Talouteen liittyen; mitä?' + '#maxlength': 1250 + '#counter_type': character + '#counter_maximum': 1250 + '#counter_maximum_message': '%d/1250 merkkiä jäljellä' + '#states': + visible: + ':input[name="hankesuunnitelma_radios"]': + value: '1' + required: + ':input[name="hankesuunnitelma_radios"]': + value: '1' + arviointi_muutokset_toiminta: + '#type': textarea + '#title': 'Toimintaan liittyen; mitä?' + '#maxlength': 1250 + '#counter_type': character + '#counter_maximum': 1250 + '#counter_maximum_message': '%d/1250 merkkiä jäljellä' + '#states': + visible: + ':input[name="hankesuunnitelma_radios"]': + value: '1' + required: + ':input[name="hankesuunnitelma_radios"]': + value: '1' + arviointi_muutokset_aikataulu: + '#type': textarea + '#title': 'Aikatauluun liittyen; mitä?' + '#maxlength': 1250 + '#counter_type': character + '#counter_maximum': 1250 + '#counter_maximum_message': '%d/1250 merkkiä jäljellä' + '#states': + visible: + ':input[name="hankesuunnitelma_radios"]': + value: '1' + required: + ':input[name="hankesuunnitelma_radios"]': + value: '1' + arviointi_haasteet: + '#type': textarea + '#title': 'Onko hanke kohdannut toimintaan vaikuttaneita haasteita? Jos, niin millaisia?' + '#maxlength': 1250 + '#counter_type': character + '#counter_maximum': 1250 + '#counter_maximum_message': '%d/1250 merkkiä jäljellä' + '#states': + visible: + ':input[name="hankesuunnitelma_radios"]': + value: '1' + required: + ':input[name="hankesuunnitelma_radios"]': + value: '1' + arviointi_saavutettavuus: + '#type': textarea + '#title': 'Miten toiminta on tavoittanut osallistujia suhteessa tavoitteisiin?' + '#maxlength': 1250 + '#counter_type': character + '#counter_maximum': 1250 + '#counter_maximum_message': '%d/1250 merkkiä jäljellä' + '#states': + visible: + ':input[name="hankesuunnitelma_radios"]': + value: '1' + required: + ':input[name="hankesuunnitelma_radios"]': + value: '1' + arviointi_avustus_kaytto: + '#type': textarea + '#help': 'Avustusehdot, kohta 10e: "Myönnetty avustus on palautettava Helsingin kaupungille, jos avustusta ei ole käytetty sinä aikana, jona se on avustuspäätöksen mukaan tullut käyttää.' + '#title': 'Tuleeko ensimmäiselle hankekaudelle myönnetty avustus käytettyä näillä näkymin määräaikaan (31.5.2025) mennessä? Jos ei, niin avatkaa tähän johtaneita syitä.' + '#maxlength': 1250 + '#counter_type': character + '#counter_maximum': 1250 + '#counter_maximum_message': '%d/1250 merkkiä jäljellä' + '#states': + visible: + ':input[name="hankesuunnitelma_radios"]': + value: '1' + required: + ':input[name="hankesuunnitelma_radios"]': + value: '1' 4_talousarvio: '#type': webform_wizard_page '#title': '4. Talousarvio' @@ -1112,12 +1407,12 @@ access: handlers: grants_handler: id: grants_handler - handler_id: grants_handler + handler_id: null label: 'Grants Handler' notes: '' status: true conditions: { } - weight: 0 + weight: null settings: debug: false variants: { } diff --git a/conf/cmi/webform.webform.kasvatus_ja_koulutus_toiminta_av.yml b/conf/cmi/webform.webform.kasvatus_ja_koulutus_toiminta_av.yml index 8ba573d9b5..4f44ff90a9 100644 --- a/conf/cmi/webform.webform.kasvatus_ja_koulutus_toiminta_av.yml +++ b/conf/cmi/webform.webform.kasvatus_ja_koulutus_toiminta_av.yml @@ -313,7 +313,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: diff --git a/conf/cmi/webform.webform.kasvatus_ja_koulutus_yleisavustu.yml b/conf/cmi/webform.webform.kasvatus_ja_koulutus_yleisavustu.yml index e9992f05fc..c0ff3ce26c 100644 --- a/conf/cmi/webform.webform.kasvatus_ja_koulutus_yleisavustu.yml +++ b/conf/cmi/webform.webform.kasvatus_ja_koulutus_yleisavustu.yml @@ -319,7 +319,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: diff --git a/conf/cmi/webform.webform.kaupunginkanslia_tyollisyysavust.yml b/conf/cmi/webform.webform.kaupunginkanslia_tyollisyysavust.yml index cb1c7ccd4e..1070f3f136 100644 --- a/conf/cmi/webform.webform.kaupunginkanslia_tyollisyysavust.yml +++ b/conf/cmi/webform.webform.kaupunginkanslia_tyollisyysavust.yml @@ -318,7 +318,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: @@ -407,7 +406,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: diff --git a/conf/cmi/webform.webform.kuva_projekti.yml b/conf/cmi/webform.webform.kuva_projekti.yml index b72a931f4b..c68ba11f3c 100644 --- a/conf/cmi/webform.webform.kuva_projekti.yml +++ b/conf/cmi/webform.webform.kuva_projekti.yml @@ -385,7 +385,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: diff --git a/conf/cmi/webform.webform.kuva_toiminta.yml b/conf/cmi/webform.webform.kuva_toiminta.yml index 8dd86f607e..b5978324ff 100644 --- a/conf/cmi/webform.webform.kuva_toiminta.yml +++ b/conf/cmi/webform.webform.kuva_toiminta.yml @@ -440,7 +440,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: diff --git a/conf/cmi/webform.webform.liikunta_laitosavustushakemus.yml b/conf/cmi/webform.webform.liikunta_laitosavustushakemus.yml index 7ee910e8df..219c12af33 100644 --- a/conf/cmi/webform.webform.liikunta_laitosavustushakemus.yml +++ b/conf/cmi/webform.webform.liikunta_laitosavustushakemus.yml @@ -322,7 +322,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: @@ -411,7 +410,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: diff --git a/conf/cmi/webform.webform.liikunta_tapahtuma.yml b/conf/cmi/webform.webform.liikunta_tapahtuma.yml index 537f2c5544..e108b662d1 100644 --- a/conf/cmi/webform.webform.liikunta_tapahtuma.yml +++ b/conf/cmi/webform.webform.liikunta_tapahtuma.yml @@ -618,9 +618,9 @@ settings: form_prepopulate_source_entity: false form_prepopulate_source_entity_required: false form_prepopulate_source_entity_type: '' - form_unsaved: false + form_unsaved: true form_disable_back: false - form_submit_back: false + form_submit_back: true form_disable_autocomplete: false form_novalidate: false form_disable_inline_errors: false diff --git a/conf/cmi/webform.webform.liikunta_toiminta_ja_tilankaytto.yml b/conf/cmi/webform.webform.liikunta_toiminta_ja_tilankaytto.yml index 31e6a61256..e4985ba16a 100644 --- a/conf/cmi/webform.webform.liikunta_toiminta_ja_tilankaytto.yml +++ b/conf/cmi/webform.webform.liikunta_toiminta_ja_tilankaytto.yml @@ -370,7 +370,7 @@ elements: |- compensation_explanation: '#type': textarea '#title': 'Selvitys avustuksen käytöstä' - '#help': 'Käyttöselvityksessä tulee kuvata lyhyesti, miten myönnetty avustus on käytetty. Avustuksen saajan on järjestettävä kirjanpitonsa niin, että avustuksen käyttöä voidaan sieltä seurata. Esimerkiksi jos yhteisö on saanut vuokra-avustusta, tilinpäätöksen tuloslaskelmasta tulee käydä ilmi avustuksen toteutuminen sekä tuloissa että menoissa. Lisää tietoja avustuksen käytöstä voi myös kirjoittaa erilliseen liitteeseen, jonka voi palauttaa Käyttöselvitys-liite kohdasta.' + '#help': '

Käyttöselvityksessä tulee kuvata lyhyesti, miten myönnetty avustus on käytetty. Avustuksen saajan on järjestettävä kirjanpitonsa niin, että avustuksen käyttöä voidaan sieltä seurata. Lisää tietoja avustuksen käytöstä voi myös kirjoittaa erilliseen liitteeseen, jonka voi palauttaa Käyttöselvitys-liite kohdasta.

' '#maxlength': 5000 '#counter_type': character '#counter_maximum': 5000 @@ -452,7 +452,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: @@ -497,8 +496,7 @@ elements: |- '#title': Tilankäyttöavustus maksetut_vuokrat_info: '#type': webform_markup - '#markup': | -

Yhteenveto seuran/yhdistyksen maksamista säännöllisten harjoitusvuorojen vuokrista, muiden kuin liikuntapalvelun omien tilojen osalta, edellisen kalenterivuoden 1.1. - 31.12. ajalta. Liikuntatiloista maksetut vuokrat -kohta on pakollinen täyttää, mikäli haet tilankäyttöavustusta.

+ '#markup': '

Yhteenveto seuran/yhdistyksen maksamista toteutuneista säännöllisten harjoitusvuorojen vuokrista, muiden kuin liikuntapalvelun omien tilojen osalta. Ilmoita toteutuneet vuokrat ja tuntimäärä edellisen kalenterivuoden 1.1. - 31.12. ajalta tilankäyttöliitteen mukaisesti. Liikuntatiloista maksetut vuokrat -kohta on pakollinen täyttää, mikäli haet tilankäyttöavustusta.

' liikuntatiloista_maksetut_vuokrat_fieldset: '#type': fieldset '#title': 'Liikuntatiloista maksetut vuokrat' @@ -539,7 +537,8 @@ elements: |- - webform--small seuraavalle_vuodelle_suunniteltu_muutos_tilojen_kaytossa_tunnit_: '#type': textfield - '#title': 'Seuraavalle vuodelle suunniteltu muutos tilojen käytössä +/- tunnit ja syy' + '#title': 'Seuraavalle vuodelle suunniteltu merkittävä muutos tilojen käytössä +/- tunnit ja vuokrasumma sekä syy muutokseen.' + '#help': '

Tilankäyttöavustuksen määrässä voidaan harkinnanvaraisesti huomioida hakuvuotta koskevat merkittävät muutokset seuran liikuntatilojen käytössä. Merkittäviksi muutoksiksi katsotaan: seurojen yhteenliittyminen, jaoston tai jaostojen liittyminen seuraan tai irtautuminen seurasta, seuran vuokraama tai omistama uusi liikuntatila (kyseisen tilan vuokrasopimus tulee liittää hakemukseen) tai seuran hallinnoimasta tai omistamasta liikuntatilasta luopuminen.

' '#states': required: ':input[name="tilankayttosumma"]': @@ -816,10 +815,10 @@ elements: |- lajijaostot_helsinkilaisille_aktiiviharrastajille: '#type': webform_section '#title': 'Lajijaostot helsinkiläisille aktiiviharrastajille' + '#help': '

Älä ilmoita harjoitustunnit-kohdassa yksittäisten harrastajien toteutuneita liikuntasuoritteita tunteina, vaan ikäryhmään kuuluville helsinkiläisille järjestetyt toteutuneet harjoitustunnit.

Mikäli ikäryhmän todellinen harjoitustuntimäärä ei ole selvitettävissä (esim. paljon sekaryhmiä), voit laskea kokonaistuntimäärästä kyseisen ikäryhmän osuuden perustuen ikäryhmän helsinkiläisten aktiiviharrastajien määrän osuuteen helsinkiläisten aktiiviharrastajien kokonaismäärästä. Esim. Jaoston kokonaistuntimäärä (kaikki sekaryhmiä) on 100 tuntia, jossa liikkuu aktiivisesti 10 aikuista ja 20 alle 20-vuotiasta: aikuisten tuntimäärä 33 tuntia ja alle 20-vuotiaiden tuntimäärä 67 tuntia. Ensisijaisesti tulee kuitenkin käyttää ikäryhmän osalta todellista toteutunutta tuntimäärää.

' lajijaostot_info: '#type': webform_markup - '#markup': | -

Seuran/yhdistyksen järjestämä säännöllinen ohjattu liikuntatoiminta lajeittain. Ilmoita tähän lajeittain edellisen vuoden helsinkiläisten aktiiviharrastajien määrät sekä heidän toteutuneet harjoitustunnit.

+ '#markup': '

Seuran/yhdistyksen järjestämä säännöllinen ohjattu liikuntatoiminta lajeittain. Ilmoita tähän lajeittain edellisen vuoden helsinkiläisten aktiiviharrastajien määrät sekä heidän toteutuneet harjoitustunnit ikäryhmittäin.

' club_section: '#type': club_section_composite '#title': '' diff --git a/conf/cmi/webform.webform.nuorisotoiminta_projektiavustush.yml b/conf/cmi/webform.webform.nuorisotoiminta_projektiavustush.yml index 502b597395..063b7b2304 100644 --- a/conf/cmi/webform.webform.nuorisotoiminta_projektiavustush.yml +++ b/conf/cmi/webform.webform.nuorisotoiminta_projektiavustush.yml @@ -342,7 +342,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: @@ -429,7 +428,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: diff --git a/conf/cmi/webform.webform.nuortoimpalkka.yml b/conf/cmi/webform.webform.nuortoimpalkka.yml index df748255a8..345e7e1638 100644 --- a/conf/cmi/webform.webform.nuortoimpalkka.yml +++ b/conf/cmi/webform.webform.nuortoimpalkka.yml @@ -367,7 +367,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: @@ -456,7 +455,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: diff --git a/conf/cmi/webform.webform.performance_test_webform.yml b/conf/cmi/webform.webform.performance_test_webform.yml index 97e84dce4f..a64de203bb 100644 --- a/conf/cmi/webform.webform.performance_test_webform.yml +++ b/conf/cmi/webform.webform.performance_test_webform.yml @@ -125,7 +125,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: @@ -214,7 +213,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: diff --git a/conf/cmi/webform.webform.sotepe_yleis.yml b/conf/cmi/webform.webform.sotepe_yleis.yml new file mode 100644 index 0000000000..bdf09319ae --- /dev/null +++ b/conf/cmi/webform.webform.sotepe_yleis.yml @@ -0,0 +1,907 @@ +uuid: a8d4d2d7-30bf-4091-a86f-978b99358957 +langcode: fi +status: open +dependencies: + module: + - grants_handler + - grants_metadata +third_party_settings: + grants_metadata: + applicationTypeSelect: '72' + applicationType: SOTEPEYLEIS + applicationTypeID: '72' + applicationIndustry: KANSLIA + applicantTypes: + registered_community: registered_community + applicationTypeTerms: + 49: '49' + applicationTargetGroup: '30' + applicationOpen: '2022-10-03T11:08:26' + applicationClose: '2029-07-30T11:19:00' + applicationActingYearsType: next_x_years + applicationActingYears: { } + applicationActingYearsNextCount: '1' + applicationContinuous: 0 + disableCopying: 0 + status: development + parent: d8472e68-d6bd-4de2-a409-f0a177bf9e94 + avus2BreakingChange: 0 +weight: 0 +open: null +close: null +uid: 1 +template: false +archive: false +id: sotepe_yleis +title: 'Sosiaali-, terveys- ja pelastustoimen yleisavustus' +description: '

SOTEPEYLEIS

' +categories: + - Kehityksessä +elements: |- + applicant_type: + '#type': hidden + '#title': 'Applicant type' + avustukset_summa: + '#type': grants_webform_summation_field + '#title': 'Avustukset summa' + '#title_display': none + '#description_display': invisible + '#collect_field': + subventions%%amount: subventions%%amount + application_number: 0 + status: 0 + hakijan_tiedot: 0 + email: 0 + contact_person: 0 + contact_person_phone_number: 0 + community_address: 0 + bank_account: 0 + community_officials: 0 + acting_year: 0 + subventions%%subventionTypeTitle: 0 + subventions%%subventionType: 0 + compensation_purpose: 0 + olemme_saaneet_muita_avustuksia: 0 + myonnetty_avustus: 0 + benefits_loans: 0 + benefits_premises: 0 + compensation_boolean: 0 + compensation_explanation: 0 + business_purpose: 0 + community_practices_business: 0 + fee_person: 0 + fee_community: 0 + members_applicant_person_local: 0 + members_applicant_person_global: 0 + members_applicant_community_local: 0 + members_applicant_community_global: 0 + additional_information: 0 + yhteison_saannot: 0 + vahvistettu_tilinpaatos: 0 + vahvistettu_toimintakertomus: 0 + vahvistettu_tilin_tai_toiminnantarkastuskertomus: 0 + vuosikokouksen_poytakirja: 0 + toimintasuunnitelma: 0 + talousarvio: 0 + extra_info: 0 + muu_liite: 0 + '#data_type': euro + '#form_item': hidden + 1_hakijan_tiedot: + '#type': webform_wizard_page + '#title': '1. Hakijan tiedot' + '#prev_button_label': 'Edellinen' + '#next_button_label': 'Seuraava' + application_number: + '#type': hidden + '#title': Hakemusnumero + '#disabled': true + status: + '#type': hidden + '#title': 'Hakemuksen tila' + '#readonly': true + yhteiso_jolle_haetaan_avustusta: + '#type': webform_section + '#title': 'Yhteisö, jolle haetaan avustusta' + '#attributes': + class: + - grants-profile--imported-section + prh_markup: + '#type': webform_markup + '#markup': '
Tiedot on haettu Patentti- ja rekisterihallinnon rekisteristä (PRH), eikä niitä voi tämän takia muokata.
' + hakijan_tiedot: + '#type': applicant_info + '#title': Hakija + contact_person_email_section: + '#type': webform_section + '#title': Sähköposti + contact_markup: + '#type': webform_markup + '#markup': 'Ilmoita tässä sellainen yhteisön sähköpostiosoite, jota luetaan aktiivisesti. Sähköpostiin lähetetään avustushakemukseen liittyviä yhteydenottoja esim. lisäselvitys- ja täydennyspyyntöjä.' + email: + '#type': email + '#title': Sähköpostiosoite + '#required': true + '#autocomplete': 'off' + '#pattern': '(?:[a-zA-Z0-9!#$%&''*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&''*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-zA-Z0-9-]*[a-zA-Z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])' + '#size': 63 + '#help': 'Ilmoita sähköpostiosoite, johon tähän hakemukseen liittyvät viestit sekä herätteet osoitetaan ja jota luetaan aktiivisesti' + contact_person_section: + '#type': webform_section + '#title': 'Hakemuksen yhteyshenkilö' + contact_person: + '#type': textfield + '#title': Yhteyshenkilö + '#attributes': + class: + - webform--large + '#autocomplete': 'off' + '#required': true + '#size': 63 + contact_person_phone_number: + '#type': textfield + '#title': Puhelinnumero + '#attributes': + class: + - webform--medium + '#required': true + '#autocomplete': 'off' + '#size': 32 + osoite: + '#type': webform_section + '#title': Osoite + '#states': + visible: + ':input[name="applicant_type"]': + value: registered_community + community_address: + '#type': community_address_composite + '#title': 'Yhteisön osoite' + '#help': 'Jos haluat lisätä, poistaa tai muuttaa osoitetietoa tallenna hakemus luonnokseksi ja siirry ylläpitämään osoitetietoa omiin tietoihin.' + '#attributes': + class: + - webform--large + '#required': true + '#states': + visible: + ':input[name="applicant_type"]': + value: registered_community + tilinumero: + '#type': webform_section + '#title': Tilinumero + bank_account: + '#type': bank_account_composite + '#title': Tilinumero + '#help': 'Jos haluat lisätä, poistaa tai muuttaa tilinumerotietoa tallenna hakemus luonnokseksi ja siirry ylläpitämään tilinumerotietoa omiin tietoihin.' + '#attributes': + class: + - webform--medium + '#required': true + toiminnasta_vastaavat_henkilot: + '#type': webform_section + '#title': 'Toiminnasta vastaavat henkilöt' + '#states': + visible: + ':input[name="applicant_type"]': + '!value': private_person + community_officials: + '#type': community_officials_composite + '#help': 'Jos haluat lisätä, poistaa tai muuttaa henkilöitä tallenna hakemus luonnokseksi ja siirry ylläpitämään henkilöiden tietoja omiin tietoihin.' + '#title': 'Valitse toiminnasta vastaavat henkilöt' + '#multiple': true + '#multiple__item_label': henkilö + '#multiple__min_items': 1 + '#multiple__empty_items': 0 + '#multiple__sorting': false + '#multiple__add': false + '#multiple__add_more_input': false + '#multiple__add_more_button_label': 'Lisää henkilö' + '#wrapper_attributes': + class: + - community_officials_wrapper + '#attributes': + class: + - webform--large + 2_avustustiedot: + '#type': webform_wizard_page + '#title': '2. Avustustiedot' + '#prev_button_label': 'Edellinen' + '#next_button_label': 'Seuraava' + avustuksen_tiedot: + '#type': webform_section + '#title': 'Avustuksen tiedot' + acting_year: + '#type': select + '#title': 'Vuosi, jolle haen avustusta' + '#options': + 2022: '2022' + 2023: '2023' + 2024: '2024' + '#required': true + avustuslajit: + '#type': webform_section + '#title': Avustuslajit + subventions: + '#type': grants_compensations + '#title': Avustukset + '#multiple': true + '#subventionType': + 6: '6' + '#onlyOneSubventionPerApplication': 1 + '#required': true + '#multiple__header': true + '#multiple__empty_items': 0 + '#multiple__sorting': false + '#multiple__add': false + '#multiple__remove': false + '#multiple__add_more': false + '#attributes': + class: + - subventions + '#subvention_type': + 1: '1' + 6: '6' + '#subvention_type_id__access': false + '#subvention_type__title': Avustuslaji + '#subvention_amount__title': 'Avustuksen summa' + kayttotarkoitus: + '#type': webform_section + '#title': 'Käyttötarkoitus' + compensation_purpose: + '#type': textarea + '#title': 'Mihin avustus käytetään?' + '#help': 'Kuvaa tiiviisti avustuksella toteutettavaa toimintaa ja toiminnan laajuutta esimerkiksi seuraavilla tavoilla:
Kuinka paljon tai kuinka usein järjestätte ryhmiä, tapahtumia tai muuta toimintaa avustettavan ajanjakson aikana? Kuinka paljon kohderyhmän edustajia arvioitte tavoittavanne? Missä Helsingin alueilla toimintaa järjestetään? Minkälaista yhteistyötä teette Helsingissä muiden toimijoiden kanssa?' + '#required': true + '#counter_type': character + '#maxlength': 5000 + '#counter_maximum': 5000 + '#cols': 63 + '#attributes': + class: + - webform--large + '#counter_maximum_message': '%d/5000 merkkiä jäljellä' + who_benefits: + '#type': textarea + '#title': 'Ketkä toiminnastanne erityisesti hyötyvät?' + '#help': 'Kuvaa keitä kohderyhmäänne kuuluu ja mahdollisesti myös kuinka paljon kohderyhmään kuuluvia toiminta-alueellanne on. Kohderyhmän kuvauksessa on tärkeää, että siitä käy ilmi minkälaisia ihmisiä juuri te haluatte ja osaatte kohdata, tai millaisessa tilanteessa olevat hyötyvät toiminnastanne eniten.' + '#counter_type': character + '#maxlength': 5000 + '#counter_maximum': 5000 + '#cols': 63 + '#attributes': + class: + - webform--large + '#counter_maximum_message': '%d/5000 merkkiä jäljellä' + '#states': + visible: + ':input[name="avustukset_summa"]': + value: + greater_equal: '10000' + required: + ':input[name="avustukset_summa"]': + value: + greater_equal: '10000' + changes_on_success: + '#type': textarea + '#title': 'Minkälaisia muutoksia tapahtuu, jos onnistutte?' + '#help': 'Toiminnallanne voi olla monia tavoitteita. Kuvatkaa ja arvioikaa tässä keskeiset muutokset, joita tavoittelette esimerkiksi kohderyhmänne toimintakyvyssä, arjessa, ihmissuhteissa tai muussa hyvinvointiin ja terveyteen tai osallisuuteen liittyvässä asiassa. Mikä siis muuttuu, jos olette onnistuneet tai minkälaisia ilmiöitä toimintanne ennaltaehkäisee?' + '#counter_type': character + '#maxlength': 5000 + '#counter_maximum': 5000 + '#cols': 63 + '#attributes': + class: + - webform--large + '#counter_maximum_message': '%d/5000 merkkiä jäljellä' + '#states': + visible: + ':input[name="avustukset_summa"]': + value: + greater_equal: '10000' + required: + ':input[name="avustukset_summa"]': + value: + greater_equal: '10000' + results_of_activities: + '#type': textarea + '#title': 'Minkälaisia hyötyjä avustettavan toiminnan seurauksena syntyy?' + '#help': 'Kuvaa lyhyesti, mitä vaikutuksia toiminnalla saadaan aikaan ja millä tavoin ne syntyvät. Voit kuvata vaikutukset niiden tapahtumisjärjestyksessä: mitä vaikutuksia syntyy ensin, ja mitä vähän pidemmän ajan kuluttua. Keskity kuitenkin toiminnan välittömiin vaikutuksiin.
Voit myös kertoa, mikä toiminnassanne on erityistä tai mistä (laatu)tekijöistä on erityisesti huolehdittava, että tavoiteltavia vaikutuksia saavutetaan. Voit myös kuvata, miten jokin tekemänne yhteistyö edistää vaikutusten saavuttamista.' + '#counter_type': character + '#maxlength': 5000 + '#counter_maximum': 5000 + '#cols': 63 + '#attributes': + class: + - webform--large + '#counter_maximum_message': '%d/5000 merkkiä jäljellä' + '#states': + visible: + ':input[name="avustukset_summa"]': + value: + greater_equal: '50000' + required: + ':input[name="avustukset_summa"]': + value: + greater_equal: '50000' + muut_samaan_tarkoitukseen_myonnetyt_avustukset: + '#type': webform_section + '#title': 'Muut samaan tarkoitukseen myönnetyt avustukset' + info_muut_samaan_tarkoitukseen_myonnetty: + '#type': webform_markup + '#markup': | + Ilmoita tähän ainoastaan avustukset, jotka on myönnetty muualta kuin Helsingin kaupungilta kuluvana tai kahtena edellisenä verovuotena. +
+
+
+ + Myöntävä vastaus avaa lisäkysymyksen +
+
+
+ olemme_saaneet_muita_avustuksia: + '#type': radios + '#title': 'Olemme saaneet muita avustuksia' + '#description_display': before + '#options': + 1: Kyllä + 0: Ei + myonnetty_avustus: + '#type': webform_custom_composite + '#title': 'Myönnetty avustus' + '#title_display': before + '#states': + visible: + ':input[name="olemme_saaneet_muita_avustuksia"]': + value: '1' + required: + ':input[name="olemme_saaneet_muita_avustuksia"]': + value: '1' + '#multiple__header': false + '#multiple__item_label': 'myönnetty avustus' + '#multiple__no_items_message': 'Ei syötettyjä arvoja. Lisää uusi myönnetty avustus alta.' + '#multiple__min_items': 1 + '#multiple__empty_items': 0 + '#multiple__sorting': false + '#multiple__add': false + '#multiple__add_more_input': false + '#multiple__add_more_button_label': 'Lisää uusi myönnetty avustus' + '#element': + issuer: + '#type': select + '#options': + 1: Valtio + 3: EU + 4: Muu + 5: Säätiö + 6: STEA + '#required': true + '#title': 'Avustuksen myöntäjä' + issuer_name: + '#type': textfield + '#required': true + '#title': 'Myöntäjän nimi' + '#attributes': + class: + - webform--large + '#help': 'Mikä taho avustusta on myöntänyt (esim. ministeriön nimi)' + year: + '#type': textfield + '#required': true + '#attributes': + class: + - webform--small + '#title': Vuosi + '#maxlength': 4 + '#pattern': ^(19\d\d|20\d\d|2100)$ + '#pattern_error': 'Syötä vuosiluku väliltä 1900 - 2100' + amount: + '#type': textfield + '#attributes': + class: + - webform--small + '#required': true + '#title': 'Myönnetyn avustuksen summa' + '#input_mask': '''alias'': ''currency'', ''prefix'': '''', ''suffix'': ''€'',''groupSeparator'': '' '',''radixPoint'':'',''' + purpose: + '#type': textarea + '#title': 'Kuvaus käyttötarkoituksesta' + '#help': 'Anna lyhyt kuvaus, mihin tarkoitukseen avustus on myönnetty?' + '#maxlength': 1000 + '#counter_type': character + '#attributes': + class: + - webform--large + '#counter_maximum': 1000 + '#counter_maximum_message': '%d/1000 merkkiä jäljellä' + edellisen_avustuksen_kayttoselvitys: + '#type': webform_section + '#title': 'Edellisen avustuksen käyttöselvitys' + compensation_boolean_info: + '#type': webform_markup + '#markup': | +
+
+
+ + Myöntävä vastaus avaa lisäkysymyksen +
+
+
+ compensation_boolean: + '#type': radios + '#title': 'Käyttöselvitys edellisenä vuonna saamastani avustuksesta' + '#options': + - 'En ole saanut Helsingin kaupungilta avustusta samaan käyttötarkoitukseen edellisenä vuonna.' + - 'Olen saanut Helsingin kaupungilta avustusta samaan käyttötarkoitukseen edellisenä vuonna.' + '#required': true + markup: + '#type': webform_markup + '#states': + visible: + ':input[name="compensation_boolean"]': + value: '1' + '#markup': 'Anna käyttöselvitys Helsingin kaupungilta saadusta avustuksesta. Avustuksen käyttöselvitys tehdään avustuksesta, joka koskee viimeisintä päättynyttä tilikautta. Käyttöselvitystä ei tehdä käynnissä olevalta tilikaudelta. Käyttöselvityksen antaminen on seuraavan avustuksen saamisen ehtona. Mikäli käyttöselvitystä ei tehdä, avustusta ei myönnetä eikä makseta. Myönnetty avustus voidaan periä takaisin, jos edellisen avustuksen käyttöä ei ole hyväksyttävästi selvitetty.' + compensation_explanation: + '#type': textarea + '#title': 'Selvitys avustuksen käytöstä' + '#help': 'Käyttöselvityksessä tulee kuvata lyhyesti, miten myönnetty avustus on käytetty. Avustuksen saajan on järjestettävä kirjanpitonsa niin, että avustuksen käyttöä voidaan sieltä seurata. Esimerkiksi jos yhteisö on saanut vuokra-avustusta, tilinpäätöksen tuloslaskelmasta tulee käydä ilmi avustuksen toteutuminen sekä tuloissa että menoissa. Lisää tietoja avustuksen käytöstä voi myös kirjoittaa erilliseen liitteeseen, jonka voi ladata ja lähettää Muu-liitteenä.' + '#maxlength': 5000 + '#counter_type': character + '#counter_maximum': 5000 + '#counter_maximum_message': '%d/5000 merkkiä jäljellä' + '#states': + visible: + ':input[name="compensation_boolean"]': + value: '1' + required: + ':input[name="compensation_boolean"]': + value: '1' + '#attributes': + class: + - webform--large + '#cols': 63 + 3_yhteison_tiedot: + '#type': webform_wizard_page + '#title': '3. Yhteisön toiminta' + '#prev_button_label': 'Edellinen' + '#next_button_label': 'Seuraava' + business_info: + '#type': webform_section + '#title': 'Toiminnan kuvaus' + business_purpose: + '#type': textarea + '#title': 'Toiminnan kuvaus' + '#help': 'Tieto haetaan omat tiedot -osiosta' + '#maxlength': 500 + '#counter_type': character + '#counter_maximum': 500 + '#counter_maximum_message': '%d/500 merkkiä jäljellä' + community_practices_business: + '#type': radios + '#title': 'Harjoittaako yhteisö liiketoimintaa' + '#options': + 1: Kyllä + 0: Ei + '#options_display': side_by_side + '#options_description_display': help + '#required': true + ensimmainen_otsikko: + '#type': webform_section + '#title': Jäsenmaksut + fee_person: + '#type': textfield + '#title': 'Henkilöjäsenen jäsenmaksu (€ / vuosi)' + '#attributes': + class: + - webform--small + '#maxlength': 50 + '#input_mask': '''alias'': ''currency'', ''prefix'': '''', ''suffix'': ''€'',''groupSeparator'': '' '',''radixPoint'':'',''' + '#size': 16 + fee_community: + '#type': textfield + '#title': 'Yhteisöjäsen (€ / vuosi)' + '#attributes': + class: + - webform--small + '#maxlength': 50 + '#input_mask': '''alias'': ''currency'', ''prefix'': '''', ''suffix'': ''€'',''groupSeparator'': '' '',''radixPoint'':'',''' + '#size': 16 + jasenmaara: + '#type': webform_section + '#title': Jäsenmäärä + jasenmaara_fieldset: + '#type': fieldset + '#title': Jäsenmäärä + '#help': 'Jos yhteisöllä on jäseniä, merkitse ne tähän.' + '#attributes': + class: + - grants-fieldset + - grants-fieldset-short + members_applicant_person_global: + '#type': textfield + '#title': 'Henkilöjäseniä yhteensä' + '#help': 'Kuinka monta jäsenmaksun maksanutta henkilöjäsentä yhteisöllä on tällä hetkellä?' + '#maxlength': 9 + '#input_mask': '''alias'': ''numeric'', ''groupSeparator'': '' '', ''digits'': ''0''' + '#pattern': '^[0-9 ]*$' + '#pattern_error': 'Vain numeroita' + '#size': 16 + '#attributes': + class: + - webform--small + members_applicant_person_local: + '#type': textfield + '#title': 'Helsinkiläisiä henkilöjäseniä yhteensä' + '#help': 'Kuinka monta jäsenmaksun maksanutta helsinkiläistä henkilöjäsentä yhteisöllä on tällä hetkellä?' + '#maxlength': 9 + '#input_mask': '''alias'': ''numeric'', ''groupSeparator'': '' '', ''digits'': ''0''' + '#pattern': '^[0-9 ]*$' + '#pattern_error': 'Vain numeroita' + '#size': 16 + '#attributes': + class: + - webform--small + members_applicant_community_global: + '#type': textfield + '#title': 'Yhteisöjäseniä yhteensä' + '#help': 'Kuinka monta jäsenmaksun maksanutta yhteisöjäsentä yhteisöllä on tällä hetkellä? Yhteisöjäseniä ovat muut kuin henkilöjäsenet, esimerkiksi yhdistykset, säätiöt, yritykset tai kunnat.' + '#maxlength': 9 + '#size': 16 + '#input_mask': '''alias'': ''numeric'', ''groupSeparator'': '' '', ''digits'': ''0''' + '#pattern': '^[0-9 ]*$' + '#pattern_error': 'Vain numeroita' + '#attributes': + class: + - webform--small + members_applicant_community_local: + '#type': textfield + '#title': 'Helsinkiläisiä yhteisöjäseniä yhteensä' + '#help': 'Kuinka monta jäsenmaksun maksanutta helsinkiläistä yhteisöjäsentä yhteisöllä on tällä hetkellä? Yhteisöjäseniä ovat muut kuin henkilöjäsenet, esimerkiksi yhdistykset, säätiöt, yritykset tai kunnat.' + '#maxlength': 9 + '#input_mask': '''alias'': ''numeric'', ''groupSeparator'': '' '', ''digits'': ''0''' + '#pattern': '^[0-9 ]*$' + '#pattern_error': 'Vain numeroita' + '#size': 16 + '#attributes': + class: + - webform--small + lisatiedot_ja_liitteet: + '#type': webform_wizard_page + '#title': '4. Lisätiedot ja liitteet' + lisatietoja_hakemukseen_liittyen: + '#type': webform_section + '#title': 'Lisätietoja hakemukseen liittyen' + additional_information: + '#type': textarea + '#title': Lisätiedot + '#attributes': + class: + - webform--large + '#help': 'Tähän voit tarvittaessa kirjoittaa lisätietoja tai muita perusteluja hakemukseen liittyen.' + '#counter_type': character + '#maxlength': 5000 + '#counter_maximum': 5000 + '#counter_maximum_message': '%d/5000 merkkiä jäljellä' + '#cols': 63 + liitteet: + '#type': webform_section + '#title': Liitteet + attachments_info: + '#type': webform_markup + '#markup': |- +

Avustushakemuksen käsittelyä varten tulee toimittaa kaikki alla luetellut liitteet. Avustushakemus voidaan hylätä, jos liitteitä ei ole toimitettu. Mikäli joku liitteistä puuttuu kerro siitä hakemuksen Lisäselvitys liitteistä -kohdassa. +

Vaaditut liitteet

+

Avustushakemuksen käsittelyä varten tarvitaan vahvistettuja, yhteisön kokouksessaan hyväksymiä ja allekirjoittamia, liitteitä edelliseltä päättyneeltä tilikaudelta sekä liitteitä sille toimintavuodelle, jolle avustusta haetaan. Edellistä tilikautta koskevat liitteet ovat: tilinpäätös, toimintakertomus ja tilin- tai toiminnantarkastuskertomus sekä vuosikokouksen pöytäkirja. Liitteet vuodelle, jolle avustusta haetaan ovat: talousarvio ja toimintasuunnitelma. +

Usean liitteen toimittaminen yhtenä tiedostona

+

Voit halutessasi toimittaa useampia liitteitä yhtenä tiedostona Tilinpäätös tai talousarvio -liitekohdassa. Merkitse tällöin muiden liiteotsikoiden kohdalla ”Liite on toimitettu yhtenä tiedostona tai toisen hakemuksen yhteydessä”. +

Helsingin kaupungille aiemmin toimitetut liitteet

+

Jos vaaditut liitteet on jo toimitettu toisen Helsingin kaupungille osoitetun avustushakemuksen liitteenä, samoja liitteitä ei tarvitse toimittaa uudelleen. Yhteisön vahvistettu tilinpäätös, toimintakertomus, toimintasuunnitelma ja talousarvio eivät voi olla erilaisia eri hakemusten liitteenä. Merkitse tällöin toimitettujen liitteiden kohdalla ”Liite on toimitettu yhtenä tiedostona tai toisen hakemuksen yhteydessä”.

+ notification_attachments: + '#type': webform_markup + '#markup': | +
+
+
Liitteiden sisältöä ei voi tarkastella jälkikäteen
+

Huomioithan, että et pysty avaamaan liitteitä sen jälkeen, kun olet liittänyt ne lomakkeelle. Näet liitteestä ainoastaan sen tiedostonimen.

+

Vaikka et voi tarkastella liitteiden sisältöä jälkikäteen, lomakkeelle liitetyt liitteet lähtevät lomakkeen muiden tietojen mukana avustushakemuksen käsittelijälle.

+
+
+ yhteison_saannot: + '#type': grants_attachments + '#title': 'Yhteisön säännöt' + '#multiple': false + '#filetype': '7' + '#help': 'Uusi hakija tai säännöt muuttuneet.' + '#title_display': before + '#description__access': false + vahvistettu_tilinpaatos: + '#type': grants_attachments + '#title': 'Vahvistettu tilinpäätös (edelliseltä päättyneeltä tilikaudelta)' + '#multiple': false + '#filetype': '43' + '#help': |- +

Tilinpäätöksen täytyy sisältää vähintään tuloslaskelma ja tase. Yhdistys liittää tähän kohtaan yhdistyksen jäsenkokouksessa vahvistetun ja allekirjoitetun tilinpäätöksen.

+

Yhteisön tilikausi voi olla kalenterivuosi tai jokin muu kausi. Yhdistysten kohdalla niiden omissa säännöissä lukee, mikä on yhdistyksen tilikausi.

+ '#title_display': before + '#multiple__no_items_message': 'Ei syötettyjä arvoja. Lisää uusi sisältö alta.' + '#description__access': false + vahvistettu_toimintakertomus: + '#type': grants_attachments + '#title': 'Vahvistettu toimintakertomus (edelliseltä päättyneeltä tilikaudelta)' + '#multiple': false + '#filetype': '4' + '#help': |- +

Yhdistys liittää tähän kohtaan yhdistyksen jäsenkokouksessa vahvistetun toimintakertomuksen.

+

Jos toimintakertomus on osana tilinpäätöstä ja liititte sen jo tilinpäätöksen mukana lomakkeelle, sitä ei tarvitse liittää tähän erikseen. Valitse tällaisessa tilanteessa toimintakertomuksen kohdalla ”Liite on toimitettu yhtenä tiedostona tai toisen hakemuksen yhteydessä”.

+ '#title_display': before + '#description__access': false + vahvistettu_tilin_tai_toiminnantarkastuskertomus: + '#type': grants_attachments + '#title': 'Vahvistettu tilin- tai toiminnantarkastuskertomus (edelliseltä päättyneeltä tilikaudelta)' + '#multiple': false + '#filetype': '5' + '#help': |- +

Liitä tähän allekirjoitettu tilin- tai toiminnantarkastuskertomus yhteisön edelliseltä päättyneeltä tilikaudelta.

+

Jos allekirjoitettu tilin- tai toiminnantarkastuskertomus on osa yhteisönne tilinpäätöstä ja liitit sen jo lomakkeelle tilinpäätöksen kohdalla, valitse tässä kohdassa ”Liite on toimitettu yhtenä tiedostona tai toisen hakemuksen yhteydessä”.

+ '#title_display': before + '#description__access': false + vuosikokouksen_poytakirja: + '#type': grants_attachments + '#title': 'Vuosikokouksen pöytäkirja, jossa on vahvistettu edellisen päättyneen tilikauden tilinpäätös' + '#multiple': false + '#filetype': '8' + '#help': 'Liitä tähän yhteisön kokouksen pöytäkirja, jossa edellisen päättyneen tilikauden tilinpäätös on vahvistettu ja vastuuvapaus myönnetty. Yhdistyksillä tilinpäätös vahvistetaan aina yhdistyksen jäsenkokouksessa. Mikäli yhteisöltä ei edellytetä vuosikokousta tai muuta yhteisön kokousta, jossa tilinpäätös tulisi vahvistaa ja vastuuvapaus myöntää, ei tätä liitettä tarvitse toimittaa.' + '#title_display': before + '#description__access': false + toimintasuunnitelma: + '#type': grants_attachments + '#title': 'Toimintasuunnitelma (sille vuodelle jolle haet avustusta)' + '#multiple': false + '#filetype': '1' + '#help': 'Liitä tähän koko yhteisön toimintasuunnitelma. ' + '#title_display': before + '#description__access': false + talousarvio: + '#type': grants_attachments + '#title': 'Talousarvio (sille vuodelle jolle haet avustusta)' + '#multiple': false + '#filetype': '22' + '#help': 'Talousarvio (sille vuodelle jolle haet avustusta)' + '#title_display': before + '#description__access': false + extra_info: + '#type': textarea + '#title': 'Lisäselvitys liitteistä' + '#maxlength': 5000 + '#counter_type': character + '#counter_maximum': 5000 + '#counter_maximum_message': '%d/5000 merkkiä jäljellä' + '#attributes': + class: + - webform--large + '#cols': 63 + muu_liite: + '#type': grants_attachments + '#title': 'Muu liite' + '#multiple': 10 + '#filetype': '0' + '#title_display': before + '#multiple__item_label': liite + '#multiple__sorting': false + '#multiple__add': false + '#multiple__remove': false + '#multiple__add_more_input': false + '#multiple__add_more_button_label': 'Lisää uusi liite' + '#isDeliveredLater__access': false + '#isIncludedInOtherFile__access': false + actions: + '#type': webform_actions + '#title': 'Submit button(s)' + '#submit__label': Lähetä + '#draft__label': 'Tallenna keskeneräisenä' + '#wizard_prev__label': 'Edellinen' + '#wizard_next__label': 'Seuraava' + '#preview_prev__label': 'Edellinen' + '#preview_next__label': 'Esikatseluun' + '#delete_hide': false + '#delete__label': 'Poista keskeneräinen' + '#delete__attributes': + class: + - hds-button + - hds-button--primary + '#delete__dialog': true +css: '' +javascript: '' +settings: + ajax: false + ajax_scroll_top: form + ajax_progress_type: '' + ajax_effect: '' + ajax_speed: null + page: true + page_submit_path: '' + page_confirm_path: '' + page_theme_name: '' + form_title: source_entity_webform + form_submit_once: false + form_open_message: '' + form_close_message: '' + form_exception_message: '' + form_previous_submissions: false + form_confidential: false + form_confidential_message: '' + form_disable_remote_addr: true + form_convert_anonymous: false + form_prepopulate: false + form_prepopulate_source_entity: false + form_prepopulate_source_entity_required: false + form_prepopulate_source_entity_type: '' + form_unsaved: true + form_disable_back: false + form_submit_back: true + form_disable_autocomplete: false + form_novalidate: false + form_disable_inline_errors: false + form_required: false + form_autofocus: false + form_details_toggle: false + form_reset: false + form_access_denied: default + form_access_denied_title: '' + form_access_denied_message: '' + form_access_denied_attributes: { } + form_file_limit: '' + form_attributes: { } + form_method: '' + form_action: '' + share: false + share_node: false + share_theme_name: '' + share_title: true + share_page_body_attributes: { } + submission_label: '' + submission_exception_message: '' + submission_locked_message: '' + submission_log: true + submission_excluded_elements: { } + submission_exclude_empty: false + submission_exclude_empty_checkbox: false + submission_views: { } + submission_views_replace: { } + submission_user_columns: { } + submission_user_duplicate: false + submission_access_denied: default + submission_access_denied_title: '' + submission_access_denied_message: '' + submission_access_denied_attributes: { } + previous_submission_message: '' + previous_submissions_message: '' + autofill: false + autofill_message: '' + autofill_excluded_elements: { } + wizard_progress_bar: true + wizard_progress_pages: false + wizard_progress_percentage: false + wizard_progress_link: true + wizard_progress_states: false + wizard_start_label: '' + wizard_preview_link: false + wizard_confirmation: true + wizard_confirmation_label: '6. Valmis' + wizard_auto_forward: true + wizard_auto_forward_hide_next_button: false + wizard_keyboard: true + wizard_track: '' + wizard_prev_button_label: Edellinen + wizard_next_button_label: Seuraava + wizard_toggle: true + wizard_toggle_show_label: '' + wizard_toggle_hide_label: '' + wizard_page_type: container + wizard_page_title_tag: h2 + preview: 2 + preview_label: '5. Vahvista, esikatsele ja lähetä' + preview_title: 'Vahvista, esikatsele ja lähetä' + preview_message: '' + preview_attributes: { } + preview_excluded_elements: { } + preview_exclude_empty: false + preview_exclude_empty_checkbox: false + draft: all + draft_multiple: false + draft_auto_save: false + draft_saved_message: '' + draft_loaded_message: '' + draft_pending_single_message: '' + draft_pending_multiple_message: '' + confirmation_type: none + confirmation_url: '' + confirmation_title: '' + confirmation_message: '' + confirmation_attributes: { } + confirmation_back: true + confirmation_back_label: '' + confirmation_back_attributes: { } + confirmation_exclude_query: true + confirmation_exclude_token: true + confirmation_update: false + limit_total: null + limit_total_interval: null + limit_total_message: '' + limit_total_unique: false + limit_user: null + limit_user_interval: null + limit_user_message: '' + limit_user_unique: false + entity_limit_total: null + entity_limit_total_interval: null + entity_limit_user: null + entity_limit_user_interval: null + purge: draft + purge_days: 365 + results_disabled: false + results_disabled_ignore: false + results_customize: false + token_view: false + token_update: false + token_delete: false + serial_disabled: false +access: + create: + roles: + - anonymous + - authenticated + users: { } + permissions: { } + view_any: + roles: { } + users: { } + permissions: { } + update_any: + roles: { } + users: { } + permissions: { } + delete_any: + roles: { } + users: { } + permissions: { } + purge_any: + roles: { } + users: { } + permissions: { } + view_own: + roles: { } + users: { } + permissions: { } + update_own: + roles: { } + users: { } + permissions: { } + delete_own: + roles: { } + users: { } + permissions: { } + administer: + roles: { } + users: { } + permissions: { } + test: + roles: { } + users: { } + permissions: { } + configuration: + roles: { } + users: { } + permissions: { } +handlers: + grants_handler: + id: grants_handler + handler_id: grants_handler + label: 'Grants Handler' + notes: '' + status: true + conditions: { } + weight: 0 + settings: + debug: false +variants: { } diff --git a/conf/cmi/webform.webform.taide_ja_kulttuuri_kehittamisavu.yml b/conf/cmi/webform.webform.taide_ja_kulttuuri_kehittamisavu.yml index 0da0e95333..de9456b7e7 100644 --- a/conf/cmi/webform.webform.taide_ja_kulttuuri_kehittamisavu.yml +++ b/conf/cmi/webform.webform.taide_ja_kulttuuri_kehittamisavu.yml @@ -363,7 +363,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: diff --git a/conf/cmi/webform.webform.taide_ja_kulttuuriavustukset_tai.yml b/conf/cmi/webform.webform.taide_ja_kulttuuriavustukset_tai.yml index 85d272c137..7387ded3b7 100644 --- a/conf/cmi/webform.webform.taide_ja_kulttuuriavustukset_tai.yml +++ b/conf/cmi/webform.webform.taide_ja_kulttuuriavustukset_tai.yml @@ -346,7 +346,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: diff --git a/conf/cmi/webform.webform.yleisavustushakemus.yml b/conf/cmi/webform.webform.yleisavustushakemus.yml index 9699ee3ee9..c1ddcb316b 100644 --- a/conf/cmi/webform.webform.yleisavustushakemus.yml +++ b/conf/cmi/webform.webform.yleisavustushakemus.yml @@ -311,7 +311,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: @@ -400,7 +399,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: diff --git a/conf/cmi/webform.webform.ymparistopalvelut_yleisavustus.yml b/conf/cmi/webform.webform.ymparistopalvelut_yleisavustus.yml index f310eb36ec..9d57d1198c 100644 --- a/conf/cmi/webform.webform.ymparistopalvelut_yleisavustus.yml +++ b/conf/cmi/webform.webform.ymparistopalvelut_yleisavustus.yml @@ -314,7 +314,6 @@ elements: |- 3: EU 4: Muu 5: Säätiö - 6: STEA '#required': true '#title': 'Avustuksen myöntäjä' issuer_name: diff --git a/conf/examples/esimerkki_70_KUVAERILLIS.json b/conf/examples/esimerkki_70_KUVAERILLIS.json index 6bee156f4d..bbd0d2a5a3 100644 --- a/conf/examples/esimerkki_70_KUVAERILLIS.json +++ b/conf/examples/esimerkki_70_KUVAERILLIS.json @@ -208,62 +208,62 @@ ] ] }, - "customQuestionsInfo": { - "customQuestionsArray": [ - { - "ID": "a", - "label": "Label a", - "value": "Value a", - "valueType": "string" - }, - { - "ID": "b", - "label": "LABEL B", - "value": "Value B", - "valueType": "string" - } - ] - }, - "budgetInfo": { - "incomeGroupsArrayStatic": [ - { - "incomeGroupName": "general", - "otherIncomeRowsArrayStatic": [ - { - "ID": "a", - "label": "Kioskimyynti", - "value": "300.00", - "valueType": "double" - }, - { - "ID": "b", - "label": "Parkkitulot", - "value": "50.00", - "valueType": "double" - } - ] - } - ], - "costGroupsArrayStatic": [ - { - "costGroupName": "general", - "otherCostRowsArrayStatic": [ - { - "ID": "a", - "label": "Kioskiostot", - "value": "100.00", - "valueType": "double" - }, - { - "ID": "b", - "label": "Jätemaksut", - "value": "50.00", - "valueType": "double" - } - ] - } - ] - }, + "customQuestionsInfo": { + "customQuestionsArray": [ + { + "ID": "a", + "label": "Label a", + "value": "Value a", + "valueType": "string" + }, + { + "ID": "b", + "label": "LABEL B", + "value": "Value B", + "valueType": "string" + } + ] + }, + "budgetInfo": { + "incomeGroupsArrayStatic": [ + { + "incomeGroupName": "general", + "otherIncomeRowsArrayStatic": [ + { + "ID": "a", + "label": "Kioskimyynti", + "value": "300.00", + "valueType": "double" + }, + { + "ID": "b", + "label": "Parkkitulot", + "value": "50.00", + "valueType": "double" + } + ] + } + ], + "costGroupsArrayStatic": [ + { + "costGroupName": "general", + "otherCostRowsArrayStatic": [ + { + "ID": "a", + "label": "Kioskiostot", + "value": "100.00", + "valueType": "double" + }, + { + "ID": "b", + "label": "Jätemaksut", + "value": "50.00", + "valueType": "double" + } + ] + } + ] + }, "otherCompensationsInfo": { "otherCompensationsArray": [ [ @@ -299,7 +299,7 @@ } ] ], - "otherAppliedCompensationsArray": [ + "otherAppliedCompensationsArray": [ [ { "ID": "issuer", @@ -368,8 +368,6 @@ } ] }, - - "attachmentsInfo": { "attachmentsArray": [ [ @@ -405,4 +403,4 @@ ] }, "formUpdate": false -} \ No newline at end of file +} diff --git a/conf/examples/esimerkki_71_HYTEEDYLEIS.json b/conf/examples/esimerkki_71_HYTEEDYLEIS.json new file mode 100644 index 0000000000..08de06a81e --- /dev/null +++ b/conf/examples/esimerkki_71_HYTEEDYLEIS.json @@ -0,0 +1,398 @@ +{ + "compensation": { + "applicationInfoArray": [ + { + "ID": "applicationType", + "label": "Hakemustyyppi", + "value": "HYTEEDYLEIS", + "valueType": "string" + }, + { + "ID": "applicationTypeID", + "label": "Hakemustyypin numero", + "value": "71", + "valueType": "int" + }, + { + "ID": "formTimeStamp", + "label": "Hakemuksen/sanoman lähetyshetki", + "value": "2023-11-10T12:50:12.000", + "valueType": "datetime" + }, + { + "ID": "applicationNumber", + "label": "Hakemusnumero", + "value": "HYTEEDYLEIS-1", + "valueType": "string" + }, + { + "ID": "status", + "label": "Tila", + "value": "Vastaanotettu", + "valueType": "string" + }, + { + "ID": "actingYear", + "label": "Hakemusvuosi", + "value": "2023", + "valueType": "int" + } + ], + "currentAddressInfoArray": [ + { + "ID": "contactPerson", + "label": "Yhteyshenkilö", + "value": "Teemu Testaushenkilö", + "valueType": "string" + }, + { + "ID": "phoneNumber", + "label": "Puhelinnumero", + "value": "+358404040404", + "valueType": "string" + }, + { + "ID": "street", + "label": "Katuosoite", + "value": "Annankatu 18 Ö 905", + "valueType": "string" + }, + { + "ID": "city", + "label": "Postitoimipaikka", + "value": "Helsinki", + "valueType": "string" + }, + { + "ID": "postCode", + "label": "Postinumero", + "value": "00120", + "valueType": "string" + }, + { + "ID": "country", + "label": "Maa", + "value": "Suomi", + "valueType": "string" + } + ], + "applicantInfoArray": [ + { + "ID": "applicantType", + "label": "Hakijan tyyppi", + "value": "2", + "valueType": "string" + }, + { + "ID": "companyNumber", + "label": "Rekisterinumero", + "value": "5647641-1", + "valueType": "string" + }, + { + "ID": "communityOfficialName", + "label": "Yhteisön nimi", + "value": "TietoTesti Kh yleis 001 10062021", + "valueType": "string" + }, + { + "ID": "communityOfficialNameShort", + "label": "Yhteisön lyhenne", + "value": "TT ry", + "valueType": "string" + }, + { + "ID": "registrationDate", + "label": "Rekisteröimispäivä", + "value": "2021-01-01T00:00:00.000", + "valueType": "datetime" + }, + { + "ID": "foundingYear", + "label": "Perustamisvuosi", + "value": "2021", + "valueType": "int" + }, + { + "ID": "home", + "label": "Kotipaikka", + "value": "Helsinki", + "valueType": "string" + }, + { + "ID": "homePage", + "label": "www-sivut", + "value": "www.ttry.fi", + "valueType": "string" + }, + { + "ID": "email", + "label": "Sähköpostiosoite", + "value": "tsto@ttry.fi", + "valueType": "string" + } + ], + "applicantOfficialsArray": [ + [ + { + "ID": "email", + "label": "Sähköposti", + "value": "teemu@ttry.fi", + "valueType": "string" + }, + { + "ID": "role", + "label": "Rooli", + "value": "1", + "valueType": "string" + }, + { + "ID": "name", + "label": "Nimi", + "value": "Teemu Testaushenkilö", + "valueType": "string" + }, + { + "ID": "phone", + "label": "Puhelinnumero", + "value": "09-616527788", + "valueType": "string" + } + ] + ], + "bankAccountArray": [ + { + "ID": "accountNumber", + "label": "Tilinumero", + "value": "FI9640231442000454", + "valueType": "string" + } + ], + "compensationInfo": { + "generalInfoArray": [ + { + "ID": "purpose", + "label": "Haetun avustuksen käyttötarkoitus", + "value": "Käyttötarkoituksenamme on se että ... kts. liite 10.", + "valueType": "string" + }, + { + "ID": "explanation", + "label": "Selvitys edellisen avustuksen käytöstä", + "value": "Emme saaneet viime vuonna avustusta lainkaan.", + "valueType": "string" + }, + { + "ID": "whoBenefits", + "label": "Ketkä toiminnastanne erityisesti hyötyvät", + "value": "Kaikki kaikkialla.", + "valueType": "string" + }, + { + "ID": "changesOnSuccess", + "label": "Minkälaisia muutoksia tapahtuu, jos onnistutte?", + "value": "Asiat paranevat ympäriinsä.", + "valueType": "string" + }, + { + "ID": "resultsOfActivities", + "label": "Minkälaisia hyötyjä avustettavan toiminnan seurauksena syntyy?", + "value": "Positiivisia hyötyjä.", + "valueType": "string" + } + ], + "compensationArray": [ + [ + { + "ID": "subventionType", + "label": "Avustuslaji", + "value": "6", + "valueType": "string" + }, + { + "ID": "amount", + "label": "Euroa", + "value": "3533.00", + "valueType": "double" + } + ] + ] + }, + "otherCompensationsInfo": { + "otherCompensationsArray": [ + [ + { + "ID": "issuer", + "label": "Myöntäjä", + "value": "5", + "valueType": "string" + }, + { + "ID": "issuerName", + "label": "Myöntäjän nimi", + "value": "Joku Säätiö Sr.", + "valueType": "string" + }, + { + "ID": "year", + "label": "Vuosi", + "value": "2021", + "valueType": "string" + }, + { + "ID": "amount", + "label": "Euroa", + "value": "2800", + "valueType": "double" + }, + { + "ID": "purpose", + "label": "Tarkoitus", + "value": "Matkakuluihin ja muihin ylimääräisiin menoihin.", + "valueType": "string" + } + ] + ] + }, + "activitiesInfoArray": [ + { + "ID": "businessPurpose", + "label": "Toiminnan tarkoitus", + "value": "Meidän toimintamme tarkoituksena on että ...", + "valueType": "string" + }, + { + "ID": "communityPracticesBusiness", + "label": "Yhteisö harjoittaa liiketoimintaa", + "value": "false", + "valueType": "bool" + }, + { + "ID": "membersApplicantPersonGlobal", + "label": "Hakijayhteisö, henkilöjäseniä", + "value": "50", + "valueType": "int" + }, + { + "ID": "membersApplicantCommunityGlobal", + "label": "Hakijayhteisö, yhteisöjäseniä", + "value": "12", + "valueType": "int" + }, + { + "ID": "membersApplicantPersonLocal", + "label": "Hakijayhteisö, helsinkiläisiä henkilöjäseniä", + "value": "45", + "valueType": "int" + }, + { + "ID": "membersApplicantCommunityLocal", + "label": "Hakijayhteisö, helsinkiläisiä yhteisöjäseniä", + "value": "23", + "valueType": "int" + }, + { + "ID": "feePerson", + "label": "Jäsenmaksun suuruus, Henkilöjäsen euroa", + "value": "38", + "valueType": "double" + }, + { + "ID": "feeCommunity", + "label": "Jäsenmaksun suuruus, Yhteisöjäsen euroa", + "value": "98", + "valueType": "double" + } + ], + "additionalInformation": "Tällä kertaa ei ole muuta ilmoitettavaa tähän hakemukseen", + "senderInfoArray": [ + { + "ID": "firstname", + "label": "Etunimi", + "value": "Testaaja", + "valueType": "string" + }, + { + "ID": "lastname", + "label": "Sukunimi", + "value": "Tiina", + "valueType": "string" + }, + { + "ID": "personID", + "label": "Henkilötunnus", + "value": "171756-1234", + "valueType": "string" + }, + { + "ID": "userID", + "label": "Käyttäjätunnus", + "value": "testatii", + "valueType": "string" + }, + { + "ID": "email", + "label": "Sähköposti", + "value": "tiina.testaaja@testiyhdistys.fi", + "valueType": "string" + } + ] + }, + "attachmentsInfo": { + "attachmentsArray": [ + [ + { + "ID": "description", + "value": "Vuosikokouksen pöytäkirja", + "valueType": "string" + }, + { + "ID": "fileType", + "value": "1", + "valueType": "int" + }, + { + "ID": "isDeliveredLater", + "value": "false", + "valueType": "bool" + }, + { + "ID": "isIncludedInOtherFile", + "value": "true", + "valueType": "bool" + } + ], + [ + { + "ID": "description", + "value": "Muu liite", + "valueType": "string" + }, + { + "ID": "fileType", + "value": "1", + "valueType": "int" + }, + { + "ID": "isDeliveredLater", + "value": "true", + "valueType": "bool" + }, + { + "ID": "isIncludedInOtherFile", + "value": "false", + "valueType": "bool" + } + ] + ], + "generalInfoArray": [ + { + "ID": "extraInfo", + "label": "Lisäselvitys liitteistä", + "value": "Tässä voi olla joku kaikkia liitteitä yhteisesti koskeva selvitys", + "valueType": "string" + } + ] + }, + "formUpdate": false +} \ No newline at end of file diff --git a/conf/examples/esimerkki_72_SOTEPEYLEIS.json b/conf/examples/esimerkki_72_SOTEPEYLEIS.json new file mode 100644 index 0000000000..b3d54812f1 --- /dev/null +++ b/conf/examples/esimerkki_72_SOTEPEYLEIS.json @@ -0,0 +1,398 @@ +{ + "compensation": { + "applicationInfoArray": [ + { + "ID": "applicationType", + "label": "Hakemustyyppi", + "value": "SOTEPEYLEIS", + "valueType": "string" + }, + { + "ID": "applicationTypeID", + "label": "Hakemustyypin numero", + "value": "72", + "valueType": "int" + }, + { + "ID": "formTimeStamp", + "label": "Hakemuksen/sanoman lähetyshetki", + "value": "2024-10-01T12:43:02.001", + "valueType": "datetime" + }, + { + "ID": "applicationNumber", + "label": "Hakemusnumero", + "value": "SOTEPEYLEIS-1", + "valueType": "string" + }, + { + "ID": "status", + "label": "Tila", + "value": "Vastaanotettu", + "valueType": "string" + }, + { + "ID": "actingYear", + "label": "Hakemusvuosi", + "value": "2024", + "valueType": "int" + } + ], + "currentAddressInfoArray": [ + { + "ID": "contactPerson", + "label": "Yhteyshenkilö", + "value": "Teemu Testaushenkilö", + "valueType": "string" + }, + { + "ID": "phoneNumber", + "label": "Puhelinnumero", + "value": "+358404040404", + "valueType": "string" + }, + { + "ID": "street", + "label": "Katuosoite", + "value": "Annankatu 18 Ö 905", + "valueType": "string" + }, + { + "ID": "city", + "label": "Postitoimipaikka", + "value": "Helsinki", + "valueType": "string" + }, + { + "ID": "postCode", + "label": "Postinumero", + "value": "00120", + "valueType": "string" + }, + { + "ID": "country", + "label": "Maa", + "value": "Suomi", + "valueType": "string" + } + ], + "applicantInfoArray": [ + { + "ID": "applicantType", + "label": "Hakijan tyyppi", + "value": "2", + "valueType": "string" + }, + { + "ID": "companyNumber", + "label": "Rekisterinumero", + "value": "5647641-1", + "valueType": "string" + }, + { + "ID": "communityOfficialName", + "label": "Yhteisön nimi", + "value": "TietoTesti Kh yleis 001 10062021", + "valueType": "string" + }, + { + "ID": "communityOfficialNameShort", + "label": "Yhteisön lyhenne", + "value": "TT ry", + "valueType": "string" + }, + { + "ID": "registrationDate", + "label": "Rekisteröimispäivä", + "value": "2021-01-01T00:00:00.000", + "valueType": "datetime" + }, + { + "ID": "foundingYear", + "label": "Perustamisvuosi", + "value": "2021", + "valueType": "int" + }, + { + "ID": "home", + "label": "Kotipaikka", + "value": "Helsinki", + "valueType": "string" + }, + { + "ID": "homePage", + "label": "www-sivut", + "value": "www.ttry.fi", + "valueType": "string" + }, + { + "ID": "email", + "label": "Sähköpostiosoite", + "value": "tsto@ttry.fi", + "valueType": "string" + } + ], + "applicantOfficialsArray": [ + [ + { + "ID": "email", + "label": "Sähköposti", + "value": "teemu@ttry.fi", + "valueType": "string" + }, + { + "ID": "role", + "label": "Rooli", + "value": "1", + "valueType": "string" + }, + { + "ID": "name", + "label": "Nimi", + "value": "Teemu Testaushenkilö", + "valueType": "string" + }, + { + "ID": "phone", + "label": "Puhelinnumero", + "value": "09-616527788", + "valueType": "string" + } + ] + ], + "bankAccountArray": [ + { + "ID": "accountNumber", + "label": "Tilinumero", + "value": "FI9640231442000454", + "valueType": "string" + } + ], + "compensationInfo": { + "generalInfoArray": [ + { + "ID": "purpose", + "label": "Haetun avustuksen käyttötarkoitus", + "value": "Käyttötarkoituksenamme on se että ... kts. liite 10.", + "valueType": "string" + }, + { + "ID": "explanation", + "label": "Selvitys edellisen avustuksen käytöstä", + "value": "Emme saaneet viime vuonna avustusta lainkaan.", + "valueType": "string" + }, + { + "ID": "whoBenefits", + "label": "Ketkä toiminnastanne erityisesti hyötyvät", + "value": "Tästähän siis hyötyvät ihan kaikki", + "valueType": "string" + }, + { + "ID": "changesOnSuccess", + "label": "Minkälaisia muutoksia tapahtuu, jos onnistutte?", + "value": "Pelkästään positiivisia muutoksia", + "valueType": "string" + }, + { + "ID": "resultsOfActivities", + "label": "Minkälaisia hyötyjä avustettavan toiminnan seurauksena syntyy?", + "value": "Kaikki sujuu paremmin ja turvallisemmin jatkossa", + "valueType": "string" + } + ], + "compensationArray": [ + [ + { + "ID": "subventionType", + "label": "Avustuslaji", + "value": "6", + "valueType": "string" + }, + { + "ID": "amount", + "label": "Euroa", + "value": "3533.00", + "valueType": "double" + } + ] + ] + }, + "otherCompensationsInfo": { + "otherCompensationsArray": [ + [ + { + "ID": "issuer", + "label": "Myöntäjä", + "value": "5", + "valueType": "string" + }, + { + "ID": "issuerName", + "label": "Myöntäjän nimi", + "value": "Joku Säätiö Sr.", + "valueType": "string" + }, + { + "ID": "year", + "label": "Vuosi", + "value": "2021", + "valueType": "string" + }, + { + "ID": "amount", + "label": "Euroa", + "value": "2800", + "valueType": "double" + }, + { + "ID": "purpose", + "label": "Tarkoitus", + "value": "Matkakuluihin ja muihin ylimääräisiin menoihin.", + "valueType": "string" + } + ] + ] + }, + "activitiesInfoArray": [ + { + "ID": "businessPurpose", + "label": "Toiminnan tarkoitus", + "value": "Meidän toimintamme tarkoituksena on että ...", + "valueType": "string" + }, + { + "ID": "communityPracticesBusiness", + "label": "Yhteisö harjoittaa liiketoimintaa", + "value": "false", + "valueType": "bool" + }, + { + "ID": "membersApplicantPersonGlobal", + "label": "Hakijayhteisö, henkilöjäseniä", + "value": "50", + "valueType": "int" + }, + { + "ID": "membersApplicantCommunityGlobal", + "label": "Hakijayhteisö, yhteisöjäseniä", + "value": "12", + "valueType": "int" + }, + { + "ID": "membersApplicantPersonLocal", + "label": "Hakijayhteisö, helsinkiläisiä henkilöjäseniä", + "value": "45", + "valueType": "int" + }, + { + "ID": "membersApplicantCommunityLocal", + "label": "Hakijayhteisö, helsinkiläisiä yhteisöjäseniä", + "value": "23", + "valueType": "int" + }, + { + "ID": "feePerson", + "label": "Jäsenmaksun suuruus, Henkilöjäsen euroa", + "value": "38", + "valueType": "double" + }, + { + "ID": "feeCommunity", + "label": "Jäsenmaksun suuruus, Yhteisöjäsen euroa", + "value": "98", + "valueType": "double" + } + ], + "additionalInformation": "Tällä kertaa ei ole muuta ilmoitettavaa tähän hakemukseen", + "senderInfoArray": [ + { + "ID": "firstname", + "label": "Etunimi", + "value": "Testaaja", + "valueType": "string" + }, + { + "ID": "lastname", + "label": "Sukunimi", + "value": "Tiina", + "valueType": "string" + }, + { + "ID": "personID", + "label": "Henkilötunnus", + "value": "171756-1234", + "valueType": "string" + }, + { + "ID": "userID", + "label": "Käyttäjätunnus", + "value": "testatii", + "valueType": "string" + }, + { + "ID": "email", + "label": "Sähköposti", + "value": "tiina.testaaja@testiyhdistys.fi", + "valueType": "string" + } + ] + }, + "attachmentsInfo": { + "attachmentsArray": [ + [ + { + "ID": "description", + "value": "Vuosikokouksen pöytäkirja", + "valueType": "string" + }, + { + "ID": "fileType", + "value": "1", + "valueType": "int" + }, + { + "ID": "isDeliveredLater", + "value": "false", + "valueType": "bool" + }, + { + "ID": "isIncludedInOtherFile", + "value": "true", + "valueType": "bool" + } + ], + [ + { + "ID": "description", + "value": "Muu liite", + "valueType": "string" + }, + { + "ID": "fileType", + "value": "1", + "valueType": "int" + }, + { + "ID": "isDeliveredLater", + "value": "true", + "valueType": "bool" + }, + { + "ID": "isIncludedInOtherFile", + "value": "false", + "valueType": "bool" + } + ] + ], + "generalInfoArray": [ + { + "ID": "extraInfo", + "label": "Lisäselvitys liitteistä", + "value": "Tässä voi olla joku kaikkia liitteitä yhteisesti koskeva selvitys", + "valueType": "string" + } + ] + }, + "formUpdate": false +} \ No newline at end of file diff --git a/conf/tietoliikennesanoma_schema.json b/conf/tietoliikennesanoma_schema.json index ca6524b6f4..c2194c1bc2 100644 --- a/conf/tietoliikennesanoma_schema.json +++ b/conf/tietoliikennesanoma_schema.json @@ -17,9 +17,9 @@ "enum": [ "applicationType", "applicationTypeID", - "createdFormTimeStamp", + "createdFormTimeStamp", "formTimeStamp", - "submittedFormTimeStamp", + "submittedFormTimeStamp", "applicationNumber", "status", "sector", @@ -47,7 +47,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -91,7 +91,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -127,7 +127,7 @@ "email", "homePage", "isSportsClub", - "communityType" + "communityType" ] }, "label": { @@ -145,7 +145,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -191,7 +191,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -233,7 +233,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -268,21 +268,24 @@ "purpose", "description", "compensationPreviousYear", - "yearsForMultiYearApplication", - "breakdownOfYearlySums", - "organizationBelongsToStateShareSystem", - "primaryArt", - "isFestival", - "internalOrder", - "eventDayCount", - "performanceCount", - "estimatedVisitors", - "premiereLocation", - "firstPublicDate", - "nameOfEvent", - "rentalApplied", - "compensationExtraQuestion", - "targetOfSubvention" + "yearsForMultiYearApplication", + "breakdownOfYearlySums", + "organizationBelongsToStateShareSystem", + "primaryArt", + "isFestival", + "internalOrder", + "eventDayCount", + "performanceCount", + "estimatedVisitors", + "premiereLocation", + "firstPublicDate", + "nameOfEvent", + "rentalApplied", + "compensationExtraQuestion", + "targetOfSubvention", + "whoBenefits", + "changesOnSuccess", + "resultsOfActivities" ] }, "label": { @@ -300,7 +303,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -358,7 +361,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -398,7 +401,7 @@ "caretakerName", "caretakerAddress", "totalCostsOfType", - "usedAmount" + "usedAmount" ] }, "label": { @@ -416,7 +419,7 @@ "bool", "datetime", "float", - "double" + "double" ] }, "otherCostsArray": { @@ -491,7 +494,7 @@ "bool", "datetime", "float", - "double" + "double" ] } } @@ -537,7 +540,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -556,8 +559,8 @@ "compensationArray" ] }, - "communityInfo": { - "description": "'Yhteisön tiedot' section of the application", + "communityInfo": { + "description": "'Yhteisön tiedot' section of the application", "type": "object", "properties": { "generalCommunityInfoArray": { @@ -581,7 +584,7 @@ "staffManyearsParttime", "staffManyearsVoluntary", "staffManyearsSummary", - "isOwnerOrPrimaryTenantOfArtpremises" + "isOwnerOrPrimaryTenantOfArtpremises" ] }, "label": { @@ -599,7 +602,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -622,7 +625,7 @@ "description": "Identifies the data of the array item", "type": "string", "enum": [ - "premiseType", + "premiseType", "premiseName", "postCode", "isOthersUse", @@ -645,7 +648,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -661,252 +664,251 @@ "required": [ "generalCommunityInfoArray" ] - - }, - "activityInfo": { - "description": "'Toiminta' section of the application, for KUVA applications", - "type": "object", - "properties": { - "plannedActivityInfoArray": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ID": { - "description": "Identifies the data of the array item", - "type": "string", - "enum": [ - "eventDaysCountHki", - "performanceCountHki", - "performanceCountAll", - "performanceVisitorsHki", - "performanceVisitorsAll", - "exhibitionCountHki", - "exhibitionCountAll", - "exhibitionVisitorsHki", - "exhibitionVisitorsAll", - "workshopCountHki", - "workshopCountAll", - "workshopVisitorsHki", - "workshopVisitorsAll", - "eventsHkiTotal", - "eventsTotal", - "eventsVisitorsHkiTotal", - "eventsVisitorsTotal", - "firstPublicPerformancesCount", - "premiereCountHki", - "firstPublicEventLocationHki", - "firstPublicEventLocationPostCode", - "isOwnedByCity", - "premisesCount", - "eventOrFestivalDates", - "firstPublicOccasionDate", - "projectStartDate", - "projectEndDate", - "detailedProjectDescription", - "otherKeyActivities" - ] - }, - "label": { - "description": "For future use, field's name in the UI", - "type": "string" - }, - "value": { - "type": "string" - }, - "valueType": { - "type": "string", - "enum": [ - "string", - "int", - "bool", - "datetime", - "float", - "double" - ] - } - }, - "required": [ - "ID", - "value", - "valueType" - ] - } - }, - "realizedActivityInfoArray": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ID": { - "description": "Identifies the data of the array item", - "type": "string", - "enum": [ - "isEventOrFestival", - "eventDaysCount", - "performanceCountHki", - "performanceCountAll", - "performanceVisitorsHki", - "performanceVisitorsAll", - "exhibitionCountHki", - "exhibitionCountAll", - "exhibitionVisitorsHki", - "exhibitionVisitorsAll", - "workshopCountHki", - "workshopCountAll", - "workshopVisitorsHki", - "workshopVisitorsAll", - "eventsHkiTotal", - "eventsTotal", - "eventsVisitorsHkiTotal", - "eventsVisitorsTotal", - "firstPublicPerformancesCount", - "premiereCountHki", - "premisesCount", - "pupilsChildhoodAll", - "pupilsChildhoodGirls", - "pupilsChildhoodBoys", - "wideBasicStudiesAll", - "wideBasicStudiesGirls", - "wideBasicStudiesBoys", - "wideAdvancedStudiesAll", - "wideAdvancedStudiesGirls", - "wideAdvancedStudiesBoys", - "generalStudiesAll", - "generalStudiesGirls", - "generalStudiesBoys", - "teachingPersonnel", - "wayOfSelection", - "personalTeaching", - "freeStudents", - "lessonsChildhood", - "lessonsWideBasicStudies", - "lessonsWideAdvancedStudies", - "lessonsGeneralStudies", - "lessonsTotal" - ] - }, - "label": { - "description": "For future use, field's name in the UI", - "type": "string" - }, - "value": { - "type": "string" - }, - "valueType": { - "type": "string", - "enum": [ - "string", - "int", - "bool", - "datetime", - "float", - "double" - ] - } - }, - "required": [ - "ID", - "value", - "valueType" - ] - } - }, - "plannedPremisesArray": { - "description": "Information about several premises, each as one item/array of this array", - "type": "array", - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ID": { - "description": "Identifies the data of the array item", - "type": "string", - "enum": [ - "premiseName", - "postCode", - "isOwnedByCity" - ] - }, - "label": { - "description": "For future use, field's name in the UI", - "type": "string" - }, - "value": { - "type": "string" - }, - "valueType": { - "type": "string", - "enum": [ - "string", - "int", - "bool", - "datetime", - "float", - "double" - ] - } - }, - "required": [ - "ID", - "value", - "valueType" - ] - } - } - }, - "realizedPremisesArray": { - "description": "Information about several premises, each as one item/array of this array", - "type": "array", - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ID": { - "description": "Identifies the data of the array item", - "type": "string", - "enum": [ - "premiseName", - "postCode", - "isOwnedByCity", - "premiseType", - "premiseSuitability", - "citySection" - ] - }, - "label": { - "description": "For future use, field's name in the UI", - "type": "string" - }, - "value": { - "type": "string" - }, - "valueType": { - "type": "string", - "enum": [ - "string", - "int", - "bool", - "datetime", - "float", - "double" - ] - } - }, - "required": [ - "ID", - "value", - "valueType" - ] - } - } - } - } - }, - "activityBasisInfo": { - "description": "'Toiminnan lähtökohdat' section of the application, for KUVA applications", + }, + "activityInfo": { + "description": "'Toiminta' section of the application, for KUVA applications", + "type": "object", + "properties": { + "plannedActivityInfoArray": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ID": { + "description": "Identifies the data of the array item", + "type": "string", + "enum": [ + "eventDaysCountHki", + "performanceCountHki", + "performanceCountAll", + "performanceVisitorsHki", + "performanceVisitorsAll", + "exhibitionCountHki", + "exhibitionCountAll", + "exhibitionVisitorsHki", + "exhibitionVisitorsAll", + "workshopCountHki", + "workshopCountAll", + "workshopVisitorsHki", + "workshopVisitorsAll", + "eventsHkiTotal", + "eventsTotal", + "eventsVisitorsHkiTotal", + "eventsVisitorsTotal", + "firstPublicPerformancesCount", + "premiereCountHki", + "firstPublicEventLocationHki", + "firstPublicEventLocationPostCode", + "isOwnedByCity", + "premisesCount", + "eventOrFestivalDates", + "firstPublicOccasionDate", + "projectStartDate", + "projectEndDate", + "detailedProjectDescription", + "otherKeyActivities" + ] + }, + "label": { + "description": "For future use, field's name in the UI", + "type": "string" + }, + "value": { + "type": "string" + }, + "valueType": { + "type": "string", + "enum": [ + "string", + "int", + "bool", + "datetime", + "float", + "double" + ] + } + }, + "required": [ + "ID", + "value", + "valueType" + ] + } + }, + "realizedActivityInfoArray": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ID": { + "description": "Identifies the data of the array item", + "type": "string", + "enum": [ + "isEventOrFestival", + "eventDaysCount", + "performanceCountHki", + "performanceCountAll", + "performanceVisitorsHki", + "performanceVisitorsAll", + "exhibitionCountHki", + "exhibitionCountAll", + "exhibitionVisitorsHki", + "exhibitionVisitorsAll", + "workshopCountHki", + "workshopCountAll", + "workshopVisitorsHki", + "workshopVisitorsAll", + "eventsHkiTotal", + "eventsTotal", + "eventsVisitorsHkiTotal", + "eventsVisitorsTotal", + "firstPublicPerformancesCount", + "premiereCountHki", + "premisesCount", + "pupilsChildhoodAll", + "pupilsChildhoodGirls", + "pupilsChildhoodBoys", + "wideBasicStudiesAll", + "wideBasicStudiesGirls", + "wideBasicStudiesBoys", + "wideAdvancedStudiesAll", + "wideAdvancedStudiesGirls", + "wideAdvancedStudiesBoys", + "generalStudiesAll", + "generalStudiesGirls", + "generalStudiesBoys", + "teachingPersonnel", + "wayOfSelection", + "personalTeaching", + "freeStudents", + "lessonsChildhood", + "lessonsWideBasicStudies", + "lessonsWideAdvancedStudies", + "lessonsGeneralStudies", + "lessonsTotal" + ] + }, + "label": { + "description": "For future use, field's name in the UI", + "type": "string" + }, + "value": { + "type": "string" + }, + "valueType": { + "type": "string", + "enum": [ + "string", + "int", + "bool", + "datetime", + "float", + "double" + ] + } + }, + "required": [ + "ID", + "value", + "valueType" + ] + } + }, + "plannedPremisesArray": { + "description": "Information about several premises, each as one item/array of this array", + "type": "array", + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ID": { + "description": "Identifies the data of the array item", + "type": "string", + "enum": [ + "premiseName", + "postCode", + "isOwnedByCity" + ] + }, + "label": { + "description": "For future use, field's name in the UI", + "type": "string" + }, + "value": { + "type": "string" + }, + "valueType": { + "type": "string", + "enum": [ + "string", + "int", + "bool", + "datetime", + "float", + "double" + ] + } + }, + "required": [ + "ID", + "value", + "valueType" + ] + } + } + }, + "realizedPremisesArray": { + "description": "Information about several premises, each as one item/array of this array", + "type": "array", + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ID": { + "description": "Identifies the data of the array item", + "type": "string", + "enum": [ + "premiseName", + "postCode", + "isOwnedByCity", + "premiseType", + "premiseSuitability", + "citySection" + ] + }, + "label": { + "description": "For future use, field's name in the UI", + "type": "string" + }, + "value": { + "type": "string" + }, + "valueType": { + "type": "string", + "enum": [ + "string", + "int", + "bool", + "datetime", + "float", + "double" + ] + } + }, + "required": [ + "ID", + "value", + "valueType" + ] + } + } + } + } + }, + "activityBasisInfo": { + "description": "'Toiminnan lähtökohdat' section of the application, for KUVA applications", "type": "object", "properties": { "activityBasisArray": { @@ -933,20 +935,20 @@ "bool", "datetime", "float", - "double" + "double" ] } }, "required": [ "ID", - "label", + "label", "value", "valueType" ] } } } - }, + }, "customQuestionsInfo": { "description": "Made for 'Tarkemmat tiedot' but tried to be named generic enough so could be used in other places same as activityBasisInfo but that naming is too specific", "type": "object", @@ -988,7 +990,7 @@ } } } - }, + }, "eventInfoArray": { "description": "'Tapahtuman tiedot' and 'Kustannukset' (which is actually events info in application type 33) section of the application", "type": "array", @@ -1046,7 +1048,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -1096,7 +1098,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -1142,7 +1144,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -1154,40 +1156,40 @@ } } }, - "otherCompensationsInfoArray": { - "description": "Other compensations related information, like total sums of the arrays", - "type": "array", - "items": { - "type": "object", - "properties": { - "ID": { - "description": "Identifies the data of the array item", - "type": "string", - "enum": [ - "otherCompensationsTotal", - "otherAppliedCompensationsTotal" - ] - }, - "label": { - "description": "For future use, field's name in the UI", - "type": "string" - }, - "value": { - "type": "string" - }, - "valueType": { - "type": "string", - "enum": [ - "string", - "int", - "bool", - "datetime", - "float", - "double" - ] - } - } - } + "otherCompensationsInfoArray": { + "description": "Other compensations related information, like total sums of the arrays", + "type": "array", + "items": { + "type": "object", + "properties": { + "ID": { + "description": "Identifies the data of the array item", + "type": "string", + "enum": [ + "otherCompensationsTotal", + "otherAppliedCompensationsTotal" + ] + }, + "label": { + "description": "For future use, field's name in the UI", + "type": "string" + }, + "value": { + "type": "string" + }, + "valueType": { + "type": "string", + "enum": [ + "string", + "int", + "bool", + "datetime", + "float", + "double" + ] + } + } + } } } }, @@ -1230,7 +1232,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -1306,10 +1308,10 @@ "feeCommunity", "lastYearActiveMembersVisits", "lastYearOtherMemberVisits", - "youngPeopleParticipation", + "youngPeopleParticipation", "lastYearYoungPeopleParticipation", - "lastYearYoungPeopleParticipationDigital", - "participation" + "lastYearYoungPeopleParticipationDigital", + "participation" ] }, "label": { @@ -1327,7 +1329,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -1387,7 +1389,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -1410,11 +1412,11 @@ "enum": [ "adultsMale", "adultsFemale", - "adultsOther", + "adultsOther", "adultsAll", "juniorsMale", "juniorsFemale", - "juniorsOther", + "juniorsOther", "juniorsAll" ] }, @@ -1433,7 +1435,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -1477,7 +1479,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -1489,7 +1491,7 @@ } } }, - "hiredOfficialsInfo": { + "hiredOfficialsInfo": { "description": "Additional information for hiredOfficials.", "type": "array", "items": { @@ -1517,7 +1519,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -1564,7 +1566,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -1587,7 +1589,7 @@ "type": "string", "enum": [ "membershipsFeesTotal", - "descriptionOnYoungPeopleParticipation" + "descriptionOnYoungPeopleParticipation" ] }, "label": { @@ -1605,7 +1607,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -1634,48 +1636,48 @@ "enum": [ "adultMale", "adultFemale", - "adultOther", + "adultOther", "adultAll", "juniorMale", "juniorFemale", - "juniorOther", + "juniorOther", "juniorAll", "menGlobal", "menLocal", "womenGlobal", "womenLocal", - "adultOthersGlobal", - "adultOthersLocal", - "seniorMenGlobal", - "seniorMenLocal", - "seniorWomenGlobal", - "seniorWomenLocal", - "seniorOthersGlobal", - "seniorOthersLocal", + "adultOthersGlobal", + "adultOthersLocal", + "seniorMenGlobal", + "seniorMenLocal", + "seniorWomenGlobal", + "seniorWomenLocal", + "seniorOthersGlobal", + "seniorOthersLocal", "boysGlobal", "boysLocal", "girlsGlobal", "girlsLocal", - "juniorOthersGlobal", - "juniorOthersLocal", + "juniorOthersGlobal", + "juniorOthersLocal", "activeFanciersMenGlobal", "activeFanciersMenLocal", "activeFanciersWomenGlobal", "activeFanciersWomenLocal", - "activeFanciersAdultOthersGlobal", - "activeFanciersAdultOthersLocal", + "activeFanciersAdultOthersGlobal", + "activeFanciersAdultOthersLocal", "activeFanciersBoysGlobal", "activeFanciersBoysLocal", "activeFanciersGirlsGlobal", "activeFanciersGirlsLocal", - "activeFanciersJuniorOthersGlobal", + "activeFanciersJuniorOthersGlobal", "activeFanciersJuniorOthersLocal", - "activeFanciersSeniorMenGlobal", + "activeFanciersSeniorMenGlobal", "activeFanciersSeniorMenLocal", "activeFanciersSeniorWomenGlobal", "activeFanciersSeniorWomenLocal", - "activeFanciersSeniorOthersGlobal", - "activeFanciersSeniorOthersLocal", + "activeFanciersSeniorOthersGlobal", + "activeFanciersSeniorOthersLocal", "feeAdults", "feeJuniors", "allCoaches", @@ -1697,7 +1699,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -1721,18 +1723,18 @@ "type": "string", "enum": [ "sectionName", - "sectionOther", + "sectionOther", "men", "women", - "adultOthers", - "seniorMen", - "seniorWomen", - "seniorOthers", + "adultOthers", + "seniorMen", + "seniorWomen", + "seniorOthers", "boys", "girls", - "juniorOthers", + "juniorOthers", "adultHours", - "seniorHours", + "seniorHours", "juniorHours" ] }, @@ -1751,7 +1753,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -1813,13 +1815,13 @@ "bool", "datetime", "float", - "double" + "double" ] } }, "required": [ "ID", - "label", + "label", "value", "valueType" ] @@ -1843,7 +1845,7 @@ "totalSpecialGroupCount", "totalPersonnelCount", "totalRentCosts", - "digitalPremises" + "digitalPremises" ] }, "label": { @@ -1861,13 +1863,13 @@ "bool", "datetime", "float", - "double" + "double" ] } }, "required": [ "ID", - "label", + "label", "value", "valueType" ] @@ -1900,7 +1902,7 @@ "hoursPerDay", "lessorName", "lessorPhone", - "lessorPhoneOrEmail", + "lessorPhoneOrEmail", "lessorAddress", "lessorPostalCode", "lessorPostOffice" @@ -1921,7 +1923,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -1945,7 +1947,7 @@ "enum": [ "rentsInformation", "totalRentCosts", - "extraQuestion" + "extraQuestion" ] }, "label": { @@ -1963,7 +1965,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -2007,7 +2009,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -2041,17 +2043,17 @@ "eventOtherGrantedFrom", "employeeSalaries", "socialSecurityCosts", - "mandatoryAndOptionalPersonelCosts", + "mandatoryAndOptionalPersonelCosts", "travelCosts", - "travelAndTrainingCosts", + "travelAndTrainingCosts", "totalEmployeeCosts", - "otherValuables", - "isPartOfVOS", - "wasPartOfVOS", - "plannedCompensationsShareOfCosts", - "compensationsShareOfCosts", - "selfFinancingDescription", - "selfFinancingAmount" + "otherValuables", + "isPartOfVOS", + "wasPartOfVOS", + "plannedCompensationsShareOfCosts", + "compensationsShareOfCosts", + "selfFinancingDescription", + "selfFinancingAmount" ] }, "label": { @@ -2069,7 +2071,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -2081,497 +2083,497 @@ } }, "incomeGroupsArrayStatic": { - "description": "Each item in this array represents one income group.", - "type": "array", - "items": { - "type": "object", - "properties": { - "incomeGroupName": { - "type":"string", - "enum": [ - "general", - "budgetForProjectAndDevelopment", - "budgetForOperatingAndArtsTeaching" - ] - }, - "incomeRowsArrayStatic": { - "description": "Each item in this array represents one income line. The group in which it belongs in is identified by group name", - "type": "array", - "items": { - "type": "object", - "properties": { - "ID": { - "description": "Identifies the data of the array item", - "type": "string", - "enum": [ - "compensation", - "customerFees", - "donations", - "entryFees", - "otherCompensations", - "sponsorships", - "sales", - "compensationFromCulturalAffairs", - "otherCompensationFromCity", - "otherCompensationType", - "totalIncome", - "incomeWithoutCompensations", - "plannedStateOperativeSubvention", - "plannedOtherCompensations", - "ownFunding", - "financialFundingAndInterests", - "plannedTotalIncome", - "plannedTotalIncomeWithoutSubventions", - "plannedShareOfIncomeWithoutSubventions", - "stateOperativeSubvention", - "totalIncomeWithoutSubventions", - "shareOfIncomeWithoutSubventions" - ] - }, - "label": { - "description": "Field's name in the UI", - "type": "string" - }, - "value": { - "type": "string" - }, - "valueType": { - "type": "string", - "enum": [ - "string", - "int", - "bool", - "datetime", - "float", - "double" - ] - } - }, - "required": [ - "ID", - "label", - "value", - "valueType" - ] - } - }, - "otherIncomeRowsArrayStatic": { - "description": "Each item in this array represents one income line. The group in which it belongs in is identified by group name", - "type": "array", - "items": { - "type": "object", - "properties": { - "ID": { - "description": "Identifies the data of the array item", - "type": "string" - }, - "label": { - "description": "Field's name in the UI", - "type": "string" - }, - "value": { - "type": "string" - }, - "valueType": { - "type": "string", - "enum": [ - "string", - "int", - "bool", - "datetime", - "float", - "double" - ] - } - }, - "required": [ - "ID", - "label", - "value", - "valueType" - ] - } - }, - "groupsTotalSum": { - "type": "number" - } - } - } - }, - "costGroupsArrayStatic": { - "description": "Each item in this array represents one cost group.", - "type": "array", - "items": { - "type": "object", - "properties": { - "costGroupName": { - "type": "string", - "enum": [ - "general", - "budgetForProjectAndDevelopment", - "budgetForOperatingAndArtsTeaching", - "subventionUseCosts", - "costsForServicesAcquired", - "costsForMaterialsSuppliesAndGoods", - "otherCosts", - "useOfCustomerFeeIncome" - ] - }, - "costRowsArrayStatic": { - "description": "Each item in this array represents one cost line of the group.", - "type": "array", - "items": { - "type": "object", - "properties": { - "ID": { - "description": "Identifies the data of the array item", - "type": "string", - "enum": [ - "salaries", - "personnelSocialSecurityCosts", - "rentSum", - "materials", - "transport", - "food", - "pr", - "insurance", - "snacks", - "cleaning", - "premisesService", - "travel", - "heating", - "servicesTotal", - "water", - "electricity", - "suppliesTotal", - "admin", - "accounting", - "health", - "otherCostsTotal", - "services", - "supplies", - "useOfCustomerFeesTotal", - "totalCosts", - "netCosts", - "performerFees", - "otherFees", - "personnelSideCosts", - "generalCosts", - "permits", - "setsAndCostumes", - "equipment", - "premises", - "security", - "marketing", - "costsWithoutDeferredItems", - "generalCostsTotal", - "allCostsTotal", - "showCosts", - "travelCosts", - "transportCosts", - "plannedTotalCosts" - ] - }, - "label": { - "description": "Field's name in the UI", - "type": "string" - }, - "value": { - "type": "string" - }, - "valueType": { - "type": "string", - "enum": [ - "string", - "int", - "bool", - "datetime", - "float", - "double" - ] - } - }, - "required": [ - "ID", - "label", - "value", - "valueType" - ] - } - }, - "otherCostRowsArrayStatic": { - "description": "Each item in this array represents one cost line of the group.", - "type": "array", - "items": { - "type": "object", - "properties": { - "ID": { - "description": "Identifies the data of the array item", - "type": "string" - }, - "label": { - "description": "Field's name in the UI", - "type": "string" - }, - "value": { - "type": "string" - }, - "valueType": { - "type": "string", - "enum": [ - "string", - "int", - "bool", - "datetime", - "float", - "double" - ] - } - }, - "required": [ - "ID", - "label", - "value", - "valueType" - ] - } - }, - "groupsTotalSum": { - "type": "number" - } - } - } - }, - "incomeGroupsArrayDynamic": { - "description": "Each item in this array represents one income group.", - "type": "array", - "items": { - "type": "object", - "properties": { - "incomeGroupName": { - "type":"string" - }, - "incomeRowsArrayDynamic": { - "description": "Each item in this array represents one income line. The group in which it belongs in is identified by group name", - "type": "array", - "items": { - "type": "object", - "properties": { - "ID": { - "description": "Identifies the data of the array item", - "type": "string" - }, - "label": { - "description": "Field's name in the UI", - "type": "string" - }, - "value": { - "type": "string" - }, - "valueType": { - "type": "string", - "enum": [ - "string", - "int", - "bool", - "datetime", - "float", - "double" - ] - } - }, - "required": [ - "ID", - "label", - "value", - "valueType" - ] - } - }, - "otherIncomeGroupName": { - "type":"string" - }, - "otherIncomeRowsArrayDynamic": { - "description": "Each item in this array represents one income line. The group in which it belongs in is identified by group name", - "type": "array", - "items": { - "type": "object", - "properties": { - "ID": { - "description": "Identifies the data of the array item", - "type": "string" - }, - "label": { - "description": "Field's name in the UI", - "type": "string" - }, - "value": { - "type": "string" - }, - "valueType": { - "type": "string", - "enum": [ - "string", - "int", - "bool", - "datetime", - "float", - "double" - ] - } - }, - "required": [ - "ID", - "label", - "value", - "valueType" - ] - } - }, - "groupsTotalSum": { - "type": "number" - } - } - } - }, - "costGroupsArrayDynamic": { - "description": "Each item in this array represents one cost group.", - "type": "array", - "items": { - "type": "object", - "properties": { - "costGroupName": { - "type": "string" - }, - "costRowsArrayDynamic": { - "description": "Each item in this array represents one cost line of the group.", - "type": "array", - "items": { - "type": "object", - "properties": { - "ID": { - "description": "Identifies the data of the array item", - "type": "string" - }, - "label": { - "description": "Field's name in the UI", - "type": "string" - }, - "value": { - "type": "string" - }, - "valueType": { - "type": "string", - "enum": [ - "string", - "int", - "bool", - "datetime", - "float", - "double" - ] - } - }, - "required": [ - "ID", - "label", - "value", - "valueType" - ] - } - }, - "otherCostGroupName": { - "type": "string" - }, - "otherCostRowsArrayDynamic": { - "description": "Each item in this array represents one cost line of the group.", - "type": "array", - "items": { - "type": "object", - "properties": { - "ID": { - "description": "Identifies the data of the array item", - "type": "string" - }, - "label": { - "description": "Field's name in the UI", - "type": "string" - }, - "value": { - "type": "string" - }, - "valueType": { - "type": "string", - "enum": [ - "string", - "int", - "bool", - "datetime", - "float", - "double" - ] - } - }, - "required": [ - "ID", - "label", - "value", - "valueType" - ] - } - }, - "groupsTotalSum": { - "type": "number" - } - } - } - } - } - }, - "invoicesInfo": { - "description": "'Laskut' section of the application", - "type": "object", - "properties": { - "invoicesArray": { - "description": "Information about several invoices, each as one item/array of this array", + "description": "Each item in this array represents one income group.", "type": "array", "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ID": { - "description": "Identifies the data of the array item", - "type": "string", - "enum": [ - "invoiceNumber", - "invoiceDate", - "invoiceSum", - "invoiceCopy" - ] - }, - "label": { - "description": "For future use, field's name in the UI", - "type": "string" - }, - "value": { - "type": "string" - }, - "valueType": { - "type": "string", - "enum": [ - "string", - "int", - "bool", - "datetime", - "float", - "double" - ] - } - }, - "required": [ - "ID", - "value", + "type": "object", + "properties": { + "incomeGroupName": { + "type": "string", + "enum": [ + "general", + "budgetForProjectAndDevelopment", + "budgetForOperatingAndArtsTeaching" + ] + }, + "incomeRowsArrayStatic": { + "description": "Each item in this array represents one income line. The group in which it belongs in is identified by group name", + "type": "array", + "items": { + "type": "object", + "properties": { + "ID": { + "description": "Identifies the data of the array item", + "type": "string", + "enum": [ + "compensation", + "customerFees", + "donations", + "entryFees", + "otherCompensations", + "sponsorships", + "sales", + "compensationFromCulturalAffairs", + "otherCompensationFromCity", + "otherCompensationType", + "totalIncome", + "incomeWithoutCompensations", + "plannedStateOperativeSubvention", + "plannedOtherCompensations", + "ownFunding", + "financialFundingAndInterests", + "plannedTotalIncome", + "plannedTotalIncomeWithoutSubventions", + "plannedShareOfIncomeWithoutSubventions", + "stateOperativeSubvention", + "totalIncomeWithoutSubventions", + "shareOfIncomeWithoutSubventions" + ] + }, + "label": { + "description": "Field's name in the UI", + "type": "string" + }, + "value": { + "type": "string" + }, + "valueType": { + "type": "string", + "enum": [ + "string", + "int", + "bool", + "datetime", + "float", + "double" + ] + } + }, + "required": [ + "ID", + "label", + "value", + "valueType" + ] + } + }, + "otherIncomeRowsArrayStatic": { + "description": "Each item in this array represents one income line. The group in which it belongs in is identified by group name", + "type": "array", + "items": { + "type": "object", + "properties": { + "ID": { + "description": "Identifies the data of the array item", + "type": "string" + }, + "label": { + "description": "Field's name in the UI", + "type": "string" + }, + "value": { + "type": "string" + }, + "valueType": { + "type": "string", + "enum": [ + "string", + "int", + "bool", + "datetime", + "float", + "double" + ] + } + }, + "required": [ + "ID", + "label", + "value", + "valueType" + ] + } + }, + "groupsTotalSum": { + "type": "number" + } + } + } + }, + "costGroupsArrayStatic": { + "description": "Each item in this array represents one cost group.", + "type": "array", + "items": { + "type": "object", + "properties": { + "costGroupName": { + "type": "string", + "enum": [ + "general", + "budgetForProjectAndDevelopment", + "budgetForOperatingAndArtsTeaching", + "subventionUseCosts", + "costsForServicesAcquired", + "costsForMaterialsSuppliesAndGoods", + "otherCosts", + "useOfCustomerFeeIncome" + ] + }, + "costRowsArrayStatic": { + "description": "Each item in this array represents one cost line of the group.", + "type": "array", + "items": { + "type": "object", + "properties": { + "ID": { + "description": "Identifies the data of the array item", + "type": "string", + "enum": [ + "salaries", + "personnelSocialSecurityCosts", + "rentSum", + "materials", + "transport", + "food", + "pr", + "insurance", + "snacks", + "cleaning", + "premisesService", + "travel", + "heating", + "servicesTotal", + "water", + "electricity", + "suppliesTotal", + "admin", + "accounting", + "health", + "otherCostsTotal", + "services", + "supplies", + "useOfCustomerFeesTotal", + "totalCosts", + "netCosts", + "performerFees", + "otherFees", + "personnelSideCosts", + "generalCosts", + "permits", + "setsAndCostumes", + "equipment", + "premises", + "security", + "marketing", + "costsWithoutDeferredItems", + "generalCostsTotal", + "allCostsTotal", + "showCosts", + "travelCosts", + "transportCosts", + "plannedTotalCosts" + ] + }, + "label": { + "description": "Field's name in the UI", + "type": "string" + }, + "value": { + "type": "string" + }, + "valueType": { + "type": "string", + "enum": [ + "string", + "int", + "bool", + "datetime", + "float", + "double" + ] + } + }, + "required": [ + "ID", + "label", + "value", + "valueType" + ] + } + }, + "otherCostRowsArrayStatic": { + "description": "Each item in this array represents one cost line of the group.", + "type": "array", + "items": { + "type": "object", + "properties": { + "ID": { + "description": "Identifies the data of the array item", + "type": "string" + }, + "label": { + "description": "Field's name in the UI", + "type": "string" + }, + "value": { + "type": "string" + }, + "valueType": { + "type": "string", + "enum": [ + "string", + "int", + "bool", + "datetime", + "float", + "double" + ] + } + }, + "required": [ + "ID", + "label", + "value", + "valueType" + ] + } + }, + "groupsTotalSum": { + "type": "number" + } + } + } + }, + "incomeGroupsArrayDynamic": { + "description": "Each item in this array represents one income group.", + "type": "array", + "items": { + "type": "object", + "properties": { + "incomeGroupName": { + "type": "string" + }, + "incomeRowsArrayDynamic": { + "description": "Each item in this array represents one income line. The group in which it belongs in is identified by group name", + "type": "array", + "items": { + "type": "object", + "properties": { + "ID": { + "description": "Identifies the data of the array item", + "type": "string" + }, + "label": { + "description": "Field's name in the UI", + "type": "string" + }, + "value": { + "type": "string" + }, + "valueType": { + "type": "string", + "enum": [ + "string", + "int", + "bool", + "datetime", + "float", + "double" + ] + } + }, + "required": [ + "ID", + "label", + "value", + "valueType" + ] + } + }, + "otherIncomeGroupName": { + "type": "string" + }, + "otherIncomeRowsArrayDynamic": { + "description": "Each item in this array represents one income line. The group in which it belongs in is identified by group name", + "type": "array", + "items": { + "type": "object", + "properties": { + "ID": { + "description": "Identifies the data of the array item", + "type": "string" + }, + "label": { + "description": "Field's name in the UI", + "type": "string" + }, + "value": { + "type": "string" + }, + "valueType": { + "type": "string", + "enum": [ + "string", + "int", + "bool", + "datetime", + "float", + "double" + ] + } + }, + "required": [ + "ID", + "label", + "value", + "valueType" + ] + } + }, + "groupsTotalSum": { + "type": "number" + } + } + } + }, + "costGroupsArrayDynamic": { + "description": "Each item in this array represents one cost group.", + "type": "array", + "items": { + "type": "object", + "properties": { + "costGroupName": { + "type": "string" + }, + "costRowsArrayDynamic": { + "description": "Each item in this array represents one cost line of the group.", + "type": "array", + "items": { + "type": "object", + "properties": { + "ID": { + "description": "Identifies the data of the array item", + "type": "string" + }, + "label": { + "description": "Field's name in the UI", + "type": "string" + }, + "value": { + "type": "string" + }, + "valueType": { + "type": "string", + "enum": [ + "string", + "int", + "bool", + "datetime", + "float", + "double" + ] + } + }, + "required": [ + "ID", + "label", + "value", + "valueType" + ] + } + }, + "otherCostGroupName": { + "type": "string" + }, + "otherCostRowsArrayDynamic": { + "description": "Each item in this array represents one cost line of the group.", + "type": "array", + "items": { + "type": "object", + "properties": { + "ID": { + "description": "Identifies the data of the array item", + "type": "string" + }, + "label": { + "description": "Field's name in the UI", + "type": "string" + }, + "value": { + "type": "string" + }, + "valueType": { + "type": "string", + "enum": [ + "string", + "int", + "bool", + "datetime", + "float", + "double" + ] + } + }, + "required": [ + "ID", + "label", + "value", + "valueType" + ] + } + }, + "groupsTotalSum": { + "type": "number" + } + } + } + } + } + }, + "invoicesInfo": { + "description": "'Laskut' section of the application", + "type": "object", + "properties": { + "invoicesArray": { + "description": "Information about several invoices, each as one item/array of this array", + "type": "array", + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ID": { + "description": "Identifies the data of the array item", + "type": "string", + "enum": [ + "invoiceNumber", + "invoiceDate", + "invoiceSum", + "invoiceCopy" + ] + }, + "label": { + "description": "For future use, field's name in the UI", + "type": "string" + }, + "value": { + "type": "string" + }, + "valueType": { + "type": "string", + "enum": [ + "string", + "int", + "bool", + "datetime", + "float", + "double" + ] + } + }, + "required": [ + "ID", + "value", "valueType" ] } @@ -2591,7 +2593,7 @@ "enum": [ "projectName", "goal", - "content", + "content", "startDate", "endDate", "location", @@ -2599,9 +2601,9 @@ "membersLocal", "membersYoungest", "membersOldest", - "age7to28yearsLocal", - "all", - "extraQuestion" + "age7to28yearsLocal", + "all", + "extraQuestion" ] }, "label": { @@ -2619,7 +2621,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -2666,7 +2668,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -2761,7 +2763,7 @@ "bool", "datetime", "float", - "double" + "double" ] } }, @@ -2822,23 +2824,23 @@ "eventSource": { "type": "string" }, - "eventID": { - "type": "string" - }, - "eventTarget": { - "type": "string" - }, + "eventID": { + "type": "string" + }, + "eventTarget": { + "type": "string" + }, "timeUpdated": { "type": "string", "format": "date-time" }, - "timeCreated": { - "type": "string", - "format": "date-time" - }, - "eventDescription": { - "type": "string" - } + "timeCreated": { + "type": "string", + "format": "date-time" + }, + "eventDescription": { + "type": "string" + } } } }, @@ -2850,9 +2852,9 @@ "caseID": { "type": "string" }, - "messageID": { - "type": "string" - }, + "messageID": { + "type": "string" + }, "body": { "type": "string" }, diff --git a/docker/openshift/crons/pubsub.sh b/docker/openshift/crons/pubsub.sh index 7589ed46fa..2bbf674454 100644 --- a/docker/openshift/crons/pubsub.sh +++ b/docker/openshift/crons/pubsub.sh @@ -9,7 +9,7 @@ echo "Running PubSub daemon: $(date +'%Y-%m-%dT%H:%M:%S%:z')" while true do - # PubSub process exists with success return code after + # PubSub process exits with success return code after # certain number of messages and should then be restarted. drush helfi:azure:pubsub-listen || exit 1 done diff --git a/e2e/README.md b/e2e/README.md index fc6ee6ca85..9bab60d8c1 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -187,6 +187,11 @@ To run all tests in headed mode (displays a browser): npx playwright test --headed ``` +To exit on first error: +``` +npx playwright test -x +``` + To run a specific set of tests. Available sets (projects) can be found in `playwright.config.ts`: ``` npx playwright test --project {NAME_OF_PROJECT} @@ -206,10 +211,14 @@ Example 1: npx playwright test --project forms-48 --headed Example 2: npx playwright test --project forms-48-registered --headed - Example 3: npx playwright test --project forms-all --headed ``` +To run a specific set of tests in headed mode with a slow-motion feature that pauses for one second before entering data: +``` +SLOWMO=true npx playwright test --project {NAME_OF_PROJECT} --headed +``` + Other command line options that can be utilized when running the test on your local machine can be found [here](https://playwright.dev/docs/test-cli). ### Deleting applications from your local env diff --git a/e2e/package-lock.json b/e2e/package-lock.json index 5c07515962..e1e24d6a2e 100644 --- a/e2e/package-lock.json +++ b/e2e/package-lock.json @@ -9,18 +9,18 @@ "version": "1.0.0", "license": "ISC", "devDependencies": { - "@faker-js/faker": "^8.3.1", + "@faker-js/faker": "^8.4.1", "@playwright/test": "^1.48.0", "@types/lodash.clonedeep": "^4.5.9", - "@types/node": "^20.11.7", - "dotenv": "^16.4.1", + "@types/node": "^20.16.11", + "dotenv": "^16.4.5", "lodash.clonedeep": "^4.5.0" } }, "node_modules/@faker-js/faker": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.3.1.tgz", - "integrity": "sha512-FdgpFxY6V6rLZE9mmIBb9hM0xpfvQOSNOLnzolzKwsE1DH+gC7lEKV1p1IbR0lAYyvYd5a4u3qWJzowUkw1bIw==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", + "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", "dev": true, "funding": [ { @@ -28,6 +28,7 @@ "url": "https://opencollective.com/fakerjs" } ], + "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", "npm": ">=6.14.13" @@ -65,24 +66,26 @@ } }, "node_modules/@types/node": { - "version": "20.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.7.tgz", - "integrity": "sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A==", + "version": "20.16.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.11.tgz", + "integrity": "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/dotenv": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz", - "integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/fsevents": { @@ -139,10 +142,11 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" } } } diff --git a/e2e/package.json b/e2e/package.json index 98ce4905cf..17237d3fdc 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -12,11 +12,11 @@ "author": "", "license": "ISC", "devDependencies": { - "@faker-js/faker": "^8.3.1", + "@faker-js/faker": "^8.4.1", "@playwright/test": "^1.48.0", "@types/lodash.clonedeep": "^4.5.9", - "@types/node": "^20.11.7", - "dotenv": "^16.4.1", + "@types/node": "^20.16.11", + "dotenv": "^16.4.5", "lodash.clonedeep": "^4.5.0" } } diff --git a/e2e/playwright.config.ts b/e2e/playwright.config.ts index d2f0bb37d8..6b4c52049f 100644 --- a/e2e/playwright.config.ts +++ b/e2e/playwright.config.ts @@ -32,6 +32,9 @@ export default defineConfig({ }, /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: 'on-first-retry', + launchOptions: { + slowMo: process.env.SLOWMO ? 1_000 : 0, + }, }, // For expect calls expect: { @@ -300,5 +303,11 @@ export default defineConfig({ testMatch: '/forms/registered_community_69.ts', dependencies: ['profile-registered_community'] }, + /* Form 70 tests. */ + { + name: 'forms-70', + testMatch: '/forms/registered_community_70.ts', + dependencies: ['profile-registered_community'] + }, ], }); diff --git a/e2e/tests/forms/registered_community_70.ts b/e2e/tests/forms/registered_community_70.ts new file mode 100644 index 0000000000..7cf4564c31 --- /dev/null +++ b/e2e/tests/forms/registered_community_70.ts @@ -0,0 +1,125 @@ +import {Page, test} from '@playwright/test'; +import {FormData, PageHandlers, FormPage} from "../../utils/data/test_data"; +import {fillHakijanTiedotRegisteredCommunity} from "../../utils/form_helpers"; +import {fillFormField} from "../../utils/input_helpers"; +import {generateTests} from "../../utils/test_generator_helpers"; +import {Role, selectRole} from "../../utils/auth_helpers"; +import {registeredCommunityApplications as applicationData} from '../../utils/data/application_data'; + +const formPages: PageHandlers = { + '1_hakijan_tiedot': async (page: Page, {items}: FormPage) => { + await fillHakijanTiedotRegisteredCommunity(items, page); + }, + '2_avustustiedot': async (page: Page, {items}: FormPage) => { + + if (items['edit-acting-year']) { + await fillFormField(page, items['edit-acting-year'], 'edit-acting-year'); + } + + // Kulttuurin erityisavustus 1 + if (items['edit-subventions-items-0-amount']) { + await page.locator('#edit-subventions-items-0-amount') + .fill(items['edit-subventions-items-0-amount'].value ?? ''); + } + + // Liikunnan erityisavustus 1. + if (items['edit-subventions-items-1-amount']) { + // Using the items['edit-subventions-items-0-amount'].value doesn't seem + // to work as expected. Use + await page.locator('#edit-subventions-items-1-amount') + .fill(items['edit-subventions-items-1-amount'].value ?? ''); + } + + if (items['edit-compensation-purpose']) { + await page.getByRole('textbox', {name: 'Lyhyt kuvaus haettavan / haettavien avustusten käyttötarkoituksista'}) + .fill(items['edit-compensation-purpose'].value ?? ''); + } + + if (items['edit-myonnetty-avustus']) { + await fillFormField(page, items['edit-myonnetty-avustus'], 'edit-myonnetty-avustus') + } + + if (items['edit-haettu-avustus-tieto']) { + await fillFormField(page, items['edit-haettu-avustus-tieto'], 'edit-haettu-avustus-tieto') + } + }, + '3_tarkemmat_tiedot': async (page: Page, {items}: FormPage) => { + + const skipItems = [ + 'edit-hankkeen-toimenpiteet-alkupvm', + 'edit-hankkeen-toimenpiteet-loppupvm', + 'edit-ensisijainen-taiteen-ala', + ]; + + // Loop all items from page 3. + for (const [itemKey, item] of Object.entries(items)) { + // Skip the date fields and the select list, and handle them separately. + if (skipItems.includes(itemKey)) { + continue; + } + await fillFormField(page, item, itemKey); + } + + // Handle the "taiteenala" select list separately. + if (items['edit-ensisijainen-taiteen-ala']) { + await page.selectOption('select#edit-ensisijainen-taiteen-ala', + items['edit-ensisijainen-taiteen-ala'].value ?? ''); + } + + // Handle date fields separately. + if (items['edit-hankkeen-toimenpiteet-alkupvm']) { + await page.getByLabel('Alkupäivämäärä') + .fill(items['edit-hankkeen-toimenpiteet-alkupvm'].value ?? ''); + } + + if (items['edit-hankkeen-toimenpiteet-loppupvm']) { + await page.getByLabel('Loppupäivämäärä') + .fill(items['edit-hankkeen-toimenpiteet-loppupvm'].value ?? ''); + } + }, + '4_talousarvio': async (page: Page, {items}: FormPage) => { + + // Loop all items from page 4. + for (const [itemKey, item] of Object.entries(items)) { + await fillFormField(page, item, itemKey); + } + }, + 'lisatiedot_ja_liitteet': async (page: Page, {items}: FormPage) => { + + // Loop all items from page 5. + for (const [itemKey, item] of Object.entries(items)) { + await fillFormField(page, item, itemKey); + } + }, + 'webform_preview': async (page: Page, {items}: FormPage) => { + if (items['accept_terms_1']) { + // Check data on confirmation page + await page.getByLabel('Vakuutamme, että hakemuksessa ja sen liitteissä antamamme tiedot ovat oikeita, ja hyväksymme avustusehdot').check(); + } + }, +}; + +test.describe('KUVAERILLIS(70)', () => { + let page: Page; + + const profileType = 'registered_community'; + const formId = '70'; + + test.beforeAll(async ({browser}) => { + page = await browser.newPage(); + await selectRole(page, profileType.toUpperCase() as Role); + }); + + test.afterAll(async() => { + await page.close(); + }); + + const testDataArray: [string, FormData][] = Object.entries(applicationData[formId]); + const tests = generateTests(profileType, formId, formPages, testDataArray); + + for (const { testName, testFunction } of tests) { + test(testName, async ({browser}) => { + await testFunction(page, browser); + }); + } +}); diff --git a/e2e/utils/copying_helpers.ts b/e2e/utils/copying_helpers.ts index fa20439edd..2a293a4c0b 100644 --- a/e2e/utils/copying_helpers.ts +++ b/e2e/utils/copying_helpers.ts @@ -117,13 +117,13 @@ const makeApplicationCopy = async ( logger(`Navigated to: ${viewPageURL}.`); // Make sure we get there. - const applicationIdContainer = await page.locator('.webform-submission__application_id'); + const applicationIdContainer = page.locator('.webform-submission__application_id'); const applicationIdContainerText = await applicationIdContainer.textContent(); expect(applicationIdContainerText).toContain(originalApplicationId); // Make sure the application can be copied. If not, skip this test. - const isCopyApplicationButtonVisible = await page.locator('#copy-application-modal-form-link').isVisible(); - if (!isCopyApplicationButtonVisible) { + const copyApplicationDialogButton = page.locator('#copy-application-button'); + if (!await copyApplicationDialogButton.isVisible()) { logger(`Copying disabled for application: ${originalApplicationId}. Skipping test.`); test.skip(true, 'Skip copy test'); } @@ -131,8 +131,23 @@ const makeApplicationCopy = async ( // Copy the original application. logger(`Copying application: ${originalApplicationId}...`); - await page.locator('#copy-application-modal-form-link').click(); - await page.locator('#copy-application-modal-form-submit').click(); + // click the copy button + await copyApplicationDialogButton.click(); + + const dialogSelector = '.dialog.application-copy-dialog'; + const actionButtonSelector = '#helfi-dialog__action-button'; + + // Wait for the dialog to appear + await page.waitForSelector(dialogSelector); + + // Check if the dialog is visible + const isDialogVisible = await page.locator(dialogSelector).isVisible(); + + // Assert that the dialog is visible + expect(isDialogVisible).toBe(true); + + // Click the action button within the specific dialog + await page.locator(`${dialogSelector} ${actionButtonSelector}`).click(); // Wait for a redirect to the new application and store the new application ID and submission URL. await logCurrentUrl(page); diff --git a/e2e/utils/data/application/application_data_29.ts b/e2e/utils/data/application/application_data_29.ts index eeeb460899..e56bb7ce9a 100644 --- a/e2e/utils/data/application/application_data_29.ts +++ b/e2e/utils/data/application/application_data_29.ts @@ -155,7 +155,7 @@ const baseForm_29: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -207,7 +207,7 @@ const baseForm_29: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -287,7 +287,7 @@ const baseForm_29: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -339,7 +339,7 @@ const baseForm_29: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -400,7 +400,7 @@ const baseForm_29: FormData = { value: faker.number.float({ min: 100, max: 1000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -408,7 +408,7 @@ const baseForm_29: FormData = { value: faker.number.float({ min: 100, max: 1000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, diff --git a/e2e/utils/data/application/application_data_48.ts b/e2e/utils/data/application/application_data_48.ts index dcddaa3685..0cabf7efc1 100644 --- a/e2e/utils/data/application/application_data_48.ts +++ b/e2e/utils/data/application/application_data_48.ts @@ -179,7 +179,7 @@ const baseForm_48: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -231,7 +231,7 @@ const baseForm_48: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -287,7 +287,7 @@ const baseForm_48: FormData = { value: faker.number.float({ min: 1, max: 100, - precision: 2 + multipleOf: 2 }).toString(), }, "edit-osa-aikainen-henkilosto": { @@ -299,7 +299,7 @@ const baseForm_48: FormData = { value: faker.number.float({ min: 1, max: 100, - precision: 2 + multipleOf: 2 }).toString(), }, "edit-vapaaehtoinen-henkilosto": { @@ -1116,7 +1116,7 @@ const sendApplication: FormDataWithRemoveOptionalProps = { const registeredCommunityApplications_48 = { draft: baseForm_48, copy: createFormData(baseForm_48, copyForm), - // swap_fields: createFormData(baseForm_48, fieldSwapForm), + swap_fields: createFormData(baseForm_48, fieldSwapForm), missing_values: createFormData(baseForm_48, missingValues), wrong_email: createFormData(baseForm_48, wrongEmail), wrong_email_2: createFormData(baseForm_48, wrongEmail2), diff --git a/e2e/utils/data/application/application_data_49.ts b/e2e/utils/data/application/application_data_49.ts index e6800b1b14..c37dde4c0b 100644 --- a/e2e/utils/data/application/application_data_49.ts +++ b/e2e/utils/data/application/application_data_49.ts @@ -205,7 +205,7 @@ const baseForm_49: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -257,7 +257,7 @@ const baseForm_49: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, diff --git a/e2e/utils/data/application/application_data_51.ts b/e2e/utils/data/application/application_data_51.ts index 4703024689..b8749458eb 100644 --- a/e2e/utils/data/application/application_data_51.ts +++ b/e2e/utils/data/application/application_data_51.ts @@ -146,7 +146,7 @@ const baseFormRegisteredCommunity_51: FormData = { // value: faker.number.float({ // min: 1000, // max: 10000, - // precision: 2 + // multipleOf: 2 // }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -198,7 +198,7 @@ const baseFormRegisteredCommunity_51: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -260,7 +260,7 @@ const baseFormRegisteredCommunity_51: FormData = { value: faker.number.float({ min: 100, max: 1000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -268,7 +268,7 @@ const baseFormRegisteredCommunity_51: FormData = { value: faker.number.float({ min: 100, max: 1000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, diff --git a/e2e/utils/data/application/application_data_52.ts b/e2e/utils/data/application/application_data_52.ts index 69bbba8703..da9e3878df 100644 --- a/e2e/utils/data/application/application_data_52.ts +++ b/e2e/utils/data/application/application_data_52.ts @@ -140,7 +140,7 @@ const baseFormRegisteredCommunity_52: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -192,7 +192,7 @@ const baseFormRegisteredCommunity_52: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -363,7 +363,7 @@ const baseFormRegisteredCommunity_52: FormData = { value: faker.number.float({ min: 100, max: 1000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency }, @@ -1332,7 +1332,7 @@ const registeredCommunityApplications_52 = { draft: baseFormRegisteredCommunity_52, missing_values: createFormData(baseFormRegisteredCommunity_52, missingValues), wrong_values: createFormData(baseFormRegisteredCommunity_52, wrongValues), - // swap_fields: createFormData(baseFormRegisteredCommunity_52, fieldSwapForm), + swap_fields: createFormData(baseFormRegisteredCommunity_52, fieldSwapForm), success: createFormData(baseFormRegisteredCommunity_52, sendApplication), } diff --git a/e2e/utils/data/application/application_data_54.ts b/e2e/utils/data/application/application_data_54.ts index 7c3bbebc84..3265cc7497 100644 --- a/e2e/utils/data/application/application_data_54.ts +++ b/e2e/utils/data/application/application_data_54.ts @@ -159,7 +159,7 @@ const baseFormRegisteredCommunity_54: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -211,7 +211,7 @@ const baseFormRegisteredCommunity_54: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -292,7 +292,7 @@ const baseFormRegisteredCommunity_54: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -344,7 +344,7 @@ const baseFormRegisteredCommunity_54: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -411,7 +411,7 @@ const baseFormRegisteredCommunity_54: FormData = { value: faker.number.float({ min: 100, max: 1000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -419,7 +419,7 @@ const baseFormRegisteredCommunity_54: FormData = { value: faker.number.float({ min: 100, max: 1000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, diff --git a/e2e/utils/data/application/application_data_57.ts b/e2e/utils/data/application/application_data_57.ts index 8a2a6bed9b..968ef4df42 100644 --- a/e2e/utils/data/application/application_data_57.ts +++ b/e2e/utils/data/application/application_data_57.ts @@ -155,7 +155,7 @@ const baseFormRegisteredCommunity_57: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -207,7 +207,7 @@ const baseFormRegisteredCommunity_57: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -288,7 +288,7 @@ const baseFormRegisteredCommunity_57: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -340,7 +340,7 @@ const baseFormRegisteredCommunity_57: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, diff --git a/e2e/utils/data/application/application_data_60.ts b/e2e/utils/data/application/application_data_60.ts index d1ee776eb8..a5c02811d6 100644 --- a/e2e/utils/data/application/application_data_60.ts +++ b/e2e/utils/data/application/application_data_60.ts @@ -168,7 +168,7 @@ const baseFormRegisteredCommunity_60: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -220,7 +220,7 @@ const baseFormRegisteredCommunity_60: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, diff --git a/e2e/utils/data/application/application_data_61.ts b/e2e/utils/data/application/application_data_61.ts index fe5db8dc34..fb2b008534 100644 --- a/e2e/utils/data/application/application_data_61.ts +++ b/e2e/utils/data/application/application_data_61.ts @@ -138,7 +138,7 @@ const baseFormRegisteredCommunity_61: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -190,7 +190,7 @@ const baseFormRegisteredCommunity_61: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -256,7 +256,7 @@ const baseFormRegisteredCommunity_61: FormData = { value: faker.number.float({ min: 100, max: 1000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -264,7 +264,7 @@ const baseFormRegisteredCommunity_61: FormData = { value: faker.number.float({ min: 100, max: 1000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, diff --git a/e2e/utils/data/application/application_data_62.ts b/e2e/utils/data/application/application_data_62.ts index 03e9e0bdcd..ccf930a737 100644 --- a/e2e/utils/data/application/application_data_62.ts +++ b/e2e/utils/data/application/application_data_62.ts @@ -145,7 +145,7 @@ const baseFormRegisteredCommunity_62: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -197,7 +197,7 @@ const baseFormRegisteredCommunity_62: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -278,7 +278,7 @@ const baseFormRegisteredCommunity_62: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -330,7 +330,7 @@ const baseFormRegisteredCommunity_62: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, diff --git a/e2e/utils/data/application/application_data_63.ts b/e2e/utils/data/application/application_data_63.ts index b212784333..30f24eaa0c 100644 --- a/e2e/utils/data/application/application_data_63.ts +++ b/e2e/utils/data/application/application_data_63.ts @@ -145,7 +145,7 @@ const baseFormRegisteredCommunity_63: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -197,7 +197,7 @@ const baseFormRegisteredCommunity_63: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -278,7 +278,7 @@ const baseFormRegisteredCommunity_63: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -330,7 +330,7 @@ const baseFormRegisteredCommunity_63: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, diff --git a/e2e/utils/data/application/application_data_67.ts b/e2e/utils/data/application/application_data_67.ts index a27923986f..52675d8a4c 100644 --- a/e2e/utils/data/application/application_data_67.ts +++ b/e2e/utils/data/application/application_data_67.ts @@ -140,7 +140,7 @@ const baseFormRegisteredCommunity_67: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -192,7 +192,7 @@ const baseFormRegisteredCommunity_67: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -272,7 +272,7 @@ const baseFormRegisteredCommunity_67: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -324,7 +324,7 @@ const baseFormRegisteredCommunity_67: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, diff --git a/e2e/utils/data/application/application_data_68.ts b/e2e/utils/data/application/application_data_68.ts index 0e43e5ea77..7187075095 100644 --- a/e2e/utils/data/application/application_data_68.ts +++ b/e2e/utils/data/application/application_data_68.ts @@ -157,7 +157,7 @@ const baseFormRegisteredCommunity_68: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -209,7 +209,7 @@ const baseFormRegisteredCommunity_68: FormData = { value: faker.number.float({ min: 1000, max: 10000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -264,7 +264,7 @@ const baseFormRegisteredCommunity_68: FormData = { value: faker.number.float({ min: 100, max: 1000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, @@ -272,7 +272,7 @@ const baseFormRegisteredCommunity_68: FormData = { value: faker.number.float({ min: 100, max: 1000, - precision: 2 + multipleOf: 2 }).toString(), viewPageFormatter: viewPageFormatCurrency, }, diff --git a/e2e/utils/data/application/application_data_70.ts b/e2e/utils/data/application/application_data_70.ts new file mode 100644 index 0000000000..50345825b0 --- /dev/null +++ b/e2e/utils/data/application/application_data_70.ts @@ -0,0 +1,1144 @@ +import {FormData, FormDataWithRemoveOptionalProps} from '../test_data'; +import {fakerFI as faker} from '@faker-js/faker' +import {PROFILE_INPUT_DATA} from '../profile_input_data'; +import {ATTACHMENTS} from '../attachment_data'; +import {createFormData} from '../../form_data_helpers'; +import { + viewPageFormatAddress, + viewPageFormatBoolean, + viewPageFormatCurrency, + viewPageFormatDate, + viewPageFormatFilePath, + viewPageFormatLowerCase, + viewPageFormatNumber +} from '../../view_page_formatters'; +import {getFakeEmailAddress} from '../../field_helpers'; + +/** + * Basic form data for successful save as a draft + */ +const baseForm_70: FormData = { + title: 'Save as draft.', + formSelector: 'webform-submission-iakkaiden-kulttuuri-ja-liikunta-form', + formPath: '/fi/form/iakkaiden-kulttuuri-ja-liikunta', + formPages: { + '1_hakijan_tiedot': { + items: { + 'edit-email': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-email', + }, + value: getFakeEmailAddress(), + viewPageFormatter: viewPageFormatLowerCase, + }, + 'edit-contact-person': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-contact-person', + }, + value: faker.person.fullName(), + }, + 'edit-contact-person-phone-number': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-contact-person-phone-number', + }, + value: faker.phone.number(), + }, + 'edit-bank-account-account-number-select': { + role: 'select', + value: PROFILE_INPUT_DATA.iban, + viewPageSelector: '.form-item-bank-account', + }, + 'edit-community-address-community-address-select': { + value: `${PROFILE_INPUT_DATA.address}, ${PROFILE_INPUT_DATA.zipCode}, ${PROFILE_INPUT_DATA.city}`, + viewPageSelector: '.form-item-community-address', + viewPageFormatter: viewPageFormatAddress + }, + 'edit-community-officials-items-0-item-community-officials-select': { + role: 'select', + viewPageSelector: '.form-item-community-officials', + value: PROFILE_INPUT_DATA.communityOfficial, + }, + 'nextbutton': { + role: 'button', + selector: { + type: 'form-topnavi-link', + name: 'data-drupal-selector', + value: '2_avustustiedot', + }, + viewPageSkipValidation: true, + }, + }, + }, + '2_avustustiedot': { + items: { + 'edit-acting-year': { + role: 'select', + selector: { + type: 'dom-id-first', + name: '', + value: '#edit-acting-year', + }, + viewPageSkipValidation: true, + }, + 'edit-subventions-items-0-amount': { + role: 'number-input', + value: '5709,98', + viewPageSelector: '.form-item-subventions', + viewPageFormatter: viewPageFormatCurrency + }, + 'edit-compensation-purpose': { + value: faker.lorem.sentences(4), + }, + 'edit-myonnetty-avustus': { + role: 'dynamicmultivalue', + label: '', + dynamic_multi: { + radioSelector: { + type: 'dom-id-label', + name: 'data-drupal-selector', + value: 'edit-olemme-saaneet-muita-avustuksia-1', + }, + revealedElementSelector: { + type: 'dom-id', + name: '', + value: '#edit-myonnetty-avustus', + }, + multi: { + buttonSelector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-myonnetty-avustus-add-submit', + resultValue: 'edit-myonnetty-avustus-items-[INDEX]', + }, + //@ts-ignore + items: { + 0: [ + { + role: 'select', + selector: { + type: 'by-label', + name: '', + value: 'edit-myonnetty-avustus-items-[INDEX]-item-issuer', + }, + value: 'Valtio', + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-myonnetty-avustus-items-[INDEX]-item-issuer-name', + }, + value: faker.lorem.words(2).toUpperCase(), + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-myonnetty-avustus-items-[INDEX]-item-year', + }, + value: faker.date.past().getFullYear().toString(), + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector-sequential', + name: 'data-drupal-selector-sequential', + value: 'edit-myonnetty-avustus-items-[INDEX]-item-amount', + }, + value: faker.number.float({ + min: 1000, + max: 10000, + multipleOf: 2 + }).toString(), + viewPageFormatter: viewPageFormatCurrency, + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-myonnetty-avustus-items-[INDEX]-item-purpose', + }, + value: faker.lorem.words(30), + }, + ], + 1: [ + { + role: 'select', + selector: { + type: 'by-label', + name: '', + value: 'edit-myonnetty-avustus-items-[INDEX]-item-issuer', + }, + value: 'EU', + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-myonnetty-avustus-items-[INDEX]-item-issuer-name', + }, + value: faker.lorem.words(2).toUpperCase(), + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-myonnetty-avustus-items-[INDEX]-item-year', + }, + value: faker.date.past().getFullYear().toString(), + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector-sequential', + name: 'data-drupal-selector-sequential', + value: 'edit-myonnetty-avustus-items-[INDEX]-item-amount', + }, + value: faker.number.float({ + min: 1000, + max: 10000, + multipleOf: 2 + }).toString(), + viewPageFormatter: viewPageFormatCurrency, + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-myonnetty-avustus-items-[INDEX]-item-purpose', + }, + value: faker.lorem.words(30), + }, + ], + }, + expectedErrors: {} + } + }, + }, + 'edit-haettu-avustus-tieto': { + role: 'dynamicmultivalue', + label: '', + dynamic_multi: { + radioSelector: { + type: 'dom-id-label', + name: 'data-drupal-selector', + value: 'edit-olemme-hakeneet-avustuksia-muualta-kuin-helsingin-kaupungilta-1', + }, + revealedElementSelector: { + type: 'dom-id', + name: '', + value: '#edit-haettu-avustus-tieto', + }, + multi: { + buttonSelector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-haettu-avustus-tieto-add-submit', + resultValue: 'edit-haettu-avustus-tieto-items-[INDEX]', + }, + //@ts-ignore + items: { + 0: [ + { + role: 'select', + selector: { + type: 'by-label', + name: '', + value: 'edit-haettu-avustus-tieto-items-[INDEX]-item-issuer', + }, + value: 'Muu', + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-haettu-avustus-tieto-items-[INDEX]-item-issuer-name', + }, + value: faker.lorem.words(2).toUpperCase(), + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-haettu-avustus-tieto-items-[INDEX]-item-year', + }, + value: faker.date.past().getFullYear().toString(), + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector-sequential', + name: 'data-drupal-selector-sequential', + value: 'edit-haettu-avustus-tieto-items-[INDEX]-item-amount', + }, + value: faker.number.float({ + min: 1000, + max: 10000, + multipleOf: 2 + }).toString(), + viewPageFormatter: viewPageFormatCurrency, + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-haettu-avustus-tieto-items-[INDEX]-item-purpose', + }, + value: faker.lorem.words(30), + }, + ], + 1: [ + { + role: 'select', + selector: { + type: 'by-label', + name: '', + value: 'edit-haettu-avustus-tieto-items-[INDEX]-item-issuer', + }, + value: 'Säätiö', + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-haettu-avustus-tieto-items-[INDEX]-item-issuer-name', + }, + value: faker.lorem.words(2).toUpperCase(), + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-haettu-avustus-tieto-items-[INDEX]-item-year', + }, + value: faker.date.past().getFullYear().toString(), + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector-sequential', + name: 'data-drupal-selector-sequential', + value: 'edit-haettu-avustus-tieto-items-[INDEX]-item-amount', + }, + value: faker.number.float({ + min: 1000, + max: 10000, + multipleOf: 2 + }).toString(), + viewPageFormatter: viewPageFormatCurrency, + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-haettu-avustus-tieto-items-[INDEX]-item-purpose', + }, + value: faker.lorem.words(30), + }, + ], + }, + expectedErrors: {} + } + }, + }, + 'nextbutton': { + role: 'button', + selector: { + type: 'form-topnavi-link', + name: 'data-drupal-selector', + value: '3_tarkemmat_tiedot', + } + }, + }, + }, + '3_tarkemmat_tiedot': { + items: { + 'edit-hankesuunnitelma-radios-0': { + role: 'radio', + selector: { + type: 'dom-id-label', + name: 'data-drupal-selector', + value: 'edit-hankesuunnitelma-radios-0', + }, + value: 'Ei', + viewPageFormatter: viewPageFormatBoolean + }, + 'edit-ensisijainen-taiteen-ala': { + role: 'select', + viewPageSelector: '.form-item-ensisijainen-taiteen-ala', + value: 'Kirjallisuus', + }, + // Section 3.1. + 'edit-hankesuunnitelma-jatkohakemus': { + role: 'radio', + value: '0', + viewPageFormatter: viewPageFormatBoolean + }, + 'edit-hankkeen-tarkoitus-tavoitteet': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-hankkeen-tarkoitus-tavoitteet', + }, + value: faker.lorem.words(10), + }, + 'edit-hankkeen-toimenpiteet-aikataulu': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-hankkeen-toimenpiteet-aikataulu', + }, + value: faker.lorem.words(10), + }, + 'edit-hankkeen-toimenpiteet-alkupvm': { + role: 'input', + value: '2024-11-14', + viewPageFormatter: viewPageFormatDate, + viewPageSelector: '#iakkaiden_kulttuuri_ja_liikunta--hankesuunnitelma_section', + }, + 'edit-hankkeen-toimenpiteet-loppupvm': { + role: 'input', + value: '2025-11-14', + viewPageFormatter: viewPageFormatDate, + viewPageSelector: '#iakkaiden_kulttuuri_ja_liikunta--hankesuunnitelma_section', + }, + 'edit-hankkeen-keskeisimmat-kumppanit': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-hankkeen-keskeisimmat-kumppanit', + }, + value: faker.lorem.words(10), + }, + // Section 3.2. + 'edit-haun-painopisteet-liikkumis-kehitys': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-haun-painopisteet-liikkumis-kehitys', + }, + value: faker.lorem.words(10), + }, + 'edit-haun-painopisteet-digi-kehitys': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-haun-painopisteet-digi-kehitys', + }, + value: faker.lorem.words(10), + }, + 'edit-haun-painopisteet-vertais-kehitys': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-haun-painopisteet-vertais-kehitys', + }, + value: faker.lorem.words(10), + }, + 'edit-haun-painopisteet-kulttuuri-kehitys': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-haun-painopisteet-kulttuuri-kehitys', + }, + value: faker.lorem.words(10), + }, + // Section 3.3. + 'edit-hankkeen-kohderyhmat-kenelle': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-hankkeen-kohderyhmat-kenelle', + }, + value: faker.lorem.words(10), + }, + 'edit-hankkeen-kohderyhmat-erityisryhmat': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-hankkeen-kohderyhmat-erityisryhmat', + }, + value: faker.lorem.words(10), + }, + 'edit-hankkeen-kohderyhmat-tavoitus': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-hankkeen-kohderyhmat-tavoitus', + }, + value: faker.lorem.words(10), + }, + 'edit-hankkeen-kohderyhmat-konkretia': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-hankkeen-kohderyhmat-konkretia', + }, + value: faker.lorem.words(10), + }, + 'edit-hankkeen-kohderyhmat-osallisuus': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-hankkeen-kohderyhmat-osallisuus', + }, + value: faker.lorem.words(10), + }, + 'edit-hankkeen-kohderyhmat-osaaminen': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-hankkeen-kohderyhmat-osaaminen', + }, + value: faker.lorem.words(10), + }, + 'edit-hankkeen-kohderyhmat-postinrot': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-hankkeen-kohderyhmat-postinrot', + }, + value: faker.location.zipCode(), + }, + 'edit-hankkeen-kohderyhmat-miksi-alue': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-hankkeen-kohderyhmat-miksi-alue', + }, + value: faker.lorem.words(10), + }, + // Section 3.4. + 'edit-hankkeen-riskit-keskeisimmat': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-hankkeen-riskit-keskeisimmat', + }, + value: faker.lorem.words(10), + }, + 'edit-hankkeen-riskit-seuranta': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-hankkeen-riskit-seuranta', + }, + value: faker.lorem.words(10), + }, + 'edit-hankkeen-riskit-vakiinnuttaminen': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-hankkeen-riskit-vakiinnuttaminen', + }, + value: faker.lorem.words(10), + }, + 'nextbutton': { + role: 'button', + selector: { + type: 'form-topnavi-link', + name: 'data-drupal-selector', + value: '4_talousarvio', + }, + }, + }, + }, + '4_talousarvio': { + items: { + 'edit-talous-tulon-tyyppi': { + role: 'multivalue', + multi: { + buttonSelector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-talous-tulon-tyyppi-add-submit', + resultValue: 'edit-talous-tulon-tyyppi-items-[INDEX]', + }, + //@ts-ignore + items: { + 0: [ + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-talous-tulon-tyyppi-items-[INDEX]-item-label', + }, + value: faker.lorem.words(2), + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector-sequential', + name: 'data-drupal-selector-sequential', + value: 'edit-talous-tulon-tyyppi-items-[INDEX]-item-value', + }, + value: faker.number.int({min: 1, max: 5000}).toString(), + viewPageFormatter: viewPageFormatNumber, + }, + ], + 1: [ + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-talous-tulon-tyyppi-items-[INDEX]-item-label', + }, + value: faker.lorem.words(2), + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector-sequential', + name: 'data-drupal-selector-sequential', + value: 'edit-talous-tulon-tyyppi-items-[INDEX]-item-value', + }, + value: faker.number.int({min: 1, max: 5000}).toString(), + viewPageFormatter: viewPageFormatNumber, + }, + ], + }, + expectedErrors: {} + }, + }, + 'edit-talous-menon-tyyppi': { + role: 'multivalue', + multi: { + buttonSelector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-talous-menon-tyyppi-add-submit', + resultValue: 'edit-talous-menon-tyyppi-items-[INDEX]', + }, + //@ts-ignore + items: { + 0: [ + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-talous-menon-tyyppi-items-[INDEX]-item-label', + }, + value: faker.lorem.words(2), + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector-sequential', + name: 'data-drupal-selector-sequential', + value: 'edit-talous-menon-tyyppi-items-[INDEX]-item-value', + }, + value: faker.number.int({min: 1, max: 5000}).toString(), + viewPageFormatter: viewPageFormatNumber, + }, + ], + 1: [ + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-talous-menon-tyyppi-items-[INDEX]-item-label', + }, + value: faker.lorem.words(2), + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector-sequential', + name: 'data-drupal-selector-sequential', + value: 'edit-talous-menon-tyyppi-items-[INDEX]-item-value', + }, + value: faker.number.int({min: 1, max: 5000}).toString(), + viewPageFormatter: viewPageFormatNumber, + }, + ], + }, + expectedErrors: {} + }, + }, + 'nextbutton': { + role: 'button', + selector: { + type: 'form-topnavi-link', + name: 'data-drupal-selector', + value: 'lisatiedot_ja_liitteet', + } + }, + }, + }, + 'lisatiedot_ja_liitteet': { + items: { + 'edit-additional-information': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-additional-information', + }, + value: faker.lorem.sentences(3), + }, + 'edit-extra-info': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-extra-info', + }, + value: faker.lorem.sentences(3), + }, + 'edit-muu-liite': { + role: 'multivalue', + multi: { + buttonSelector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-muu-liite-add-submit', + resultValue: 'edit-muu-liite-items-[INDEX]', + }, + //@ts-ignore + items: { + 0: [ + { + role: 'fileupload', + selector: { + type: 'locator', + name: 'data-drupal-selector', + value: '[name="files[muu_liite_items_[INDEX]__item__attachment]"]', + resultValue: '.form-item-muu-liite-items-[INDEX]--item--attachment a', + }, + value: ATTACHMENTS.MUU_LIITE, + viewPageFormatter: viewPageFormatFilePath + }, + { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-muu-liite-items-[INDEX]-item-description', + }, + value: faker.lorem.sentences(1), + }, + ], + }, + }, + }, + 'nextbutton': { + role: 'button', + selector: { + type: 'form-topnavi-link', + name: 'data-drupal-selector', + value: 'webform_preview', + }, + viewPageSkipValidation: true, + }, + }, + }, + 'webform_preview': { + items: { + 'accept_terms_1': { + role: 'checkbox', + value: '1', + viewPageSkipValidation: true, + }, + 'sendbutton': { + role: 'button', + value: 'save-draft', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-actions-draft', + }, + viewPageSkipValidation: true, + }, + }, + }, + }, + expectedErrors: {}, + expectedDestination: '/fi/hakemus/iakkaiden_kulttuuri_ja_liikunta/', +} + +/** + * Test the visibility of Section 3. fields which are controlled by the + * Section 2 "Kulttuurin erityisavustus 1" subventions value. + */ +const visibilityByState: FormDataWithRemoveOptionalProps = { + title: 'Kulttuuri1_summa is 0', + viewPageSkipValidation: true, + formPages: { + '2_avustustiedot': { + items: { + 'edit-subventions-items-1-amount': { + role: 'number-input', + value: '5000', + viewPageSelector: '.form-item-subventions', + viewPageFormatter: viewPageFormatCurrency + }, + }, + itemsToRemove: [ + 'edit-subventions-items-0-amount', + 'edit-bank-account-account-number-select', + ], + }, + '3_tarkemmat_tiedot': { + items: { + 'edit-hankesuunnitelma-radios-0': { + role: 'radio', + selector: { + type: 'dom-id-label', + name: 'data-drupal-selector', + value: 'edit-hankesuunnitelma-radios-0', + }, + value: 'Ei', + viewPageFormatter: viewPageFormatBoolean + }, + + }, + itemsToBeHidden: [ + 'edit-ensisijainen-taiteen-ala', + 'edit-haun-painopisteet-kulttuuri-kehitys', + ], + }, + }, + expectedErrors: {}, +}; + +/** + * Test the visibility of Section 3.5. This section is visible only when + * "Haetaanko nyt vuonna 2024 myönnetyn kaksivuotisen avustuksen 2. osaa?" + * form field (edit-hankesuunnitelma-radios) is set to "Kyllä". + */ +const visibilityByStateSection3Estimates: FormDataWithRemoveOptionalProps = { + title: 'Section 3.5 test hidden values', + viewPageSkipValidation: true, + formPages: { + '2_avustustiedot': { + items: { + 'edit-subventions-items-1-amount': { + role: 'number-input', + value: '5000', + viewPageSelector: '.form-item-subventions', + viewPageFormatter: viewPageFormatCurrency + }, + }, + itemsToRemove: [ + 'edit-subventions-items-0-amount', + 'edit-bank-account-account-number-select', + ], + }, + '3_tarkemmat_tiedot': { + items: { + 'edit-hankesuunnitelma-radios-1': { + role: 'radio', + selector: { + type: 'dom-id-label', + name: 'data-drupal-selector', + value: 'edit-hankesuunnitelma-radios-1', + }, + value: 'Kyllä', + viewPageFormatter: viewPageFormatBoolean + }, + + // Section 3.5. + 'edit-arviointi-toteuma': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-arviointi-toteuma', + }, + value: faker.lorem.words(10), + }, + 'edit-arviointi-muutokset-talous': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-arviointi-muutokset-talous', + }, + value: faker.lorem.words(10), + }, + 'edit-arviointi-muutokset-toiminta': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-arviointi-muutokset-toiminta', + }, + value: faker.lorem.words(10), + }, + 'edit-arviointi-muutokset-aikataulu': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-arviointi-muutokset-aikataulu', + }, + value: faker.lorem.words(10), + }, + 'edit-arviointi-haasteet': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-arviointi-haasteet', + }, + value: faker.lorem.words(10), + }, + 'edit-arviointi-saavutettavuus': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-arviointi-saavutettavuus', + }, + value: faker.lorem.words(10), + }, + 'edit-arviointi-avustus-kaytto': { + role: 'input', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-arviointi-avustus-kaytto', + }, + value: faker.lorem.words(10), + }, + }, + itemsToRemove: [ + 'edit-hankesuunnitelma-radios-0', + 'edit-hankkeen-toimenpiteet-alkupvm', + 'edit-ensisijainen-taiteen-ala', + ], + itemsToBeHidden: [ + 'edit-hankesuunnitelma-jatkohakemus', + 'edit-hankkeen-tarkoitus-tavoitteet', + 'edit-hankkeen-toimenpiteet-aikataulu', + 'edit-hankkeen-toimenpiteet-alkupvm', + 'edit-hankkeen-toimenpiteet-loppupvm', + 'edit-hankkeen-keskeisimmat-kumppanit', + 'edit-haun-painopisteet-liikkumis-kehitys', + 'edit-haun-painopisteet-digi-kehitys', + 'edit-haun-painopisteet-vertais-kehitys', + 'edit-haun-painopisteet-kulttuuri-kehitys', + 'edit-hankkeen-kohderyhmat-kenelle', + 'edit-hankkeen-kohderyhmat-erityisryhmat', + 'edit-hankkeen-kohderyhmat-tavoitus', + 'edit-hankkeen-kohderyhmat-konkretia', + 'edit-hankkeen-kohderyhmat-osallisuus', + 'edit-hankkeen-kohderyhmat-osaaminen', + 'edit-hankkeen-kohderyhmat-postinrot', + 'edit-hankkeen-kohderyhmat-miksi-alue', + 'edit-hankkeen-riskit-keskeisimmat', + 'edit-hankkeen-riskit-seuranta', + 'edit-hankkeen-riskit-vakiinnuttaminen', + ], + }, + }, + expectedErrors: {}, +}; + +/** + * Test the missing values of the whole form. + */ +const missingValues: FormDataWithRemoveOptionalProps = { + title: 'Missing values', + viewPageSkipValidation: true, + formPages: { + '1_hakijan_tiedot': { + items: {}, + itemsToRemove: [ + 'edit-bank-account-account-number-select', + 'edit-email', + 'edit-contact-person', + 'edit-contact-person-phone-number', + 'edit-community-address-community-address-select', + ], + }, + '2_avustustiedot': { + items: {}, + itemsToRemove: [ + 'edit-acting-year', + 'edit-subventions-items-0-amount', + 'edit-myonnetty-avustus', + 'edit-haettu-avustus-tieto', + ], + }, + '3_tarkemmat_tiedot': { + items: { + 'edit-hankesuunnitelma-radios-0': { + role: 'radio', + selector: { + type: 'dom-id-label', + name: 'data-drupal-selector', + value: 'edit-hankesuunnitelma-radios-0', + }, + value: 'Ei', + viewPageFormatter: viewPageFormatBoolean + }, + }, + itemsToRemove: [ + 'edit-ensisijainen-taiteen-ala', + 'edit-hankkeen-tarkoitus-tavoitteet', + 'edit-hankkeen-toimenpiteet-aikataulu', + 'edit-hankkeen-toimenpiteet-alkupvm', + 'edit-hankkeen-toimenpiteet-loppupvm', + 'edit-hankkeen-keskeisimmat-kumppanit', + 'edit-haun-painopisteet-liikkumis-kehitys', + 'edit-haun-painopisteet-digi-kehitys', + 'edit-haun-painopisteet-vertais-kehitys', + 'edit-haun-painopisteet-kulttuuri-kehitys', + 'edit-hankkeen-kohderyhmat-kenelle', + 'edit-hankkeen-kohderyhmat-tavoitus', + 'edit-hankkeen-kohderyhmat-konkretia', + 'edit-hankkeen-kohderyhmat-osallisuus', + 'edit-hankkeen-kohderyhmat-osaaminen', + 'edit-hankkeen-kohderyhmat-postinrot', + 'edit-hankkeen-kohderyhmat-miksi-alue', + 'edit-hankkeen-riskit-keskeisimmat', + 'edit-hankkeen-riskit-seuranta', + ], + }, + }, + expectedErrors: { + 'edit-bank-account-account-number-select': 'Virhe sivulla 1. Hakijan tiedot: Valitse tilinumero kenttä on pakollinen.', + 'edit-email': 'Virhe sivulla 1. Hakijan tiedot: Sähköpostiosoite kenttä on pakollinen.', + 'edit-contact-person': 'Virhe sivulla 1. Hakijan tiedot: Yhteyshenkilö kenttä on pakollinen.', + 'edit-contact-person-phone-number': 'Virhe sivulla 1. Hakijan tiedot: Puhelinnumero kenttä on pakollinen.', + 'edit-community-address': 'Virhe sivulla 1. Hakijan tiedot: Yhteisön osoite kenttä on pakollinen.', + 'edit-community-address-community-address-select': 'Virhe sivulla 1. Hakijan tiedot: Valitse osoite kenttä on pakollinen.', + 'edit-acting-year': 'Virhe sivulla 2. Avustustiedot: Vuosi, jolle haen avustusta kenttä on pakollinen.', + 'edit-subventions-items-0-amount': 'Virhe sivulla 2. Avustustiedot: Sinun on syötettävä vähintään yhdelle avustuslajille summa', + 'edit-hankkeen-tarkoitus-tavoitteet': 'Virhe sivulla 3. Tarkemmat tiedot: Hankkeen tarkoitus ja tavoitteet kenttä on pakollinen.', + 'edit-hankkeen-toimenpiteet-aikataulu': 'Virhe sivulla 3. Tarkemmat tiedot: Mitkä ovat hankkeen konkreettiset toimenpiteet ja niiden toteutusaikataulu? kenttä on pakollinen.', + 'edit-hankkeen-toimenpiteet-alkupvm': 'Virhe sivulla 3. Tarkemmat tiedot: Alkupäivämäärä kenttä on pakollinen.', + 'edit-hankkeen-toimenpiteet-loppupvm': 'Virhe sivulla 3. Tarkemmat tiedot: Loppupäivämäärä kenttä on pakollinen.', + 'edit-hankkeen-keskeisimmat-kumppanit': 'Virhe sivulla 3. Tarkemmat tiedot: Nimeä hankkeen keskeisimmät yhteistyökumppanit ja heidän roolinsa hankkeessa kenttä on pakollinen.', + 'edit-hankkeen-kohderyhmat-kenelle': 'Virhe sivulla 3. Tarkemmat tiedot: Kenelle hankkeen toiminta on pääasiallisesti suunnattu? kenttä on pakollinen.', + 'edit-hankkeen-kohderyhmat-tavoitus': 'Virhe sivulla 3. Tarkemmat tiedot: Kuinka hankkeen kohderyhmät aiotaan tavoittaa? kenttä on pakollinen.', + 'edit-hankkeen-kohderyhmat-konkretia': 'Virhe sivulla 3. Tarkemmat tiedot: Miten hankkeessa edistetään konkreettisin toimenpitein valitun kohderyhmän toimintakykyä ja hyvinvointia? kenttä on pakollinen.', + 'edit-hankkeen-kohderyhmat-osallisuus': 'Virhe sivulla 3. Tarkemmat tiedot: Millä tavoin hankkeessa edistetään osallisuutta? Mikä ikäihmisten rooli hankkeessa on? kenttä on pakollinen.', + 'edit-hankkeen-kohderyhmat-osaaminen': 'Virhe sivulla 3. Tarkemmat tiedot: Millaista osaamista kyseisen kohderyhmän/-ryhmien kanssa työskentelystä hanketoimijoilla on ennestään? kenttä on pakollinen.', + 'edit-hankkeen-kohderyhmat-postinrot': 'Virhe sivulla 3. Tarkemmat tiedot: Millä postinumeroalueella tai -alueilla Helsingissä hanke toteutetaan? Kirjaa kenttään enintään kolme (3) postinumeroaluetta ja erottele ne toisistaan pilkulla (,) kenttä on pakollinen.', + 'edit-hankkeen-kohderyhmat-miksi-alue': 'Virhe sivulla 3. Tarkemmat tiedot: Miksi juuri kyseinen alue / alueet on valittu? kenttä on pakollinen.', + 'edit-hankkeen-riskit-keskeisimmat': 'Virhe sivulla 3. Tarkemmat tiedot: Mitkä ovat hankkeen toteuttamisen näkökulmasta keskeisimmät riskit? kenttä on pakollinen.', + 'edit-hankkeen-riskit-seuranta': 'Virhe sivulla 3. Tarkemmat tiedot: Miten hankkeessa aiotaan toteuttaa seurantaa ja arviointia? kenttä on pakollinen.', + }, +}; + +/** + * Test the wrong values for the whole form. + */ +const wrongValues: FormDataWithRemoveOptionalProps = { + title: 'Wrong values', + viewPageSkipValidation: true, + formPages: { + '1_hakijan_tiedot': { + items: { + 'edit-email': { + role: 'input', + value: 'ääkkösiävaa', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-email', + } + }, + }, + itemsToRemove: [], + }, + '4_talousarvio': { + items: {}, + itemsToRemove: [ + 'edit-talous-tulon-tyyppi-items-0-item-label', + 'edit-talous-menon-tyyppi-items-0-item-value' + ], + }, + }, + expectedErrors: { + 'edit-email': 'Virhe sivulla 1. Hakijan tiedot: ääkkösiävaa ei ole kelvollinen sähköpostiosoite. Täytä sähköpostiosoite muodossa user@example.com.', + 'edit-talous-tulon-tyyppi-items-0-item-label': 'Virhe sivulla 4. Talousarvio: Kuvaus tulosta ei voi olla tyhjä, kun Määrä (€) sisältää arvon', + 'edit-talous-menon-tyyppi-items-0-item-value': 'Virhe sivulla 4. Talousarvio: Määrä (€) ei voi olla tyhjä, kun Kuvaus sisältää arvon' + }, +}; + +const sendApplication: FormDataWithRemoveOptionalProps = { + title: 'Send to AVUS2', + formPages: { + 'webform_preview': { + items: { + 'sendbutton': { + role: 'button', + value: 'submit-form', + selector: { + type: 'data-drupal-selector', + name: 'data-drupal-selector', + value: 'edit-actions-submit', + }, + viewPageSkipValidation: true, + }, + }, + itemsToRemove: [], + }, + }, + expectedErrors: {}, +}; + +/** + * All data for registered community, keyed with id. Those do not matter. + * + * Each keyed formdata in this object will result a new test run for this form. + * + */ +const registeredCommunityApplications_70 = { + draft: baseForm_70, + visibility_by_state: createFormData(baseForm_70, visibilityByState), + visibility_by_state_section3_estimates: createFormData(baseForm_70, visibilityByStateSection3Estimates), + missing_values: createFormData(baseForm_70, missingValues), + wrong_values: createFormData(baseForm_70, wrongValues), + success: createFormData(baseForm_70, sendApplication), +} + +export { + registeredCommunityApplications_70 +} diff --git a/e2e/utils/data/application/application_data_registered_community.ts b/e2e/utils/data/application/application_data_registered_community.ts index 7e53ca8f35..b5e8011278 100644 --- a/e2e/utils/data/application/application_data_registered_community.ts +++ b/e2e/utils/data/application/application_data_registered_community.ts @@ -18,6 +18,7 @@ import {registeredCommunityApplications_66} from "./application_data_66"; import {registeredCommunityApplications_67} from "./application_data_67"; import {registeredCommunityApplications_68} from "./application_data_68"; import {registeredCommunityApplications_69} from "./application_data_69"; +import {registeredCommunityApplications_70} from "./application_data_70"; const registeredCommunityApplications = { 29: registeredCommunityApplications_29, @@ -40,6 +41,7 @@ const registeredCommunityApplications = { 67: registeredCommunityApplications_67, 68: registeredCommunityApplications_68, 69: registeredCommunityApplications_69, + 70: registeredCommunityApplications_70, } export { diff --git a/e2e/utils/input_helpers.ts b/e2e/utils/input_helpers.ts index 4ab7e72794..ac828a354f 100644 --- a/e2e/utils/input_helpers.ts +++ b/e2e/utils/input_helpers.ts @@ -1,6 +1,8 @@ import {expect, Locator, Page} from "@playwright/test"; import {FormFieldWithRemove, Selector, isDynamicMultiValueField, isMultiValueField} from "./data/test_data"; import {logger} from "./logger"; +import { promises as fs } from 'fs'; +import { join, dirname, extname, basename } from 'path'; /** @@ -467,7 +469,8 @@ const fillMultiValueField = async (page: Page, formField: Partial { - if (!filePath) { logger('No file defined in', uploadSelector); return; } - const fileChooserPromise = page.waitForEvent('filechooser'); - const fileInput = await page.locator(uploadSelector); - await fileInput.click(); - const fileChooser = await fileChooserPromise; - await fileChooser.setFiles(filePath); - await fileInput.waitFor({state: 'hidden'}); - const resultLink = await page.locator(fileLinkSelector); - await expect(fileInput).toBeHidden(); - await expect(resultLink).toBeVisible(); -} + + // Create a new file name + const tempDir = dirname(filePath); + const fileExt = extname(filePath); + const fileName = basename(filePath, fileExt); + const newFileName = `${fileName}-${Date.now()}${fileExt}`; + const newFilePath = join(tempDir, newFileName); + + // Rename the original file to the new file name + await fs.rename(filePath, newFilePath); + + try { + const fileChooserPromise = page.waitForEvent('filechooser'); + const fileInput = page.locator(uploadSelector); + await fileInput.click(); + const fileChooser = await fileChooserPromise; + await fileChooser.setFiles(newFilePath); + await fileInput.waitFor({ state: 'hidden' }); + const resultLink = page.locator(fileLinkSelector); + await expect(fileInput).toBeHidden(); + await expect(resultLink).toBeVisible(); + } finally { + // Rename the file back to its original name + await fs.rename(newFilePath, filePath); + } +}; /** * The clickButton function. diff --git a/azure-pipelines-test.yml b/pipelines/drupal-dev.yml similarity index 54% rename from azure-pipelines-test.yml rename to pipelines/drupal-dev.yml index 8dc01b268b..30aeba7d40 100644 --- a/azure-pipelines-test.yml +++ b/pipelines/drupal-dev.yml @@ -1,15 +1,17 @@ -# File: drupal-helfi/azure-pipelines.yml - # Continuous integration (CI) triggers cause a pipeline to run whenever you push # an update to the specified branches or you push specified tags. trigger: batch: true branches: include: - - develop + - dev paths: exclude: - - README.md + - '*.md' + - '.github/' + - 'pipelines/drupal-production.yml' + - 'pipelines/drupal-staging.yml' + - 'pipelines/drupal-test.yml' # Pull request (PR) triggers cause a pipeline to run whenever a pull request is # opened with one of the specified target branches, or when updates are made to @@ -30,8 +32,17 @@ resources: # Azure DevOps repository - repository: avustusasiointi-pipelines type: git - # project/repository + # Azure DevOps project/repository name: avustusasiointi/avustusasiointi-pipelines extends: - template: azure-pipelines-drupal-test.yml@avustusasiointi-pipelines + # Filename in Azure DevOps Repository + template: components/drupal/pipelines/drupal-dev.yml@avustusasiointi-pipelines + # parameters: + # Application build arguments and config map values as key value pairs. + # Does not contain all buildArguments or configMap values, the rest located in avustusasiointi-pipelines + # The values here will override the values defined in the avustusasiointi-pipelines repository + # buildArgs: + # DEBUG: 1 + # configMap: # pod environment variables + # DEBUG: 1 diff --git a/azure-pipelines-dev.yml b/pipelines/drupal-production.yml similarity index 58% rename from azure-pipelines-dev.yml rename to pipelines/drupal-production.yml index 1b7ed5ebe5..fd7c3b2b21 100644 --- a/azure-pipelines-dev.yml +++ b/pipelines/drupal-production.yml @@ -1,15 +1,6 @@ -# File: drupal-helfi/azure-pipelines.yml - # Continuous integration (CI) triggers cause a pipeline to run whenever you push # an update to the specified branches or you push specified tags. trigger: none -# batch: true -# tags: -# include: -# - deploy-to-dev -# paths: -# exclude: -# - README.md # Pull request (PR) triggers cause a pipeline to run whenever a pull request is # opened with one of the specified target branches, or when updates are made to @@ -30,12 +21,17 @@ resources: # Azure DevOps repository - repository: avustusasiointi-pipelines type: git - # project/repository + # Azure DevOps project/repository name: avustusasiointi/avustusasiointi-pipelines - - repository: robottests - type: github - name: City-of-Helsinki/hel-fi-drupal-grants - endpoint: City-of-Helsinki extends: - template: azure-pipelines-drupal-dev.yml@avustusasiointi-pipelines + # Filename in Azure DevOps Repository + template: components/drupal/pipelines/drupal-production.yml@avustusasiointi-pipelines + # parameters: + # Application build arguments and config map values as key value pairs. + # Does not contain all buildArguments or configMap values, the rest located in avustusasiointi-pipelines + # The values here will override the values defined in the avustusasiointi-pipelines repository + # buildArgs: + # DEBUG: 1 + # configMap: # pod environment variables + # DEBUG: 1 diff --git a/pipelines/drupal-staging.yml b/pipelines/drupal-staging.yml new file mode 100644 index 0000000000..84e86e1dfd --- /dev/null +++ b/pipelines/drupal-staging.yml @@ -0,0 +1,48 @@ +# Continuous integration (CI) triggers cause a pipeline to run whenever you push +# an update to the specified branches or you push specified tags. +trigger: + batch: true + branches: + include: + - main + paths: + exclude: + - '*.md' + - '.github/' + - 'pipelines/drupal-production.yml' + - 'pipelines/drupal-test.yml' + - 'pipelines/drupal-dev.yml' + +# Pull request (PR) triggers cause a pipeline to run whenever a pull request is +# opened with one of the specified target branches, or when updates are made to +# such a pull request. +# +# GitHub creates a new ref when a pull request is created. The ref points to a +# merge commit, which is the merged code between the source and target branches +# of the pull request. +# +# Opt out of pull request validation +pr: none + +# By default, use self-hosted agents +pool: Default + +resources: + repositories: + # Azure DevOps repository + - repository: avustusasiointi-pipelines + type: git + # Azure DevOps project/repository + name: avustusasiointi/avustusasiointi-pipelines + +extends: + # Filename in Azure DevOps Repository + template: components/drupal/pipelines/drupal-staging.yml@avustusasiointi-pipelines + # parameters: + # Application build arguments and config map values as key value pairs. + # Does not contain all buildArguments or configMap values, the rest located in avustusasiointi-pipelines + # The values here will override the values defined in the avustusasiointi-pipelines repository + # buildArgs: + # DEBUG: 1 + # configMap: # pod environment variables + # DEBUG: 1 diff --git a/pipelines/drupal-test.yml b/pipelines/drupal-test.yml new file mode 100644 index 0000000000..aecbb6489d --- /dev/null +++ b/pipelines/drupal-test.yml @@ -0,0 +1,48 @@ +# Continuous integration (CI) triggers cause a pipeline to run whenever you push +# an update to the specified branches or you push specified tags. +trigger: none + # batch: true + # branches: + # include: + # - dev + # paths: + # exclude: + # - '*.md' + # - '.github/' + # - 'pipelines/drupal-production.yml' + # - 'pipelines/drupal-staging.yml' + # - 'pipelines/drupal-dev.yml' + +# Pull request (PR) triggers cause a pipeline to run whenever a pull request is +# opened with one of the specified target branches, or when updates are made to +# such a pull request. +# +# GitHub creates a new ref when a pull request is created. The ref points to a +# merge commit, which is the merged code between the source and target branches +# of the pull request. +# +# Opt out of pull request validation +pr: none + +# By default, use self-hosted agents +pool: Default + +resources: + repositories: + # Azure DevOps repository + - repository: avustusasiointi-pipelines + type: git + # Azure DevOps project/repository + name: avustusasiointi/avustusasiointi-pipelines + +extends: + # Filename in Azure DevOps Repository + template: components/drupal/pipelines/drupal-test.yml@avustusasiointi-pipelines + # parameters: + # Application build arguments and config map values as key value pairs. + # Does not contain all buildArguments or configMap values, the rest located in avustusasiointi-pipelines + # The values here will override the values defined in the avustusasiointi-pipelines repository + # buildArgs: + # DEBUG: 1 + # configMap: # pod environment variables + # DEBUG: 1 diff --git a/public/modules/custom/grants_admin_applications/src/Form/DeleteApplicationsForm.php b/public/modules/custom/grants_admin_applications/src/Form/DeleteApplicationsForm.php index 79d0071ec1..df10408cf0 100644 --- a/public/modules/custom/grants_admin_applications/src/Form/DeleteApplicationsForm.php +++ b/public/modules/custom/grants_admin_applications/src/Form/DeleteApplicationsForm.php @@ -189,7 +189,12 @@ public function buildForm(array $form, FormStateInterface $form_state): array { // Build the application listing form elements. if ($uuid || $businessId) { - $this->buildApplicationList($uuid, $businessId, $appEnv, $type, $status, $form_state, $form); + try { + $this->buildApplicationList($uuid, $businessId, $appEnv, $type, $status, $form_state, $form); + } + catch (\Throwable $e) { + $this->messenger()->addError($e->getMessage()); + } } $form['actions']['delete_selected'] = [ @@ -365,6 +370,8 @@ private function deleteDraftDocuments(array $documents): void { * The form state. * @param array $form * The form. + * + * @throws \Drupal\helfi_helsinki_profiili\TokenExpiredException */ private function buildApplicationList( mixed $uuid, @@ -384,6 +391,13 @@ private function buildApplicationList( return; } + // Extract the transaction_id values and join them into a string. + $transactionIds = array_map(function ($document) { + return $document->getTransactionId(); + }, $documents); + + $applicationNumberList = implode(',', $transactionIds); + $form_state->setStorage(['documents' => $documents]); $documentsByType = $this->sortDocuments($documents); @@ -413,6 +427,15 @@ private function buildApplicationList( ]; } } + + // Add the application numbers list to a form element. + $form['appData']['application_numbers'] = [ + '#type' => 'textarea', + '#title' => $this->t('Application numbers in copyable list.'), + '#value' => $applicationNumberList, + '#description' => $this->t('Total number of results: @count', ['@count' => count($transactionIds)]), + '#disabled' => TRUE, + ]; } catch (AtvDocumentNotFoundException | AtvFailedToConnectException | GuzzleException $e) { $this->messenger()->addError('Failed fetching applications.'); diff --git a/public/modules/custom/grants_attachments/src/AttachmentFixerService.php b/public/modules/custom/grants_attachments/src/AttachmentFixerService.php index 87d506fe6e..fd6f379764 100644 --- a/public/modules/custom/grants_attachments/src/AttachmentFixerService.php +++ b/public/modules/custom/grants_attachments/src/AttachmentFixerService.php @@ -40,11 +40,11 @@ public function fixAttachmentsOnApplication(AtvDocument $atvDoc): AtvDocument { // Get the events from the content. $events = $content['events']; // Get the attachment info from the content. - $attachmentInfo = $content['attachmentsInfo']['attachmentsArray']; + $attachmentInfo = $content['attachmentsInfo']['attachmentsArray'] ?? NULL; // Loop attachments and if attachment is not ok, update the integration ID. foreach ($attachments as $attachment) { - if ($this->areAttachmentsOk($events, $attachment, $attachmentInfo, $appEnv)['form'] === FALSE) { + if ($attachmentInfo && $this->areAttachmentsOk($events, $attachment, $attachmentInfo, $appEnv)['form'] === FALSE) { $this->updateIntegrationIdForAttachment($attachment, $attachmentInfo, $appEnv); } } diff --git a/public/modules/custom/grants_attachments/src/AttachmentHandler.php b/public/modules/custom/grants_attachments/src/AttachmentHandler.php index 5730e689e3..94049cbcda 100644 --- a/public/modules/custom/grants_attachments/src/AttachmentHandler.php +++ b/public/modules/custom/grants_attachments/src/AttachmentHandler.php @@ -138,6 +138,7 @@ public static function getAttachmentFieldNames(string $applicationNumber, $preve // This could probably be done just by parsing the application number, // however this more futureproof. $webform = ApplicationHelpers::getWebformFromApplicationNumber($applicationNumber); + if (!$webform) { return []; } diff --git a/public/modules/custom/grants_budget_components/src/Element/GrantsBudgetCostStatic.php b/public/modules/custom/grants_budget_components/src/Element/GrantsBudgetCostStatic.php index 1b5161b2fb..654cde77b6 100644 --- a/public/modules/custom/grants_budget_components/src/Element/GrantsBudgetCostStatic.php +++ b/public/modules/custom/grants_budget_components/src/Element/GrantsBudgetCostStatic.php @@ -92,7 +92,6 @@ public static function getFieldNames(): array { $tOpts = ['context' => 'grants_budget_components']; return [ "salaries" => t("Salaries (€)", [], $tOpts), - "personnelSideCosts" => t("Personnel costs from salaries and fees (approx. 30%) (€)", [], $tOpts), "personnelSocialSecurityCosts" => t("personnelSocialSecurityCosts (€)", [], $tOpts), "rentSum" => t("Rents (€)", [], $tOpts), "materials" => t("Materials (€)", [], $tOpts), @@ -119,6 +118,7 @@ public static function getFieldNames(): array { "netCosts" => t("netCosts (€)", [], $tOpts), "performerFees" => t("Salaries and fees for performers and artists (€)", [], $tOpts), "otherFees" => t("Other salaries and fees (production, technology, etc.) (€)", [], $tOpts), + "personnelSideCosts" => t("Personnel costs from salaries and fees (approx. 30%) (€)", [], $tOpts), "generalCosts" => t("generalCosts (€)", [], $tOpts), "permits" => t("permits (€)", [], $tOpts), "setsAndCostumes" => t("setsAndCostumes (€)", [], $tOpts), diff --git a/public/modules/custom/grants_club_section/src/Element/ClubSectionComposite.php b/public/modules/custom/grants_club_section/src/Element/ClubSectionComposite.php index fc83acb657..ab354e1d06 100644 --- a/public/modules/custom/grants_club_section/src/Element/ClubSectionComposite.php +++ b/public/modules/custom/grants_club_section/src/Element/ClubSectionComposite.php @@ -102,7 +102,7 @@ public static function getCompositeElements(array $element): array { '#type' => 'textfield', '#input_mask' => "'alias': 'numeric', 'groupSeparator': ' ', 'digits': '0'", '#pattern' => '^[0-9 ]*$', - '#title' => t('Men (20-63 years)', [], $tOpts), + '#title' => t('Men from Helsinki (20-63 years)', [], $tOpts), '#prefix' => '
', '#element_validate' => [ [FieldValueValidator::class, 'validate'], @@ -111,7 +111,7 @@ public static function getCompositeElements(array $element): array { $elements['women'] = [ '#type' => 'textfield', - '#title' => t('Women (20-63 years)', [], $tOpts), + '#title' => t('Women from Helsinki (20-63 years)', [], $tOpts), '#input_mask' => "'alias': 'numeric', 'groupSeparator': ' ', 'digits': '0'", '#pattern' => '^[0-9 ]*$', '#element_validate' => [ @@ -123,18 +123,21 @@ public static function getCompositeElements(array $element): array { '#type' => 'textfield', '#input_mask' => "'alias': 'numeric', 'groupSeparator': ' ', 'digits': '0'", '#pattern' => '^[0-9 ]*$', - '#title' => t('Others (20-63 years)', [], $tOpts), + '#title' => t('Others from Helsinki (20-63 years)', [], $tOpts), '#suffix' => '
', '#element_validate' => [ [FieldValueValidator::class, 'validate'], ], ]; + $hoursHelp = t('

In the practice hours section, do not report the training output of individual actives, but the actual practice hours organized for Helsinki residents belonging to the age group.

If the actual number of training hours for an age group cannot be ascertained (e.g. many mixed groups), can the share of that age group be calculated from the total number of hours based on the share of the number of active members from Helsinki in the age group out of the total number of active members from Helsinki. E.g. the total number of hours in the division (all mixed groups) is 100 hours, where 10 adults and 20 under 20-year-olds are active: the number of hours for adults is 33 hours and for under 20-year-olds 67 hours. However, the actual number of hours realized for the age group should be used primarily.

', [], $tOpts); + $elements['adultHours'] = [ '#type' => 'textfield', '#input_mask' => "'alias': 'numeric', 'groupSeparator': ' ', 'digits': '0'", '#pattern' => '^[0-9 ]*$', '#title' => t('Practice hours of adults (20-63 years)', [], $tOpts), + '#help' => $hoursHelp, '#prefix' => '
', '#suffix' => '
', '#element_validate' => [ @@ -146,7 +149,7 @@ public static function getCompositeElements(array $element): array { '#type' => 'textfield', '#input_mask' => "'alias': 'numeric', 'groupSeparator': ' ', 'digits': '0'", '#pattern' => '^[0-9 ]*$', - '#title' => t('Men (64 years and over)', [], $tOpts), + '#title' => t('Men from Helsinki (64 years and over)', [], $tOpts), '#prefix' => '
', '#element_validate' => [ [FieldValueValidator::class, 'validate'], @@ -157,7 +160,7 @@ public static function getCompositeElements(array $element): array { '#type' => 'textfield', '#input_mask' => "'alias': 'numeric', 'groupSeparator': ' ', 'digits': '0'", '#pattern' => '^[0-9 ]*$', - '#title' => t('Women (64 years and over)', [], $tOpts), + '#title' => t('Women from Helsinki (64 years and over)', [], $tOpts), '#element_validate' => [ [FieldValueValidator::class, 'validate'], ], @@ -167,7 +170,7 @@ public static function getCompositeElements(array $element): array { '#type' => 'textfield', '#input_mask' => "'alias': 'numeric', 'groupSeparator': ' ', 'digits': '0'", '#pattern' => '^[0-9 ]*$', - '#title' => t('Others (64 years and over)', [], $tOpts), + '#title' => t('Others from Helsinki (64 years and over)', [], $tOpts), '#suffix' => '
', '#element_validate' => [ [FieldValueValidator::class, 'validate'], @@ -179,6 +182,7 @@ public static function getCompositeElements(array $element): array { '#input_mask' => "'alias': 'numeric', 'groupSeparator': ' ', 'digits': '0'", '#pattern' => '^[0-9 ]*$', '#title' => t('Practice hours of adults (64 years and over)', [], $tOpts), + '#help' => $hoursHelp, '#prefix' => '
', '#suffix' => '
', '#element_validate' => [ @@ -190,7 +194,7 @@ public static function getCompositeElements(array $element): array { '#type' => 'textfield', '#input_mask' => "'alias': 'numeric', 'groupSeparator': ' ', 'digits': '0'", '#pattern' => '^[0-9 ]*$', - '#title' => t('Boys (under 20 years of age)', [], $tOpts), + '#title' => t('Boys from Helsinki (under 20 years of age)', [], $tOpts), '#prefix' => '
', '#element_validate' => [ [FieldValueValidator::class, 'validate'], @@ -201,7 +205,7 @@ public static function getCompositeElements(array $element): array { '#type' => 'textfield', '#input_mask' => "'alias': 'numeric', 'groupSeparator': ' ', 'digits': '0'", '#pattern' => '^[0-9 ]*$', - '#title' => t('Girls (under 20 years of age)', [], $tOpts), + '#title' => t('Girls from Helsinki (under 20 years of age)', [], $tOpts), '#element_validate' => [ [FieldValueValidator::class, 'validate'], ], @@ -211,7 +215,7 @@ public static function getCompositeElements(array $element): array { '#type' => 'textfield', '#input_mask' => "'alias': 'numeric', 'groupSeparator': ' ', 'digits': '0'", '#pattern' => '^[0-9 ]*$', - '#title' => t('Others (under 20 years of age)', [], $tOpts), + '#title' => t('Others from Helsinki (under 20 years of age)', [], $tOpts), '#suffix' => '
', '#element_validate' => [ [FieldValueValidator::class, 'validate'], @@ -223,6 +227,7 @@ public static function getCompositeElements(array $element): array { '#input_mask' => "'alias': 'numeric', 'groupSeparator': ' ', 'digits': '0'", '#pattern' => '^[0-9 ]*$', '#title' => t('Practice hours of children/young people (under 20 years of age)', [], $tOpts), + '#help' => $hoursHelp, '#prefix' => '
', '#suffix' => '
', '#element_validate' => [ diff --git a/public/modules/custom/grants_club_section/translations/fi.po b/public/modules/custom/grants_club_section/translations/fi.po index 2560d09e8e..d10d96c757 100644 --- a/public/modules/custom/grants_club_section/translations/fi.po +++ b/public/modules/custom/grants_club_section/translations/fi.po @@ -344,48 +344,52 @@ msgid "Sport" msgstr "Laji" msgctxt "grants_club_section" -msgid "Women (20-63 years)" -msgstr "Naiset (20-63-vuotiaat)" +msgid "Women from Helsinki (20-63 years)" +msgstr "Helsinkiläiset naiset (20-63-vuotiaat)" msgctxt "grants_club_section" -msgid "Men (20-63 years)" -msgstr "Miehet (20-63-vuotiaat)" +msgid "Men from Helsinki (20-63 years)" +msgstr "Helsinkiläiset miehet (20-63-vuotiaat)" msgctxt "grants_club_section" -msgid "Others (20-63 years)" -msgstr "Muut (20-63-vuotiaat)" +msgid "Others from Helsinki (20-63 years)" +msgstr "Helsinkiläiset muut (20-63-vuotiaat)" msgctxt "grants_club_section" msgid "Practice hours of adults (20-63 years)" msgstr "20-63-vuotiaiden harjoitustunnit yhteensä" msgctxt "grants_club_section" -msgid "Men (64 years and over)" -msgstr "Miehet (64 vuotta täyttäneet)" +msgid "

In the practice hours section, do not report the training output of individual actives, but the actual practice hours organized for Helsinki residents belonging to the age group.

If the actual number of training hours for an age group cannot be ascertained (e.g. many mixed groups), can the share of that age group be calculated from the total number of hours based on the share of the number of active members from Helsinki in the age group out of the total number of active members from Helsinki. E.g. the total number of hours in the division (all mixed groups) is 100 hours, where 10 adults and 20 under 20-year-olds are active: the number of hours for adults is 33 hours and for under 20-year-olds 67 hours. However, the actual number of hours realized for the age group should be used primarily.

" +msgstr "

Älä ilmoita harjoitustunnit-kohdassa yksittäisten harrastajien toteutuneita liikuntasuoritteita tunteina, vaan ikäryhmään kuuluville helsinkiläisille järjestetyt toteutuneet harjoitustunnit.

Mikäli ikäryhmän todellinen harjoitustuntimäärä ei ole selvitettävissä (esim. paljon sekaryhmiä), voit laskea kokonaistuntimäärästä kyseisen ikäryhmän osuuden perustuen ikäryhmän helsinkiläisten aktiiviharrastajien määrän osuuteen helsinkiläisten aktiiviharrastajien kokonaismäärästä. Esim. Jaoston kokonaistuntimäärä (kaikki sekaryhmiä) on 100 tuntia, jossa liikkuu aktiivisesti 10 aikuista ja 20 alle 20-vuotiasta: aikuisten tuntimäärä 33 tuntia ja alle 20-vuotiaiden tuntimäärä 67 tuntia. Ensisijaisesti tulee kuitenkin käyttää ikäryhmän osalta todellista toteutunutta tuntimäärää.

" msgctxt "grants_club_section" -msgid "Women (64 years and over)" -msgstr "Naiset (64 vuotta täyttäneet)" +msgid "Men from Helsinki (64 years and over)" +msgstr "Helsinkiläiset miehet (64 vuotta täyttäneet)" msgctxt "grants_club_section" -msgid "Others (64 years and over)" -msgstr "Muut (64 vuotta täyttäneet)" +msgid "Women from Helsinki (64 years and over)" +msgstr "Helsinkiläiset naiset (64 vuotta täyttäneet)" + +msgctxt "grants_club_section" +msgid "Others from Helsinki (64 years and over)" +msgstr "Helsinkiläiset muut (64 vuotta täyttäneet)" msgctxt "grants_club_section" msgid "Practice hours of adults (64 years and over)" msgstr "64 vuotta täyttäneiden harjoitustunnit yhteensä" msgctxt "grants_club_section" -msgid "Boys (under 20 years of age)" -msgstr "Pojat (alle 20-vuotiaat)" +msgid "Boys from Helsinki (under 20 years of age)" +msgstr "Helsinkiläiset pojat (alle 20-vuotiaat)" msgctxt "grants_club_section" -msgid "Girls (under 20 years of age)" -msgstr "Tytöt (alle 20-vuotiaat)" +msgid "Girls from Helsinki (under 20 years of age)" +msgstr "Helsinkiläiset tytöt (alle 20-vuotiaat)" msgctxt "grants_club_section" -msgid "Others (under 20 years of age)" -msgstr "Muut (alle 20-vuotiaat)" +msgid "Others from Helsinki (under 20 years of age)" +msgstr "Helsinkiläiset muut (alle 20-vuotiaat)" msgctxt "grants_club_section" msgid "Practice hours of children/young people (under 20 years of age)" diff --git a/public/modules/custom/grants_club_section/translations/sv.po b/public/modules/custom/grants_club_section/translations/sv.po index a8c1e3f35d..9845ed3de1 100644 --- a/public/modules/custom/grants_club_section/translations/sv.po +++ b/public/modules/custom/grants_club_section/translations/sv.po @@ -344,48 +344,52 @@ msgid "Sport" msgstr "Sport" msgctxt "grants_club_section" -msgid "Women (20-63 years)" -msgstr "Kvinnor (20-63 år)" +msgid "Women from Helsinki (20-63 years)" +msgstr "Kvinnor från Helsingfors (20-63 år)" msgctxt "grants_club_section" -msgid "Men (20-63 years)" -msgstr "Män (20-63 år)" +msgid "Men from Helsinki (20-63 years)" +msgstr "Män från Helsingfors (20-63 år)" msgctxt "grants_club_section" -msgid "Others (20-63 years)" -msgstr "Övriga (20-63 år)" +msgid "Others from Helsinki (20-63 years)" +msgstr "Övriga från Helsingfors (20-63 år)" msgctxt "grants_club_section" msgid "Practice hours of adults (20-63 years)" msgstr "Träningstimmar för vuxna (20-63 år)" msgctxt "grants_club_section" -msgid "Men (64 years and over)" -msgstr "Män (64 år och äldre)" +msgid "

In the practice hours section, do not report the training output of individual actives, but the actual practice hours organized for Helsinki residents belonging to the age group.

If the actual number of training hours for an age group cannot be ascertained (e.g. many mixed groups), can the share of that age group be calculated from the total number of hours based on the share of the number of active members from Helsinki in the age group out of the total number of active members from Helsinki. E.g. the total number of hours in the division (all mixed groups) is 100 hours, where 10 adults and 20 under 20-year-olds are active: the number of hours for adults is 33 hours and for under 20-year-olds 67 hours. However, the actual number of hours realized for the age group should be used primarily.

" +msgstr "

I avsnittet träningstimmar, rapportera inte enskilda idrottsutövarnas träningsprestationer i timmar, utan de faktiska träningstimmar som organiserats för helsingforsare som tillhör åldersgruppen.

Om det faktiska antalet träningstimmar för en åldersgrupp inte kan fastställas (t. ex. många blandade träningsgrupper), kan andelen av den åldersgruppen beräknas från det totala antalet timmar baserat på andelen av antalet aktiva idrottsutövare från Helsingfors i åldersgruppen av det totala antalet aktiva idrottsutövare från Helsingfors. T. ex. totala antalet timmar i grensektionen (alla blandade grupper) är 100 timmar, där 10 vuxna och 20 under 20-åringar är aktiva: antalet timmar för vuxna är 33 timmar och för under 20-åringar 67 timmar. Det faktiska antalet realiserade timmar för åldersgruppen bör dock i första hand användas.

" msgctxt "grants_club_section" -msgid "Women (64 years and over)" -msgstr "Kvinnor (64 år och äldre)" +msgid "Men from Helsinki (64 years and over)" +msgstr "Män från Helsingfors (64 år och äldre)" msgctxt "grants_club_section" -msgid "Others (64 years and over)" -msgstr "Övriga (64 år och äldre)" +msgid "Women from Helsinki (64 years and over)" +msgstr "Kvinnor från Helsingfors (64 år och äldre)" + +msgctxt "grants_club_section" +msgid "Others from Helsinki (64 years and over)" +msgstr "Övriga från Helsingfors (64 år och äldre)" msgctxt "grants_club_section" msgid "Practice hours of adults (64 years and over)" msgstr "Träningstimmar för vuxna (64 år och äldre)" msgctxt "grants_club_section" -msgid "Boys (under 20 years of age)" -msgstr "Pojkar (under 20 år)" +msgid "Boys from Helsinki (under 20 years of age)" +msgstr "Pojkar från Helsingfors (under 20 år)" msgctxt "grants_club_section" -msgid "Girls (under 20 years of age)" -msgstr "Flickor (under 20 år)" +msgid "Girls from Helsinki (under 20 years of age)" +msgstr "Flickor från Helsingfors (under 20 år)" msgctxt "grants_club_section" -msgid "Others (under 20 years of age)" -msgstr "Övriga (under 20 år)" +msgid "Others from Helsinki (under 20 years of age)" +msgstr "Övriga från Helsingfors (under 20 år)" msgctxt "grants_club_section" msgid "Practice hours of children/young people (under 20 years of age)" diff --git a/public/modules/custom/grants_events/src/EventsService.php b/public/modules/custom/grants_events/src/EventsService.php index 8e88fd2f7d..8ffa9df10c 100644 --- a/public/modules/custom/grants_events/src/EventsService.php +++ b/public/modules/custom/grants_events/src/EventsService.php @@ -7,6 +7,7 @@ use Drupal\Core\Logger\LoggerChannelInterface; use Drupal\grants_handler\DebuggableTrait; use Drupal\grants_metadata\AtvSchema; +use Drupal\helfi_atv\AtvDocument; use GuzzleHttp\Client; use GuzzleHttp\Exception\GuzzleException; use Ramsey\Uuid\Uuid; @@ -67,6 +68,7 @@ class EventsService { 'MESSAGE_READ' => 'MESSAGE_READ', 'MESSAGE_RESEND' => 'MESSAGE_RESEND', 'HANDLER_ATT_OK' => 'HANDLER_ATT_OK', + 'HANDLER_SEND_INTEGRATION' => 'HANDLER_SEND_INTEGRATION', 'HANDLER_ATT_DELETE' => 'HANDLER_ATT_DELETE', 'HANDLER_RESEND_APP' => 'HANDLER_RESEND_APP', 'HANDLER_APP_COPIED' => 'HANDLER_APP_COPIED', @@ -139,7 +141,7 @@ public function logEvent( ): ?array { if (empty($eventData)) { - $eventData = self::getEventData($eventType, $applicationNumber, $eventDescription, $eventTarget); + $eventData = $this->getEventData($eventType, $applicationNumber, $eventDescription, $eventTarget); } $eventDataJson = Json::encode($eventData); @@ -212,7 +214,7 @@ public function filterEvents(array $events, string $typeKey): array { * @param string $eventDescription * Event description. * @param string $eventTarget - * Eent target. + * Event target. * * @return array * Event data in array. @@ -245,4 +247,22 @@ public function getEventData(string $eventType, string $applicationNumber, strin return $eventData; } + /** + * Add new event to application document. + * + * @param \Drupal\helfi_atv\AtvDocument $document + * Document to be updated. + * @param array $eventData + * Event data to be added. + */ + public function addNewEventForApplication(AtvDocument &$document, array $eventData): void { + $documentContent = $document->getContent(); + $documentEvents = $documentContent['events'] ?? []; + $documentEvents[] = $eventData; + $documentContent['events'] = $documentEvents; + + $document->setContent($documentContent); + + } + } diff --git a/public/modules/custom/grants_handler/grants_handler.libraries.yml b/public/modules/custom/grants_handler/grants_handler.libraries.yml index 9ba38aff5b..029766017b 100644 --- a/public/modules/custom/grants_handler/grants_handler.libraries.yml +++ b/public/modules/custom/grants_handler/grants_handler.libraries.yml @@ -61,3 +61,11 @@ grants-dialog: js/grants-dialog.js: { } dependencies: - core/drupal + +application-copy-dialog: + js: + js/application-copy-dialog.js: {} + dependencies: + - core/jquery + - core/drupal + - core/drupalSettings diff --git a/public/modules/custom/grants_handler/grants_handler.module b/public/modules/custom/grants_handler/grants_handler.module index 39f5111cd1..df4f2a8c13 100644 --- a/public/modules/custom/grants_handler/grants_handler.module +++ b/public/modules/custom/grants_handler/grants_handler.module @@ -21,7 +21,6 @@ use Drupal\Core\Url; use Drupal\grants_attachments\AttachmentHandlerHelper; use Drupal\grants_handler\ApplicationHelpers; use Drupal\grants_handler\Event\UserLogoutEvent; -use Drupal\grants_handler\Form\CopyApplicationModalForm; use Drupal\grants_handler\GrantsErrorStorage; use Drupal\grants_handler\Helpers; use Drupal\grants_handler\Plugin\WebformElement\CompensationsComposite; @@ -648,6 +647,31 @@ function _grants_handler_alter_number_fields(&$element): void { } } +/** + * Function to update custom component dropdown value rather than via config. + * + * @param array $form + * The form. + * + * @return void + * No return? + */ +function grants_handler__update_issuer_dropdown(array &$form): void { + + $tOpts = ['context' => 'Grant Issuers']; + + $newOptions = [ + 1 => t('State', [], $tOpts), + 3 => t('EU', [], $tOpts), + 4 => t('Other', [], $tOpts), + 5 => t('Foundation', [], $tOpts), + ]; + + // Call the method with multiple field names. + ApplicationHelpers::updateFieldOptions($form, $newOptions, ['myonnetty_avustus', 'issuer']); + ApplicationHelpers::updateFieldOptions($form, $newOptions, ['haettu_avustus_tieto', 'issuer']); +} + /** * Implements hook_form_FORM_ID_alter(). */ @@ -667,6 +691,7 @@ function grants_handler_webform_submission_form_alter(&$form, FormStateInterface $form['actions']['wizard_next']['#validate'][] = '::noValidate'; _grants_handler_alter_number_fields($form); + grants_handler__update_issuer_dropdown($form); $grants_formnavigation_helper = \Drupal::service('grants_handler.navigation_helper'); $all_errors = []; @@ -938,7 +963,8 @@ function grants_handler_preprocess_webform_submission_data(&$variables) { /** * Implements hook_preprocess_HOOK(). */ -function grants_handler_preprocess_webform_submission(&$variables) { +function grants_handler_preprocess_webform_submission(&$variables): void { + // Get submission object. /** @var \Drupal\webform\Entity\WebformSubmission $submission */ $submission = $variables['webform_submission']; @@ -1279,6 +1305,11 @@ function grants_handler_preprocess_webform_submission_form(&$variables) { $navigationHelper = \Drupal::service('grants_handler.navigation_helper'); // Get errors for printing. $variables['errors'] = $navigationHelper->getAllErrors($webform_submission); + + $variables['unvisited_pages'] = $navigationHelper->getUnvisitedPages($webform_submission); + $variables['display_visit_all_pages_warning'] = + $navigationHelper->getCurrentPage($webform_submission) === 'webform_preview' && + count($variables['unvisited_pages']) > 0; } /** @@ -1361,7 +1392,6 @@ function grants_handler_preprocess_application_list(&$variables) { * Implements hook_preprocess_HOOK(). */ function grants_handler_preprocess_application_list_item(&$variables): void { - $language = \Drupal::languageManager()->getCurrentLanguage()->getId(); $tOpts = ['context' => 'grants_handler']; // Get status service and get listed statuses. @@ -1377,9 +1407,20 @@ function grants_handler_preprocess_application_list_item(&$variables): void { return; } - $applicationTypes = Helpers::getApplicationTypes(); + if (!isset($submissionData["metadata"]["form_uuid"])) { + \Drupal::logger('grants_handler') + ->error('No form uuid found for submission @submissionId', + ['@submissionId' => $submissionData["application_number"]]); + return; + } + + /** @var \Drupal\grants_handler\ApplicationGetterService $applicationGetterService */ + $applicationGetterService = \Drupal::service('grants_handler.application_getter_service'); - $variables['applicationFormName'] = $applicationTypes[$submissionData["application_type"]][$language]; + // Get webform. + $webform = $applicationGetterService->getWebformFromApplicationNumber($submissionData["application_number"]); + // Set webform title. + $variables['applicationFormName'] = $webform->label(); $variables['applicationNumber'] = $submissionData["application_number"]; @@ -1503,8 +1544,8 @@ function grants_handler_preprocess_application_list_item(&$variables): void { $status = $applicationStatusService->getWebformStatus($webform); - $variables['openStartDate'] = strtotime($thirdPartySettings['applicationOpen']); - $variables['openEndDate'] = strtotime($thirdPartySettings['applicationClose']); + $variables['openStartDate'] = $thirdPartySettings['applicationOpen'] ? strtotime($thirdPartySettings['applicationOpen']) : ''; + $variables['openEndDate'] = $thirdPartySettings['applicationClose'] ? strtotime($thirdPartySettings['applicationClose']) : ''; $variables['isContinuous'] = $thirdPartySettings['applicationContinuous'] != 0; if (!$variables['isContinuous'] && ($variables['openStartDate'] > time() || $variables['openEndDate'] < time())) { $variables['errorType'] = 'NOT_OPEN'; @@ -1729,6 +1770,8 @@ function grants_handler_preprocess_webform_submission_information(array &$variab $webform = $submission->getWebForm(); $thirdPartySettings = $webform->getThirdPartySettings('grants_metadata'); + $applicationNumber = $submissionData['application_number'] ?? ApplicationHelpers::createApplicationNumber($submission); + $printApplicationUrl = Url::fromRoute( 'grants_webform_print.submission_print', [ @@ -1794,38 +1837,36 @@ function grants_handler_preprocess_webform_submission_information(array &$variab !$isApplicationArchived && $isApplicationOpen ) { + $copyApplicationUrl = Url::fromRoute( - 'grants_handler.copy_application_modal', + 'grants_handler.copy_application', [ 'submission_id' => $submissionData['application_number'], - 'nojs' => 'ajax', - ], - [ - 'attributes' => [ - 'class' => ['use-ajax', 'hds-button', 'hds-button--supplementary'], - 'data-dialog-type' => 'modal', - 'data-dialog-options' => json_encode(CopyApplicationModalForm::getDataDialogOptions()), - // Add this id so that we can test this form. - 'id' => 'copy-application-modal-form-link', - ], ] ); - $copyApplicationLinkText = [ - '#theme' => 'edit-label-with-icon', - '#icon' => 'copy', - '#text_label' => t('Copy application', [], $tOpts), + + // Attach the JavaScript file. + $variables['#attached']['library'][] = 'grants_handler/grants-dialog'; + $variables['#attached']['library'][] = 'grants_handler/application-copy-dialog'; + + // Render a Twig template. + $html_content = \Drupal::service('twig')->render('themes/custom/hdbt_subtheme/templates/webform/application-copy-dialog-content.html.twig', [ + 'applicationNumber' => $applicationNumber, + 'webformTitle' => $webform->label(), + ]); + + // Define the settings you want to pass. + $variables['#attached']['drupalSettings']['grants_handler'] = [ + 'copyUrl' => $copyApplicationUrl->toString(), + 'htmlContent' => $html_content, ]; - $copyApplicationLink = Link::fromTextAndUrl($copyApplicationLinkText, $copyApplicationUrl); - $variables['copyApplicationLink'] = $copyApplicationLink; + $variables['copyText'] = t('Copy application', [], $tOpts); } $variables['formTitle'] = $webform->label(); $variables['printLink'] = ''; $variables['copyLink'] = ''; - $submissionData = $submission->getData(); - $applicationNumber = $submissionData['application_number'] ?? ApplicationHelpers::createApplicationNumber($submission); - $variables['applicationNumber'] = $applicationNumber; $variables['isEditable'] = $applicationStatusService->isSubmissionEditable($submission); $variables['isEditPage'] = 'grants_handler.edit_application' === \Drupal::routeMatch() @@ -1859,6 +1900,7 @@ function grants_handler_preprocess_webform_submission_information(array &$variab '#theme' => 'webform_submission_attachment_list', '#submission' => $submission, ]; + } /** diff --git a/public/modules/custom/grants_handler/grants_handler.routing.yml b/public/modules/custom/grants_handler/grants_handler.routing.yml index 70d03be369..b183f94e71 100644 --- a/public/modules/custom/grants_handler/grants_handler.routing.yml +++ b/public/modules/custom/grants_handler/grants_handler.routing.yml @@ -22,6 +22,14 @@ grants_handler.view_application: requirements: _custom_access: '\Drupal\grants_handler\Controller\ApplicationController::accessByApplicationNumber' +grants_handler.copy_application: + path: '/hakemus/{submission_id}/kopioi' + defaults: + _title_callback: '\Drupal\grants_handler\Controller\ApplicationController::getTitle' + _controller: '\Drupal\grants_handler\Controller\CopyApplicationAjaxController' + requirements: + _custom_access: '\Drupal\grants_handler\Controller\ApplicationController::accessByApplicationNumber' + grants_handler.edit_application: path: '/hakemus/{webform}/{webform_submission}/muokkaa' defaults: @@ -45,26 +53,10 @@ grants_handler.message_read: requirements: _custom_access: '\Drupal\grants_handler\Controller\ApplicationController::accessByApplicationNumber' -grants_handler.copy_application: - path: '/hakemus/{submission_id}/kopioi' - defaults: - _title: 'Copy application' - _form: 'Drupal\grants_handler\Form\CopyApplicationForm' - requirements: - _custom_access: '\Drupal\grants_handler\Controller\ApplicationController::accessByApplicationNumber' - -grants_handler.copy_application_modal: - path: '/hakemus/{submission_id}/kopioi/{nojs}' - defaults: - _title: 'You are copying an application' - _form: 'Drupal\grants_handler\Form\CopyApplicationModalForm' - requirements: - _custom_access: '\Drupal\grants_handler\Controller\ApplicationController::accessByApplicationNumber' - -grants_handler.print_application_atv: +grants_handler.atv_print_view: path: '/hakemus/{submission_id}/tulosta' defaults: _title_callback: '\Drupal\grants_handler\Controller\ApplicationController::getTitle' - _controller: '\Drupal\grants_handler\Controller\ApplicationController::printViewAtv' + _controller: '\Drupal\grants_handler\Controller\AtvPrintViewController' requirements: _custom_access: '\Drupal\grants_handler\Controller\ApplicationController::accessByApplicationNumber' diff --git a/public/modules/custom/grants_handler/grants_handler.services.yml b/public/modules/custom/grants_handler/grants_handler.services.yml index c054cdd8b7..103f38847d 100644 --- a/public/modules/custom/grants_handler/grants_handler.services.yml +++ b/public/modules/custom/grants_handler/grants_handler.services.yml @@ -155,9 +155,15 @@ services: '@messenger', '@grants_handler.application_getter_service', '@helfi_helsinki_profiili.userdata', - '@grants_attachments.attachment_fixer_service' + '@grants_attachments.attachment_fixer_service', + '@current_user', + '@database', + '@grants_events.events_service' ] grants_handler.application_access_handler: class: Drupal\grants_handler\ApplicationAccessHandler - arguments: ['@grants_profile.service'] + arguments: [ + '@grants_profile.service', + '@grants_handler.application_getter_service' + ] diff --git a/public/modules/custom/grants_handler/js/application-copy-dialog.js b/public/modules/custom/grants_handler/js/application-copy-dialog.js new file mode 100644 index 0000000000..3482db5ca0 --- /dev/null +++ b/public/modules/custom/grants_handler/js/application-copy-dialog.js @@ -0,0 +1,36 @@ +(function (Drupal) { + Drupal.behaviors.copyApplicationModalForm = { + attach: function (context, settings) { + const triggerButton = document.getElementById('copy-application-button'); + + triggerButton.addEventListener('click', function (event) { + + event.preventDefault(); + + const htmlContent = drupalSettings.grants_handler.htmlContent; + const copyUrl = drupalSettings.grants_handler.copyUrl; + + Drupal.dialogFunctions.createDialog({ + dialogContent: htmlContent, + actionButtonText: Drupal.t('Copy application'), + backButtonText: Drupal.t('Close', {}, { context: 'grants_handler' }), + closeButtonText: Drupal.t('Close', {}, { context: 'grants_handler' }), + actionButtonCallback: () => { + // Redirect to a new URL + window.location.href = copyUrl; + /* + We probably should handle the whole copy process here, but for + now we just redirect to the copy URL. + + Much better UX would be to show spinner here while copying + application and then redirect when it's ready + + */ + }, + dialogTitle: Drupal.t('Copy application'), + customSelector: 'application-copy-dialog' + }) + }); + }, + }; +})(Drupal); diff --git a/public/modules/custom/grants_handler/js/grants-dialog.js b/public/modules/custom/grants_handler/js/grants-dialog.js index 925eead272..a1f651173d 100644 --- a/public/modules/custom/grants_handler/js/grants-dialog.js +++ b/public/modules/custom/grants_handler/js/grants-dialog.js @@ -12,31 +12,51 @@ * closes the dialog. * @param {Function} actionButtonCallback - The function to execute when * the "action" button is clicked. + * @param dialogTitle + * If we want to override the default title + * @param {Function} closeButtonCallback + * The function to execute when the "close" button is clicked. + * @param {Function} backButtonCallback + * The function to execute when the "back" button is clicked. + * @param escapeButtonCallback + * The function to execute when the "escape" button is clicked. + * @param customSelector + * If we want to add a custom class to the dialog container */ - createDialog: (dialogContent, actionButtonText, backButtonText, closeButtonText, actionButtonCallback = null) => { - const dialogTitle = Drupal.t('Attention', {}, { context: 'grants_handler' }); + createDialog: ({ + dialogContent, + actionButtonText, + backButtonText, + closeButtonText, + dialogTitle = Drupal.t('Attention', {}, { context: 'grants_handler' }), + actionButtonCallback = null, + closeButtonCallback = null, + backButtonCallback = null, + escapeButtonCallback = null, + customSelector = '', + }) => { const actionButtonHTML = actionButtonText && ``; const backButtonHTML = backButtonText && ``; const closeButtonHTML = closeButtonText && ``; const dialogHTML = ` -
-
- -
- ${closeButtonHTML} -

${dialogTitle}

-
-
- ${dialogContent} -
-
- ${actionButtonHTML} - ${backButtonHTML} -
-
+
+
+ +
+ ${closeButtonHTML} +

${dialogTitle}

- `; +
+ ${dialogContent} +
+
+ ${actionButtonHTML} + ${backButtonHTML} +
+
+
+ `; // TODO: Surveys use very similar javascript dialog implementation. // This and the survey implementation could possibly be merged with some @@ -54,7 +74,7 @@ const closeButton = document.getElementById('helfi-dialog__close-button'); const dialog = document.getElementById('helfi-dialog__container'); const dialogFocusTrap = window.focusTrap.createFocusTrap('#helfi-dialog__container', { - initialFocus: () => '#helfi-dialog__title' + initialFocus: () => '#helfi-dialog__title', }); // Activate the focus trap so that the user needs to react to the dialog. @@ -68,18 +88,30 @@ // Add click event listener to back button backButton.addEventListener('click', () => { dialogFocusTrap.deactivate(); + // If we have a callback, execute it. + if (backButtonCallback) { + backButtonCallback(); + } Drupal.dialogFunctions.removeDialog(dialog); }); // Add click event listener to close button closeButton.addEventListener('click', () => { dialogFocusTrap.deactivate(); + // If we have a callback, execute it. + if (closeButtonCallback) { + closeButtonCallback(); + } Drupal.dialogFunctions.removeDialog(dialog); }); // Add event listener to ESC button to remove the dialog document.body.addEventListener('keydown', function (event) { if (event.key === 'Escape') { + // If we have a escapeButtonCallback, execute it also when pressing escape. + if (escapeButtonCallback) { + escapeButtonCallback(); + } Drupal.dialogFunctions.removeDialog(dialog); } }); @@ -90,8 +122,7 @@ document.body.style.paddingRight = `${ window.innerWidth - document.documentElement.clientWidth }px`; - } - else { + } else { document.body.style.removeProperty('padding-right'); } }, @@ -105,6 +136,6 @@ dialog.remove(); Drupal.dialogFunctions.toggleNoScroll(false); Drupal.dialogFunctions.setBodyPaddingRight(false); - } - } + }, + }; })(Drupal); diff --git a/public/modules/custom/grants_handler/js/webform.form.unsaved.js b/public/modules/custom/grants_handler/js/webform.form.unsaved.js index 99e66c6b8d..4f96d10cd1 100644 --- a/public/modules/custom/grants_handler/js/webform.form.unsaved.js +++ b/public/modules/custom/grants_handler/js/webform.form.unsaved.js @@ -108,7 +108,7 @@ }); }); } - } + }, }; $('a').on('click', function (event) { @@ -116,18 +116,18 @@ if (unsaved && !containingElement.contains(event.target) && !event.target.getAttribute('href').startsWith('#')) { event.preventDefault(); - return Drupal.dialogFunctions.createDialog( - Drupal.t('You have unsaved changes. Are you sure you want to leave?', {}, { context: 'grants_handler' }), - Drupal.t('Leave the application', {}, { context: 'grants_handler' }), - Drupal.t('Back to application', {}, { context: 'grants_handler' }), - Drupal.t('Close', {}, { context: 'grants_handler' }), - () => { + return Drupal.dialogFunctions.createDialog({ + dialogContent: Drupal.t('You have unsaved changes. Are you sure you want to leave?', {}, { context: 'grants_handler' }), + actionButtonText: Drupal.t('Leave the application', {}, { context: 'grants_handler' }), + backButtonText: Drupal.t('Back to application', {}, { context: 'grants_handler' }), + closeButtonText: Drupal.t('Close', {}, { context: 'grants_handler' }), + actionButtonCallback: () => { unsaved = false; const dialog = document.getElementById('helfi-dialog__container'); Drupal.dialogFunctions.removeDialog(dialog); window.top.location.href = event.currentTarget.href; - } - ); + }, + }); } }); @@ -147,18 +147,18 @@ if (unsaved && (e.which === 116 || (e.which === 82 && (e.ctrlKey || e.metaKey)))) { e.preventDefault(); // Prevent F5 and Ctrl+R / Cmd+R refresh - return Drupal.dialogFunctions.createDialog( - Drupal.t('You have unsaved changes. Are you sure you want to refresh?', {}, { context: 'grants_handler' }), - Drupal.t('Refresh the page', {}, { context: 'grants_handler' }), - Drupal.t('Back to application', {}, { context: 'grants_handler' }), - Drupal.t('Close', {}, { context: 'grants_handler' }), - () => { + return Drupal.dialogFunctions.createDialog({ + dialogContent: Drupal.t('You have unsaved changes. Are you sure you want to refresh?', {}, { context: 'grants_handler' }), + actionButtonText: Drupal.t('Refresh the page', {}, { context: 'grants_handler' }), + backButtonText: Drupal.t('Back to application', {}, { context: 'grants_handler' }), + closeButtonText: Drupal.t('Close', {}, { context: 'grants_handler' }), + actionButtonCallback: () => { unsaved = false; const dialog = document.getElementById('helfi-dialog__container'); Drupal.dialogFunctions.removeDialog(dialog); location.reload(); - } - ); + }, + }); } }); diff --git a/public/modules/custom/grants_handler/phpunit.xml b/public/modules/custom/grants_handler/phpunit.xml index fd7672ac52..ec1307b36e 100644 --- a/public/modules/custom/grants_handler/phpunit.xml +++ b/public/modules/custom/grants_handler/phpunit.xml @@ -1,44 +1,47 @@ - - - - - - - - - - - ./tests/src/Kernel - - - - - - - - - ./src - ./*.module - - - - - - + xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd" + bootstrap="../../../core/tests/bootstrap.php" + colors="true" + cacheResultFile=".phpunit.cache/test-results" + executionOrder="depends,defects" + forceCoversAnnotation="true" + beStrictAboutTestsThatDoNotTestAnything="true" + beStrictAboutOutputDuringTests="true" + beStrictAboutChangesToGlobalState="true" + beStrictAboutCoversAnnotation="true" + printerClass="\Drupal\Tests\Listeners\HtmlOutputPrinter" + failOnRisky="true" + failOnWarning="true" + verbose="true"> + + + + + + + + + + + ./tests/src/Kernel + + + ./tests/src/Unit + + + + + + + + + ./src + ./*.module + + + + + + diff --git a/public/modules/custom/grants_handler/src/ApplicationAccessHandler.php b/public/modules/custom/grants_handler/src/ApplicationAccessHandler.php index 3919b5d13e..c8181a755e 100644 --- a/public/modules/custom/grants_handler/src/ApplicationAccessHandler.php +++ b/public/modules/custom/grants_handler/src/ApplicationAccessHandler.php @@ -6,7 +6,6 @@ use Drupal\grants_mandate\CompanySelectException; use Drupal\grants_profile\GrantsProfileService; -use Drupal\helfi_atv\AtvDocumentNotFoundException; use Drupal\webform\Entity\WebformSubmission; /** @@ -19,6 +18,7 @@ */ public function __construct( private GrantsProfileService $grantsProfileService, + private ApplicationGetterService $applicationGetterService, ) {} /** @@ -30,7 +30,8 @@ public function __construct( * @return bool * Access status * - * @throws \GuzzleHttp\Exception\GuzzleException + * @throws \Drupal\grants_profile\GrantsProfileException + * @throws \Drupal\grants_mandate\CompanySelectException */ public function singleSubmissionAccess(WebformSubmission $webform_submission): bool { @@ -51,12 +52,12 @@ public function singleSubmissionAccess(WebformSubmission $webform_submission): b return FALSE; } - try { - $atvDoc = ApplicationHelpers::atvDocumentFromApplicationNumber($webformData['application_number']); - } - catch (AtvDocumentNotFoundException $e) { + $atvDoc = $this->applicationGetterService->getAtvDocument($webformData['application_number']); + + if (!$atvDoc) { return FALSE; } + $atvMetadata = $atvDoc->getMetadata(); // Mismatch between profile and application applicant type. if ($companyType !== $webformData['hakijan_tiedot']['applicantType']) { diff --git a/public/modules/custom/grants_handler/src/ApplicationGetterService.php b/public/modules/custom/grants_handler/src/ApplicationGetterService.php index c7b397538e..0372e01b86 100644 --- a/public/modules/custom/grants_handler/src/ApplicationGetterService.php +++ b/public/modules/custom/grants_handler/src/ApplicationGetterService.php @@ -6,19 +6,22 @@ use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException; use Drupal\Component\Plugin\Exception\PluginNotFoundException; -use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Logger\LoggerChannelFactoryInterface; use Drupal\Core\Logger\LoggerChannelInterface; use Drupal\grants_mandate\CompanySelectException; -use Drupal\grants_metadata\AtvSchema; use Drupal\grants_metadata\DocumentContentMapper; use Drupal\grants_profile\GrantsProfileService; use Drupal\helfi_atv\AtvDocument; use Drupal\helfi_atv\AtvDocumentNotFoundException; +use Drupal\helfi_atv\AtvFailedToConnectException; use Drupal\helfi_atv\AtvService; use Drupal\helfi_helsinki_profiili\HelsinkiProfiiliUserData; +use Drupal\helfi_helsinki_profiili\TokenExpiredException; +use Drupal\webform\Entity\Webform; use Drupal\webform\Entity\WebformSubmission; +use Drupal\webform\WebformException; +use GuzzleHttp\Exception\GuzzleException; /** * Class to get things related to applications. @@ -32,13 +35,6 @@ final class ApplicationGetterService { */ protected GrantsProfileService $grantsProfileService; - /** - * Atv document holding this application. - * - * @var \Drupal\helfi_atv\AtvDocument - */ - protected AtvDocument $atvDocument; - /** * Log errors. * @@ -47,11 +43,11 @@ final class ApplicationGetterService { protected LoggerChannelInterface $logger; /** - * Webform submission storage. + * Loaded submissions in array to prevent multiple loads. * - * @var \Drupal\Core\Entity\EntityStorageInterface + * @var array */ - protected EntityStorageInterface $storage; + protected array $submissions = []; /** * Constructs an ApplicationGetterService object. @@ -65,11 +61,6 @@ public function __construct( private readonly EntityTypeManagerInterface $entityTypeManager, ) { $this->logger = $loggerChannelFactory->get('application_getter_service'); - try { - $this->storage = $entityTypeManager->getStorage('webform_submission'); - } - catch (InvalidPluginDefinitionException | PluginNotFoundException $e) { - } } /** @@ -90,26 +81,26 @@ public function setGrantsProfileService(GrantsProfileService $grantsProfileServi * @param bool $refetch * Force atv document fetch. * - * @return \Drupal\helfi_atv\AtvDocument + * @return \Drupal\helfi_atv\AtvDocument|null * FEtched document. - * - * @throws \Drupal\helfi_atv\AtvDocumentNotFoundException - * @throws \Drupal\helfi_atv\AtvFailedToConnectException - * @throws \GuzzleHttp\Exception\GuzzleException */ - public function getAtvDocument(string $transactionId, bool $refetch = FALSE): AtvDocument { + public function getAtvDocument(string $transactionId, bool $refetch = FALSE): ?AtvDocument { + $sParams = [ + 'transaction_id' => $transactionId, + 'lookfor' => 'appenv:' . Helpers::getAppEnv(), + ]; - if (!isset($this->atvDocument) || $refetch === TRUE) { - $sParams = [ - 'transaction_id' => $transactionId, - 'lookfor' => 'appenv:' . Helpers::getAppEnv(), - ]; - - $res = $this->helfiAtvAtvService->searchDocuments($sParams); - $this->atvDocument = reset($res); + try { + $result = $this->helfiAtvAtvService->searchDocuments($sParams, $refetch); } - - return $this->atvDocument; + catch (AtvDocumentNotFoundException | AtvFailedToConnectException | TokenExpiredException | GuzzleException $e) { + $this->logger->error( + 'Failed to get document from ATV. Error: @error', + ['@error' => $e->getMessage()] + ); + return NULL; + } + return reset($result); } /** @@ -132,7 +123,7 @@ public function getAtvDocument(string $transactionId, bool $refetch = FALSE): At * * @throws \Drupal\helfi_atv\AtvDocumentNotFoundException * @throws \Drupal\helfi_atv\AtvFailedToConnectException - * @throws \GuzzleHttp\Exception\GuzzleException + * @throws \GuzzleHttp\Exception\GuzzleException|\Drupal\helfi_helsinki_profiili\TokenExpiredException */ public function getCompanyApplications( array $selectedCompany, @@ -141,7 +132,6 @@ public function getCompanyApplications( bool $sortByStatus = FALSE, string $themeHook = '', ): array { - $userData = $this->helfiHelsinkiProfiiliUserdata->getUserData(); $applications = []; @@ -177,72 +167,37 @@ public function getCompanyApplications( $applicationDocuments = $this->helfiAtvAtvService->searchDocuments($searchParams); - /** + /* * Create rows for table. - * - * @var \Drupal\helfi_atv\AtvDocument $document */ foreach ($applicationDocuments as $document) { - // Make sure the type is acceptable one. - $docArray = $document->toArray(); - $id = AtvSchema::extractDataForWebForm( - $docArray['content'], ['applicationNumber'] - ); - if (empty($id['applicationNumber'])) { - continue; - } + $applicationNumber = $document->getTransactionId(); if (array_key_exists($document->getType(), Helpers::getApplicationTypes())) { try { - - // Convert the data. - $dataDefinition = ApplicationHelpers::getDataDefinition($document->getType()); - $submissionData = DocumentContentMapper::documentContentToTypedData( - $document->getContent(), - $dataDefinition, - $document->getMetadata() - ); - - $metaData = $document->getMetadata(); - - // Load the webform submission ID. - $applicationNumber = $submissionData['application_number']; - $serial = ApplicationHelpers::getSerialFromApplicationNumber($applicationNumber); - - $webformUuidExists = isset($metaData['form_uuid']) && !empty($metaData['form_uuid']); - $webform = $webformUuidExists - ? ApplicationHelpers::getWebformByUuid($metaData['form_uuid'], $applicationNumber) - : ApplicationHelpers::getWebformFromApplicationNumber($applicationNumber); - - if (!$webform || !$serial) { - continue; - } - - $submissionId = ApplicationHelpers::getSubmissionIdWithSerialAndWebformId($serial, $webform->id(), $document); + $submission = $this->submissionObjectFromApplicationNumber($applicationNumber, $document, FALSE, TRUE); } catch (\Throwable $e) { $this->logger->error( 'Failed to get submission object from application number. Submission skipped in application listing. ID: @id Error: @error', [ '@error' => $e->getMessage(), - '@id' => $document->getTransactionId(), + '@id' => $document->getTransactionId(), ] ); continue; } - if (!$submissionData || !$submissionId) { - continue; - } + $submissionData = $submission->getData(); $submissionData['messages'] = $this->grantsHandlerMessageService->parseMessages($submissionData); $submission = [ '#theme' => $themeHook, '#submission' => $submissionData, '#document' => $document, - '#webform' => $webform, - '#submission_id' => $submissionId, + '#webform' => $submission->getWebform(), + '#submission_id' => $submission->id(), ]; $ts = strtotime($submissionData['form_timestamp_created'] ?? ''); @@ -303,15 +258,8 @@ public function getCompanyApplications( * @return \Drupal\webform\Entity\WebformSubmission|null * Webform submission. * - * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException - * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException * @throws \Drupal\Core\Entity\EntityStorageException - * @throws \Drupal\Core\TempStore\TempStoreException * @throws \Drupal\grants_mandate\CompanySelectException - * @throws \Drupal\helfi_atv\AtvDocumentNotFoundException - * @throws \Drupal\helfi_atv\AtvFailedToConnectException - * @throws \GuzzleHttp\Exception\GuzzleException - * @throws \Drupal\helfi_helsinki_profiili\TokenExpiredException */ public function submissionObjectFromApplicationNumber( string $applicationNumber, @@ -319,24 +267,10 @@ public function submissionObjectFromApplicationNumber( bool $refetch = FALSE, bool $skipAccessCheck = FALSE, ): ?WebformSubmission { - - $submissionSerial = ApplicationHelpers::getSerialFromApplicationNumber($applicationNumber); - $webform = ApplicationHelpers::getWebformFromApplicationNumber($applicationNumber, TRUE); - - if (!$webform) { - return NULL; + if (isset($this->submissions[$applicationNumber])) { + return $this->submissions[$applicationNumber]; } - $webformIds = array_map(function ($element) { - return $element->id(); - }, $webform); - - $result = $this->storage - ->loadByProperties([ - 'serial' => $submissionSerial, - 'webform_id' => $webformIds, - ]); - $selectedCompany = $this->grantsProfileService->getSelectedRoleData(); // If no company selected, no mandates no access. @@ -344,20 +278,30 @@ public function submissionObjectFromApplicationNumber( throw new CompanySelectException('User not authorised'); } + // We need the ATV document to get the form uuid. if ($document == NULL) { - $sParams = [ - 'transaction_id' => $applicationNumber, - 'lookfor' => 'appenv:' . Helpers::getAppEnv(), - ]; + $document = $this->getAtvDocument($applicationNumber, $refetch); + } - $document = $this->helfiAtvAtvService->searchDocuments( - $sParams, - $refetch - ); - if (empty($document)) { - throw new AtvDocumentNotFoundException('Document not found'); - } - $document = reset($document); + // Get WebFrom from application number. + $webform = $this->getWebformFromApplicationNumber($applicationNumber); + + // Should we throw an error here? + if (!$webform) { + throw new WebformException('Webform not found'); + } + // Get serial from application number. + $submissionSerial = ApplicationHelpers::getSerialFromApplicationNumber($applicationNumber); + + try { + $result = $this->entityTypeManager->getStorage('webform_submission') + ->loadByProperties([ + 'serial' => $submissionSerial, + 'webform_id' => $webform->id(), + ]); + } + catch (InvalidPluginDefinitionException | PluginNotFoundException $e) { + throw new WebformException('Failed to load submission object with ATV data'); } $submissionObject = NULL; @@ -365,48 +309,100 @@ public function submissionObjectFromApplicationNumber( // If there's no local submission with given serial // we can actually create that object on the fly and use that for editing. if (empty($result)) { - $webform = ApplicationHelpers::getWebformFromApplicationNumber($applicationNumber); - if ($webform) { - /** @var \Drupal\webform\Entity\WebformSubmission $submissionObject */ - $submissionObject = WebformSubmission::create(['webform_id' => $webform->id()]); - $submissionObject->set('serial', $submissionSerial); - - // Lets mark that we don't want to generate new application - // number, as we just assigned the serial from ATV application id. - // check GrantsHandler@preSave. - WebformSubmissionNotesHelper::setValue( - $submissionObject, - 'skip_available_number_check', - TRUE - ); - if ($document->getStatus() == 'DRAFT') { - $submissionObject->set('in_draft', TRUE); - } - $submissionObject->save(); + /** @var \Drupal\webform\Entity\WebformSubmission $submissionObject */ + $submissionObject = WebformSubmission::create(['webform_id' => $webform->id()]); + $submissionObject->set('serial', $submissionSerial); + + // Lets mark that we don't want to generate new application + // number, as we just assigned the serial from ATV application id. + // check GrantsHandler@preSave. + WebformSubmissionNotesHelper::setValue( + $submissionObject, + 'skip_available_number_check', + TRUE + ); + if ($document->getStatus() == 'DRAFT') { + $submissionObject->set('in_draft', TRUE); } + $submissionObject->save(); } else { /** @var \Drupal\webform\Entity\WebformSubmission $submissionObject */ $submissionObject = reset($result); } - if ($submissionObject) { - $dataDefinition = ApplicationHelpers::getDataDefinition($document->getType()); + if (!$submissionObject) { + throw new WebformException('Failed to load submission object with ATV data'); + } - $sData = DocumentContentMapper::documentContentToTypedData( - $document->getContent(), - $dataDefinition, - $document->getMetadata() - ); + // Load definition. + $dataDefinition = $this->getDataDefinition($document->getType()); - $sData['messages'] = $this->grantsHandlerMessageService->parseMessages($sData); + // Build data. + $sData = DocumentContentMapper::documentContentToTypedData( + $document->getContent(), + $dataDefinition, + $document->getMetadata() + ); - // Set submission data from parsed mapper. - $submissionObject->setData($sData); + // Parse messages separately. + $sData['messages'] = $this->grantsHandlerMessageService->parseMessages($sData); - return $submissionObject; + // Set submission data from parsed mapper. + $submissionObject->setData($sData); + + // Set caching, as we don't want to load this again. + $this->submissions[$applicationNumber] = $submissionObject; + + return $submissionObject; + } + + /** + * Get data definition class from application type. + * + * @param string $type + * Type of the application. + */ + public function getDataDefinition(string $type) { + $defClass = Helpers::getApplicationTypes()[$type]['dataDefinition']['definitionClass']; + $defId = Helpers::getApplicationTypes()[$type]['dataDefinition']['definitionId']; + return $defClass::create($defId); + } + + /** + * Extract webform id from application number string. + * + * @param string $applicationNumber + * Application number. + * + * @return \Drupal\webform\Entity\Webform + * Webform object. + */ + public function getWebformFromApplicationNumber(string $applicationNumber): Webform { + // We need the ATV document to get the form uuid. + $document = $this->getAtvDocument($applicationNumber); + $uuid = $document->getMetadata()['form_uuid']; + + try { + // Try to load webform via UUID and return it. + $wids = $this->entityTypeManager->getStorage('webform') + ->getQuery() + ->condition('uuid', $uuid) + ->execute(); + return Webform::load(reset($wids)); + } + catch (InvalidPluginDefinitionException | PluginNotFoundException $e) { + // Log failure. + $this->logger->error( + 'Failed to load webform with uuid: @uuid. Error: @error', + [ + '@uuid' => $uuid, + '@error' => $e->getMessage(), + ] + ); } - return NULL; + // And return webform loaded the old way. + return ApplicationHelpers::getWebformFromApplicationNumber($applicationNumber); } } diff --git a/public/modules/custom/grants_handler/src/ApplicationHelpers.php b/public/modules/custom/grants_handler/src/ApplicationHelpers.php index e57a8d5793..5e67ec59fe 100644 --- a/public/modules/custom/grants_handler/src/ApplicationHelpers.php +++ b/public/modules/custom/grants_handler/src/ApplicationHelpers.php @@ -2,15 +2,8 @@ namespace Drupal\grants_handler; -use Drupal\Component\Datetime\Time; -use Drupal\Core\Database\Database; -use Drupal\grants_mandate\CompanySelectException; -use Drupal\helfi_atv\AtvDocument; -use Drupal\helfi_atv\AtvDocumentNotFoundException; use Drupal\webform\Entity\Webform; use Drupal\webform\Entity\WebformSubmission; -use Drupal\webform\WebformSubmissionInterface; -use Ramsey\Uuid\Uuid; /** * Handle all things related to applications & submission objects themselves. @@ -42,18 +35,18 @@ public static function createApplicationNumber(WebformSubmission &$submission, $ $appParam = Helpers::getAppEnv(); $serial = $submission->serial(); - $applicationType = $submission->getWebform() - ->getThirdPartySetting('grants_metadata', 'applicationType'); - $applicationTypeId = $submission->getWebform() - ->getThirdPartySetting('grants_metadata', 'applicationTypeID'); + $webform = $submission->getWebform(); + $third_party_settings = $webform->getThirdPartySettings('grants_metadata'); + + $applicationType = $third_party_settings['applicationType'] ?? NULL; + $applicationTypeId = $third_party_settings['applicationTypeID'] ?? NULL; if ($useOldFormat) { return self::getApplicationNumberInEnvFormatOldFormat($appParam, $applicationType, $serial); } return self::getApplicationNumberInEnvFormat($appParam, $applicationTypeId, $serial); - } /** @@ -72,12 +65,14 @@ public static function createApplicationNumber(WebformSubmission &$submission, $ * @throws \Drupal\helfi_atv\AtvUnexpectedResponseException */ public static function getAvailableApplicationNumber(WebformSubmission &$submission): string { - $appParam = Helpers::getAppEnv(); $serial = $submission->serial(); $webform_id = $submission->getWebform()->id(); - $applicationTypeId = $submission->getWebform() - ->getThirdPartySetting('grants_metadata', 'applicationTypeID'); + + $thirdPartySettings = $submission->getWebform() + ->getThirdPartySettings('grants_metadata'); + + $applicationTypeId = $thirdPartySettings['applicationTypeID'] ?? NULL; $lastSerialKey = $applicationTypeId . '_' . $appParam; $kvService = \Drupal::service('keyvalue.database'); @@ -129,7 +124,7 @@ public static function getAvailableApplicationNumber(WebformSubmission &$submiss /** * Format application number based by the enviroment. */ - private static function getApplicationNumberInEnvFormat($appParam, $typeId, $serial): string { + protected static function getApplicationNumberInEnvFormat($appParam, $typeId, $serial): string { $applicationNumber = $appParam . '-' . str_pad($typeId, 3, '0', STR_PAD_LEFT) . '-' . str_pad($serial, 7, '0', STR_PAD_LEFT); @@ -145,7 +140,7 @@ private static function getApplicationNumberInEnvFormat($appParam, $typeId, $ser /** * Format application number based by the enviroment in old format. */ - private static function getApplicationNumberInEnvFormatOldFormat($appParam, $typeId, $serial): string { + protected static function getApplicationNumberInEnvFormatOldFormat($appParam, $typeId, $serial): string { $applicationNumber = 'GRANTS-' . $appParam . '-' . $typeId . '-' . sprintf('%08d', $serial); if ($appParam == 'PROD') { @@ -194,7 +189,9 @@ public static function hasBreakingChangesInNewerVersion(Webform $webform): bool return $map[$uuid]; } - $applicationType = $webform->getThirdPartySetting('grants_metadata', 'applicationType'); + $thirdPartySettingsWebform = $webform->getThirdPartySettings('grants_metadata'); + + $applicationType = $thirdPartySettingsWebform['applicationType'] ?? NULL; $latestApplicationForm = self::getLatestApplicationForm($applicationType); @@ -203,11 +200,11 @@ public static function hasBreakingChangesInNewerVersion(Webform $webform): bool return FALSE; } - $parent = $latestApplicationForm->getThirdPartySetting('grants_metadata', 'parent'); - $hasBreakingChanges = $latestApplicationForm->getThirdPartySetting('grants_metadata', 'avus2BreakingChange'); + $thirdPartySettingsLatest = $webform->getThirdPartySettings('grants_metadata'); + $parent = $thirdPartySettingsLatest['parent'] ?? NULL; + $hasBreakingChanges = $thirdPartySettingsLatest['avus2BreakingChange'] ?? NULL; while (!empty($parent)) { - $map[$parent] = $hasBreakingChanges; $loaded_webform = \Drupal::entityTypeManager() @@ -217,17 +214,18 @@ public static function hasBreakingChangesInNewerVersion(Webform $webform): bool ]); $wf = reset($loaded_webform); - $parent = $wf->getThirdPartySetting('grants_metadata', 'parent'); + + $thirdPartySettingsLatest = $wf->getThirdPartySettings('grants_metadata'); + $parent = $thirdPartySettingsLatest['parent'] ?? NULL; // No need to check the flag, // if we already have a newer version with breaking changes. if (!$hasBreakingChanges) { - $hasBreakingChanges = $wf->getThirdPartySetting('grants_metadata', 'avus2BreakingChange'); + $hasBreakingChanges = $thirdPartySettingsLatest['avus2BreakingChange'] ?? NULL; } } return $map[$uuid] ?? FALSE; - } /** @@ -264,7 +262,6 @@ public static function getWebformFromApplicationNumber(string $applicationNumber // Look for for application type and return if found. $webform = array_filter($webforms, function ($wf) use ($webformTypeId, $applicationTypes, $fieldToCheck) { - $thirdPartySettings = $wf->getThirdPartySettings('grants_metadata'); $thisApplicationTypeConfig = array_filter($applicationTypes, function ($appType) use ($thirdPartySettings) { if (isset($thirdPartySettings["applicationTypeID"]) && @@ -292,296 +289,6 @@ public static function getWebformFromApplicationNumber(string $applicationNumber return reset($webform); } - /** - * Get Webform object by UUID. - * - * @param string $uuid - * Uuid of the webform. - * @param string $application_number - * The application number. - * - * @return \Drupal\webform\Entity\Webform - * Webform object. - */ - public static function getWebformByUuid(string $uuid, string $application_number): Webform|bool|array { - - $wids = \Drupal::entityQuery('webform') - ->condition('uuid', $uuid) - ->execute(); - - // Fallback to original method, if webform for some reason is not found. - if (empty($wids)) { - return self::getWebformFromApplicationNumber($application_number); - } - - return Webform::load(reset($wids)); - } - - /** - * Extract serial numbor from application number string. - * - * @param string $applicationNumber - * Application number. - * @param bool $refetch - * Force refetch from ATV. - * - * @return array|\Drupal\helfi_atv\AtvDocument - * ATV Document - * - * @throws \Drupal\grants_mandate\CompanySelectException - * @throws \Drupal\helfi_atv\AtvDocumentNotFoundException - */ - public static function atvDocumentFromApplicationNumber( - string $applicationNumber, - bool $refetch = FALSE, - ): array|AtvDocument { - - /** @var \Drupal\helfi_atv\AtvService $atvService */ - $atvService = \Drupal::service('helfi_atv.atv_service'); - - $grantsProfileService = \Drupal::service('grants_profile.service'); - $selectedCompany = $grantsProfileService->getSelectedRoleData(); - - // If no company selected, no mandates no access. - if ($selectedCompany == NULL) { - throw new CompanySelectException('User not authorised'); - } - try { - $sParams = [ - 'transaction_id' => $applicationNumber, - 'lookfor' => 'appenv:' . Helpers::getAppEnv(), - ]; - - /** @var \Drupal\helfi_atv\AtvDocument[] $document */ - $document = $atvService->searchDocuments( - $sParams, - $refetch - ); - } - catch (\Throwable $e) { - } - - if (empty($document)) { - throw new AtvDocumentNotFoundException('Document not found'); - } - $document = reset($document); - return $document; - } - - /** - * Set up sender details from helsinkiprofiili data. - * - * @return array - * Sender details. - * - * @throws \Drupal\helfi_helsinki_profiili\TokenExpiredException - * @throws \Drupal\grants_handler\ApplicationException - */ - public static function parseSenderDetails(): array { - - $helfiHelsinkiProfiiliUserdata = \Drupal::service('helfi_helsinki_profiili.userdata'); - - // Set sender information after save so no accidental saving of data. - $userProfileData = $helfiHelsinkiProfiiliUserdata->getUserProfileData(); - $userData = $helfiHelsinkiProfiiliUserdata->getUserData(); - - $senderDetails = []; - - if (isset($userProfileData["myProfile"])) { - $data = $userProfileData["myProfile"]; - } - else { - $data = $userProfileData; - } - - // If no userprofile data, we need to hardcode these values. - if ($userProfileData == NULL || $userData == NULL) { - throw new ApplicationException('No profile data found for user.'); - } - else { - $senderDetails['sender_firstname'] = $data["verifiedPersonalInformation"]["firstName"]; - $senderDetails['sender_lastname'] = $data["verifiedPersonalInformation"]["lastName"]; - $senderDetails['sender_person_id'] = $data["verifiedPersonalInformation"]["nationalIdentificationNumber"]; - $senderDetails['sender_user_id'] = $userData["sub"]; - $senderDetails['sender_email'] = $data["primaryEmail"]["email"]; - } - - return $senderDetails; - } - - /** - * Get data definition class from application type. - * - * @param string $type - * Type of the application. - */ - public static function getDataDefinition(string $type) { - $defClass = Helpers::getApplicationTypes()[$type]['dataDefinition']['definitionClass']; - $defId = Helpers::getApplicationTypes()[$type]['dataDefinition']['definitionId']; - return $defClass::create($defId); - } - - /** - * The getSubmissionIdWithSerialAndWebformId method. - * - * This method queries the database in an attempt to - * find a webform submission ID with the help of a - * submission serial and a webform ID. If one is not - * found, then we create a submission. - * - * @param string $serial - * A webform submission serial. - * @param string $webformId - * A webform ID. - * @param \Drupal\helfi_atv\AtvDocument $document - * An ATV document. - * - * @return string - * A webform submission ID. - * - * @throws \Drupal\Core\Entity\EntityStorageException - * Exception on EntityStorageException. - */ - public static function getSubmissionIdWithSerialAndWebformId( - string $serial, - string $webformId, - AtvDocument $document, - ): string { - $database = Database::getConnection(); - $query = $database->select('webform_submission', 'ws') - ->fields('ws', ['sid']) - ->condition('ws.serial', $serial) - ->condition('ws.webform_id', $webformId); - $result = $query->execute(); - $sid = $result->fetchField(); - - // If a submission ID is found, return it. - if ($sid) { - return $sid; - } - - // If we can't find a submission, then create one. - $webformSubmission = self::createWebformSubmissionWithSerialAndWebformId($serial, $document); - return $webformSubmission->id(); - } - - /** - * The createWebformSubmissionWithSerialAndWebformId method. - * - * This method creates a webform submission and sets the - * webform ID, serial and draft state if needed. - * - * @param string $serial - * A webform submission serial. - * @param \Drupal\helfi_atv\AtvDocument $document - * An ATV document. - * - * @return \Drupal\webform\Entity\WebformSubmission - * A webform submission. - * - * @throws \Drupal\Core\Entity\EntityStorageException - * Exception on EntityStorageException. - */ - protected static function createWebformSubmissionWithSerialAndWebformId( - string $serial, - AtvDocument $document, - ): WebformSubmission { - - $metaData = $document->getMetadata(); - $webformUuidExists = isset($metaData['form_uuid']) && !empty($metaData['form_uuid']); - - $webform = $webformUuidExists - ? self::getWebformByUuid($metaData['form_uuid'], $document->getTransactionId()) - : self::getWebformFromApplicationNumber($document->getTransactionId()); - - $webformId = $webform->id(); - - $submissionObject = WebformSubmission::create(['webform_id' => $webformId]); - $submissionObject->set('serial', $serial); - - // Mark that we don't want to generate new application - // number, as we just assigned the serial from ATV application id. - // Check GrantsHandler@preSave. - WebformSubmissionNotesHelper::setValue( - $submissionObject, - 'skip_available_number_check', - TRUE - ); - if ($document->getStatus() == 'DRAFT') { - $submissionObject->set('in_draft', TRUE); - } - $submissionObject->save(); - return $submissionObject; - } - - /** - * Logs the current submission page. - * - * @param \Drupal\webform\WebformSubmissionInterface|null $webform_submission - * A webform submission entity. - * @param string $applicationNumber - * The page to log. - * @param array $userData - * User data. - * @param string $saveId - * Submission save id. - * - * @return string - * The save ID. - * - * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException - * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException - * @throws \Drupal\Core\Entity\EntityStorageException - * @throws \Drupal\Core\TempStore\TempStoreException - * @throws \Drupal\grants_mandate\CompanySelectException - * @throws \Drupal\helfi_atv\AtvDocumentNotFoundException - * @throws \Drupal\helfi_atv\AtvFailedToConnectException - * @throws \Drupal\helfi_helsinki_profiili\TokenExpiredException - * @throws \GuzzleHttp\Exception\GuzzleException - * @throws \Exception - */ - public static function logSubmissionSaveid( - ?WebformSubmissionInterface $webform_submission, - string $applicationNumber, - array $userData, - string $saveId = '', - ): string { - if (!$userData) { - throw new \Exception('User data is required'); - } - - if (empty($saveId)) { - $saveId = Uuid::uuid4()->toString(); - } - - if ($webform_submission == NULL) { - /** @var \Drupal\grants_handler\ApplicationGetterService $applicationGetterService */ - $applicationGetterService = \Drupal::service('grants_handler.application_getter_service'); - $webform_submission = $applicationGetterService->submissionObjectFromApplicationNumber($applicationNumber); - } - - $currentUser = \Drupal::currentUser(); - $database = \Drupal::database(); - - $fields = [ - 'webform_id' => ($webform_submission) ? $webform_submission->getWebform() - ->id() : '', - 'sid' => ($webform_submission) ? $webform_submission->id() : 0, - 'handler_id' => self::HANDLER_ID, - 'application_number' => $applicationNumber, - 'saveid' => $saveId, - 'uid' => $currentUser->id(), - 'user_uuid' => $userData['sub'] ?? '', - 'timestamp' => (string) (new Time)->getRequestTime(), - ]; - - $query = $database->insert(self::TABLE, $fields); - $query->fields($fields)->execute(); - - return $saveId; - - } - /** * Tries to find latest webform for given application ID. * @@ -594,8 +301,7 @@ public static function logSubmissionSaveid( * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException */ - public static function getLatestApplicationForm($id): Webform|NULL { - + public static function getLatestApplicationForm($id): Webform|null { $webforms = \Drupal::entityTypeManager() ->getStorage('webform') ->loadByProperties([ @@ -615,16 +321,34 @@ public static function getLatestApplicationForm($id): Webform|NULL { /** * Get all Webform objects for given application id. * - * @param string $id + * @param string $applicationTypeId * Application ID. + * @param null $formId + * Webform ID. + * + * @return array + * Active webforms. + * + * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException + * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException */ - public static function getActiveApplicationWebforms(string $id): array { + public static function getActiveApplicationWebforms(string $applicationTypeId, $formId = NULL): array { + $properties = [ + 'third_party_settings.grants_metadata.applicationType' => $applicationTypeId, + 'archive' => FALSE, + ]; + + // If we've given form id, we want to load only that form. + if ($formId) { + // Effectevely this limits results to single form. + // But since we now can have multiple forms with same application type, + // we need to check that the form id is correct. + $properties['id'] = $formId; + } + $webforms = \Drupal::entityTypeManager() ->getStorage('webform') - ->loadByProperties([ - 'third_party_settings.grants_metadata.applicationType' => $id, - 'archive' => FALSE, - ]); + ->loadByProperties($properties); $result = [ 'released' => [], @@ -650,13 +374,62 @@ public static function getActiveApplicationWebforms(string $id): array { * * @param string $id * Application ID. + * @param string|null $formId + * Webform ID. Or null if all is wanted. * * @return bool * Can the webform be duplicated. + * + * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException + * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException */ - public static function isApplicationWebformDuplicatable(string $id) { - $applicationForms = self::getActiveApplicationWebforms($id); + public static function isApplicationWebformDuplicatable(string $id, string $formId = NULL): bool { + $applicationForms = self::getActiveApplicationWebforms($id, $formId); return count($applicationForms['released']) <= 1 && count($applicationForms['development']) === 0; } + /** + * Update field options in a form array. + * + * This method is used to update the options of a field in a form array. + * + * @param array $form + * The form array. + * @param array $newOptions + * The new options to set. + * @param array $fieldStructure + * The structure of the field. + */ + public static function updateFieldOptions(array &$form, array $newOptions, array $fieldStructure): void { + $currentField = &$form; + + // Traverse the form array based on the field structure. + foreach ($fieldStructure as $fieldName) { + if (isset($currentField[$fieldName])) { + $currentField = &$currentField[$fieldName]; + } + elseif (isset($currentField['#element'][$fieldName])) { + $currentField = &$currentField['#element'][$fieldName]; + } + else { + // If we don't have current field array, we can't update the options. + if (!is_iterable($currentField)) { + return; + } + // If the field is not found, continue searching recursively. + foreach ($currentField as &$subField) { + if (is_array($subField)) { + self::updateFieldOptions($subField, $newOptions, $fieldStructure); + } + } + return; + } + } + + // Update the #options if the field with '#options' is found. + if (isset($currentField['#options'])) { + $currentField['#options'] = $newOptions; + } + } + } diff --git a/public/modules/custom/grants_handler/src/ApplicationStatusService.php b/public/modules/custom/grants_handler/src/ApplicationStatusService.php index 7d078c6a33..be4a82503c 100644 --- a/public/modules/custom/grants_handler/src/ApplicationStatusService.php +++ b/public/modules/custom/grants_handler/src/ApplicationStatusService.php @@ -160,6 +160,10 @@ public function isApplicationOpen(Webform $webform): bool { $thirdPartySettings = $webform->getThirdPartySettings('grants_metadata'); $applicationContinuous = $thirdPartySettings["applicationContinuous"] == 1; + if (!$thirdPartySettings["applicationOpen"] && !$thirdPartySettings["applicationClose"]) { + return $applicationContinuous; + } + try { $now = new \DateTime(); $from = new \DateTime($thirdPartySettings["applicationOpen"]); diff --git a/public/modules/custom/grants_handler/src/ApplicationUploaderService.php b/public/modules/custom/grants_handler/src/ApplicationUploaderService.php index 38d88ae063..e6fec073de 100644 --- a/public/modules/custom/grants_handler/src/ApplicationUploaderService.php +++ b/public/modules/custom/grants_handler/src/ApplicationUploaderService.php @@ -4,19 +4,25 @@ namespace Drupal\grants_handler; +use Drupal\Component\Datetime\Time; use Drupal\Component\Serialization\Json; +use Drupal\Core\Database\Connection; use Drupal\Core\Language\LanguageManagerInterface; use Drupal\Core\Logger\LoggerChannelFactoryInterface; use Drupal\Core\Logger\LoggerChannelInterface; use Drupal\Core\Messenger\MessengerInterface; +use Drupal\Core\Session\AccountInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\TypedData\TypedDataInterface; use Drupal\grants_attachments\AttachmentFixerService; +use Drupal\grants_events\EventsService; use Drupal\grants_metadata\AtvSchema; use Drupal\helfi_atv\AtvDocument; use Drupal\helfi_atv\AtvService; use Drupal\helfi_helsinki_profiili\HelsinkiProfiiliUserData; +use Drupal\webform\WebformSubmissionInterface; use GuzzleHttp\Client as HttpClient; +use Ramsey\Uuid\Uuid; /** * Class to handle application uploads. @@ -76,6 +82,9 @@ public function __construct( private readonly ApplicationGetterService $applicationGetterService, private readonly HelsinkiProfiiliUserData $helfiHelsinkiProfiiliUserdata, private readonly AttachmentFixerService $attachmentFixerService, + private readonly AccountInterface $currentUser, + private readonly Connection $database, + private readonly EventsService $eventsService, ) { $this->logger = $this->loggerChannelFactory->get('application_uploader_service'); @@ -129,7 +138,7 @@ public function handleApplicationUploadToAtv( $atvDocument->addMetadata('language', $language); try { $userData = $this->helfiHelsinkiProfiiliUserdata->getUserData(); - $saveId = ApplicationHelpers::logSubmissionSaveid(NULL, $applicationNumber, $userData); + $saveId = $this->logSubmissionSaveid(NULL, $applicationNumber, $userData); $atvDocument->addMetadata('saveid', $saveId); } catch (\Exception $e) { @@ -178,6 +187,7 @@ public function handleApplicationUploadToAtv( * @throws \Drupal\helfi_atv\AtvFailedToConnectException * @throws \GuzzleHttp\Exception\GuzzleException * @throws \Drupal\helfi_helsinki_profiili\TokenExpiredException + * @throws \Drupal\grants_events\EventException */ public function handleApplicationUploadViaIntegration( TypedDataInterface $applicationData, @@ -192,6 +202,25 @@ public function handleApplicationUploadViaIntegration( * for some reason. */ $updatedDocumentFromAtv = $this->handleApplicationUploadToAtv($applicationData, $applicationNumber, $submittedFormData); + + // Create new saveid before sending data to integration, + // so we can add it to event data. + $newSaveId = $this->logSubmissionSaveid( + NULL, + $applicationNumber, + $this->helfiHelsinkiProfiiliUserdata->getUserData() + ); + + // Add new event for sending it to integration. + $this->eventsService->addNewEventForApplication( + $updatedDocumentFromAtv, + $this->eventsService->getEventData( + $this->eventsService->getEventTypes()['HANDLER_SEND_INTEGRATION'], + $applicationNumber, + 'Send application to integration.', + $newSaveId + )); + $myJSON = Json::encode($updatedDocumentFromAtv->getContent()); // No matter what the debug value is, we do NOT log json in PROD. @@ -213,6 +242,7 @@ public function handleApplicationUploadViaIntegration( try { $headers = []; + // Get status from updated document. $headers['X-Case-Status'] = $updatedDocumentFromAtv->getStatus(); // We set the data source for integration to be used in controlling @@ -224,12 +254,8 @@ public function handleApplicationUploadViaIntegration( // Set application number to meta as well to enable better searches. $headers['X-hki-applicationNumber'] = $applicationNumber; - // Set new saveid and save it to db. - $headers['X-hki-saveId'] = ApplicationHelpers::logSubmissionSaveid( - NULL, - $applicationNumber, - $this->helfiHelsinkiProfiiliUserdata->getUserData() - ); + // Set new saveid to header. + $headers['X-hki-saveId'] = $newSaveId; $res = $this->httpClient->post($this->endpoint, [ 'auth' => [ @@ -279,4 +305,61 @@ public function clearCache(string $applicationNumber): void { $this->helfiAtvAtvService->clearCache($applicationNumber); } + /** + * Logs the current submission page. + * + * @param \Drupal\webform\WebformSubmissionInterface|null $webform_submission + * A webform submission entity. + * @param string $applicationNumber + * The page to log. + * @param array $userData + * User data. + * @param string $saveId + * Submission save id. + * + * @return string + * The save ID. + * + * @throws \Drupal\Core\Entity\EntityStorageException + * @throws \Drupal\grants_mandate\CompanySelectException + * @throws \Exception + */ + public function logSubmissionSaveid( + ?WebformSubmissionInterface $webform_submission, + string $applicationNumber, + array $userData, + string $saveId = '', + ): string { + if (!$userData) { + throw new \Exception('User data is required'); + } + + if (empty($saveId)) { + $saveId = Uuid::uuid4()->toString(); + } + + if ($webform_submission == NULL) { + $webform_submission = + $this->applicationGetterService + ->submissionObjectFromApplicationNumber($applicationNumber); + } + + $fields = [ + 'webform_id' => ($webform_submission) ? $webform_submission->getWebform() + ->id() : '', + 'sid' => ($webform_submission) ? $webform_submission->id() : 0, + 'handler_id' => ApplicationHelpers::HANDLER_ID, + 'application_number' => $applicationNumber, + 'saveid' => $saveId, + 'uid' => $this->currentUser->id(), + 'user_uuid' => $userData['sub'] ?? '', + 'timestamp' => (string) (new Time())->getRequestTime(), + ]; + + $query = $this->database->insert(ApplicationHelpers::TABLE, $fields); + $query->fields($fields)->execute(); + + return $saveId; + } + } diff --git a/public/modules/custom/grants_handler/src/Controller/ApplicationController.php b/public/modules/custom/grants_handler/src/Controller/ApplicationController.php index 289fdb8784..ffd9e645e7 100644 --- a/public/modules/custom/grants_handler/src/Controller/ApplicationController.php +++ b/public/modules/custom/grants_handler/src/Controller/ApplicationController.php @@ -9,24 +9,17 @@ use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Entity\EntityRepositoryInterface; use Drupal\Core\Entity\EntityStorageException; -use Drupal\Core\Render\Markup; +use Drupal\Core\Render\RendererInterface; use Drupal\Core\Session\AccountInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; -use Drupal\Core\TempStore\TempStoreException; use Drupal\grants_handler\ApplicationAccessHandler; use Drupal\grants_handler\ApplicationGetterService; -use Drupal\grants_handler\ApplicationHelpers; use Drupal\grants_handler\ApplicationInitService; use Drupal\grants_handler\ApplicationStatusService; -use Drupal\grants_handler\Plugin\WebformElement\CompensationsComposite; use Drupal\grants_mandate\CompanySelectException; use Drupal\grants_metadata\ApplicationDataService; -use Drupal\grants_metadata\InputmaskHandler; -use Drupal\grants_profile\Form\GrantsProfileFormRegisteredCommunity; use Drupal\grants_profile\GrantsProfileService; use Drupal\helfi_atv\AtvDocumentNotFoundException; -use Drupal\helfi_atv\AtvFailedToConnectException; -use Drupal\helfi_helsinki_profiili\TokenExpiredException; use Drupal\webform\Entity\Webform; use Drupal\webform\Entity\WebformSubmission; use Drupal\webform\WebformRequestInterface; @@ -39,121 +32,45 @@ /** * Returns responses for Grants Handler routes. */ -class ApplicationController extends ControllerBase { +final class ApplicationController extends ControllerBase { const ISO8601 = "/^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])" . - "|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)" . - "|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])" . - "|(?:[2468][048]|[13579][26])00)-02-29)(T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d{1,9})" . - "?(?:Z|[+-][01]\d:[0-5]\d))?$/"; - + "|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)" . + "|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])" . + "|(?:[2468][048]|[13579][26])00)-02-29)(T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d{1,9})" . + "?(?:Z|[+-][01]\d:[0-5]\d))?$/"; use StringTranslationTrait; - /** - * The current user. - * - * @var \Drupal\Core\Session\AccountInterface - */ - protected $currentUser; - - /** - * The entity repository. - * - * @var \Drupal\Core\Entity\EntityRepositoryInterface - */ - protected EntityRepositoryInterface $entityRepository; - - /** - * The webform request handler. - * - * @var \Drupal\webform\WebformRequestInterface - */ - protected WebformRequestInterface $requestHandler; - - /** - * The entity type manager. - * - * @var \Drupal\Core\Entity\EntityTypeManagerInterface - */ - protected $entityTypeManager; - - /** - * The renderer service. - * - * @var \Drupal\Core\Render\RendererInterface - */ - protected $renderer; - - /** - * The request service. - * - * @var \Symfony\Component\HttpFoundation\RequestStack - */ - protected RequestStack $request; - - /** - * Access to grants profile. - * - * @var \Drupal\grants_profile\GrantsProfileService - */ - protected GrantsProfileService $grantsProfileService; - - /** - * Application data service. - * - * @var \Drupal\grants_metadata\ApplicationDataService - */ - protected ApplicationDataService $applicationDataService; - - /** - * Application status service. - * - * @var \Drupal\grants_handler\ApplicationStatusService - */ - protected ApplicationStatusService $applicationStatusService; - - /** - * Application init service. - * - * @var \Drupal\grants_handler\ApplicationInitService - */ - protected ApplicationInitService $applicationInitService; - - /** - * Access handler for applications. - * - * @var \Drupal\grants_handler\ApplicationAccessHandler - */ - protected ApplicationAccessHandler $applicationAccessHandler; - - /** - * Getter service for applications. - * - * @var \Drupal\grants_handler\ApplicationGetterService - */ - protected ApplicationGetterService $applicationGetterService; + public function __construct( + private readonly EntityRepositoryInterface $entityRepository, + private readonly WebformRequestInterface $requestHandler, + private readonly RendererInterface $renderer, + private readonly RequestStack $request, + private readonly GrantsProfileService $grantsProfileService, + private readonly ApplicationDataService $applicationDataService, + private readonly ApplicationStatusService $applicationStatusService, + private readonly ApplicationInitService $applicationInitService, + private readonly ApplicationAccessHandler $applicationAccessHandler, + private readonly ApplicationGetterService $applicationGetterService, + ) {} /** * {@inheritdoc} */ public static function create(ContainerInterface $container): ApplicationController { - $instance = parent::create($container); - $instance->currentUser = $container->get('current_user'); - - $instance->entityRepository = $container->get('entity.repository'); - $instance->requestHandler = $container->get('webform.request'); - $instance->entityTypeManager = $container->get('entity_type.manager'); - $instance->renderer = $container->get('renderer'); - $instance->request = $container->get('request_stack'); - $instance->grantsProfileService = $container->get('grants_profile.service'); - $instance->applicationDataService = $container->get('grants_metadata.application_data_service'); - $instance->applicationStatusService = $container->get('grants_handler.application_status_service'); - $instance->applicationInitService = $container->get('grants_handler.application_init_service'); - $instance->applicationAccessHandler = $container->get('grants_handler.application_access_handler'); - $instance->applicationGetterService = $container->get('grants_handler.application_getter_service'); - - return $instance; + return new self( + $container->get('entity.repository'), + $container->get('webform.request'), + $container->get('renderer'), + $container->get('request_stack'), + $container->get('grants_profile.service'), + $container->get('grants_metadata.application_data_service'), + $container->get('grants_handler.application_status_service'), + $container->get('grants_handler.application_init_service'), + $container->get('grants_handler.application_access_handler'), + $container->get('grants_handler.application_getter_service') + ); } /** @@ -197,24 +114,16 @@ public function access(AccountInterface $account, string $webform, string $webfo * @return \Drupal\Core\Access\AccessResultInterface * The access result. * - * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException - * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException - * @throws \Drupal\helfi_atv\AtvDocumentNotFoundException - * @throws \GuzzleHttp\Exception\GuzzleException + * @throws \Drupal\grants_mandate\CompanySelectException + * @throws \Drupal\grants_profile\GrantsProfileException */ public function accessByApplicationNumber(AccountInterface $account, string $submission_id): AccessResultInterface { try { $webform_submission = $this->applicationGetterService->submissionObjectFromApplicationNumber($submission_id); } - catch (InvalidPluginDefinitionException | - PluginNotFoundException | + catch ( EntityStorageException | - TempStoreException | - CompanySelectException | - AtvDocumentNotFoundException | - AtvFailedToConnectException | - TokenExpiredException | - GuzzleException $e) { + CompanySelectException $e) { return AccessResult::forbidden('Submission gettting failed'); } @@ -261,12 +170,10 @@ public function showMessageForDataStatus(string $status): void { default: break; - } if ($message != NULL) { $this->messenger()->addWarning($message); } - } /** @@ -283,7 +190,6 @@ public function showMessageForDataStatus(string $status): void { * Build for the page. */ public function view(string $submission_id, string $view_mode = 'full', string $langcode = 'fi'): array { - $view_mode = 'default'; try { @@ -305,8 +211,6 @@ public function view(string $submission_id, string $view_mode = 'full', string $ '#theme' => 'webform_submission', '#view_mode' => $view_mode, '#webform_submission' => $webform_submission, - // '#editSubmissionLink' => - // Link::fromTextAndUrl(t('Edit application'), $url), ]; // Navigation. @@ -322,7 +226,7 @@ public function view(string $submission_id, string $view_mode = 'full', string $ '#source_entity' => $webform_submission, ]; - $page = $this->entityTypeManager + $page = $this->entityTypeManager() ->getViewBuilder($webform_submission->getEntityTypeId()) ->view($webform_submission, $view_mode); @@ -341,7 +245,6 @@ public function view(string $submission_id, string $view_mode = 'full', string $ else { throw new NotFoundHttpException('Application ' . $submission_id . ' not found.'); } - } catch (InvalidPluginDefinitionException | PluginNotFoundException | AtvDocumentNotFoundException | GuzzleException $e) { throw new NotFoundHttpException($e->getMessage()); @@ -366,13 +269,13 @@ public function view(string $submission_id, string $view_mode = 'full', string $ * @throws \GuzzleHttp\Exception\GuzzleException */ public function newApplication(string $webform_id): RedirectResponse { - $webform = Webform::load($webform_id); if (!$this->applicationStatusService->isApplicationOpen($webform)) { // Add message if application is not open. $tOpts = ['context' => 'grants_handler']; - $this->messenger()->addError($this->t('This application is not open', [], $tOpts), TRUE); + $this->messenger() + ->addError($this->t('This application is not open', [], $tOpts), TRUE); $node_storage = $this->entityTypeManager()->getStorage('node'); // @codingStandardsIgnoreStart // Get service page node. @@ -385,7 +288,8 @@ public function newApplication(string $webform_id): RedirectResponse { $res = $query->execute(); if (empty($res)) { // If we end up here, the real issue is with content input. - $this->messenger()->addError($this->t('Service page not found!', [], $tOpts), TRUE); + $this->messenger() + ->addError($this->t('Service page not found!', [], $tOpts), TRUE); return $this->redirect(''); } @@ -429,251 +333,38 @@ public function newApplication(string $webform_id): RedirectResponse { } /** - * Helper funtion to transform ATV data for print view. - */ - private function transformField($field, &$pages, &$isSubventionType, &$subventionType, $langcode) { - if (isset($field['ID'])) { - $labelData = json_decode($field['meta'], TRUE); - if (!$labelData || $labelData['element']['hidden']) { - return; - } - // Handle application type field. - if ($field['ID'] === 'applicantType' && $field['value'] === 'registered_community') { - $field['value'] = '' . $this->t('Registered community', [], ['langcode' => $langcode]); - // Add other types here when needed. - } - // Handle dates. - if (preg_match(self::ISO8601, $field['value'])) { - $field['value'] = date_format(date_create($field['value']), 'd.m.Y'); - } - - // Handle input masks. - if (isset($labelData['element']['input_mask'])) { - $field['value'] = InputmaskHandler::convertPossibleInputmaskValue($field['value'], $labelData); - } - - // Handle application type field. - if ($field['ID'] === 'issuer') { - $issuerLanguageOptions = [ - 'context' => 'Grant Issuers', - 'langcode' => $langcode, - ]; - $issuerArray = [ - "1" => $this->t('State', [], $issuerLanguageOptions), - "3" => $this->t('EU', [], $issuerLanguageOptions), - "4" => $this->t('Other', [], $issuerLanguageOptions), - "5" => $this->t('Foundation', [], $issuerLanguageOptions), - "6" => $this->t("STEA", [], $issuerLanguageOptions), - ]; - $field['value'] = $issuerArray[$field['value']]; - } - if ($labelData['section']['id'] === 'application_number' || $labelData['section']['id'] === 'status') { - unset($field); - unset($labelData['section']); - return; - } - if ($labelData['section']['id'] === 'lisatiedot_ja_liitteet_section') { - if ($field['ID'] === 'integrationID' || $field['ID'] === 'isNewAttachment' || $field['ID'] === 'fileType') { - unset($field); - return; - } - if ($field['ID'] === 'isDeliveredLater' || $field['ID'] === 'isIncludedInOtherFile') { - if ($field['value'] === 'false') { - unset($field); - return; - } - else { - $field['value'] = Markup::create('
'); - } - } - if ($field['ID'] === 'fileName') { - $field['value'] = Markup::create($field['value'] . '

'); - } - - } - - // Handle subvention type composite field. - if ($field['ID'] === 'subventionType') { - $typeNames = CompensationsComposite::getOptionsForTypes($langcode); - $subventionType = $typeNames[$field['value']]; - $isSubventionType = TRUE; - return; - } - elseif ($isSubventionType) { - $labelData['element']['label'] = $subventionType; - $isSubventionType = FALSE; - } - - if ($field['ID'] == 'role') { - $roles = GrantsProfileFormRegisteredCommunity::getOfficialRoles(); - $role = $roles[$field['value']]; - if ($role) { - $field['value'] = $role; - } - } - - if (isset($field) && array_key_exists('value', $field) && $field['value'] === 'true') { - $field['value'] = $this->t('Yes', [], [ - 'context' => 'grants_handler', - 'langcode' => $langcode, - ]); - } - - if (isset($field) && array_key_exists('value', $field) && $field['value'] === 'false') { - $field['value'] = $this->t('No', [], [ - 'context' => 'grants_handler', - 'langcode' => $langcode, - ]); - } - - if ($field['value'] === '') { - $field['value'] = '-'; - } - - $newField = [ - 'ID' => $field['ID'], - 'value' => $labelData['element']['valueTranslation'] ?? $field['value'], - 'valueType' => $field['valueType'], - 'label' => $labelData['element']['label'], - 'weight' => $labelData['element']['weight'], - ]; - $pageNumber = $labelData['page']['number']; - if (!isset($pages[$pageNumber])) { - $pages[$pageNumber] = [ - 'label' => $labelData['page']['label'], - 'id' => $labelData['page']['id'], - 'sections' => [], - ]; - } - $sectionId = $labelData['section']['id']; - if (!isset($pages[$pageNumber]['sections'][$sectionId])) { - $pages[$pageNumber]['sections'][$sectionId] = [ - 'label' => $labelData['section']['label'], - 'id' => $labelData['section']['id'], - 'weight' => $labelData['section']['weight'], - 'fields' => [], - ]; - } - $pages[$pageNumber]['sections'][$sectionId]['fields'][] = $newField; - return; - } - $isSubventionType = FALSE; - $subventionType = ''; - - if (is_array($field)) { - foreach ($field as $subField) { - $this->transformField($subField, $pages, $isSubventionType, $subventionType, $langcode); - } - } - } - - /** - * Print view for single application in ATV schema. + * Returns a page title. * - * @param string $submission_id - * Application number for submission. + * This works better than getTitle, since we know the webform object and can + * get the title from it. * - * @return array - * Render array for the page. - */ - public function printViewAtv(string $submission_id): array { - $isSubventionType = FALSE; - $subventionType = ''; - try { - /** @var \Drupal\helfi_atv\AtvDocument $atv_document */ - $atv_document = ApplicationHelpers::atvDocumentFromApplicationNumber($submission_id); - } - catch (\Exception $e) { - throw new NotFoundHttpException('Application ' . $submission_id . ' not found.'); - } - $langcode = $atv_document->getMetadata()['language']; - - $newPages = []; - // Iterate over regular fields. - $compensation = $atv_document->jsonSerialize()['content']['compensation']; - - foreach ($compensation as $page) { - if (!is_array($page)) { - continue; - } - foreach ($page as $field) { - $this->transformField($field, $newPages, $isSubventionType, $subventionType, $langcode); - } - } - $attachments = $atv_document->jsonSerialize()['content']['attachmentsInfo']; - foreach ($attachments as $page) { - if (!is_array($page)) { - continue; - } - foreach ($page as $field) { - $this->transformField($field, $newPages, $isSubventionType, $subventionType, $langcode); - } - } - - // Sort the fields based on weight. - foreach ($newPages as $pageKey => $page) { - foreach ($page['sections'] as $sectionKey => $section) { - usort($newPages[$pageKey]['sections'][$sectionKey]['fields'], function ($fieldA, $fieldB) { - return $fieldA['weight'] - $fieldB['weight']; - }); - } - } - - if (isset($compensation['additionalInformation'])) { - $tOpts = [ - 'context' => 'grants_handler', - 'langcode' => $langcode, - ]; - $field = [ - 'ID' => 'additionalInformationField', - 'value' => $compensation['additionalInformation'], - 'valueType' => 'string', - 'label' => $this->t('Additional Information', [], $tOpts), - 'weight' => 1, - ]; - $sections = []; - $sections['section'] = [ - 'label' => $this->t('Additional information concerning the application', [], $tOpts), - 'id' => 'additionalInformationPageSection', - 'weight' => 1, - 'fields' => [$field], - ]; - $newPages['additionalInformation'] = [ - 'label' => $this->t('Additional Information', [], $tOpts), - 'id' => 'additionalInformationPage', - 'sections' => $sections, - ]; - } - - // Set correct template. - $build = [ - '#theme' => 'grants_handler_print_atv_document', - '#atv_document' => $atv_document->jsonSerialize(), - '#pages' => $newPages, - '#document_langcode' => $atv_document->getMetadata()['language'], - '#cache' => [ - 'contexts' => [ - 'url.path', - ], - ], - ]; - - return $build; - } - - /** - * Returns a page title. + * @param \Drupal\webform\Entity\WebformSubmission $webform_submission + * Submission object. + * + * @return string + * Webform title. */ - public function getEditTitle($webform_submission): string { + public function getEditTitle(WebformSubmission $webform_submission): string { $webform = $webform_submission->getWebform(); return $webform->label(); } /** * Returns a page title. + * + * @param string $submission_id + * Application number of the submission. NOT THE OBJECT ID! + * + * @return string + * Webform title + * + * @throws \Drupal\Core\Entity\EntityStorageException + * @throws \Drupal\grants_mandate\CompanySelectException */ - public function getTitle($submission_id): string { - $webform = ApplicationHelpers::getWebformFromApplicationNumber($submission_id); + public function getTitle(string $submission_id): string { + $submission = $this->applicationGetterService->submissionObjectFromApplicationNumber($submission_id); + $webform = $submission->getWebform(); + return $webform->label(); } diff --git a/public/modules/custom/grants_handler/src/Controller/AtvPrintViewController.php b/public/modules/custom/grants_handler/src/Controller/AtvPrintViewController.php new file mode 100644 index 0000000000..be3b46fc3b --- /dev/null +++ b/public/modules/custom/grants_handler/src/Controller/AtvPrintViewController.php @@ -0,0 +1,415 @@ +get('grants_handler.application_getter_service') + ); + } + + /** + * Builds the response. + * + * @param string $submission_id + * The submission id. + * + * @return array + * The response.Render array. + */ + public function __invoke(string $submission_id): array { + $isSubventionType = FALSE; + $subventionType = ''; + try { + /** @var \Drupal\helfi_atv\AtvDocument $atv_document */ + $atv_document = $this->applicationGetterService->getAtvDocument($submission_id); + } + catch (\Exception $e) { + throw new NotFoundHttpException('Application ' . $submission_id . ' not found.'); + } + $langcode = $atv_document->getMetadata()['language']; + + $newPages = []; + // Iterate over regular fields. + $compensation = $atv_document->jsonSerialize()['content']['compensation']; + + foreach ($compensation as $page) { + if (!is_array($page)) { + continue; + } + foreach ($page as $field) { + $this->transformField($field, $newPages, $isSubventionType, $subventionType, $langcode); + } + } + $attachments = $atv_document->jsonSerialize()['content']['attachmentsInfo']; + foreach ($attachments as $page) { + if (!is_array($page)) { + continue; + } + foreach ($page as $field) { + $this->transformField($field, $newPages, $isSubventionType, $subventionType, $langcode); + } + } + + // Sort the fields based on weight. + foreach ($newPages as $pageKey => $page) { + foreach ($page['sections'] as $sectionKey => $section) { + usort($newPages[$pageKey]['sections'][$sectionKey]['fields'], function ($fieldA, $fieldB) { + return $fieldA['weight'] - $fieldB['weight']; + }); + } + } + + if (isset($compensation['additionalInformation'])) { + $tOpts = [ + 'context' => 'grants_handler', + 'langcode' => $langcode, + ]; + $field = [ + 'ID' => 'additionalInformationField', + 'value' => $compensation['additionalInformation'], + 'valueType' => 'string', + 'label' => $this->t('Additional Information', [], $tOpts), + 'weight' => 1, + ]; + $sections = []; + $sections['section'] = [ + 'label' => $this->t('Additional information concerning the application', [], $tOpts), + 'id' => 'additionalInformationPageSection', + 'weight' => 1, + 'fields' => [$field], + ]; + $newPages['additionalInformation'] = [ + 'label' => $this->t('Additional Information', [], $tOpts), + 'id' => 'additionalInformationPage', + 'sections' => $sections, + ]; + } + + // Set correct template. + return [ + '#theme' => 'grants_handler_print_atv_document', + '#atv_document' => $atv_document->jsonSerialize(), + '#pages' => $newPages, + '#document_langcode' => $atv_document->getMetadata()['language'], + '#cache' => [ + 'contexts' => [ + 'url.path', + ], + ], + ]; + } + + /** + * Helper funtion to transform ATV data for print view. + * + * @param mixed $field + * Field. + * @param array $pages + * Form pages. + * @param bool $isSubventionType + * Is subvention type. + * @param string $subventionType + * Subvention type. + * @param string $langcode + * Language code. + */ + private function transformField(mixed $field, array &$pages, bool &$isSubventionType, string &$subventionType, string $langcode): void { + if (isset($field['ID'])) { + $labelData = json_decode($field['meta'], TRUE); + if (!$labelData || $labelData['element']['hidden']) { + return; + } + + $this->handleContent($field, $labelData, $langcode, $isSubventionType, $subventionType); + + if ($field['value'] === '') { + $field['value'] = '-'; + } + + $newField = [ + 'ID' => $field['ID'], + 'value' => $labelData['element']['valueTranslation'] ?? $field['value'], + 'valueType' => $field['valueType'], + 'label' => $labelData['element']['label'], + 'weight' => $labelData['element']['weight'], + ]; + $pageNumber = $labelData['page']['number']; + if (!isset($pages[$pageNumber])) { + $pages[$pageNumber] = [ + 'label' => $labelData['page']['label'], + 'id' => $labelData['page']['id'], + 'sections' => [], + ]; + } + $sectionId = $labelData['section']['id']; + if (!isset($pages[$pageNumber]['sections'][$sectionId])) { + $pages[$pageNumber]['sections'][$sectionId] = [ + 'label' => $labelData['section']['label'], + 'id' => $labelData['section']['id'], + 'weight' => $labelData['section']['weight'], + 'fields' => [], + ]; + } + $pages[$pageNumber]['sections'][$sectionId]['fields'][] = $newField; + return; + } + $isSubventionType = FALSE; + $subventionType = ''; + + if (is_array($field)) { + foreach ($field as $subField) { + $this->transformField($subField, $pages, $isSubventionType, $subventionType, $langcode); + } + } + } + + /** + * Handle application content fields. + * + * @param array $field + * Field. + * @param array $labelData + * Label data. + * @param string $langcode + * Language code. + * @param bool $isSubventionType + * Is subvention type. + * @param string $subventionType + * Subvention type. + */ + private function handleContent( + array &$field, + array $labelData, + string $langcode, + bool &$isSubventionType, + string &$subventionType, + ): void { + $this->handleApplicantType($field, $langcode); + $this->handleDates($field); + $this->handleInputMasks($field, $labelData); + $this->handleIssuer($field, $langcode); + $this->handleSection($field, $labelData); + $this->handleLiitteetSection($field); + $this->handleSubventionType($field, $labelData, $langcode, $isSubventionType, $subventionType); + $this->handleRole($field); + $this->handleBooleanValues($field, $langcode); + } + + /** + * Handle applicant type. + * + * @param array $field + * Field. + * @param string $langcode + * Language code. + */ + private function handleApplicantType(array &$field, string $langcode): void { + if ($field['ID'] === 'applicantType' && $field['value'] === 'registered_community') { + $field['value'] = '' . $this->t('Registered community', [], ['langcode' => $langcode]); + } + } + + /** + * Handle dates. + * + * @param array $field + * Field. + */ + private function handleDates(array &$field): void { + if (preg_match(self::ISO8601, $field['value'])) { + $field['value'] = date_format(date_create($field['value']), 'd.m.Y'); + } + } + + /** + * Handle input masks. + * + * @param array $field + * Field. + * @param array $labelData + * Label data. + */ + private function handleInputMasks(array &$field, array $labelData): void { + if (isset($labelData['element']['input_mask'])) { + $field['value'] = InputmaskHandler::convertPossibleInputmaskValue($field['value'], $labelData); + } + } + + /** + * Handle issuer. + * + * @param array $field + * Field. + * @param string $langcode + * Language code. + */ + private function handleIssuer(array &$field, string $langcode): void { + if ($field['ID'] === 'issuer') { + $issuerLanguageOptions = [ + 'context' => 'Grant Issuers', + 'langcode' => $langcode, + ]; + $issuerArray = [ + "1" => $this->t('State', [], $issuerLanguageOptions), + "3" => $this->t('EU', [], $issuerLanguageOptions), + "4" => $this->t('Other', [], $issuerLanguageOptions), + "5" => $this->t('Foundation', [], $issuerLanguageOptions), + "6" => $this->t("STEA", [], $issuerLanguageOptions), + ]; + $field['value'] = $issuerArray[$field['value']]; + } + } + + /** + * Handle section. + * + * @param array $field + * Field. + * @param array $labelData + * Label data. + */ + private function handleSection(array &$field, array &$labelData): void { + if ($labelData['section']['id'] === 'application_number' || $labelData['section']['id'] === 'status') { + unset($field); + unset($labelData['section']); + } + } + + /** + * Handle liitteet section. + * + * @param array $field + * Field. + */ + private function handleLiitteetSection(array &$field): void { + if ($field['ID'] === 'integrationID' || $field['ID'] === 'isNewAttachment' || $field['ID'] === 'fileType') { + unset($field); + return; + } + if ($field['ID'] === 'isDeliveredLater' || $field['ID'] === 'isIncludedInOtherFile') { + if ($field['value'] === 'false') { + unset($field); + return; + } + else { + $field['value'] = Markup::create('
'); + } + } + if ($field['ID'] === 'fileName') { + $field['value'] = Markup::create($field['value'] . '

'); + } + } + + /** + * Handle subventiontypes. + * + * @param array $field + * Field. + * @param array $labelData + * Label data. + * @param string $langcode + * Language code. + * @param bool $isSubventionType + * Is subvention type. + * @param string $subventionType + * Subvention type. + */ + private function handleSubventionType( + array &$field, + array &$labelData, + string $langcode, + bool &$isSubventionType, + string &$subventionType, + ): void { + if ($field['ID'] === 'subventionType') { + $typeNames = CompensationsComposite::getOptionsForTypes($langcode); + $subventionType = $typeNames[$field['value']]; + $isSubventionType = TRUE; + } + elseif ($isSubventionType) { + $labelData['element']['label'] = $subventionType; + $isSubventionType = FALSE; + } + } + + /** + * Handle role. + * + * @param array $field + * Field. + */ + private function handleRole(array &$field): void { + if ($field['ID'] == 'role') { + $roles = GrantsProfileFormRegisteredCommunity::getOfficialRoles(); + $role = $roles[$field['value']]; + if ($role) { + $field['value'] = $role; + } + } + } + + /** + * Handle boolean values. + * + * @param array $field + * Field. + * @param string $langcode + * Language code. + */ + private function handleBooleanValues(array &$field, string $langcode): void { + if (array_key_exists('value', $field)) { + if ($field['value'] === 'true') { + $field['value'] = $this->t('Yes', [], [ + 'context' => 'grants_handler', + 'langcode' => $langcode, + ]); + } + elseif ($field['value'] === 'false') { + $field['value'] = $this->t('No', [], [ + 'context' => 'grants_handler', + 'langcode' => $langcode, + ]); + } + } + } + +} diff --git a/public/modules/custom/grants_handler/src/Controller/CopyApplicationAjaxController.php b/public/modules/custom/grants_handler/src/Controller/CopyApplicationAjaxController.php new file mode 100644 index 0000000000..0830d35494 --- /dev/null +++ b/public/modules/custom/grants_handler/src/Controller/CopyApplicationAjaxController.php @@ -0,0 +1,199 @@ +get('grants_handler.application_getter_service'), + $container->get('grants_handler.application_init_service'), + $container->get('grants_events.events_service'), + $container->get('grants_handler.application_status_service'), + ); + } + + /** + * Builds the response. + * + * @param string $submission_id + * The submission ID. + * + * @return \Symfony\Component\HttpFoundation\RedirectResponse + * The redirect response. + */ + public function __invoke(string $submission_id): RedirectResponse { + $oldApplicationUrl = $this->getOldApplicationUrl($submission_id); + + try { + $webform_submission = $this->getWebformSubmission($submission_id); + $webform = $webform_submission->getWebForm(); + $this->makeSureCopyingIsEnabled($webform); + + $newSubmission = $this->initNewApplication($webform->id(), $webform_submission->getData()); + $this->logEvent($newSubmission, $webform_submission->getData()); + + return $this->getNewApplicationRedirect($webform, $newSubmission); + } + catch (\Throwable $e) { + $this->messenger()->addError('Application copying failed.'); + $this->getLogger('grants_handler') + ->error('Application copying failed: @message', ['@message' => $e->getMessage()]); + return new RedirectResponse($oldApplicationUrl->toString()); + } + } + + /** + * Gets the URL of the old application. + * + * @param string $submission_id + * The submission ID. + * + * @return \Drupal\Core\Url + * The URL of the old application. + */ + private function getOldApplicationUrl(string $submission_id): Url { + return Url::fromRoute('grants_handler.view_application', ['submission_id' => $submission_id]); + } + + /** + * Gets the webform submission object. + * + * @param string $submission_id + * The submission ID. + * + * @return \Drupal\webform\Entity\WebformSubmission + * The webform submission object. + * + * @throws \RuntimeException + * If the webform submission cannot be retrieved. + */ + private function getWebformSubmission(string $submission_id): WebformSubmission { + try { + return $this->applicationGetterService->submissionObjectFromApplicationNumber($submission_id); + } + catch (EntityStorageException | CompanySelectException $e) { + throw new \RuntimeException('Failed to get webform submission.'); + } + } + + /** + * Validates the application. + * + * @param \Drupal\webform\WebformInterface $webform + * The webform object. + * + * @throws \RuntimeException + * If the application cannot be copied. + */ + private function makeSureCopyingIsEnabled(WebformInterface $webform): void { + $thirdPartySettings = $webform->getThirdPartySettings('grants_metadata'); + $isApplicationArchived = $thirdPartySettings["status"] === 'archived' ?? TRUE; + $isApplicationOpen = $this->applicationStatusService->isApplicationOpen($webform); + + if ($thirdPartySettings["disableCopying"] === 1 || $isApplicationArchived || !$isApplicationOpen) { + throw new \RuntimeException('Application copying disabled.'); + } + } + + /** + * Initializes a new application with copied data. + * + * @param string $webform_id + * The webform ID. + * @param array $data + * The data to initialize the new application with. + * + * @return \Drupal\webform\Entity\WebformSubmission + * The new webform submission object. + * + * @throws \RuntimeException + * If the new application cannot be initialized. + */ + private function initNewApplication(string $webform_id, array $data): WebformSubmission { + try { + return $this->applicationInitService->initApplication($webform_id, $data); + } + catch (\Throwable $e) { + throw new \RuntimeException('Failed to initialize new application.'); + } + } + + /** + * Logs the event of copying the application. + * + * @param \Drupal\webform\Entity\WebformSubmission $newSubmission + * The new webform submission object. + * @param array $oldData + * The data of the old application. + * + * @throws \Drupal\grants_events\EventException + */ + private function logEvent(WebformSubmission $newSubmission, array $oldData): void { + $newData = $newSubmission->getData(); + $this->messenger() + ->addStatus($this->t('Grant application copied, new id: @number', ['@number' => $newData['application_number']], ['context' => 'grants_handler'])); + $this->eventsService->logEvent($newData['application_number'], 'HANDLER_APP_COPIED', $this->t('Application copied from application id: @id', ['@id' => $oldData['application_number']], ['context' => 'grants_handler']) + ->render(), $newData['application_number']); + } + + /** + * Gets the redirect response for the new application. + * + * @param \Drupal\webform\WebformInterface $webform + * The webform object. + * @param \Drupal\webform\Entity\WebformSubmission $newSubmission + * The new webform submission object. + * + * @return \Symfony\Component\HttpFoundation\RedirectResponse + * The redirect response. + */ + private function getNewApplicationRedirect(WebformInterface $webform, WebformSubmission $newSubmission): RedirectResponse { + $newApplicationUrl = Url::fromRoute('grants_handler.edit_application', [ + 'webform' => $webform->id(), + 'webform_submission' => $newSubmission->id(), + ]); + return new RedirectResponse($newApplicationUrl->toString()); + } + +} diff --git a/public/modules/custom/grants_handler/src/EventsService.php b/public/modules/custom/grants_handler/src/EventsService.php deleted file mode 100644 index 64e201a3b9..0000000000 --- a/public/modules/custom/grants_handler/src/EventsService.php +++ /dev/null @@ -1,247 +0,0 @@ - 'AVUSTUS2_MSG_OK', - 'AVUSTUS2_ATT_OK' => 'AVUSTUS2_ATT_OK', - 'STATUS_UPDATE' => 'STATUS_UPDATE', - 'MESSAGE_AVUS2' => 'MESSAGE_AVUS2', - 'MESSAGE_APP' => 'MESSAGE_APP', - 'MESSAGE_READ' => 'MESSAGE_READ', - 'MESSAGE_RESEND' => 'MESSAGE_RESEND', - 'HANDLER_ATT_OK' => 'HANDLER_ATT_OK', - 'HANDLER_ATT_DELETE' => 'HANDLER_ATT_DELETE', - 'HANDLER_RESEND_APP' => 'HANDLER_RESEND_APP', - 'HANDLER_APP_COPIED' => 'HANDLER_APP_COPIED', - 'INTEGRATION_INFO_ATT_OK' => 'INTEGRATION_INFO_ATT_OK', - 'INTEGRATION_INFO_APP_OK' => 'INTEGRATION_INFO_APP_OK', - 'EVENT_INFO' => 'EVENT_INFO', - 'HANDLER_ATT_DELETED' => 'HANDLER_ATT_DELETED', - 'INTEGRATION_ERROR_AVUS2' => 'INTEGRATION_ERROR_AVUS2', - 'INTEGRATION_ERROR_ATV_ATT' => 'INTEGRATION_ERROR_ATV_ATT', - ]; - - /** - * Constructs a MessageService object. - * - * @param \GuzzleHttp\Client $http_client - * Client to post data. - * @param \Drupal\Core\Logger\LoggerChannelFactory $loggerFactory - * Log things. - */ - public function __construct( - Client $http_client, - LoggerChannelFactoryInterface $loggerFactory, - ) { - $this->httpClient = $http_client; - $this->logger = $loggerFactory->get('grants_handler_events_service'); - - $this->endpoint = getenv('AVUSTUS2_EVENT_ENDPOINT'); - $this->username = getenv('AVUSTUS2_USERNAME'); - $this->password = getenv('AVUSTUS2_PASSWORD'); - - $this->setDebug(NULL); - - } - - /** - * Get event types. - * - * @return array|string[] - * Event types. - */ - public function getEventTypes(): array { - return $this->eventTypes; - } - - /** - * Log event to document via event integration. - * - * @param string $applicationNumber - * Application to be logged. - * @param string $eventType - * Type of event, must be configured in this class as active one. - * @param string $eventDescription - * Free message to be added. - * @param string $eventTarget - * Target ID for event. - * @param array $eventData - * If we have already built-up event data, use this. - * - * @return array|null - * EventID if success, otherways NULL - * - * @throws \Drupal\grants_handler\EventException - */ - public function logEvent( - string $applicationNumber, - string $eventType, - string $eventDescription, - string $eventTarget, - array $eventData = [], - ): ?array { - - if (empty($eventData)) { - $eventData = self::getEventData($eventType, $applicationNumber, $eventDescription, $eventTarget); - } - - $eventDataJson = Json::encode($eventData); - - if (TRUE === $this->debug) { - $this->logger->debug( - 'Event ID: %eventId, JSON: %json', - [ - '%eventId' => $eventData['eventID'], - '%json' => $eventDataJson, - ]); - } - - try { - - $res = $this->httpClient->post($this->endpoint, [ - 'auth' => [$this->username, $this->password, "Basic"], - 'body' => $eventDataJson, - ]); - - if ($res->getStatusCode() == 200) { - $this->logger->info('Event logged: %eventId, message sent.', ['%eventId' => $eventData['eventID']]); - return $eventData; - } - - } - catch (\Exception $e) { - throw new EventException($e->getMessage()); - } - catch (GuzzleException $e) { - throw new EventException($e->getMessage()); - } - - return NULL; - } - - /** - * Filter events by given key. - * - * @param array $events - * Events to be filtered. - * @param string $typeKey - * Event type wanted. - * - * @return array - * Filtered events. - */ - public function filterEvents(array $events, string $typeKey): array { - $messageEvents = array_filter($events, function ($event) use ($typeKey) { - if ($event['eventType'] == $this->eventTypes[$typeKey]) { - return TRUE; - } - return FALSE; - }); - - return [ - 'events' => $messageEvents, - 'event_targets' => array_column($messageEvents, 'eventTarget'), - 'event_ids' => array_column($messageEvents, 'eventID'), - ]; - } - - /** - * Build event object/array from given data. - * - * @param string $eventType - * Type of event, must be in self::$eventTypes. - * @param string $applicationNumber - * Application number for event. - * @param string $eventDescription - * Event description. - * @param string $eventTarget - * Eent target. - * - * @return array - * Event data in array. - * - * @throws \Drupal\grants_handler\EventException - */ - public function getEventData(string $eventType, string $applicationNumber, string $eventDescription, string $eventTarget): array { - $eventData = []; - - if (!in_array($eventType, $this->eventTypes)) { - throw new EventException('Not valid event type: ' . $eventType); - } - else { - $eventData['eventType'] = $eventType; - } - - $eventData['eventID'] = Uuid::uuid4()->toString(); - $eventData['caseId'] = $applicationNumber; - $eventData['eventDescription'] = AtvSchema::sanitizeInput($eventDescription); - $eventData['eventTarget'] = $eventTarget; - - if (!isset($eventData['eventSource'])) { - $eventData['eventSource'] = getenv('EVENTS_SOURCE'); - } - - $dt = new \DateTime(); - $dt->setTimezone(new \DateTimeZone('Europe/Helsinki')); - - $eventData['timeCreated'] = $eventData['timeUpdated'] = $dt->format('Y-m-d\TH:i:s'); - return $eventData; - } - -} diff --git a/public/modules/custom/grants_handler/src/Form/CopyApplicationForm.php b/public/modules/custom/grants_handler/src/Form/CopyApplicationForm.php deleted file mode 100644 index a40dcec15e..0000000000 --- a/public/modules/custom/grants_handler/src/Form/CopyApplicationForm.php +++ /dev/null @@ -1,146 +0,0 @@ -setDebug(NULL); - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container): MessageForm|static { - return new static( - $container->get('grants_handler.application_init_service'), - $container->get('grants_handler.application_getter_service') - ); - } - - /** - * {@inheritdoc} - */ - public function getFormId(): string { - return 'grants_handler_copy_application'; - } - - /** - * {@inheritdoc} - */ - public function buildForm(array $form, FormStateInterface $form_state, string $submission_id = ''): array { - $tOpts = ['context' => 'grants_handler']; - - try { - $webform_submission = $this->applicationGetterService->submissionObjectFromApplicationNumber($submission_id); - - if ($webform_submission != NULL) { - $form_state->setStorage(['submission' => $webform_submission]); - } - } - catch (\Exception | GuzzleException $e) { - $this->logger(self::LOGGER_CHANNEL)->error('Failed to load submission: @error', ['@error' => $e->getMessage()]); - } - $form['copyFrom'] = [ - '#type' => 'markup', - '#markup' => 'Tähän vois sitte laittaa hakemuksen perussettejä, tai vaikka koko hakemus näytille.', - ]; - - $form['actions'] = [ - '#type' => 'actions', - ]; - $form['actions']['submit'] = [ - '#type' => 'submit', - '#value' => $this->t('Copy application', [], $tOpts), - ]; - - return $form; - } - - /** - * {@inheritdoc} - */ - public function validateForm(array &$form, FormStateInterface $form_state) {} - - /** - * {@inheritdoc} - */ - public function submitForm(array &$form, FormStateInterface $form_state): void { - $storage = $form_state->getStorage(); - /** @var \Drupal\webform\Entity\WebformSubmission $webform_submission */ - $webform_submission = $storage['submission']; - $webform = $webform_submission->getWebForm(); - - // Init new application with copied data. - try { - $newSubmission = $this->applicationInitService->initApplication($webform->id(), $webform_submission->getData()); - } - catch (EntityStorageException | - GrantsProfileException | - AtvDocumentNotFoundException | - AtvFailedToConnectException | - ProfileDataException | - TokenExpiredException | - GuzzleException $e) { - $newSubmission = FALSE; - } - - if ($newSubmission) { - - $newData = $newSubmission->getData(); - - $this->messenger() - ->addStatus( - $this->t( - 'Grant application copied(@number)', - [ - '@number' => $newData['application_number'], - ] - ) - ); - - $form_state->setRedirect( - 'grants_handler.completion', - ['submission_id' => $newData['application_number']], - [ - 'attributes' => [ - 'data-drupal-selector' => 'application-saved-successfully-link', - ], - ] - ); - } - else { - $this->messenger()->addError('Grant application copy failed.'); - } - } - -} diff --git a/public/modules/custom/grants_handler/src/Form/CopyApplicationModalForm.php b/public/modules/custom/grants_handler/src/Form/CopyApplicationModalForm.php deleted file mode 100644 index 7e2c463eb2..0000000000 --- a/public/modules/custom/grants_handler/src/Form/CopyApplicationModalForm.php +++ /dev/null @@ -1,300 +0,0 @@ -setDebug(NULL); - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container): CopyApplicationModalForm|static { - - // Create a new form object and inject its services. - $form = new static( - $container->get('renderer'), - $container->get('grants_events.events_service'), - $container->get('grants_handler.application_status_service'), - $container->get('grants_handler.application_init_service'), - $container->get('grants_handler.application_getter_service') - ); - $form->setRequestStack($container->get('request_stack')); - $form->setStringTranslation($container->get('string_translation')); - $form->setMessenger($container->get('messenger')); - - return $form; - - } - - /** - * {@inheritdoc} - */ - public function getFormId(): string { - return 'grants_profile_copy_application_modal_form'; - } - - /** - * Helper method so we can have consistent dialog options. - * - * @return string[] - * An array of jQuery UI elements to pass on to our dialog form. - */ - public static function getDataDialogOptions(): array { - return [ - 'width' => '33%', - 'closeText' => t('Close'), - ]; - } - - /** - * {@inheritdoc} - */ - public function buildForm(array $form, FormStateInterface $form_state, string $submission_id = '', string $nojs = ''): array { - $tOpts = ['context' => 'grants_handler']; - - // Add the core AJAX library. - $form['#attached']['library'][] = 'core/drupal.ajax'; - $form['#theme'] = 'application_copy_modal_form'; - - try { - $webform_submission = $this->applicationGetterService->submissionObjectFromApplicationNumber($submission_id); - - if ($webform_submission != NULL) { - // Set webform submission template. - $build = [ - '#theme' => 'submission_for_modal_form', - '#submission' => $webform_submission, - '#submission_id' => $submission_id, - ]; - - $form_state->setStorage(['submission' => $webform_submission]); - $form['modal_markup'] = [ - '#markup' => $this->renderer->render($build), - ]; - } - - } - catch (\Exception | GuzzleException $e) { - $this->logger('copy_application_modal_form')->error('Error: %error', [ - '%error' => $e->getMessage(), - ]); - } - - // Add a link to show this form in a modal dialog if we're not already in - // one. - if ($nojs == 'nojs') { - $form['use_ajax_container'] = [ - '#type' => 'details', - '#open' => TRUE, - ]; - $form['use_ajax_container']['use_ajax'] = [ - '#type' => 'link', - '#title' => $this->t('See this form as a modal.', [], $tOpts), - '#url' => Url::fromRoute('grants_handler.copy_application_modal', ['nojs' => 'ajax']), - '#attributes' => [ - 'class' => ['use-ajax'], - 'data-dialog-type' => 'modal', - 'data-dialog-options' => json_encode(static::getDataDialogOptions()), - // Add this id so that we can test this form. - 'id' => 'copy-application-modal-form-link', - ], - ]; - } - - // This element is responsible for displaying form errors in the AJAX - // dialog. - if ($nojs == 'ajax') { - $form['status_messages'] = [ - '#type' => 'status_messages', - '#weight' => -999, - ]; - } - - // Add a submit button that handles the submission of the form. - $form['actions']['submit'] = [ - '#type' => 'submit', - '#value' => $this->t('Use application as base', [], $tOpts), - '#ajax' => [ - 'callback' => '::ajaxSubmitForm', - 'event' => 'click', - ], - '#attributes' => [ - 'id' => 'copy-application-modal-form-submit', - ], - ]; - - // Set the form to not use AJAX if we're on a nojs path. When this form is - // within the modal dialog, Drupal will make sure we're using an AJAX path - // instead of a nojs one. - if ($nojs == 'nojs') { - unset($form['actions']['submit']['#ajax']); - } - - return $form; - } - - /** - * {@inheritdoc} - */ - public function validateForm(array &$form, FormStateInterface $form_state): void { - $storage = $form_state->getStorage(); - /** @var \Drupal\webform\Entity\WebformSubmission $webform_submission */ - $webform_submission = $storage['submission']; - $webform = $webform_submission->getWebForm(); - - $isApplicationOpen = $this->applicationStatusService->isApplicationOpen($webform); - $thirdPartySettings = $webform->getThirdPartySettings('grants_metadata'); - - // If copying is disabled in 3rd party settings, do not allow forward. - if ($thirdPartySettings["disableCopying"] == 1 || - $thirdPartySettings["status"] === 'archived' || - !$isApplicationOpen - ) { - $form_state->setErrorByName('modal_markup', 'Copying is disabled for this form.'); - } - - } - - /** - * {@inheritdoc} - */ - public function submitForm(array &$form, FormStateInterface $form_state): void { - $storage = $form_state->getStorage(); - /** @var \Drupal\webform\Entity\WebformSubmission $webform_submission */ - $webform_submission = $storage['submission']; - $oldData = $webform_submission->getData(); - $webform = $webform_submission->getWebForm(); - - // Init new application with copied data. - try { - $newSubmission = $this->applicationInitService->initApplication($webform->id(), $webform_submission->getData()); - $newData = $newSubmission->getData(); - } - catch (\Exception $e) { - $newSubmission = FALSE; - $newData = []; - } - - if ($newSubmission) { - $this->messenger() - ->addStatus( - $this->t( - 'Grant application copied, new id: @number', - [ - '@number' => $newData['application_number'], - ], - ['context' => 'grants_handler'] - ) - ); - - $storage['newSubmission'] = $newSubmission; - $form_state->setStorage($storage); - - $this->eventsService->logEvent( - $newData['application_number'], - 'HANDLER_APP_COPIED', - $this->t('Application copied from application id: @id', ['@id' => $oldData['application_number']], ['context' => 'grants_handler']), - $newData['application_number'] - ); - - $form_state->setRedirect( - 'grants_handler.edit_application', - [ - 'webform_submission' => $newSubmission->id(), - 'webform' => $webform->id(), - ] - ); - } - else { - $this->messenger()->addError('Grant application copy failed'); - } - } - - /** - * Implements the submit handler for the modal dialog AJAX call. - * - * @param array $form - * Render array representing from. - * @param \Drupal\Core\Form\FormStateInterface $form_state - * Current form state. - * - * @return \Drupal\Core\Ajax\AjaxResponse - * Array of AJAX commands to execute on submit of the modal form. - */ - public function ajaxSubmitForm(array &$form, FormStateInterface $form_state) { - $tOpts = ['context' => 'grants_handler']; - - // We begin building a new ajax reponse. - $response = new AjaxResponse(); - - // If the user submitted the form and there are errors, show them the - // input dialog again with error messages. Since the title element is - // required, the empty string wont't validate and there will be an error. - if ($form_state->getErrors()) { - // If there are errors, we can show the form again with the errors in - // the status_messages section. - $form['status_messages'] = [ - '#type' => 'status_messages', - '#weight' => -10, - ]; - $response->addCommand(new OpenModalDialogCommand($this->t('Errors', [], $tOpts), $form, static::getDataDialogOptions())); - } - else { - // No errors, we load things from form state. - $storage = $form_state->getStorage(); - /** @var \Drupal\webform\Entity\WebformSubmission $webform_submission */ - $webform_submission = $storage['newSubmission']; - $webform = $webform_submission->getWebForm(); - - // Create url redirect for this new submission. - $url = Url::fromRoute('grants_handler.edit_application', - [ - 'webform_submission' => $webform_submission->id(), - 'webform' => $webform->id(), - ]); - $response->addCommand(new CloseModalDialogCommand()); - $command = new RedirectCommand($url->toString()); - $response->addCommand($command); - } - - // Finally return our response. - return $response; - } - -} diff --git a/public/modules/custom/grants_handler/src/GrantsHandlerNavigationHelper.php b/public/modules/custom/grants_handler/src/GrantsHandlerNavigationHelper.php index 3d97cc20f4..c8acccd2b8 100644 --- a/public/modules/custom/grants_handler/src/GrantsHandlerNavigationHelper.php +++ b/public/modules/custom/grants_handler/src/GrantsHandlerNavigationHelper.php @@ -118,6 +118,7 @@ public function __construct( public function getCurrentPage(WebformSubmissionInterface $webformSubmission): string { $pages = $webformSubmission->getWebform() ->getPages('edit', $webformSubmission); + return empty($webformSubmission->getCurrentPage()) ? array_keys($pages)[0] : $webformSubmission->getCurrentPage(); } @@ -267,6 +268,29 @@ public function getPageVisits(WebformSubmissionInterface $webformSubmission): ar return $submission_log; } + /** + * Check if user has visited each page. + * + * @param \Drupal\webform\WebformSubmissionInterface $webformSubmission + * The submission to check. + * + * @return array + * Array of unvisited pages. + */ + public function getUnvisitedPages(WebformSubmissionInterface $webformSubmission) : array { + $page_visits = array_map(function ($entry) { + return $entry->page; + }, $this->getPageVisits($webformSubmission)); + $ignore_visits = ['webform_preview', 'webform_confirmation']; + return array_filter( + $webformSubmission->getWebform()->getPages('edit', $webformSubmission), + function ($name) use ($ignore_visits, $page_visits) { + return !in_array($name, $ignore_visits, TRUE) && !in_array($name, $page_visits, TRUE); + }, + ARRAY_FILTER_USE_KEY + ); + } + /** * Logs the current submission page. * diff --git a/public/modules/custom/grants_handler/src/GrantsHandlerSubmissionStorage.php b/public/modules/custom/grants_handler/src/GrantsHandlerSubmissionStorage.php index 8dc7641142..00a21ae0c4 100644 --- a/public/modules/custom/grants_handler/src/GrantsHandlerSubmissionStorage.php +++ b/public/modules/custom/grants_handler/src/GrantsHandlerSubmissionStorage.php @@ -212,7 +212,6 @@ public function setAtvDataToSubmission(AtvDocument $document, WebformSubmissionI * @throws \GuzzleHttp\Exception\GuzzleException */ protected function loadData(array &$webform_submissions): void { - parent::loadData($webform_submissions); $userRoles = $this->account->getRoles(); // Check that we have required role. @@ -242,18 +241,6 @@ protected function loadData(array &$webform_submissions): void { /** @var \Drupal\helfi_atv\AtvDocument $document */ $document = reset($results); - if (!$document) { - $applicationNumber = ApplicationHelpers::createApplicationNumber($submission, TRUE); - $results = $this->atvService->searchDocuments( - [ - 'transaction_id' => $applicationNumber, - 'lookfor' => 'appenv:' . Helpers::getAppEnv(), - ] - ); - /** @var \Drupal\helfi_atv\AtvDocument $document */ - $document = reset($results); - } - if (!$document) { throw new \Exception('Submission data load failed.'); } diff --git a/public/modules/custom/grants_handler/src/Plugin/Block/ApplicationTimeoutMessageBlock.php b/public/modules/custom/grants_handler/src/Plugin/Block/ApplicationTimeoutMessageBlock.php index a53369b781..1b0b1c1c4a 100644 --- a/public/modules/custom/grants_handler/src/Plugin/Block/ApplicationTimeoutMessageBlock.php +++ b/public/modules/custom/grants_handler/src/Plugin/Block/ApplicationTimeoutMessageBlock.php @@ -44,7 +44,7 @@ public function build(): array { } $applicationCloseTime = $webform->getThirdPartySetting('grants_metadata', 'applicationClose'); - $applicationCloseTimestamp = strtotime($applicationCloseTime); + $applicationCloseTimestamp = $applicationCloseTime ? strtotime($applicationCloseTime) : FALSE; $currentTimestamp = strtotime('now'); // Do not render this message if the form is already closed. diff --git a/public/modules/custom/grants_handler/src/Plugin/WebformHandler/GrantsHandler.php b/public/modules/custom/grants_handler/src/Plugin/WebformHandler/GrantsHandler.php index 35dfb62087..92363fc13e 100644 --- a/public/modules/custom/grants_handler/src/Plugin/WebformHandler/GrantsHandler.php +++ b/public/modules/custom/grants_handler/src/Plugin/WebformHandler/GrantsHandler.php @@ -6,6 +6,7 @@ use Drupal\Core\Datetime\DateFormatter; use Drupal\Core\Datetime\DrupalDateTime; use Drupal\Core\DrupalKernel; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Session\AccountProxyInterface; @@ -58,7 +59,7 @@ * \Drupal\webform\Plugin\WebformHandlerInterface::SUBMISSION_REQUIRED, * ) */ -class GrantsHandler extends WebformHandlerBase { +final class GrantsHandler extends WebformHandlerBase { /** * Form data saved because the data in saved submission is not preserved. @@ -77,7 +78,7 @@ class GrantsHandler extends WebformHandlerBase { * * @var string */ - protected string $applicationType; + protected string $applicationType = ''; /** * Applicant type. @@ -86,21 +87,21 @@ class GrantsHandler extends WebformHandlerBase { * * @var string */ - protected string $applicantType; + protected string $applicantType = ''; /** * Application type ID. * * @var string */ - protected string $applicationTypeID; + protected string $applicationTypeID = ''; /** * Generated application number. * * @var string */ - protected string $applicationNumber; + protected string $applicationNumber = ''; /** * Application acting year options. @@ -118,54 +119,12 @@ class GrantsHandler extends WebformHandlerBase { */ protected string $newStatus; - /** - * Drupal\Core\Session\AccountProxyInterface definition. - * - * @var \Drupal\Core\Session\AccountProxyInterface - */ - protected AccountProxyInterface $currentUser; - - /** - * User data from helsinkiprofiili & auth methods. - * - * @var \Drupal\helfi_helsinki_profiili\HelsinkiProfiiliUserData - */ - protected HelsinkiProfiiliUserData $userExternalData; - - /** - * Access GRants profile. - * - * @var \Drupal\grants_profile\GrantsProfileService - */ - protected GrantsProfileService $grantsProfileService; - - /** - * Date formatter. - * - * @var \Drupal\Core\Datetime\DateFormatter - */ - protected DateFormatter $dateFormatter; - - /** - * All attachment-related things. - * - * @var \Drupal\grants_attachments\AttachmentHandler - */ - protected AttachmentHandler $attachmentHandler; - - /** - * Form lock service. - * - * @var \Drupal\grants_handler\FormLockService - */ - protected FormLockService $formLockService; - /** * Save form trigger for methods where form_state is not available. * * @var string */ - protected string $triggeringElement; + protected string $triggeringElement = ''; /** * Save form for methods where form is not available. @@ -186,80 +145,87 @@ class GrantsHandler extends WebformHandlerBase { * * @var bool */ - protected bool $isRedirect; + protected bool $isRedirect = FALSE; /** - * Help with stored errors. - * - * @var \Drupal\grants_handler\GrantsHandlerNavigationHelper - */ - protected GrantsHandlerNavigationHelper $grantsFormNavigationHelper; - - /** - * The Drupal kernel. - * - * @var \Drupal\Core\DrupalKernel + * The constructor. + * + * @param array $configuration + * The configuration. + * @param string $plugin_id + * The plugin id. + * @param mixed $plugin_definition + * The plugin definition. + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager + * The entity type manager. + * @param \Drupal\Core\Session\AccountProxyInterface $currentUser + * The account proxy. + * @param \Drupal\helfi_helsinki_profiili\HelsinkiProfiiliUserData $userExternalData + * The helsinki profiili user data. + * @param \Drupal\grants_profile\GrantsProfileService $grantsProfileService + * The grants profile service. + * @param \Drupal\Core\Datetime\DateFormatter $dateFormatter + * The date formatter. + * @param \Drupal\grants_attachments\AttachmentHandler $attachmentHandler + * The attachment handler. + * @param \Drupal\grants_handler\GrantsHandlerNavigationHelper $grantsFormNavigationHelper + * The grants form navigation helper. + * @param \Drupal\grants_handler\ApplicationValidator $applicationValidator + * The application validator. + * @param \Drupal\grants_handler\ApplicationStatusService $applicationStatusService + * The application status service. + * @param \Drupal\grants_handler\FormLockService $formLockService + * The form lock service. + * @param \Drupal\Core\DrupalKernel $kernel + * The kernel. + * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack + * The request stack. + * @param \Drupal\grants_metadata\ApplicationDataService $applicationDataService + * The application data service. + * @param \Drupal\grants_handler\ApplicationInitService $applicationInitService + * The application init service. + * @param \Drupal\grants_handler\ApplicationUploaderService $applicationUploaderService + * The application upload service. + * @param \Drupal\grants_handler\ApplicationGetterService $applicationGetterService + * The application getter service. + * @param \Drupal\grants_attachments\AttachmentRemover $attachmentRemover + * The attachment remover. */ - protected DrupalKernel $kernel; - - /** - * The request stack. - * - * @var \Symfony\Component\HttpFoundation\RequestStack - */ - protected RequestStack $requestStack; - - /** - * Application validator. - * - * @var \Drupal\grants_handler\ApplicationValidator - */ - protected ApplicationValidator $applicationValidator; - - /** - * Status service. - * - * @var \Drupal\grants_handler\ApplicationStatusService - */ - protected ApplicationStatusService $applicationStatusService; - - /** - * Application data service. - * - * @var \Drupal\grants_metadata\ApplicationDataService - */ - protected ApplicationDataService $applicationDataService; - - /** - * Init application data. - * - * @var \Drupal\grants_handler\ApplicationInitService - */ - protected ApplicationInitService $applicationInitService; - - /** - * Uploader class. - * - * @var \Drupal\grants_handler\ApplicationUploaderService - */ - protected ApplicationUploaderService $applicationUploaderService; - - /** - * Access to application data. - * - * @var \Drupal\grants_handler\ApplicationGetterService - */ - protected ApplicationGetterService $applicationGetterService; - - /** - * Attachment remover. - * - * @var \Drupal\grants_attachments\AttachmentRemover - */ - protected AttachmentRemover $attachmentRemover; + public function __construct( + array $configuration, + $plugin_id, + $plugin_definition, + EntityTypeManagerInterface $entityTypeManager, + protected AccountProxyInterface $currentUser, + protected HelsinkiProfiiliUserData $userExternalData, + protected GrantsProfileService $grantsProfileService, + protected DateFormatter $dateFormatter, + protected AttachmentHandler $attachmentHandler, + protected GrantsHandlerNavigationHelper $grantsFormNavigationHelper, + protected ApplicationValidator $applicationValidator, + protected ApplicationStatusService $applicationStatusService, + protected FormLockService $formLockService, + protected DrupalKernel $kernel, + protected RequestStack $requestStack, + protected ApplicationDataService $applicationDataService, + protected ApplicationInitService $applicationInitService, + protected ApplicationUploaderService $applicationUploaderService, + protected ApplicationGetterService $applicationGetterService, + protected AttachmentRemover $attachmentRemover, + ) { + parent::__construct( + $configuration, + $plugin_id, + $plugin_definition, + ); + $this->entityTypeManager = $entityTypeManager; + $this->attachmentHandler->setDebug($this->isDebug()); + $this->applicationValidator->setDebug($this->isDebug()); + $this->applicationStatusService->setDebug($this->isDebug()); + } /** - * {@inheritdoc} + * {@inheritDoc} */ public static function create( ContainerInterface $container, @@ -267,83 +233,28 @@ public static function create( $plugin_id, $plugin_definition, ): WebformHandlerBase|GrantsHandler|ContainerFactoryPluginInterface { - $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition); - - /** @var \Drupal\Core\Session\AccountProxyInterface $currentUser */ - $currentUser = $container->get('current_user'); - $instance->currentUser = $currentUser; - - /** @var \Drupal\helfi_helsinki_profiili\HelsinkiProfiiliUserData $userExternalData */ - $userExternalData = $container->get('helfi_helsinki_profiili.userdata'); - $instance->userExternalData = $userExternalData; - - /** @var \Drupal\grants_profile\GrantsProfileService $grantsProfileService */ - $grantsProfileService = $container->get('grants_profile.service'); - $instance->grantsProfileService = $grantsProfileService; - - /** @var \Drupal\Core\Datetime\DateFormatter $dateFormatter */ - $dateFormatter = $container->get('date.formatter'); - $instance->dateFormatter = $dateFormatter; - - /** @var \Drupal\grants_attachments\AttachmentHandler $attachmentHandler */ - $attachmentHandler = $container->get('grants_attachments.attachment_handler'); - $instance->attachmentHandler = $attachmentHandler; - $instance->attachmentHandler->setDebug($instance->isDebug()); - - /** @var \Drupal\grants_handler\GrantsHandlerNavigationHelper $grantsFormNavigationHelper */ - $grantsFormNavigationHelper = $container->get('grants_handler.navigation_helper'); - $instance->grantsFormNavigationHelper = $grantsFormNavigationHelper; - - /** @var \Drupal\grants_handler\ApplicationValidator $applicationValidator */ - $applicationValidator = $container->get('grants_handler.application_validator'); - $instance->applicationValidator = $applicationValidator; - $instance->applicationValidator->setDebug($instance->isDebug()); - - /** @var \Drupal\grants_handler\ApplicationStatusService $applicationStatusService */ - $applicationStatusService = $container->get('grants_handler.application_status_service'); - $instance->applicationStatusService = $applicationStatusService; - $instance->applicationStatusService->setDebug($instance->isDebug()); - - /** @var \Drupal\grants_handler\FormLockService $formLockService */ - $formLockService = $container->get('grants_handler.form_lock_service'); - $instance->formLockService = $formLockService; - - /** @var \Drupal\Core\DrupalKernel $kernel */ - $kernel = $container->get('kernel'); - $instance->kernel = $kernel; - - /** @var \Symfony\Component\HttpFoundation\RequestStack $requestStack */ - $requestStack = $container->get('request_stack'); - $instance->requestStack = $requestStack; - - /** @var \Drupal\grants_metadata\ApplicationDataService $applicationDataService */ - $applicationDataService = $container->get('grants_metadata.application_data_service'); - $instance->applicationDataService = $applicationDataService; - - /** @var \Drupal\grants_handler\ApplicationInitService $applicationInitService */ - $applicationInitService = $container->get('grants_handler.application_init_service'); - $instance->applicationInitService = $applicationInitService; - - /** @var \Drupal\grants_handler\ApplicationUploaderService $applicationUploaderService */ - $applicationUploaderService = $container->get('grants_handler.application_uploader_service'); - $instance->applicationUploaderService = $applicationUploaderService; - - /** @var \Drupal\grants_handler\ApplicationGetterService $applicationGetterService */ - $applicationGetterService = $container->get('grants_handler.application_getter_service'); - $instance->applicationGetterService = $applicationGetterService; - - /** @var \Drupal\grants_attachments\AttachmentRemover $attachmentRemover */ - $attachmentRemover = $container->get('grants_attachments.attachment_remover'); - $instance->attachmentRemover = $attachmentRemover; - - $instance->triggeringElement = ''; - $instance->applicationNumber = ''; - $instance->applicantType = ''; - $instance->applicationTypeID = ''; - $instance->applicationType = ''; - $instance->isRedirect = FALSE; - - return $instance; + return new self( + $configuration, + $plugin_id, + $plugin_definition, + $container->get('entity_type.manager'), + $container->get('current_user'), + $container->get('helfi_helsinki_profiili.userdata'), + $container->get('grants_profile.service'), + $container->get('date.formatter'), + $container->get('grants_attachments.attachment_handler'), + $container->get('grants_handler.navigation_helper'), + $container->get('grants_handler.application_validator'), + $container->get('grants_handler.application_status_service'), + $container->get('grants_handler.form_lock_service'), + $container->get('kernel'), + $container->get('request_stack'), + $container->get('grants_metadata.application_data_service'), + $container->get('grants_handler.application_init_service'), + $container->get('grants_handler.application_uploader_service'), + $container->get('grants_handler.application_getter_service'), + $container->get('grants_attachments.attachment_remover'), + ); } /** @@ -985,6 +896,13 @@ public function alterForm(array &$form, FormStateInterface $form_state, WebformS } GrantsErrorStorage::setErrors($errors); + + if ( + $this->grantsFormNavigationHelper->getCurrentPage($webform_submission) == 'webform_preview' && + count($this->grantsFormNavigationHelper->getUnvisitedPages($webform_submission)) > 0 + ) { + $form['actions']['submit']['#disabled'] = TRUE; + } } /** @@ -1191,7 +1109,7 @@ public function validateForm( try { $this->submittedFormData = array_merge( $this->submittedFormData, - ApplicationHelpers::parseSenderDetails()); + $this->applicationDataService->parseSenderDetails()); } catch (ApplicationException $e) { } @@ -1269,12 +1187,19 @@ public function validateForm( $webform_submission ); - if ($violations->count() === 0) { + $allPagesVisited = count( + $this->grantsFormNavigationHelper->getUnvisitedPages($webform_submission) + ) === 0; + + if ($allPagesVisited && $violations->count() === 0) { // If we have no violations clear all errors. $form_state->clearErrors(); $this->grantsFormNavigationHelper->deleteSubmissionLogs($webform_submission, GrantsHandlerNavigationHelper::ERROR_OPERATION); } - else { + if (!$allPagesVisited) { + $form_state->setErrorByName('unvisited-pages', $this->t('You must visit all pages in the form before you can submit the application.', [], $tOpts)); + } + if ($violations->count() > 0) { // If we HAVE errors, then refresh them from the. $this->messenger() ->addError($this->t('The application cannot be submitted because not all @@ -1534,10 +1459,9 @@ public function postSaveHandleApplicationNumber(WebformSubmissionInterface $webf */ public function postSave(WebformSubmissionInterface $webform_submission, $update = TRUE): void { // Invalidate cache for this submission. - $this->entityTypeManager->getViewBuilder($webform_submission->getWebform() - ->getEntityTypeId())->resetCache([ - $webform_submission, - ]); + $this->entityTypeManager + ->getViewBuilder($webform_submission->getWebform()->getEntityTypeId()) + ->resetCache([$webform_submission]); if (empty($this->submittedFormData)) { return; diff --git a/public/modules/custom/grants_handler/tests/src/Unit/ApplicationHelpersExposed.php b/public/modules/custom/grants_handler/tests/src/Unit/ApplicationHelpersExposed.php new file mode 100644 index 0000000000..4837bd0c16 --- /dev/null +++ b/public/modules/custom/grants_handler/tests/src/Unit/ApplicationHelpersExposed.php @@ -0,0 +1,46 @@ + [ + "2_avustustiedot" => [ + "muut_samaan_tarkoitukseen_myonnetyt_avustukset" => [ + "myonnetty_avustus" => [ + "#element" => [ + "issuer" => [ + "#options" => [], + ], + ], + ], + ], + "muut_samaan_tarkoitukseen_haetut_avustukset" => [ + "haettu_avustus_tieto" => [ + "#element" => [ + "issuer" => [ + "#options" => [], + ], + ], + ], + ], + ], + ], + ]; + + $fieldStructureMyonnetty = [ + 'myonnetty_avustus', + 'issuer', + ]; + + $fieldStructureHaettu = [ + 'haettu_avustus_tieto', + 'issuer', + ]; + + $newOptions = [ + 1 => 'State', + 3 => 'EU', + 4 => 'Other', + 5 => 'Foundation', + ]; + + // Test with a single field name. + ApplicationHelpers::updateFieldOptions($form, $newOptions, $fieldStructureMyonnetty); + $this->assertEquals($newOptions, + $form['elements']['2_avustustiedot']['muut_samaan_tarkoitukseen_myonnetyt_avustukset']['myonnetty_avustus']['#element']['issuer']['#options']); + + ApplicationHelpers::updateFieldOptions($form, $newOptions, $fieldStructureHaettu); + $this->assertEquals($newOptions, + $form['elements']['2_avustustiedot']['muut_samaan_tarkoitukseen_haetut_avustukset']['haettu_avustus_tieto']['#element']['issuer']['#options']); + + } + + /** + * Test the createApplicationNumber method. + * + * @covers ::createApplicationNumber + * @covers ::getApplicationNumberInEnvFormat + * @covers ::getApplicationNumberInEnvFormatOldFormat + * @covers \Drupal\grants_handler\Helpers::getAppEnv + */ + public function testCreateApplicationNumber() { + // Set the environment variable to the expected value. + putenv('APP_ENV=ENV'); + + $webform = $this->createMock(Webform::class); + $webform->method('getThirdPartySettings') + ->will($this->onConsecutiveCalls( + [ + 'applicationType' => 'TYPE', + 'applicationTypeID' => '001', + ], + [ + 'applicationType' => 'TYPE', + 'applicationTypeID' => '001', + ], + [ + 'applicationType' => 'TYPE', + 'applicationTypeID' => '001', + ], + [ + 'applicationType' => 'TYPE', + 'applicationTypeID' => '001', + ], + [ + 'applicationType' => 'NEWTYPE', + 'applicationTypeID' => '002', + ] + )); + + $submission = $this->createMock(WebformSubmission::class); + $submission->method('serial')->will($this->onConsecutiveCalls(123, 123, 456, 456, 456, 456)); + $submission->method('getWebform')->willReturn($webform); + + // Ensure the method is called with the correct parameters. + $this->assertEquals('ENV-001-0000123', ApplicationHelpers::createApplicationNumber($submission, FALSE)); + $this->assertEquals('GRANTS-ENV-TYPE-00000123', ApplicationHelpers::createApplicationNumber($submission, TRUE)); + + // Test with different serial numbers. + $this->assertEquals('ENV-001-0000456', ApplicationHelpers::createApplicationNumber($submission, FALSE)); + $this->assertEquals('GRANTS-ENV-TYPE-00000456', ApplicationHelpers::createApplicationNumber($submission, TRUE)); + + $this->assertEquals('ENV-002-0000456', ApplicationHelpers::createApplicationNumber($submission, FALSE)); + } + + /** + * Test the getSerialFromApplicationNumber method. + * + * @covers ::getSerialFromApplicationNumber + */ + public function testGetSerialFromApplicationNumber() { + $applicationNumber = 'ENV-001-0000123'; + $result = ApplicationHelpers::getSerialFromApplicationNumber($applicationNumber); + $this->assertEquals('123', $result); + + // Test with invalid application number. + $applicationNumber = 'INVALID45633465'; + $result = ApplicationHelpers::getSerialFromApplicationNumber($applicationNumber); + $this->assertEquals($result, $applicationNumber); + } + + /** + * @covers ::getApplicationNumberInEnvFormat + */ + public function testGetApplicationNumberInEnvFormat() { + $appParam = 'ENV'; + $typeId = '001'; + $serial = 123; + + $expected = 'ENV-001-0000123'; + $this->assertEquals($expected, ApplicationHelpersExposed::exposedGetApplicationNumberInEnvFormat($appParam, $typeId, $serial)); + + $appParam = 'PROD'; + $expected = '001-0000123'; + $this->assertEquals($expected, ApplicationHelpersExposed::exposedGetApplicationNumberInEnvFormat($appParam, $typeId, $serial)); + } + + /** + * @covers ::getApplicationNumberInEnvFormatOldFormat + */ + public function testGetApplicationNumberInEnvFormatOldFormat() { + $appParam = 'ENV'; + $typeId = 'TYPE'; + $serial = 123; + + $expected = 'GRANTS-ENV-TYPE-00000123'; + $this->assertEquals($expected, ApplicationHelpersExposed::exposedGetApplicationNumberInEnvFormatOldFormat($appParam, $typeId, $serial)); + + $appParam = 'PROD'; + $expected = 'GRANTS-TYPE-00000123'; + $this->assertEquals($expected, ApplicationHelpersExposed::exposedGetApplicationNumberInEnvFormatOldFormat($appParam, $typeId, $serial)); + } + + /** + * Test the hasBreakingChangesInNewerVersion method. + * + * @covers ::hasBreakingChangesInNewerVersion + * @covers Drupal\grants_handler\ApplicationHelpers::getLatestApplicationForm + */ + public function testHasBreakingChangesInNewerVersion() { + // Mock the Webform entity. + $webform = $this->createMock(Webform::class); + $webform->method('uuid')->willReturn('parent-uuid'); + $webform->method('getThirdPartySettings') + ->with('grants_metadata') + ->will($this->onConsecutiveCalls( + [ + 'applicationType' => 'test-application-type', + ], + [ + 'parent' => 'parent-uuid', + 'avus2BreakingChange' => TRUE, + ], + [ + 'parent' => 'parent-uuid', + 'avus2BreakingChange' => TRUE, + ], + [ + 'parent' => 'parent-uuid', + 'avus2BreakingChange' => TRUE, + ], + [ + 'parent' => 'parent-uuid', + 'avus2BreakingChange' => TRUE, + ] + )); + + // Mock the entity type manager and storage. + $entityTypeManager = $this->createMock('Drupal\Core\Entity\EntityTypeManagerInterface'); + $webformStorage = $this->createMock('Drupal\Core\Entity\EntityStorageInterface'); + $entityTypeManager->method('getStorage') + ->with('webform') + ->willReturn($webformStorage); + + // Mock the loading of webforms. + $webformStorage->method('loadByProperties') + ->willReturn([$webform]); + + // Set the entity type manager service. + \Drupal::setContainer(new ContainerBuilder()); + \Drupal::getContainer()->set('entity_type.manager', $entityTypeManager); + + // Call the method and assert the result. + $result = ApplicationHelpers::hasBreakingChangesInNewerVersion($webform); + $this->assertTrue($result); + + } + + /** + * Test the getAvailableApplicationNumber method. + * + * @covers \Drupal\grants_handler\ApplicationHelpers::getAvailableApplicationNumber + */ + public function testGetAvailableApplicationNumber() { + + // Can't get this one to work... + } + +} diff --git a/public/modules/custom/grants_handler/tests/src/Unit/ApplicationValidatorTest.php b/public/modules/custom/grants_handler/tests/src/Unit/ApplicationValidatorTest.php index 4fc471b54e..6c96fbeb83 100644 --- a/public/modules/custom/grants_handler/tests/src/Unit/ApplicationValidatorTest.php +++ b/public/modules/custom/grants_handler/tests/src/Unit/ApplicationValidatorTest.php @@ -70,6 +70,11 @@ protected function setUp(): void { /** * Test for validateApplication. + * + * @covers \Drupal\grants_handler\ApplicationValidator::processViolation + * @covers \Drupal\grants_handler\ApplicationValidator::__construct + * @covers \Drupal\grants_handler\ApplicationValidator::handleOtherViolation + * @covers \Drupal\grants_handler\ApplicationValidator::handleViolation */ public function testProcessViolation(): void { $violation = $this->createMock(ConstraintViolationInterface::class); diff --git a/public/modules/custom/grants_handler/translations/fi.po b/public/modules/custom/grants_handler/translations/fi.po index 22923ea94b..3159975018 100644 --- a/public/modules/custom/grants_handler/translations/fi.po +++ b/public/modules/custom/grants_handler/translations/fi.po @@ -632,6 +632,14 @@ msgctxt "grants_handler" msgid "Refresh the page" msgstr "Lataa sivu uudelleen" +msgctxt "grants_handler" +msgid "You must visit all pages in the form before you can submit the application" +msgstr "Käy kaikilla sivuilla ennen kuin lähetät hakemuksen" + +msgctxt "grants_handler" +msgid "Unvisited pages:" +msgstr "Sivut, joilla ei ole käyty:" + msgctxt "grants_handler" msgid "Leave the application" msgstr "Poistu hakemukselta" @@ -655,3 +663,15 @@ msgstr "Sinulla on tallentamattomia muutoksia. Haluatko varmasti poistua hakemuk msgctxt "grants_handler" msgid "Attention" msgstr "Huomio" + +msgctxt "grants_handler" +msgid "You must visit all pages in the form before you can submit the application." +msgstr "Käy kaikilla sivuilla ennen kuin lähetät hakemuksen." + +msgctxt "grants_handler" +msgid "Application to copy" +msgstr "Kopioitava hakemus" + +msgctxt "grants_handler" +msgid "Application to copy" +msgstr "Kopioitava hakemus" diff --git a/public/modules/custom/grants_handler/translations/sv.po b/public/modules/custom/grants_handler/translations/sv.po index 4f0a13a7af..7b8dcd42c7 100644 --- a/public/modules/custom/grants_handler/translations/sv.po +++ b/public/modules/custom/grants_handler/translations/sv.po @@ -624,6 +624,14 @@ msgstr "%mail är inte en giltig e-postadress. Använd formen user@example.com." msgid "Remove @item @number" msgstr "Ta bort @item @number" +msgctxt "grants_handler" +msgid "You must visit all pages in the form before you can submit the application" +msgstr "Du måste besöka alla sidor i formuläret innan du kan skicka in ansökan." + +msgctxt "grants_handler" +msgid "Unvisited pages:" +msgstr "Obesökta sidor:" + msgctxt "grants_handler" msgid "Refresh the page" msgstr "Uppdatera sidan" @@ -651,3 +659,11 @@ msgstr "Du har osparade ändringar. Är du säker på att du vill lämna?" msgctxt "grants_handler" msgid "Attention" msgstr "Observera" + +msgctxt "grants_handler" +msgid "You must visit all pages in the form before you can submit the application." +msgstr "Du måste besöka alla sidor i formuläret innan du kan skicka in ansökan." + +msgctxt "grants_handler" +msgid "Application to copy" +msgstr "Ansökan om att kopiera" diff --git a/public/modules/custom/grants_mandate/src/Controller/GrantsMandateController.php b/public/modules/custom/grants_mandate/src/Controller/GrantsMandateController.php index 468716943c..d06e91fcfd 100644 --- a/public/modules/custom/grants_mandate/src/Controller/GrantsMandateController.php +++ b/public/modules/custom/grants_mandate/src/Controller/GrantsMandateController.php @@ -2,19 +2,15 @@ namespace Drupal\grants_mandate\Controller; -use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; -use Drupal\Core\Language\LanguageManagerInterface; -use Drupal\Core\Logger\LoggerChannel; -use Drupal\Core\Messenger\MessengerTrait; -use Drupal\Core\Session\AccountProxyInterface; -use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\Url; use Drupal\grants_handler\Helpers; use Drupal\grants_mandate\GrantsMandateRedirectService; use Drupal\grants_mandate\GrantsMandateService; use Drupal\grants_profile\GrantsProfileService; +use Drupal\grants_profile\ProfileConnector; +use Drupal\helfi_atv\AtvDocument; use Psr\Log\LoggerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\RedirectResponse; @@ -27,52 +23,6 @@ */ class GrantsMandateController extends ControllerBase implements ContainerInjectionInterface { - use MessengerTrait; - use StringTranslationTrait; - - /** - * The request stack used to access request globals. - * - * @var \Symfony\Component\HttpFoundation\RequestStack - */ - protected RequestStack $requestStack; - - /** - * The current user. - * - * @var \Drupal\Core\Session\AccountProxyInterface - */ - protected $currentUser; - - /** - * The language manager. - * - * @var \Drupal\Core\Language\LanguageManagerInterface - */ - protected $languageManager; - - /** - * Mandate service. - * - * @var \Drupal\grants_mandate\GrantsMandateService - */ - protected GrantsMandateService $grantsMandateService; - - - /** - * Access to profile data. - * - * @var \Drupal\grants_profile\GrantsProfileService - */ - protected GrantsProfileService $grantsProfileService; - - /** - * Logger access. - * - * @var \Drupal\Core\Logger\LoggerChannel|\Psr\Log\LoggerInterface - */ - protected LoggerChannel|LoggerInterface $logger; - /** * Allowed roles. * @@ -81,75 +31,57 @@ class GrantsMandateController extends ControllerBase implements ContainerInjecti protected array $allowedRoles; /** - * The redirect service. + * The logger. * - * @var \Drupal\grants_mandate\GrantsMandateRedirectService + * @var \Psr\Log\LoggerInterface */ - protected $redirectService; + private LoggerInterface $logger; /** * Grants Mandate Controller constructor. + * + * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack + * The request stack. + * @param \Drupal\grants_mandate\GrantsMandateService $grantsMandateService + * The grants mandate service. + * @param \Drupal\grants_profile\GrantsProfileService $grantsProfileService + * The grants profile service. + * @param \Drupal\grants_mandate\GrantsMandateRedirectService $redirectService + * The grants mandate redirect service. + * @param \Drupal\grants_profile\ProfileConnector $profileConnector + * The profile connector. */ public function __construct( - RequestStack $requestStack, - AccountProxyInterface $current_user, - LanguageManagerInterface $language_manager, - GrantsMandateService $grantsMandateService, - GrantsProfileService $grantsProfileService, - ConfigFactoryInterface $configFactory, - GrantsMandateRedirectService $redirectService, + private RequestStack $requestStack, + private GrantsMandateService $grantsMandateService, + private GrantsProfileService $grantsProfileService, + private GrantsMandateRedirectService $redirectService, + private ProfileConnector $profileConnector, ) { - $this->requestStack = $requestStack; - $this->currentUser = $current_user; - $this->languageManager = $language_manager; - $this->grantsMandateService = $grantsMandateService; - $this->grantsProfileService = $grantsProfileService; - $this->redirectService = $redirectService; $this->logger = $this->getLogger('grants_mandate'); + $config = $this->config('grants_mandate.settings'); + + $extraRoles = is_array($config->get('extra_access_roles')) ? $config->get('extra_access_roles') : []; $this->allowedRoles = [ 'http://valtuusrekisteri.suomi.fi/avustushakemuksen_tekeminen', 'PJ', 'J', + ...$extraRoles, ]; - $config = $configFactory->get('grants_mandate.settings'); - $extraRoles = $config->get('extra_access_roles'); - if ($extraRoles && is_array($extraRoles)) { - $this->allowedRoles = array_merge($this->allowedRoles, $extraRoles); - } - } - - /** - * Check if user has required role in their mandate. - * - * @param array $roles - * Array of user's roles. - * - * @return bool - * Is user allowed to use this mandate. - */ - protected function hasAllowedRole(array $roles) { - $allowedRoles = $this->allowedRoles; - foreach ($roles as $role) { - if (in_array($role, $allowedRoles)) { - return TRUE; - } - } - return FALSE; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container): GrantsMandateController|static { - return new static( + $controller = new static( $container->get('request_stack'), - $container->get('current_user'), - $container->get('language_manager'), $container->get('grants_mandate.service'), $container->get('grants_profile.service'), - $container->get('config.factory'), $container->get('grants_mandate_redirect.service'), + $container->get('grants_profile.profile_connector'), ); + return $controller->setLoggerFactory($container->get('logger.factory')); } /** @@ -161,64 +93,52 @@ public static function create(ContainerInterface $container): GrantsMandateContr * * @throws \GuzzleHttp\Exception\GuzzleException * @throws \Drupal\grants_mandate\GrantsMandateException + * @throws \Drupal\grants_profile\GrantsProfileException */ public function mandateCallbackYpa(): RedirectResponse { $tOpts = ['context' => 'grants_mandate']; - - $code = $this->requestStack->getMainRequest()->query->get('code'); - $state = $this->requestStack->getMainRequest()->query->get('state'); - $callbackUrl = Url::fromRoute('grants_mandate.callback_ypa', [], ['absolute' => TRUE]) ->toString(); $appEnv = Helpers::getAppEnv(); - if (is_string($code) && $code != '') { - $this->grantsMandateService->changeCodeToToken($code, $callbackUrl); - $roles = $this->grantsMandateService->getRoles(); - $isAllowed = FALSE; - if ($roles && isset($roles[0]) && $roles[0]['roles']) { - $rolesArray = $roles[0]['roles']; - $isAllowed = $this->hasAllowedRole($rolesArray); - } - if (!$isAllowed && !str_contains($appEnv, 'LOCAL')) { - $this->messenger()->addError($this->t('Your mandate does not allow you to use this service.', [], $tOpts)); - // Redirect user to grants profile page. - $redirectUrl = Url::fromRoute('grants_mandate.mandateform'); - return new RedirectResponse($redirectUrl->toString()); - } - - $roles = reset($roles); - $roles['type'] = 'registered_community'; - $this->grantsProfileService->setSelectedRoleData($roles); + // We need to exchange the code to token that can be used to authorize + // the user in oAuth calls. + $code = $this->requestStack->getMainRequest()->query->get('code'); + if (!is_string($code) || !$code) { + // If code is not set, we need to handle the error and not allow + // user to progress. + return $this->handleNoCode($tOpts); } - else { - - $error = $this->requestStack->getMainRequest()->query->get('error'); - $error_description = $this->requestStack->getMainRequest()->query->get('error_description'); - $error_uri = $this->requestStack->getMainRequest()->query->get('error_uri'); - - $msg = $this->t('Code exchange error. @error: @error_desc. State: @state, Error URI: @error_uri', - [ - '@error' => $error, - '@error_description' => $error_description, - '@state' => $state, - '@error_uri' => $error_uri, - ], $tOpts); - - $this->logger->error('Error: %error', ['%error' => $msg->render()]); - - $this->messenger()->addError($this->t('Mandate process was interrupted or there was an error. Please try again.', [], $tOpts)); + // If we have code, we can then exchange it to token. + $this->grantsMandateService->changeCodeToToken($code, $callbackUrl); + $roles = $this->grantsMandateService->getRoles(); + $isAllowed = FALSE; + if ($roles && isset($roles[0]) && $roles[0]['roles']) { + $rolesArray = $roles[0]['roles']; + $isAllowed = $this->hasAllowedRole($rolesArray); + } + if (!$isAllowed && !str_contains($appEnv, 'LOCAL')) { + $this->messenger() + ->addError($this->t('Your mandate does not allow you to use this service.', [], $tOpts)); // Redirect user to grants profile page. $redirectUrl = Url::fromRoute('grants_mandate.mandateform'); return new RedirectResponse($redirectUrl->toString()); } + $roles = reset($roles); + $roles['type'] = 'registered_community'; + $this->grantsProfileService->setSelectedRoleData($roles); + $selectedRoleData = $this->grantsProfileService->getSelectedRoleData(); - // Load grants profile. + /** @var \Drupal\helfi_atv\AtvDocument $grantsProfile */ $grantsProfile = $this->grantsProfileService->getGrantsProfile($selectedRoleData, TRUE); + if ($grantsProfile) { + $this->updateProfileWithRecentData($selectedRoleData['identifier'], $grantsProfile); + } + // Redirect user based on if the user has a profile. $redirectUrl = $grantsProfile ? Url::fromRoute('grants_oma_asiointi.front') : Url::fromRoute('grants_profile.edit'); $defaultRedirect = new RedirectResponse($redirectUrl->toString()); @@ -226,16 +146,115 @@ public function mandateCallbackYpa(): RedirectResponse { return $this->redirectService->getRedirect($defaultRedirect); } + /** + * Api did not return a valid code. + * + * @param array $tOpts + * The options. + * + * @return \Symfony\Component\HttpFoundation\RedirectResponse + * Redirect in case of bad code. + */ + private function handleNoCode(array $tOpts): RedirectResponse { + $state = $this->requestStack->getMainRequest()->query->get('state'); + + $error = $this->requestStack->getMainRequest()->query->get('error'); + $error_description = $this->requestStack->getMainRequest()->query->get('error_description'); + $error_uri = $this->requestStack->getMainRequest()->query->get('error_uri'); + + $msg = $this->t('Code exchange error. @error: @error_desc. State: @state, Error URI: @error_uri', + [ + '@error' => $error, + '@error_description' => $error_description, + '@state' => $state, + '@error_uri' => $error_uri, + ], $tOpts); + + $this->logger->error('Error: %error', ['%error' => $msg->render()]); + + $this->messenger() + ->addError($this->t('Mandate process was interrupted or there was an error. Please try again.', [], $tOpts)); + // Redirect user to grants profile page. + $redirectUrl = Url::fromRoute('grants_mandate.mandateform'); + return new RedirectResponse($redirectUrl->toString()); + } + + /** + * Check if user has required role in their mandate. + * + * @param array $roles + * Array of user's roles. + * + * @return bool + * Is user allowed to use this mandate. + */ + protected function hasAllowedRole(array $roles) { + $allowedRoles = $this->allowedRoles; + foreach ($roles as $role) { + if (in_array($role, $allowedRoles)) { + return TRUE; + } + } + return FALSE; + } + /** * Callback for user mandates. */ public function mandateCallbackHpa() { + throw new \Exception('Called a function which has no implementation'); } /** * Callback for hpa listing. */ public function mandateCallbackHpaList() { + throw new \Exception('Called a function which has no implementation'); + } + + /** + * Update user profile data from ytj/yrtti and save it. + * + * @param string $identifier + * Business to get data for. + * @param \Drupal\helfi_atv\AtvDocument $grantsProfile + * Grants profile to update. + * + * @return void + * No return. + * + * @throws \GuzzleHttp\Exception\GuzzleException + */ + public function updateProfileWithRecentData( + string $identifier, + AtvDocument $grantsProfile, + ): void { + + $grantsProfileContent = $grantsProfile->getContent(); + try { + $companyData = $this->profileConnector + ->getRegisteredCompanyDataFromYdjhClient($identifier); + + $grantsProfileContent['businessId'] = $companyData['businessId']; + $grantsProfileContent['companyHome'] = $companyData['companyHome']; + + // UHF-10845 Update and refetch the company data after mandating. + // Uncomment to test changing company data. + // phpcs:ignore + // $grantsProfileContent['companyHome'] .= ' test-override-'.random_int(1, 100); + + $grantsProfileContent['registrationDate'] = $companyData['registrationDate']; + + $this->grantsProfileService->saveGrantsProfile($grantsProfileContent); + + $selectedCompany = $this->grantsProfileService->getSelectedRoleData(); + $this->grantsProfileService->getGrantsProfile($selectedCompany, TRUE); + } + catch (\Exception $e) { + // Failing at this point does not matter, the execution can continue. + $this->logger + ->error('Failed to update grants profile after getting the mandate.'); + } } } diff --git a/public/modules/custom/grants_metadata/grants_metadata.module b/public/modules/custom/grants_metadata/grants_metadata.module index 408f22b6c4..279ee8b1e4 100644 --- a/public/modules/custom/grants_metadata/grants_metadata.module +++ b/public/modules/custom/grants_metadata/grants_metadata.module @@ -724,8 +724,9 @@ from being edited, even if normal rules would otherwise permit it. $bundle = $formObject->getEntity(); $applicationTypeId = $bundle->getThirdPartySetting('grants_metadata', 'applicationType'); $isDuplicatable = in_array($formStatus, ['', 'released']); + if ($applicationTypeId && $isDuplicatable) { - $isDuplicatable = ApplicationHelpers::isApplicationWebformDuplicatable($applicationTypeId); + $isDuplicatable = ApplicationHelpers::isApplicationWebformDuplicatable($applicationTypeId, $webform->id()); } $route_parameters = ['webform' => $webform->id()]; diff --git a/public/modules/custom/grants_metadata/grants_metadata.services.yml b/public/modules/custom/grants_metadata/grants_metadata.services.yml index deeb66bcf9..5fbb9c68d1 100644 --- a/public/modules/custom/grants_metadata/grants_metadata.services.yml +++ b/public/modules/custom/grants_metadata/grants_metadata.services.yml @@ -14,7 +14,8 @@ services: class: Drupal\grants_metadata\ApplicationDataService arguments: [ '@logger.factory', - '@database' + '@database', + '@helfi_helsinki_profiili.userdata' ] calls: - [ setEventsService, [ '@?grants_events.events_service' ] ] diff --git a/public/modules/custom/grants_metadata/src/ApplicationDataService.php b/public/modules/custom/grants_metadata/src/ApplicationDataService.php index 2d2f18001c..87f3547a99 100644 --- a/public/modules/custom/grants_metadata/src/ApplicationDataService.php +++ b/public/modules/custom/grants_metadata/src/ApplicationDataService.php @@ -8,8 +8,10 @@ use Drupal\Core\TypedData\TypedDataInterface; use Drupal\grants_attachments\AttachmentHandler; use Drupal\grants_events\EventsService; +use Drupal\grants_handler\ApplicationException; use Drupal\grants_handler\DebuggableTrait; use Drupal\grants_handler\Helpers; +use Drupal\helfi_helsinki_profiili\HelsinkiProfiiliUserData; /** * Application data service. @@ -30,13 +32,6 @@ final class ApplicationDataService { */ protected LoggerChannelInterface $logger; - /** - * The database service. - * - * @var \Drupal\Core\Database\Connection - */ - protected Connection $database; - /** * Events service. * @@ -49,15 +44,17 @@ final class ApplicationDataService { * * @param \Drupal\Core\Logger\LoggerChannelFactoryInterface $loggerChannelFactory * Logger channel factory. - * @param \Drupal\Core\Database\Connection $datababse + * @param \Drupal\Core\Database\Connection $database * Database connection. + * @param \Drupal\helfi_helsinki_profiili\HelsinkiProfiiliUserData $helsinkiProfiiliUserData + * Helsinki profiili user data. */ public function __construct( LoggerChannelFactoryInterface $loggerChannelFactory, - Connection $datababse, + private readonly Connection $database, + private readonly HelsinkiProfiiliUserData $helsinkiProfiiliUserData, ) { $this->logger = $loggerChannelFactory->get('grants_application_helpers'); - $this->database = $datababse; } /** @@ -70,6 +67,43 @@ public function setEventsService(EventsService $eventsService): void { $this->eventsService = $eventsService; } + /** + * Set up sender details from helsinkiprofiili data. + * + * @return array + * Sender details. + * + * @throws \Drupal\helfi_helsinki_profiili\TokenExpiredException + * @throws \Drupal\grants_handler\ApplicationException + */ + public function parseSenderDetails(): array { + // Set sender information after save so no accidental saving of data. + $userProfileData = $this->helsinkiProfiiliUserData->getUserProfileData(); + $userData = $this->helsinkiProfiiliUserData->getUserData(); + + // If no userprofile data, we cannot proceed. + if (!$userProfileData || !$userData) { + throw new ApplicationException('No profile data found for user.'); + } + + $senderDetails = []; + + if (isset($userProfileData["myProfile"])) { + $data = $userProfileData["myProfile"]; + } + else { + $data = $userProfileData; + } + + $senderDetails['sender_firstname'] = $data["verifiedPersonalInformation"]["firstName"]; + $senderDetails['sender_lastname'] = $data["verifiedPersonalInformation"]["lastName"]; + $senderDetails['sender_person_id'] = $data["verifiedPersonalInformation"]["nationalIdentificationNumber"]; + $senderDetails['sender_user_id'] = $userData["sub"]; + $senderDetails['sender_email'] = $data["primaryEmail"]["email"]; + + return $senderDetails; + } + /** * Validate submission data integrity. * @@ -167,7 +201,7 @@ private function shouldSkipIntegrityCheck(array $submissionData): bool { * * @throws \Exception */ - private function getLatestSaveid(string $applicationNumber): string { + protected function getLatestSaveid(string $applicationNumber): string { $query = $this->database->select(self::TABLE, 'l'); $query->condition('application_number', $applicationNumber); $query->fields('l', ['lid', 'saveid']); diff --git a/public/modules/custom/grants_metadata/src/DocumentContentMapper.php b/public/modules/custom/grants_metadata/src/DocumentContentMapper.php index 79089613e6..e2521aeac9 100644 --- a/public/modules/custom/grants_metadata/src/DocumentContentMapper.php +++ b/public/modules/custom/grants_metadata/src/DocumentContentMapper.php @@ -13,6 +13,15 @@ */ class DocumentContentMapper { + /** + * Attachment file types. + * + * Saved statically to prevent too many queries. + * + * @var array + */ + private static array $attachmentFileTypes = []; + /** * Map document structure to typed data object. * @@ -120,7 +129,19 @@ private static function processStatusUpdates(array &$typedDataValues): void { */ private static function processAttachments(array &$typedDataValues): void { $other_attachments = []; - $attachmentFileTypes = AttachmentHandler::getAttachmentFieldNames($typedDataValues["application_number"], TRUE); + + $applicationNumber = $typedDataValues["application_number"]; + + // Check if the static variable is already populated + // for the given application number. + if (!isset(self::$attachmentFileTypes[$applicationNumber])) { + // If not, populate it. + self::$attachmentFileTypes[$applicationNumber] = + AttachmentHandler::getAttachmentFieldNames( + $applicationNumber, + TRUE + ); + } if (!isset($typedDataValues["attachments"])) { $typedDataValues["attachments"] = []; @@ -128,7 +149,8 @@ private static function processAttachments(array &$typedDataValues): void { foreach ($typedDataValues["attachments"] as $key => $attachment) { $fileType = $attachment["fileType"]; - $fieldName = array_search($fileType, $attachmentFileTypes); + // Get fieldname for the attachment. + $fieldName = array_search($fileType, self::$attachmentFileTypes[$applicationNumber]); $newValues = $attachment; if (!empty($attachment["fileName"])) { @@ -185,7 +207,12 @@ private static function updateIssuerNameCase(array &$typedDataValues, string $ke */ private static function processCommunityAddress(array &$typedDataValues): void { $community_address = []; - foreach (['community_street', 'community_city', 'community_post_code', 'community_country'] as $field) { + foreach ([ + 'community_street', + 'community_city', + 'community_post_code', + 'community_country', + ] as $field) { if (isset($typedDataValues[$field])) { $community_address[$field] = $typedDataValues[$field]; unset($typedDataValues[$field]); diff --git a/public/modules/custom/grants_metadata/src/GrantsConverterService.php b/public/modules/custom/grants_metadata/src/GrantsConverterService.php index d677e09005..b8994ca216 100644 --- a/public/modules/custom/grants_metadata/src/GrantsConverterService.php +++ b/public/modules/custom/grants_metadata/src/GrantsConverterService.php @@ -143,4 +143,44 @@ public function convertToCommaFloat(array $value): ?string { return str_replace(['€', '.', ' '], ['', ',', ''], $fieldValue); } + /** + * Converts a boolean value represented as a string to a Kyllä/Ei string. + * + * This will be called when converting Kyllä/Ei values to webform accepted + * booleanish values. They are stings with 1 or 0 as value. + * So not boolean per se, but this method can be made to support int values + * as well. + * + * @param string $value + * The boolean value as a string ('1', '0', 'Kyllä', 'Ei'). + * + * @return string + * The hard coded 'Yes' ('Kyllä') or 'No' ('Ei') string. + */ + public function convertBooleanToYesNo(string $value): string { + return match ($value) { + 'Kyllä', 'Ei' => $value, + '1' => 'Kyllä', + default => 'Ei', + }; + } + + /** + * Converts a string value back to a boolean integer. + * + * This method is used to convert the 'Kyllä' or 'Ei' strings to booleanish + * values for Webform to consume. While we return an integer, it is not a + * boolean per se, but a value that Webform uses to represent a boolean value. + * + * @param string $value + * The localized 'Yes' ('Kyllä') or 'No' ('Ei') string. + * + * @return int + * The boolean value as an integer (1 for 'Kyllä', 0 for 'Ei'). + */ + public function extractBooleanYesNoValue(string $value): int { + // Return 1 if the value is 'Kyllä', otherwise return 0. + return $value === 'Kyllä' ? 1 : 0; + } + } diff --git a/public/modules/custom/grants_metadata/src/Plugin/DataType/SotepeYleisData.php b/public/modules/custom/grants_metadata/src/Plugin/DataType/SotepeYleisData.php new file mode 100644 index 0000000000..38a61fc0ea --- /dev/null +++ b/public/modules/custom/grants_metadata/src/Plugin/DataType/SotepeYleisData.php @@ -0,0 +1,39 @@ +parent)) { + // The property path of this data object is the parent's path appended + // by this object's name. + $prefix = $this->parent->getPropertyPath(); + return ((is_string($prefix) && strlen($prefix)) ? $prefix . '.' : '') . $this->name; + } + // If no parent is set, this is the root of the data tree. Thus the property + // path equals the name of this data object. + elseif (isset($this->name)) { + return $this->name; + } + return ''; + } + +} diff --git a/public/modules/custom/grants_metadata/src/TypedData/Definition/KuvaErillisDefinition.php b/public/modules/custom/grants_metadata/src/TypedData/Definition/KuvaErillisDefinition.php index 8ce6ad5ffe..2063f18de9 100644 --- a/public/modules/custom/grants_metadata/src/TypedData/Definition/KuvaErillisDefinition.php +++ b/public/modules/custom/grants_metadata/src/TypedData/Definition/KuvaErillisDefinition.php @@ -18,7 +18,6 @@ class KuvaErillisDefinition extends ComplexDataDefinitionBase { */ public function getPropertyDefinitions() { if (!isset($this->propertyDefinitions)) { - $info = &$this->propertyDefinitions; foreach ($this->getBaseProperties() as $key => $property) { @@ -34,216 +33,86 @@ public function getPropertyDefinitions() { 'purpose', ]); - $info['hankesuunnitelma_jatkohakemus'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankesuunnitelma_jatkohakemus', - ]); - - $info['hankkeen_tarkoitus_tavoitteet'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_tarkoitus_tavoitteet', - ]); - - $info['hankkeen_toimenpiteet_aikataulu'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_toimenpiteet_aikataulu', - ]); - - $info['hankkeen_toimenpiteet_alkupvm'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_toimenpiteet_alkupvm', - ]) - ->setSetting('typeOverride', [ - 'dataType' => 'string', - 'jsonType' => 'datetime', - ]) - ->setSetting('valueCallback', [ - 'service' => 'grants_metadata.converter', - 'method' => 'convertDates', - 'arguments' => [ - 'dateFormat' => 'c', + $customQuestions = [ + 'hankesuunnitelma_radios' => [ + 'type' => 'string', + 'valueCallback' => [ + 'service' => 'grants_metadata.converter', + 'method' => 'convertBooleanToYesNo', ], - ]); - - $info['hankkeen_toimenpiteet_loppupvm'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_toimenpiteet_loppupvm', - ]) - ->setSetting('typeOverride', [ - 'dataType' => 'string', - 'jsonType' => 'datetime', - ]) - ->setSetting('valueCallback', [ - 'service' => 'grants_metadata.converter', - 'method' => 'convertDates', - 'arguments' => [ - 'dateFormat' => 'c', + 'webformValueExtracter' => [ + 'service' => 'grants_metadata.converter', + 'method' => 'extractBooleanYesNoValue', ], - ]); - - $info['hankkeen_keskeisimmat_kumppanit'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_keskeisimmat_kumppanit', - ]); - - $info['haun_painopisteet_liikkumis_kehitys'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'haun_painopisteet_liikkumis_kehitys', - ]); - - $info['haun_painopisteet_digi_kehitys'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'haun_painopisteet_digi_kehitys', - ]); - - $info['haun_painopisteet_vertais_kehitys'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'haun_painopisteet_vertais_kehitys', - ]); - - $info['haun_painopisteet_kulttuuri_kehitys'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'haun_painopisteet_kulttuuri_kehitys', - ]); - - $info['hankkeen_kohderyhmat_kenelle'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_kohderyhmat_kenelle', - ]); - - $info['hankkeen_kohderyhmat_erityisryhmat'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_kohderyhmat_erityisryhmat', - ]); - - $info['hankkeen_kohderyhmat_tavoitus'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_kohderyhmat_tavoitus', - ]); - - $info['hankkeen_kohderyhmat_konkretia'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_kohderyhmat_konkretia', - ]); - - $info['hankkeen_kohderyhmat_osallisuus'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_kohderyhmat_osallisuus', - ]); - - $info['hankkeen_kohderyhmat_osaaminen'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_kohderyhmat_osaaminen', - ]); - - $info['hankkeen_kohderyhmat_postinrot'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_kohderyhmat_postinrot', - ]); - - $info['hankkeen_kohderyhmat_miksi_alue'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_kohderyhmat_miksi_alue', - ]); - - $info['hankkeen_riskit_keskeisimmat'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_riskit_keskeisimmat', - ]); - - $info['hankkeen_riskit_seuranta'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_riskit_seuranta', - ]); - - $info['hankkeen_riskit_vakiinnuttaminen'] = DataDefinition::create('string') - ->setSetting('defaultValue', '') - ->setSetting('jsonPath', [ - 'compensation', - 'customQuestionsInfo', - 'customQuestionsArray', - 'hankkeen_riskit_vakiinnuttaminen', - ]); + ], + 'ensisijainen_taiteen_ala' => [], + 'hankesuunnitelma_jatkohakemus' => [ + 'type' => 'string', + 'valueCallback' => [ + 'service' => 'grants_metadata.converter', + 'method' => 'convertBooleanToYesNo', + ], + 'webformValueExtracter' => [ + 'service' => 'grants_metadata.converter', + 'method' => 'extractBooleanYesNoValue', + ], + ], + 'hankkeen_tarkoitus_tavoitteet' => [], + 'hankkeen_toimenpiteet_aikataulu' => [], + 'hankkeen_toimenpiteet_alkupvm' => [ + 'typeOverride' => [ + 'dataType' => 'string', + 'jsonType' => 'datetime', + ], + 'valueCallback' => [ + 'service' => 'grants_metadata.converter', + 'method' => 'convertDates', + 'arguments' => [ + 'dateFormat' => 'Y-m-d', + ], + ], + ], + 'hankkeen_toimenpiteet_loppupvm' => [ + 'typeOverride' => [ + 'dataType' => 'string', + 'jsonType' => 'datetime', + ], + 'valueCallback' => [ + 'service' => 'grants_metadata.converter', + 'method' => 'convertDates', + 'arguments' => [ + 'dateFormat' => 'Y-m-d', + ], + ], + ], + 'hankkeen_keskeisimmat_kumppanit' => [], + 'haun_painopisteet_liikkumis_kehitys' => [], + 'haun_painopisteet_digi_kehitys' => [], + 'haun_painopisteet_vertais_kehitys' => [], + 'haun_painopisteet_kulttuuri_kehitys' => [], + 'hankkeen_kohderyhmat_kenelle' => [], + 'hankkeen_kohderyhmat_erityisryhmat' => [], + 'hankkeen_kohderyhmat_tavoitus' => [], + 'hankkeen_kohderyhmat_konkretia' => [], + 'hankkeen_kohderyhmat_osallisuus' => [], + 'hankkeen_kohderyhmat_osaaminen' => [], + 'hankkeen_kohderyhmat_postinrot' => [], + 'hankkeen_kohderyhmat_miksi_alue' => [], + 'hankkeen_riskit_keskeisimmat' => [], + 'hankkeen_riskit_seuranta' => [], + 'hankkeen_riskit_vakiinnuttaminen' => [], + 'arviointi_toteuma' => [], + 'arviointi_muutokset_talous' => [], + 'arviointi_muutokset_toiminta' => [], + 'arviointi_muutokset_aikataulu' => [], + 'arviointi_haasteet' => [], + 'arviointi_saavutettavuus' => [], + 'arviointi_avustus_kaytto' => [], + ]; + + foreach ($customQuestions as $key => $value) { + $this->createCustomQuestionDefinitions($key, $value, $info); + } $info['budgetInfo'] = GrantsBudgetInfoDefinition::create('grants_budget_info') ->setSetting('propertyStructureCallback', [ @@ -280,4 +149,47 @@ public function getPropertyDefinitions() { return $this->propertyDefinitions; } + /** + * Helper function generate repetitive definition. + * + * @param string $key + * Webform element key. + * @param array $value + * Additional settings for given field. + * @param array $info + * Data definitions. + */ + private function createCustomQuestionDefinitions(string $key, array $value, array &$info): void { + // Create initial definition with position in JSON. + $info[$key] = DataDefinition::create($value['type'] ?? 'string') + ->setSetting('jsonPath', [ + 'compensation', + 'customQuestionsInfo', + 'customQuestionsArray', + $key, + ]); + // Add type override if set. + if (isset($value['typeOverride'])) { + $info[$key]->setSetting('typeOverride', $value['typeOverride']); + } + // Add value callback if set. + if (isset($value['valueCallback'])) { + $info[$key]->setSetting('valueCallback', $value['valueCallback']); + } + // Add value extractor if set. + if (isset($value['webformValueExtracter'])) { + $info[$key]->setSetting('webformValueExtracter', $value['webformValueExtracter']); + } + // Add default value if set or empty value. + if (isset($value['defaultValue'])) { + $info[$key]->setSetting('defaultValue', $value['defaultValue']); + } + // DO not add defaultValue if not set, this makes all fields inserted into + // data, this is not an issue, but if there's lot of fields + // data may get confusing. + // The negative is that if field is not set required in form, it will not + // be added to data. If an empty field & value is wanted, the defaultValue + // can be added to specific field in array above. + } + } diff --git a/public/modules/custom/grants_metadata/src/TypedData/Definition/SotepeyleisDefinition.php b/public/modules/custom/grants_metadata/src/TypedData/Definition/SotepeyleisDefinition.php new file mode 100644 index 0000000000..2541e39ab7 --- /dev/null +++ b/public/modules/custom/grants_metadata/src/TypedData/Definition/SotepeyleisDefinition.php @@ -0,0 +1,188 @@ +propertyDefinitions)) { + + $info = &$this->propertyDefinitions; + + foreach ($this->getBaseProperties() as $key => $property) { + $info[$key] = $property; + } + } + + $info['members_applicant_person_local'] = DataDefinition::create('integer') + ->setSetting('defaultValue', "") + ->setSetting('valueCallback', [ + '\Drupal\grants_handler\Plugin\WebformHandler\GrantsHandler', + 'convertToInt', + ]) + ->setSetting('typeOverride', [ + 'dataType' => 'integer', + 'jsonType' => 'int', + ]) + ->setSetting('jsonPath', [ + 'compensation', + 'activitiesInfoArray', + 'membersApplicantPersonLocal', + ]); + + $info['members_applicant_person_global'] = DataDefinition::create('integer') + ->setSetting('defaultValue', "") + ->setSetting('valueCallback', [ + '\Drupal\grants_handler\Plugin\WebformHandler\GrantsHandler', + 'convertToInt', + ]) + ->setSetting('jsonPath', [ + 'compensation', + 'activitiesInfoArray', + 'membersApplicantPersonGlobal', + ]); + + $info['members_applicant_community_local'] = DataDefinition::create('integer') + ->setSetting('defaultValue', "") + ->setSetting('valueCallback', [ + '\Drupal\grants_handler\Plugin\WebformHandler\GrantsHandler', + 'convertToInt', + ]) + ->setSetting('jsonPath', [ + 'compensation', + 'activitiesInfoArray', + 'membersApplicantCommunityLocal', + ]); + + $info['members_applicant_community_global'] = DataDefinition::create('integer') + ->setSetting('valueCallback', [ + '\Drupal\grants_handler\Plugin\WebformHandler\GrantsHandler', + 'convertToInt', + ]) + ->setSetting('jsonPath', [ + 'compensation', + 'activitiesInfoArray', + 'membersApplicantCommunityGlobal', + ]); + + $info['subventions'] = ListDataDefinition::create('grants_metadata_compensation_type') + ->setSetting('jsonPath', [ + 'compensation', + 'compensationInfo', + 'compensationArray', + ]); + + $info['compensation_purpose'] = DataDefinition::create('string') + ->setSetting('jsonPath', [ + 'compensation', + 'compensationInfo', + 'generalInfoArray', + 'purpose', + ]); + + $info['compensation_boolean'] = DataDefinition::create('boolean') + ->setRequired(TRUE) + ->setSetting('typeOverride', [ + 'dataType' => 'string', + 'jsonType' => 'bool', + ]) + ->setSetting('jsonPath', [ + 'compensation', + 'compensationInfo', + 'generalInfoArray', + 'compensationPreviousYear', + ]); + + $info['compensation_explanation'] = DataDefinition::create('string') + ->setSetting('defaultValue', "") + ->setSetting('jsonPath', [ + 'compensation', + 'compensationInfo', + 'generalInfoArray', + 'explanation', + ]); + + $info['who_benefits'] = DataDefinition::create('string') + ->setSetting('jsonPath', [ + 'compensation', + 'compensationInfo', + 'generalInfoArray', + 'whoBenefits', + ]); + + $info['changes_on_success'] = DataDefinition::create('string') + ->setSetting('jsonPath', [ + 'compensation', + 'compensationInfo', + 'generalInfoArray', + 'changesOnSuccess', + ]); + + $info['results_of_activities'] = DataDefinition::create('string') + ->setSetting('jsonPath', [ + 'compensation', + 'compensationInfo', + 'generalInfoArray', + 'resultsOfActivities', + ]); + + $info['fee_person'] = DataDefinition::create('float') + ->setSetting('jsonPath', [ + 'compensation', + 'activitiesInfoArray', + 'feePerson', + ]) + ->setSetting('valueCallback', [ + '\Drupal\grants_handler\Plugin\WebformHandler\GrantsHandler', + 'convertToFloat', + ]) + ->setSetting('typeOverride', [ + 'dataType' => 'string', + 'jsonType' => 'float', + ]); + + $info['fee_community'] = DataDefinition::create('float') + ->setSetting('jsonPath', [ + 'compensation', + 'activitiesInfoArray', + 'feeCommunity', + ]) + ->setSetting('valueCallback', [ + '\Drupal\grants_handler\Plugin\WebformHandler\GrantsHandler', + 'convertToFloat', + ]) + ->setSetting('typeOverride', [ + 'dataType' => 'string', + 'jsonType' => 'float', + ]); + + return $this->propertyDefinitions; + } + + /** + * Override property definition. + * + * @param string $name + * Property name. + * + * @return \Drupal\Core\TypedData\DataDefinitionInterface|void|null + * Property definition. + */ + public function getPropertyDefinition($name) { + $retval = parent::getPropertyDefinition($name); + return $retval; + } + +} diff --git a/public/modules/custom/grants_profile/js/profile_dialog.js b/public/modules/custom/grants_profile/js/profile_dialog.js index 1ea699707b..67aeeef575 100644 --- a/public/modules/custom/grants_profile/js/profile_dialog.js +++ b/public/modules/custom/grants_profile/js/profile_dialog.js @@ -29,28 +29,28 @@ let containingElement = document.querySelector('form'); if ((unset_name) && !containingElement.contains(event.target)) { event.preventDefault(); - return Drupal.dialogFunctions.createDialog( - Drupal.t('You need to have a name for your unregistered community or group. Please add a name and save or cancel them.', {}, { context: 'grants_profile' }), - '', - Drupal.t('Back to profile', {}, { context: 'grants_profile' }), - Drupal.t('Close', {}, { context: 'grants_profile' }), - ); + return Drupal.dialogFunctions.createDialog({ + dialogContent: Drupal.t('You need to have a name for your unregistered community or group. Please add a name and save or cancel them.', {}, { context: 'grants_profile' }), + actionButtonText: '', + backButtonText: Drupal.t('Back to profile', {}, { context: 'grants_profile' }), + closeButtonText: Drupal.t('Close', {}, { context: 'grants_profile' }), + }); } else if ((current_name !== initial_name) && !containingElement.contains(event.target)) { event.preventDefault(); - return Drupal.dialogFunctions.createDialog( - Drupal.t('You have unsaved changes in your profile. Please save or cancel them.', {}, { context: 'grants_profile' }), - '', - Drupal.t('Back to profile', {}, { context: 'grants_profile' }), - Drupal.t('Close', {}, { context: 'grants_profile' }), - ); + return Drupal.dialogFunctions.createDialog({ + dialogContent: Drupal.t('You have unsaved changes in your profile. Please save or cancel them.', {}, { context: 'grants_profile' }), + actionButtonText: '', + backButtonText: Drupal.t('Back to profile', {}, { context: 'grants_profile' }), + closeButtonText: Drupal.t('Close', {}, { context: 'grants_profile' }), + }); } else if (($('[data-drupal-selector="edit-isnewprofile"]').val() === 'initialSave') && !containingElement.contains(event.target)) { event.preventDefault(); - return Drupal.dialogFunctions.createDialog( - Drupal.t('You have not saved your profile. Please save your profile before leaving the form.', {}, { context: 'grants_profile' }), - '', - Drupal.t('Back to profile', {}, { context: 'grants_profile' }), - Drupal.t('Close', {}, { context: 'grants_profile' }), - ); + return Drupal.dialogFunctions.createDialog({ + dialogContent: Drupal.t('You have not saved your profile. Please save your profile before leaving the form.', {}, { context: 'grants_profile' }), + actionButtonText: '', + backButtonText: Drupal.t('Back to profile', {}, { context: 'grants_profile' }), + closeButtonText: Drupal.t('Close', {}, { context: 'grants_profile' }), + }); } is_element_click = false; diff --git a/public/modules/custom/grants_webform_print/src/Controller/GrantsWebformPrintController.php b/public/modules/custom/grants_webform_print/src/Controller/GrantsWebformPrintController.php index 408ab0c616..8db4e409f6 100644 --- a/public/modules/custom/grants_webform_print/src/Controller/GrantsWebformPrintController.php +++ b/public/modules/custom/grants_webform_print/src/Controller/GrantsWebformPrintController.php @@ -13,6 +13,8 @@ use Drupal\grants_orienteering_map\Element\OrienteeringMapComposite; use Drupal\grants_place_of_operation\Element\PlaceOfOperationComposite; use Drupal\grants_premises\Element\PremisesComposite; +use Drupal\grants_premises\Element\RentedPremiseComposite; +use Drupal\grants_premises\Element\RentIncomeComposite; use Drupal\webform\Entity\Webform; use Drupal\webform\WebformTranslationManager; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -183,6 +185,14 @@ private function fixWebformElement(array $element, string $key, array $translate $element['#title'] = $element['#title'] ?? ''; $element['#description'] = $element['#description'] ?? ''; + // Remove visibility texts from nuortoimpalkk print form. + if ($key === 'vuokra_avustushakemuksen_tiedot') { + unset($element['markup_01']); + } + if ($key === '4_palkkaustiedot') { + unset($element['markup_02']); + } + return $this->alterFieldTemplates($element, $translatedFields); } @@ -209,6 +219,7 @@ private function alterFieldTemplates(array $element, array $translatedFields) : case 'rented_premise_composite': case 'premises_composite': case 'members_composite': + case 'rent_income_composite': case 'club_section_composite': case 'orienteering_map_composite': case 'place_of_operation_composite': @@ -380,11 +391,13 @@ public function getTranslatedOptions(array $element, array $translatedFields): a */ public function getCompositeInputFields(array $element, array $translatedFields): array { $composite_inputs = match ($element['#type']) { - 'rented_premise_composite', 'premises_composite' => PremisesComposite::getCompositeElements($element), + 'rented_premise_composite' => RentedPremiseComposite::getCompositeElements($element), + 'premises_composite' => PremisesComposite::getCompositeElements($element), 'members_composite' => MembersComposite::getCompositeElements($element), 'club_section_composite' => ClubSectionComposite::getCompositeElements($element), 'orienteering_map_composite' => OrienteeringMapComposite::getCompositeElements($element), 'place_of_operation_composite' => PlaceOfOperationComposite::getCompositeElements($element), + 'rent_income_composite' => RentIncomeComposite::getCompositeElements($element), 'default' => [], }; diff --git a/public/sites/default/all.settings.php b/public/sites/default/all.settings.php index c76f7f8294..70a795d624 100644 --- a/public/sites/default/all.settings.php +++ b/public/sites/default/all.settings.php @@ -22,6 +22,10 @@ 'loa' => 'substantial', 'roles' => ['helsinkiprofiili'], ], + [ + 'loa' => 'high', + 'roles' => ['helsinkiprofiili'], + ], ]; $config['openid_connect.client.tunnistamoadmin']['settings']['client_roles'] = ['ad_user']; diff --git a/public/themes/custom/hdbt_subtheme/dist/css/styles.min.css b/public/themes/custom/hdbt_subtheme/dist/css/styles.min.css index c792cc8314..501bf8a61c 100644 --- a/public/themes/custom/hdbt_subtheme/dist/css/styles.min.css +++ b/public/themes/custom/hdbt_subtheme/dist/css/styles.min.css @@ -1 +1 @@ -body{--webform-element-width--input-small: 184px;--webform-element-width--input-medium: 332px;--webform-element-width--input-large: 591px;--webform-element-width--fieldset: 714px}.hel-icon--size-xs,.hds-icon--size-xs{height:16px;width:16px}.hel-icon--size-s,.hds-icon--size-s{height:24px;width:24px}.hel-icon--size-m,.hds-icon--size-m{height:32px;width:32px}.hel-icon--size-l,.hds-icon--size-l{height:48px;width:48px}.hel-icon--size-xl,.hds-icon--size-xl{height:64px;width:64px}.hel-icon.hel-icon--pen-line{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,");mask-image:url("data:image/svg+xml;charset=utf-8,")}.hel-icon.hds-icon--company{background:var(--color-black);-webkit-mask-image:url("data:image/svg+xml;charset=utf-8, ");mask-image:url("data:image/svg+xml;charset=utf-8, ")}.hds-button--secondary:not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button){--background-color: transparent;--background-color-hover: var(--color-black-80);--background-color-focus: transparent;--background-color-hover-focus: var(--color-black-80);--background-color-disabled: transparent;--color: var(--color-black);--color-hover: var(--color-white);--color-focus: var(--color-black);--color-hover-focus: var(--color-black);--color-disabled: var(--color-black-40)}.hds-button--secondary:not(:disabled):not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button),.hds-button--primary:not(:disabled){border-color:transparent;border-color:var(--color-black, transparent)}.hds-button.hds-button--supplementary .hds-button__label{margin:0;padding:0 var(--spacing-2-xs)}.hds-button.hds-button--supplementary::after,.hds-button.hds-button--supplementary::before{display:none !important}.hds-button--supplementary:not(:disabled){--background-color-hover: rgba(0, 0, 0, 0.1);background:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}.hds-button--supplementary:not(:disabled):hover{background-color:var(--background-color-hover)}.hds-button--alert{--background-color: rgb(255, 0, 0)}a.hds-button.webform-button--delete-draft:not(:disabled){text-decoration:none}a.hds-button.webform-button--delete-draft:not(:disabled) .hds-button__label_wrapper{display:inline}a.hds-button.webform-button--delete-draft:not(:disabled) .hds-button__label{text-decoration:underline}a.hds-button.webform-button--delete-draft:not(:disabled):hover .hds-button__label{text-decoration:none}.openid-connect-login-form input[type=submit].hds-button{width:220px}.hds-button__label_wrapper{align-items:center;display:flex}.hds-button__label_wrapper:not(.hds-button)>.hds-button__label{margin:0 var(--spacing-2-xs)}.hds-link{--link-visited-color: var(--color-black);--link-color: var(--color-black)}.hds-card{--background-color: var(--color-white);--border-color: var(--color-black-90);--color: var(--color-black-90);--border-width: 2px;--padding-horizontal: var(--spacing-l);--padding-vertical: var(--spacing-m);background-color:var(--background-color);color:var(--color);padding:var(--padding-vertical) var(--padding-horizontal)}.hds-card--border{border:var(--border-width) solid var(--border-color)}.hds-card__body{display:grid;grid-gap:var(--spacing-m);gap:var(--spacing-m);margin-bottom:var(--spacing-l)}.hds-card__body:last-child{margin-bottom:0}.hds-card__heading{font-size:var(--fontsize-heading-m);font-weight:bold;line-height:var(--lineheight-m)}.hds-card__text{font-size:var(--fontsize-body-m);line-height:var(--lineheight-l)}.hds-card--applicant-role{margin-bottom:var(--spacing-l);margin-right:0;max-width:400px;width:100%}.hds-card__heading-m{font-size:var(--fontsize-heading-m);font-weight:500;letter-spacing:-0.2px;line-height:32px;margin-top:0}.grants-profile--menuitem--login,.grants-profile--menuitem--logout{align-items:center;display:flex;flex-flow:column;font-size:var(--fontsize-body-s);height:var(--spacing-xl);margin-left:var(--spacing-2-xs);margin-right:var(--spacing-2-xs);position:relative;text-align:center;width:var(--spacing-xl)}.grants-profile--menuitem--login .hel-icon,.grants-profile--menuitem--logout .hel-icon{display:block;margin:auto}.grants-profile--menuitem--login-triggertext,.grants-profile--menuitem--logout-triggertext{clip:rect(1px, 1px, 1px, 1px);clip-path:inset(50%);display:block;max-height:1px;max-width:1px;opacity:0;overflow:hidden;position:absolute;white-space:nowrap}.block--grants-profile--menuitem{align-items:center;display:flex;grid-area:brand;z-index:2}.block--branding{flex-grow:10}.grants-frontpage-info-block{margin-bottom:var(--spacing-layout-xl)}.grants-profile--menuitem{height:var(--spacing-m);margin-left:var(--spacing-2-xs);margin-right:var(--spacing-2-xs);position:relative;width:var(--spacing-m)}@media(min-width: 768px){.grants-profile--menuitem{height:var(--spacing-2-xl);width:var(--spacing-2-xl)}}.grants-profile--menuitem a{text-decoration:none}.grants-profile--menuitem--notifications{background-color:var(--color-error);border:2px var(--color-white) solid;border-radius:50%;color:var(--color-white);font-size:var(--fontsize-body-s);font-weight:bold;height:var(--spacing-xs) 1.25;line-height:var(--spacing-layout-2-xs);position:absolute;right:-5px;text-align:center;top:-5px;width:var(--spacing-xs) 1.25;z-index:2}.grants-profile--menuitem--initials{border-radius:50%;font-weight:bold;height:var(--spacing-m);line-height:var(--spacing-m);text-align:center;vertical-align:middle;width:var(--spacing-m)}@media(min-width: 768px){.grants-profile--menuitem--initials{height:var(--spacing-2-xl);line-height:var(--spacing-2-xl);width:var(--spacing-2-xl)}}.grants-profile--menuitem--initials:hover,.grants-profile--menuitem--initials:active,.grants-profile--menuitem--initials:focus{text-decoration:underline}.grants-profile--menuitem--initials-colorscheme-2{background-color:var(--color-bus);color:var(--color-white)}.grants-profile--menuitem--initials-colorscheme-1{background-color:var(--color-engel);color:var(--color-black)}.grants-profile--menuitem--initials-colorscheme-0{background-color:var(--color-tram);color:var(--color-white)}.sidebar-important-links{margin-top:var(--spacing-2-xl)}.sidebar-important-links .sidebar-text .sidebar-text__text-content>p{padding:var(--spacing-s) var(--spacing-m)}.block--service-page-banner{background-color:var(--color-engel);margin-top:var(--spacing-layout-s);padding:var(--spacing-layout-s)}.block--service-page-banner h2{margin-top:0}.block--service-page-banner .hds-icon{margin-bottom:var(--spacing-layout-s)}.hds-button.service-page-sidebar-link{background-color:var(--hdbt-color-palette--secondary);padding:var(--spacing-xs)}.hds-button.service-page-sidebar-link:hover{color:var(--color-black)}.terms_block{padding-bottom:var(--spacing-4-xl)}#block-servicepageauthblock h2,#block-servicepageanonblock h2{--line-height: 1.3;font-size:1.25rem;font-weight:500;line-height:var(--line-height)}@media(min-width: 992px){#block-servicepageauthblock h2,#block-servicepageanonblock h2{--line-height: 1.1666666667;font-size:1.5rem;font-weight:500}}#block-servicepageauthblock .hds-button,#block-servicepageanonblock .hds-button{margin-top:var(--spacing-m)}.grants-service-page-block{background-color:var(--color-alert-light);margin-top:var(--spacing-m);padding:var(--spacing-m)}.grants-service-page-block h3{font-size:var(--fontsize-heading-s);margin-top:0}.grants-service-page-block .hel-icon{vertical-align:text-bottom}.grants-service-page-block--auth{background-color:var(--color-info-light)}.hel-icon.hel-icon--swap-user{-webkit-mask-image:url('data:image/svg+xml, ');mask-image:url('data:image/svg+xml, ')}.nav-toggle-dropdown--profile .profile__information{background-color:var(--color-silver-light)}.nav-toggle-dropdown--profile .profile__full-name{font-weight:bold}.nav-toggle-dropdown--profile .grants-profile--menuitem--mandate,.nav-toggle-dropdown--profile .grants-profile--menuitem--switch-role{--line-height: 1.5555555556;font-size:1.125rem;font-weight:400;line-height:var(--line-height);border-top:1px solid #ccc;border-bottom:1px solid #ccc;display:block;font-weight:normal;padding:16px;text-decoration:none;width:100%}@media(min-width: 992px){.nav-toggle-dropdown--profile .grants-profile--menuitem--mandate,.nav-toggle-dropdown--profile .grants-profile--menuitem--switch-role{border-bottom:none}}.nav-toggle-dropdown--profile .grants-profile--menuitem--mandate:hover,.nav-toggle-dropdown--profile .grants-profile--menuitem--switch-role:hover{text-decoration:underline}.nav-toggle-dropdown--profile .grants-profile--menuitem--mandate:focus,.nav-toggle-dropdown--profile .grants-profile--menuitem--switch-role:focus{outline:3px solid #000;outline-offset:-3px}.application-timeout-message{display:none;padding-left:16px;padding-left:var(--spacing-s, 16px);position:fixed;right:0;top:50%;z-index:100}.application-timeout-message.slide-in{animation:slide-in-right .5s forwards ease;display:block}.application-timeout-message .close-application-timeout-message{cursor:pointer;font-size:1.25rem;position:absolute;right:1.25rem}@keyframes slide-in-right{from{right:-500px}to{right:1.25rem}}.view_application_search_search_api .main-content{margin-top:0}.view_application_search_search_api .search-result-amount--wrapper{align-items:center;display:flex}.view_application_search_search_api .search-result-amount--wrapper p{margin-top:0}.view_application_search_search_api select.search-result-amount{border:1px solid var(--color-black-50);margin-left:var(--spacing-l);margin-right:var(--spacing-2-xs)}.view_application_search_search_api .search-filter-button{background-color:var(--color-black);border-radius:180px;border:0;color:var(--color-white);display:inline-block;margin:0 var(--spacing-2-xs) var(--spacing-2-xs) 0;padding:var(--spacing-2-xs) var(--spacing-xs)}.view_application_search_search_api .search-filter-button:focus{--focus-outline-color: #000000;box-shadow:none;outline:3px solid var(--focus-outline-color);outline:var(--outline-width, 3px) solid var(--focus-outline-color);outline-offset:2px;outline-offset:var(--outline-gutter, 2px)}.view_application_search_search_api .search-filter-button span{vertical-align:middle}.view_application_search_search_api .search-filter-button span.hel-icon:hover{cursor:pointer}.view-application-search-search-api .main-content{margin-top:var(--spacing-layout-s)}.view-application-search-search-api .main-content .view-header{align-items:center;display:flex;margin-bottom:var(--spacing-layout-s)}.application_search--link{display:block;height:100%;padding-bottom:var(--spacing-m);position:relative;text-decoration:none}.application_search--link::after{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--arrow-right);mask-image:var(--hel-icon--arrow-right);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));transition:transform .2s linear;bottom:var(--spacing-s);content:"";display:block;flex-shrink:0;left:var(--spacing-m);margin-left:-4px;margin-top:8px;position:absolute}@media(prefers-reduced-motion){.application_search--link::after{transition:none}}@media(min-width: 576px){.application_search--link::after{--icon-size: 3rem;margin-left:-8px;margin-top:16px}}.application_search--link:focus h3,.application_search--link:hover h3{text-decoration:none}.application_search--link:focus::after,.application_search--link:hover::after{transform:translateX(8px)}@media(prefers-reduced-motion){.application_search--link:focus::after,.application_search--link:hover::after{transform:none}}.application_search--filter-wrapper{background:var(--color-black-5)}.application_search--filter-wrapper h2{font-size:var(--fontsize-heading-m);margin-bottom:var(--spacing-layout-s);margin-top:var(--spacing-layout-s)}.application_search--filter-wrapper form{align-items:center;border-bottom:2px solid var(--color-black-20);display:flex;flex-flow:row wrap;gap:var(--spacing-s);justify-content:space-between;margin-bottom:var(--spacing-layout-s);padding-bottom:var(--spacing-layout-s)}.application_search--filter-wrapper form .form-item{margin-bottom:0;min-width:-moz-fit-content;min-width:fit-content;width:calc((100% - var(--spacing-s) - var(--spacing-s))/3)}.application_search--filter-wrapper form .form-item label{color:var(--label-color-default);font-size:var(--fontsize-body-m);font-weight:500;margin-bottom:var(--spacing-3-xs)}.application_search--filter-wrapper form .form-item .grant-applications--select-wrapper{min-width:100%;width:100%}.application_search--filter-wrapper form .hds-text-input:first-child{max-width:none;width:100%}.application_search--filter-wrapper form .hds-text-input:first-child input{width:100%}.application_search--filter-wrapper form .form-actions{align-items:center;display:flex;gap:16px;order:6;padding-top:var(--spacing-m);width:100%}@media(min-width: 768px){.application_search--filter-wrapper form .form-actions{width:17%}}.application_search--filter-wrapper form .form-actions input{min-width:250px;width:100%}.application_search--filter-wrapper form .form-item-items-per-page{display:none}.application_search--filter-wrapper form .form-item-kohderyhma{order:1}.application_search--filter-wrapper form .form-item-avustuslaji{order:2}.application_search--filter-wrapper form .form-item-hakija{order:3}.application_search--filter-wrapper form .form-item-search{max-width:100%;order:4;width:50%}.application_search--filter-wrapper form .form-item-application-open{page-break-before:left;-moz-column-break-before:left;break-before:left;display:block;margin-top:var(--spacing-m);order:5;width:30%}.application_search--filter-wrapper form [data-drupal-selector=edit-reset]{background-color:rgba(0,0,0,0);border:0;color:var(--color-black)}.application_search--filter-wrapper .hds-koros svg pattern{color:var(--color-black-5)}.application_search--filter-wrapper .hero .hero__container{padding-bottom:var(--spacing-m)}.application_search--filters{padding-bottom:var(--spacing-layout-m);padding-top:0}.application_search--rows{display:flex;flex-direction:column;flex-wrap:wrap;justify-content:flex-start;width:100%}@media(min-width: 576px){.application_search--rows{flex-direction:row;margin-left:calc(-1*var(--spacing-m));width:calc(100% + var(--spacing-m))}}.application_search--row{box-shadow:1px 2px 4px 0 rgba(0,0,0,.5);margin-bottom:var(--spacing-l);position:relative;width:100%}@media(min-width: 576px){.application_search--row{margin-left:var(--spacing-m);width:calc(50% - var(--spacing-m))}}@media(min-width: 992px){.application_search--row{width:calc(33.3333333333% - var(--spacing-m))}}.application_search--row h3{font-size:var(--fontsize-heading-m);margin-top:var(--spacing-xs)}.application_search--row .views-field-search-api-excerpt{height:auto;overflow:auto;word-break:normal}.application_search--row .views-field{padding:var(--spacing-xs) var(--spacing-m)}.application_search--row .views-field-field-target-group{padding:0}.application_search--row .views-field-field-avustuslaji{padding:var(--spacing-xs) var(--spacing-m) var(--spacing-layout-m) var(--spacing-m)}.application_search--row .views-field-field-avustuslaji .tag_avustuslaji{background:var(--color-black);border-radius:var(--spacing-m);color:var(--color-white);display:inline-block;margin-bottom:var(--spacing-2-xs);padding:var(--spacing-3-xs) var(--spacing-xs)}.application_search--row .views-field-field-application-period .field-content{align-items:center;display:flex;gap:var(--spacing-s);position:relative}.application_search--row .views-field-field-application-period .field-content span{display:block}.application_search--row .tag_target_group{background:var(--color-black-20);color:var(--color-black);font-size:var(--fontsize-body-s);font-weight:bold;padding:var(--spacing-m);text-align:center;text-transform:uppercase;width:100%}.application_search--row .tag_target_group_12{background:var(--color-brick-medium-light)}.application_search--row .tag_target_group_20{background:var(--color-copper)}.application_search--row .tag_target_group_21{background:var(--color-metro-medium-light)}.application_search--row .tag_target_group_22{background:var(--color-suomenlinna-medium-light)}.application_search--row .tag_target_group_23{background:var(--color-engel)}.application_search--row .tag_target_group_24{background:var(--color-bus-medium-light)}.application_search--row .tag_target_group_25{background:var(--color-coat-of-arms-medium-light)}.application_search--row .tag_target_group_26{background:var(--color-gold-medium-light)}.application_search--row .tag_target_group_27{background:var(--color-tram-medium-light)}.application_search--row .tag_target_group_28{background:var(--color-summer-light)}.application_search--row .tag_target_group_29{background:var(--color-fog)}.application_search--row .tag_target_group_30{background:var(--color-copper-light)}.application_search--row .tag_target_group_31{background:var(--color-gold)}.view-ukk .view-filters{display:none}.view-ukk .ukk_categories{display:block;margin:var(--spacing-xl) 0;padding:0}.view-ukk .ukk_categories li{display:inline-block;list-style:none;margin:var(--spacing-m) var(--spacing-s) 0 0;padding:0}.view-ukk .hero .hero__text-content{max-width:100%}.view-ukk #edit-field-category-target-id{display:flex}.view-ukk #edit-field-category-target-id .hds-radio-button:first-of-type{margin-top:var(--spacing-2-xs)}.view-ukk #edit-field-category-target-id .hds-radio-button .hds-radio-button__input:checked+.hds-radio-button__label{background:var(--color-black);border-radius:var(--spacing-m);color:var(--color-white);padding:var(--spacing-2-xs) var(--spacing-s)}.view-ukk #edit-field-category-target-id .hds-radio-button__label{padding:var(--spacing-2-xs) var(--spacing-s)}.view-ukk #edit-field-category-target-id .hds-radio-button__label::before,.view-ukk #edit-field-category-target-id .hds-radio-button__label::after{display:none}.view-ukk .views-exposed-form fieldset{margin-bottom:0}.view-ukk .views-exposed-form .form-submit{margin-bottom:var(--spacing-l)}.view-ukk .category{background:var(--color-black);border-radius:var(--spacing-m);color:var(--color-white);display:inline-block;padding:var(--spacing-2-xs) var(--spacing-s);text-decoration:none}.view-ukk .category-unselected{background:var(--color-black-20);color:var(--color-black)}.page--select-applicant-role{background-color:var(--color-black-5)}.page--select-applicant-role body{background-color:var(--color-black-5)}.page--select-applicant-role .layout-main-wrapper{background-color:var(--color-black-5)}.page--select-applicant-role .main-content{margin-top:var(--spacing-l)}.page--select-applicant-role h1{margin-top:var(--spacing-l)}.page--select-applicant-role p{margin-bottom:var(--spacing-m)}.node--type-service .errand-service__channels .service-channel__links a[href^="https://avustukset.hel.fi"]{display:none}.node--type-service .service-channel__info p:first-of-type{margin-top:0}.node--type-service .service-channel--mail{display:none}#block-servicepageauthblock-2,#block-servicepageanonblock-2,#block-grantspreviewlink-2{display:none}@media(max-width: 767.9px){#block-servicepageauthblock-2,#block-servicepageanonblock-2,#block-grantspreviewlink-2{display:block;margin:var(--spacing-s)}}@media(max-width: 991.9px){#block-servicepageauthblock-2,#block-servicepageanonblock-2,#block-grantspreviewlink-2{display:block;margin:var(--spacing-l)}}#block-servicepageauthblock-2>.grants-service-page-block>*,#block-servicepageanonblock-2>.grants-service-page-block>*,#block-grantspreviewlink-2>.grants-service-page-block>*{margin:var(--spacing-2-xs) 0 var(--spacing-2-xs) var(--spacing-2-xs)}@media(max-width: 991.9px){#block-servicepageauthblock-2 .node--type-service a.hds-button[href*=uusi-hakemus],#block-servicepageanonblock-2 .node--type-service a.hds-button[href*=uusi-hakemus],#block-grantspreviewlink-2 .node--type-service a.hds-button[href*=uusi-hakemus]{display:none}}.user-login__text-container{background:var(--color-white);max-width:500px;padding:var(--spacing-m)}.user-login__text-container p:first-of-type{margin-top:0}.tabs{--tablist-border-color: var(--color-black-20);--tablist-border-size: 1px;--tab-color: var(--color-black);--tab-font-size: var(--fontsize-body-m);--tab-height: 48px;--tab-min-width: 148px;--tab-spacing: var(--spacing-s);--tab-active-border-size: 5px;--tab-active-border-color: var(--color-black);--tab-focus-outline-size: 2px;--tab-focus-outline-color: var(--color-coat-of-arms);display:flex;flex-flow:row wrap}.tabs--tablist{box-sizing:border-box;flex-grow:1;margin-bottom:-1px;overflow-x:hidden;position:relative;width:100%}.tabs--content-wrapper{width:100%}.tabs--content-wrapper .container{padding-top:1px}.tabs [role=tablist]{box-sizing:border-box;list-style:none;margin:0;padding:var(--tab-focus-outline-size) 0;white-space:nowrap}.tabs [role=tab]{background:rgba(0,0,0,0);border:0;cursor:pointer;display:inline-block;margin:0;outline:none;padding:0}.tabs [role=tab] span{align-items:center;box-sizing:border-box;color:var(--tab-color);display:flex;font-size:var(--tab-font-size);height:var(--tab-height);justify-content:center;margin:0;min-width:var(--tab-min-width);padding:0 var(--tab-spacing);pointer-events:none;position:relative}.tabs [role=tab] span::before{background:var(--tablist-border-color);bottom:0;content:"";height:var(--tablist-border-size);position:absolute;width:100%;z-index:100}.tabs [role=tab] span:hover::before,.tabs [role=tab] span:focus::before,.tabs [role=tab][aria-selected=true] span::before{background-color:var(--tab-active-border-color);bottom:0;content:"";height:var(--tab-active-border-size);position:absolute;width:100%;z-index:100}.tabs [role=tabpanel].is-hidden{display:none}.node--form-page .list-of-links{margin-left:0;margin-top:0;width:100%}@media(min-width: 768px){.node--form-page .list-of-links{margin-top:0}}.node--form-page .list-of-links>.container{padding-top:0}.node--form-page .list-of-links .list-of-links__title{border-top:2px solid var(--color-black-20);margin:0 0 var(--spacing-layout-xl)}@media(min-width: 576px){.node--form-page .list-of-links .list-of-links__container{width:calc(100% - var(--spacing-layout-xl))}}@media(min-width: 768px){.node--form-page .list-of-links .list-of-links__container{width:100%}}.node--form-page .list-of-links .list-of-links__content{height:auto;margin-top:0}@media(min-width: 768px){.node--form-page .list-of-links .list-of-links__content{display:grid;grid-template-columns:auto auto auto;margin:0 var(--spacing-m) 0 0}}.node--form-page .list-of-links .list-of-links__item{align-self:stretch;border-left:4px solid var(--color-copper);margin-right:-4px;padding-left:var(--spacing-m);padding-right:var(--spacing-m)}.list-of-links--without-image .list-of-links__item .list-of-links__item__desc{color:var(--color-black-90);font-size:var(--fontsize-body-m)}.list-of-links--without-image .list-of-links__item .list-of-links__item__title{font-size:var(--fontsize-heading-m)}.js-form-type-webform-custom-composite{--border-width: 2px;--outline-width: 3px;--input-height: 56px;--textarea-height: 149px;--icon-size: var(--spacing-m);--helper-color-default: var(--color-black-60);--helper-color-invalid: var(--color-error);--icon-color-invalid: var(--color-error);--input-background-default: var(--color-white);--input-background-disabled: var(--color-black-10);--input-border-color-default: var(--color-black-50);--input-border-color-hover: var(--color-black-90);--input-border-color-focus: var(--color-black-90);--input-border-color-invalid: var(--color-error);--input-border-color-disabled: var(--color-black-10);--input-color-default: var(--color-black-90);--input-color-disabled: var(--color-black-40);--label-color-default: var(--color-black-90);--label-color-invalid: var(--color-black-90);--placeholder-color: var(--color-black-60);--focus-outline-color: var(--color-coat-of-arms)}.js-form-type-webform-custom-composite a.tabledrag-handle .handle{height:24px;width:24px}.js-form-type-webform-custom-composite input.form-number{background-color:var(--input-background-default);border:var(--border-width) solid var(--input-border-color-default);box-sizing:border-box;color:var(--input-color-default);font-size:1.125em;height:var(--input-height);line-height:normal;padding:0 var(--spacing-s);width:100%}.js-form-type-webform-custom-composite table{border-collapse:collapse;border-spacing:0;margin-bottom:var(--spacing-m)}.js-form-type-webform-custom-composite table td{border-bottom:2px var(--color-black-20) solid;border-top:2px var(--color-black-20) solid;padding-left:var(--spacing-m);padding-top:var(--spacing-m)}@media(max-width: 768px){.js-form-type-webform-custom-composite table td{border:2px var(--color-black-20) solid}}.js-form-type-webform-custom-composite table td.webform-multiple-table--operations{border-bottom:2px var(--color-black-20) solid;border-top:2px var(--color-black-20) solid;padding-left:var(--spacing-m);padding-top:var(--spacing-m)}@media(max-width: 768px){.js-form-type-webform-custom-composite table td.webform-multiple-table--operations{background:var(--color-white);border:2px var(--color-black-20) solid;padding:10px 5px 5px}}.js-form-type-webform-custom-composite table td:first-child{border-left:2px var(--color-black-20) solid}.js-form-type-webform-custom-composite table td:last-child{border-right:2px var(--color-black-20) solid;padding:var(--spacing-s)}@media(min-width: 768px){.js-form-type-webform-custom-composite table td:last-child{min-width:400px;padding:var(--spacing-s) var(--spacing-m)}}div.ui-widget.ui-datepicker{padding:var(--spacing-2-xs)}div.ui-widget.ui-datepicker .ui-datepicker-header span.ui-icon{margin-left:-8px;margin-top:-8px;-webkit-mask-image:none;mask-image:none;transform:none}div.ui-widget.ui-datepicker .ui-datepicker-calendar{border:0;display:table;margin:0;max-width:100%}div.ui-widget.ui-datepicker .ui-datepicker-calendar th,div.ui-widget.ui-datepicker .ui-datepicker-calendar td{min-width:auto}details.accordion{--background-color: var(--color-white);--border-color: var(--color-black-60);--padding-horizontal: var(--spacing-m);--padding-vertical: var(--spacing-m);--header-font-color: var(--color-black-90);--header-font-size: var(--fontsize-heading-m);--header-line-height: var(--lineheight-m);--button-size: 28px;--header-focus-outline-color: var(--color-coat-of-arms);--content-font-color: var(--color-black-90);--content-font-size: var(--fontsize-body-m);--content-line-height: var(--lineheight-l);border-bottom:1px solid var(--border-color)}details.accordion .accordion_content{padding-bottom:var(--padding-vertical)}details.accordion[open] .accordion_heading_container span.hel-icon{transform:rotate(180deg)}.accordion_header{align-items:center;color:var(--header-font-color);display:flex;font-size:var(--header-font-size);font-weight:700;justify-content:space-between;line-height:var(--header-line-height);list-style:none;padding-bottom:var(--padding-vertical);padding-top:var(--padding-vertical);position:relative}.accordion_heading_container{align-items:center;box-sizing:border-box;cursor:pointer;display:grid;grid-template-columns:auto calc(var(--button-size));width:100%}.accordion_heading_container span.hel-icon{height:var(--button-size) !important;width:var(--button-size) !important}.accordion_heading_container span.hel-icon{border:2px solid rgba(0,0,0,0);box-sizing:border-box;margin:auto}.webform-element-description{--helper-color-default: var(--color-black-60);color:var(--helper-color-default);display:block;font-size:var(--fontsize-body-m);line-height:var(--lineheight-l);margin-top:var(--spacing-s)}.webform-element-help{background:var(--color-white);border:2px solid rgba(0,0,0,0);color:var(--hdbt-color-black);height:var(--spacing-layout-xs);margin-right:4px;padding:0;position:absolute;right:0;top:-3px;width:var(--spacing-layout-xs);z-index:10}div[data-tippy-root]{width:350px}.tippy-box{background-color:var(--color-black-5);border-left:var(--spacing-xs) var(--color-coat-of-arms) solid;border-radius:0;color:var(--hdbt-color-black);padding:var(--spacing-s)}.tippy-box .webform-element-help--content{white-space:normal}.tippy-box .webform-element-help--content a:link,.tippy-box .webform-element-help--content a:visited,.tippy-box .webform-element-help--content a:active,.tippy-box .webform-element-help--content a:hover{color:var(--hdbt-color-black)}.tippy-arrow{color:var(--color-black-5)}.webform-element-help--wrapper-short{max-width:-moz-fit-content;max-width:fit-content}.webform-element-help-container--title{--border-width: 2px;--outline-width: 3px;--input-height: 56px;--textarea-height: 149px;--icon-size: var(--spacing-m)}fieldset.grants-fieldset{padding:var(--spacing-s)}@media(min-width: 768px){fieldset.grants-fieldset{min-width:400px;padding:var(--spacing-s) var(--spacing-m)}}fieldset.grants-fieldset .fieldset-wrapper{align-items:flex-end;display:flex;flex-wrap:wrap;gap:0 var(--spacing-layout-2-xs)}fieldset.grants-fieldset .fieldset-wrapper .form-item--error-message{grid-column:1}fieldset.grants-fieldset-short{max-width:var(--webform-element-width--input-large)}fieldset.grants-fieldset-medium{max-width:var(--webform-element-width--fieldset)}fieldset.grants-fieldset-medium .fieldset-wrapper{justify-content:center}fieldset.premises-composite--wrapper.fieldgroup,fieldset.rented-premise-composite--wrapper.fieldgroup,.community_officials_wrapper fieldset.fieldgroup,fieldset.grants-budget-other-cost--wrapper.fieldgroup,fieldset.grants-budget-other-income--wrapper.fieldgroup,fieldset.place-of-operation-composite--wrapper.fieldgroup,fieldset.rent-income-composite--wrapper.fieldgroup,fieldset.rent-cost-composite--wrapper.fieldgroup,fieldset.club-section-composite--wrapper.fieldgroup,fieldset.members-composite--wrapper.fieldgroup,fieldset.orienteering-map-composite--wrapper,.form-item-muu-liite fieldset.grants-attachments--wrapper.fieldgroup{border-width:2px;margin-top:var(--spacing-layout-2-xs);max-width:100%;padding:var(--spacing-s);width:100%}@media(min-width: 768px){fieldset.premises-composite--wrapper.fieldgroup,fieldset.rented-premise-composite--wrapper.fieldgroup,.community_officials_wrapper fieldset.fieldgroup,fieldset.grants-budget-other-cost--wrapper.fieldgroup,fieldset.grants-budget-other-income--wrapper.fieldgroup,fieldset.place-of-operation-composite--wrapper.fieldgroup,fieldset.rent-income-composite--wrapper.fieldgroup,fieldset.rent-cost-composite--wrapper.fieldgroup,fieldset.club-section-composite--wrapper.fieldgroup,fieldset.members-composite--wrapper.fieldgroup,fieldset.orienteering-map-composite--wrapper,.form-item-muu-liite fieldset.grants-attachments--wrapper.fieldgroup{min-width:400px;padding:var(--spacing-s) var(--spacing-m)}}fieldset.premises-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.rented-premise-composite--wrapper.fieldgroup legend>span.visually-hidden,.community_officials_wrapper fieldset.fieldgroup legend>span.visually-hidden,fieldset.grants-budget-other-cost--wrapper.fieldgroup legend>span.visually-hidden,fieldset.grants-budget-other-income--wrapper.fieldgroup legend>span.visually-hidden,fieldset.place-of-operation-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.rent-income-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.rent-cost-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.club-section-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.members-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.orienteering-map-composite--wrapper legend>span.visually-hidden,.form-item-muu-liite fieldset.grants-attachments--wrapper.fieldgroup legend>span.visually-hidden{background:#fff;clip-path:initial;clip:auto;clip:initial;height:auto;margin-left:calc(var(--spacing-2-xs)*-1);left:auto;overflow:visible;padding:0 var(--spacing-2-xs);top:-12px;width:-moz-max-content;width:max-content}fieldset.premises-composite--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.rented-premise-composite--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],.community_officials_wrapper fieldset.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.grants-budget-other-cost--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.grants-budget-other-income--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.place-of-operation-composite--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.rent-income-composite--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.rent-cost-composite--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.club-section-composite--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.members-composite--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.orienteering-map-composite--wrapper legend>span.visually-hidden[\:has\(button.webform-element-help\)],.form-item-muu-liite fieldset.grants-attachments--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)]{padding-right:var(--spacing-xl)}fieldset.premises-composite--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.rented-premise-composite--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),.community_officials_wrapper fieldset.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.grants-budget-other-cost--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.grants-budget-other-income--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.place-of-operation-composite--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.rent-income-composite--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.rent-cost-composite--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.club-section-composite--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.members-composite--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.orienteering-map-composite--wrapper legend>span.visually-hidden:has(button.webform-element-help),.form-item-muu-liite fieldset.grants-attachments--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help){padding-right:var(--spacing-xl)}@media(min-width: 768px){fieldset.premises-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.rented-premise-composite--wrapper.fieldgroup legend>span.visually-hidden,.community_officials_wrapper fieldset.fieldgroup legend>span.visually-hidden,fieldset.grants-budget-other-cost--wrapper.fieldgroup legend>span.visually-hidden,fieldset.grants-budget-other-income--wrapper.fieldgroup legend>span.visually-hidden,fieldset.place-of-operation-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.rent-income-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.rent-cost-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.club-section-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.members-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.orienteering-map-composite--wrapper legend>span.visually-hidden,.form-item-muu-liite fieldset.grants-attachments--wrapper.fieldgroup legend>span.visually-hidden{left:auto}}.form-item-muu-liite fieldset.grants-attachments--wrapper{margin-bottom:0}fieldset.webform-composite-hidden-title .fieldset-wrapper>.form-item:last-child{margin-bottom:var(--spacing-layout-xs)}.js-form-type-webform-table table{width:100%}.js-form-type-webform-table th{text-align:left}.js-form-type-webform-table td{vertical-align:middle}.js-form-type-webform-table td>div{height:auto;margin-bottom:0}.js-form-type-webform-table td>div label{margin:-1px}.js-form-type-webform-table .hds-text-input label{border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-item{margin-bottom:var(--spacing-layout-xs);position:relative}.form-item input[type=date],.form-item input[type=time]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--input-background-default);border:var(--border-width) solid var(--input-border-color-default);box-sizing:border-box;color:var(--input-color-default);font-size:1.125em;height:var(--input-height);line-height:normal;padding:0 var(--spacing-s);width:100%;will-change:transform,box-shadow}.webform-section{padding-bottom:var(--spacing-layout-2-xs)}.webform-section table:first-of-type{margin-top:0}.form-type-webform-multiple .webform-multiple-table table{max-width:100%;width:100%}@media(min-width: 768px){.form-type-webform-multiple .webform-multiple-table table{width:auto}}.hds-text-input{max-width:-moz-fit-content;max-width:fit-content;width:100%}.webform-section-grid-wrapper{display:grid;grid-template-columns:1fr}@media(min-width: 768px){.webform-section-grid-wrapper{grid-row-gap:var(--spacing-xl);grid-template-columns:1fr 2fr}}.webform-section-grid-wrapper>dt.webform-section-title{color:var(--hdbt-color-black);display:block;flex-shrink:0;font-size:var(--fontsize-heading-s);font-weight:500;-webkit-hyphens:none;hyphens:none;line-height:1;margin-bottom:var(--spacing-3-xs);margin-top:0;padding-right:var(--spacing-2-xl);width:100%}.webform-section-grid-wrapper .webform-section-wrapper{margin-bottom:var(--spacing-layout-xs);padding-left:var(--spacing-2-xl)}@media(min-width: 768px){.webform-section-grid-wrapper .webform-section-wrapper{margin-bottom:0;padding-left:0}}fieldset input[type=button]{margin-top:var(--spacing-m)}.webform-section-wrapper>.description{margin-bottom:var(--spacing-layout-xs)}.grants__page-header{margin-bottom:var(--spacing-layout-l);font-size:2rem}@media(min-width: 768px){.grants__page-header{font-size:3rem}}.webform-section-flex-wrapper{display:flex;flex-flow:row wrap;width:100%;justify-content:left}@media(min-width: 768px){.webform-section-flex-wrapper{flex-flow:row nowrap}.webform-section-flex-wrapper h3+*>*:first-child>label:first-of-type,.webform-section-flex-wrapper h3+*>*:first-child>*:first-child>label:first-of-type{margin-top:var(--spacing-2-xs);padding-top:0}.webform-section-flex-wrapper h3+*>*:first-child>p{line-height:normal;line-height:initial;margin-top:var(--spacing-2-xs)}.webform-section-flex-wrapper h3+*>*:first-child>h4{line-height:normal;line-height:initial;margin-top:var(--spacing-m)}}.webform-section-flex-wrapper .webform-element-help-container--title{position:relative}.webform-section-flex-wrapper>h2.webform-section-title,.webform-section-flex-wrapper>h3.webform-section-title,.webform-section-flex-wrapper>h4.webform-section-title,.webform-section-flex-wrapper>dt.webform-section-title{color:var(--hdbt-color-black);display:block;flex-shrink:0;font-size:24px;font-weight:500;-webkit-hyphens:manual;hyphens:manual;margin-bottom:var(--spacing-3-xs);margin-top:0;padding-right:var(--spacing-2-xl);width:100%}@media(min-width: 768px){.webform-section-flex-wrapper>h2.webform-section-title,.webform-section-flex-wrapper>h3.webform-section-title,.webform-section-flex-wrapper>h4.webform-section-title,.webform-section-flex-wrapper>dt.webform-section-title{font-size:32px;max-width:350px;width:30%}}.webform-section-flex-wrapper h4{font-size:var(--fontsize-heading-m);line-height:38px}.webform-section-flex-wrapper>.webform-section-wrapper{--line-height: 1.5;font-size:var(--fontsize-body-m);width:100%}@media(min-width: 768px){.webform-section-flex-wrapper>.webform-section-wrapper{padding-left:var(--spacing-2-xl)}}.webform-section-flex-wrapper .form-required::after{content:"*";display:inline}.webform-section-flex-wrapper legend,.webform-section-flex-wrapper label{display:block;font-size:var(--fontsize-body-m);font-weight:500;margin-bottom:var(--spacing-2-xs);max-width:-moz-fit-content;max-width:fit-content;position:relative}.webform-section-flex-wrapper legend{padding:0 var(--spacing-2-xs);margin-left:calc(var(--spacing-2-xs)*-1);left:auto}.webform-section-flex-wrapper legend[\:has\(button.webform-element-help\)],.webform-section-flex-wrapper label[\:has\(button.webform-element-help\)]{padding-right:var(--spacing-xl)}.webform-section-flex-wrapper legend:has(button.webform-element-help),.webform-section-flex-wrapper label:has(button.webform-element-help){padding-right:var(--spacing-xl)}.webform-section-flex-wrapper fieldset legend>span[\:has\(button.webform-element-help\)]{padding-right:var(--spacing-xl)}.webform-section-flex-wrapper fieldset legend>span:has(button.webform-element-help){padding-right:var(--spacing-xl)}.webform-section-flex-wrapper fieldset legend>span.fieldset-legend[\:has\(button.webform-element-help\)],.webform-section-flex-wrapper fieldset.fieldgroup legend>span[\:has\(button.webform-element-help\)]:not(.visually-hidden.fieldset-legend){padding-right:var(--spacing-l)}.webform-section-flex-wrapper fieldset legend>span.fieldset-legend:has(button.webform-element-help),.webform-section-flex-wrapper fieldset.fieldgroup legend>span:has(button.webform-element-help):not(.visually-hidden.fieldset-legend){padding-right:var(--spacing-l)}.webform-section-flex-wrapper fieldset legend>span.fieldset-legend[\:has\(button.webform-element-help\)],.webform-section-flex-wrapper fieldset.fieldgroup legend span.fieldset-legend:not(.visually-hidden)[\:has\(button.webform-element-help\)]{padding-right:0}.webform-section-flex-wrapper fieldset legend>span.fieldset-legend:has(button.webform-element-help),.webform-section-flex-wrapper fieldset.fieldgroup legend span.fieldset-legend:not(.visually-hidden):has(button.webform-element-help){padding-right:0}.webform-section-flex-wrapper label.hds-radio-button__label{font-weight:normal}.webform-section-flex-wrapper .checkboxes--wrapper label{font-weight:normal}.webform-section-flex-wrapper .js-form-type-textarea .hds-text-input__input-wrapper{display:block}.webform-section-flex-wrapper .has-error,.webform-section-flex-wrapper .grant-applications--select-wrapper[\:has\(.has-error\)]{border-color:var(--color-error)}.webform-section-flex-wrapper .has-error,.webform-section-flex-wrapper .grant-applications--select-wrapper:has(.has-error){border-color:var(--color-error)}form .hds-text-input__input-wrapper,.hds-text-input__input-wrapper{flex-flow:row wrap}form .hds-text-input__input-wrapper .text-count-wrapper,.hds-text-input__input-wrapper .text-count-wrapper{flex-basis:100%}form .hds-text-input__input-wrapper input.webform--small,form .hds-text-input__input-wrapper textarea.webform--small,.hds-text-input__input-wrapper input.webform--small,.hds-text-input__input-wrapper textarea.webform--small{max-width:var(--webform-element-width--input-small);min-width:var(--webform-element-width--input-small);width:100%}form .hds-text-input__input-wrapper input.webform--medium,form .hds-text-input__input-wrapper textarea.webform--medium,.hds-text-input__input-wrapper input.webform--medium,.hds-text-input__input-wrapper textarea.webform--medium{max-width:var(--webform-element-width--input-medium);min-width:var(--webform-element-width--input-small);width:100%}form .hds-text-input__input-wrapper input.webform--large,form .hds-text-input__input-wrapper textarea.webform--large,.hds-text-input__input-wrapper input.webform--large,.hds-text-input__input-wrapper textarea.webform--large{max-width:var(--webform-element-width--input-large);min-width:var(--webform-element-width--input-small);width:100%}.webform--small div.grant-applications--select-wrapper{max-width:var(--webform-element-width--input-small);min-width:var(--webform-element-width--input-small);width:100%}.webform--medium div.grant-applications--select-wrapper{max-width:var(--webform-element-width--input-medium);min-width:var(--webform-element-width--input-small);width:100%}.webform--large div.grant-applications--select-wrapper{max-width:var(--webform-element-width--input-medium);min-width:var(--webform-element-width--input-small);width:100%}form .hds-checkbox{display:block}form .hds-checkbox label.hds-checkbox__label::after{content:""}fieldset.webform-composite-hidden-title{margin-bottom:var(--spacing-layout-2-xs);margin-top:0}.form-item-bank-account-account-number-select,.form-item-community-address-community-address-select{margin-bottom:0}.grants-profile-grants-profile table thead th h4{margin:0}.hakemus-form-page .main-content{margin-top:0}.hakemus-form-page h1{-webkit-hyphens:auto;hyphens:auto;word-break:break-word}.hakemus-form-errors ul li{list-style-type:none}.community_officials_wrapper .webform-readonly{margin:0}.community_officials_wrapper .hds-text-input__input-wrapper{margin:0}.community_officials_wrapper input[readonly=readonly]{height:1.25rem;margin:0;max-width:330px}.form-item--error-message{color:var(--color-error);margin-bottom:var(--spacing-layout-s);margin-top:var(--spacing-layout-2-xs)}fieldset .form-item--error-message,.community_officials_wrapper .form-item--error-message{margin-bottom:0}.form-item--error-message::before{--icon-size: 1.6rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--alert-circle-fill);mask-image:var(--hel-icon--alert-circle-fill);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));background-color:var(--color-error);content:" ";display:inline-block}input[type=radio]+label.form-required::after{content:""}.hds-radio-button:last-of-type,.hds-checkbox:last-of-type{margin-bottom:0}.hds-radio-button:last-of-type>label,.hds-checkbox:last-of-type>label{margin-bottom:0}@media(min-width: 992px){.place-of-operation-composite--wrapper.fieldgroup .hds-text-input,.club-section-composite--wrapper.fieldgroup .hds-text-input{max-width:100%}}.place-of-operation-composite--wrapper.fieldgroup .hds-radio-button .hds-radio-button__label,.club-section-composite--wrapper.fieldgroup .hds-radio-button .hds-radio-button__label{line-height:var(--lineheight-m) !important}@media(min-width: 992px){.place-of-operation-group__location,.place-of-operation-group__students,.place-of-operation-group__groups,.place-of-operation-group__personnel,.place-of-operation-group__rent,.place-of-operation-group__time{display:flex;justify-content:space-between}}@media(min-width: 992px){.place-of-operation-group__location--address,.place-of-operation-group__students--address,.place-of-operation-group__groups--address,.place-of-operation-group__personnel--address,.place-of-operation-group__rent--address,.place-of-operation-group__time--address{margin-top:0 !important}.place-of-operation-group__location--address,.place-of-operation-group__students--address,.place-of-operation-group__groups--address,.place-of-operation-group__personnel--address,.place-of-operation-group__rent--address,.place-of-operation-group__time--address{width:65%}}@media(min-width: 992px){.place-of-operation-group__location--post-code,.place-of-operation-group__students--post-code,.place-of-operation-group__groups--post-code,.place-of-operation-group__personnel--post-code,.place-of-operation-group__rent--post-code,.place-of-operation-group__time--post-code{margin-top:0 !important}.place-of-operation-group__location--post-code,.place-of-operation-group__students--post-code,.place-of-operation-group__groups--post-code,.place-of-operation-group__personnel--post-code,.place-of-operation-group__rent--post-code,.place-of-operation-group__time--post-code{width:30%}}@media(min-width: 992px){.place-of-operation-group__location--student-count,.place-of-operation-group__location--special-student-count,.place-of-operation-group__location--group-count,.place-of-operation-group__location--special-group-count,.place-of-operation-group__location--personnel-count,.place-of-operation-group__location--rent-amount,.place-of-operation-group__location--time-start,.place-of-operation-group__location--time-end,.place-of-operation-group__students--student-count,.place-of-operation-group__students--special-student-count,.place-of-operation-group__students--group-count,.place-of-operation-group__students--special-group-count,.place-of-operation-group__students--personnel-count,.place-of-operation-group__students--rent-amount,.place-of-operation-group__students--time-start,.place-of-operation-group__students--time-end,.place-of-operation-group__groups--student-count,.place-of-operation-group__groups--special-student-count,.place-of-operation-group__groups--group-count,.place-of-operation-group__groups--special-group-count,.place-of-operation-group__groups--personnel-count,.place-of-operation-group__groups--rent-amount,.place-of-operation-group__groups--time-start,.place-of-operation-group__groups--time-end,.place-of-operation-group__personnel--student-count,.place-of-operation-group__personnel--special-student-count,.place-of-operation-group__personnel--group-count,.place-of-operation-group__personnel--special-group-count,.place-of-operation-group__personnel--personnel-count,.place-of-operation-group__personnel--rent-amount,.place-of-operation-group__personnel--time-start,.place-of-operation-group__personnel--time-end,.place-of-operation-group__rent--student-count,.place-of-operation-group__rent--special-student-count,.place-of-operation-group__rent--group-count,.place-of-operation-group__rent--special-group-count,.place-of-operation-group__rent--personnel-count,.place-of-operation-group__rent--rent-amount,.place-of-operation-group__rent--time-start,.place-of-operation-group__rent--time-end,.place-of-operation-group__time--student-count,.place-of-operation-group__time--special-student-count,.place-of-operation-group__time--group-count,.place-of-operation-group__time--special-group-count,.place-of-operation-group__time--personnel-count,.place-of-operation-group__time--rent-amount,.place-of-operation-group__time--time-start,.place-of-operation-group__time--time-end{margin-top:0 !important}.place-of-operation-group__location--student-count,.place-of-operation-group__location--special-student-count,.place-of-operation-group__location--group-count,.place-of-operation-group__location--special-group-count,.place-of-operation-group__location--personnel-count,.place-of-operation-group__location--rent-amount,.place-of-operation-group__location--time-start,.place-of-operation-group__location--time-end,.place-of-operation-group__students--student-count,.place-of-operation-group__students--special-student-count,.place-of-operation-group__students--group-count,.place-of-operation-group__students--special-group-count,.place-of-operation-group__students--personnel-count,.place-of-operation-group__students--rent-amount,.place-of-operation-group__students--time-start,.place-of-operation-group__students--time-end,.place-of-operation-group__groups--student-count,.place-of-operation-group__groups--special-student-count,.place-of-operation-group__groups--group-count,.place-of-operation-group__groups--special-group-count,.place-of-operation-group__groups--personnel-count,.place-of-operation-group__groups--rent-amount,.place-of-operation-group__groups--time-start,.place-of-operation-group__groups--time-end,.place-of-operation-group__personnel--student-count,.place-of-operation-group__personnel--special-student-count,.place-of-operation-group__personnel--group-count,.place-of-operation-group__personnel--special-group-count,.place-of-operation-group__personnel--personnel-count,.place-of-operation-group__personnel--rent-amount,.place-of-operation-group__personnel--time-start,.place-of-operation-group__personnel--time-end,.place-of-operation-group__rent--student-count,.place-of-operation-group__rent--special-student-count,.place-of-operation-group__rent--group-count,.place-of-operation-group__rent--special-group-count,.place-of-operation-group__rent--personnel-count,.place-of-operation-group__rent--rent-amount,.place-of-operation-group__rent--time-start,.place-of-operation-group__rent--time-end,.place-of-operation-group__time--student-count,.place-of-operation-group__time--special-student-count,.place-of-operation-group__time--group-count,.place-of-operation-group__time--special-group-count,.place-of-operation-group__time--personnel-count,.place-of-operation-group__time--rent-amount,.place-of-operation-group__time--time-start,.place-of-operation-group__time--time-end{width:47.5%}}@media(min-width: 768px){.club-section__participants{display:flex;gap:var(--spacing-l);justify-content:space-between}}.club-section__participants input.form-text.hds-text-input__input{max-width:100%;width:100%}.club-section__totalhours input.form-text.hds-text-input__input{max-width:100%;width:100%}.hel-icon--size-xs{--icon-size: var(--spacing-layout-2-xs)}.hel-icon--size-s{--icon-size: var(--spacing-layout-xs)}.hel-icon--size-m{--icon-size: var(--spacing-layout-s)}.hel-icon--size-l{--icon-size: var(--spacing-layout-m)}.hel-icon--size-xl{--icon-size: var(--spacing-layout-l)}.hds-text-input__input-wrapper[focus-within][\:has\(input\[readonly\]\)]{margin-right:var(--spacing-2-xs);outline:2px var(--color-black) solid;outline-offset:2px}.hds-text-input__input-wrapper[focus-within]:has(input[readonly]){margin-right:var(--spacing-2-xs);outline:2px var(--color-black) solid;outline-offset:2px}.hds-text-input__input-wrapper[focus-within][\:has\(input\[readonly\]\)]{margin-right:var(--spacing-2-xs);outline:2px var(--color-black) solid;outline-offset:2px}.hds-text-input__input-wrapper:focus-within[\:has\(input\[readonly\]\)]{margin-right:var(--spacing-2-xs);outline:2px var(--color-black) solid;outline-offset:2px}.hds-text-input__input-wrapper:focus-within:has(input[readonly]){margin-right:var(--spacing-2-xs);outline:2px var(--color-black) solid;outline-offset:2px}.hds-text-input__input-wrapper[focus-within][\:has\(input\[readonly\]\)] input[readonly]{width:calc(100% - var(--spacing-2-xs))}.hds-text-input__input-wrapper[focus-within]:has(input[readonly]) input[readonly]{width:calc(100% - var(--spacing-2-xs))}.hds-text-input__input-wrapper[focus-within][\:has\(input\[readonly\]\)] input[readonly]{width:calc(100% - var(--spacing-2-xs))}.hds-text-input__input-wrapper:focus-within[\:has\(input\[readonly\]\)] input[readonly]{width:calc(100% - var(--spacing-2-xs))}.hds-text-input__input-wrapper:focus-within:has(input[readonly]) input[readonly]{width:calc(100% - var(--spacing-2-xs))}.form-item-application-number,.form-item-status,.form-item-applicant-type{display:none}.grants-handler__completion{background:var(--color-bus-light);padding:var(--spacing-layout-l) var(--spacing-layout-2-xl)}.grants-handler__completion h2{margin-top:var(--spacing-l)}.grants-handler__completion h3{font-size:1rem;font-weight:bold;margin-top:var(--spacing-m)}.grants-handler__completion__info-row{display:flex;flex-flow:row wrap;gap:var(--spacing-m);justify-content:flex-start;margin-bottom:var(--spacing-m)}.grants-handler__completion__button-row{display:flex;flex-flow:row wrap;gap:var(--spacing-m);justify-content:flex-start}.grants-handler__completion__longtext{margin:var(--spacing-l) 0}.hds-notification.notification-margin-bottom{margin-bottom:var(--spacing-layout-m)}.hds-notification__label{align-items:center}.hds-checkbox__input label{font-weight:normal}fieldset.grants-attachments--wrapper{margin-bottom:var(--spacing-layout-m)}fieldset.grants-attachments--wrapper legend{margin-bottom:var(--spacing-2-xs)}fieldset.grants-attachments--wrapper .form-item--error-message{width:100%}fieldset.grants-attachments--wrapper .js-form-type-managed-file{margin-bottom:0}.grants-applications-managed_file{position:relative}.grants-applications-managed_file label.hds-button--secondary:not(:disabled):not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button){left:0;position:relative}.grants-applications-managed_file label.hds-button--secondary:not(:disabled):not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button)[\:has\(input\:disabled\)]{background-color:transparent;background-color:var(--background-color-disabled, transparent);border-color:transparent;border-color:var(--border-color-disabled, transparent);color:var(--color-disabled);cursor:not-allowed}.grants-applications-managed_file label.hds-button--secondary:not(:disabled):not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button)[\:has\(input\:disabled\)]{background-color:transparent;background-color:var(--background-color-disabled, transparent);border-color:transparent;border-color:var(--border-color-disabled, transparent);color:var(--color-disabled);cursor:not-allowed}.grants-applications-managed_file label.hds-button--secondary:not(:disabled):not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button):has(input:disabled){background-color:transparent;background-color:var(--background-color-disabled, transparent);border-color:transparent;border-color:var(--border-color-disabled, transparent);color:var(--color-disabled);cursor:not-allowed}.grants-applications-managed_file label.hds-button--secondary:not(:disabled):not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button)[focus-within]{background:var(--color-black);border-color:var(--color-white);color:var(--color-white);outline:2px var(--color-black) solid}.grants-applications-managed_file label.hds-button--secondary:not(:disabled):not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button):focus-within{background:var(--color-black);border-color:var(--color-white);color:var(--color-white);outline:2px var(--color-black) solid}.grants-applications-managed_file input[type=file]{opacity:0;position:absolute}.form-managed-file{display:flex;flex-wrap:wrap;white-space:inherit}.form-managed-file>span{background-color:var(--color-info-light);border-bottom:2px dotted var(--color-coat-of-arms);display:inline-block;padding:var(--spacing-s) var(--spacing-2-xs)}.form-managed-file>.file-upload-js-error{flex-basis:100%}.grants-applications-managed_file label.hds-button{display:flex}.grants-attachments--wrapper .webform-readonly{display:none}.webform-multiple-table table{border-collapse:collapse;border:0px var(--color-white) solid;margin-bottom:var(--spacing-2-xs);max-width:-moz-fit-content;max-width:fit-content}.webform-multiple-table .webform-multiple-table--operations-two{min-width:60px}.webform-multiple-table tbody tr,.webform-multiple-table thead tr{align-items:center;justify-content:space-between;width:100%}.webform-multiple-table td,.webform-multiple-table th{max-width:100%;min-width:0;padding:0;width:100%}.webform-multiple-table table thead th{padding:var(--spacing-layout-2-xs)}div.hidden-head table{display:table}div.hidden-head table thead th{padding:0}div.hidden-head table tbody tr{border-bottom:var(--spacing-s) var(--color-white) solid}div.hidden-head table tbody tr:hover{background:rgba(0,0,0,0)}div.table-layout-form input.hds-text-input__input{width:100%}div.table-layout-form table{border:1px var(--color-black) solid;max-width:var(--webform-element-width--input-large)}div.table-layout-form table tbody tr{border:§0px var(--color-black-30) solid}div.table-layout-form table tbody tr td{border:1px var(--color-black-30) solid;padding:0}div.table-layout-form table tbody tr td input.hds-text-input__input[readonly]{padding:var(--spacing-layout-2-xs)}div.table-layout-form table .form-item{margin-bottom:0}.hds-text-input .hds-text-input__input.input--borderless{border:0 rgba(0,0,0,0) solid}#edit-subventions-items thead{background:var(--color-black-90);color:var(--color-white);text-align:left}#edit-subventions-items input.hds-text-input,#edit-subventions-items input.hds-text-input__input{background:rgba(0,0,0,0)}#subventions_table td.webform-multiple-table--operations,#subventions_table th.webform-multiple-table--operations{display:none}#subventions_table input.hds-text-input__input[readonly][name$="[amount]"]{background-color:var(--input-background-disabled);border-color:var(--input-border-color-disabled);color:var(--input-color-disabled);cursor:not-allowed}.form-item-muu-liite .webform-multiple-table--operations{display:none}.hidden-head>label{display:none}.webform-preview .accordion_header{font-size:28px;font-weight:300}@media(min-width: 768px){.webform-preview .accordion_header{font-size:36px;font-weight:500}}.webform-preview label{display:block;font-weight:bold}.grants-profile-grants-profile fieldset{background:var(--color-black-5);border:0 rgba(0,0,0,0) solid;margin:0;max-width:var(--webform-element-width--fieldset);padding:0 var(--spacing-layout-s) var(--spacing-layout-s);top:calc(-1*var(--spacing-m))}.grants-profile-grants-profile fieldset label{margin-bottom:var(--spacing-3-xs)}.grants-profile-grants-profile fieldset legend{font-size:var(--fontsize-body-l);margin-bottom:var(--spacing-m);padding-bottom:var(--spacing-s);position:relative;top:var(--spacing-l)}.grants-profile-grants-profile fieldset .fieldset-wrapper{display:flex;flex-flow:row wrap;justify-content:space-between}.grants-profile-grants-profile fieldset .hds-text-input{max-width:100%}.grants-profile-grants-profile fieldset div[class*=-address-postcode]{width:32%}.grants-profile-grants-profile fieldset div[class*=-address-city]{width:65%}.grants-profile--extrainfo .form-actions .button{margin-right:var(--spacing-2-xs)}.grants-stepper{--grants-stepper-color: var(--color-black);--grants-stepper-background-color: var(--color-white);--grants-stepper-disabled-color: var(--color-black-20);--grants-stepper-selected-step-label-color: var(--color-black-90);--grants-stepper-not-selected-step-label-color: var(--color-black);--grants-step-background-color: var(--color-white);--grants-step-content-color: var(--color-black);--grants-stepper-focus-border-color: var(--color-coat-of-arms);--grants-step-width: 120px;--circle-container-size: 36px;--progress-line-height: 2px;background-color:var(--grants-stepper-background-color);margin-bottom:var(--spacing-layout-m);position:relative}@media(max-width: 725px){.grants-stepper{--grants-step-width: 40px}}@media(max-width: 725px){.grants-stepper .grants-stepper__text{display:none}}.grants-stepper__inner{align-items:flex-start;display:flex;justify-content:space-between;margin:0;-ms-overflow-style:none;padding:0;position:relative;scroll-behavior:smooth;scrollbar-width:none;width:100%}.grants-stepper__lines{display:flex;height:var(--progress-line-height);left:calc(var(--grants-step-width)/2);line-height:var(--lineheight-l);position:absolute;transform:translateY(calc(var(--circle-container-size) / 2 + var(--progress-line-height) / 2));z-index:1}.grants-stepper__line{background-color:var(--grants-stepper-color);display:inline-block;height:100%;position:relative}.grants-stepper__line__disabled{background-color:var(--grants-stepper-disabled-color)}.grants-stepper__steps{background-color:var(--grants-stepper-background-color);box-sizing:border-box;display:flex;flex-shrink:0;justify-content:center;max-width:var(--grants-step-width);min-width:var(--grants-step-width);padding:3px}.grants-stepper__step{align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:rgba(0,0,0,0);border:0;box-sizing:content-box;color:var(--grants-stepper-color);cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;outline:none;overflow:visible;padding:0;position:relative}.grants-stepper__step[disabled],.grants-stepper__step__disabled{color:var(--grants-stepper-disabled-color);cursor:not-allowed}.grants-stepper__step[disabled] .grants-stepper__circle,.grants-stepper__step__disabled .grants-stepper__circle{background-color:var(--grants-stepper-background-color);border:2px solid var(--grants-stepper-disabled-color);color:var(--grants-stepper-disabled-color)}.grants-stepper__step[disabled] .grants-stepper__text,.grants-stepper__step__disabled .grants-stepper__text{color:var(--grants-stepper-disabled-color)}.grants-stepper__step__circle_container{align-items:center;display:flex;height:var(--circle-container-size);justify-content:center;width:var(--circle-container-size);z-index:2}.grants-stepper__step__completed_container{align-items:center;background-color:var(--grants-stepper-color);border-radius:16px;color:var(--color-white);display:none;justify-content:center;outline:2px solid var(--grants-stepper-background-color);padding:4px;vertical-align:middle}.grants-stepper .grants-stepper__error,.grants-stepper .grants-stepper__completed{display:none}.grants-stepper__text{color:var(--grants-stepper-not-selected-step-label-color);font-size:var(--fontsize-body-m);font-weight:500;line-height:var(--lineheight-l);margin-bottom:0;margin-top:6px;padding-left:var(--spacing-4-xs);padding-right:var(--spacing-4-xs);text-align:center;text-decoration:underline}.grants-stepper__circle{align-items:center;background-color:var(--grants-step-background-color);border:2px solid var(--grants-stepper-color);border-radius:16px;color:var(--grants-step-content-color);display:flex;height:28px;justify-content:center;outline:2px solid var(--grants-stepper-background-color);text-align:center;width:28px}.grants-stepper__number{font-size:var(--fontsize-body-m);font-weight:500;line-height:1.15}.grants-stepper .is-active .grants-stepper__circle{border:4px solid var(--grants-stepper-color);border-radius:18px;outline:none}.grants-stepper .is-active .grants-stepper__text{color:var(--grants-stepper-selected-step-label-color);font-weight:700;text-decoration:none}.grants-stepper .is-active .grants-stepper__number{color:var(--grants-stepper-selected-step-label-color);font-weight:700;text-decoration:none}.grants-stepper .is-complete .grants-stepper__container{align-items:center;background-color:var(--grants-stepper-color);border-radius:16px;color:var(--color-white);display:flex;justify-content:center;outline:2px solid var(--grants-stepper-background-color);padding:4px}.grants-stepper .is-complete .grants-stepper__number{display:none}.grants-stepper .is-complete .grants-stepper__completed{display:inline-block}.grants-stepper .is-complete .grants-stepper__circle{opacity:0}.grants-stepper .is-complete .grants-stepper__step__completed_container{display:flex}.grants-stepper .has-errors .grants-stepper__container{align-items:center;background-color:var(--grants-stepper-color);border-radius:16px;color:var(--color-white);display:flex;justify-content:center;outline:2px solid var(--grants-stepper-background-color);padding:4px}.grants-stepper .has-errors .grants-stepper__circle{border-color:var(--color-error);color:var(--color-error)}.grants-stepper .has-errors .grants-stepper__number{display:none}.grants-stepper .has-errors .grants-stepper__error{display:inline-block}.grants-stepper .progress-marker::before{display:none}.grants-stepper .progress-step .progress-marker{color:var(--color-black)}.grants-stepper .progress-step .progress-marker.focus-visible .grants-stepper__circle{outline:2px solid var(--color-black);outline:var(--outline-width, 2px) solid var(--color-black);outline-offset:2px}.grants-stepper .progress-step .progress-marker.focus-visible .grants-stepper__circle{outline:2px solid var(--color-black);outline:var(--outline-width, 2px) solid var(--color-black);outline-offset:2px}.grants-stepper .progress-step .progress-marker:focus-visible .grants-stepper__circle{outline:2px solid var(--color-black);outline:var(--outline-width, 2px) solid var(--color-black);outline-offset:2px}.grants-stepper .progress-step .progress-marker.focus-visible .grants-stepper__text{outline:2px solid var(--color-black);outline:var(--outline-width, 2px) solid var(--color-black)}.grants-stepper .progress-step .progress-marker.focus-visible .grants-stepper__text{outline:2px solid var(--color-black);outline:var(--outline-width, 2px) solid var(--color-black)}.grants-stepper .progress-step .progress-marker:focus-visible .grants-stepper__text{outline:2px solid var(--color-black);outline:var(--outline-width, 2px) solid var(--color-black)}.grants-stepper .progress-step:last-child{flex-grow:1}.grant-applications--select-wrapper{--border-width: 2px;--input-height: 56px;--menu-item-height: 53px;--icon-size: var(--spacing-m);--helper-color-default: var(--color-black-60);--helper-color-invalid: var(--color-error);--icon-color-invalid: var(--color-error);--input-background-default: var(--color-white);--input-background-disabled: var(--color-black-10);--input-border-color-default: var(--color-black-50);--input-border-color-hover: var(--color-black-90);--input-border-color-focus: var(--color-black-90);--input-border-color-invalid: var(--color-error);--input-border-color-disabled: var(--color-black-10);--input-color-default: var(--color-black-90);--input-color-disabled: var(--color-black-40);--label-color-default: var(--color-black-90);--label-color-invalid: var(--color-black-90);--placeholder-color: var(--color-black-60);--focus-outline-color: var(--color-coat-of-arms);align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--input-background-default);border:var(--border-width) solid var(--input-border-color-default);box-sizing:border-box;color:var(--input-color-default);cursor:pointer;display:block;font-size:1.125em;grid-template-areas:"select";line-height:normal;max-width:30ch;min-width:15ch;padding:.25em .5em;position:relative;width:100%}.grant-applications--select-wrapper select{align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:rgba(0,0,0,0);border:none;color:var(--dropdown-color-default);cursor:inherit;display:flex;font-family:inherit;font-size:var(--fontsize-body-l);height:var(--input-height);line-height:inherit;margin:0;min-height:var(--menu-item-height);outline:none;padding:calc(var(--spacing-s) - var(--border-width)*2) var(--spacing-s);width:100%;z-index:1}.grant-applications--select-wrapper select::-ms-expand{display:none}.grant-applications--select-wrapper i.hel-icon{pointer-events:none;position:absolute;right:calc(var(--spacing-s) - var(--border-width)*2);top:calc(var(--spacing-s) - var(--border-width)*2)}.grant-applications--select-wrapper select,.grant-applications--select-wrapper::after{grid-area:select}.grant-applications--select-wrapper:not(.select--multiple)::after{background-color:var(--helper-color-default);clip-path:polygon(100% 0%, 0 0%, 50% 100%);content:"";height:.5em;justify-self:end;width:.8em}.grant-applications--select-wrapper select:focus+.grant-applications--select-focus{border:2px solid var(--focus-outline-color);border-radius:inherit;bottom:-1px;left:-1px;position:absolute;right:-1px;top:-1px}.webform-submission__application_id{border-bottom:1px var(--color-black-20) solid;padding-bottom:var(--spacing-xl)}.webform-submission__application_id--header{font-size:1rem;font-weight:bold}.webform-submission__title-wrapper{padding-top:var(--spacing-2-xl)}.webform-submission__title-wrapper h1{max-width:100%}.webform-submission ul{list-style:none;margin-top:0;padding-left:0}.webform-submission-information{background:var(--color-silver-light);margin-top:var(--spacing-3-xl);padding:var(--spacing-l)}.webform-submission-information .webform-submission-information{margin-top:var(--spacing-l);padding:0}.webform-submission-information h4{margin-top:0}.webform-submission-information h5{font-size:var(--fontsize-body-m);margin-top:var(--spacing-s)}.webform-submission-information__row{display:flex}.webform-submission-information__row-edit{margin-top:var(--spacing-s)}.webform-submission-information__row-top{align-items:center;border-bottom:1px solid var(--color-black-20);justify-content:space-between}@media(max-width: 550px){.webform-submission-information__row-top{display:block}}.webform-submission-information__row-main{flex-flow:row nowrap;gap:var(--spacing-m);justify-content:space-between}@media(max-width: 1179px){.webform-submission-information__row-main{flex-flow:row wrap}}.webform-submission-information__row-main>div{flex:1}@media(max-width: 1179px){.webform-submission-information__row-main>div{flex:auto;width:100%}}.webform-submission-information__row-main>div ul{list-style-type:none;margin-bottom:0;padding-left:0}.webform-submission-information__row-main>div ul li{margin:0;padding:0}.webform-submission-information__supportlinks{display:flex;flex-flow:row nowrap;min-width:-moz-fit-content;min-width:fit-content}.webform-submission-information__supportlinks .hds-loading-spinner{left:0}.webform-submission-information__supportlinks .hds-button{min-width:-moz-fit-content;min-width:fit-content}.hel-icon.hel-icon--copy{-webkit-mask-image:url("data:image/svg+xml,%3Csvg class='Icon-module_icon__1Jtzj icon_hel-icon__1YqNC Icon-module_s__2WGWe icon_hel-icon--size-s__2Lkik' viewBox='0 0 24 24' role='img' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Crect width='24' height='24'%3E%3C/rect%3E%3Cpath fill='currentColor' d='M6,10 L6,12 L5,12 L5,18 L12,18 L12,17 L14,17 L14,19 C14,19.5522847 13.5522847,20 13,20 L4,20 C3.44771525,20 3,19.5522847 3,19 L3,11 C3,10.4477153 3.44771525,10 4,10 L6,10 Z M20,4 C20.5522847,4 21,4.44771525 21,5 L21,15 C21,15.5522847 20.5522847,16 20,16 L8,16 C7.44771525,16 7,15.5522847 7,15 L7,5 C7,4.44771525 7.44771525,4 8,4 L20,4 Z M19,6 L9,6 L9,14 L19,14 L19,6 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg class='Icon-module_icon__1Jtzj icon_hel-icon__1YqNC Icon-module_s__2WGWe icon_hel-icon--size-s__2Lkik' viewBox='0 0 24 24' role='img' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Crect width='24' height='24'%3E%3C/rect%3E%3Cpath fill='currentColor' d='M6,10 L6,12 L5,12 L5,18 L12,18 L12,17 L14,17 L14,19 C14,19.5522847 13.5522847,20 13,20 L4,20 C3.44771525,20 3,19.5522847 3,19 L3,11 C3,10.4477153 3.44771525,10 4,10 L6,10 Z M20,4 C20.5522847,4 21,4.44771525 21,5 L21,15 C21,15.5522847 20.5522847,16 20,16 L8,16 C7.44771525,16 7,15.5522847 7,15 L7,5 C7,4.44771525 7.44771525,4 8,4 L20,4 Z M19,6 L9,6 L9,14 L19,14 L19,6 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E")}.webform-submission-form .form-actions{border-top:1px rgba(0,0,0,.6) solid;margin-top:var(--spacing-l);padding-top:var(--spacing-2-xl)}@media(min-width: 768px){.webform-submission-form .form-actions{display:flex;flex-direction:row-reverse}}.webform-submission-form .form-actions .actions{display:flex;flex-wrap:wrap}.webform-submission-form .form-actions button{margin-left:0}@media(min-width: 768px){.webform-submission-form .form-actions button{margin-left:var(--spacing-2-xs)}}.webform-submission-form .form-actions input{margin-bottom:var(--spacing-layout-2-xs);width:100%}@media(min-width: 768px){.webform-submission-form .form-actions input{width:auto}}.webform-submission-form .form-actions input.webform-button--draft{background:rgba(0,0,0,0);border:0 rgba(0,0,0,0) solid;color:var(--hdbt-color-black);order:3;text-decoration:underline}.webform-submission-form .form-actions button.webform-button--next span::after,.webform-submission-form .form-actions button.webform-button--preview span::after{content:">";margin-left:var(--spacing-2-xs)}.webform-submission-form .form-actions button.webform-button--previous span::before{content:"<";margin-right:var(--spacing-2-xs)}.webform-submission-form .form-actions input.webform-button--previous{background:var(--color-white);color:var(--border-color)}.webform-button--draft .hds-button__label::before{background-color:currentColor;background-size:contain;content:"";display:inline-block;flex-shrink:0;height:24px;margin-right:var(--spacing-2-xs);-webkit-mask-image:var(--hel-icon--download-cloud);mask-image:var(--hel-icon--download-cloud);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:24px 24px;mask-size:24px 24px;transition:transform .2s linear;vertical-align:bottom;width:24px}.webform-submission-messages{background:var(--color-silver-light);margin-top:var(--spacing-3-xl);padding:var(--spacing-l)}.webform-submission-messages h4,.webform-submission-messages h5{margin-top:0}.webform-submission-messages hr{margin:var(--spacing-l) 0}.webform-submission-messages__new-message{align-items:center;background:var(--color-alert);display:inline-flex;font-weight:bold;gap:var(--spacing-2-xs);margin-bottom:var(--spacing-m);padding:var(--spacing-2-xs) var(--spacing-xs);text-transform:uppercase}.webform-submission-messages__messages-list{list-style:none;margin:0;padding:0}.webform-submission-messages__message{margin:0;padding:0}.webform-submission-messages__message__attachments{list-style:none}.webform-submission-messages__message .hds-button{margin-top:var(--spacing-s)}.js-form-type-grants-webform-summation-field{max-width:var(--webform-element-width--input-large);text-align:right}.js-form-type-grants-webform-summation-field .grants-webform-summation-field{display:inline-block;padding:var(--spacing-xs) var(--spacing-m)}.webform-print-header,.webform-print-footer{display:none}.webform-print .main-content{display:block}.webform-submission--view-mode-html .hds-text-input,.webform-submission-data-preview-page .hds-text-input,.webform-print-page-html .hds-text-input{max-width:100%}.webform-submission--view-mode-html .print-label,.webform-submission-data-preview-page .print-label,.webform-print-page-html .print-label{display:block;font-size:var(--fontsize-body-m);font-weight:500;margin-bottom:var(--spacing-3-xs);margin-top:0;max-width:-moz-fit-content;max-width:fit-content;padding-right:var(--spacing-xl);position:relative}.webform-submission--view-mode-html .webform-section-flex-wrapper h3+*>*:first-child>*:first-child,.webform-submission--view-mode-html .webform-section-flex-wrapper h3+*>*:first-child>*:first-child label:first-of-type,.webform-submission-data-preview-page .webform-section-flex-wrapper h3+*>*:first-child>*:first-child,.webform-submission-data-preview-page .webform-section-flex-wrapper h3+*>*:first-child>*:first-child label:first-of-type,.webform-print-page-html .webform-section-flex-wrapper h3+*>*:first-child>*:first-child,.webform-print-page-html .webform-section-flex-wrapper h3+*>*:first-child>*:first-child label:first-of-type{line-height:normal}.webform-submission--view-mode-html .print-notification,.webform-submission-data-preview-page .print-notification,.webform-print-page-html .print-notification{border:2px var(--color-black) solid;font-weight:bold;margin-top:var(--spacing-2-xl);padding:var(--spacing-layout-s)}.webform-submission--view-mode-html .print-notification .print-notification--icon,.webform-submission-data-preview-page .print-notification .print-notification--icon,.webform-print-page-html .print-notification .print-notification--icon{height:22px;margin-right:var(--spacing-2-xs);vertical-align:text-top;width:22px}.webform-submission--view-mode-html .webform-print-page-wizard-page~.webform-print-page-wizard-page h2,.webform-submission-data-preview-page .webform-print-page-wizard-page~.webform-print-page-wizard-page h2,.webform-print-page-html .webform-print-page-wizard-page~.webform-print-page-wizard-page h2{page-break-after:avoid;page-break-before:always}.webform-submission--view-mode-html div.hds-text-input__input,.webform-submission-data-preview-page div.hds-text-input__input,.webform-print-page-html div.hds-text-input__input{background:var(--color-white);border:2px var(--color-black) solid;height:var(--spacing-2-xl);width:100%}.webform-submission--view-mode-html div.hds-text-input__textarea,.webform-submission-data-preview-page div.hds-text-input__textarea,.webform-print-page-html div.hds-text-input__textarea{background:var(--color-white);border:2px var(--color-black) solid;height:var(--spacing-layout-2-xl);width:100%}.webform-submission--view-mode-html .webform-section-wrapper .hds-notification,.webform-submission-data-preview-page .webform-section-wrapper .hds-notification,.webform-print-page-html .webform-section-wrapper .hds-notification{margin-top:var(--spacing-s)}.webform-submission--view-mode-html .webform-print-page-body h2,.webform-submission-data-preview-page .webform-print-page-body h2,.webform-print-page-html .webform-print-page-body h2{margin-bottom:var(--spacing-layout-s)}.webform-submission--view-mode-html .webform-print-wrapper-table,.webform-submission-data-preview-page .webform-print-wrapper-table,.webform-print-page-html .webform-print-wrapper-table{border:0 rgba(0,0,0,0) solid;display:table;max-width:100%;overflow-x:visible;overflow-x:initial;width:100%}.webform-submission--view-mode-html .webform-print-wrapper-table thead,.webform-submission--view-mode-html .webform-print-wrapper-table tbody,.webform-submission--view-mode-html .webform-print-wrapper-table tfoot,.webform-submission--view-mode-html .webform-print-wrapper-table tr,.webform-submission--view-mode-html .webform-print-wrapper-table tbody tr:hover,.webform-submission--view-mode-html .webform-print-wrapper-table td,.webform-submission--view-mode-html .webform-print-wrapper-table td:first-child,.webform-submission--view-mode-html .webform-print-wrapper-table th,.webform-submission-data-preview-page .webform-print-wrapper-table thead,.webform-submission-data-preview-page .webform-print-wrapper-table tbody,.webform-submission-data-preview-page .webform-print-wrapper-table tfoot,.webform-submission-data-preview-page .webform-print-wrapper-table tr,.webform-submission-data-preview-page .webform-print-wrapper-table tbody tr:hover,.webform-submission-data-preview-page .webform-print-wrapper-table td,.webform-submission-data-preview-page .webform-print-wrapper-table td:first-child,.webform-submission-data-preview-page .webform-print-wrapper-table th,.webform-print-page-html .webform-print-wrapper-table thead,.webform-print-page-html .webform-print-wrapper-table tbody,.webform-print-page-html .webform-print-wrapper-table tfoot,.webform-print-page-html .webform-print-wrapper-table tr,.webform-print-page-html .webform-print-wrapper-table tbody tr:hover,.webform-print-page-html .webform-print-wrapper-table td,.webform-print-page-html .webform-print-wrapper-table td:first-child,.webform-print-page-html .webform-print-wrapper-table th{background:rgba(0,0,0,0);border:0;color:var(--color-black)}.webform-submission--view-mode-html .webform-print-wrapper-table ul,.webform-submission-data-preview-page .webform-print-wrapper-table ul,.webform-print-page-html .webform-print-wrapper-table ul{margin:0;padding:0}.webform-submission--view-mode-html .webform-print-wrapper-table ul li,.webform-submission-data-preview-page .webform-print-wrapper-table ul li,.webform-print-page-html .webform-print-wrapper-table ul li{border-bottom:1px var(--color-black-50) solid;list-style:none;margin-top:0;padding:1rem 0}.webform-submission--view-mode-html .webform-print-wrapper-table ul li:last-of-type,.webform-submission-data-preview-page .webform-print-wrapper-table ul li:last-of-type,.webform-print-page-html .webform-print-wrapper-table ul li:last-of-type{border-bottom:0 rgba(0,0,0,0) solid}.webform-submission--view-mode-html .webform-print-wrapper-table thead,.webform-submission-data-preview-page .webform-print-wrapper-table thead,.webform-print-page-html .webform-print-wrapper-table thead{display:table-header-group}.webform-submission--view-mode-html .webform-print-wrapper-table thead th,.webform-submission-data-preview-page .webform-print-wrapper-table thead th,.webform-print-page-html .webform-print-wrapper-table thead th{padding:0}.webform-submission--view-mode-html .webform-print-wrapper-table tfoot,.webform-submission-data-preview-page .webform-print-wrapper-table tfoot,.webform-print-page-html .webform-print-wrapper-table tfoot{display:table-footer-group}.webform-submission--view-mode-html .webform-submission-data>section,.webform-submission-data-preview-page .webform-submission-data>section,.webform-print-page-html .webform-submission-data>section{border-top:1px var(--color-black-20) solid;padding-top:var(--spacing-layout-l)}.webform-submission--view-mode-html .webform-submission-data>section>.webform-section-flex-wrapper,.webform-submission-data-preview-page .webform-submission-data>section>.webform-section-flex-wrapper,.webform-print-page-html .webform-submission-data>section>.webform-section-flex-wrapper{display:block}.webform-submission--view-mode-html .webform-submission-data>section>.webform-section-flex-wrapper>h2,.webform-submission-data-preview-page .webform-submission-data>section>.webform-section-flex-wrapper>h2,.webform-print-page-html .webform-submission-data>section>.webform-section-flex-wrapper>h2{font-size:var(--fontsize-heading-l) !important;margin:0 0 2mm !important;padding:0 !important;width:100% !important}.webform-submission--view-mode-html .webform-submission-data>section>.webform-section-flex-wrapper>h2,.webform-submission-data-preview-page .webform-submission-data>section>.webform-section-flex-wrapper>h2,.webform-print-page-html .webform-submission-data>section>.webform-section-flex-wrapper>h2{font-weight:500;min-width:100%}.webform-submission--view-mode-html .webform-submission-data>section>.webform-section-flex-wrapper>.webform-section-wrapper,.webform-submission-data-preview-page .webform-submission-data>section>.webform-section-flex-wrapper>.webform-section-wrapper,.webform-print-page-html .webform-submission-data>section>.webform-section-flex-wrapper>.webform-section-wrapper{padding:6mm 0}.webform-submission--view-mode-html .webform-submission-data>section>.webform-section-flex-wrapper>.webform-section-wrapper label,.webform-submission-data-preview-page .webform-submission-data>section>.webform-section-flex-wrapper>.webform-section-wrapper label,.webform-print-page-html .webform-submission-data>section>.webform-section-flex-wrapper>.webform-section-wrapper label{font-weight:500}.webform-submission--view-mode-html .webform-submission-data>section.hds-notification,.webform-submission-data-preview-page .webform-submission-data>section.hds-notification,.webform-print-page-html .webform-submission-data>section.hds-notification{padding-top:var(--spacing-s)}@media print{@page{.webform-submission--view-mode-html,.webform-submission-data-preview-page,.webform-print-page-html{margin:0;size:A4}}.webform-submission--view-mode-html h1,.webform-submission-data-preview-page h1,.webform-print-page-html h1{margin:0;position:relative}.webform-submission--view-mode-html details,.webform-submission-data-preview-page details,.webform-print-page-html details{page-break-before:always}.webform-submission--view-mode-html .details-section-divider,.webform-submission-data-preview-page .details-section-divider,.webform-print-page-html .details-section-divider{page-break-after:always}.webform-submission--view-mode-html label,.webform-submission-data-preview-page label,.webform-print-page-html label{font-size:8pt;margin-bottom:0}.webform-submission--view-mode-html section,.webform-submission-data-preview-page section,.webform-print-page-html section{border-top:0 var(--color-black-20) solid !important;padding-top:0 !important}.webform-submission--view-mode-html section,.webform-submission-data-preview-page section,.webform-print-page-html section{margin-bottom:0;padding-bottom:0}.webform-submission--view-mode-html div.main-content,.webform-submission-data-preview-page div.main-content,.webform-print-page-html div.main-content{margin:0}.webform-submission--view-mode-html button,.webform-submission--view-mode-html footer.footer,.webform-submission--view-mode-html header.header,.webform-submission--view-mode-html nav.breadcrumb,.webform-submission--view-mode-html .form-actions,.webform-submission--view-mode-html .hds-notification,.webform-submission--view-mode-html .messages__container,.webform-submission--view-mode-html .tools__container,.webform-submission--view-mode-html .breadcrumb__container,.webform-submission--view-mode-html .webform-progress,.webform-submission--view-mode-html .webform-progress-tracker,.webform-submission--view-mode-html .webform-progress-tracker-mobile,.webform-submission--view-mode-html .webform-multiple-add,.webform-submission--view-mode-html .webform-multiple-table--operations,.webform-submission-data-preview-page button,.webform-submission-data-preview-page footer.footer,.webform-submission-data-preview-page header.header,.webform-submission-data-preview-page nav.breadcrumb,.webform-submission-data-preview-page .form-actions,.webform-submission-data-preview-page .hds-notification,.webform-submission-data-preview-page .messages__container,.webform-submission-data-preview-page .tools__container,.webform-submission-data-preview-page .breadcrumb__container,.webform-submission-data-preview-page .webform-progress,.webform-submission-data-preview-page .webform-progress-tracker,.webform-submission-data-preview-page .webform-progress-tracker-mobile,.webform-submission-data-preview-page .webform-multiple-add,.webform-submission-data-preview-page .webform-multiple-table--operations,.webform-print-page-html button,.webform-print-page-html footer.footer,.webform-print-page-html header.header,.webform-print-page-html nav.breadcrumb,.webform-print-page-html .form-actions,.webform-print-page-html .hds-notification,.webform-print-page-html .messages__container,.webform-print-page-html .tools__container,.webform-print-page-html .breadcrumb__container,.webform-print-page-html .webform-progress,.webform-print-page-html .webform-progress-tracker,.webform-print-page-html .webform-progress-tracker-mobile,.webform-print-page-html .webform-multiple-add,.webform-print-page-html .webform-multiple-table--operations{display:none !important}.webform-submission--view-mode-html .gin--horizontal-toolbar .dialog-off-canvas-main-canvas,.webform-submission-data-preview-page .gin--horizontal-toolbar .dialog-off-canvas-main-canvas,.webform-print-page-html .gin--horizontal-toolbar .dialog-off-canvas-main-canvas{padding:0 !important}.webform-submission--view-mode-html .hds-text-input,.webform-submission-data-preview-page .hds-text-input,.webform-print-page-html .hds-text-input{max-width:100%}.webform-submission--view-mode-html .hds-text-input .hds-text-input__input,.webform-submission-data-preview-page .hds-text-input .hds-text-input__input,.webform-print-page-html .hds-text-input .hds-text-input__input{height:1cm}.webform-submission--view-mode-html .hds-text-input textarea.hds-text-input__input,.webform-submission--view-mode-html .hds-text-input div.hds-text-input__textarea,.webform-submission-data-preview-page .hds-text-input textarea.hds-text-input__input,.webform-submission-data-preview-page .hds-text-input div.hds-text-input__textarea,.webform-print-page-html .hds-text-input textarea.hds-text-input__input,.webform-print-page-html .hds-text-input div.hds-text-input__textarea{height:6cm;max-width:100%;min-width:100%;width:100%}.webform-submission--view-mode-html .hds-text-input .hds-text-input__input[readonly],.webform-submission--view-mode-html .hds-text-input .hds-text-input__input,.webform-submission-data-preview-page .hds-text-input .hds-text-input__input[readonly],.webform-submission-data-preview-page .hds-text-input .hds-text-input__input,.webform-print-page-html .hds-text-input .hds-text-input__input[readonly],.webform-print-page-html .hds-text-input .hds-text-input__input{border:2px var(--color-black) solid}.webform-submission--view-mode-html .webform-element,.webform-submission-data-preview-page .webform-element,.webform-print-page-html .webform-element{border:1px var(--color-black) solid;margin-bottom:8mm;padding:2.5mm;position:relative}.webform-submission--view-mode-html .webform-preview,.webform-submission-data-preview-page .webform-preview,.webform-print-page-html .webform-preview{margin-top:0}.webform-submission--view-mode-html .webform-preview label,.webform-submission-data-preview-page .webform-preview label,.webform-print-page-html .webform-preview label{align-items:flex-end;display:flex;font-size:8pt;height:100%;left:0;pointer-events:none;position:absolute;top:-100%;width:100%}.webform-submission--view-mode-html .webform-preview .webform-element,.webform-submission-data-preview-page .webform-preview .webform-element,.webform-print-page-html .webform-preview .webform-element{border:1px var(--color-black) solid;margin-bottom:8mm;padding:2.5mm;position:relative;top:5mm}.webform-submission--view-mode-html .webform-preview .webform-multiple-table--operations,.webform-submission-data-preview-page .webform-preview .webform-multiple-table--operations,.webform-print-page-html .webform-preview .webform-multiple-table--operations{display:none}.webform-submission--view-mode-html .webform-print-header,.webform-submission-data-preview-page .webform-print-header,.webform-print-page-html .webform-print-header{align-items:center;background:var(--color-white);border-bottom:1px var(--color-black-40) solid;display:flex;flex-flow:row nowrap;font-size:9pt;height:21mm;left:0;max-width:100%;min-width:100%;position:fixed;top:0;width:100%;z-index:1000}.webform-submission--view-mode-html .webform-print-header svg,.webform-submission-data-preview-page .webform-print-header svg,.webform-print-page-html .webform-print-header svg{color:var(--color-black);display:block;height:25mm;margin-right:3mm;width:55mm}.webform-submission--view-mode-html .webform-print-header .webform-print-header-left-text,.webform-submission-data-preview-page .webform-print-header .webform-print-header-left-text,.webform-print-page-html .webform-print-header .webform-print-header-left-text{color:var(--color-black-40);text-align:left;width:100%}.webform-submission--view-mode-html .webform-print-header .webform-print-header-right-text,.webform-submission-data-preview-page .webform-print-header .webform-print-header-right-text,.webform-print-page-html .webform-print-header .webform-print-header-right-text{color:var(--color-black-40);text-align:right;width:100%}.webform-submission--view-mode-html .webform-print-footer,.webform-submission-data-preview-page .webform-print-footer,.webform-print-page-html .webform-print-footer{align-items:center;background:var(--color-white);border-top:1px var(--color-black-40) solid;bottom:0;display:flex;flex-flow:row nowrap;font-size:9pt;height:17mm;left:0;max-width:100%;min-width:100%;position:fixed;width:100%;z-index:1000}.webform-submission--view-mode-html .webform-print-footer svg,.webform-submission-data-preview-page .webform-print-footer svg,.webform-print-page-html .webform-print-footer svg{color:var(--color-black);display:block;height:15mm;margin-right:3mm;width:33mm}.webform-submission--view-mode-html .webform-print-footer .webform-print-footer-left-text,.webform-submission-data-preview-page .webform-print-footer .webform-print-footer-left-text,.webform-print-page-html .webform-print-footer .webform-print-footer-left-text{color:var(--color-black-40);text-align:left;width:100%}.webform-submission--view-mode-html .webform-print-footer .webform-print-footer-right-text,.webform-submission-data-preview-page .webform-print-footer .webform-print-footer-right-text,.webform-print-page-html .webform-print-footer .webform-print-footer-right-text{color:var(--color-black-40);text-align:right;width:100%}.webform-submission--view-mode-html .webform-print-header-space,.webform-submission-data-preview-page .webform-print-header-space,.webform-print-page-html .webform-print-header-space{background:var(--color-white);font-size:9pt;height:21mm}.webform-submission--view-mode-html .webform-print-footer-space,.webform-submission-data-preview-page .webform-print-footer-space,.webform-print-page-html .webform-print-footer-space{background:var(--color-white);font-size:9pt;height:17mm}.webform-submission--view-mode-html .webform-print-wrapper-table,.webform-submission-data-preview-page .webform-print-wrapper-table,.webform-print-page-html .webform-print-wrapper-table{border:0;margin:0;overflow-x:visible;overflow-x:initial}.webform-submission--view-mode-html .webform-section-flex-wrapper,.webform-submission-data-preview-page .webform-section-flex-wrapper,.webform-print-page-html .webform-section-flex-wrapper{flex-flow:row wrap}.webform-submission--view-mode-html .webform-section-flex-wrapper>h3.webform-section-title,.webform-submission-data-preview-page .webform-section-flex-wrapper>h3.webform-section-title,.webform-print-page-html .webform-section-flex-wrapper>h3.webform-section-title{max-width:100%;width:100%}.webform-submission--view-mode-html .webform-section-grid-wrapper,.webform-submission-data-preview-page .webform-section-grid-wrapper,.webform-print-page-html .webform-section-grid-wrapper{display:flex;flex-flow:row nowrap}.webform-submission--view-mode-html .webform-section-grid-wrapper>h3.webform-section-title,.webform-submission-data-preview-page .webform-section-grid-wrapper>h3.webform-section-title,.webform-print-page-html .webform-section-grid-wrapper>h3.webform-section-title{font-size:1.25rem;margin-top:0;max-width:5cm;width:100%}.webform-submission--view-mode-html .webform-section-grid-wrapper>dl.webform-section-contents,.webform-submission-data-preview-page .webform-section-grid-wrapper>dl.webform-section-contents,.webform-print-page-html .webform-section-grid-wrapper>dl.webform-section-contents{margin-top:0;max-width:100%;padding-left:1cm;width:100%}.webform-submission--view-mode-html .webform-section-grid-wrapper>dl.webform-section-contents dt,.webform-submission-data-preview-page .webform-section-grid-wrapper>dl.webform-section-contents dt,.webform-print-page-html .webform-section-grid-wrapper>dl.webform-section-contents dt{font-weight:bold;margin:0;padding:0;page-break-after:avoid}.webform-submission--view-mode-html .webform-section-grid-wrapper>dl.webform-section-contents dd,.webform-submission-data-preview-page .webform-section-grid-wrapper>dl.webform-section-contents dd,.webform-print-page-html .webform-section-grid-wrapper>dl.webform-section-contents dd{margin:0;padding:0;page-break-before:avoid}.webform-submission--view-mode-html .webform-print-page-body h2,.webform-submission-data-preview-page .webform-print-page-body h2,.webform-print-page-html .webform-print-page-body h2{margin-bottom:1cm}}.webform-submission-data dl dt{font-weight:bold}.webform-submission-data dl dd{margin:0;padding:0}.webform-submission-data dl dl{padding-left:var(--spacing-2-xs)}.webform-submission-data dl>br{display:none}.webform-print-page-html .webform-section-wrapper>h4,.webform-print-page-html .webform-section-wrapper .print-label{margin-top:var(--spacing-2-xs);line-height:1.5}.webform-print-page-html .webform-section-wrapper fieldset{padding:var(--spacing-s)}@media(min-width: 768px){.webform-print-page-html .webform-section-wrapper fieldset{min-width:400px;padding:var(--spacing-s) var(--spacing-m)}}.application-list{padding-bottom:var(--spacing-xl);padding-left:0}.application-list__processed-human-readable{display:none}.application-list__item{background:var(--color-bus-light);display:block;margin:var(--spacing-m) 0;padding:var(--spacing-2-xl) var(--spacing-s) var(--spacing-m);position:relative}.application-list__item .new-message{background-color:var(--color-alert);border-radius:var(--spacing-xl);display:inline-block;padding:var(--spacing-2-xs)}.application-list__item .new-message .hel-icon--size-s{height:20px;width:20px}.application-list__item h3,.application-list__item h4{margin-top:var(--spacing-xs)}.application-list__item h4{font-size:1rem}.application-list__item--submitted{display:none}.application-list__item__link{display:flex;margin-top:var(--spacing-m)}.application-list__item__link a{font-size:1.25rem}.application-list__item__link a i{vertical-align:text-bottom}.application-list__item__row{display:flex;flex-flow:row wrap;gap:var(--spacing-m);justify-content:space-between}.application-list__item__row__left{justify-content:flex-start}.application-list__item__row__top{padding:var(--spacing-2-xs) var(--spacing-s) var(--spacing-2-xs) 0;position:absolute;top:0;width:100%}.application-list__item--status{--status-label-height: 32px;align-items:center;border-radius:20px;display:inline-flex;font-size:var(--fontsize-body-s);line-height:var(--status-label-height);min-height:var(--status-label-height);padding:var(--spacing-3-xs) var(--spacing-s);padding-left:var(--spacing-xs);vertical-align:middle}.application-list__item--status+.hds-loading-spinner{display:inline-block;left:10px;margin:0;padding:0;position:relative;top:var(--spacing-3-xs)}.application-list__item--status.hide-spinner+.hds-loading-spinner{display:none}.application-list__item--status+div+.application-list__item--error{display:none}.application-list__item--status.show-error{background:var(--color-black-20);color:var(--color-black-90)}.application-list__item--status.show-error+div+.application-list__item--error{display:inline-flex;left:var(--spacing-xs);margin:0;padding:0;position:relative;top:var(--spacing-3-xs)}.application-list__item--status.show-error+div+.application-list__item--error .application-list--error-text{display:inline-block;margin-left:var(--spacing-2-xs)}.application-list__item--status--draft{padding-left:0}.application-list__item--status--sent,.application-list__item--status--submitted{background:var(--color-black-10)}.application-list__item--status--sent::before,.application-list__item--status--submitted::before{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--alert-circle);mask-image:var(--hel-icon--alert-circle);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));background-color:var(--color-black);content:"";margin-right:var(--spacing-2-xs)}.application-list__item--status--received,.application-list__item--status--pending,.application-list__item--status--processing,.application-list__item--status--preparing{background:var(--color-info);color:var(--color-white)}.application-list__item--status--received::before,.application-list__item--status--pending::before,.application-list__item--status--processing::before,.application-list__item--status--preparing::before{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--info-circle);mask-image:var(--hel-icon--info-circle);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));background-color:var(--color-white);content:"";margin-right:var(--spacing-2-xs)}.application-list__item--status--done,.application-list__item--status--ready,.application-list__item--status--resolved{background:var(--color-success);color:var(--color-white)}.application-list__item--status--done::before,.application-list__item--status--ready::before,.application-list__item--status--resolved::before{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--check-circle);mask-image:var(--hel-icon--check-circle);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));background-color:var(--color-white);content:"";margin-right:var(--spacing-2-xs)}.application-list__item--status--rejected,.application-list__item--status--deleted,.application-list__item--status--canceled,.application-list__item--status--cancelled{background:var(--color-alert)}.application-list__item--status--rejected::before,.application-list__item--status--deleted::before,.application-list__item--status--canceled::before,.application-list__item--status--cancelled::before{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--alert-circle);mask-image:var(--hel-icon--alert-circle);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));background-color:var(--color-black);content:"";margin-right:var(--spacing-2-xs)}.application-list__item--status--error{background:var(--color-black-20);color:var(--color-black);text-transform:uppercase}.application-list__item--status--error .hel-icon{margin-right:var(--spacing-3-xs)}.application-list__count{font-size:1.5rem}.application-list__count-value{font-weight:bold}.application-list__information-row{align-items:flex-end;display:flex;flex-flow:row nowrap;justify-content:space-between;width:100%}@media(max-width: 35rem){.application-list__information-row{flex-flow:row wrap}}.application-list__information-row .grant-applications--select-wrapper select{max-width:100%;width:322px}.application-list__status__wrapper{background:var(--color-black-5)}.application-list__status__container{display:flex;flex-flow:row wrap;gap:var(--spacing-layout-m);justify-content:flex-start;padding-bottom:var(--spacing-m);padding-top:var(--spacing-m)}.application-list__status__label{font-weight:bold}.application-list__status__value{display:flex;flex-flow:row;justify-items:center;min-height:var(--spacing-xl)}.application-list__status__value>div{margin:auto}.application-list__search-row{align-items:flex-end;display:flex;flex-flow:row nowrap;gap:var(--spacing-s);justify-content:space-between;width:100%}@media(max-width: 35rem){.application-list__search-row{flex-flow:row wrap}}.application-list__search-row .hds-text-input{flex:1 100%;max-width:100%}.application-list__search-row .hds-text-input__input-wrapper{display:block}.application-list__search-row .hds-text-input__input-wrapper input{width:100%}.application-list__search-row button{white-space:nowrap}.application-list__pagination{--line-height: 1.5555555556;font-size:1.125rem;font-weight:400;line-height:var(--line-height);display:inline-flex;flex-wrap:wrap;font-weight:700;gap:var(--spacing-2-xs);justify-content:center;list-style:none;padding:0}.application-list__pagination li{margin-top:0}.application-list__pagination li.active a{text-decoration:underline}.application-list__pagination li.disabled a{cursor:default;text-decoration:none}.application-list__pagination li.disabled a:hover,.application-list__pagination li.disabled a:focus,.application-list__pagination li.disabled a:active{outline:none;text-decoration:none}.application-list__pagination li a{color:var(--color-black-90);display:block;height:var(--link-height);min-width:40px;padding-left:var(--spacing-3-xs);padding-right:var(--spacing-3-xs);text-decoration:none}.application-list__pagination li a:hover{text-decoration:underline}.application-list__pagination li a:focus,.application-list__pagination li a:active{outline:solid var(--color-coat-of-arms) 3px;outline-offset:1px}.grants-profile hr{border:1px solid var(--color-silver);margin:var(--spacing-layout-xs) 0}.grants-profile h3.info-grants{border-bottom:2px solid var(--color-silver);padding-bottom:var(--spacing-l)}.grants-profile--title{align-items:center;display:flex;flex-flow:row nowrap}.grants-profile--title .grants-profile--initials{border-radius:50%;display:none;font-size:var(--fontsize-body-xl);font-weight:bold;height:var(--spacing-4-xl);line-height:var(--spacing-4-xl);margin-right:var(--spacing-m);text-align:center;vertical-align:middle;width:var(--spacing-4-xl)}@media(min-width: 992px){.grants-profile--title .grants-profile--initials{display:block}}.grants-profile--title .grants-profile--initials:hover,.grants-profile--title .grants-profile--initials:active,.grants-profile--title .grants-profile--initials:focus{text-decoration:underline}.grants-profile--title .grants-profile--initials-colorscheme-2{background-color:var(--color-bus);color:var(--color-white)}.grants-profile--title .grants-profile--initials-colorscheme-1{background-color:var(--color-engel);color:var(--color-black)}.grants-profile--title .grants-profile--initials-colorscheme-0{background-color:var(--color-tram);color:var(--color-white)}.grants-profile--title h1{flex-grow:100}.grants-profile--basicinfo{--line-height: 1.5;background-color:var(--color-silver-light);border-bottom:8px solid var(--color-engel-dark);padding-bottom:var(--spacing-2-xs);padding-top:var(--spacing-l)}.grants-profile--basicinfo h3{font-size:var(--fontsize-heading-l);margin-top:0;padding-top:0}.grants-profile--extrainfo{padding-bottom:var(--spacing-l);padding-top:var(--spacing-l)}.grants-profile--extrainfo .hds-notification{margin-bottom:var(--spacing-xl)}.grants-profile--extrainfo fieldset.form-wrapper{background-color:var(--color-silver-light);border:0;padding:var(--spacing-l)}.grants-profile--extrainfo fieldset.inline-error-message{background-color:transparent;background-color:initial;padding:0 0 0 var(--spacing-2-xs)}.grants-profile--extrainfo fieldset.inline-error-message legend{display:none}.grants-profile--update-link{margin-bottom:var(--spacing-layout-2-xs);margin-top:var(--spacing-layout-xs)}.grants-profile--infotext{font-size:var(--fontsize-body-l);margin-bottom:var(--spacing-s)}.grants-profile--wrapper{display:flex;flex-wrap:wrap}.grants-profile--wrapper-item{margin-bottom:var(--spacing-layout-2-xs);width:100%}@media(min-width: 576px){.grants-profile--wrapper-item{flex:1;margin-bottom:0}}.grants-profile--wrapper-item:first-child{flex:auto;margin-bottom:var(--spacing-layout-2-xs);width:100%}.grants-profile .profile-add-more{margin-top:1em}[dir="ltr"] .grants-profile dd{margin-left:0}[dir="rtl"] .grants-profile dd{margin-right:0}.grants-profile--officials{margin-left:0;padding-left:0}.grants-profile--officials-item{border-left:4px var(--color-copper) solid;display:flex;flex-flow:row nowrap;justify-content:space-between;list-style:none;margin-bottom:var(--spacing-layout-s);margin-left:0;max-width:var(--webform-element-width--input-large);padding-left:var(--spacing-layout-xs);width:100%}.grants-profile--officials-item--position{font-size:var(--fontsize-heading-xs);font-weight:bold;margin-bottom:var(--spacing-layout-2-xs);margin-top:0;padding-top:0}.grants-profile--officials-edit-wrapper{text-align:right}.grants-profile--officials-edit-wrapper a{display:inline-block}.grants-profile .hel-icon--check-circle-fill{color:var(--color-success);vertical-align:middle}.grants-profile-grants-profile .tabledrag-toggle-weight-wrapper,.grants-profile-grants-profile .field-multiple-drag{display:none}.grants-profile .hds-text-input__label{display:inline-block;margin-top:0}.page--oma-asiointi__private-person .grants-profile--basicinfo{border-bottom:8px solid var(--color-copper)}.page--oma-asiointi__private-person .grants-profile--wrapper{display:grid;grid-template-columns:1fr 1fr}.page--oma-asiointi__unregistered-community .grants-profile--wrapper{display:grid;grid-template-columns:1fr 1fr}.hds-link .hel-icon{margin-right:var(--spacing-2-xs);vertical-align:bottom}.hds-link span.link-label{font-weight:bold;margin-right:var(--spacing-m)}.bold-link{font-weight:bold}div.applicant-info--from-prh,div.applicant-info--from-grants{display:grid;grid-template-columns:1fr}@media(min-width: 576px){div.applicant-info--from-prh,div.applicant-info--from-grants{grid-template-columns:1fr 1fr}}@media(min-width: 768px){div.applicant-info--from-prh,div.applicant-info--from-grants{grid-template-columns:1fr 1fr 1fr}}div.applicant-info--from-prh .form-required::after,div.applicant-info--from-grants .form-required::after{content:none}div.applicant-info--from-prh{border-bottom:2px solid var(--color-silver);margin-bottom:var(--spacing-layout-xs);padding-bottom:var(--spacing-layout-2-xs)}div.grants-handler--prefilled-field .field-prefix,.grants-profile-prh-info .field-prefix{display:block;position:absolute;right:var(--spacing-layout-s);top:0}div.grants-handler--prefilled-field .hds-text-input__input-wrapper,div.grants-handler--prefilled-field .description,.grants-profile-prh-info .hds-text-input__input-wrapper,.grants-profile-prh-info .description{display:inline-block;white-space:normal}div.grants-handler--prefilled-field .hel-icon--check-circle-fill,.grants-profile-prh-info .hel-icon--check-circle-fill{color:var(--color-success);vertical-align:middle}div.grants-handler--prefilled-field .hds-text-input__input,div.grants-handler--prefilled-field .webform-element-description,.grants-profile-prh-info .hds-text-input__input,.grants-profile-prh-info .webform-element-description{color:var(--color-black);display:block;font-size:var(--fontsize-body-m);line-height:var(--spacing-m);position:relative}div.grants-handler--prefilled-field .hds-text-input__label,.grants-profile-prh-info .hds-text-input__label{margin-bottom:0}.grants-profile--imported-section .webform-section-flex-wrapper{background-color:var(--color-silver-light);border-bottom:8px solid var(--color-engel-dark);display:block;padding-bottom:var(--spacing-2-xs);padding-left:var(--spacing-l);padding-right:var(--spacing-l);padding-top:var(--spacing-l);width:100%}.grants-profile--imported-section .webform-section-flex-wrapper h3.webform-section-title{font-size:var(--fontsize-heading-l);font-weight:400;margin-top:0;max-width:100%;padding-top:0;width:100%}.grants-profile--imported-section .webform-section-flex-wrapper .webform-section-wrapper{padding:0}.grants-profile--imported-section .webform-section-flex-wrapper .hds-text-input{margin-bottom:0}.grants-profile--imported-section .webform-section-flex-wrapper #edit-grants-profile-items-container{display:flex;flex-flow:row wrap;justify-content:space-between;margin-bottom:var(--spacing-layout-xs);margin-top:var(--spacing-layout-xs);width:100%}.grants-profile--imported-section .webform-section-flex-wrapper #edit-grants-profile-items-container>div{margin:0 var(--spacing-layout-xs) 0 0;min-width:160px}.grants-profile--imported-section .webform-section-flex-wrapper #edit-grants-profile-items-container .hds-text-input__input-wrapper{display:none}.grants-profile--imported-section .webform-section-flex-wrapper #edit-grants-profile-items-container label{font-size:var(--fontsize-body-m);font-weight:bold;margin:0}.grants-profile--imported-section .webform-section-flex-wrapper .form-item-prh-markup{border-bottom:2px solid var(--color-silver);padding-bottom:var(--spacing-layout-xs);padding-top:var(--spacing-layout-xs)}.grants-profile__local-tasks__wrapper{margin-bottom:0}.openid-connect-login-form.openid-connect-login-form{border-bottom:0;margin-bottom:0;padding-bottom:0}.grants-profile--links{display:flex;justify-content:space-between}.company-delete-confirm-form .form-actions{margin-top:var(--spacing-layout-xs)}.company-delete-confirm-form .form-submit{margin-right:var(--spacing-2-xs)}.page--oma-asiointi .main-content{margin-top:0}.page--oma-asiointi .main-content h2{margin-top:var(--spacing-m)}.hero--oma-asiointi{margin-bottom:var(--spacing-l)}.hero--oma-asiointi .container{padding-top:var(--spacing-layout-m)}.hero--oma-asiointi .hero__text-content{align-items:center;display:flex}.hero--oma-asiointi .hero__title{margin-left:0}@media(min-width: 576px){.hero--oma-asiointi .hero__title{margin-left:40px}}.hero--oma-asiointi .hel-icon{display:none}@media(min-width: 576px){.hero--oma-asiointi .hel-icon{--icon-size: 48px;display:block;flex-shrink:0}}#oma-asiointi__sent{background:var(--color-silver-light)}#oma-asiointi__sent .application-list__item{background:var(--color-white)}.oma-asiointi-block{background-color:var(--color-silver-light);padding-bottom:var(--spacing-l);padding-top:var(--spacing-l)}.oma-asiointi-block h2{margin-bottom:var(--spacing-s);margin-top:0}.oma-asiointi-block h3{font-size:var(--fontsize-heading-m);font-weight:500}.oma-asiointi-block .header{border-bottom:1px solid var(--color-silver-dark);display:flex;justify-content:space-between;padding-bottom:var(--spacing-xs)}.oma-asiointi-block .header .user,.oma-asiointi-block .header .link{font-weight:700}.oma-asiointi-block .header .link .hel-icon{vertical-align:text-top}.oma-asiointi-block--link{display:block;position:relative;text-decoration:none}.oma-asiointi-block--link::after{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--arrow-right);mask-image:var(--hel-icon--arrow-right);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));transition:transform .2s linear;bottom:var(--spacing-m);content:"";display:block;flex-shrink:0;margin-left:-4px;margin-top:var(--spacing-2-xs);position:absolute;right:var(--spacing-m)}@media(prefers-reduced-motion){.oma-asiointi-block--link::after{transition:none}}@media(min-width: 576px){.oma-asiointi-block--link::after{--icon-size: 3rem;margin-left:-8px;margin-top:var(--spacing-s)}}.oma-asiointi-block--link:focus::after,.oma-asiointi-block--link:hover::after{transform:translateX(var(--spacing-2-xs))}@media(prefers-reduced-motion){.oma-asiointi-block--link:focus::after,.oma-asiointi-block--link:hover::after{transform:none}}.oma-asiointi-block .new-message{background-color:var(--color-alert);display:inline-block;font-weight:500;padding:var(--spacing-2-xs);text-transform:uppercase}.oma-asiointi-block .new-messages-length{background-color:var(--color-black-20);border-radius:50%;display:inline-block;font-size:var(--fontsize-heading-s);height:30px;line-height:30px;margin-left:var(--spacing-m);position:relative;text-align:center;width:30px}.oma-asiointi-block .new-messages-length.has-new-messages{background-color:var(--color-alert)}@media(min-width: 768px){.oma-asiointi-block .content{display:grid;grid-gap:var(--spacing-s);grid-template-columns:1fr 1fr}}.oma-asiointi-block .submission,.oma-asiointi-block .message{background-color:var(--color-white);margin-bottom:var(--spacing-s);margin-top:var(--spacing-s);padding:var(--spacing-m)}.oma-asiointi-block .submission .submission-title,.oma-asiointi-block .submission .message-title,.oma-asiointi-block .message .submission-title,.oma-asiointi-block .message .message-title{font-size:var(--fontsize-heading-s);font-weight:500;margin-bottom:var(--spacing-2-xs);margin-top:0;text-decoration:underline}.oma-asiointi-block .submission .message-title,.oma-asiointi-block .message .message-title{margin-top:var(--spacing-s)}.oma-asiointi-block .submission:hover .submission-title,.oma-asiointi-block .submission:hover .message-title,.oma-asiointi-block .message:hover .submission-title,.oma-asiointi-block .message:hover .message-title{text-decoration:none}.oma-asiointi-block .message{padding-right:var(--spacing-5-xl)}.oma-asiointi{margin-top:var(--spacing-l)}.oma-asiointi ul{padding:0}.oma-asiointi__list{padding-bottom:var(--spacing-l);padding-top:var(--spacing-l)}.oma-asiointi__list h2{margin-bottom:var(--spacing-m);margin-top:0}.oma-asiointi #oma-asiointi__sent{padding-top:var(--spacing-s)}.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infoboxes{gap:var(--spacing-3-xl);margin:var(--spacing-2-xl) 0}@media(min-width: 768px){.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infoboxes{display:flex}}.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infobox{background-color:var(--color-info-light);flex:1;margin-bottom:var(--spacing-layout-2-xs);padding:var(--spacing-l)}@media(min-width: 768px){.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infobox{margin-bottom:0}}.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infobox:last-of-type{margin-bottom:0}.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infobox--link{display:flex;margin-top:var(--spacing-layout-2-xs)}.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infobox--link a{font-size:1.25rem}.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infobox h3{margin-top:0}.asiointirooli-block{background-color:var(--color-black);color:var(--color-white);font-weight:500;margin-bottom:16px;padding:var(--spacing-2-xs)}.asiointirooli-block a{color:var(--color-white)}.asiointirooli-block .link--switch-role,.asiointirooli-block .link--stop-mandate{color:var(--color-white);margin-left:var(--spacing-layout-s)}@media(max-width: 768px){.asiointirooli-block .link--switch-role,.asiointirooli-block .link--stop-mandate{display:block;margin-left:0}}.asiointirooli-block .link--stop-mandate::before{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--cross-circle-fill);mask-image:var(--hel-icon--cross-circle-fill);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));background-color:var(--color-white);content:"";display:inline-block;margin-right:10px;-webkit-mask-image:url('data:image/svg+xml, ');mask-image:url('data:image/svg+xml, ')}.asiointirooli-block .link--switch-role::before{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--swap-user);mask-image:var(--hel-icon--swap-user);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));background-color:var(--color-white);content:"";display:inline-block;margin-right:10px;-webkit-mask-image:url('data:image/svg+xml, ');mask-image:url('data:image/svg+xml, ')}#grants-mandate-type .form-actions{display:flex;flex-direction:column;flex-wrap:wrap;justify-content:flex-start;width:100%}@media(min-width: 576px){#grants-mandate-type .form-actions{flex-direction:row;margin-left:calc(-1*var(--spacing-m));width:calc(100% + var(--spacing-m))}}#grants-mandate-type .form-actions .hds-card--applicant-role{margin-bottom:var(--spacing-l);position:relative;width:100%}@media(min-width: 576px){#grants-mandate-type .form-actions .hds-card--applicant-role{margin-left:var(--spacing-m);width:calc(50% - var(--spacing-m))}}@media(min-width: 992px){#grants-mandate-type .form-actions .hds-card--applicant-role{width:calc(33.3333333333% - var(--spacing-m))}}#grants-mandate-type .form-actions .hds-card--applicant-role .hds-card__body{align-content:space-between;height:100%}#grants-mandate-type .form-actions .hds-card--applicant-role .hds-card--mandate-card-content{display:grid;gap:var(--spacing-m);grid-gap:var(--spacing-m)} +body{--webform-element-width--input-small: 184px;--webform-element-width--input-medium: 332px;--webform-element-width--input-large: 591px;--webform-element-width--fieldset: 714px}.hel-icon--size-xs,.hds-icon--size-xs{height:16px;width:16px}.hel-icon--size-s,.hds-icon--size-s{height:24px;width:24px}.hel-icon--size-m,.hds-icon--size-m{height:32px;width:32px}.hel-icon--size-l,.hds-icon--size-l{height:48px;width:48px}.hel-icon--size-xl,.hds-icon--size-xl{height:64px;width:64px}.hel-icon.hel-icon--pen-line{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,");mask-image:url("data:image/svg+xml;charset=utf-8,")}.hel-icon.hds-icon--company{background:var(--color-black);-webkit-mask-image:url("data:image/svg+xml;charset=utf-8, ");mask-image:url("data:image/svg+xml;charset=utf-8, ")}.hds-button--secondary:not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button){--background-color: transparent;--background-color-hover: var(--color-black-80);--background-color-focus: transparent;--background-color-hover-focus: var(--color-black-80);--background-color-disabled: transparent;--color: var(--color-black);--color-hover: var(--color-white);--color-focus: var(--color-black);--color-hover-focus: var(--color-black);--color-disabled: var(--color-black-40)}.hds-button--secondary:not(:disabled):not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button),.hds-button--primary:not(:disabled){border-color:transparent;border-color:var(--color-black, transparent)}.hds-button.hds-button--supplementary .hds-button__label{margin:0;padding:0 var(--spacing-2-xs)}.hds-button.hds-button--supplementary::after,.hds-button.hds-button--supplementary::before{display:none !important}.hds-button--supplementary:not(:disabled){--background-color-hover: rgba(0, 0, 0, 0.1);background:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}.hds-button--supplementary:not(:disabled):hover{background-color:var(--background-color-hover)}.hds-button--alert{--background-color: rgb(255, 0, 0)}a.hds-button.webform-button--delete-draft:not(:disabled){text-decoration:none}a.hds-button.webform-button--delete-draft:not(:disabled) .hds-button__label_wrapper{display:inline}a.hds-button.webform-button--delete-draft:not(:disabled) .hds-button__label{text-decoration:underline}a.hds-button.webform-button--delete-draft:not(:disabled):hover .hds-button__label{text-decoration:none}.openid-connect-login-form input[type=submit].hds-button{width:220px}.hds-button__label_wrapper{align-items:center;display:flex}.hds-button__label_wrapper:not(.hds-button)>.hds-button__label{margin:0 var(--spacing-2-xs)}.hds-link{--link-visited-color: var(--color-black);--link-color: var(--color-black)}.hds-card{--background-color: var(--color-white);--border-color: var(--color-black-90);--color: var(--color-black-90);--border-width: 2px;--padding-horizontal: var(--spacing-l);--padding-vertical: var(--spacing-m);background-color:var(--background-color);color:var(--color);padding:var(--padding-vertical) var(--padding-horizontal)}.hds-card--border{border:var(--border-width) solid var(--border-color)}.hds-card__body{display:grid;grid-gap:var(--spacing-m);gap:var(--spacing-m);margin-bottom:var(--spacing-l)}.hds-card__body:last-child{margin-bottom:0}.hds-card__heading{font-size:var(--fontsize-heading-m);font-weight:bold;line-height:var(--lineheight-m)}.hds-card__text{font-size:var(--fontsize-body-m);line-height:var(--lineheight-l)}.hds-card--applicant-role{margin-bottom:var(--spacing-l);margin-right:0;max-width:400px;width:100%}.hds-card__heading-m{font-size:var(--fontsize-heading-m);font-weight:500;letter-spacing:-0.2px;line-height:32px;margin-top:0}.grants-profile--menuitem--login,.grants-profile--menuitem--logout{align-items:center;display:flex;flex-flow:column;font-size:var(--fontsize-body-s);height:var(--spacing-xl);margin-left:var(--spacing-2-xs);margin-right:var(--spacing-2-xs);position:relative;text-align:center;width:var(--spacing-xl)}.grants-profile--menuitem--login .hel-icon,.grants-profile--menuitem--logout .hel-icon{display:block;margin:auto}.grants-profile--menuitem--login-triggertext,.grants-profile--menuitem--logout-triggertext{clip:rect(1px, 1px, 1px, 1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);display:block;max-height:1px;max-width:1px;opacity:0;overflow:hidden;position:absolute;white-space:nowrap}.block--grants-profile--menuitem{align-items:center;display:flex;grid-area:brand;z-index:2}.block--branding{flex-grow:10}.grants-frontpage-info-block{margin-bottom:var(--spacing-layout-xl)}.grants-profile--menuitem{height:var(--spacing-m);margin-left:var(--spacing-2-xs);margin-right:var(--spacing-2-xs);position:relative;width:var(--spacing-m)}@media(min-width: 768px){.grants-profile--menuitem{height:var(--spacing-2-xl);width:var(--spacing-2-xl)}}.grants-profile--menuitem a{text-decoration:none}.grants-profile--menuitem--notifications{background-color:var(--color-error);border:2px var(--color-white) solid;border-radius:50%;color:var(--color-white);font-size:var(--fontsize-body-s);font-weight:bold;height:var(--spacing-xs) 1.25;line-height:var(--spacing-layout-2-xs);position:absolute;right:-5px;text-align:center;top:-5px;width:var(--spacing-xs) 1.25;z-index:2}.grants-profile--menuitem--initials{border-radius:50%;font-weight:bold;height:var(--spacing-m);line-height:var(--spacing-m);text-align:center;vertical-align:middle;width:var(--spacing-m)}@media(min-width: 768px){.grants-profile--menuitem--initials{height:var(--spacing-2-xl);line-height:var(--spacing-2-xl);width:var(--spacing-2-xl)}}.grants-profile--menuitem--initials:hover,.grants-profile--menuitem--initials:active,.grants-profile--menuitem--initials:focus{text-decoration:underline}.grants-profile--menuitem--initials-colorscheme-2{background-color:var(--color-bus);color:var(--color-white)}.grants-profile--menuitem--initials-colorscheme-1{background-color:var(--color-engel);color:var(--color-black)}.grants-profile--menuitem--initials-colorscheme-0{background-color:var(--color-tram);color:var(--color-white)}.sidebar-important-links{margin-top:var(--spacing-2-xl)}.sidebar-important-links .sidebar-text .sidebar-text__text-content>p{padding:var(--spacing-s) var(--spacing-m)}.block--service-page-banner{background-color:var(--color-engel);margin-top:var(--spacing-layout-s);padding:var(--spacing-layout-s)}.block--service-page-banner h2{margin-top:0}.block--service-page-banner .hds-icon{margin-bottom:var(--spacing-layout-s)}.hds-button.service-page-sidebar-link{background-color:var(--hdbt-color-palette--secondary);padding:var(--spacing-xs)}.hds-button.service-page-sidebar-link:hover{color:var(--color-black)}.terms_block{padding-bottom:var(--spacing-4-xl)}#block-servicepageauthblock h2,#block-servicepageanonblock h2{--line-height: 1.3;font-size:1.25rem;font-weight:500;line-height:var(--line-height)}@media(min-width: 992px){#block-servicepageauthblock h2,#block-servicepageanonblock h2{--line-height: 1.1666666667;font-size:1.5rem;font-weight:500}}#block-servicepageauthblock .hds-button,#block-servicepageanonblock .hds-button{margin-top:var(--spacing-m)}.grants-service-page-block{background-color:var(--color-alert-light);margin-top:var(--spacing-m);padding:var(--spacing-m)}.grants-service-page-block h3{font-size:var(--fontsize-heading-s);margin-top:0}.grants-service-page-block .hel-icon{vertical-align:text-bottom}.grants-service-page-block--auth{background-color:var(--color-info-light)}.hel-icon.hel-icon--swap-user{-webkit-mask-image:url('data:image/svg+xml, ');mask-image:url('data:image/svg+xml, ')}.nav-toggle-dropdown--profile .profile__information{background-color:var(--color-silver-light)}.nav-toggle-dropdown--profile .profile__full-name{font-weight:bold}.nav-toggle-dropdown--profile .grants-profile--menuitem--mandate,.nav-toggle-dropdown--profile .grants-profile--menuitem--switch-role{--line-height: 1.5555555556;font-size:1.125rem;font-weight:400;line-height:var(--line-height);border-top:1px solid #ccc;border-bottom:1px solid #ccc;display:block;font-weight:normal;padding:16px;text-decoration:none;width:100%}@media(min-width: 992px){.nav-toggle-dropdown--profile .grants-profile--menuitem--mandate,.nav-toggle-dropdown--profile .grants-profile--menuitem--switch-role{border-bottom:none}}.nav-toggle-dropdown--profile .grants-profile--menuitem--mandate:hover,.nav-toggle-dropdown--profile .grants-profile--menuitem--switch-role:hover{text-decoration:underline}.nav-toggle-dropdown--profile .grants-profile--menuitem--mandate:focus,.nav-toggle-dropdown--profile .grants-profile--menuitem--switch-role:focus{outline:3px solid #000;outline-offset:-3px}.application-timeout-message{display:none;padding-left:16px;padding-left:var(--spacing-s, 16px);position:fixed;right:0;top:50%;z-index:100}.application-timeout-message.slide-in{animation:slide-in-right .5s forwards ease;display:block}.application-timeout-message .close-application-timeout-message{cursor:pointer;font-size:1.25rem;position:absolute;right:1.25rem}@keyframes slide-in-right{from{right:-500px}to{right:1.25rem}}.view_application_search_search_api .main-content{margin-top:0}.view_application_search_search_api .search-result-amount--wrapper{align-items:center;display:flex}.view_application_search_search_api .search-result-amount--wrapper p{margin-top:0}.view_application_search_search_api select.search-result-amount{border:1px solid var(--color-black-50);margin-left:var(--spacing-l);margin-right:var(--spacing-2-xs)}.view_application_search_search_api .search-filter-button{background-color:var(--color-black);border-radius:180px;border:0;color:var(--color-white);display:inline-block;margin:0 var(--spacing-2-xs) var(--spacing-2-xs) 0;padding:var(--spacing-2-xs) var(--spacing-xs)}.view_application_search_search_api .search-filter-button:focus{--focus-outline-color: #000000;box-shadow:none;outline:3px solid var(--focus-outline-color);outline:var(--outline-width, 3px) solid var(--focus-outline-color);outline-offset:2px;outline-offset:var(--outline-gutter, 2px)}.view_application_search_search_api .search-filter-button span{vertical-align:middle}.view_application_search_search_api .search-filter-button span.hel-icon:hover{cursor:pointer}.view-application-search-search-api .main-content{margin-top:var(--spacing-layout-s)}.view-application-search-search-api .main-content .view-header{align-items:center;display:flex;margin-bottom:var(--spacing-layout-s)}.application_search--link{display:block;height:100%;padding-bottom:var(--spacing-m);position:relative;text-decoration:none}.application_search--link::after{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--arrow-right);mask-image:var(--hel-icon--arrow-right);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));transition:transform .2s linear;bottom:var(--spacing-s);content:"";display:block;flex-shrink:0;left:var(--spacing-m);margin-left:-4px;margin-top:8px;position:absolute}@media(prefers-reduced-motion){.application_search--link::after{transition:none}}@media(min-width: 576px){.application_search--link::after{--icon-size: 3rem;margin-left:-8px;margin-top:16px}}.application_search--link:focus h3,.application_search--link:hover h3{text-decoration:none}.application_search--link:focus::after,.application_search--link:hover::after{transform:translateX(8px)}@media(prefers-reduced-motion){.application_search--link:focus::after,.application_search--link:hover::after{transform:none}}.application_search--filter-wrapper{background:var(--color-black-5)}.application_search--filter-wrapper h2{font-size:var(--fontsize-heading-m);margin-bottom:var(--spacing-layout-s);margin-top:var(--spacing-layout-s)}.application_search--filter-wrapper form{align-items:center;border-bottom:2px solid var(--color-black-20);display:flex;flex-flow:row wrap;gap:var(--spacing-s);justify-content:space-between;margin-bottom:var(--spacing-layout-s);padding-bottom:var(--spacing-layout-s)}.application_search--filter-wrapper form .form-item{margin-bottom:0;min-width:-moz-fit-content;min-width:fit-content;width:calc((100% - var(--spacing-s) - var(--spacing-s))/3)}.application_search--filter-wrapper form .form-item label{color:var(--label-color-default);font-size:var(--fontsize-body-m);font-weight:500;margin-bottom:var(--spacing-3-xs)}.application_search--filter-wrapper form .form-item .grant-applications--select-wrapper{min-width:100%;width:100%}.application_search--filter-wrapper form .hds-text-input:first-child{max-width:none;width:100%}.application_search--filter-wrapper form .hds-text-input:first-child input{width:100%}.application_search--filter-wrapper form .form-actions{align-items:center;display:flex;gap:16px;order:6;padding-top:var(--spacing-m);width:100%}@media(min-width: 768px){.application_search--filter-wrapper form .form-actions{width:17%}}.application_search--filter-wrapper form .form-actions input{min-width:250px;width:100%}.application_search--filter-wrapper form .form-item-items-per-page{display:none}.application_search--filter-wrapper form .form-item-kohderyhma{order:1}.application_search--filter-wrapper form .form-item-avustuslaji{order:2}.application_search--filter-wrapper form .form-item-hakija{order:3}.application_search--filter-wrapper form .form-item-search{max-width:100%;order:4;width:50%}.application_search--filter-wrapper form .form-item-application-open{page-break-before:left;-moz-column-break-before:left;break-before:left;display:block;margin-top:var(--spacing-m);order:5;width:30%}.application_search--filter-wrapper form [data-drupal-selector=edit-reset]{background-color:rgba(0,0,0,0);border:0;color:var(--color-black)}.application_search--filter-wrapper .hds-koros svg pattern{color:var(--color-black-5)}.application_search--filter-wrapper .hero .hero__container{padding-bottom:var(--spacing-m)}.application_search--filters{padding-bottom:var(--spacing-layout-m);padding-top:0}.application_search--rows{display:flex;flex-direction:column;flex-wrap:wrap;justify-content:flex-start;width:100%}@media(min-width: 576px){.application_search--rows{flex-direction:row;margin-left:calc(-1*var(--spacing-m));width:calc(100% + var(--spacing-m))}}.application_search--row{box-shadow:1px 2px 4px 0 rgba(0,0,0,.5);margin-bottom:var(--spacing-l);position:relative;width:100%}@media(min-width: 576px){.application_search--row{margin-left:var(--spacing-m);width:calc(50% - var(--spacing-m))}}@media(min-width: 992px){.application_search--row{width:calc(33.3333333333% - var(--spacing-m))}}.application_search--row h3{font-size:var(--fontsize-heading-m);margin-top:var(--spacing-xs)}.application_search--row .views-field-search-api-excerpt{height:auto;overflow:auto;word-break:normal}.application_search--row .views-field{padding:var(--spacing-xs) var(--spacing-m)}.application_search--row .views-field-field-target-group{padding:0}.application_search--row .views-field-field-avustuslaji{padding:var(--spacing-xs) var(--spacing-m) var(--spacing-layout-m) var(--spacing-m)}.application_search--row .views-field-field-avustuslaji .tag_avustuslaji{background:var(--color-black);border-radius:var(--spacing-m);color:var(--color-white);display:inline-block;margin-bottom:var(--spacing-2-xs);padding:var(--spacing-3-xs) var(--spacing-xs)}.application_search--row .views-field-field-application-period .field-content{align-items:center;display:flex;gap:var(--spacing-s);position:relative}.application_search--row .views-field-field-application-period .field-content span{display:block}.application_search--row .tag_target_group{background:var(--color-black-20);color:var(--color-black);font-size:var(--fontsize-body-s);font-weight:bold;padding:var(--spacing-m);text-align:center;text-transform:uppercase;width:100%}.application_search--row .tag_target_group_12{background:var(--color-brick-medium-light)}.application_search--row .tag_target_group_20{background:var(--color-copper)}.application_search--row .tag_target_group_21{background:var(--color-metro-medium-light)}.application_search--row .tag_target_group_22{background:var(--color-suomenlinna-medium-light)}.application_search--row .tag_target_group_23{background:var(--color-engel)}.application_search--row .tag_target_group_24{background:var(--color-bus-medium-light)}.application_search--row .tag_target_group_25{background:var(--color-coat-of-arms-medium-light)}.application_search--row .tag_target_group_26{background:var(--color-gold-medium-light)}.application_search--row .tag_target_group_27{background:var(--color-tram-medium-light)}.application_search--row .tag_target_group_28{background:var(--color-summer-light)}.application_search--row .tag_target_group_29{background:var(--color-fog)}.application_search--row .tag_target_group_30{background:var(--color-copper-light)}.application_search--row .tag_target_group_31{background:var(--color-gold)}.view-ukk .view-filters{display:none}.view-ukk .ukk_categories{display:block;margin:var(--spacing-xl) 0;padding:0}.view-ukk .ukk_categories li{display:inline-block;list-style:none;margin:var(--spacing-m) var(--spacing-s) 0 0;padding:0}.view-ukk .hero .hero__text-content{max-width:100%}.view-ukk #edit-field-category-target-id{display:flex}.view-ukk #edit-field-category-target-id .hds-radio-button:first-of-type{margin-top:var(--spacing-2-xs)}.view-ukk #edit-field-category-target-id .hds-radio-button .hds-radio-button__input:checked+.hds-radio-button__label{background:var(--color-black);border-radius:var(--spacing-m);color:var(--color-white);padding:var(--spacing-2-xs) var(--spacing-s)}.view-ukk #edit-field-category-target-id .hds-radio-button__label{padding:var(--spacing-2-xs) var(--spacing-s)}.view-ukk #edit-field-category-target-id .hds-radio-button__label::before,.view-ukk #edit-field-category-target-id .hds-radio-button__label::after{display:none}.view-ukk .views-exposed-form fieldset{margin-bottom:0}.view-ukk .views-exposed-form .form-submit{margin-bottom:var(--spacing-l)}.view-ukk .category{background:var(--color-black);border-radius:var(--spacing-m);color:var(--color-white);display:inline-block;padding:var(--spacing-2-xs) var(--spacing-s);text-decoration:none}.view-ukk .category-unselected{background:var(--color-black-20);color:var(--color-black)}.page--select-applicant-role{background-color:var(--color-black-5)}.page--select-applicant-role body{background-color:var(--color-black-5)}.page--select-applicant-role .layout-main-wrapper{background-color:var(--color-black-5)}.page--select-applicant-role .main-content{margin-top:var(--spacing-l)}.page--select-applicant-role h1{margin-top:var(--spacing-l)}.page--select-applicant-role p{margin-bottom:var(--spacing-m)}.node--type-service .errand-service__channels .service-channel__links a[href^="https://avustukset.hel.fi"]{display:none}.node--type-service .service-channel__info p:first-of-type{margin-top:0}.node--type-service .service-channel--mail{display:none}#block-servicepageauthblock-2,#block-servicepageanonblock-2,#block-grantspreviewlink-2{display:none}@media(max-width: 767.9px){#block-servicepageauthblock-2,#block-servicepageanonblock-2,#block-grantspreviewlink-2{display:block;margin:var(--spacing-s)}}@media(max-width: 991.9px){#block-servicepageauthblock-2,#block-servicepageanonblock-2,#block-grantspreviewlink-2{display:block;margin:var(--spacing-l)}}#block-servicepageauthblock-2>.grants-service-page-block>*,#block-servicepageanonblock-2>.grants-service-page-block>*,#block-grantspreviewlink-2>.grants-service-page-block>*{margin:var(--spacing-2-xs) 0 var(--spacing-2-xs) var(--spacing-2-xs)}@media(max-width: 991.9px){#block-servicepageauthblock-2 .node--type-service a.hds-button[href*=uusi-hakemus],#block-servicepageanonblock-2 .node--type-service a.hds-button[href*=uusi-hakemus],#block-grantspreviewlink-2 .node--type-service a.hds-button[href*=uusi-hakemus]{display:none}}.user-login__text-container{background:var(--color-white);max-width:500px;padding:var(--spacing-m)}.user-login__text-container p:first-of-type{margin-top:0}.tabs{--tablist-border-color: var(--color-black-20);--tablist-border-size: 1px;--tab-color: var(--color-black);--tab-font-size: var(--fontsize-body-m);--tab-height: 48px;--tab-min-width: 148px;--tab-spacing: var(--spacing-s);--tab-active-border-size: 5px;--tab-active-border-color: var(--color-black);--tab-focus-outline-size: 2px;--tab-focus-outline-color: var(--color-coat-of-arms);display:flex;flex-flow:row wrap}.tabs--tablist{box-sizing:border-box;flex-grow:1;margin-bottom:-1px;overflow-x:hidden;position:relative;width:100%}.tabs--content-wrapper{width:100%}.tabs--content-wrapper .container{padding-top:1px}.tabs [role=tablist]{box-sizing:border-box;list-style:none;margin:0;padding:var(--tab-focus-outline-size) 0;white-space:nowrap}.tabs [role=tab]{background:rgba(0,0,0,0);border:0;cursor:pointer;display:inline-block;margin:0;outline:none;padding:0}.tabs [role=tab] span{align-items:center;box-sizing:border-box;color:var(--tab-color);display:flex;font-size:var(--tab-font-size);height:var(--tab-height);justify-content:center;margin:0;min-width:var(--tab-min-width);padding:0 var(--tab-spacing);pointer-events:none;position:relative}.tabs [role=tab] span::before{background:var(--tablist-border-color);bottom:0;content:"";height:var(--tablist-border-size);position:absolute;width:100%;z-index:100}.tabs [role=tab] span:hover::before,.tabs [role=tab] span:focus::before,.tabs [role=tab][aria-selected=true] span::before{background-color:var(--tab-active-border-color);bottom:0;content:"";height:var(--tab-active-border-size);position:absolute;width:100%;z-index:100}.tabs [role=tabpanel].is-hidden{display:none}.node--form-page .list-of-links{margin-left:0;margin-top:0;width:100%}@media(min-width: 768px){.node--form-page .list-of-links{margin-top:0}}.node--form-page .list-of-links>.container{padding-top:0}.node--form-page .list-of-links .list-of-links__title{border-top:2px solid var(--color-black-20);margin:0 0 var(--spacing-layout-xl)}@media(min-width: 576px){.node--form-page .list-of-links .list-of-links__container{width:calc(100% - var(--spacing-layout-xl))}}@media(min-width: 768px){.node--form-page .list-of-links .list-of-links__container{width:100%}}.node--form-page .list-of-links .list-of-links__content{height:auto;margin-top:0}@media(min-width: 768px){.node--form-page .list-of-links .list-of-links__content{display:grid;grid-template-columns:auto auto auto;margin:0 var(--spacing-m) 0 0}}.node--form-page .list-of-links .list-of-links__item{align-self:stretch;border-left:4px solid var(--color-copper);margin-right:-4px;padding-left:var(--spacing-m);padding-right:var(--spacing-m)}.list-of-links--without-image .list-of-links__item .list-of-links__item__desc{color:var(--color-black-90);font-size:var(--fontsize-body-m)}.list-of-links--without-image .list-of-links__item .list-of-links__item__title{font-size:var(--fontsize-heading-m)}.js-form-type-webform-custom-composite{--border-width: 2px;--outline-width: 3px;--input-height: 56px;--textarea-height: 149px;--icon-size: var(--spacing-m);--helper-color-default: var(--color-black-60);--helper-color-invalid: var(--color-error);--icon-color-invalid: var(--color-error);--input-background-default: var(--color-white);--input-background-disabled: var(--color-black-10);--input-border-color-default: var(--color-black-50);--input-border-color-hover: var(--color-black-90);--input-border-color-focus: var(--color-black-90);--input-border-color-invalid: var(--color-error);--input-border-color-disabled: var(--color-black-10);--input-color-default: var(--color-black-90);--input-color-disabled: var(--color-black-40);--label-color-default: var(--color-black-90);--label-color-invalid: var(--color-black-90);--placeholder-color: var(--color-black-60);--focus-outline-color: var(--color-coat-of-arms)}.js-form-type-webform-custom-composite a.tabledrag-handle .handle{height:24px;width:24px}.js-form-type-webform-custom-composite input.form-number{background-color:var(--input-background-default);border:var(--border-width) solid var(--input-border-color-default);box-sizing:border-box;color:var(--input-color-default);font-size:1.125em;height:var(--input-height);line-height:normal;padding:0 var(--spacing-s);width:100%}.js-form-type-webform-custom-composite table{border-collapse:collapse;border-spacing:0;margin-bottom:var(--spacing-m)}.js-form-type-webform-custom-composite table td{border-bottom:2px var(--color-black-20) solid;border-top:2px var(--color-black-20) solid;padding-left:var(--spacing-m);padding-top:var(--spacing-m)}@media(max-width: 768px){.js-form-type-webform-custom-composite table td{border:2px var(--color-black-20) solid}}.js-form-type-webform-custom-composite table td.webform-multiple-table--operations{border-bottom:2px var(--color-black-20) solid;border-top:2px var(--color-black-20) solid;padding-left:var(--spacing-m);padding-top:var(--spacing-m)}@media(max-width: 768px){.js-form-type-webform-custom-composite table td.webform-multiple-table--operations{background:var(--color-white);border:2px var(--color-black-20) solid;padding:10px 5px 5px}}.js-form-type-webform-custom-composite table td:first-child{border-left:2px var(--color-black-20) solid}.js-form-type-webform-custom-composite table td:last-child{border-right:2px var(--color-black-20) solid;padding:var(--spacing-s)}@media(min-width: 768px){.js-form-type-webform-custom-composite table td:last-child{min-width:400px;padding:var(--spacing-s) var(--spacing-m)}}div.ui-widget.ui-datepicker{padding:var(--spacing-2-xs)}div.ui-widget.ui-datepicker .ui-datepicker-header span.ui-icon{margin-left:-8px;margin-top:-8px;-webkit-mask-image:none;mask-image:none;transform:none}div.ui-widget.ui-datepicker .ui-datepicker-calendar{border:0;display:table;margin:0;max-width:100%}div.ui-widget.ui-datepicker .ui-datepicker-calendar th,div.ui-widget.ui-datepicker .ui-datepicker-calendar td{min-width:auto}details.accordion{--background-color: var(--color-white);--border-color: var(--color-black-60);--padding-horizontal: var(--spacing-m);--padding-vertical: var(--spacing-m);--header-font-color: var(--color-black-90);--header-font-size: var(--fontsize-heading-m);--header-line-height: var(--lineheight-m);--button-size: 28px;--header-focus-outline-color: var(--color-coat-of-arms);--content-font-color: var(--color-black-90);--content-font-size: var(--fontsize-body-m);--content-line-height: var(--lineheight-l);border-bottom:1px solid var(--border-color)}details.accordion .accordion_content{padding-bottom:var(--padding-vertical)}details.accordion[open] .accordion_heading_container span.hel-icon{transform:rotate(180deg)}.accordion_header{align-items:center;color:var(--header-font-color);display:flex;font-size:var(--header-font-size);font-weight:700;justify-content:space-between;line-height:var(--header-line-height);list-style:none;padding-bottom:var(--padding-vertical);padding-top:var(--padding-vertical);position:relative}.accordion_heading_container{align-items:center;box-sizing:border-box;cursor:pointer;display:grid;grid-template-columns:auto calc(var(--button-size));width:100%}.accordion_heading_container span.hel-icon{height:var(--button-size) !important;width:var(--button-size) !important}.accordion_heading_container span.hel-icon{border:2px solid rgba(0,0,0,0);box-sizing:border-box;margin:auto}.webform-element-description{margin-top:8px}.webform-element-help{background:var(--color-white);border:2px solid rgba(0,0,0,0);color:var(--hdbt-color-black);height:var(--spacing-layout-xs);margin-right:4px;padding:0;position:absolute;right:0;top:-3px;width:var(--spacing-layout-xs);z-index:10}div[data-tippy-root]{width:350px}.tippy-box{background-color:var(--color-black-5);border-left:var(--spacing-xs) var(--color-coat-of-arms) solid;border-radius:0;color:var(--hdbt-color-black);padding:var(--spacing-s)}.tippy-box .webform-element-help--content{white-space:normal}.tippy-box .webform-element-help--content a:link,.tippy-box .webform-element-help--content a:visited,.tippy-box .webform-element-help--content a:active,.tippy-box .webform-element-help--content a:hover{color:var(--hdbt-color-black)}.tippy-arrow{color:var(--color-black-5)}.webform-element-help--wrapper-short{max-width:-moz-fit-content;max-width:fit-content}.webform-element-help-container--title{--border-width: 2px;--outline-width: 3px;--input-height: 56px;--textarea-height: 149px;--icon-size: var(--spacing-m)}fieldset.grants-fieldset{padding:var(--spacing-s)}@media(min-width: 768px){fieldset.grants-fieldset{min-width:400px;padding:var(--spacing-s) var(--spacing-m)}}fieldset.grants-fieldset .fieldset-wrapper{align-items:flex-end;display:flex;flex-wrap:wrap;gap:0 var(--spacing-layout-2-xs)}fieldset.grants-fieldset .fieldset-wrapper .form-item--error-message{grid-column:1}fieldset.grants-fieldset-short{max-width:var(--webform-element-width--input-large)}fieldset.grants-fieldset-medium{max-width:var(--webform-element-width--fieldset)}fieldset.grants-fieldset-medium .fieldset-wrapper{justify-content:center}fieldset.premises-composite--wrapper.fieldgroup,fieldset.rented-premise-composite--wrapper.fieldgroup,.community_officials_wrapper fieldset.fieldgroup,fieldset.grants-budget-other-cost--wrapper.fieldgroup,fieldset.grants-budget-other-income--wrapper.fieldgroup,fieldset.place-of-operation-composite--wrapper.fieldgroup,fieldset.rent-income-composite--wrapper.fieldgroup,fieldset.rent-cost-composite--wrapper.fieldgroup,fieldset.club-section-composite--wrapper.fieldgroup,fieldset.members-composite--wrapper.fieldgroup,fieldset.orienteering-map-composite--wrapper,.form-item-muu-liite fieldset.grants-attachments--wrapper.fieldgroup{border-width:2px;margin-top:var(--spacing-layout-2-xs);max-width:100%;padding:var(--spacing-s);width:100%}@media(min-width: 768px){fieldset.premises-composite--wrapper.fieldgroup,fieldset.rented-premise-composite--wrapper.fieldgroup,.community_officials_wrapper fieldset.fieldgroup,fieldset.grants-budget-other-cost--wrapper.fieldgroup,fieldset.grants-budget-other-income--wrapper.fieldgroup,fieldset.place-of-operation-composite--wrapper.fieldgroup,fieldset.rent-income-composite--wrapper.fieldgroup,fieldset.rent-cost-composite--wrapper.fieldgroup,fieldset.club-section-composite--wrapper.fieldgroup,fieldset.members-composite--wrapper.fieldgroup,fieldset.orienteering-map-composite--wrapper,.form-item-muu-liite fieldset.grants-attachments--wrapper.fieldgroup{min-width:400px;padding:var(--spacing-s) var(--spacing-m)}}fieldset.premises-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.rented-premise-composite--wrapper.fieldgroup legend>span.visually-hidden,.community_officials_wrapper fieldset.fieldgroup legend>span.visually-hidden,fieldset.grants-budget-other-cost--wrapper.fieldgroup legend>span.visually-hidden,fieldset.grants-budget-other-income--wrapper.fieldgroup legend>span.visually-hidden,fieldset.place-of-operation-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.rent-income-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.rent-cost-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.club-section-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.members-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.orienteering-map-composite--wrapper legend>span.visually-hidden,.form-item-muu-liite fieldset.grants-attachments--wrapper.fieldgroup legend>span.visually-hidden{background:#fff;-webkit-clip-path:initial;clip-path:initial;clip:auto;clip:initial;height:auto;margin-left:calc(var(--spacing-2-xs)*-1);left:auto;overflow:visible;padding:0 var(--spacing-2-xs);top:-12px;width:-moz-max-content;width:max-content}fieldset.premises-composite--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.rented-premise-composite--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],.community_officials_wrapper fieldset.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.grants-budget-other-cost--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.grants-budget-other-income--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.place-of-operation-composite--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.rent-income-composite--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.rent-cost-composite--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.club-section-composite--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.members-composite--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)],fieldset.orienteering-map-composite--wrapper legend>span.visually-hidden[\:has\(button.webform-element-help\)],.form-item-muu-liite fieldset.grants-attachments--wrapper.fieldgroup legend>span.visually-hidden[\:has\(button.webform-element-help\)]{padding-right:var(--spacing-xl)}fieldset.premises-composite--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.rented-premise-composite--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),.community_officials_wrapper fieldset.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.grants-budget-other-cost--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.grants-budget-other-income--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.place-of-operation-composite--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.rent-income-composite--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.rent-cost-composite--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.club-section-composite--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.members-composite--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help),fieldset.orienteering-map-composite--wrapper legend>span.visually-hidden:has(button.webform-element-help),.form-item-muu-liite fieldset.grants-attachments--wrapper.fieldgroup legend>span.visually-hidden:has(button.webform-element-help){padding-right:var(--spacing-xl)}@media(min-width: 768px){fieldset.premises-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.rented-premise-composite--wrapper.fieldgroup legend>span.visually-hidden,.community_officials_wrapper fieldset.fieldgroup legend>span.visually-hidden,fieldset.grants-budget-other-cost--wrapper.fieldgroup legend>span.visually-hidden,fieldset.grants-budget-other-income--wrapper.fieldgroup legend>span.visually-hidden,fieldset.place-of-operation-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.rent-income-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.rent-cost-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.club-section-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.members-composite--wrapper.fieldgroup legend>span.visually-hidden,fieldset.orienteering-map-composite--wrapper legend>span.visually-hidden,.form-item-muu-liite fieldset.grants-attachments--wrapper.fieldgroup legend>span.visually-hidden{left:auto}}.form-item-muu-liite fieldset.grants-attachments--wrapper{margin-bottom:0}fieldset.webform-composite-hidden-title .fieldset-wrapper>.form-item:last-child{margin-bottom:var(--spacing-layout-xs)}.js-form-type-webform-table table{width:100%}.js-form-type-webform-table th{text-align:left}.js-form-type-webform-table td{vertical-align:middle}.js-form-type-webform-table td>div{height:auto;margin-bottom:0}.js-form-type-webform-table td>div label{margin:-1px}.js-form-type-webform-table .hds-text-input label{border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-item{margin-bottom:var(--spacing-layout-xs);position:relative}.form-item input[type=date],.form-item input[type=time]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--input-background-default);border:var(--border-width) solid var(--input-border-color-default);box-sizing:border-box;color:var(--input-color-default);font-size:1.125em;height:var(--input-height);line-height:normal;padding:0 var(--spacing-s);width:100%;will-change:transform,box-shadow}.webform-section{padding-bottom:var(--spacing-layout-2-xs)}.webform-section table:first-of-type{margin-top:0}.form-type-webform-multiple .webform-multiple-table table{max-width:100%;width:100%}@media(min-width: 768px){.form-type-webform-multiple .webform-multiple-table table{width:auto}}.hds-text-input{max-width:-moz-fit-content;max-width:fit-content;width:100%}.webform-section-grid-wrapper{display:grid;grid-template-columns:1fr}@media(min-width: 768px){.webform-section-grid-wrapper{grid-row-gap:var(--spacing-xl);grid-template-columns:1fr 2fr}}.webform-section-grid-wrapper>dt.webform-section-title{color:var(--hdbt-color-black);display:block;flex-shrink:0;font-size:var(--fontsize-heading-s);font-weight:500;-webkit-hyphens:none;hyphens:none;line-height:1;margin-bottom:var(--spacing-3-xs);margin-top:0;padding-right:var(--spacing-2-xl);width:100%}.webform-section-grid-wrapper .webform-section-wrapper{margin-bottom:var(--spacing-layout-xs);padding-left:var(--spacing-2-xl)}@media(min-width: 768px){.webform-section-grid-wrapper .webform-section-wrapper{margin-bottom:0;padding-left:0}}fieldset input[type=button]{margin-top:var(--spacing-m)}.webform-section-wrapper>.description{margin-bottom:var(--spacing-layout-xs)}.grants__page-header{margin-bottom:var(--spacing-layout-l);font-size:2rem}@media(min-width: 768px){.grants__page-header{font-size:3rem}}.webform-section-flex-wrapper{display:flex;flex-flow:row wrap;width:100%;justify-content:left}@media(min-width: 768px){.webform-section-flex-wrapper{flex-flow:row nowrap}.webform-section-flex-wrapper h3+*>*:first-child>label:first-of-type,.webform-section-flex-wrapper h3+*>*:first-child>*:first-child>label:first-of-type{margin-top:var(--spacing-2-xs);padding-top:0}.webform-section-flex-wrapper h3+*>*:first-child>p{line-height:normal;line-height:initial;margin-top:var(--spacing-2-xs)}.webform-section-flex-wrapper h3+*>*:first-child>h4{line-height:normal;line-height:initial;margin-top:var(--spacing-m)}}.webform-section-flex-wrapper .webform-element-help-container--title{position:relative}.webform-section-flex-wrapper>h2.webform-section-title,.webform-section-flex-wrapper>h3.webform-section-title,.webform-section-flex-wrapper>h4.webform-section-title,.webform-section-flex-wrapper>dt.webform-section-title{color:var(--hdbt-color-black);display:block;flex-shrink:0;font-size:24px;font-weight:500;-webkit-hyphens:manual;hyphens:manual;margin-bottom:var(--spacing-3-xs);margin-top:0;padding-right:var(--spacing-2-xl);width:100%}@media(min-width: 768px){.webform-section-flex-wrapper>h2.webform-section-title,.webform-section-flex-wrapper>h3.webform-section-title,.webform-section-flex-wrapper>h4.webform-section-title,.webform-section-flex-wrapper>dt.webform-section-title{font-size:32px;max-width:350px;width:30%}}.webform-section-flex-wrapper h4{font-size:var(--fontsize-heading-m);line-height:38px}.webform-section-flex-wrapper>.webform-section-wrapper{--line-height: 1.5;font-size:var(--fontsize-body-m);width:100%}@media(min-width: 768px){.webform-section-flex-wrapper>.webform-section-wrapper{padding-left:var(--spacing-2-xl)}}.webform-section-flex-wrapper .form-required::after{content:"*";display:inline}.webform-section-flex-wrapper legend,.webform-section-flex-wrapper label{display:block;font-size:var(--fontsize-body-m);font-weight:500;margin-bottom:var(--spacing-2-xs);max-width:-moz-fit-content;max-width:fit-content;position:relative}.webform-section-flex-wrapper legend{padding:0 var(--spacing-2-xs);margin-left:calc(var(--spacing-2-xs)*-1);left:auto}.webform-section-flex-wrapper legend[\:has\(button.webform-element-help\)],.webform-section-flex-wrapper label[\:has\(button.webform-element-help\)]{padding-right:var(--spacing-xl)}.webform-section-flex-wrapper legend:has(button.webform-element-help),.webform-section-flex-wrapper label:has(button.webform-element-help){padding-right:var(--spacing-xl)}.webform-section-flex-wrapper fieldset legend>span[\:has\(button.webform-element-help\)]{padding-right:var(--spacing-xl)}.webform-section-flex-wrapper fieldset legend>span:has(button.webform-element-help){padding-right:var(--spacing-xl)}.webform-section-flex-wrapper fieldset legend>span.fieldset-legend[\:has\(button.webform-element-help\)],.webform-section-flex-wrapper fieldset.fieldgroup legend>span[\:has\(button.webform-element-help\)]:not(.visually-hidden.fieldset-legend){padding-right:var(--spacing-l)}.webform-section-flex-wrapper fieldset legend>span.fieldset-legend:has(button.webform-element-help),.webform-section-flex-wrapper fieldset.fieldgroup legend>span:has(button.webform-element-help):not(.visually-hidden.fieldset-legend){padding-right:var(--spacing-l)}.webform-section-flex-wrapper fieldset legend>span.fieldset-legend[\:has\(button.webform-element-help\)],.webform-section-flex-wrapper fieldset.fieldgroup legend span.fieldset-legend:not(.visually-hidden)[\:has\(button.webform-element-help\)]{padding-right:0}.webform-section-flex-wrapper fieldset legend>span.fieldset-legend:has(button.webform-element-help),.webform-section-flex-wrapper fieldset.fieldgroup legend span.fieldset-legend:not(.visually-hidden):has(button.webform-element-help){padding-right:0}.webform-section-flex-wrapper label.hds-radio-button__label{font-weight:normal}.webform-section-flex-wrapper .checkboxes--wrapper label{font-weight:normal}.webform-section-flex-wrapper .js-form-type-textarea .hds-text-input__input-wrapper{display:block}.webform-section-flex-wrapper .has-error,.webform-section-flex-wrapper .grant-applications--select-wrapper[\:has\(.has-error\)]{border-color:var(--color-error)}.webform-section-flex-wrapper .has-error,.webform-section-flex-wrapper .grant-applications--select-wrapper:has(.has-error){border-color:var(--color-error)}form .hds-text-input__input-wrapper,.hds-text-input__input-wrapper{flex-flow:row wrap}form .hds-text-input__input-wrapper .text-count-wrapper,.hds-text-input__input-wrapper .text-count-wrapper{flex-basis:100%}form .hds-text-input__input-wrapper input.webform--small,form .hds-text-input__input-wrapper textarea.webform--small,.hds-text-input__input-wrapper input.webform--small,.hds-text-input__input-wrapper textarea.webform--small{max-width:var(--webform-element-width--input-small);min-width:var(--webform-element-width--input-small);width:100%}form .hds-text-input__input-wrapper input.webform--medium,form .hds-text-input__input-wrapper textarea.webform--medium,.hds-text-input__input-wrapper input.webform--medium,.hds-text-input__input-wrapper textarea.webform--medium{max-width:var(--webform-element-width--input-medium);min-width:var(--webform-element-width--input-small);width:100%}form .hds-text-input__input-wrapper input.webform--large,form .hds-text-input__input-wrapper textarea.webform--large,.hds-text-input__input-wrapper input.webform--large,.hds-text-input__input-wrapper textarea.webform--large{max-width:var(--webform-element-width--input-large);min-width:var(--webform-element-width--input-small);width:100%}.webform--small div.grant-applications--select-wrapper{max-width:var(--webform-element-width--input-small);min-width:var(--webform-element-width--input-small);width:100%}.webform--medium div.grant-applications--select-wrapper{max-width:var(--webform-element-width--input-medium);min-width:var(--webform-element-width--input-small);width:100%}.webform--large div.grant-applications--select-wrapper{max-width:var(--webform-element-width--input-medium);min-width:var(--webform-element-width--input-small);width:100%}form .hds-checkbox{display:block}form .hds-checkbox label.hds-checkbox__label::after{content:""}fieldset.webform-composite-hidden-title{margin-bottom:var(--spacing-layout-2-xs);margin-top:0}.form-item-bank-account-account-number-select,.form-item-community-address-community-address-select{margin-bottom:0}.grants-profile-grants-profile table thead th h4{margin:0}.hakemus-form-page .main-content{margin-top:0}.hakemus-form-page h1{-webkit-hyphens:auto;hyphens:auto;word-break:break-word}.hakemus-form-errors ul li{list-style-type:none}.community_officials_wrapper .webform-readonly{margin:0}.community_officials_wrapper .hds-text-input__input-wrapper{margin:0}.community_officials_wrapper input[readonly=readonly]{height:1.25rem;margin:0;max-width:330px}.form-item--error-message{color:var(--color-error);margin-bottom:var(--spacing-layout-s);margin-top:var(--spacing-layout-2-xs)}fieldset .form-item--error-message,.community_officials_wrapper .form-item--error-message{margin-bottom:0}.form-item--error-message::before{--icon-size: 1.6rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--alert-circle-fill);mask-image:var(--hel-icon--alert-circle-fill);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));background-color:var(--color-error);content:" ";display:inline-block}input[type=radio]+label.form-required::after{content:""}.hds-radio-button:last-of-type,.hds-checkbox:last-of-type{margin-bottom:0}.hds-radio-button:last-of-type>label,.hds-checkbox:last-of-type>label{margin-bottom:0}@media(min-width: 992px){.place-of-operation-composite--wrapper.fieldgroup .hds-text-input,.club-section-composite--wrapper.fieldgroup .hds-text-input{max-width:100%}}.place-of-operation-composite--wrapper.fieldgroup .hds-radio-button .hds-radio-button__label,.club-section-composite--wrapper.fieldgroup .hds-radio-button .hds-radio-button__label{line-height:var(--lineheight-m) !important}@media(min-width: 992px){.place-of-operation-group__location,.place-of-operation-group__students,.place-of-operation-group__groups,.place-of-operation-group__personnel,.place-of-operation-group__rent,.place-of-operation-group__time{display:flex;justify-content:space-between}}@media(min-width: 992px){.place-of-operation-group__location--address,.place-of-operation-group__students--address,.place-of-operation-group__groups--address,.place-of-operation-group__personnel--address,.place-of-operation-group__rent--address,.place-of-operation-group__time--address{margin-top:0 !important}.place-of-operation-group__location--address,.place-of-operation-group__students--address,.place-of-operation-group__groups--address,.place-of-operation-group__personnel--address,.place-of-operation-group__rent--address,.place-of-operation-group__time--address{width:65%}}@media(min-width: 992px){.place-of-operation-group__location--post-code,.place-of-operation-group__students--post-code,.place-of-operation-group__groups--post-code,.place-of-operation-group__personnel--post-code,.place-of-operation-group__rent--post-code,.place-of-operation-group__time--post-code{margin-top:0 !important}.place-of-operation-group__location--post-code,.place-of-operation-group__students--post-code,.place-of-operation-group__groups--post-code,.place-of-operation-group__personnel--post-code,.place-of-operation-group__rent--post-code,.place-of-operation-group__time--post-code{width:30%}}@media(min-width: 992px){.place-of-operation-group__location--student-count,.place-of-operation-group__location--special-student-count,.place-of-operation-group__location--group-count,.place-of-operation-group__location--special-group-count,.place-of-operation-group__location--personnel-count,.place-of-operation-group__location--rent-amount,.place-of-operation-group__location--time-start,.place-of-operation-group__location--time-end,.place-of-operation-group__students--student-count,.place-of-operation-group__students--special-student-count,.place-of-operation-group__students--group-count,.place-of-operation-group__students--special-group-count,.place-of-operation-group__students--personnel-count,.place-of-operation-group__students--rent-amount,.place-of-operation-group__students--time-start,.place-of-operation-group__students--time-end,.place-of-operation-group__groups--student-count,.place-of-operation-group__groups--special-student-count,.place-of-operation-group__groups--group-count,.place-of-operation-group__groups--special-group-count,.place-of-operation-group__groups--personnel-count,.place-of-operation-group__groups--rent-amount,.place-of-operation-group__groups--time-start,.place-of-operation-group__groups--time-end,.place-of-operation-group__personnel--student-count,.place-of-operation-group__personnel--special-student-count,.place-of-operation-group__personnel--group-count,.place-of-operation-group__personnel--special-group-count,.place-of-operation-group__personnel--personnel-count,.place-of-operation-group__personnel--rent-amount,.place-of-operation-group__personnel--time-start,.place-of-operation-group__personnel--time-end,.place-of-operation-group__rent--student-count,.place-of-operation-group__rent--special-student-count,.place-of-operation-group__rent--group-count,.place-of-operation-group__rent--special-group-count,.place-of-operation-group__rent--personnel-count,.place-of-operation-group__rent--rent-amount,.place-of-operation-group__rent--time-start,.place-of-operation-group__rent--time-end,.place-of-operation-group__time--student-count,.place-of-operation-group__time--special-student-count,.place-of-operation-group__time--group-count,.place-of-operation-group__time--special-group-count,.place-of-operation-group__time--personnel-count,.place-of-operation-group__time--rent-amount,.place-of-operation-group__time--time-start,.place-of-operation-group__time--time-end{margin-top:0 !important}.place-of-operation-group__location--student-count,.place-of-operation-group__location--special-student-count,.place-of-operation-group__location--group-count,.place-of-operation-group__location--special-group-count,.place-of-operation-group__location--personnel-count,.place-of-operation-group__location--rent-amount,.place-of-operation-group__location--time-start,.place-of-operation-group__location--time-end,.place-of-operation-group__students--student-count,.place-of-operation-group__students--special-student-count,.place-of-operation-group__students--group-count,.place-of-operation-group__students--special-group-count,.place-of-operation-group__students--personnel-count,.place-of-operation-group__students--rent-amount,.place-of-operation-group__students--time-start,.place-of-operation-group__students--time-end,.place-of-operation-group__groups--student-count,.place-of-operation-group__groups--special-student-count,.place-of-operation-group__groups--group-count,.place-of-operation-group__groups--special-group-count,.place-of-operation-group__groups--personnel-count,.place-of-operation-group__groups--rent-amount,.place-of-operation-group__groups--time-start,.place-of-operation-group__groups--time-end,.place-of-operation-group__personnel--student-count,.place-of-operation-group__personnel--special-student-count,.place-of-operation-group__personnel--group-count,.place-of-operation-group__personnel--special-group-count,.place-of-operation-group__personnel--personnel-count,.place-of-operation-group__personnel--rent-amount,.place-of-operation-group__personnel--time-start,.place-of-operation-group__personnel--time-end,.place-of-operation-group__rent--student-count,.place-of-operation-group__rent--special-student-count,.place-of-operation-group__rent--group-count,.place-of-operation-group__rent--special-group-count,.place-of-operation-group__rent--personnel-count,.place-of-operation-group__rent--rent-amount,.place-of-operation-group__rent--time-start,.place-of-operation-group__rent--time-end,.place-of-operation-group__time--student-count,.place-of-operation-group__time--special-student-count,.place-of-operation-group__time--group-count,.place-of-operation-group__time--special-group-count,.place-of-operation-group__time--personnel-count,.place-of-operation-group__time--rent-amount,.place-of-operation-group__time--time-start,.place-of-operation-group__time--time-end{width:47.5%}}@media(min-width: 768px){.club-section__participants{display:flex;gap:var(--spacing-l);justify-content:space-between}}.club-section__participants input.form-text.hds-text-input__input{max-width:100%;width:100%}.club-section__totalhours input.form-text.hds-text-input__input{max-width:100%;width:100%}.club-section__participants label{text-wrap:balance}.hel-icon--size-xs{--icon-size: var(--spacing-layout-2-xs)}.hel-icon--size-s{--icon-size: var(--spacing-layout-xs)}.hel-icon--size-m{--icon-size: var(--spacing-layout-s)}.hel-icon--size-l{--icon-size: var(--spacing-layout-m)}.hel-icon--size-xl{--icon-size: var(--spacing-layout-l)}.hds-text-input__input-wrapper[focus-within][\:has\(input\[readonly\]\)]{margin-right:var(--spacing-2-xs);outline:2px var(--color-black) solid;outline-offset:2px}.hds-text-input__input-wrapper[focus-within]:has(input[readonly]){margin-right:var(--spacing-2-xs);outline:2px var(--color-black) solid;outline-offset:2px}.hds-text-input__input-wrapper[focus-within][\:has\(input\[readonly\]\)]{margin-right:var(--spacing-2-xs);outline:2px var(--color-black) solid;outline-offset:2px}.hds-text-input__input-wrapper:focus-within[\:has\(input\[readonly\]\)]{margin-right:var(--spacing-2-xs);outline:2px var(--color-black) solid;outline-offset:2px}.hds-text-input__input-wrapper:focus-within:has(input[readonly]){margin-right:var(--spacing-2-xs);outline:2px var(--color-black) solid;outline-offset:2px}.hds-text-input__input-wrapper[focus-within][\:has\(input\[readonly\]\)] input[readonly]{width:calc(100% - var(--spacing-2-xs))}.hds-text-input__input-wrapper[focus-within]:has(input[readonly]) input[readonly]{width:calc(100% - var(--spacing-2-xs))}.hds-text-input__input-wrapper[focus-within][\:has\(input\[readonly\]\)] input[readonly]{width:calc(100% - var(--spacing-2-xs))}.hds-text-input__input-wrapper:focus-within[\:has\(input\[readonly\]\)] input[readonly]{width:calc(100% - var(--spacing-2-xs))}.hds-text-input__input-wrapper:focus-within:has(input[readonly]) input[readonly]{width:calc(100% - var(--spacing-2-xs))}.form-item-application-number,.form-item-status,.form-item-applicant-type{display:none}.grants-handler__completion{background:var(--color-bus-light);padding:var(--spacing-layout-l) var(--spacing-layout-2-xl)}.grants-handler__completion h2{margin-top:var(--spacing-l)}.grants-handler__completion h3{font-size:1rem;font-weight:bold;margin-top:var(--spacing-m)}.grants-handler__completion__info-row{display:flex;flex-flow:row wrap;gap:var(--spacing-m);justify-content:flex-start;margin-bottom:var(--spacing-m)}.grants-handler__completion__button-row{display:flex;flex-flow:row wrap;gap:var(--spacing-m);justify-content:flex-start}.grants-handler__completion__longtext{margin:var(--spacing-l) 0}.hds-notification.notification-margin-bottom{margin-bottom:var(--spacing-layout-m)}.hds-notification__label{align-items:center}.hds-checkbox__input label{font-weight:normal}fieldset.grants-attachments--wrapper{margin-bottom:var(--spacing-layout-m)}fieldset.grants-attachments--wrapper legend{margin-bottom:var(--spacing-2-xs)}fieldset.grants-attachments--wrapper .form-item--error-message{width:100%}fieldset.grants-attachments--wrapper .js-form-type-managed-file{margin-bottom:0}.grants-applications-managed_file{position:relative}.grants-applications-managed_file label.hds-button--secondary:not(:disabled):not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button){left:0;position:relative}.grants-applications-managed_file label.hds-button--secondary:not(:disabled):not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button)[\:has\(input\:disabled\)]{background-color:transparent;background-color:var(--background-color-disabled, transparent);border-color:transparent;border-color:var(--border-color-disabled, transparent);color:var(--color-disabled);cursor:not-allowed}.grants-applications-managed_file label.hds-button--secondary:not(:disabled):not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button)[\:has\(input\:disabled\)]{background-color:transparent;background-color:var(--background-color-disabled, transparent);border-color:transparent;border-color:var(--border-color-disabled, transparent);color:var(--color-disabled);cursor:not-allowed}.grants-applications-managed_file label.hds-button--secondary:not(:disabled):not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button):has(input:disabled){background-color:transparent;background-color:var(--background-color-disabled, transparent);border-color:transparent;border-color:var(--border-color-disabled, transparent);color:var(--color-disabled);cursor:not-allowed}.grants-applications-managed_file label.hds-button--secondary:not(:disabled):not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button)[focus-within]{background:var(--color-black);border-color:var(--color-white);color:var(--color-white);outline:2px var(--color-black) solid}.grants-applications-managed_file label.hds-button--secondary:not(:disabled):not(.eu-cookie-compliance-default-button):not(.eu-cookie-compliance-save-preferences-button):focus-within{background:var(--color-black);border-color:var(--color-white);color:var(--color-white);outline:2px var(--color-black) solid}.grants-applications-managed_file input[type=file]{opacity:0;position:absolute}.form-managed-file{display:flex;flex-wrap:wrap;white-space:inherit}.form-managed-file>span{background-color:var(--color-info-light);border-bottom:2px dotted var(--color-coat-of-arms);display:inline-block;padding:var(--spacing-s) var(--spacing-2-xs)}.form-managed-file>.file-upload-js-error{flex-basis:100%}.grants-applications-managed_file label.hds-button{display:flex}.grants-attachments--wrapper .webform-readonly{display:none}.webform-multiple-table table{border-collapse:collapse;border:0px var(--color-white) solid;margin-bottom:var(--spacing-2-xs);max-width:-moz-fit-content;max-width:fit-content}.webform-multiple-table .webform-multiple-table--operations-two{min-width:60px}.webform-multiple-table tbody tr,.webform-multiple-table thead tr{align-items:center;justify-content:space-between;width:100%}.webform-multiple-table td,.webform-multiple-table th{max-width:100%;min-width:0;padding:0;width:100%}.webform-multiple-table table thead th{padding:var(--spacing-layout-2-xs)}div.hidden-head table{display:table}div.hidden-head table thead th{padding:0}div.hidden-head table tbody tr{border-bottom:var(--spacing-s) var(--color-white) solid}div.hidden-head table tbody tr:hover{background:rgba(0,0,0,0)}div.table-layout-form input.hds-text-input__input{width:100%}div.table-layout-form table{border:1px var(--color-black) solid;max-width:var(--webform-element-width--input-large)}div.table-layout-form table tbody tr{border:§0px var(--color-black-30) solid}div.table-layout-form table tbody tr td{border:1px var(--color-black-30) solid;padding:0}div.table-layout-form table tbody tr td input.hds-text-input__input[readonly]{padding:var(--spacing-layout-2-xs)}div.table-layout-form table .form-item{margin-bottom:0}.hds-text-input .hds-text-input__input.input--borderless{border:0 rgba(0,0,0,0) solid}#edit-subventions-items thead{background:var(--color-black-90);color:var(--color-white);text-align:left}#edit-subventions-items input.hds-text-input,#edit-subventions-items input.hds-text-input__input{background:rgba(0,0,0,0)}#subventions_table td.webform-multiple-table--operations,#subventions_table th.webform-multiple-table--operations{display:none}#subventions_table input.hds-text-input__input[readonly][name$="[amount]"]{background-color:var(--input-background-disabled);border-color:var(--input-border-color-disabled);color:var(--input-color-disabled);cursor:not-allowed}.form-item-muu-liite .webform-multiple-table--operations{display:none}.hidden-head>label{display:none}.webform-preview .accordion_header{font-size:28px;font-weight:300}@media(min-width: 768px){.webform-preview .accordion_header{font-size:36px;font-weight:500}}.webform-preview label{display:block;font-weight:bold}.grants-profile-grants-profile fieldset{background:var(--color-black-5);border:0 rgba(0,0,0,0) solid;margin:0;max-width:var(--webform-element-width--fieldset);padding:0 var(--spacing-layout-s) var(--spacing-layout-s);top:calc(-1*var(--spacing-m))}.grants-profile-grants-profile fieldset label{margin-bottom:var(--spacing-3-xs)}.grants-profile-grants-profile fieldset legend{font-size:var(--fontsize-body-l);margin-bottom:var(--spacing-m);padding-bottom:var(--spacing-s);position:relative;top:var(--spacing-l)}.grants-profile-grants-profile fieldset .fieldset-wrapper{display:flex;flex-flow:row wrap;justify-content:space-between}.grants-profile-grants-profile fieldset .hds-text-input{max-width:100%}.grants-profile-grants-profile fieldset div[class*=-address-postcode]{width:32%}.grants-profile-grants-profile fieldset div[class*=-address-city]{width:65%}.grants-profile--extrainfo .form-actions .button{margin-right:var(--spacing-2-xs)}.grants-stepper{--grants-stepper-color: var(--color-black);--grants-stepper-background-color: var(--color-white);--grants-stepper-disabled-color: var(--color-black-20);--grants-stepper-selected-step-label-color: var(--color-black-90);--grants-stepper-not-selected-step-label-color: var(--color-black);--grants-step-background-color: var(--color-white);--grants-step-content-color: var(--color-black);--grants-stepper-focus-border-color: var(--color-coat-of-arms);--grants-step-width: 120px;--circle-container-size: 36px;--progress-line-height: 2px;background-color:var(--grants-stepper-background-color);margin-bottom:var(--spacing-layout-m);position:relative}@media(max-width: 725px){.grants-stepper{--grants-step-width: 40px}}@media(max-width: 725px){.grants-stepper .grants-stepper__text{display:none}}.grants-stepper__inner{align-items:flex-start;display:flex;justify-content:space-between;margin:0;-ms-overflow-style:none;padding:0;position:relative;scroll-behavior:smooth;scrollbar-width:none;width:100%}.grants-stepper__lines{display:flex;height:var(--progress-line-height);left:calc(var(--grants-step-width)/2);line-height:var(--lineheight-l);position:absolute;transform:translateY(calc(var(--circle-container-size) / 2 + var(--progress-line-height) / 2));z-index:1}.grants-stepper__line{background-color:var(--grants-stepper-color);display:inline-block;height:100%;position:relative}.grants-stepper__line__disabled{background-color:var(--grants-stepper-disabled-color)}.grants-stepper__steps{background-color:var(--grants-stepper-background-color);box-sizing:border-box;display:flex;flex-shrink:0;justify-content:center;max-width:var(--grants-step-width);min-width:var(--grants-step-width);padding:3px}.grants-stepper__step{align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:rgba(0,0,0,0);border:0;box-sizing:content-box;color:var(--grants-stepper-color);cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;outline:none;overflow:visible;padding:0;position:relative}.grants-stepper__step[disabled],.grants-stepper__step__disabled{color:var(--grants-stepper-disabled-color);cursor:not-allowed}.grants-stepper__step[disabled] .grants-stepper__circle,.grants-stepper__step__disabled .grants-stepper__circle{background-color:var(--grants-stepper-background-color);border:2px solid var(--grants-stepper-disabled-color);color:var(--grants-stepper-disabled-color)}.grants-stepper__step[disabled] .grants-stepper__text,.grants-stepper__step__disabled .grants-stepper__text{color:var(--grants-stepper-disabled-color)}.grants-stepper__step__circle_container{align-items:center;display:flex;height:var(--circle-container-size);justify-content:center;width:var(--circle-container-size);z-index:2}.grants-stepper__step__completed_container{align-items:center;background-color:var(--grants-stepper-color);border-radius:16px;color:var(--color-white);display:none;justify-content:center;outline:2px solid var(--grants-stepper-background-color);padding:4px;vertical-align:middle}.grants-stepper .grants-stepper__error,.grants-stepper .grants-stepper__completed{display:none}.grants-stepper__text{color:var(--grants-stepper-not-selected-step-label-color);font-size:var(--fontsize-body-m);font-weight:500;line-height:var(--lineheight-l);margin-bottom:0;margin-top:6px;padding-left:var(--spacing-4-xs);padding-right:var(--spacing-4-xs);text-align:center;text-decoration:underline}.grants-stepper__circle{align-items:center;background-color:var(--grants-step-background-color);border:2px solid var(--grants-stepper-color);border-radius:16px;color:var(--grants-step-content-color);display:flex;height:28px;justify-content:center;outline:2px solid var(--grants-stepper-background-color);text-align:center;width:28px}.grants-stepper__number{font-size:var(--fontsize-body-m);font-weight:500;line-height:1.15}.grants-stepper .is-active .grants-stepper__circle{border:4px solid var(--grants-stepper-color);border-radius:18px;outline:none}.grants-stepper .is-active .grants-stepper__text{color:var(--grants-stepper-selected-step-label-color);font-weight:700;text-decoration:none}.grants-stepper .is-active .grants-stepper__number{color:var(--grants-stepper-selected-step-label-color);font-weight:700;text-decoration:none}.grants-stepper .is-complete .grants-stepper__container{align-items:center;background-color:var(--grants-stepper-color);border-radius:16px;color:var(--color-white);display:flex;justify-content:center;outline:2px solid var(--grants-stepper-background-color);padding:4px}.grants-stepper .is-complete .grants-stepper__number{display:none}.grants-stepper .is-complete .grants-stepper__completed{display:inline-block}.grants-stepper .is-complete .grants-stepper__circle{opacity:0}.grants-stepper .is-complete .grants-stepper__step__completed_container{display:flex}.grants-stepper .has-errors .grants-stepper__container{align-items:center;background-color:var(--grants-stepper-color);border-radius:16px;color:var(--color-white);display:flex;justify-content:center;outline:2px solid var(--grants-stepper-background-color);padding:4px}.grants-stepper .has-errors .grants-stepper__circle{border-color:var(--color-error);color:var(--color-error)}.grants-stepper .has-errors .grants-stepper__number{display:none}.grants-stepper .has-errors .grants-stepper__error{display:inline-block}.grants-stepper .progress-marker::before{display:none}.grants-stepper .progress-step .progress-marker{color:var(--color-black)}.grants-stepper .progress-step .progress-marker.focus-visible .grants-stepper__circle{outline:2px solid var(--color-black);outline:var(--outline-width, 2px) solid var(--color-black);outline-offset:2px}.grants-stepper .progress-step .progress-marker.focus-visible .grants-stepper__circle{outline:2px solid var(--color-black);outline:var(--outline-width, 2px) solid var(--color-black);outline-offset:2px}.grants-stepper .progress-step .progress-marker:focus-visible .grants-stepper__circle{outline:2px solid var(--color-black);outline:var(--outline-width, 2px) solid var(--color-black);outline-offset:2px}.grants-stepper .progress-step .progress-marker.focus-visible .grants-stepper__text{outline:2px solid var(--color-black);outline:var(--outline-width, 2px) solid var(--color-black)}.grants-stepper .progress-step .progress-marker.focus-visible .grants-stepper__text{outline:2px solid var(--color-black);outline:var(--outline-width, 2px) solid var(--color-black)}.grants-stepper .progress-step .progress-marker:focus-visible .grants-stepper__text{outline:2px solid var(--color-black);outline:var(--outline-width, 2px) solid var(--color-black)}.grants-stepper .progress-step:last-child{flex-grow:1}.grant-applications--select-wrapper{--border-width: 2px;--input-height: 56px;--menu-item-height: 53px;--icon-size: var(--spacing-m);--helper-color-default: var(--color-black-60);--helper-color-invalid: var(--color-error);--icon-color-invalid: var(--color-error);--input-background-default: var(--color-white);--input-background-disabled: var(--color-black-10);--input-border-color-default: var(--color-black-50);--input-border-color-hover: var(--color-black-90);--input-border-color-focus: var(--color-black-90);--input-border-color-invalid: var(--color-error);--input-border-color-disabled: var(--color-black-10);--input-color-default: var(--color-black-90);--input-color-disabled: var(--color-black-40);--label-color-default: var(--color-black-90);--label-color-invalid: var(--color-black-90);--placeholder-color: var(--color-black-60);--focus-outline-color: var(--color-coat-of-arms);align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--input-background-default);border:var(--border-width) solid var(--input-border-color-default);box-sizing:border-box;color:var(--input-color-default);cursor:pointer;display:block;font-size:1.125em;grid-template-areas:"select";line-height:normal;max-width:30ch;min-width:15ch;padding:.25em .5em;position:relative;width:100%}.grant-applications--select-wrapper select{align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:rgba(0,0,0,0);border:none;color:var(--dropdown-color-default);cursor:inherit;display:flex;font-family:inherit;font-size:var(--fontsize-body-l);height:var(--input-height);line-height:inherit;margin:0;min-height:var(--menu-item-height);outline:none;padding:calc(var(--spacing-s) - var(--border-width)*2) var(--spacing-s);width:100%;z-index:1}.grant-applications--select-wrapper select::-ms-expand{display:none}.grant-applications--select-wrapper i.hel-icon{pointer-events:none;position:absolute;right:calc(var(--spacing-s) - var(--border-width)*2);top:calc(var(--spacing-s) - var(--border-width)*2)}.grant-applications--select-wrapper select,.grant-applications--select-wrapper::after{grid-area:select}.grant-applications--select-wrapper:not(.select--multiple)::after{background-color:var(--helper-color-default);-webkit-clip-path:polygon(100% 0%, 0 0%, 50% 100%);clip-path:polygon(100% 0%, 0 0%, 50% 100%);content:"";height:.5em;justify-self:end;width:.8em}.grant-applications--select-wrapper select:focus+.grant-applications--select-focus{border:2px solid var(--focus-outline-color);border-radius:inherit;bottom:-1px;left:-1px;position:absolute;right:-1px;top:-1px}.webform-submission__application_id{border-bottom:1px var(--color-black-20) solid;padding-bottom:var(--spacing-xl)}.webform-submission__application_id--header{font-size:1rem;font-weight:bold}.webform-submission__title-wrapper{padding-top:var(--spacing-2-xl)}.webform-submission__title-wrapper h1{max-width:100%}.webform-submission ul{list-style:none;margin-top:0;padding-left:0}.webform-submission-information{background:var(--color-silver-light);margin-top:var(--spacing-3-xl);padding:var(--spacing-l)}.webform-submission-information .webform-submission-information{margin-top:var(--spacing-l);padding:0}.webform-submission-information h4{margin-top:0}.webform-submission-information h5{font-size:var(--fontsize-body-m);margin-top:var(--spacing-s)}.webform-submission-information__row{display:flex}.webform-submission-information__row-edit{margin-top:var(--spacing-s)}.webform-submission-information__row-top{align-items:center;border-bottom:1px solid var(--color-black-20);justify-content:space-between}@media(max-width: 550px){.webform-submission-information__row-top{display:block}}.webform-submission-information__row-main{flex-flow:row nowrap;gap:var(--spacing-m);justify-content:space-between}@media(max-width: 1179px){.webform-submission-information__row-main{flex-flow:row wrap}}.webform-submission-information__row-main>div{flex:1}@media(max-width: 1179px){.webform-submission-information__row-main>div{flex:auto;width:100%}}.webform-submission-information__row-main>div ul{list-style-type:none;margin-bottom:0;padding-left:0}.webform-submission-information__row-main>div ul li{margin:0;padding:0}.webform-submission-information__supportlinks{display:flex;flex-flow:row nowrap;min-width:-moz-fit-content;min-width:fit-content}.webform-submission-information__supportlinks .hds-loading-spinner{left:0}.webform-submission-information__supportlinks .hds-button{min-width:-moz-fit-content;min-width:fit-content}.hel-icon.hel-icon--copy{-webkit-mask-image:url("data:image/svg+xml,%3Csvg class='Icon-module_icon__1Jtzj icon_hel-icon__1YqNC Icon-module_s__2WGWe icon_hel-icon--size-s__2Lkik' viewBox='0 0 24 24' role='img' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Crect width='24' height='24'%3E%3C/rect%3E%3Cpath fill='currentColor' d='M6,10 L6,12 L5,12 L5,18 L12,18 L12,17 L14,17 L14,19 C14,19.5522847 13.5522847,20 13,20 L4,20 C3.44771525,20 3,19.5522847 3,19 L3,11 C3,10.4477153 3.44771525,10 4,10 L6,10 Z M20,4 C20.5522847,4 21,4.44771525 21,5 L21,15 C21,15.5522847 20.5522847,16 20,16 L8,16 C7.44771525,16 7,15.5522847 7,15 L7,5 C7,4.44771525 7.44771525,4 8,4 L20,4 Z M19,6 L9,6 L9,14 L19,14 L19,6 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg class='Icon-module_icon__1Jtzj icon_hel-icon__1YqNC Icon-module_s__2WGWe icon_hel-icon--size-s__2Lkik' viewBox='0 0 24 24' role='img' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Crect width='24' height='24'%3E%3C/rect%3E%3Cpath fill='currentColor' d='M6,10 L6,12 L5,12 L5,18 L12,18 L12,17 L14,17 L14,19 C14,19.5522847 13.5522847,20 13,20 L4,20 C3.44771525,20 3,19.5522847 3,19 L3,11 C3,10.4477153 3.44771525,10 4,10 L6,10 Z M20,4 C20.5522847,4 21,4.44771525 21,5 L21,15 C21,15.5522847 20.5522847,16 20,16 L8,16 C7.44771525,16 7,15.5522847 7,15 L7,5 C7,4.44771525 7.44771525,4 8,4 L20,4 Z M19,6 L9,6 L9,14 L19,14 L19,6 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E")}.webform-submission-form .form-actions{border-top:1px rgba(0,0,0,.6) solid;margin-top:var(--spacing-l);padding-top:var(--spacing-2-xl)}@media(min-width: 768px){.webform-submission-form .form-actions{display:flex;flex-direction:row-reverse}}.webform-submission-form .form-actions .actions{display:flex;flex-wrap:wrap}.webform-submission-form .form-actions button{margin-left:0}@media(min-width: 768px){.webform-submission-form .form-actions button{margin-left:var(--spacing-2-xs)}}.webform-submission-form .form-actions input{margin-bottom:var(--spacing-layout-2-xs);width:100%}@media(min-width: 768px){.webform-submission-form .form-actions input{width:auto}}.webform-submission-form .form-actions input.webform-button--draft{background:rgba(0,0,0,0);border:0 rgba(0,0,0,0) solid;color:var(--hdbt-color-black);order:3;text-decoration:underline}.webform-submission-form .form-actions button.webform-button--next span::after,.webform-submission-form .form-actions button.webform-button--preview span::after{content:">";margin-left:var(--spacing-2-xs)}.webform-submission-form .form-actions button.webform-button--previous span::before{content:"<";margin-right:var(--spacing-2-xs)}.webform-submission-form .form-actions input.webform-button--previous{background:var(--color-white);color:var(--border-color)}.webform-button--draft .hds-button__label::before{background-color:currentColor;background-size:contain;content:"";display:inline-block;flex-shrink:0;height:24px;margin-right:var(--spacing-2-xs);-webkit-mask-image:var(--hel-icon--download-cloud);mask-image:var(--hel-icon--download-cloud);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:24px 24px;mask-size:24px 24px;transition:transform .2s linear;vertical-align:bottom;width:24px}.webform-submission-messages{background:var(--color-silver-light);margin-top:var(--spacing-3-xl);padding:var(--spacing-l)}.webform-submission-messages h4,.webform-submission-messages h5{margin-top:0}.webform-submission-messages hr{margin:var(--spacing-l) 0}.webform-submission-messages__new-message{align-items:center;background:var(--color-alert);display:inline-flex;font-weight:bold;gap:var(--spacing-2-xs);margin-bottom:var(--spacing-m);padding:var(--spacing-2-xs) var(--spacing-xs);text-transform:uppercase}.webform-submission-messages__messages-list{list-style:none;margin:0;padding:0}.webform-submission-messages__message{margin:0;padding:0}.webform-submission-messages__message__attachments{list-style:none}.webform-submission-messages__message .hds-button{margin-top:var(--spacing-s)}.js-form-type-grants-webform-summation-field{max-width:var(--webform-element-width--input-large);text-align:right}.js-form-type-grants-webform-summation-field .grants-webform-summation-field{display:inline-block;padding:var(--spacing-xs) var(--spacing-m)}.webform-print-header,.webform-print-footer{display:none}.webform-print .main-content{display:block}.webform-submission--view-mode-html .hds-text-input,.webform-submission-data-preview-page .hds-text-input,.webform-print-page-html .hds-text-input{max-width:100%}.webform-submission--view-mode-html .print-label,.webform-submission-data-preview-page .print-label,.webform-print-page-html .print-label{display:block;font-size:var(--fontsize-body-m);font-weight:500;margin-bottom:var(--spacing-3-xs);margin-top:0;max-width:-moz-fit-content;max-width:fit-content;padding-right:var(--spacing-xl);position:relative}.webform-submission--view-mode-html .webform-section-flex-wrapper h3+*>*:first-child>*:first-child,.webform-submission--view-mode-html .webform-section-flex-wrapper h3+*>*:first-child>*:first-child label:first-of-type,.webform-submission-data-preview-page .webform-section-flex-wrapper h3+*>*:first-child>*:first-child,.webform-submission-data-preview-page .webform-section-flex-wrapper h3+*>*:first-child>*:first-child label:first-of-type,.webform-print-page-html .webform-section-flex-wrapper h3+*>*:first-child>*:first-child,.webform-print-page-html .webform-section-flex-wrapper h3+*>*:first-child>*:first-child label:first-of-type{line-height:normal}.webform-submission--view-mode-html .print-notification,.webform-submission-data-preview-page .print-notification,.webform-print-page-html .print-notification{border:2px var(--color-black) solid;font-weight:bold;margin-top:var(--spacing-2-xl);padding:var(--spacing-layout-s)}.webform-submission--view-mode-html .print-notification .print-notification--icon,.webform-submission-data-preview-page .print-notification .print-notification--icon,.webform-print-page-html .print-notification .print-notification--icon{height:22px;margin-right:var(--spacing-2-xs);vertical-align:text-top;width:22px}.webform-submission--view-mode-html .webform-print-page-wizard-page~.webform-print-page-wizard-page h2,.webform-submission-data-preview-page .webform-print-page-wizard-page~.webform-print-page-wizard-page h2,.webform-print-page-html .webform-print-page-wizard-page~.webform-print-page-wizard-page h2{page-break-after:avoid;page-break-before:always}.webform-submission--view-mode-html div.hds-text-input__input,.webform-submission-data-preview-page div.hds-text-input__input,.webform-print-page-html div.hds-text-input__input{background:var(--color-white);border:2px var(--color-black) solid;height:var(--spacing-2-xl);width:100%}.webform-submission--view-mode-html div.hds-text-input__textarea,.webform-submission-data-preview-page div.hds-text-input__textarea,.webform-print-page-html div.hds-text-input__textarea{background:var(--color-white);border:2px var(--color-black) solid;height:var(--spacing-layout-2-xl);width:100%}.webform-submission--view-mode-html .webform-section-wrapper .hds-notification,.webform-submission-data-preview-page .webform-section-wrapper .hds-notification,.webform-print-page-html .webform-section-wrapper .hds-notification{margin-top:var(--spacing-s)}.webform-submission--view-mode-html .webform-print-page-body h2,.webform-submission-data-preview-page .webform-print-page-body h2,.webform-print-page-html .webform-print-page-body h2{margin-bottom:var(--spacing-layout-s)}.webform-submission--view-mode-html .webform-print-wrapper-table,.webform-submission-data-preview-page .webform-print-wrapper-table,.webform-print-page-html .webform-print-wrapper-table{border:0 rgba(0,0,0,0) solid;display:table;max-width:100%;overflow-x:visible;overflow-x:initial;width:100%}.webform-submission--view-mode-html .webform-print-wrapper-table thead,.webform-submission--view-mode-html .webform-print-wrapper-table tbody,.webform-submission--view-mode-html .webform-print-wrapper-table tfoot,.webform-submission--view-mode-html .webform-print-wrapper-table tr,.webform-submission--view-mode-html .webform-print-wrapper-table tbody tr:hover,.webform-submission--view-mode-html .webform-print-wrapper-table td,.webform-submission--view-mode-html .webform-print-wrapper-table td:first-child,.webform-submission--view-mode-html .webform-print-wrapper-table th,.webform-submission-data-preview-page .webform-print-wrapper-table thead,.webform-submission-data-preview-page .webform-print-wrapper-table tbody,.webform-submission-data-preview-page .webform-print-wrapper-table tfoot,.webform-submission-data-preview-page .webform-print-wrapper-table tr,.webform-submission-data-preview-page .webform-print-wrapper-table tbody tr:hover,.webform-submission-data-preview-page .webform-print-wrapper-table td,.webform-submission-data-preview-page .webform-print-wrapper-table td:first-child,.webform-submission-data-preview-page .webform-print-wrapper-table th,.webform-print-page-html .webform-print-wrapper-table thead,.webform-print-page-html .webform-print-wrapper-table tbody,.webform-print-page-html .webform-print-wrapper-table tfoot,.webform-print-page-html .webform-print-wrapper-table tr,.webform-print-page-html .webform-print-wrapper-table tbody tr:hover,.webform-print-page-html .webform-print-wrapper-table td,.webform-print-page-html .webform-print-wrapper-table td:first-child,.webform-print-page-html .webform-print-wrapper-table th{background:rgba(0,0,0,0);border:0;color:var(--color-black)}.webform-submission--view-mode-html .webform-print-wrapper-table ul,.webform-submission-data-preview-page .webform-print-wrapper-table ul,.webform-print-page-html .webform-print-wrapper-table ul{margin:0;padding:0}.webform-submission--view-mode-html .webform-print-wrapper-table ul li,.webform-submission-data-preview-page .webform-print-wrapper-table ul li,.webform-print-page-html .webform-print-wrapper-table ul li{border-bottom:1px var(--color-black-50) solid;list-style:none;margin-top:0;padding:1rem 0}.webform-submission--view-mode-html .webform-print-wrapper-table ul li:last-of-type,.webform-submission-data-preview-page .webform-print-wrapper-table ul li:last-of-type,.webform-print-page-html .webform-print-wrapper-table ul li:last-of-type{border-bottom:0 rgba(0,0,0,0) solid}.webform-submission--view-mode-html .webform-print-wrapper-table thead,.webform-submission-data-preview-page .webform-print-wrapper-table thead,.webform-print-page-html .webform-print-wrapper-table thead{display:table-header-group}.webform-submission--view-mode-html .webform-print-wrapper-table thead th,.webform-submission-data-preview-page .webform-print-wrapper-table thead th,.webform-print-page-html .webform-print-wrapper-table thead th{padding:0}.webform-submission--view-mode-html .webform-print-wrapper-table tfoot,.webform-submission-data-preview-page .webform-print-wrapper-table tfoot,.webform-print-page-html .webform-print-wrapper-table tfoot{display:table-footer-group}.webform-submission--view-mode-html .webform-submission-data>section,.webform-submission-data-preview-page .webform-submission-data>section,.webform-print-page-html .webform-submission-data>section{border-top:1px var(--color-black-20) solid;padding-top:var(--spacing-layout-l)}.webform-submission--view-mode-html .webform-submission-data>section>.webform-section-flex-wrapper,.webform-submission-data-preview-page .webform-submission-data>section>.webform-section-flex-wrapper,.webform-print-page-html .webform-submission-data>section>.webform-section-flex-wrapper{display:block}.webform-submission--view-mode-html .webform-submission-data>section>.webform-section-flex-wrapper>h2,.webform-submission-data-preview-page .webform-submission-data>section>.webform-section-flex-wrapper>h2,.webform-print-page-html .webform-submission-data>section>.webform-section-flex-wrapper>h2{font-size:var(--fontsize-heading-l) !important;margin:0 0 2mm !important;padding:0 !important;width:100% !important}.webform-submission--view-mode-html .webform-submission-data>section>.webform-section-flex-wrapper>h2,.webform-submission-data-preview-page .webform-submission-data>section>.webform-section-flex-wrapper>h2,.webform-print-page-html .webform-submission-data>section>.webform-section-flex-wrapper>h2{font-weight:500;min-width:100%}.webform-submission--view-mode-html .webform-submission-data>section>.webform-section-flex-wrapper>.webform-section-wrapper,.webform-submission-data-preview-page .webform-submission-data>section>.webform-section-flex-wrapper>.webform-section-wrapper,.webform-print-page-html .webform-submission-data>section>.webform-section-flex-wrapper>.webform-section-wrapper{padding:6mm 0}.webform-submission--view-mode-html .webform-submission-data>section>.webform-section-flex-wrapper>.webform-section-wrapper label,.webform-submission-data-preview-page .webform-submission-data>section>.webform-section-flex-wrapper>.webform-section-wrapper label,.webform-print-page-html .webform-submission-data>section>.webform-section-flex-wrapper>.webform-section-wrapper label{font-weight:500}.webform-submission--view-mode-html .webform-submission-data>section.hds-notification,.webform-submission-data-preview-page .webform-submission-data>section.hds-notification,.webform-print-page-html .webform-submission-data>section.hds-notification{padding-top:var(--spacing-s)}@media print{@page{.webform-submission--view-mode-html,.webform-submission-data-preview-page,.webform-print-page-html{margin:0;size:A4}}.webform-submission--view-mode-html h1,.webform-submission-data-preview-page h1,.webform-print-page-html h1{margin:0;position:relative}.webform-submission--view-mode-html details,.webform-submission-data-preview-page details,.webform-print-page-html details{page-break-before:always}.webform-submission--view-mode-html .details-section-divider,.webform-submission-data-preview-page .details-section-divider,.webform-print-page-html .details-section-divider{page-break-after:always}.webform-submission--view-mode-html label,.webform-submission-data-preview-page label,.webform-print-page-html label{font-size:8pt;margin-bottom:0}.webform-submission--view-mode-html section,.webform-submission-data-preview-page section,.webform-print-page-html section{border-top:0 var(--color-black-20) solid !important;padding-top:0 !important}.webform-submission--view-mode-html section,.webform-submission-data-preview-page section,.webform-print-page-html section{margin-bottom:0;padding-bottom:0}.webform-submission--view-mode-html div.main-content,.webform-submission-data-preview-page div.main-content,.webform-print-page-html div.main-content{margin:0}.webform-submission--view-mode-html button,.webform-submission--view-mode-html footer.footer,.webform-submission--view-mode-html header.header,.webform-submission--view-mode-html nav.breadcrumb,.webform-submission--view-mode-html .form-actions,.webform-submission--view-mode-html .hds-notification,.webform-submission--view-mode-html .messages__container,.webform-submission--view-mode-html .tools__container,.webform-submission--view-mode-html .breadcrumb__container,.webform-submission--view-mode-html .webform-progress,.webform-submission--view-mode-html .webform-progress-tracker,.webform-submission--view-mode-html .webform-progress-tracker-mobile,.webform-submission--view-mode-html .webform-multiple-add,.webform-submission--view-mode-html .webform-multiple-table--operations,.webform-submission-data-preview-page button,.webform-submission-data-preview-page footer.footer,.webform-submission-data-preview-page header.header,.webform-submission-data-preview-page nav.breadcrumb,.webform-submission-data-preview-page .form-actions,.webform-submission-data-preview-page .hds-notification,.webform-submission-data-preview-page .messages__container,.webform-submission-data-preview-page .tools__container,.webform-submission-data-preview-page .breadcrumb__container,.webform-submission-data-preview-page .webform-progress,.webform-submission-data-preview-page .webform-progress-tracker,.webform-submission-data-preview-page .webform-progress-tracker-mobile,.webform-submission-data-preview-page .webform-multiple-add,.webform-submission-data-preview-page .webform-multiple-table--operations,.webform-print-page-html button,.webform-print-page-html footer.footer,.webform-print-page-html header.header,.webform-print-page-html nav.breadcrumb,.webform-print-page-html .form-actions,.webform-print-page-html .hds-notification,.webform-print-page-html .messages__container,.webform-print-page-html .tools__container,.webform-print-page-html .breadcrumb__container,.webform-print-page-html .webform-progress,.webform-print-page-html .webform-progress-tracker,.webform-print-page-html .webform-progress-tracker-mobile,.webform-print-page-html .webform-multiple-add,.webform-print-page-html .webform-multiple-table--operations{display:none !important}.webform-submission--view-mode-html .gin--horizontal-toolbar .dialog-off-canvas-main-canvas,.webform-submission-data-preview-page .gin--horizontal-toolbar .dialog-off-canvas-main-canvas,.webform-print-page-html .gin--horizontal-toolbar .dialog-off-canvas-main-canvas{padding:0 !important}.webform-submission--view-mode-html .hds-text-input,.webform-submission-data-preview-page .hds-text-input,.webform-print-page-html .hds-text-input{max-width:100%}.webform-submission--view-mode-html .hds-text-input .hds-text-input__input,.webform-submission-data-preview-page .hds-text-input .hds-text-input__input,.webform-print-page-html .hds-text-input .hds-text-input__input{height:1cm}.webform-submission--view-mode-html .hds-text-input textarea.hds-text-input__input,.webform-submission--view-mode-html .hds-text-input div.hds-text-input__textarea,.webform-submission-data-preview-page .hds-text-input textarea.hds-text-input__input,.webform-submission-data-preview-page .hds-text-input div.hds-text-input__textarea,.webform-print-page-html .hds-text-input textarea.hds-text-input__input,.webform-print-page-html .hds-text-input div.hds-text-input__textarea{height:6cm;max-width:100%;min-width:100%;width:100%}.webform-submission--view-mode-html .hds-text-input .hds-text-input__input[readonly],.webform-submission--view-mode-html .hds-text-input .hds-text-input__input,.webform-submission-data-preview-page .hds-text-input .hds-text-input__input[readonly],.webform-submission-data-preview-page .hds-text-input .hds-text-input__input,.webform-print-page-html .hds-text-input .hds-text-input__input[readonly],.webform-print-page-html .hds-text-input .hds-text-input__input{border:2px var(--color-black) solid}.webform-submission--view-mode-html .webform-element,.webform-submission-data-preview-page .webform-element,.webform-print-page-html .webform-element{border:1px var(--color-black) solid;margin-bottom:8mm;padding:2.5mm;position:relative}.webform-submission--view-mode-html .webform-preview,.webform-submission-data-preview-page .webform-preview,.webform-print-page-html .webform-preview{margin-top:0}.webform-submission--view-mode-html .webform-preview label,.webform-submission-data-preview-page .webform-preview label,.webform-print-page-html .webform-preview label{align-items:flex-end;display:flex;font-size:8pt;height:100%;left:0;pointer-events:none;position:absolute;top:-100%;width:100%}.webform-submission--view-mode-html .webform-preview .webform-element,.webform-submission-data-preview-page .webform-preview .webform-element,.webform-print-page-html .webform-preview .webform-element{border:1px var(--color-black) solid;margin-bottom:8mm;padding:2.5mm;position:relative;top:5mm}.webform-submission--view-mode-html .webform-preview .webform-multiple-table--operations,.webform-submission-data-preview-page .webform-preview .webform-multiple-table--operations,.webform-print-page-html .webform-preview .webform-multiple-table--operations{display:none}.webform-submission--view-mode-html .webform-print-header,.webform-submission-data-preview-page .webform-print-header,.webform-print-page-html .webform-print-header{align-items:center;background:var(--color-white);border-bottom:1px var(--color-black-40) solid;display:flex;flex-flow:row nowrap;font-size:9pt;height:21mm;left:0;max-width:100%;min-width:100%;position:fixed;top:0;width:100%;z-index:1000}.webform-submission--view-mode-html .webform-print-header svg,.webform-submission-data-preview-page .webform-print-header svg,.webform-print-page-html .webform-print-header svg{color:var(--color-black);display:block;height:25mm;margin-right:3mm;width:55mm}.webform-submission--view-mode-html .webform-print-header .webform-print-header-left-text,.webform-submission-data-preview-page .webform-print-header .webform-print-header-left-text,.webform-print-page-html .webform-print-header .webform-print-header-left-text{color:var(--color-black-40);text-align:left;width:100%}.webform-submission--view-mode-html .webform-print-header .webform-print-header-right-text,.webform-submission-data-preview-page .webform-print-header .webform-print-header-right-text,.webform-print-page-html .webform-print-header .webform-print-header-right-text{color:var(--color-black-40);text-align:right;width:100%}.webform-submission--view-mode-html .webform-print-footer,.webform-submission-data-preview-page .webform-print-footer,.webform-print-page-html .webform-print-footer{align-items:center;background:var(--color-white);border-top:1px var(--color-black-40) solid;bottom:0;display:flex;flex-flow:row nowrap;font-size:9pt;height:17mm;left:0;max-width:100%;min-width:100%;position:fixed;width:100%;z-index:1000}.webform-submission--view-mode-html .webform-print-footer svg,.webform-submission-data-preview-page .webform-print-footer svg,.webform-print-page-html .webform-print-footer svg{color:var(--color-black);display:block;height:15mm;margin-right:3mm;width:33mm}.webform-submission--view-mode-html .webform-print-footer .webform-print-footer-left-text,.webform-submission-data-preview-page .webform-print-footer .webform-print-footer-left-text,.webform-print-page-html .webform-print-footer .webform-print-footer-left-text{color:var(--color-black-40);text-align:left;width:100%}.webform-submission--view-mode-html .webform-print-footer .webform-print-footer-right-text,.webform-submission-data-preview-page .webform-print-footer .webform-print-footer-right-text,.webform-print-page-html .webform-print-footer .webform-print-footer-right-text{color:var(--color-black-40);text-align:right;width:100%}.webform-submission--view-mode-html .webform-print-header-space,.webform-submission-data-preview-page .webform-print-header-space,.webform-print-page-html .webform-print-header-space{background:var(--color-white);font-size:9pt;height:21mm}.webform-submission--view-mode-html .webform-print-footer-space,.webform-submission-data-preview-page .webform-print-footer-space,.webform-print-page-html .webform-print-footer-space{background:var(--color-white);font-size:9pt;height:17mm}.webform-submission--view-mode-html .webform-print-wrapper-table,.webform-submission-data-preview-page .webform-print-wrapper-table,.webform-print-page-html .webform-print-wrapper-table{border:0;margin:0;overflow-x:visible;overflow-x:initial}.webform-submission--view-mode-html .webform-section-flex-wrapper,.webform-submission-data-preview-page .webform-section-flex-wrapper,.webform-print-page-html .webform-section-flex-wrapper{flex-flow:row wrap}.webform-submission--view-mode-html .webform-section-flex-wrapper>h3.webform-section-title,.webform-submission-data-preview-page .webform-section-flex-wrapper>h3.webform-section-title,.webform-print-page-html .webform-section-flex-wrapper>h3.webform-section-title{max-width:100%;width:100%}.webform-submission--view-mode-html .webform-section-grid-wrapper,.webform-submission-data-preview-page .webform-section-grid-wrapper,.webform-print-page-html .webform-section-grid-wrapper{display:flex;flex-flow:row nowrap}.webform-submission--view-mode-html .webform-section-grid-wrapper>h3.webform-section-title,.webform-submission-data-preview-page .webform-section-grid-wrapper>h3.webform-section-title,.webform-print-page-html .webform-section-grid-wrapper>h3.webform-section-title{font-size:1.25rem;margin-top:0;max-width:5cm;width:100%}.webform-submission--view-mode-html .webform-section-grid-wrapper>dl.webform-section-contents,.webform-submission-data-preview-page .webform-section-grid-wrapper>dl.webform-section-contents,.webform-print-page-html .webform-section-grid-wrapper>dl.webform-section-contents{margin-top:0;max-width:100%;padding-left:1cm;width:100%}.webform-submission--view-mode-html .webform-section-grid-wrapper>dl.webform-section-contents dt,.webform-submission-data-preview-page .webform-section-grid-wrapper>dl.webform-section-contents dt,.webform-print-page-html .webform-section-grid-wrapper>dl.webform-section-contents dt{font-weight:bold;margin:0;padding:0;page-break-after:avoid}.webform-submission--view-mode-html .webform-section-grid-wrapper>dl.webform-section-contents dd,.webform-submission-data-preview-page .webform-section-grid-wrapper>dl.webform-section-contents dd,.webform-print-page-html .webform-section-grid-wrapper>dl.webform-section-contents dd{margin:0;padding:0;page-break-before:avoid}.webform-submission--view-mode-html .webform-print-page-body h2,.webform-submission-data-preview-page .webform-print-page-body h2,.webform-print-page-html .webform-print-page-body h2{margin-bottom:1cm}}.webform-submission-data dl dt{font-weight:bold}.webform-submission-data dl dd{margin:0;padding:0}.webform-submission-data dl dl{padding-left:var(--spacing-2-xs)}.webform-submission-data dl>br{display:none}.webform-print-page-html .webform-section-wrapper>h4,.webform-print-page-html .webform-section-wrapper .print-label{margin-top:var(--spacing-2-xs);line-height:1.5}.webform-print-page-html .webform-section-wrapper fieldset{padding:var(--spacing-s)}@media(min-width: 768px){.webform-print-page-html .webform-section-wrapper fieldset{min-width:400px;padding:var(--spacing-s) var(--spacing-m)}}.application-list{padding-bottom:var(--spacing-xl);padding-left:0}.application-list__processed-human-readable{display:none}.application-list__item{background:var(--color-bus-light);display:block;margin:var(--spacing-m) 0;padding:var(--spacing-2-xl) var(--spacing-s) var(--spacing-m);position:relative}.application-list__item .new-message{background-color:var(--color-alert);border-radius:var(--spacing-xl);display:inline-block;padding:var(--spacing-2-xs)}.application-list__item .new-message .hel-icon--size-s{height:20px;width:20px}.application-list__item h3,.application-list__item h4{margin-top:var(--spacing-xs)}.application-list__item h4{font-size:1rem}.application-list__item--submitted{display:none}.application-list__item__link{display:flex;margin-top:var(--spacing-m)}.application-list__item__link a{font-size:1.25rem}.application-list__item__link a i{vertical-align:text-bottom}.application-list__item__row{display:flex;flex-flow:row wrap;gap:var(--spacing-m);justify-content:space-between}.application-list__item__row__left{justify-content:flex-start}.application-list__item__row__top{padding:var(--spacing-2-xs) var(--spacing-s) var(--spacing-2-xs) 0;position:absolute;top:0;width:100%}.application-list__item--status{--status-label-height: 32px;align-items:center;border-radius:20px;display:inline-flex;font-size:var(--fontsize-body-s);line-height:var(--status-label-height);min-height:var(--status-label-height);padding:var(--spacing-3-xs) var(--spacing-s);padding-left:var(--spacing-xs);vertical-align:middle}.application-list__item--status+.hds-loading-spinner{display:inline-block;left:10px;margin:0;padding:0;position:relative;top:var(--spacing-3-xs)}.application-list__item--status.hide-spinner+.hds-loading-spinner{display:none}.application-list__item--status+div+.application-list__item--error{display:none}.application-list__item--status.show-error{background:var(--color-black-20);color:var(--color-black-90)}.application-list__item--status.show-error+div+.application-list__item--error{display:inline-flex;left:var(--spacing-xs);margin:0;padding:0;position:relative;top:var(--spacing-3-xs)}.application-list__item--status.show-error+div+.application-list__item--error .application-list--error-text{display:inline-block;margin-left:var(--spacing-2-xs)}.application-list__item--status--draft{padding-left:0}.application-list__item--status--sent,.application-list__item--status--submitted{background:var(--color-black-10)}.application-list__item--status--sent::before,.application-list__item--status--submitted::before{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--alert-circle);mask-image:var(--hel-icon--alert-circle);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));background-color:var(--color-black);content:"";margin-right:var(--spacing-2-xs)}.application-list__item--status--received,.application-list__item--status--pending,.application-list__item--status--processing,.application-list__item--status--preparing{background:var(--color-info);color:var(--color-white)}.application-list__item--status--received::before,.application-list__item--status--pending::before,.application-list__item--status--processing::before,.application-list__item--status--preparing::before{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--info-circle);mask-image:var(--hel-icon--info-circle);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));background-color:var(--color-white);content:"";margin-right:var(--spacing-2-xs)}.application-list__item--status--done,.application-list__item--status--ready,.application-list__item--status--resolved{background:var(--color-success);color:var(--color-white)}.application-list__item--status--done::before,.application-list__item--status--ready::before,.application-list__item--status--resolved::before{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--check-circle);mask-image:var(--hel-icon--check-circle);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));background-color:var(--color-white);content:"";margin-right:var(--spacing-2-xs)}.application-list__item--status--rejected,.application-list__item--status--deleted,.application-list__item--status--canceled,.application-list__item--status--cancelled{background:var(--color-alert)}.application-list__item--status--rejected::before,.application-list__item--status--deleted::before,.application-list__item--status--canceled::before,.application-list__item--status--cancelled::before{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--alert-circle);mask-image:var(--hel-icon--alert-circle);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));background-color:var(--color-black);content:"";margin-right:var(--spacing-2-xs)}.application-list__item--status--error{background:var(--color-black-20);color:var(--color-black);text-transform:uppercase}.application-list__item--status--error .hel-icon{margin-right:var(--spacing-3-xs)}.application-list__count{font-size:1.5rem}.application-list__count-value{font-weight:bold}.application-list__information-row{align-items:flex-end;display:flex;flex-flow:row nowrap;justify-content:space-between;width:100%}@media(max-width: 35rem){.application-list__information-row{flex-flow:row wrap}}.application-list__information-row .grant-applications--select-wrapper select{max-width:100%;width:322px}.application-list__status__wrapper{background:var(--color-black-5)}.application-list__status__container{display:flex;flex-flow:row wrap;gap:var(--spacing-layout-m);justify-content:flex-start;padding-bottom:var(--spacing-m);padding-top:var(--spacing-m)}.application-list__status__label{font-weight:bold}.application-list__status__value{display:flex;flex-flow:row;justify-items:center;min-height:var(--spacing-xl)}.application-list__status__value>div{margin:auto}.application-list__search-row{align-items:flex-end;display:flex;flex-flow:row nowrap;gap:var(--spacing-s);justify-content:space-between;width:100%}@media(max-width: 35rem){.application-list__search-row{flex-flow:row wrap}}.application-list__search-row .hds-text-input{flex:1 100%;max-width:100%}.application-list__search-row .hds-text-input__input-wrapper{display:block}.application-list__search-row .hds-text-input__input-wrapper input{width:100%}.application-list__search-row button{white-space:nowrap}.application-list__pagination{--line-height: 1.5555555556;font-size:1.125rem;font-weight:400;line-height:var(--line-height);display:inline-flex;flex-wrap:wrap;font-weight:700;gap:var(--spacing-2-xs);justify-content:center;list-style:none;padding:0}.application-list__pagination li{margin-top:0}.application-list__pagination li.active a{text-decoration:underline}.application-list__pagination li.disabled a{cursor:default;text-decoration:none}.application-list__pagination li.disabled a:hover,.application-list__pagination li.disabled a:focus,.application-list__pagination li.disabled a:active{outline:none;text-decoration:none}.application-list__pagination li a{color:var(--color-black-90);display:block;height:var(--link-height);min-width:40px;padding-left:var(--spacing-3-xs);padding-right:var(--spacing-3-xs);text-decoration:none}.application-list__pagination li a:hover{text-decoration:underline}.application-list__pagination li a:focus,.application-list__pagination li a:active{outline:solid var(--color-coat-of-arms) 3px;outline-offset:1px}.grants-profile hr{border:1px solid var(--color-silver);margin:var(--spacing-layout-xs) 0}.grants-profile h3.info-grants{border-bottom:2px solid var(--color-silver);padding-bottom:var(--spacing-l)}.grants-profile--title{align-items:center;display:flex;flex-flow:row nowrap}.grants-profile--title .grants-profile--initials{border-radius:50%;display:none;font-size:var(--fontsize-body-xl);font-weight:bold;height:var(--spacing-4-xl);line-height:var(--spacing-4-xl);margin-right:var(--spacing-m);text-align:center;vertical-align:middle;width:var(--spacing-4-xl)}@media(min-width: 992px){.grants-profile--title .grants-profile--initials{display:block}}.grants-profile--title .grants-profile--initials:hover,.grants-profile--title .grants-profile--initials:active,.grants-profile--title .grants-profile--initials:focus{text-decoration:underline}.grants-profile--title .grants-profile--initials-colorscheme-2{background-color:var(--color-bus);color:var(--color-white)}.grants-profile--title .grants-profile--initials-colorscheme-1{background-color:var(--color-engel);color:var(--color-black)}.grants-profile--title .grants-profile--initials-colorscheme-0{background-color:var(--color-tram);color:var(--color-white)}.grants-profile--title h1{flex-grow:100}.grants-profile--basicinfo{--line-height: 1.5;background-color:var(--color-silver-light);border-bottom:8px solid var(--color-engel-dark);padding-bottom:var(--spacing-2-xs);padding-top:var(--spacing-l)}.grants-profile--basicinfo h3{font-size:var(--fontsize-heading-l);margin-top:0;padding-top:0}.grants-profile--extrainfo{padding-bottom:var(--spacing-l);padding-top:var(--spacing-l)}.grants-profile--extrainfo .hds-notification{margin-bottom:var(--spacing-xl)}.grants-profile--extrainfo fieldset.form-wrapper{background-color:var(--color-silver-light);border:0;padding:var(--spacing-l)}.grants-profile--extrainfo fieldset.inline-error-message{background-color:transparent;background-color:initial;padding:0 0 0 var(--spacing-2-xs)}.grants-profile--extrainfo fieldset.inline-error-message legend{display:none}.grants-profile--update-link{margin-bottom:var(--spacing-layout-2-xs);margin-top:var(--spacing-layout-xs)}.grants-profile--infotext{font-size:var(--fontsize-body-l);margin-bottom:var(--spacing-s)}.grants-profile--wrapper{display:flex;flex-wrap:wrap}.grants-profile--wrapper-item{margin-bottom:var(--spacing-layout-2-xs);width:100%}@media(min-width: 576px){.grants-profile--wrapper-item{flex:1;margin-bottom:0}}.grants-profile--wrapper-item:first-child{flex:auto;margin-bottom:var(--spacing-layout-2-xs);width:100%}.grants-profile .profile-add-more{margin-top:1em}[dir="ltr"] .grants-profile dd{margin-left:0}[dir="rtl"] .grants-profile dd{margin-right:0}.grants-profile--officials{margin-left:0;padding-left:0}.grants-profile--officials-item{border-left:4px var(--color-copper) solid;display:flex;flex-flow:row nowrap;justify-content:space-between;list-style:none;margin-bottom:var(--spacing-layout-s);margin-left:0;max-width:var(--webform-element-width--input-large);padding-left:var(--spacing-layout-xs);width:100%}.grants-profile--officials-item--position{font-size:var(--fontsize-heading-xs);font-weight:bold;margin-bottom:var(--spacing-layout-2-xs);margin-top:0;padding-top:0}.grants-profile--officials-edit-wrapper{text-align:right}.grants-profile--officials-edit-wrapper a{display:inline-block}.grants-profile .hel-icon--check-circle-fill{color:var(--color-success);vertical-align:middle}.grants-profile-grants-profile .tabledrag-toggle-weight-wrapper,.grants-profile-grants-profile .field-multiple-drag{display:none}.grants-profile .hds-text-input__label{display:inline-block;margin-top:0}.page--oma-asiointi__private-person .grants-profile--basicinfo{border-bottom:8px solid var(--color-copper)}.page--oma-asiointi__private-person .grants-profile--wrapper{display:grid;grid-template-columns:1fr 1fr}.page--oma-asiointi__unregistered-community .grants-profile--wrapper{display:grid;grid-template-columns:1fr 1fr}.hds-link .hel-icon{margin-right:var(--spacing-2-xs);vertical-align:bottom}.hds-link span.link-label{font-weight:bold;margin-right:var(--spacing-m)}.bold-link{font-weight:bold}div.applicant-info--from-prh,div.applicant-info--from-grants{display:grid;grid-template-columns:1fr}@media(min-width: 576px){div.applicant-info--from-prh,div.applicant-info--from-grants{grid-template-columns:1fr 1fr}}@media(min-width: 768px){div.applicant-info--from-prh,div.applicant-info--from-grants{grid-template-columns:1fr 1fr 1fr}}div.applicant-info--from-prh .form-required::after,div.applicant-info--from-grants .form-required::after{content:none}div.applicant-info--from-prh{border-bottom:2px solid var(--color-silver);margin-bottom:var(--spacing-layout-xs);padding-bottom:var(--spacing-layout-2-xs)}div.grants-handler--prefilled-field .field-prefix,.grants-profile-prh-info .field-prefix{display:block;position:absolute;right:var(--spacing-layout-s);top:0}div.grants-handler--prefilled-field .hds-text-input__input-wrapper,div.grants-handler--prefilled-field .description,.grants-profile-prh-info .hds-text-input__input-wrapper,.grants-profile-prh-info .description{display:inline-block;white-space:normal}div.grants-handler--prefilled-field .hel-icon--check-circle-fill,.grants-profile-prh-info .hel-icon--check-circle-fill{color:var(--color-success);vertical-align:middle}div.grants-handler--prefilled-field .hds-text-input__input,div.grants-handler--prefilled-field .webform-element-description,.grants-profile-prh-info .hds-text-input__input,.grants-profile-prh-info .webform-element-description{color:var(--color-black);display:block;font-size:var(--fontsize-body-m);line-height:var(--spacing-m);position:relative}div.grants-handler--prefilled-field .hds-text-input__label,.grants-profile-prh-info .hds-text-input__label{margin-bottom:0}.grants-profile--imported-section .webform-section-flex-wrapper{background-color:var(--color-silver-light);border-bottom:8px solid var(--color-engel-dark);display:block;padding-bottom:var(--spacing-2-xs);padding-left:var(--spacing-l);padding-right:var(--spacing-l);padding-top:var(--spacing-l);width:100%}.grants-profile--imported-section .webform-section-flex-wrapper h3.webform-section-title{font-size:var(--fontsize-heading-l);font-weight:400;margin-top:0;max-width:100%;padding-top:0;width:100%}.grants-profile--imported-section .webform-section-flex-wrapper .webform-section-wrapper{padding:0}.grants-profile--imported-section .webform-section-flex-wrapper .hds-text-input{margin-bottom:0}.grants-profile--imported-section .webform-section-flex-wrapper #edit-grants-profile-items-container{display:flex;flex-flow:row wrap;justify-content:space-between;margin-bottom:var(--spacing-layout-xs);margin-top:var(--spacing-layout-xs);width:100%}.grants-profile--imported-section .webform-section-flex-wrapper #edit-grants-profile-items-container>div{margin:0 var(--spacing-layout-xs) 0 0;min-width:160px}.grants-profile--imported-section .webform-section-flex-wrapper #edit-grants-profile-items-container .hds-text-input__input-wrapper{display:none}.grants-profile--imported-section .webform-section-flex-wrapper #edit-grants-profile-items-container label{font-size:var(--fontsize-body-m);font-weight:bold;margin:0}.grants-profile--imported-section .webform-section-flex-wrapper .form-item-prh-markup{border-bottom:2px solid var(--color-silver);padding-bottom:var(--spacing-layout-xs);padding-top:var(--spacing-layout-xs)}.grants-profile__local-tasks__wrapper{margin-bottom:0}.openid-connect-login-form.openid-connect-login-form{border-bottom:0;margin-bottom:0;padding-bottom:0}.grants-profile--links{display:flex;justify-content:space-between}.company-delete-confirm-form .form-actions{margin-top:var(--spacing-layout-xs)}.company-delete-confirm-form .form-submit{margin-right:var(--spacing-2-xs)}.page--oma-asiointi .main-content{margin-top:0}.page--oma-asiointi .main-content h2{margin-top:var(--spacing-m)}.hero--oma-asiointi{margin-bottom:var(--spacing-l)}.hero--oma-asiointi .container{padding-top:var(--spacing-layout-m)}.hero--oma-asiointi .hero__text-content{align-items:center;display:flex}.hero--oma-asiointi .hero__title{margin-left:0}@media(min-width: 576px){.hero--oma-asiointi .hero__title{margin-left:40px}}.hero--oma-asiointi .hel-icon{display:none}@media(min-width: 576px){.hero--oma-asiointi .hel-icon{--icon-size: 48px;display:block;flex-shrink:0}}#oma-asiointi__sent{background:var(--color-silver-light)}#oma-asiointi__sent .application-list__item{background:var(--color-white)}.oma-asiointi-block{background-color:var(--color-silver-light);padding-bottom:var(--spacing-l);padding-top:var(--spacing-l)}.oma-asiointi-block h2{margin-bottom:var(--spacing-s);margin-top:0}.oma-asiointi-block h3{font-size:var(--fontsize-heading-m);font-weight:500}.oma-asiointi-block .header{border-bottom:1px solid var(--color-silver-dark);display:flex;justify-content:space-between;padding-bottom:var(--spacing-xs)}.oma-asiointi-block .header .user,.oma-asiointi-block .header .link{font-weight:700}.oma-asiointi-block .header .link .hel-icon{vertical-align:text-top}.oma-asiointi-block--link{display:block;position:relative;text-decoration:none}.oma-asiointi-block--link::after{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--arrow-right);mask-image:var(--hel-icon--arrow-right);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));transition:transform .2s linear;bottom:var(--spacing-m);content:"";display:block;flex-shrink:0;margin-left:-4px;margin-top:var(--spacing-2-xs);position:absolute;right:var(--spacing-m)}@media(prefers-reduced-motion){.oma-asiointi-block--link::after{transition:none}}@media(min-width: 576px){.oma-asiointi-block--link::after{--icon-size: 3rem;margin-left:-8px;margin-top:var(--spacing-s)}}.oma-asiointi-block--link:focus::after,.oma-asiointi-block--link:hover::after{transform:translateX(var(--spacing-2-xs))}@media(prefers-reduced-motion){.oma-asiointi-block--link:focus::after,.oma-asiointi-block--link:hover::after{transform:none}}.oma-asiointi-block .new-message{background-color:var(--color-alert);display:inline-block;font-weight:500;padding:var(--spacing-2-xs);text-transform:uppercase}.oma-asiointi-block .new-messages-length{background-color:var(--color-black-20);border-radius:50%;display:inline-block;font-size:var(--fontsize-heading-s);height:30px;line-height:30px;margin-left:var(--spacing-m);position:relative;text-align:center;width:30px}.oma-asiointi-block .new-messages-length.has-new-messages{background-color:var(--color-alert)}@media(min-width: 768px){.oma-asiointi-block .content{display:grid;grid-gap:var(--spacing-s);grid-template-columns:1fr 1fr}}.oma-asiointi-block .submission,.oma-asiointi-block .message{background-color:var(--color-white);margin-bottom:var(--spacing-s);margin-top:var(--spacing-s);padding:var(--spacing-m)}.oma-asiointi-block .submission .submission-title,.oma-asiointi-block .submission .message-title,.oma-asiointi-block .message .submission-title,.oma-asiointi-block .message .message-title{font-size:var(--fontsize-heading-s);font-weight:500;margin-bottom:var(--spacing-2-xs);margin-top:0;text-decoration:underline}.oma-asiointi-block .submission .message-title,.oma-asiointi-block .message .message-title{margin-top:var(--spacing-s)}.oma-asiointi-block .submission:hover .submission-title,.oma-asiointi-block .submission:hover .message-title,.oma-asiointi-block .message:hover .submission-title,.oma-asiointi-block .message:hover .message-title{text-decoration:none}.oma-asiointi-block .message{padding-right:var(--spacing-5-xl)}.oma-asiointi{margin-top:var(--spacing-l)}.oma-asiointi ul{padding:0}.oma-asiointi__list{padding-bottom:var(--spacing-l);padding-top:var(--spacing-l)}.oma-asiointi__list h2{margin-bottom:var(--spacing-m);margin-top:0}.oma-asiointi #oma-asiointi__sent{padding-top:var(--spacing-s)}.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infoboxes{gap:var(--spacing-3-xl);margin:var(--spacing-2-xl) 0}@media(min-width: 768px){.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infoboxes{display:flex}}.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infobox{background-color:var(--color-info-light);flex:1;margin-bottom:var(--spacing-layout-2-xs);padding:var(--spacing-l)}@media(min-width: 768px){.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infobox{margin-bottom:0}}.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infobox:last-of-type{margin-bottom:0}.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infobox--link{display:flex;margin-top:var(--spacing-layout-2-xs)}.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infobox--link a{font-size:1.25rem}.oma-asiointi .oma-asiointi-infoboxes-container .oma-asiointi-infobox h3{margin-top:0}.asiointirooli-block{background-color:var(--color-black);color:var(--color-white);font-weight:500;margin-bottom:16px;padding:var(--spacing-2-xs)}.asiointirooli-block a{color:var(--color-white)}.asiointirooli-block .link--switch-role,.asiointirooli-block .link--stop-mandate{color:var(--color-white);margin-left:var(--spacing-layout-s)}@media(max-width: 768px){.asiointirooli-block .link--switch-role,.asiointirooli-block .link--stop-mandate{display:block;margin-left:0}}.asiointirooli-block .link--stop-mandate::before{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--cross-circle-fill);mask-image:var(--hel-icon--cross-circle-fill);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));background-color:var(--color-white);content:"";display:inline-block;margin-right:10px;-webkit-mask-image:url('data:image/svg+xml, ');mask-image:url('data:image/svg+xml, ')}.asiointirooli-block .link--switch-role::before{--icon-size: 1.5rem;background-color:#000;background-size:contain;content:"";display:inline-block;height:calc(var(--line-height) * 1em);height:var(--icon-size, calc(var(--line-height) * 1em));-webkit-mask-image:var(--hel-icon--swap-user);mask-image:var(--hel-icon--swap-user);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);mask-size:calc(var(--line-height) * 1em) calc(var(--line-height) * 1em);-webkit-mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));mask-size:var(--icon-size, calc(var(--line-height) * 1em)) var(--icon-size, calc(var(--line-height) * 1em));vertical-align:bottom;width:calc(var(--line-height) * 1em);width:var(--icon-size, calc(var(--line-height) * 1em));background-color:var(--color-white);content:"";display:inline-block;margin-right:10px;-webkit-mask-image:url('data:image/svg+xml, ');mask-image:url('data:image/svg+xml, ')}#grants-mandate-type .form-actions{display:flex;flex-direction:column;flex-wrap:wrap;justify-content:flex-start;width:100%}@media(min-width: 576px){#grants-mandate-type .form-actions{flex-direction:row;margin-left:calc(-1*var(--spacing-m));width:calc(100% + var(--spacing-m))}}#grants-mandate-type .form-actions .hds-card--applicant-role{margin-bottom:var(--spacing-l);position:relative;width:100%}@media(min-width: 576px){#grants-mandate-type .form-actions .hds-card--applicant-role{margin-left:var(--spacing-m);width:calc(50% - var(--spacing-m))}}@media(min-width: 992px){#grants-mandate-type .form-actions .hds-card--applicant-role{width:calc(33.3333333333% - var(--spacing-m))}}#grants-mandate-type .form-actions .hds-card--applicant-role .hds-card__body{align-content:space-between;height:100%}#grants-mandate-type .form-actions .hds-card--applicant-role .hds-card--mandate-card-content{display:grid;gap:var(--spacing-m);grid-gap:var(--spacing-m)} diff --git a/public/themes/custom/hdbt_subtheme/dist/js/matomo.min.js b/public/themes/custom/hdbt_subtheme/dist/js/matomo.min.js index 52425e03f8..97c4ae16ef 100644 --- a/public/themes/custom/hdbt_subtheme/dist/js/matomo.min.js +++ b/public/themes/custom/hdbt_subtheme/dist/js/matomo.min.js @@ -1 +1 @@ -!function(e,Drupal){function c(){if(void 0!==Drupal.eu_cookie_compliance&&Drupal.eu_cookie_compliance.hasAgreed("statistics")){const e=window._paq=window._paq||[];e.push(["trackPageView"]),e.push(["enableLinkTracking"]),function(){const c="//webanalytics.digiaiiris.com/js/";e.push(["setTrackerUrl",`${c}tracker.php`]),e.push(["setSiteId","1219"]);const i=document,n=i.createElement("script"),t=i.getElementsByTagName("script")[0];n.async=!0,n.src=`${c}piwik.min.js`,t.parentNode.insertBefore(n,t)}()}}e(document).on("eu_cookie_compliance.changeStatus",c()),e(document).ready(c)}(jQuery,Drupal); \ No newline at end of file +!function(e,Drupal){const t=()=>{if(Drupal.cookieConsent.getConsentStatus(["statistics"])){const e=window._paq=window._paq||[];e.push(["trackPageView"]),e.push(["enableLinkTracking"]),function(){const t="//webanalytics.digiaiiris.com/js/";e.push(["setTrackerUrl",`${t}tracker.php`]),e.push(["setSiteId","1219"]);const n=document,i=n.createElement("script"),s=n.getElementsByTagName("script")[0];i.async=!0,i.src=`${t}piwik.min.js`,s.parentNode.insertBefore(i,s)}()}};Drupal.cookieConsent.initialized()?t():Drupal.cookieConsent.loadFunction(t)}(jQuery,Drupal); \ No newline at end of file diff --git a/public/themes/custom/hdbt_subtheme/package-lock.json b/public/themes/custom/hdbt_subtheme/package-lock.json index 737369b2cb..416b9bcc7b 100644 --- a/public/themes/custom/hdbt_subtheme/package-lock.json +++ b/public/themes/custom/hdbt_subtheme/package-lock.json @@ -3310,9 +3310,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001669", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", - "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", + "version": "1.0.30001683", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz", + "integrity": "sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==", "funding": [ { "type": "opencollective", @@ -3326,7 +3326,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "2.4.2", diff --git a/public/themes/custom/hdbt_subtheme/src/js/matomo.js b/public/themes/custom/hdbt_subtheme/src/js/matomo.js index 7a68ba381b..6e730bc240 100644 --- a/public/themes/custom/hdbt_subtheme/src/js/matomo.js +++ b/public/themes/custom/hdbt_subtheme/src/js/matomo.js @@ -1,12 +1,9 @@ // eslint-disable-next-line func-names (function ($, Drupal) { - function loadMatomoAnalytics() { - if (typeof Drupal.eu_cookie_compliance === "undefined") { - return; - } + const loadMatomoAnalytics = () => { // Load Matomo only if statistics cookies are allowed. - if (Drupal.eu_cookie_compliance.hasAgreed("statistics")) { + if (Drupal.cookieConsent.getConsentStatus(['statistics'])) { // Matomo Tag Manager // eslint-disable-next-line no-multi-assign const _paq = (window._paq = window._paq || []); @@ -25,11 +22,12 @@ s.parentNode.insertBefore(g, s); })(); } - } + }; // Load when cookie settings are changed. - $(document).on("eu_cookie_compliance.changeStatus", loadMatomoAnalytics()); - - // Load on page load. - $(document).ready(loadMatomoAnalytics); + if (Drupal.cookieConsent.initialized()) { + loadMatomoAnalytics(); + } else { + Drupal.cookieConsent.loadFunction(loadMatomoAnalytics); + } })(jQuery, Drupal); diff --git a/public/themes/custom/hdbt_subtheme/src/scss/06_components/forms/webform/_element-description.scss b/public/themes/custom/hdbt_subtheme/src/scss/06_components/forms/webform/_element-description.scss index 933c75cb0b..8dd1687fe6 100644 --- a/public/themes/custom/hdbt_subtheme/src/scss/06_components/forms/webform/_element-description.scss +++ b/public/themes/custom/hdbt_subtheme/src/scss/06_components/forms/webform/_element-description.scss @@ -1,8 +1,3 @@ .webform-element-description { - --helper-color-default: var(--color-black-60); - color: var(--helper-color-default); - display: block; - font-size: var(--fontsize-body-m); - line-height: var(--lineheight-l); - margin-top: var(--spacing-s); + margin-top: $spacing-half; } diff --git a/public/themes/custom/hdbt_subtheme/src/scss/06_components/forms/webform/_form-elements.scss b/public/themes/custom/hdbt_subtheme/src/scss/06_components/forms/webform/_form-elements.scss index b90b09b3b0..0a4cf75121 100644 --- a/public/themes/custom/hdbt_subtheme/src/scss/06_components/forms/webform/_form-elements.scss +++ b/public/themes/custom/hdbt_subtheme/src/scss/06_components/forms/webform/_form-elements.scss @@ -470,6 +470,10 @@ input[type='radio'] + label.form-required::after { } } +.club-section__participants label { + text-wrap: balance; +} + .hel-icon--size { &-xs { --icon-size: var(--spacing-layout-2-xs); diff --git a/public/themes/custom/hdbt_subtheme/templates/form/input-email/form-element--email.html.twig b/public/themes/custom/hdbt_subtheme/templates/form/input-email/form-element--email.html.twig index b28d9195cf..f7725a03af 100644 --- a/public/themes/custom/hdbt_subtheme/templates/form/input-email/form-element--email.html.twig +++ b/public/themes/custom/hdbt_subtheme/templates/form/input-email/form-element--email.html.twig @@ -60,7 +60,6 @@ {% set description_classes = [ 'description', - 'hds-text-input__helper-text', description_display == 'invisible' ? 'visually-hidden', ] %} diff --git a/public/themes/custom/hdbt_subtheme/templates/form/input-number/form-element--number.html.twig b/public/themes/custom/hdbt_subtheme/templates/form/input-number/form-element--number.html.twig index b28d9195cf..f7725a03af 100644 --- a/public/themes/custom/hdbt_subtheme/templates/form/input-number/form-element--number.html.twig +++ b/public/themes/custom/hdbt_subtheme/templates/form/input-number/form-element--number.html.twig @@ -60,7 +60,6 @@ {% set description_classes = [ 'description', - 'hds-text-input__helper-text', description_display == 'invisible' ? 'visually-hidden', ] %} diff --git a/public/themes/custom/hdbt_subtheme/templates/webform/application-copy-dialog-content.html.twig b/public/themes/custom/hdbt_subtheme/templates/webform/application-copy-dialog-content.html.twig new file mode 100644 index 0000000000..3cc165767a --- /dev/null +++ b/public/themes/custom/hdbt_subtheme/templates/webform/application-copy-dialog-content.html.twig @@ -0,0 +1,2 @@ +

{{ "Application to copy"|t({}, {'context': 'grants_handler'})}}: {{ webformTitle }}

+

{{ "Application number"|t({}, {'context': 'grants_handler'})}}: {{ applicationNumber }}

diff --git a/public/themes/custom/hdbt_subtheme/templates/webform/webform-submission-form.html.twig b/public/themes/custom/hdbt_subtheme/templates/webform/webform-submission-form.html.twig index d649e3adf1..b723a4b8e6 100644 --- a/public/themes/custom/hdbt_subtheme/templates/webform/webform-submission-form.html.twig +++ b/public/themes/custom/hdbt_subtheme/templates/webform/webform-submission-form.html.twig @@ -52,27 +52,52 @@ {% endfor %} {% if has_errors is same as true %} -
-
-
- - {{ 'Missing or incomplete information'|t }} +
+
+
+ + {{ 'Missing or incomplete information'|t }} +
+
+
    + {% for page in errors %} + {% for name,element in page %} + {% if name is not same as 'title' %} +
  • + {{ 'Error in page'|t }} {{ page['title'] }}: {{ element }} +
  • + {% endif %} + {% endfor %} + {% endfor %} +
+
-
-
    - {% for page in errors %} - {% for name,element in page %} - {% if name is not same as 'title' %} -
  • - {{ 'Error in page'|t }} {{ page['title'] }}: {{ element }} -
  • - {% endif %} +
+ {% endif %} + + {% if display_visit_all_pages_warning %} +
+
+
+ + + {% trans with {'context': 'grants_theme'} %} + You must visit all pages in the form before you can submit the application + {% endtrans %} + +
+
+ {{ 'Unvisited pages:'|trans({}, {'context': 'grants_theme'}) }} +
    + {% for page in unvisited_pages %} +
  • + {{ page['#title'] }} +
  • {% endfor %} - {% endfor %} -
+ +
-
-
+ {% endif %} {{ form }} diff --git a/public/themes/custom/hdbt_subtheme/templates/webform/webform-submission-information.html.twig b/public/themes/custom/hdbt_subtheme/templates/webform/webform-submission-information.html.twig index 58cc39d906..daa38f316b 100644 --- a/public/themes/custom/hdbt_subtheme/templates/webform/webform-submission-information.html.twig +++ b/public/themes/custom/hdbt_subtheme/templates/webform/webform-submission-information.html.twig @@ -33,43 +33,51 @@

{{ 'Application info'|t }}

{{ 'Summary about your application and processing details.'|t }}

-
-

- {{ webform.text }} -

- +
+

+ {{ webform.text }} +

+ -
- -
-
{{ "Application number"|t }}
- {{ applicationNumber }} -
{{ 'Sent date'|t }}
- {{ applicationSent }} -
{{ 'Handler information'|t }}
- {{ handler }} -
-
-
{{ "Application statuses"|t }}
- {{ history }} +
+
+
+
{{ "Application number"|t }}
+ {{ applicationNumber }} +
{{ 'Sent date'|t }}
+ {{ applicationSent }} +
{{ 'Handler information'|t }}
+ {{ handler }} +
+
+
{{ "Application statuses"|t }}
+ {{ history }} -
-
-
{{ "Application attachments"|t }}
+
+
+
{{ "Application attachments"|t }}
- {{ attachments }} + {{ attachments }} -
+
+
+ {% if isEditable and not isEditPage %} +
+ {{ editApplicationLink }}
- {% if isEditable and not isEditPage %} -
- {{ editApplicationLink }} -
- {% endif %} + {% endif %}
diff --git a/public/themes/custom/hdbt_subtheme/translations/fi.po b/public/themes/custom/hdbt_subtheme/translations/fi.po index c964ba099e..0cc19655ef 100644 --- a/public/themes/custom/hdbt_subtheme/translations/fi.po +++ b/public/themes/custom/hdbt_subtheme/translations/fi.po @@ -466,3 +466,11 @@ msgstr "kpl sivulla" msgctxt "grants_theme" msgid "Items per page" msgstr "Merkintöjä sivua kohti" + +msgctxt "grants_theme" +msgid "You must visit all pages in the form before you can submit the application" +msgstr "Käy kaikilla sivuilla ennen kuin lähetät hakemuksen" + +msgctxt "grants_theme" +msgid "Unvisited pages:" +msgstr "Sivut, joilla ei ole käyty:" diff --git a/public/themes/custom/hdbt_subtheme/translations/sv.po b/public/themes/custom/hdbt_subtheme/translations/sv.po index c8b62b047e..3e9662d29b 100644 --- a/public/themes/custom/hdbt_subtheme/translations/sv.po +++ b/public/themes/custom/hdbt_subtheme/translations/sv.po @@ -416,3 +416,11 @@ msgstr "per sida" msgctxt "grants_theme" msgid "Items per page" msgstr "Inlägg per sida" + +msgctxt "grants_theme" +msgid "You must visit all pages in the form before you can submit the application" +msgstr "Du måste besöka alla sidor i formuläret innan du kan skicka in ansökan" + +msgctxt "grants_theme" +msgid "Unvisited pages:" +msgstr "Obesökta sidor:" diff --git a/tools/http/ATV.http b/tools/http/ATV.http index be6ec438c4..bab68dfcab 100644 --- a/tools/http/ATV.http +++ b/tools/http/ATV.http @@ -1,6 +1,11 @@ -# Get single document by transaction_id +# Get single document by document id +GET {{atvUrl}}/v1/documents/{{document_id}} +Accept-Encoding: utf8 +X-Api-Key: {{atvApiKey}} + +#### Get single document by transaction_id GET {{atvUrl}}/v1/documents/? - transaction_id={{transaction_id}} + transaction_id={{transactionId}} Accept-Encoding: utf8 X-Api-Key: {{atvApiKey}} @@ -19,7 +24,7 @@ GET {{atvUrl}}/v1/documents/? user_id={{user_id}}& type={{type}}& service_name=AvustushakemusIntegraatio& - transaction_id={{transaction_id}} + transaction_id={{transactionId}} Accept-Encoding: utf8 X-Api-Key: {{atvApiKey}} diff --git a/tools/http/Integraatio.http b/tools/http/Integraatio.http new file mode 100644 index 0000000000..fe97c5a548 --- /dev/null +++ b/tools/http/Integraatio.http @@ -0,0 +1,50 @@ +### Create Event via integration API +POST {{integraatioUrl}}/createEvent +Authorization: Basic {{integraatioBasicToken}} +Content-Type: application/json + +{ + "caseId": "{{transactionId}}", + "eventType": "EVENT_INFO", + "eventCode": 0, + "eventSource": "Avustusten kasittelyjarjestelma", + "eventDescription": "Puhakka Tero;09 310 36070;tero.puhakka@hel.fi", + "eventDescription_SV": null, + "eventDescription_EN": null, + "timeUpdated": null, + "timeCreated": "{{$isoTimestamp}}", + "eventTarget": null, + "eventID": "{{$random.uuid}}" +} + +### Create Status Update via integration API +POST {{integraatioUrl}}/updateCitizenCaseStatus +Authorization: Basic {{integraatioBasicToken}} +Content-Type: application/json + +{ + "caseId": "{{transactionId}}", + "citizenCaseStatus" : "PROCESSING", + "eventType" : "STATUS_UPDATE", + "eventCode" : 0, + "eventSource" : "Avustusten kasittelyjarjestelma", + "timeUpdated" : null, + "timeCreated": "{{$isoTimestamp}}" +} + +### Create Message via integration API +POST {{integraatioUrl}}/createConversationMessage +Authorization: Basic {{integraatioBasicToken}} +Content-Type: application/json + +{ +"caseId": "{{transactionId}}", +"messageId" : "{{$random.uuid}}", +"body" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit", +"sentBy" : "Avustusten kasittelyjarjestelma", +"sendDateTime" :"{{$isoTimestamp}}" +} + +### + + diff --git a/tools/http/http-client.env.json b/tools/http/http-client.env.json new file mode 100644 index 0000000000..71ea491f75 --- /dev/null +++ b/tools/http/http-client.env.json @@ -0,0 +1,8 @@ +{ + "dev": { + "atvUrl": "https://atv-api-hki-kanslia-atv-test.agw.arodevtest.hel.fi", + "transactionId": "TEST-070-0000052", + "document_id": "28753685-24b8-4542-b1c1-cc70ff9f9fbc", + "integraatioUrl": "https://avustus-integration-test.agw.arodevtest.hel.fi" + } +}