diff --git a/.docker/templates/default.conf.template b/.docker/templates/default.conf.template index 02fa1147c..b07bc6427 100644 --- a/.docker/templates/default.conf.template +++ b/.docker/templates/default.conf.template @@ -89,7 +89,7 @@ server { # Define which paths to protect location ~ ^/(flag/flag|admin|user/login) { # Block bots on these paths only - if ($http_user_agent ~* (bot|crawler|spider|scraper)) { + if ($http_user_agent ~* (bot|crawl|crawler|spider|scraper)) { return 403; } diff --git a/.woodpecker/stg.yml b/.woodpecker/stg.yml index ceb0b9f12..3d150a9b6 100644 --- a/.woodpecker/stg.yml +++ b/.woodpecker/stg.yml @@ -23,6 +23,8 @@ steps: user: from_secret: user actions: + # Make sure that we can update the general settings. + - chmod +w web/sites/default web/sites/default/settings.php - git fetch origin ${CI_COMMIT_BRANCH} - git checkout --force ${CI_COMMIT_BRANCH} - git reset --hard origin/${CI_COMMIT_BRANCH} diff --git a/CHANGELOG.md b/CHANGELOG.md index 470a0df57..60255d057 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,29 @@ Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] -## [4.15.2] - 2026-02-26 +* [PR-638](https://github.com/itk-dev/deltag.aarhus.dk/pull/638) + Changed flags templates to use html button instead of anchor tag. + +## [4.16.1] - 2026-03-23 + +* [PR-640](https://github.com/itk-dev/deltag.aarhus.dk/pull/640) + Use string value when truncating +* [PR-639](https://github.com/itk-dev/deltag.aarhus.dk/pull/639) + Hid “Hide in timeline” from display +## [4.16.0] - 2026-03-09 +* [PR-635](https://github.com/itk-dev/deltag.aarhus.dk/pull/635) + Updated itk_pretix module and migrated contact mail +* [PR-634](https://github.com/itk-dev/deltag.aarhus.dk/pull/634) + Added “Hide hearing replies” option +* [633](https://github.com/itk-dev/deltag.aarhus.dk/pull/633) + Added handling of orphaned timeline note paragraphs. +* [PR-630](https://github.com/itk-dev/deltag.aarhus.dk/pull/630) + * Updated accessibility + * Added back to dialogue buttons. + +## [4.15.2] - 2026-02-26 ## [4.15.1] - 2026-02-25 @@ -682,7 +702,9 @@ Updated drupal core 8.6.16 Initial release -[Unreleased]: https://github.com/itk-dev/hoeringsportal/compare/4.15.2...HEAD +[Unreleased]: https://github.com/itk-dev/hoeringsportal/compare/4.16.1...HEAD +[4.16.1]: https://github.com/itk-dev/hoeringsportal/compare/4.16.0...4.16.1 +[4.16.0]: https://github.com/itk-dev/hoeringsportal/compare/4.15.2...4.16.0 [4.15.2]: https://github.com/itk-dev/hoeringsportal/compare/4.15.1...4.15.2 [4.15.1]: https://github.com/itk-dev/hoeringsportal/compare/4.15.0...4.15.1 [4.15.0]: https://github.com/itk-dev/hoeringsportal/compare/4.14.7...4.15.0 diff --git a/composer.json b/composer.json index 238dc1e20..de32af58c 100755 --- a/composer.json +++ b/composer.json @@ -80,11 +80,11 @@ "itk-dev/azure-ad-delta-sync-drupal": "^2.0", "itk-dev/composer-virtualenv": "^1.0", "itk-dev/itk_azure_video": "^2.0", - "itk-dev/itk_pretix": "^1.3", + "itk-dev/itk_pretix": "^1.5", "itk-dev/itk_siteimprove": "^1.2", "itk-dev/itk_video": "^1.0", "itk-dev/serviceplatformen": "^1.5", - "itk-dev/web_accessibility_statement": "^1.0", + "itk-dev/web_accessibility_statement": "^1.3", "onelogin/php-saml": "^4.0", "oomphinc/composer-installers-extender": "^2.0", "vlucas/phpdotenv": "^2.4", diff --git a/composer.lock b/composer.lock index 51e28baaa..4b8868f8b 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": "584b16c246cd2bf5c0dc6c30cece6cd8", + "content-hash": "7104c0ac7a701982773f7df48b2cb697", "packages": [ { "name": "asm89/stack-cors", @@ -7269,16 +7269,16 @@ }, { "name": "itk-dev/itk_pretix", - "version": "1.3.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/itk-dev/itk_pretix.git", - "reference": "9e10ac6e55b01b44f0a0d1f3b6b283f11995a494" + "reference": "81acb13bd49508916091803894eed54936200bfd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/itk-dev/itk_pretix/zipball/9e10ac6e55b01b44f0a0d1f3b6b283f11995a494", - "reference": "9e10ac6e55b01b44f0a0d1f3b6b283f11995a494", + "url": "https://api.github.com/repos/itk-dev/itk_pretix/zipball/81acb13bd49508916091803894eed54936200bfd", + "reference": "81acb13bd49508916091803894eed54936200bfd", "shasum": "" }, "require": { @@ -7307,9 +7307,9 @@ ], "support": { "issues": "https://github.com/itk-dev/itk_pretix/issues", - "source": "https://github.com/itk-dev/itk_pretix/tree/1.3.0" + "source": "https://github.com/itk-dev/itk_pretix/tree/1.5.0" }, - "time": "2025-07-04T12:26:59+00:00" + "time": "2026-03-09T08:54:50+00:00" }, { "name": "itk-dev/itk_siteimprove", diff --git a/config/sync/block.block.claro_breadcrumbs.yml b/config/sync/block.block.claro_breadcrumbs.yml index 1b16931a3..fc09dc0a6 100644 --- a/config/sync/block.block.claro_breadcrumbs.yml +++ b/config/sync/block.block.claro_breadcrumbs.yml @@ -16,7 +16,7 @@ provider: null plugin: system_breadcrumb_block settings: id: system_breadcrumb_block - label: Breadcrumbs + label: Brødkrummer label_display: '0' provider: system visibility: { } diff --git a/config/sync/block.block.claro_content.yml b/config/sync/block.block.claro_content.yml index 5a239f909..11c2f3c7a 100644 --- a/config/sync/block.block.claro_content.yml +++ b/config/sync/block.block.claro_content.yml @@ -16,7 +16,7 @@ provider: null plugin: system_main_block settings: id: system_main_block - label: 'Main page content' + label: 'Primært sideindhold' label_display: '0' provider: system visibility: { } diff --git a/config/sync/core.entity_form_display.node.dialogue.default.yml b/config/sync/core.entity_form_display.node.dialogue.default.yml index 5c6b84ddc..79cccf842 100644 --- a/config/sync/core.entity_form_display.node.dialogue.default.yml +++ b/config/sync/core.entity_form_display.node.dialogue.default.yml @@ -66,7 +66,7 @@ third_party_settings: children: - field_project_reference - field_hide_in_timeline - label: 'Projektreference' + label: Projektreference region: hidden parent_name: group_information weight: 32 diff --git a/config/sync/core.entity_form_display.node.hearing.default.yml b/config/sync/core.entity_form_display.node.hearing.default.yml index 31cd794ae..9418187f9 100644 --- a/config/sync/core.entity_form_display.node.hearing.default.yml +++ b/config/sync/core.entity_form_display.node.hearing.default.yml @@ -16,6 +16,8 @@ dependencies: - field.field.node.hearing.field_getorganized_case_id - field.field.node.hearing.field_hearing_ticket_add - field.field.node.hearing.field_hearing_ticket_list + - field.field.node.hearing.field_hide_hearing_replies + - field.field.node.hearing.field_hide_hearing_replies_msg - field.field.node.hearing.field_hide_in_timeline - field.field.node.hearing.field_lokalplaner - field.field.node.hearing.field_map @@ -55,7 +57,7 @@ third_party_settings: label: Informationer region: content parent_name: '' - weight: 6 + weight: 8 format_type: details format_settings: classes: '' @@ -68,7 +70,7 @@ third_party_settings: label: Systemindstillinger region: content parent_name: '' - weight: 8 + weight: 10 format_type: details format_settings: classes: '' @@ -82,7 +84,7 @@ third_party_settings: label: Deskpro region: content parent_name: '' - weight: 7 + weight: 9 format_type: details format_settings: classes: '' @@ -95,7 +97,7 @@ third_party_settings: label: eDoc region: content parent_name: '' - weight: 10 + weight: 12 format_type: details format_settings: classes: '' @@ -108,7 +110,7 @@ third_party_settings: label: Kontakt region: content parent_name: '' - weight: 12 + weight: 13 format_type: details format_settings: classes: '' @@ -122,7 +124,7 @@ third_party_settings: label: 'Vil du vide mere?' region: content parent_name: '' - weight: 14 + weight: 15 format_type: details format_settings: classes: '' @@ -136,7 +138,7 @@ third_party_settings: label: GetOrganized region: content parent_name: '' - weight: 13 + weight: 14 format_type: details format_settings: classes: '' @@ -152,7 +154,7 @@ third_party_settings: label: Høringssvarsystem region: content parent_name: '' - weight: 16 + weight: 17 format_type: details format_settings: classes: '' @@ -178,6 +180,23 @@ third_party_settings: open: true description: '' required_fields: false + group_hide_hearing_replies: + children: + - field_hide_hearing_replies + - field_hide_hearing_replies_msg + label: 'Skjul høringssvar' + region: content + parent_name: '' + weight: 20 + format_type: details + format_settings: + classes: '' + show_empty_fields: false + id: '' + label_as_html: false + open: false + description: '' + required_fields: true id: node.hearing.default targetEntityType: node bundle: hearing @@ -211,7 +230,7 @@ content: third_party_settings: { } field_description: type: text_textarea - weight: 2 + weight: 4 region: content settings: rows: 5 @@ -269,6 +288,21 @@ content: placeholder_url: 'Url til visning af høringssvar i eksternt høringssvarsystem' placeholder_title: '' third_party_settings: { } + field_hide_hearing_replies: + type: boolean_checkbox + weight: 1 + region: content + settings: + display_label: true + third_party_settings: { } + field_hide_hearing_replies_msg: + type: string_textarea + weight: 2 + region: content + settings: + rows: 5 + placeholder: '' + third_party_settings: { } field_hide_in_timeline: type: boolean_checkbox weight: 19 @@ -284,7 +318,7 @@ content: third_party_settings: { } field_map: type: hoeringsportal_data_map_default - weight: 5 + weight: 7 region: content settings: available_types: @@ -294,7 +328,7 @@ content: third_party_settings: { } field_media_document: type: entity_browser_entity_reference - weight: 3 + weight: 5 region: content settings: entity_browser: itk_document_browser @@ -309,7 +343,7 @@ content: third_party_settings: { } field_media_image: type: entity_browser_entity_reference - weight: 4 + weight: 6 region: content settings: entity_browser: itk_image_browser @@ -361,7 +395,7 @@ content: third_party_settings: { } field_teaser: type: string_textarea - weight: 1 + weight: 3 region: content settings: rows: 5 @@ -375,7 +409,7 @@ content: third_party_settings: { } published_at: type: publication_date_timestamp - weight: 9 + weight: 11 region: content settings: { } third_party_settings: { } @@ -399,7 +433,7 @@ content: maxlength_js_label: 'Content limited to @limit characters, remaining: @remaining' maxlength_js_enforce: false url_redirects: - weight: 15 + weight: 16 region: content settings: { } third_party_settings: { } diff --git a/config/sync/core.entity_view_display.node.hearing.default.yml b/config/sync/core.entity_view_display.node.hearing.default.yml index 857b89a8c..e885be6b0 100644 --- a/config/sync/core.entity_view_display.node.hearing.default.yml +++ b/config/sync/core.entity_view_display.node.hearing.default.yml @@ -15,6 +15,8 @@ dependencies: - field.field.node.hearing.field_getorganized_case_id - field.field.node.hearing.field_hearing_ticket_add - field.field.node.hearing.field_hearing_ticket_list + - field.field.node.hearing.field_hide_hearing_replies + - field.field.node.hearing.field_hide_hearing_replies_msg - field.field.node.hearing.field_hide_in_timeline - field.field.node.hearing.field_lokalplaner - field.field.node.hearing.field_map @@ -59,7 +61,6 @@ third_party_settings: header: - 'dynamic_block_field:node-hearing_warning' - node_title - - field_hide_in_timeline left: - field_teaser - field_description @@ -148,16 +149,6 @@ content: third_party_settings: { } weight: 3 region: left - field_hide_in_timeline: - type: boolean - label: above - settings: - format: default - format_custom_false: '' - format_custom_true: '' - third_party_settings: { } - weight: 21 - region: header field_lokalplaner: type: hoeringsportal_data_localplan_default label: above @@ -249,6 +240,9 @@ hidden: field_getorganized_case_id: true field_hearing_ticket_add: true field_hearing_ticket_list: true + field_hide_hearing_replies: true + field_hide_hearing_replies_msg: true + field_hide_in_timeline: true field_map_display: true field_project_reference: true field_tags: true diff --git a/config/sync/core.entity_view_display.node.hearing.hearing_ticket_add.yml b/config/sync/core.entity_view_display.node.hearing.hearing_ticket_add.yml index f0c774bcd..feeb7671f 100644 --- a/config/sync/core.entity_view_display.node.hearing.hearing_ticket_add.yml +++ b/config/sync/core.entity_view_display.node.hearing.hearing_ticket_add.yml @@ -16,6 +16,8 @@ dependencies: - field.field.node.hearing.field_getorganized_case_id - field.field.node.hearing.field_hearing_ticket_add - field.field.node.hearing.field_hearing_ticket_list + - field.field.node.hearing.field_hide_hearing_replies + - field.field.node.hearing.field_hide_hearing_replies_msg - field.field.node.hearing.field_hide_in_timeline - field.field.node.hearing.field_lokalplaner - field.field.node.hearing.field_map @@ -174,6 +176,8 @@ hidden: field_getorganized_case_id: true field_hearing_ticket_add: true field_hearing_ticket_list: true + field_hide_hearing_replies: true + field_hide_hearing_replies_msg: true field_hide_in_timeline: true field_lokalplaner: true field_map: true diff --git a/config/sync/core.entity_view_display.node.hearing.hearing_ticket_view.yml b/config/sync/core.entity_view_display.node.hearing.hearing_ticket_view.yml index cd476f97c..787a101e9 100644 --- a/config/sync/core.entity_view_display.node.hearing.hearing_ticket_view.yml +++ b/config/sync/core.entity_view_display.node.hearing.hearing_ticket_view.yml @@ -16,6 +16,8 @@ dependencies: - field.field.node.hearing.field_getorganized_case_id - field.field.node.hearing.field_hearing_ticket_add - field.field.node.hearing.field_hearing_ticket_list + - field.field.node.hearing.field_hide_hearing_replies + - field.field.node.hearing.field_hide_hearing_replies_msg - field.field.node.hearing.field_hide_in_timeline - field.field.node.hearing.field_lokalplaner - field.field.node.hearing.field_map @@ -186,6 +188,8 @@ hidden: field_getorganized_case_id: true field_hearing_ticket_add: true field_hearing_ticket_list: true + field_hide_hearing_replies: true + field_hide_hearing_replies_msg: true field_hide_in_timeline: true field_lokalplaner: true field_map: true diff --git a/config/sync/core.entity_view_display.node.hearing.list_display.yml b/config/sync/core.entity_view_display.node.hearing.list_display.yml index db9076d66..481560244 100644 --- a/config/sync/core.entity_view_display.node.hearing.list_display.yml +++ b/config/sync/core.entity_view_display.node.hearing.list_display.yml @@ -16,6 +16,8 @@ dependencies: - field.field.node.hearing.field_getorganized_case_id - field.field.node.hearing.field_hearing_ticket_add - field.field.node.hearing.field_hearing_ticket_list + - field.field.node.hearing.field_hide_hearing_replies + - field.field.node.hearing.field_hide_hearing_replies_msg - field.field.node.hearing.field_hide_in_timeline - field.field.node.hearing.field_lokalplaner - field.field.node.hearing.field_map @@ -90,6 +92,8 @@ hidden: field_getorganized_case_id: true field_hearing_ticket_add: true field_hearing_ticket_list: true + field_hide_hearing_replies: true + field_hide_hearing_replies_msg: true field_hide_in_timeline: true field_lokalplaner: true field_map: true diff --git a/config/sync/core.entity_view_display.node.hearing.search_result.yml b/config/sync/core.entity_view_display.node.hearing.search_result.yml index a331ceec8..4e7c5f76f 100644 --- a/config/sync/core.entity_view_display.node.hearing.search_result.yml +++ b/config/sync/core.entity_view_display.node.hearing.search_result.yml @@ -16,6 +16,8 @@ dependencies: - field.field.node.hearing.field_getorganized_case_id - field.field.node.hearing.field_hearing_ticket_add - field.field.node.hearing.field_hearing_ticket_list + - field.field.node.hearing.field_hide_hearing_replies + - field.field.node.hearing.field_hide_hearing_replies_msg - field.field.node.hearing.field_hide_in_timeline - field.field.node.hearing.field_lokalplaner - field.field.node.hearing.field_map @@ -79,6 +81,8 @@ hidden: field_getorganized_case_id: true field_hearing_ticket_add: true field_hearing_ticket_list: true + field_hide_hearing_replies: true + field_hide_hearing_replies_msg: true field_hide_in_timeline: true field_lokalplaner: true field_map: true diff --git a/config/sync/core.entity_view_display.node.hearing.teaser.yml b/config/sync/core.entity_view_display.node.hearing.teaser.yml index 65e141e21..cca295f97 100644 --- a/config/sync/core.entity_view_display.node.hearing.teaser.yml +++ b/config/sync/core.entity_view_display.node.hearing.teaser.yml @@ -16,6 +16,8 @@ dependencies: - field.field.node.hearing.field_getorganized_case_id - field.field.node.hearing.field_hearing_ticket_add - field.field.node.hearing.field_hearing_ticket_list + - field.field.node.hearing.field_hide_hearing_replies + - field.field.node.hearing.field_hide_hearing_replies_msg - field.field.node.hearing.field_hide_in_timeline - field.field.node.hearing.field_lokalplaner - field.field.node.hearing.field_map @@ -110,6 +112,8 @@ hidden: field_getorganized_case_id: true field_hearing_ticket_add: true field_hearing_ticket_list: true + field_hide_hearing_replies: true + field_hide_hearing_replies_msg: true field_hide_in_timeline: true field_lokalplaner: true field_map: true diff --git a/config/sync/core.entity_view_mode.comment.full.yml b/config/sync/core.entity_view_mode.comment.full.yml index 8e5eb1426..941e736b9 100644 --- a/config/sync/core.entity_view_mode.comment.full.yml +++ b/config/sync/core.entity_view_mode.comment.full.yml @@ -7,7 +7,7 @@ dependencies: _core: default_config_hash: N4mUjXpPckUkVRY1PbKw4GGoL1i2ECU7PL3EreiKStk id: comment.full -label: 'Full comment' +label: 'Fuld kommentar' description: '' targetEntityType: comment cache: true diff --git a/config/sync/field.field.node.course.field_project_reference.yml b/config/sync/field.field.node.course.field_project_reference.yml index ddbcbb1e5..29c977f20 100644 --- a/config/sync/field.field.node.course.field_project_reference.yml +++ b/config/sync/field.field.node.course.field_project_reference.yml @@ -10,7 +10,7 @@ id: node.course.field_project_reference field_name: field_project_reference entity_type: node bundle: course -label: 'Projektreference' +label: Projektreference description: '' required: false translatable: false diff --git a/config/sync/field.field.node.hearing.field_hide_hearing_replies.yml b/config/sync/field.field.node.hearing.field_hide_hearing_replies.yml new file mode 100644 index 000000000..920031dfd --- /dev/null +++ b/config/sync/field.field.node.hearing.field_hide_hearing_replies.yml @@ -0,0 +1,21 @@ +uuid: daf54be1-4de5-44ca-a63f-93f1ee8d2aee +langcode: da +status: true +dependencies: + config: + - field.storage.node.field_hide_hearing_replies + - node.type.hearing +id: node.hearing.field_hide_hearing_replies +field_name: field_hide_hearing_replies +entity_type: node +bundle: hearing +label: 'Skjul høringssvar' +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + on_label: 'On' + off_label: 'Off' +field_type: boolean diff --git a/config/sync/field.field.node.hearing.field_hide_hearing_replies_msg.yml b/config/sync/field.field.node.hearing.field_hide_hearing_replies_msg.yml new file mode 100644 index 000000000..3600ce6bc --- /dev/null +++ b/config/sync/field.field.node.hearing.field_hide_hearing_replies_msg.yml @@ -0,0 +1,19 @@ +uuid: 52267b40-09be-4c72-9a15-78e8ea07ff3f +langcode: da +status: true +dependencies: + config: + - field.storage.node.field_hide_hearing_replies_msg + - node.type.hearing +id: node.hearing.field_hide_hearing_replies_msg +field_name: field_hide_hearing_replies_msg +entity_type: node +bundle: hearing +label: Besked +description: 'Besked der vises i stedet for høringssvar hvis høringssvar er skjult.' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: { } +field_type: string_long diff --git a/config/sync/field.storage.node.field_hide_hearing_replies.yml b/config/sync/field.storage.node.field_hide_hearing_replies.yml new file mode 100644 index 000000000..95916dc09 --- /dev/null +++ b/config/sync/field.storage.node.field_hide_hearing_replies.yml @@ -0,0 +1,18 @@ +uuid: 3ebe04ce-fc1c-4ee9-8208-06bfc88bd893 +langcode: da +status: true +dependencies: + module: + - node +id: node.field_hide_hearing_replies +field_name: field_hide_hearing_replies +entity_type: node +type: boolean +settings: { } +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/config/sync/field.storage.node.field_hide_hearing_replies_msg.yml b/config/sync/field.storage.node.field_hide_hearing_replies_msg.yml new file mode 100644 index 000000000..fa688ebec --- /dev/null +++ b/config/sync/field.storage.node.field_hide_hearing_replies_msg.yml @@ -0,0 +1,19 @@ +uuid: 8bb577fb-e18f-42a7-88e8-f4cd9b874e46 +langcode: da +status: true +dependencies: + module: + - node +id: node.field_hide_hearing_replies_msg +field_name: field_hide_hearing_replies_msg +entity_type: node +type: string_long +settings: + case_sensitive: false +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/config/sync/locale.settings.yml b/config/sync/locale.settings.yml index 053b4e5ff..ed2eac386 100644 --- a/config/sync/locale.settings.yml +++ b/config/sync/locale.settings.yml @@ -1,6 +1,6 @@ langcode: da translation: - use_source: local + use_source: remote_and_local overwrite_customized: false overwrite_not_customized: true update_interval_days: 0 diff --git a/config/sync/publishcontent.settings.yml b/config/sync/publishcontent.settings.yml index 59cc5fedf..6317442d4 100644 --- a/config/sync/publishcontent.settings.yml +++ b/config/sync/publishcontent.settings.yml @@ -5,5 +5,5 @@ ui_localtask: false ui_checkbox: true create_revision: false create_log_entry: false -publish_text_value: Publish -unpublish_text_value: Unpublish +publish_text_value: Udgiv +unpublish_text_value: 'Træk tilbage' diff --git a/config/sync/system.action.comment_save_action.yml b/config/sync/system.action.comment_save_action.yml index f9f556493..af173431f 100644 --- a/config/sync/system.action.comment_save_action.yml +++ b/config/sync/system.action.comment_save_action.yml @@ -7,7 +7,7 @@ dependencies: _core: default_config_hash: lfyE_snmvfg_EQ3VDyhUtGAXgmqtEiqa46I3bTMg8DU id: comment_save_action -label: 'Save comment' +label: 'Gem kommentar' type: comment plugin: 'entity:save_action:comment' configuration: { } diff --git a/config/sync/system.action.webform_delete_action.yml b/config/sync/system.action.webform_delete_action.yml index d1716a1fc..d9378db3c 100644 --- a/config/sync/system.action.webform_delete_action.yml +++ b/config/sync/system.action.webform_delete_action.yml @@ -7,7 +7,7 @@ dependencies: _core: default_config_hash: e1bCTp0ryXZZtnS9nlVAbtoWz3-8fmbNlqKY3GHzbsM id: webform_delete_action -label: 'Delete webform' +label: 'Slet webform' type: webform plugin: webform_delete_action configuration: { } diff --git a/config/sync/views.view.comment.yml b/config/sync/views.view.comment.yml index 7551acf22..d23118891 100644 --- a/config/sync/views.view.comment.yml +++ b/config/sync/views.view.comment.yml @@ -10,7 +10,7 @@ _core: id: comment label: Kommentarer module: comment -description: 'Find and manage comments.' +description: 'Find og administrér kommentarer.' tag: default base_table: comment_field_data base_field: cid @@ -282,7 +282,7 @@ display: entity_type: comment entity_field: entity_id plugin_id: commented_entity - label: 'Posted in' + label: 'Indsendt til' exclude: false alter: alter_text: false @@ -578,7 +578,7 @@ display: admin_label: '' plugin_id: text_custom empty: true - content: 'No comments available.' + content: 'Der er ingen kommentarer at vise.' tokenize: false sorts: changed: @@ -695,7 +695,7 @@ display: exposed: true expose: operator_id: combine_op - label: 'Author name' + label: Forfatternavn description: '' use_operator: false operator: combine_op @@ -877,11 +877,11 @@ display: cacheable: false page_published: id: page_published - display_title: 'Published comments' + display_title: 'Udgivne kommentarer' display_plugin: page position: 1 display_options: - display_description: 'The approved comments listing.' + display_description: 'Liste over godkendte kommentarer.' display_comment: '' exposed_block: false display_extenders: { } @@ -889,7 +889,7 @@ display: menu: type: tab title: Kommentarer - description: 'Comments published' + description: 'Publicerede kommentarer' weight: 0 menu_name: admin parent: '' @@ -906,7 +906,7 @@ display: cacheable: false page_unapproved: id: page_unapproved - display_title: 'Unapproved comments' + display_title: 'Ikke-godkendte kommentarer' display_plugin: page position: 2 display_options: @@ -1170,7 +1170,7 @@ display: entity_type: comment entity_field: entity_id plugin_id: commented_entity - label: 'Posted in' + label: 'Indsendt til' exclude: false alter: alter_text: false @@ -1514,7 +1514,7 @@ display: exposed: true expose: operator_id: combine_op - label: 'Author Name' + label: Forfatternavn description: '' use_operator: false operator: combine_op @@ -1594,13 +1594,13 @@ display: fields: false filters: false filter_groups: false - display_description: 'The unapproved comments listing.' + display_description: 'Listen af ikke-godkendte kommentarer.' display_extenders: { } path: admin/content/comment/approval menu: type: tab - title: 'Unapproved comments' - description: 'Comments unapproved' + title: 'Ikke-godkendte kommentarer' + description: 'Ikke-godkendte kommentarer' weight: 1 menu_name: admin parent: '' diff --git a/config/sync/views.view.comments_recent.yml b/config/sync/views.view.comments_recent.yml index a9cc4f270..34f43aeeb 100644 --- a/config/sync/views.view.comments_recent.yml +++ b/config/sync/views.view.comments_recent.yml @@ -9,9 +9,9 @@ dependencies: _core: default_config_hash: cFOucxH8PAXDQ2kViCcAHgK-JMCcxVkpIMzD56EfpZo id: comments_recent -label: 'Recent comments' +label: 'Seneste kommentarer' module: views -description: 'Recent comments.' +description: 'Seneste kommentarer.' tag: default base_table: comment_field_data base_field: cid @@ -22,7 +22,7 @@ display: display_plugin: default position: 0 display_options: - title: 'Recent comments' + title: 'Seneste kommentarer' fields: subject: id: subject @@ -131,8 +131,8 @@ display: hide_alter_empty: true type: timestamp_ago settings: - future_format: '@interval hence' - past_format: '@interval ago' + future_format: 'om @interval' + past_format: '@interval siden' granularity: 2 pager: type: some @@ -257,8 +257,8 @@ display: position: 1 display_options: display_extenders: { } - block_description: 'Recent comments' - block_category: 'Lists (Views)' + block_description: 'Seneste kommentarer' + block_category: 'Lister (Views)' allow: items_per_page: true cache_metadata: diff --git a/config/sync/views.view.webform_submissions.yml b/config/sync/views.view.webform_submissions.yml index e5f40cca3..0d58c39b9 100644 --- a/config/sync/views.view.webform_submissions.yml +++ b/config/sync/views.view.webform_submissions.yml @@ -11,7 +11,7 @@ dependencies: _core: default_config_hash: YPgxGC8TmLtfCOLGCCHJcdH2llA7QksUkdi1abhB7Ro id: webform_submissions -label: 'Webform submissions' +label: 'Indsendte webforms' module: views description: 'Default webform submissions views.' tag: '' @@ -24,7 +24,7 @@ display: display_plugin: default position: 0 display_options: - title: 'Webform submissions' + title: 'Indsendte webforms' fields: sid: id: sid @@ -102,7 +102,7 @@ display: entity_type: webform_submission entity_field: in_draft plugin_id: field - label: Draft + label: Kladde exclude: false alter: alter_text: false @@ -245,7 +245,7 @@ display: entity_type: webform_submission entity_field: remote_addr plugin_id: field - label: 'IP address' + label: IP-adresse exclude: false alter: alter_text: false @@ -350,7 +350,7 @@ display: hide_empty: false empty_zero: false hide_alter_empty: true - text: view + text: vis output_url_as_text: false absolute: false pager: @@ -592,7 +592,7 @@ display: admin_label: '' plugin_id: result empty: false - content: 'Displaying @start - @end of @total' + content: 'Viser @start - @end af @total' footer: { } display_extenders: { } cache_metadata: @@ -740,7 +740,7 @@ display: entity_type: webform_submission entity_field: in_draft plugin_id: field - label: Draft + label: Kladde exclude: false alter: alter_text: false @@ -807,7 +807,7 @@ display: entity_type: webform_submission entity_field: sticky plugin_id: field - label: Sticky + label: Klæbrig exclude: false alter: alter_text: false @@ -874,7 +874,7 @@ display: entity_type: webform_submission entity_field: locked plugin_id: field - label: Locked + label: Låst exclude: false alter: alter_text: false @@ -1017,7 +1017,7 @@ display: entity_type: webform_submission entity_field: completed plugin_id: field - label: Completed + label: Gennemført exclude: false alter: alter_text: false @@ -1093,7 +1093,7 @@ display: entity_type: webform_submission entity_field: remote_addr plugin_id: field - label: 'IP address' + label: IP-adresse exclude: false alter: alter_text: false @@ -1263,7 +1263,7 @@ display: exposed: true expose: operator_id: '' - label: Sticky + label: Klæbrig description: '' use_operator: false operator: sticky_op @@ -1305,7 +1305,7 @@ display: exposed: true expose: operator_id: '' - label: Locked + label: Låst description: '' use_operator: false operator: locked_op @@ -1680,7 +1680,7 @@ display: entity_type: webform_submission entity_field: in_draft plugin_id: field - label: Draft + label: Kladde exclude: false alter: alter_text: false @@ -1747,7 +1747,7 @@ display: entity_type: webform_submission entity_field: sticky plugin_id: field - label: Sticky + label: Klæbrig exclude: false alter: alter_text: false @@ -1814,7 +1814,7 @@ display: entity_type: webform_submission entity_field: locked plugin_id: field - label: Locked + label: Låst exclude: false alter: alter_text: false @@ -1957,7 +1957,7 @@ display: entity_type: webform_submission entity_field: completed plugin_id: field - label: Completed + label: Gennemført exclude: false alter: alter_text: false @@ -2033,7 +2033,7 @@ display: entity_type: webform_submission entity_field: remote_addr plugin_id: field - label: 'IP address' + label: IP-adresse exclude: false alter: alter_text: false @@ -2138,7 +2138,7 @@ display: hide_empty: false empty_zero: false hide_alter_empty: true - text: view + text: vis output_url_as_text: false absolute: false edit_webform_submission: @@ -2191,7 +2191,7 @@ display: hide_empty: false empty_zero: false hide_alter_empty: true - text: edit + text: redigér output_url_as_text: false absolute: false access: @@ -2257,7 +2257,7 @@ display: exposed: true expose: operator_id: '' - label: Sticky + label: Klæbrig description: '' use_operator: false operator: sticky_op @@ -2299,7 +2299,7 @@ display: exposed: true expose: operator_id: '' - label: Locked + label: Låst description: '' use_operator: false operator: locked_op @@ -2532,7 +2532,7 @@ display: entity_type: webform_submission entity_field: in_draft plugin_id: field - label: Draft + label: Kladde exclude: false alter: alter_text: false @@ -2599,7 +2599,7 @@ display: entity_type: webform_submission entity_field: sticky plugin_id: field - label: Sticky + label: Klæbrig exclude: false alter: alter_text: false @@ -2666,7 +2666,7 @@ display: entity_type: webform_submission entity_field: locked plugin_id: field - label: Locked + label: Låst exclude: false alter: alter_text: false @@ -2809,7 +2809,7 @@ display: entity_type: webform_submission entity_field: completed plugin_id: field - label: Completed + label: Gennemført exclude: false alter: alter_text: false @@ -2885,7 +2885,7 @@ display: entity_type: webform_submission entity_field: remote_addr plugin_id: field - label: 'IP address' + label: IP-adresse exclude: false alter: alter_text: false @@ -2990,7 +2990,7 @@ display: hide_empty: false empty_zero: false hide_alter_empty: true - text: view + text: vis output_url_as_text: false absolute: false access: @@ -3056,7 +3056,7 @@ display: exposed: true expose: operator_id: '' - label: Sticky + label: Klæbrig description: '' use_operator: false operator: sticky_op @@ -3098,7 +3098,7 @@ display: exposed: true expose: operator_id: '' - label: Locked + label: Låst description: '' use_operator: false operator: locked_op diff --git a/config/sync/web_accessibility_statement.settings.yml b/config/sync/web_accessibility_statement.settings.yml new file mode 100644 index 000000000..6da7a9d93 --- /dev/null +++ b/config/sync/web_accessibility_statement.settings.yml @@ -0,0 +1 @@ +url: 'https://was.digst.dk/deltag-aarhus-dk' diff --git a/config/sync/webform.settings.yml b/config/sync/webform.settings.yml index d3281e7c0..0e037e1b7 100644 --- a/config/sync/webform.settings.yml +++ b/config/sync/webform.settings.yml @@ -10,7 +10,7 @@ settings: default_ajax_progress_type: throbber default_ajax_effect: fade default_ajax_speed: 500 - default_submit_button_label: Submit + default_submit_button_label: Indsend default_reset_button_label: Reset default_delete_button_label: Slet default_form_submit_once: false @@ -30,19 +30,19 @@ settings: default_form_details_toggle: true default_form_file_limit: '' default_form_file_limit_message: "This form's file upload quota of %quota has been exceeded. Please remove some files." - default_wizard_prev_button_label: '< Previous' - default_wizard_next_button_label: 'Next >' + default_wizard_prev_button_label: '< Tidligere' + default_wizard_next_button_label: 'Næste >' default_wizard_start_label: Start - default_wizard_confirmation_label: Complete - default_wizard_toggle_show_label: 'Show all' - default_wizard_toggle_hide_label: 'Hide all' + default_wizard_confirmation_label: Komplet + default_wizard_toggle_show_label: 'Vis alle' + default_wizard_toggle_hide_label: 'Skjul alle' default_preview_next_button_label: Gennemse - default_preview_prev_button_label: '< Previous' + default_preview_prev_button_label: '< Tidligere' default_preview_label: Gennemse default_preview_title: '[webform:title]: Preview' default_preview_message: 'Please review your submission. Your submission is not complete until you press the "Submit" button!' - default_draft_button_label: 'Save Draft' - default_draft_saved_message: 'Submission saved. You may return to this form later and it will restore the current values.' + default_draft_button_label: 'Gem kladde' + default_draft_saved_message: 'Formular gemt. Du kan vende tilbage senere og gendanne standardværdierne.' default_draft_loaded_message: 'A partially-completed form was found. Please complete the remaining portions.' default_draft_pending_single_message: 'You have a pending draft for this webform. Load your pending draft.' default_draft_pending_multiple_message: 'You have pending drafts for this webform. View your pending drafts.' @@ -70,8 +70,8 @@ settings: default_submission_access_denied_message: 'Please login to access this submission.' default_submission_exception_message: 'Unable to process this submission. Please contact the site administrator.' default_submission_locked_message: 'This submission has been locked.' - default_previous_submission_message: 'You have already submitted this webform. View your previous submission.' - default_previous_submissions_message: 'You have already submitted this webform. View your previous submissions.' + default_previous_submission_message: 'Du har allerede indsendt denne formular. Se din forrige indsendelse.' + default_previous_submissions_message: 'Du har allerede indsendt denne formular. Se dine forrige indsendelser.' default_autofill_message: 'This submission has been autofilled with your previous submission.' form_classes: | container-inline clearfix @@ -110,13 +110,13 @@ settings: dialog: false dialog_options: narrow: - title: Narrow + title: Smal width: 600 normal: title: Normal width: 800 wide: - title: Wide + title: Bred width: 1000 assets: css: '' diff --git a/config/sync/webform.webform_options.days.yml b/config/sync/webform.webform_options.days.yml index aff01af0a..2ae2c2d2a 100644 --- a/config/sync/webform.webform_options.days.yml +++ b/config/sync/webform.webform_options.days.yml @@ -8,8 +8,8 @@ dependencies: _core: default_config_hash: YNrKbYrWWjeubUUM8AsQ19KnX7cU1elACR14CZJHmdg id: days -label: Days -category: 'Date and time' +label: Dage +category: 'Dato og tid' likert: false options: | Sunday: Sunday diff --git a/config/sync/webform.webform_options.education.yml b/config/sync/webform.webform_options.education.yml index 138ed1a0f..53694f5b6 100644 --- a/config/sync/webform.webform_options.education.yml +++ b/config/sync/webform.webform_options.education.yml @@ -9,7 +9,7 @@ _core: default_config_hash: mII4acOv33s-j8PINywrCag4OITbeJGxdPO373dnHHw id: education label: Education -category: Demographic +category: Demografi likert: false options: | High School: High School diff --git a/config/sync/webform.webform_options.gender.yml b/config/sync/webform.webform_options.gender.yml index eddeaeada..8a4980512 100644 --- a/config/sync/webform.webform_options.gender.yml +++ b/config/sync/webform.webform_options.gender.yml @@ -8,7 +8,7 @@ dependencies: _core: default_config_hash: yxhG0JmQs2HT-Ro6ZeDQboDc9ZWR4GglflTtyoqxK4A id: gender -label: Gender +label: Køn category: Demographic likert: false options: | diff --git a/config/sync/webform.webform_options.languages.yml b/config/sync/webform.webform_options.languages.yml index 67786ac6e..6de0a2210 100644 --- a/config/sync/webform.webform_options.languages.yml +++ b/config/sync/webform.webform_options.languages.yml @@ -8,7 +8,7 @@ dependencies: _core: default_config_hash: mYH14Vi65Ixj10c_GFa7CipxU3D0Bt9wgo8zE8zjOfE id: languages -label: Languages +label: Sprog category: Language likert: false options: '' diff --git a/config/sync/webform.webform_options.months.yml b/config/sync/webform.webform_options.months.yml index 54e1a01ba..0fec4dcbe 100644 --- a/config/sync/webform.webform_options.months.yml +++ b/config/sync/webform.webform_options.months.yml @@ -8,7 +8,7 @@ dependencies: _core: default_config_hash: pZJnuQkh9afNML5IcMuKTUC__vmHMFn66Qr5IWtedZ4 id: months -label: Months +label: Måneder category: 'Date and time' likert: false options: | diff --git a/config/sync/webform.webform_options.relationship.yml b/config/sync/webform.webform_options.relationship.yml index 9462a8a32..2474ca46c 100644 --- a/config/sync/webform.webform_options.relationship.yml +++ b/config/sync/webform.webform_options.relationship.yml @@ -8,7 +8,7 @@ dependencies: _core: default_config_hash: 4J2RPG4JmsD4Fm1NlIQY0JHkrJ08UUl0qTF0_EjUxvw id: relationship -label: Relationship +label: Forbindelse category: Demographic likert: false options: | diff --git a/config/sync/webform.webform_options.sex.yml b/config/sync/webform.webform_options.sex.yml index a59ebe845..214640c72 100644 --- a/config/sync/webform.webform_options.sex.yml +++ b/config/sync/webform.webform_options.sex.yml @@ -8,9 +8,7 @@ dependencies: _core: default_config_hash: WRpxpwYpfcO_i0so7BV4QXxXlbPiSVppYmAV6DAz4c0 id: sex -label: Sex +label: Køn category: Demographic likert: false -options: | - Male: Male - Female: Female +options: "Mand: Mand\r\nKvinde: Kvinde\n" diff --git a/config/sync/webform.webform_options.time_zones.yml b/config/sync/webform.webform_options.time_zones.yml index ed8929a42..f1a0ac615 100644 --- a/config/sync/webform.webform_options.time_zones.yml +++ b/config/sync/webform.webform_options.time_zones.yml @@ -8,7 +8,7 @@ dependencies: _core: default_config_hash: 8rVcRXLnTAEoWs7zl8du-7RIUnayqUcGYnvb3JT21-o id: time_zones -label: 'Time zones' +label: Tidszoner category: 'Date and time' likert: false options: '' diff --git a/config/sync/webform.webform_options.titles.yml b/config/sync/webform.webform_options.titles.yml index c51bc8bb6..d789bba4b 100644 --- a/config/sync/webform.webform_options.titles.yml +++ b/config/sync/webform.webform_options.titles.yml @@ -8,7 +8,7 @@ dependencies: _core: default_config_hash: PEUoedWrfYEX7oZ8CcOukfBTVxar1cPSROX8534esuU id: titles -label: Titles +label: Titler category: Demographic likert: false options: | diff --git a/config/sync/webform.webform_options.translations.yml b/config/sync/webform.webform_options.translations.yml index 9cc071494..b45500bfd 100644 --- a/config/sync/webform.webform_options.translations.yml +++ b/config/sync/webform.webform_options.translations.yml @@ -8,7 +8,7 @@ dependencies: _core: default_config_hash: Mb_L3vE-0IBZH5s2rjpk2LNn0QHClQP9AARQdCmVLt4 id: translations -label: Translations +label: Oversættelser category: Language likert: false options: '' diff --git a/config/sync/webform.webform_options.yes_no.yml b/config/sync/webform.webform_options.yes_no.yml index 5bbb5fb6b..810cb0ad0 100644 --- a/config/sync/webform.webform_options.yes_no.yml +++ b/config/sync/webform.webform_options.yes_no.yml @@ -8,7 +8,7 @@ dependencies: _core: default_config_hash: W88NYg31DbaVNQx1Uir_dwwXHVtF09QOq4VBGsH1Snk id: yes_no -label: Yes/No +label: Ja/nej category: General likert: false options: | diff --git a/docker-compose.pretix.yml b/docker-compose.pretix.yml index 3e260570b..a76386850 100644 --- a/docker-compose.pretix.yml +++ b/docker-compose.pretix.yml @@ -44,6 +44,11 @@ services: - POSTGRES_USER=pretix - POSTGRES_PASSWORD=pretix - POSTGRES_DATABASE=pretix + healthcheck: + test: ["CMD-SHELL", "pg_isready", "--dbname", "pretix"] + interval: 10s + timeout: 3s + retries: 3 pretix_redis: image: redis:latest diff --git a/web/modules/custom/hoeringsportal_base_fixtures/src/Fixture/PublicMeetingFixture.php b/web/modules/custom/hoeringsportal_base_fixtures/src/Fixture/PublicMeetingFixture.php index 582572409..d65cd293e 100644 --- a/web/modules/custom/hoeringsportal_base_fixtures/src/Fixture/PublicMeetingFixture.php +++ b/web/modules/custom/hoeringsportal_base_fixtures/src/Fixture/PublicMeetingFixture.php @@ -61,6 +61,7 @@ public function load() { ], 'field_pretix_event_settings' => [ 'template_event' => 'template-series', + 'contact_mail' => 'info@example.com', 'synchronize_event' => TRUE, ], 'field_email' => 'parent@test.dk ', @@ -124,6 +125,7 @@ public function load() { $node->set('field_pretix_event_settings', [ // Cf. PretixConfigFixture. 'template_event' => 'template-series', + 'contact_mail' => 'info87@example.com', 'synchronize_event' => TRUE, ]); $this->addReference('public_meeting:fixture-2', $node); @@ -169,6 +171,7 @@ public function load() { $node->set('field_pretix_event_settings', [ // Cf. PretixConfigFixture. 'template_event' => 'template-series', + 'contact_mail' => 'info42@example.com', 'synchronize_event' => TRUE, ]); $this->addReference('public_meeting:fixture-3', $node); diff --git a/web/modules/custom/hoeringsportal_deskpro/templates/block/hoeringsportal-hearing-tickets.html.twig b/web/modules/custom/hoeringsportal_deskpro/templates/block/hoeringsportal-hearing-tickets.html.twig index e3bc0ee2b..5dfd07a27 100644 --- a/web/modules/custom/hoeringsportal_deskpro/templates/block/hoeringsportal-hearing-tickets.html.twig +++ b/web/modules/custom/hoeringsportal_deskpro/templates/block/hoeringsportal-hearing-tickets.html.twig @@ -16,6 +16,8 @@ {% set hearing_ticket_add_title = (has_external_hearing_tickets ? node.field_hearing_ticket_add.title)|default('Add hearing ticket'|trans) %} {% set hearing_ticket_list_url = has_external_hearing_tickets ? node.field_hearing_ticket_list.uri|default(null) %} {% set hearing_ticket_list_title = has_external_hearing_tickets ? node.field_hearing_ticket_list.title|default('Show hearing tickets'|trans) %} + {% set hide_hearing_replies = 1 == node.field_hide_hearing_replies.value %} + {% set hide_hearing_replies_msg = hide_hearing_replies ? node.field_hide_hearing_replies_msg.value %} {% if has_external_hearing_tickets %} {# Show Add hearing ticket before optional Show hearing tickets when using external hearing ticket system #} @@ -72,35 +74,43 @@ {% if not has_external_hearing_tickets and tickets %} - {% for ticket in tickets %} - -

- {{ ticket.subject }} -

-
- {% set message = ticket.fields.message|default('') %} - {{ message|length > 180 ? message|slice(0, 180)|raw ~ '…' : message|raw }} + {% if hide_hearing_replies %} +
+ - + {% else %} + {% for ticket in tickets %} + +

+ {{ ticket.subject }} +

+
+ {% set message = ticket.fields.message|default('') %} + {{ message|length > 180 ? message|slice(0, 180)|raw ~ '…' : message|raw }} +
+ -
- {% endfor %} + {% if organization_type and organization %} + {{ '@ticket_ref by @person_name on behalf of @organization (@organization_type)'|trans({ + '@ticket_ref': ticket.ref, + '@person_name': person_name, + '@organization': organization, + '@organization_type': organization_type, + }) }} + {% else %} + {{ '@ticket_ref by @person_name'|trans({'@ticket_ref': ticket.ref, '@person_name': person_name}) }} + {% endif %} + | {{ ticket.date_created|date('U')|format_date('hoeringsportal_datetime') }} + +
+ + {% endfor %} + {% endif %} {% endif %} {% endif %} diff --git a/web/modules/custom/hoeringsportal_dialogue/src/Helper/DialogueHelper.php b/web/modules/custom/hoeringsportal_dialogue/src/Helper/DialogueHelper.php index 24a40f9ee..3be5e29e1 100644 --- a/web/modules/custom/hoeringsportal_dialogue/src/Helper/DialogueHelper.php +++ b/web/modules/custom/hoeringsportal_dialogue/src/Helper/DialogueHelper.php @@ -11,6 +11,7 @@ use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Session\AccountInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\Core\Url; use Drupal\node\Entity\Node; use Drupal\node\NodeForm; use Drupal\node\NodeInterface; @@ -246,6 +247,14 @@ public function dialogueProposalFormAlter(array &$form, FormStateInterface $form $parentLocationSelection = $parent->get('field_dialogue_proposal_location')->getValue(); $parentMapConfig = json_decode($parentLocationSelection[0]['map_config'] ?? ''); $form['field_location']['widget'][0]['map_config']['#default_value'] = json_encode($parentMapConfig); + + $form['actions']['back'] = [ + '#url' => Url::fromRoute('entity.node.canonical', ['node' => $parent->id()]), + '#type' => 'link', + '#title' => $this->t('Back to dialogue'), + '#attributes' => ['class' => ['btn', 'btn-secondary', 'mb-2', 'border-0']], + '#weight' => 10, + ]; } if ($parent) { diff --git a/web/modules/custom/hoeringsportal_dialogue/translations/hoeringsportal_dialogue.da.po b/web/modules/custom/hoeringsportal_dialogue/translations/hoeringsportal_dialogue.da.po index 1f2d95512..74b7fdee6 100644 --- a/web/modules/custom/hoeringsportal_dialogue/translations/hoeringsportal_dialogue.da.po +++ b/web/modules/custom/hoeringsportal_dialogue/translations/hoeringsportal_dialogue.da.po @@ -3,8 +3,8 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2026-01-07 12:56+0100\n" -"PO-Revision-Date: 2026-01-07 12:56+0100\n" +"POT-Creation-Date: 2026-02-05 08:47+0100\n" +"PO-Revision-Date: 2026-02-05 08:47+0100\n" "Last-Translator: NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -43,6 +43,9 @@ msgstr "@size begrænsning." msgid "Add new comment" msgstr "Tilføj ny kommentar" +msgid "Back to dialogue" +msgstr "Tilbage til dialog" + msgid "Comment @commentId and it's children have been unpublished." msgstr "" "Kommentaren @commentId og dens underkommentarer er blevet " diff --git a/web/modules/custom/hoeringsportal_forms/templates/node-edit-form--hoeringsportal-hearing.html.twig b/web/modules/custom/hoeringsportal_forms/templates/node-edit-form--hoeringsportal-hearing.html.twig index efd79b030..2a06541c9 100644 --- a/web/modules/custom/hoeringsportal_forms/templates/node-edit-form--hoeringsportal-hearing.html.twig +++ b/web/modules/custom/hoeringsportal_forms/templates/node-edit-form--hoeringsportal-hearing.html.twig @@ -1,20 +1,33 @@ {% extends '@claro/node-edit-form.html.twig' %} +{% set secondary_items = [ + 'advanced', + 'group_hide_hearing_replies', + 'group_information', + 'group_deskpro', + 'group_edoc', + 'group_getorganized', + 'group_contact', + 'group_more_info', + 'group_system_settings', +] %} + +{% set footer_items = [ + 'actions', +] %} + {% block main %} - {{ form|without('advanced', 'actions', 'group_information', 'group_system_settings', 'group_deskpro', 'group_edoc', 'group_getorganized', 'group_contact', 'group_more_info') }} + {{ form|without(secondary_items|merge(footer_items)) }} {% endblock %} {% block secondary %} - {{ form.advanced }} - {{ form.group_information }} - {{ form.group_deskpro }} - {{ form.group_edoc }} - {{ form.group_getorganized }} - {{ form.group_contact }} - {{ form.group_more_info }} - {{ form.group_system_settings }} + {% for item in secondary_items %} + {{ form[item] }} + {% endfor %} {% endblock %} {% block footer %} - {{ form.actions }} + {% for item in footer_items %} + {{ form[item] }} + {% endfor %} {% endblock %} diff --git a/web/modules/custom/hoeringsportal_hearing/src/Helper/FormHelper.php b/web/modules/custom/hoeringsportal_hearing/src/Helper/FormHelper.php index 75ea6cb6b..828051284 100644 --- a/web/modules/custom/hoeringsportal_hearing/src/Helper/FormHelper.php +++ b/web/modules/custom/hoeringsportal_hearing/src/Helper/FormHelper.php @@ -44,6 +44,15 @@ public function formAlter(array &$form, FormStateInterface $form_state, string $ $form['field_edoc_casefile_id']['#access'] = NULL !== $node && !empty($node->field_edoc_casefile_id->value); + $form['field_hide_hearing_replies_msg']['#states'] = [ + 'visible' => [ + ':input[name="field_hide_hearing_replies[value]"]' => ['checked' => TRUE], + ], + ]; + // The 'required' state must be set on the widget + // (cf. https://www.drupal.org/docs/drupal-apis/form-api/conditional-form-fields#staterequired) + $form['field_hide_hearing_replies_msg']['widget'][0]['value']['#states']['required'] = $form['field_hide_hearing_replies_msg']['#states']['visible']; + // Add our custom validation. $form['#validate'][] = [$this, 'validateForm']; } diff --git a/web/modules/custom/hoeringsportal_project/src/Helper/ProjectHelper.php b/web/modules/custom/hoeringsportal_project/src/Helper/ProjectHelper.php index eecea112e..58c0b5c24 100644 --- a/web/modules/custom/hoeringsportal_project/src/Helper/ProjectHelper.php +++ b/web/modules/custom/hoeringsportal_project/src/Helper/ProjectHelper.php @@ -2,10 +2,13 @@ namespace Drupal\hoeringsportal_project\Helper; +use Drupal\Core\Cache\Cache; use Drupal\Core\Datetime\DrupalDateTime; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\Hook\Attribute\Hook; +use Drupal\Core\Logger\LoggerChannelFactoryInterface; use Drupal\Core\Logger\LoggerChannelInterface; use Drupal\Core\Routing\UrlGeneratorInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; @@ -14,8 +17,6 @@ use Drupal\image\Entity\ImageStyle; use Drupal\node\NodeInterface; use Drupal\paragraphs\ParagraphInterface; -use Drupal\Core\Logger\LoggerChannelFactoryInterface; -use Drupal\Core\Hook\Attribute\Hook; /** * Helper class for project-related operations. @@ -113,39 +114,43 @@ public function projectFormAlter(array &$form, FormStateInterface $form_state): #[Hook('entity_presave')] public function entityPresave(EntityInterface $entity): void { if ($entity instanceof NodeInterface) { + // When changing references, we must clear cache for nodes that was + // previously referenced as well as new referenced nodes. try { - if (!$entity->hasField('field_project_reference')) { - return; - } - - $newTargetId = (int) ($entity->get('field_project_reference')->target_id ?? 0); - - $originalEntity = $entity->original ?? NULL; - $oldTargetId = 0; - if ($originalEntity?->hasField('field_project_reference')) { - $oldTargetId = (int) ($originalEntity->get('field_project_reference')->target_id ?? 0); - } - - // Only act if the reference actually changed. - if ($oldTargetId === $newTargetId) { - return; - } - - $idsToReset = []; - if ($oldTargetId > 0) { - $idsToReset[] = $oldTargetId; + if ($entity->hasField('field_project_reference')) { + $newTargetId = (int) ($entity->get('field_project_reference')->target_id ?? 0); + + $originalEntity = $entity->original ?? NULL; + $originalTargetId = 0; + if ($originalEntity?->hasField('field_project_reference')) { + $originalTargetId = (int) ($originalEntity->get('field_project_reference')->target_id ?? 0); + } + + // Only act if the reference actually changed. + if ($originalTargetId === $newTargetId) { + return; + } + + $idsToReset = []; + if ($originalTargetId > 0) { + $idsToReset[] = $originalTargetId; + } + if ($newTargetId > 0) { + $idsToReset[] = $newTargetId; + } + + if ($idsToReset === []) { + return; + } + + // Clear cache for project nodes when we change an entity pointing to + // it. + $idsToReset = array_values(array_unique($idsToReset)); + $nodes = $this->entityTypeManagerInterface->getStorage('node')->loadMultiple($idsToReset); + foreach ($nodes as $node) { + Cache::invalidateTags($node->getCacheTags()); + } } - if ($newTargetId > 0) { - $idsToReset[] = $newTargetId; - } - - if ($idsToReset === []) { - return; - } - - $idsToReset = array_values(array_unique($idsToReset)); - $this->entityTypeManagerInterface->getStorage('node') - ->resetCache($idsToReset); } catch (\Exception $e) { $this->logger->error('Error in node presave hook: @message', ['@message' => $e->getMessage()]); @@ -198,20 +203,15 @@ private function getTimelineNodes(array $variables) : ?array { * Array of paragraph entities or NULL. */ private function getTimelineNotes(array $variables) : ?array { - try { - $paragraphStorage = $this->entityTypeManagerInterface->getStorage('paragraph'); - $noteQuery = $paragraphStorage->getQuery(); - $noteQuery->accessCheck(); - $noteQuery->condition('parent_id', $variables['node']->id()); - $noteQuery->condition('type', 'timeline_note'); - $noteIds = $noteQuery->execute(); - - return $paragraphStorage->loadMultiple($noteIds); - } - catch (\Exception $e) { - $this->logger->error('Error getting timeline notes: @message', ['@message' => $e->getMessage()]); - return []; + $node = $variables['node'] ?? NULL; + if ($node instanceof NodeInterface && $node->hasField('field_timeline')) { + /** @var \Drupal\Core\Field\EntityReferenceFieldItemListInterface $list */ + $list = $node->get('field_timeline'); + + return $list->referencedEntities(); } + + return NULL; } /** diff --git a/web/modules/custom/hoeringsportal_project/translations/hoeringsportal_project.da.po b/web/modules/custom/hoeringsportal_project/translations/hoeringsportal_project.da.po index ca885df38..20defacd3 100644 --- a/web/modules/custom/hoeringsportal_project/translations/hoeringsportal_project.da.po +++ b/web/modules/custom/hoeringsportal_project/translations/hoeringsportal_project.da.po @@ -3,8 +3,8 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2026-01-28 10:13+0100\n" -"PO-Revision-Date: 2026-01-28 10:13+0100\n" +"POT-Creation-Date: 2026-03-03 13:18+0100\n" +"PO-Revision-Date: 2026-03-03 13:18+0100\n" "Last-Translator: NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -13,12 +13,21 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: da\n" +msgid "Deleted @count orphaned timeline_note paragraph(s)." +msgstr "Slettede @count løse tidslinjenoteparagraf(fer)" + msgid "Finished" msgstr "Afsluttet" msgid "In progress" msgstr "I gang" +msgid "No orphaned timeline_note paragraphs found." +msgstr "Ingen løse tidslinjenoter fundet" + +msgid "No timeline_note paragraphs found." +msgstr "Ingen tidslinjenote fundet" + msgid "Note" msgstr "Note" diff --git a/web/modules/custom/hoeringsportal_public_meeting/hoeringsportal_public_meeting.install b/web/modules/custom/hoeringsportal_public_meeting/hoeringsportal_public_meeting.install index f3197009e..003299c37 100644 --- a/web/modules/custom/hoeringsportal_public_meeting/hoeringsportal_public_meeting.install +++ b/web/modules/custom/hoeringsportal_public_meeting/hoeringsportal_public_meeting.install @@ -18,6 +18,9 @@ function hoeringsportal_public_meeting_update_dependencies() { 10002 => [ 'itk_pretix' => 10101, ], + 10003 => [ + 'itk_pretix' => 10102, + ], ], ]; } @@ -79,3 +82,53 @@ function hoeringsportal_public_meeting_update_10002() { } } } + +/** + * Copy contact mail to pretix event settings. + * + * Note: For performance reasons (mainly due to request to pretix), rather than + * saving nodes we update values directly in the database. + */ +function hoeringsportal_public_meeting_update_10003() { + /** @var \Drupal\hoeringsportal_public_meeting\Helper\PublicMeetingHelper $helper */ + $helper = \Drupal::service('hoeringsportal_public_meeting.public_meeting_helper'); + $publicMeetings = $helper->loadPublicMeetings(); + + $values = []; + foreach ($publicMeetings as $publicMeeting) { + if ($helper->hasPretixSignUp($publicMeeting)) { + $contactMail = $publicMeeting->field_email_address->getString() ?: NULL; + foreach ($publicMeeting->field_pretix_event_settings as $delta => $_) { + $values[] = [ + 'conditions' => [ + 'bundle' => $publicMeeting->bundle(), + 'entity_id' => $publicMeeting->id(), + 'delta' => $delta, + ], + 'fields' => [ + 'field_pretix_event_settings_contact_mail' => $contactMail, + ], + ]; + } + } + } + + if (!empty($values)) { + $tableNames = \Drupal::entityTypeManager() + ->getStorage('node') + ->getTableMapping() + ->getAllFieldTableNames('field_pretix_event_settings'); + $database = \Drupal::database(); + + foreach ($tableNames as $tableName) { + foreach ($values as $value) { + $query = $database->update($tableName) + ->fields($value['fields']); + foreach ($value['conditions'] as $field => $val) { + $query->condition($field, $val); + } + $query->execute(); + } + } + } +} diff --git a/web/themes/custom/hoeringsportal/assets/css/module/_animated-svg.scss b/web/themes/custom/hoeringsportal/assets/css/module/_animated-svg.scss index cba3a1080..a1a26a45e 100644 --- a/web/themes/custom/hoeringsportal/assets/css/module/_animated-svg.scss +++ b/web/themes/custom/hoeringsportal/assets/css/module/_animated-svg.scss @@ -1,4 +1,4 @@ -a:has(svg) { +button:has(svg) { /* prettier-ignore */ --ease-spring-lazy: linear(0, 0.008 1.1%, 0.034 2.3%, 0.134 4.9%, 0.264 7.3%, 0.683 14.3%, 0.797 16.5%, 0.89 18.6%, 0.967 20.7%, 1.027 22.8%, 1.073 25%, 1.104 27.3%, 1.123 30.6%, 1.119 34.3%, 1.018 49.5%, 0.988 58.6%, 0.985 65.2%, 1 84.5%, 1); /* prettier-ignore */ @@ -80,8 +80,8 @@ a:has(svg) { } } -/* Click on with thumbs-up svg */ -.liked a:has(svg) { +/* Click on
diff --git a/web/themes/custom/hoeringsportal/templates/content/flag--support-proposal.html.twig b/web/themes/custom/hoeringsportal/templates/content/flag--support-proposal.html.twig index 38c103b87..4a70502b6 100644 --- a/web/themes/custom/hoeringsportal/templates/content/flag--support-proposal.html.twig +++ b/web/themes/custom/hoeringsportal/templates/content/flag--support-proposal.html.twig @@ -34,8 +34,6 @@ ] %} -{# Set nofollow to prevent search bots from crawling anonymous flag links #} -{% set attributes = attributes.setAttribute('rel', 'nofollow') %}
- {{ include('themes/custom/hoeringsportal/templates/animated-svg/icon-deltag-thumbs-up.svg.html.twig') }}{{ flagcount(flag, flaggable) }} {{ 'like this'|t }} + {{ include('themes/custom/hoeringsportal/templates/animated-svg/icon-deltag-thumbs-up.svg.html.twig') }} {{ flagcount(flag, flaggable) }} {{ 'Like this'|t }}
diff --git a/web/themes/custom/hoeringsportal/templates/content/node--decision--teaser.html.twig b/web/themes/custom/hoeringsportal/templates/content/node--decision--teaser.html.twig index 955d405e2..36af1fd58 100755 --- a/web/themes/custom/hoeringsportal/templates/content/node--decision--teaser.html.twig +++ b/web/themes/custom/hoeringsportal/templates/content/node--decision--teaser.html.twig @@ -3,7 +3,7 @@ {% extends 'themes/custom/hoeringsportal/templates/components/base-card.html.twig' %} {% block card_content %} - {{ node.field_teaser.value|truncate(95, true, true) }} + {{ node.field_teaser.string|truncate(95, true, true) }} {{ content.field_project_category }} {{ content.field_area }}{{ content.field_type }} {% endblock %} diff --git a/web/themes/custom/hoeringsportal/templates/content/node--dialogue--teaser.html.twig b/web/themes/custom/hoeringsportal/templates/content/node--dialogue--teaser.html.twig index 955d405e2..36af1fd58 100755 --- a/web/themes/custom/hoeringsportal/templates/content/node--dialogue--teaser.html.twig +++ b/web/themes/custom/hoeringsportal/templates/content/node--dialogue--teaser.html.twig @@ -3,7 +3,7 @@ {% extends 'themes/custom/hoeringsportal/templates/components/base-card.html.twig' %} {% block card_content %} - {{ node.field_teaser.value|truncate(95, true, true) }} + {{ node.field_teaser.string|truncate(95, true, true) }} {{ content.field_project_category }} {{ content.field_area }}{{ content.field_type }} {% endblock %} diff --git a/web/themes/custom/hoeringsportal/templates/content/node--dialogue-proposal--full.html.twig b/web/themes/custom/hoeringsportal/templates/content/node--dialogue-proposal--full.html.twig index 5dfccb54e..c269179cb 100755 --- a/web/themes/custom/hoeringsportal/templates/content/node--dialogue-proposal--full.html.twig +++ b/web/themes/custom/hoeringsportal/templates/content/node--dialogue-proposal--full.html.twig @@ -21,7 +21,7 @@
- + {{ content.flag_support_proposal }}
{{ include('themes/custom/hoeringsportal/templates/animated-svg/icon-deltag-comment.svg.html.twig') }}{% trans %}1 comment{% plural node.field_comments.comment_count %}{{ count }} comments{% endtrans %} @@ -82,6 +82,10 @@ {{ content.field_comments }}
+ +
+ {{ 'Back to dialogue'|t }} +
diff --git a/web/themes/custom/hoeringsportal/templates/content/node--dialogue-proposal--list-display.html.twig b/web/themes/custom/hoeringsportal/templates/content/node--dialogue-proposal--list-display.html.twig index 8558f95fa..bee43b05e 100755 --- a/web/themes/custom/hoeringsportal/templates/content/node--dialogue-proposal--list-display.html.twig +++ b/web/themes/custom/hoeringsportal/templates/content/node--dialogue-proposal--list-display.html.twig @@ -69,24 +69,26 @@ #}
-
-

{{ label }}

-
-
- {{ content.field_dialogue_proposal_descr }} + -
+ +
-
+
{{ node.field_comments.comment_count }}{{ 'Comments'|t }}
-
- +
+ {{ content.flag_support_proposal }}
-
+
{{ content.field_dialogue_proposal_category }}
diff --git a/web/themes/custom/hoeringsportal/templates/content/node--hearing--teaser.html.twig b/web/themes/custom/hoeringsportal/templates/content/node--hearing--teaser.html.twig index 6df4c4964..89a7ecdf1 100755 --- a/web/themes/custom/hoeringsportal/templates/content/node--hearing--teaser.html.twig +++ b/web/themes/custom/hoeringsportal/templates/content/node--hearing--teaser.html.twig @@ -35,7 +35,7 @@ {# Show teaser description #} {% block card_content %} - {{ content.field_teaser[0]['#context'].value|truncate(95, true, true) }} + {{ node.field_teaser.string|truncate(95, true, true) }} {% endblock %} {# Collect data for information lines on card #} diff --git a/web/themes/custom/hoeringsportal/templates/content/node--project-main-page--teaser.html.twig b/web/themes/custom/hoeringsportal/templates/content/node--project-main-page--teaser.html.twig index 7d70d0271..6e604cd0d 100755 --- a/web/themes/custom/hoeringsportal/templates/content/node--project-main-page--teaser.html.twig +++ b/web/themes/custom/hoeringsportal/templates/content/node--project-main-page--teaser.html.twig @@ -3,7 +3,7 @@ {% extends 'themes/custom/hoeringsportal/templates/components/base-card.html.twig' %} {% block card_content %} - {{ node.field_short_description.value|truncate(95, true, true) }} + {{ node.field_short_description.string|truncate(95, true, true) }} {{ content.field_project_category }} {{ content.field_area }}{{ content.field_type }} {% endblock %} diff --git a/web/themes/custom/hoeringsportal/templates/ds/ds-2col-stacked--node-hearing-hearing-ticket-view.html.twig b/web/themes/custom/hoeringsportal/templates/ds/ds-2col-stacked--node-hearing-hearing-ticket-view.html.twig index defc477f9..de785530f 100644 --- a/web/themes/custom/hoeringsportal/templates/ds/ds-2col-stacked--node-hearing-hearing-ticket-view.html.twig +++ b/web/themes/custom/hoeringsportal/templates/ds/ds-2col-stacked--node-hearing-hearing-ticket-view.html.twig @@ -21,6 +21,9 @@ */ #} +{% set hide_hearing_replies = 1 == node.field_hide_hearing_replies.value %} +{% set hide_hearing_replies_msg = hide_hearing_replies ? node.field_hide_hearing_replies_msg.value %} + <{{ outer_wrapper }}{{ attributes.addClass('ds-2col-stacked', 'clearfix') }}> {{ title_suffix.contextual_links }} @@ -28,16 +31,32 @@ <{{ header_wrapper }}{{ header_attributes.addClass('group-header bg-primary text-white') }}> {{ include(directory ~ '/templates/components/header.html.twig', {header: header}) }} -
-
- <{{ left_wrapper }}{{ left_attributes.addClass('content group-left col-md-8') }}> +
+ {% if hide_hearing_replies %} +
+ <{{ left_wrapper }}{{ left_attributes.addClass('content group-left col-md-8') }}> +
+ +
+ + + <{{ right_wrapper }}{{ right_attributes.addClass('group-right col-md-4 py-3') }}> + {{ right|without('dynamic_block_field:node-hearing_ticket_author') }} + +
+ {% else %} +
+ <{{ left_wrapper }}{{ left_attributes.addClass('content group-left col-md-8') }}> {{ left }} - + - <{{ right_wrapper }}{{ right_attributes.addClass('group-right col-md-4 py-3') }}> + <{{ right_wrapper }}{{ right_attributes.addClass('group-right col-md-4 py-3') }}> {{ right }} - -
+ +
+ {% endif %}
<{{ footer_wrapper }}{{ footer_attributes.addClass('group-footer container-flex') }}> {{ footer }} diff --git a/web/themes/custom/hoeringsportal/templates/field/field--field-dialogue-proposal-category--full.html.twig b/web/themes/custom/hoeringsportal/templates/field/field--field-dialogue-proposal-category--full.html.twig index 16f585a9e..dc0485c9c 100644 --- a/web/themes/custom/hoeringsportal/templates/field/field--field-dialogue-proposal-category--full.html.twig +++ b/web/themes/custom/hoeringsportal/templates/field/field--field-dialogue-proposal-category--full.html.twig @@ -37,8 +37,11 @@ */ #} -
+ +
    {% for item in items %} - {{ item.content }} +
  • {{ item.content }}
  • {% endfor %} -
+ diff --git a/web/themes/custom/hoeringsportal/templates/field/field--field-dialogue-proposal-category.html.twig b/web/themes/custom/hoeringsportal/templates/field/field--field-dialogue-proposal-category.html.twig index 35954b156..372193106 100644 --- a/web/themes/custom/hoeringsportal/templates/field/field--field-dialogue-proposal-category.html.twig +++ b/web/themes/custom/hoeringsportal/templates/field/field--field-dialogue-proposal-category.html.twig @@ -37,14 +37,17 @@ */ #} -
+ +
    {% if (items[0]) %} - {{ items[0].content }} +
  • {{ items[0].content }}
  • {% endif %} {% if (items[1]) %} - {{ items[1].content }} +
  • {{ items[1].content }}
  • {% endif %} {% if (items|length > 2) %} - +{{ items|length - 2 }} +
  • +{{ items|length - 2 }}
  • {% endif %} -
+ diff --git a/web/themes/custom/hoeringsportal/translations/hoeringsportal.da.po b/web/themes/custom/hoeringsportal/translations/hoeringsportal.da.po index d14811ef1..bcccf39ee 100644 --- a/web/themes/custom/hoeringsportal/translations/hoeringsportal.da.po +++ b/web/themes/custom/hoeringsportal/translations/hoeringsportal.da.po @@ -3,8 +3,8 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2026-02-25 12:15+0100\n" -"PO-Revision-Date: 2026-02-25 12:15+0100\n" +"POT-Creation-Date: 2026-03-09 10:55+0100\n" +"PO-Revision-Date: 2026-03-09 10:55+0100\n" "Last-Translator: NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -72,6 +72,9 @@ msgstr "" msgid "Attachments" msgstr "Vedhæftninger" +msgid "Back to dialogue" +msgstr "Tilbage til dialog" + msgid "" "Before you can contribute you must validate your user account with " "NemID." @@ -426,6 +429,9 @@ msgstr "Initiativ start" msgid "Project timeline" msgstr "Projektets tidslinje" +msgid "Proposal categories" +msgstr "Forslagskategorier" + msgid "Proposals" msgstr "Forslag"