From d7b109c462f71cd4a2131089947c2d7317df2771 Mon Sep 17 00:00:00 2001 From: David Featherston Date: Fri, 22 May 2026 15:19:55 +1000 Subject: [PATCH 01/12] feat: add external site link content type --- .circleci/test.sh | 2 + behat.yml | 1 + modules/tide_external_site_link/README.md | 8 + ...isplay.node.external_site_link.default.yml | 254 ++++++++++++++++++ ...isplay.node.external_site_link.default.yml | 102 +++++++ ...w_display.node.external_site_link.full.yml | 103 +++++++ ...display.node.external_site_link.teaser.yml | 44 +++ ...ernal_site_link.field_content_keywords.yml | 19 ++ ...xternal_site_link.field_featured_image.yml | 29 ++ ...l_site_link.field_landing_page_summary.yml | 19 ++ ...ternal_site_link.field_node_department.yml | 29 ++ ...ode.external_site_link.field_node_link.yml | 36 +++ ...rnal_site_link.field_node_primary_site.yml | 24 ++ ...ode.external_site_link.field_node_site.yml | 24 ++ ...eld.node.external_site_link.field_tags.yml | 29 ++ ...ld.node.external_site_link.field_topic.yml | 29 ++ ...ld.storage.node.field_content_keywords.yml | 21 ++ .../install/node.type.external_site_link.yml | 18 ++ .../src/TideExternalSiteLinkOperation.php | 125 +++++++++ .../tests/behat/features/access.feature | 18 ++ .../tests/behat/features/fields.feature | 26 ++ .../tide_external_site_link.info.yml | 26 ++ .../tide_external_site_link.install | 22 ++ .../tide_external_site_link.module | 39 +++ .../tide_external_site_link.permissions.yml | 33 +++ 25 files changed, 1080 insertions(+) create mode 100644 modules/tide_external_site_link/README.md create mode 100644 modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml create mode 100644 modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.default.yml create mode 100644 modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.full.yml create mode 100644 modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.teaser.yml create mode 100644 modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_content_keywords.yml create mode 100644 modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_featured_image.yml create mode 100644 modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_landing_page_summary.yml create mode 100644 modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_department.yml create mode 100644 modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_link.yml create mode 100644 modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_primary_site.yml create mode 100644 modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_site.yml create mode 100644 modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_tags.yml create mode 100644 modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_topic.yml create mode 100644 modules/tide_external_site_link/config/install/field.storage.node.field_content_keywords.yml create mode 100644 modules/tide_external_site_link/config/install/node.type.external_site_link.yml create mode 100644 modules/tide_external_site_link/src/TideExternalSiteLinkOperation.php create mode 100644 modules/tide_external_site_link/tests/behat/features/access.feature create mode 100644 modules/tide_external_site_link/tests/behat/features/fields.feature create mode 100644 modules/tide_external_site_link/tide_external_site_link.info.yml create mode 100644 modules/tide_external_site_link/tide_external_site_link.install create mode 100644 modules/tide_external_site_link/tide_external_site_link.module create mode 100644 modules/tide_external_site_link/tide_external_site_link.permissions.yml diff --git a/.circleci/test.sh b/.circleci/test.sh index 6a65db138..b9673d5c7 100755 --- a/.circleci/test.sh +++ b/.circleci/test.sh @@ -24,6 +24,8 @@ ahoy cli "drush en tide_landing_page -y" ahoy cli "./vendor/bin/behat --strict --colors --tags="~@skipped" modules/tide_landing_page" ahoy cli "drush en tide_site -y" ahoy cli "./vendor/bin/behat --strict --colors modules/tide_site" +ahoy cli "drush en tide_external_site_link -y" +ahoy cli "./vendor/bin/behat --strict --colors modules/tide_external_site_link" ahoy cli "drush en tide_ui_restriction -y" ahoy cli "./vendor/bin/behat --strict --colors modules/tide_ui_restriction" ahoy cli "drush en tide_api -y" diff --git a/behat.yml b/behat.yml index 523d379ef..c179dd0a6 100644 --- a/behat.yml +++ b/behat.yml @@ -19,6 +19,7 @@ default: - '%paths.base%/modules/tide_media/tests/behat/features' - '%paths.base%/modules/tide_webform/tests/behat/features' - '%paths.base%/modules/tide_publication/tests/behat/features' + - '%paths.base%/modules/tide_external_site_link/tests/behat/features' - '%paths.base%/modules/tide_alert/tests/behat/features' - '%paths.base%/modules/tide_tfa/tests/behat/features' contexts: diff --git a/modules/tide_external_site_link/README.md b/modules/tide_external_site_link/README.md new file mode 100644 index 000000000..3faeb3830 --- /dev/null +++ b/modules/tide_external_site_link/README.md @@ -0,0 +1,8 @@ +# tide_external_site_link +External site link content type for Tide distribution + +[![CircleCI](https://circleci.com/gh/dpc-sdp/tide_external_site_link.svg?style=svg&circle-token=ed8f970fb288fe68b6045a6a7c9ee968859bd244)](https://circleci.com/gh/dpc-sdp/tide_external_site_link) + +# INTRODUCTION +The Tide external site link module provides the External site link content type and related configurations. +This module defines the needed fields, paragraph types and block types used in External site links. diff --git a/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml b/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml new file mode 100644 index 000000000..aca3d4333 --- /dev/null +++ b/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml @@ -0,0 +1,254 @@ +uuid: 66050392-5dd3-41af-9cab-a77d40176ec7 +langcode: en +status: true +dependencies: + config: + - entity_browser.browser.tide_image_browser + - field.field.node.external_site_link.field_content_keywords + - field.field.node.external_site_link.field_featured_image + - field.field.node.external_site_link.field_landing_page_summary + - field.field.node.external_site_link.field_node_department + - field.field.node.external_site_link.field_node_link + - field.field.node.external_site_link.field_node_primary_site + - field.field.node.external_site_link.field_node_site + - field.field.node.external_site_link.field_tags + - field.field.node.external_site_link.field_topic + - node.type.external_site_link + module: + - content_moderation + - entity_browser + - field_group + - link + - path + - select2 + - tide_site_restriction +third_party_settings: + field_group: + group_tags_and_metadata: + children: + - group_page_tags + - group_page_metadata + label: 'Tags and Metadata' + region: content + parent_name: '' + weight: 5 + format_type: tabs + format_settings: + classes: '' + show_empty_fields: false + id: '' + label_as_html: false + direction: horizontal + width_breakpoint: 640 + group_page_tags: + children: + - field_topic + - field_tags + label: 'Page tags' + region: content + parent_name: group_tags_and_metadata + weight: 10 + format_type: tab + format_settings: + classes: '' + show_empty_fields: true + id: '' + label_as_html: false + formatter: open + description: '' + required_fields: true + group_page_metadata: + children: + - field_node_department + - group_sites + label: 'Page metadata' + region: content + parent_name: group_tags_and_metadata + weight: 11 + format_type: tab + format_settings: + classes: '' + show_empty_fields: true + id: '' + label_as_html: false + formatter: closed + description: '' + required_fields: true + group_sites: + children: + - field_node_site + - field_node_primary_site + label: Sites + region: content + parent_name: group_page_metadata + weight: 16 + format_type: details + format_settings: + classes: '' + show_empty_fields: true + id: '' + label_as_html: false + open: true + description: '' + required_fields: true +id: node.external_site_link.default +targetEntityType: node +bundle: external_site_link +mode: default +content: + created: + type: datetime_timestamp + weight: 7 + region: content + settings: { } + third_party_settings: { } + field_content_keywords: + type: string_textfield + weight: 4 + region: content + settings: + size: 60 + placeholder: '' + third_party_settings: { } + field_featured_image: + type: entity_browser_entity_reference + weight: 3 + region: content + settings: + entity_browser: tide_image_browser + field_widget_display: rendered_entity + field_widget_edit: true + field_widget_remove: true + field_widget_replace: false + open: false + field_widget_display_settings: + view_mode: media_browser_preview + selection_mode: selection_append + third_party_settings: { } + field_landing_page_summary: + type: string_textarea + weight: 1 + region: content + settings: + rows: 5 + placeholder: '' + third_party_settings: + maxlength: + maxlength_js: 200 + maxlength_js_label: 'Content limited to @limit characters, remaining: @remaining' + maxlength_js_enforce: false + maxlength_js_truncate_html: false + field_node_department: + type: select2_entity_reference + weight: 15 + region: content + settings: + width: 100% + autocomplete: false + match_operator: CONTAINS + match_limit: 10 + third_party_settings: { } + field_node_link: + type: link_default + weight: 2 + region: content + settings: + placeholder_url: '' + placeholder_title: '' + third_party_settings: { } + field_node_primary_site: + type: tide_site_restriction_field_widget + weight: 6 + region: content + settings: { } + third_party_settings: { } + field_name: field_node_primary_site + field_node_site: + type: tide_site_restriction_field_widget + weight: 5 + region: content + settings: { } + third_party_settings: { } + field_name: field_node_site + field_tags: + type: select2_entity_reference + weight: 14 + region: content + settings: + width: 100% + autocomplete: false + match_operator: CONTAINS + match_limit: 10 + third_party_settings: { } + field_topic: + type: select2_entity_reference + weight: 13 + region: content + settings: + width: 100% + autocomplete: false + match_operator: CONTAINS + match_limit: 10 + third_party_settings: { } + moderation_state: + type: moderation_state_default + weight: 13 + region: content + settings: { } + third_party_settings: { } + path: + type: path + weight: 11 + region: content + settings: { } + third_party_settings: { } + promote: + type: boolean_checkbox + weight: 9 + region: content + settings: + display_label: true + third_party_settings: { } + simple_sitemap: + weight: 8 + region: content + settings: { } + third_party_settings: { } + status: + type: boolean_checkbox + weight: 14 + region: content + settings: + display_label: true + third_party_settings: { } + sticky: + type: boolean_checkbox + weight: 10 + region: content + settings: + display_label: true + third_party_settings: { } + title: + type: string_textfield + weight: 0 + region: content + settings: + size: 60 + placeholder: '' + third_party_settings: { } + uid: + type: entity_reference_autocomplete + weight: 6 + region: content + settings: + match_operator: CONTAINS + match_limit: 10 + size: 60 + placeholder: '' + third_party_settings: { } + url_redirects: + weight: 12 + region: content + settings: { } + third_party_settings: { } +hidden: { } diff --git a/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.default.yml b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.default.yml new file mode 100644 index 000000000..c3c6214cb --- /dev/null +++ b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.default.yml @@ -0,0 +1,102 @@ +uuid: 4431c03c-a123-4d46-9474-106c9f992150 +langcode: en +status: true +dependencies: + config: + - field.field.node.external_site_link.field_content_keywords + - field.field.node.external_site_link.field_featured_image + - field.field.node.external_site_link.field_landing_page_summary + - field.field.node.external_site_link.field_node_department + - field.field.node.external_site_link.field_node_link + - field.field.node.external_site_link.field_node_primary_site + - field.field.node.external_site_link.field_node_site + - field.field.node.external_site_link.field_tags + - field.field.node.external_site_link.field_topic + - node.type.external_site_link + module: + - link + - user +id: node.external_site_link.default +targetEntityType: node +bundle: external_site_link +mode: default +content: + field_content_keywords: + type: string + label: above + settings: + link_to_entity: false + third_party_settings: { } + weight: 3 + region: content + field_featured_image: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 2 + region: content + field_landing_page_summary: + type: basic_string + label: above + settings: { } + third_party_settings: { } + weight: 0 + region: content + field_node_department: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 6 + region: content + field_node_link: + type: link + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + weight: 1 + region: content + field_node_primary_site: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 7 + region: content + field_node_site: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 8 + region: content + field_tags: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 5 + region: content + field_topic: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 4 + region: content +hidden: + computed_breadcrumb_trail: true + links: true + search_api_excerpt: true diff --git a/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.full.yml b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.full.yml new file mode 100644 index 000000000..6f92bf94f --- /dev/null +++ b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.full.yml @@ -0,0 +1,103 @@ +uuid: 2826e25d-0fca-4640-a943-d6d519225db7 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.full + - field.field.node.external_site_link.field_content_keywords + - field.field.node.external_site_link.field_featured_image + - field.field.node.external_site_link.field_landing_page_summary + - field.field.node.external_site_link.field_node_department + - field.field.node.external_site_link.field_node_link + - field.field.node.external_site_link.field_node_primary_site + - field.field.node.external_site_link.field_node_site + - field.field.node.external_site_link.field_tags + - field.field.node.external_site_link.field_topic + - node.type.external_site_link + module: + - link + - user +id: node.external_site_link.full +targetEntityType: node +bundle: external_site_link +mode: full +content: + field_content_keywords: + type: string + label: above + settings: + link_to_entity: false + third_party_settings: { } + weight: 3 + region: content + field_featured_image: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 2 + region: content + field_landing_page_summary: + type: basic_string + label: above + settings: { } + third_party_settings: { } + weight: 0 + region: content + field_node_department: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 6 + region: content + field_node_link: + type: link + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + weight: 1 + region: content + field_node_primary_site: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 7 + region: content + field_node_site: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 8 + region: content + field_tags: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 5 + region: content + field_topic: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 4 + region: content +hidden: + computed_breadcrumb_trail: true + links: true + search_api_excerpt: true diff --git a/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.teaser.yml b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.teaser.yml new file mode 100644 index 000000000..b0c4ae729 --- /dev/null +++ b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.teaser.yml @@ -0,0 +1,44 @@ +uuid: beee30d7-24b3-45a8-a2d0-c12f3e1eb389 +langcode: en +status: false +dependencies: + config: + - core.entity_view_mode.node.teaser + - field.field.node.external_site_link.field_content_keywords + - field.field.node.external_site_link.field_featured_image + - field.field.node.external_site_link.field_landing_page_summary + - field.field.node.external_site_link.field_node_department + - field.field.node.external_site_link.field_node_link + - field.field.node.external_site_link.field_node_primary_site + - field.field.node.external_site_link.field_node_site + - field.field.node.external_site_link.field_tags + - field.field.node.external_site_link.field_topic + - node.type.external_site_link + module: + - user +id: node.external_site_link.teaser +targetEntityType: node +bundle: external_site_link +mode: teaser +content: + computed_breadcrumb_trail: + settings: { } + third_party_settings: { } + weight: -10 + region: content + links: + settings: { } + third_party_settings: { } + weight: 100 + region: content +hidden: + field_content_keywords: true + field_featured_image: true + field_landing_page_summary: true + field_node_department: true + field_node_link: true + field_node_primary_site: true + field_node_site: true + field_tags: true + field_topic: true + search_api_excerpt: true diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_content_keywords.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_content_keywords.yml new file mode 100644 index 000000000..4fe24c509 --- /dev/null +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_content_keywords.yml @@ -0,0 +1,19 @@ +uuid: 0f4e6b56-a773-4a84-bd8f-84ed2c69126f +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_content_keywords + - node.type.external_site_link +id: node.external_site_link.field_content_keywords +field_name: field_content_keywords +entity_type: node +bundle: external_site_link +label: Keywords +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: { } +field_type: string diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_featured_image.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_featured_image.yml new file mode 100644 index 000000000..ffe433807 --- /dev/null +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_featured_image.yml @@ -0,0 +1,29 @@ +uuid: 80b65ca9-93df-4025-b3e7-d26ddef4dfb5 +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_featured_image + - media.type.image + - node.type.external_site_link +id: node.external_site_link.field_featured_image +field_name: field_featured_image +entity_type: node +bundle: external_site_link +label: Image +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:media' + handler_settings: + target_bundles: + image: image + sort: + field: _none + direction: ASC + auto_create: false + auto_create_bundle: '' +field_type: entity_reference diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_landing_page_summary.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_landing_page_summary.yml new file mode 100644 index 000000000..b78d6e12a --- /dev/null +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_landing_page_summary.yml @@ -0,0 +1,19 @@ +uuid: 755c88ba-a04b-4f53-b136-ad523689d907 +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_landing_page_summary + - node.type.external_site_link +id: node.external_site_link.field_landing_page_summary +field_name: field_landing_page_summary +entity_type: node +bundle: external_site_link +label: Summary +description: '' +required: true +translatable: false +default_value: { } +default_value_callback: '' +settings: { } +field_type: string_long diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_department.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_department.yml new file mode 100644 index 000000000..ce6ce7d80 --- /dev/null +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_department.yml @@ -0,0 +1,29 @@ +uuid: 0eea0c87-36b0-4d0a-a557-0d62af6023bc +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_node_department + - node.type.external_site_link + - taxonomy.vocabulary.department +id: node.external_site_link.field_node_department +field_name: field_node_department +entity_type: node +bundle: external_site_link +label: Department +description: '' +required: true +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + department: department + sort: + field: name + direction: asc + auto_create: false + auto_create_bundle: '' +field_type: entity_reference diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_link.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_link.yml new file mode 100644 index 000000000..cf40a571f --- /dev/null +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_link.yml @@ -0,0 +1,36 @@ +uuid: bd92bee5-5424-47df-a04c-22c356bf8a64 +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_node_link + - node.type.external_site_link + module: + - link + - link_field_autocomplete_filter +third_party_settings: + link_field_autocomplete_filter: + negate: null + allowed_content_types: + external_site_link: '0' + alert: '0' + event: '0' + grant: '0' + landing_page: '0' + news: '0' + test: '0' + tide_search_listing: '0' +id: node.external_site_link.field_node_link +field_name: field_node_link +entity_type: node +bundle: external_site_link +label: 'Website URL' +description: '' +required: true +translatable: false +default_value: { } +default_value_callback: '' +settings: + title: 0 + link_type: 16 +field_type: link diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_primary_site.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_primary_site.yml new file mode 100644 index 000000000..05792559f --- /dev/null +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_primary_site.yml @@ -0,0 +1,24 @@ +uuid: 7587503b-5a6b-44b6-bd65-07628810368d +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_node_primary_site + - node.type.external_site_link + - taxonomy.vocabulary.sites +id: node.external_site_link.field_node_primary_site +field_name: field_node_primary_site +entity_type: node +bundle: external_site_link +label: 'Primary Site' +description: '' +required: true +translatable: true +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + sites: sites +field_type: entity_reference diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_site.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_site.yml new file mode 100644 index 000000000..ac7cbce77 --- /dev/null +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_site.yml @@ -0,0 +1,24 @@ +uuid: 1c1391ee-4fac-4da8-82a8-b123d4102b44 +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_node_site + - node.type.external_site_link + - taxonomy.vocabulary.sites +id: node.external_site_link.field_node_site +field_name: field_node_site +entity_type: node +bundle: external_site_link +label: Site +description: '' +required: true +translatable: true +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + sites: sites +field_type: entity_reference diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_tags.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_tags.yml new file mode 100644 index 000000000..a034fb170 --- /dev/null +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_tags.yml @@ -0,0 +1,29 @@ +uuid: 3f39f14a-81e7-44d4-9c41-6bd00ddcc230 +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_tags + - node.type.external_site_link + - taxonomy.vocabulary.tags +id: node.external_site_link.field_tags +field_name: field_tags +entity_type: node +bundle: external_site_link +label: Tags +description: 'Tags are not mandatory. Start typing tags for audience groups who may be interested in this content. See a list of tags.' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + tags: tags + sort: + field: name + direction: asc + auto_create: false + auto_create_bundle: '' +field_type: entity_reference diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_topic.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_topic.yml new file mode 100644 index 000000000..6fb88a063 --- /dev/null +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_topic.yml @@ -0,0 +1,29 @@ +uuid: 9ecb3f49-9860-45df-9f82-158be35b9c5a +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_topic + - node.type.external_site_link + - taxonomy.vocabulary.topic +id: node.external_site_link.field_topic +field_name: field_topic +entity_type: node +bundle: external_site_link +label: Topic +description: 'Use Topic field to categorise events by Topic.' +required: true +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + topic: topic + sort: + field: name + direction: asc + auto_create: false + auto_create_bundle: '' +field_type: entity_reference diff --git a/modules/tide_external_site_link/config/install/field.storage.node.field_content_keywords.yml b/modules/tide_external_site_link/config/install/field.storage.node.field_content_keywords.yml new file mode 100644 index 000000000..53dc16583 --- /dev/null +++ b/modules/tide_external_site_link/config/install/field.storage.node.field_content_keywords.yml @@ -0,0 +1,21 @@ +uuid: 25919ca0-d255-4534-82e5-470473640c21 +langcode: en +status: true +dependencies: + module: + - node +id: node.field_content_keywords +field_name: field_content_keywords +entity_type: node +type: string +settings: + max_length: 255 + case_sensitive: false + is_ascii: false +module: core +locked: false +cardinality: -1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/modules/tide_external_site_link/config/install/node.type.external_site_link.yml b/modules/tide_external_site_link/config/install/node.type.external_site_link.yml new file mode 100644 index 000000000..f7c7b9606 --- /dev/null +++ b/modules/tide_external_site_link/config/install/node.type.external_site_link.yml @@ -0,0 +1,18 @@ +uuid: d028c165-1cc1-4116-95b1-8188599bd928 +langcode: en +status: true +dependencies: + module: + - menu_ui +third_party_settings: + menu_ui: + available_menus: + - main + parent: 'main:' +name: 'External site link' +type: external_site_link +description: 'Links to external websites that can be surfaced within site search.' +help: null +new_revision: true +preview_mode: 1 +display_submitted: true diff --git a/modules/tide_external_site_link/src/TideExternalSiteLinkOperation.php b/modules/tide_external_site_link/src/TideExternalSiteLinkOperation.php new file mode 100644 index 000000000..38b896cd8 --- /dev/null +++ b/modules/tide_external_site_link/src/TideExternalSiteLinkOperation.php @@ -0,0 +1,125 @@ +moduleExists('workflows'))) { + return; + } + + $editorial_workflow = Workflow::load('editorial'); + + if ($editorial_workflow) { + $editorial_workflow->getTypePlugin()->addEntityTypeAndBundle('node', 'external_site_link'); + $editorial_workflow->save(); + } + } + + /** + * Add external site link content type scheduled transitions. + */ + public static function addToScheduledTransitions() { + if (!(\Drupal::moduleHandler()->moduleExists('scheduled_transitions'))) { + return; + } + $config_factory = \Drupal::configFactory(); + $config = $config_factory->getEditable('scheduled_transitions.settings'); + $bundles = $config->get('bundles'); + if ($bundles) { + foreach ($bundles as $bundle) { + $enabled_bundles = []; + $enabled_bundles[] = $bundle['bundle']; + } + if (!in_array('external_site_link', $enabled_bundles)) { + $bundles[] = ['entity_type' => 'node', 'bundle' => 'external_site_link']; + $config->set('bundles', $bundles)->save(); + } + } + else { + $bundles[] = ['entity_type' => 'node', 'bundle' => 'external_site_link']; + $config->set('bundles', $bundles)->save(); + } + } + + /** + * Assign permissions. + */ + public static function assignNecessaryPermissions() { + $role_permissions = [ + 'editor' => [ + 'clone external_site_link content', + 'create external_site_link content', + 'edit any external_site_link content', + 'edit own external_site_link content', + 'revert external_site_link revisions', + 'view external_site_link revisions', + ], + 'approver' => [ + 'add scheduled transitions node external_site_link', + 'create external_site_link content', + 'delete any external_site_link content', + 'delete external_site_link revisions', + 'delete own external_site_link content', + 'edit any external_site_link content', + 'edit own external_site_link content', + 'revert external_site_link revisions', + 'view external_site_link revisions', + 'view scheduled transitions node external_site_link', + ], + 'site_admin' => [ + 'clone external_site_link content', + 'create external_site_link content', + 'delete any external_site_link content', + 'delete external_site_link revisions', + 'delete own external_site_link content', + 'edit any external_site_link content', + 'edit own external_site_link content', + 'revert external_site_link revisions', + 'view external_site_link revisions', + ], + ]; + + foreach ($role_permissions as $role => $permissions) { + if (Role::load($role) && !is_null(Role::load($role))) { + user_role_grant_permissions(Role::load($role)->id(), $permissions); + } + } + } + + /** + * Add fields to search API. + */ + public static function addFieldsToSearchApi() { + $moduleHandler = \Drupal::service('module_handler'); + + if (!$moduleHandler->moduleExists('tide_search')) { + return; + } + + $index_storage = \Drupal::entityTypeManager()->getStorage('search_api_index'); + $index = $index_storage->load('node'); + + // Index the keywords field. + $summary_field = new Field($index, 'field_content_keywords'); + $summary_field->setType('text'); + $summary_field->setPropertyPath('field_content_keywords'); + $summary_field->setDatasourceId('entity:node'); + $summary_field->setLabel('Content keywords'); + $index->addField($summary_field); + + $index->save(); + } + +} diff --git a/modules/tide_external_site_link/tests/behat/features/access.feature b/modules/tide_external_site_link/tests/behat/features/access.feature new file mode 100644 index 000000000..08d072c11 --- /dev/null +++ b/modules/tide_external_site_link/tests/behat/features/access.feature @@ -0,0 +1,18 @@ +Feature: Access to External site links content type + + Ensure that External site links content access permissions are set correctly + for designated roles. + + @api + Scenario Outline: Users have access to create External site links content + Given I am logged in as a user with the "" role + When I go to "node/add/external_site_link" + Then I should get a "" HTTP response + And save screenshot + Examples: + | role | response | + | authenticated user | 404 | + | administrator | 200 | + | editor | 200 | + | approver | 200 | + | previewer | 404 | diff --git a/modules/tide_external_site_link/tests/behat/features/fields.feature b/modules/tide_external_site_link/tests/behat/features/fields.feature new file mode 100644 index 000000000..1b43f88e1 --- /dev/null +++ b/modules/tide_external_site_link/tests/behat/features/fields.feature @@ -0,0 +1,26 @@ +@tide +Feature: Fields for external site link content type + + Ensure that external site link content has the expected fields. + + @api + Scenario: The content type has the expected fields (and labels where we can use them). + Given I am logged in as a user with the "create external_site_link content" permission + When I visit "node/add/external_site_link" + And save screenshot + + Then I see field "Title" + And I should see an "input#edit-title-0-value.required" element + + And I see field "Summary" + And I should see a "textarea#edit-field-landing-page-summary-0-value.required" element + + And I see field "Website URL" + And I should see an "input#edit-field-node-link-0-uri.required" element + + And the "#edit-field-featured-image" element should contain "Select Images" + And I should see an "input#edit-field-featured-image-entity-browser-entity-browser-open-modal" element + + And I see field "Keywords" + And I should see an "input#edit-field-content-keywords-0-value" element + And I should not see an "input#edit-field-content-keywords-0-value.required" element diff --git a/modules/tide_external_site_link/tide_external_site_link.info.yml b/modules/tide_external_site_link/tide_external_site_link.info.yml new file mode 100644 index 000000000..3151230d6 --- /dev/null +++ b/modules/tide_external_site_link/tide_external_site_link.info.yml @@ -0,0 +1,26 @@ +name: Tide External Site Link +type: module +description: 'Provides external site link content type and related configuration.' +package: Tide +core_version_requirement: ^9 || ^10 +dependencies: + - tide_core:tide_core + - tide_landing_page:tide_landing_page + - tide_media:tide_media + - drupal:menu_ui +config_devel: + install: + - core.entity_form_display.node.external_site_link.default.yml + - core.entity_view_display.node.external_site_link.default.yml + - core.entity_view_display.node.external_site_link.full.yml + - core.entity_view_display.node.external_site_link.teaser.yml + - field.field.node.external_site_link.field_content_keywords.yml + - field.field.node.external_site_link.field_featured_image.yml + - field.field.node.external_site_link.field_landing_page_summary.yml + - field.field.node.external_site_link.field_node_department.yml + - field.field.node.external_site_link.field_node_link.yml + - field.field.node.external_site_link.field_node_primary_site.yml + - field.field.node.external_site_link.field_node_site.yml + - field.field.node.external_site_link.field_tags.yml + - field.field.node.external_site_link.field_topic.yml + - node.type.external_site_link.yml diff --git a/modules/tide_external_site_link/tide_external_site_link.install b/modules/tide_external_site_link/tide_external_site_link.install new file mode 100644 index 000000000..ef154ac2e --- /dev/null +++ b/modules/tide_external_site_link/tide_external_site_link.install @@ -0,0 +1,22 @@ +grantPermission($permission); + } + $role->save(); + } + } + } +} diff --git a/modules/tide_external_site_link/tide_external_site_link.permissions.yml b/modules/tide_external_site_link/tide_external_site_link.permissions.yml new file mode 100644 index 000000000..9cf3e6dff --- /dev/null +++ b/modules/tide_external_site_link/tide_external_site_link.permissions.yml @@ -0,0 +1,33 @@ +'add scheduled transitions node external_site_link': + title: 'Add scheduled transitions for node external_site_link' + description: 'Allows user to add scheduled transitions for external_site_link content type.' +'create external_site_link content': + title: 'Create external_site_link content' + description: 'Allows user to create external_site_link content.' +'clone external_site_link content': + title: 'Clone external_site_link content' + description: 'Allows user to clone external_site_link content.' +'delete any external_site_link content': + title: 'Delete any external_site_link content' + description: 'Allows user to delete any external_site_link content.' +'delete external_site_link revisions': + title: 'Delete external_site_link revisions' + description: 'Allows user to delete external_site_link revisions.' +'delete own external_site_link content': + title: 'Delete own external_site_link content' + description: 'Allows user to delete own external_site_link content.' +'edit any external_site_link content': + title: 'Edit any external_site_link content' + description: 'Allows user to edit any external_site_link content.' +'edit own external_site_link content': + title: 'Edit own external_site_link content' + description: 'Allows user to edit own external_site_link content.' +'revert external_site_link revisions': + title: 'Revert external_site_link revisions' + description: 'Allows user to revert external_site_link revisions.' +'view external_site_link revisions': + title: 'View external_site_link revisions' + description: 'Allows user to view external_site_link revisions.' +'view scheduled transitions node external_site_link': + title: 'View scheduled transitions for node external_site_link' + description: 'Allows user to view all scheduled transitions for external_site_link content type.' From f8d014f3b55e96e81631c76019b13d3b6a9d8bb2 Mon Sep 17 00:00:00 2001 From: David Featherston Date: Fri, 22 May 2026 16:10:35 +1000 Subject: [PATCH 02/12] fix: remove tide_site_restriction from for display conf in tide_external_site_link --- ...e.entity_form_display.node.external_site_link.default.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml b/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml index aca3d4333..46d8f66af 100644 --- a/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml +++ b/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml @@ -21,7 +21,6 @@ dependencies: - link - path - select2 - - tide_site_restriction third_party_settings: field_group: group_tags_and_metadata: @@ -157,14 +156,14 @@ content: placeholder_title: '' third_party_settings: { } field_node_primary_site: - type: tide_site_restriction_field_widget + type: options_buttons weight: 6 region: content settings: { } third_party_settings: { } field_name: field_node_primary_site field_node_site: - type: tide_site_restriction_field_widget + type: options_buttons weight: 5 region: content settings: { } From e82bf4dae5a85eab29401b85a44b989e5e8ea450 Mon Sep 17 00:00:00 2001 From: David Featherston Date: Tue, 26 May 2026 14:41:11 +1000 Subject: [PATCH 03/12] feat: add content category to external site link, update keyword type to string --- ...isplay.node.external_site_link.default.yml | 20 +++++++++-- ...isplay.node.external_site_link.default.yml | 15 ++++++++- ...w_display.node.external_site_link.full.yml | 33 +++++++++++++------ ...display.node.external_site_link.teaser.yml | 8 ++++- ...ernal_site_link.field_content_category.yml | 28 ++++++++++++++++ ...ernal_site_link.field_content_keywords.yml | 1 - ...xternal_site_link.field_featured_image.yml | 1 - ...l_site_link.field_landing_page_summary.yml | 1 - ...ternal_site_link.field_node_department.yml | 1 - ...ode.external_site_link.field_node_link.yml | 1 - ...rnal_site_link.field_node_primary_site.yml | 1 - ...ode.external_site_link.field_node_site.yml | 1 - ...eld.node.external_site_link.field_tags.yml | 1 - ...ld.node.external_site_link.field_topic.yml | 1 - ...ld.storage.node.field_content_keywords.yml | 1 - .../install/node.type.external_site_link.yml | 1 - .../src/TideExternalSiteLinkOperation.php | 2 +- 17 files changed, 90 insertions(+), 27 deletions(-) create mode 100644 modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_content_category.yml diff --git a/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml b/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml index 46d8f66af..c5bdb850c 100644 --- a/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml +++ b/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml @@ -1,9 +1,9 @@ -uuid: 66050392-5dd3-41af-9cab-a77d40176ec7 langcode: en status: true dependencies: config: - entity_browser.browser.tide_image_browser + - field.field.node.external_site_link.field_content_category - field.field.node.external_site_link.field_content_keywords - field.field.node.external_site_link.field_featured_image - field.field.node.external_site_link.field_landing_page_summary @@ -14,6 +14,7 @@ dependencies: - field.field.node.external_site_link.field_tags - field.field.node.external_site_link.field_topic - node.type.external_site_link + - workflows.workflow.editorial module: - content_moderation - entity_browser @@ -21,6 +22,7 @@ dependencies: - link - path - select2 + - term_reference_tree third_party_settings: field_group: group_tags_and_metadata: @@ -58,6 +60,7 @@ third_party_settings: required_fields: true group_page_metadata: children: + - field_content_category - field_node_department - group_sites label: 'Page metadata' @@ -80,7 +83,7 @@ third_party_settings: label: Sites region: content parent_name: group_page_metadata - weight: 16 + weight: 6 format_type: details format_settings: classes: '' @@ -101,6 +104,17 @@ content: region: content settings: { } third_party_settings: { } + field_content_category: + type: term_reference_tree + weight: 4 + region: content + settings: + start_minimized: true + leaves_only: false + select_parents: false + cascading_selection: 0 + max_depth: 0 + third_party_settings: { } field_content_keywords: type: string_textfield weight: 4 @@ -139,7 +153,7 @@ content: maxlength_js_truncate_html: false field_node_department: type: select2_entity_reference - weight: 15 + weight: 5 region: content settings: width: 100% diff --git a/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.default.yml b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.default.yml index c3c6214cb..c8e5c5ae4 100644 --- a/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.default.yml +++ b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.default.yml @@ -1,8 +1,8 @@ -uuid: 4431c03c-a123-4d46-9474-106c9f992150 langcode: en status: true dependencies: config: + - field.field.node.external_site_link.field_content_category - field.field.node.external_site_link.field_content_keywords - field.field.node.external_site_link.field_featured_image - field.field.node.external_site_link.field_landing_page_summary @@ -21,6 +21,19 @@ targetEntityType: node bundle: external_site_link mode: default content: + content_moderation_control: + settings: { } + third_party_settings: { } + weight: -20 + region: content + field_content_category: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 9 + region: content field_content_keywords: type: string label: above diff --git a/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.full.yml b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.full.yml index 6f92bf94f..a156e938f 100644 --- a/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.full.yml +++ b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.full.yml @@ -1,9 +1,9 @@ -uuid: 2826e25d-0fca-4640-a943-d6d519225db7 langcode: en status: true dependencies: config: - core.entity_view_mode.node.full + - field.field.node.external_site_link.field_content_category - field.field.node.external_site_link.field_content_keywords - field.field.node.external_site_link.field_featured_image - field.field.node.external_site_link.field_landing_page_summary @@ -22,13 +22,26 @@ targetEntityType: node bundle: external_site_link mode: full content: + content_moderation_control: + settings: { } + third_party_settings: { } + weight: 0 + region: content + field_content_category: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 7 + region: content field_content_keywords: type: string label: above settings: link_to_entity: false third_party_settings: { } - weight: 3 + weight: 4 region: content field_featured_image: type: entity_reference_label @@ -36,14 +49,14 @@ content: settings: link: true third_party_settings: { } - weight: 2 + weight: 3 region: content field_landing_page_summary: type: basic_string label: above settings: { } third_party_settings: { } - weight: 0 + weight: 1 region: content field_node_department: type: entity_reference_label @@ -51,7 +64,7 @@ content: settings: link: true third_party_settings: { } - weight: 6 + weight: 8 region: content field_node_link: type: link @@ -63,7 +76,7 @@ content: rel: '' target: '' third_party_settings: { } - weight: 1 + weight: 2 region: content field_node_primary_site: type: entity_reference_label @@ -71,7 +84,7 @@ content: settings: link: true third_party_settings: { } - weight: 7 + weight: 9 region: content field_node_site: type: entity_reference_label @@ -79,7 +92,7 @@ content: settings: link: true third_party_settings: { } - weight: 8 + weight: 10 region: content field_tags: type: entity_reference_label @@ -87,7 +100,7 @@ content: settings: link: true third_party_settings: { } - weight: 5 + weight: 6 region: content field_topic: type: entity_reference_label @@ -95,7 +108,7 @@ content: settings: link: true third_party_settings: { } - weight: 4 + weight: 5 region: content hidden: computed_breadcrumb_trail: true diff --git a/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.teaser.yml b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.teaser.yml index b0c4ae729..62a946459 100644 --- a/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.teaser.yml +++ b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.teaser.yml @@ -1,9 +1,9 @@ -uuid: beee30d7-24b3-45a8-a2d0-c12f3e1eb389 langcode: en status: false dependencies: config: - core.entity_view_mode.node.teaser + - field.field.node.external_site_link.field_content_category - field.field.node.external_site_link.field_content_keywords - field.field.node.external_site_link.field_featured_image - field.field.node.external_site_link.field_landing_page_summary @@ -26,12 +26,18 @@ content: third_party_settings: { } weight: -10 region: content + content_moderation_control: + settings: { } + third_party_settings: { } + weight: -20 + region: content links: settings: { } third_party_settings: { } weight: 100 region: content hidden: + field_content_category: true field_content_keywords: true field_featured_image: true field_landing_page_summary: true diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_content_category.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_content_category.yml new file mode 100644 index 000000000..1a218ab66 --- /dev/null +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_content_category.yml @@ -0,0 +1,28 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_content_category + - node.type.external_site_link + - taxonomy.vocabulary.content_category +id: node.external_site_link.field_content_category +field_name: field_content_category +entity_type: node +bundle: external_site_link +label: 'Content category' +description: 'Select the most relevant option from the list of content categories. This field will help with search and filtering on the website.' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + content_category: content_category + sort: + field: name + direction: asc + auto_create: false + auto_create_bundle: '' +field_type: entity_reference diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_content_keywords.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_content_keywords.yml index 4fe24c509..515c93aa6 100644 --- a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_content_keywords.yml +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_content_keywords.yml @@ -1,4 +1,3 @@ -uuid: 0f4e6b56-a773-4a84-bd8f-84ed2c69126f langcode: en status: true dependencies: diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_featured_image.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_featured_image.yml index ffe433807..531b6e94a 100644 --- a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_featured_image.yml +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_featured_image.yml @@ -1,4 +1,3 @@ -uuid: 80b65ca9-93df-4025-b3e7-d26ddef4dfb5 langcode: en status: true dependencies: diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_landing_page_summary.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_landing_page_summary.yml index b78d6e12a..095fe75bb 100644 --- a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_landing_page_summary.yml +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_landing_page_summary.yml @@ -1,4 +1,3 @@ -uuid: 755c88ba-a04b-4f53-b136-ad523689d907 langcode: en status: true dependencies: diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_department.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_department.yml index ce6ce7d80..e33f41098 100644 --- a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_department.yml +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_department.yml @@ -1,4 +1,3 @@ -uuid: 0eea0c87-36b0-4d0a-a557-0d62af6023bc langcode: en status: true dependencies: diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_link.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_link.yml index cf40a571f..3df6a4a2a 100644 --- a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_link.yml +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_link.yml @@ -1,4 +1,3 @@ -uuid: bd92bee5-5424-47df-a04c-22c356bf8a64 langcode: en status: true dependencies: diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_primary_site.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_primary_site.yml index 05792559f..9182435b1 100644 --- a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_primary_site.yml +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_primary_site.yml @@ -1,4 +1,3 @@ -uuid: 7587503b-5a6b-44b6-bd65-07628810368d langcode: en status: true dependencies: diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_site.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_site.yml index ac7cbce77..519749ef8 100644 --- a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_site.yml +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_site.yml @@ -1,4 +1,3 @@ -uuid: 1c1391ee-4fac-4da8-82a8-b123d4102b44 langcode: en status: true dependencies: diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_tags.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_tags.yml index a034fb170..bb6fcfd0e 100644 --- a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_tags.yml +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_tags.yml @@ -1,4 +1,3 @@ -uuid: 3f39f14a-81e7-44d4-9c41-6bd00ddcc230 langcode: en status: true dependencies: diff --git a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_topic.yml b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_topic.yml index 6fb88a063..a4f033a33 100644 --- a/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_topic.yml +++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_topic.yml @@ -1,4 +1,3 @@ -uuid: 9ecb3f49-9860-45df-9f82-158be35b9c5a langcode: en status: true dependencies: diff --git a/modules/tide_external_site_link/config/install/field.storage.node.field_content_keywords.yml b/modules/tide_external_site_link/config/install/field.storage.node.field_content_keywords.yml index 53dc16583..84b890e46 100644 --- a/modules/tide_external_site_link/config/install/field.storage.node.field_content_keywords.yml +++ b/modules/tide_external_site_link/config/install/field.storage.node.field_content_keywords.yml @@ -1,4 +1,3 @@ -uuid: 25919ca0-d255-4534-82e5-470473640c21 langcode: en status: true dependencies: diff --git a/modules/tide_external_site_link/config/install/node.type.external_site_link.yml b/modules/tide_external_site_link/config/install/node.type.external_site_link.yml index f7c7b9606..97def4d70 100644 --- a/modules/tide_external_site_link/config/install/node.type.external_site_link.yml +++ b/modules/tide_external_site_link/config/install/node.type.external_site_link.yml @@ -1,4 +1,3 @@ -uuid: d028c165-1cc1-4116-95b1-8188599bd928 langcode: en status: true dependencies: diff --git a/modules/tide_external_site_link/src/TideExternalSiteLinkOperation.php b/modules/tide_external_site_link/src/TideExternalSiteLinkOperation.php index 38b896cd8..2cdb117fe 100644 --- a/modules/tide_external_site_link/src/TideExternalSiteLinkOperation.php +++ b/modules/tide_external_site_link/src/TideExternalSiteLinkOperation.php @@ -113,7 +113,7 @@ public static function addFieldsToSearchApi() { // Index the keywords field. $summary_field = new Field($index, 'field_content_keywords'); - $summary_field->setType('text'); + $summary_field->setType('string'); $summary_field->setPropertyPath('field_content_keywords'); $summary_field->setDatasourceId('entity:node'); $summary_field->setLabel('Content keywords'); From fdeecc9825b88116fa40c068f18dbdc429c7204e Mon Sep 17 00:00:00 2001 From: David Featherston Date: Tue, 26 May 2026 16:00:25 +1000 Subject: [PATCH 04/12] feat: switch to select2 for content category --- ..._form_display.node.external_site_link.default.yml | 12 +++++------- .../tide_external_site_link.info.yml | 1 + 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml b/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml index c5bdb850c..c374911c8 100644 --- a/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml +++ b/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml @@ -22,7 +22,6 @@ dependencies: - link - path - select2 - - term_reference_tree third_party_settings: field_group: group_tags_and_metadata: @@ -105,15 +104,14 @@ content: settings: { } third_party_settings: { } field_content_category: - type: term_reference_tree + type: select2_entity_reference weight: 4 region: content settings: - start_minimized: true - leaves_only: false - select_parents: false - cascading_selection: 0 - max_depth: 0 + width: 100% + autocomplete: false + match_operator: CONTAINS + match_limit: 10 third_party_settings: { } field_content_keywords: type: string_textfield diff --git a/modules/tide_external_site_link/tide_external_site_link.info.yml b/modules/tide_external_site_link/tide_external_site_link.info.yml index 3151230d6..caf77baba 100644 --- a/modules/tide_external_site_link/tide_external_site_link.info.yml +++ b/modules/tide_external_site_link/tide_external_site_link.info.yml @@ -8,6 +8,7 @@ dependencies: - tide_landing_page:tide_landing_page - tide_media:tide_media - drupal:menu_ui + - select2:select2 config_devel: install: - core.entity_form_display.node.external_site_link.default.yml From 5d17f563b029f9bbcc9433eafa78c9458ab33428 Mon Sep 17 00:00:00 2001 From: David Featherston Date: Fri, 29 May 2026 12:30:12 +1000 Subject: [PATCH 05/12] feat: disable share and preview links for external_site_links --- .../tide_share_link/tide_share_link.module | 8 +++++ .../src/Access/ShareLinkAccessCheck.php | 35 +++++++++++++++++++ .../src/Routing/ShareLinkRouteSubscriber.php | 31 ++++++++++++++++ .../tide_external_site_link.module | 25 +++++++++++-- .../tide_external_site_link.services.yml | 10 ++++++ .../src/Plugin/Block/PreviewLinksBlock.php | 10 +++++- 6 files changed, 116 insertions(+), 3 deletions(-) create mode 100755 modules/tide_external_site_link/src/Access/ShareLinkAccessCheck.php create mode 100644 modules/tide_external_site_link/src/Routing/ShareLinkRouteSubscriber.php create mode 100644 modules/tide_external_site_link/tide_external_site_link.services.yml diff --git a/modules/tide_api/modules/tide_share_link/tide_share_link.module b/modules/tide_api/modules/tide_share_link/tide_share_link.module index 13ca551ca..0436265fb 100644 --- a/modules/tide_api/modules/tide_share_link/tide_share_link.module +++ b/modules/tide_api/modules/tide_share_link/tide_share_link.module @@ -98,6 +98,14 @@ function tide_share_link_form_revision_overview_form_alter(&$form, FormStateInte return; } + // Allow 'removing' the create share link button for revisions. + $access = AccessResult::allowed(); + \Drupal::moduleHandler()->alter('tide_share_link_form_revision_overview_form_access', $access, $node); + + if ($access->isForbidden()) { + return; + } + foreach (Element::children($form['node_revisions_table']) as $delta) { // The current revision. if (empty($form['node_revisions_table'][$delta]['operations']['#type'])) { diff --git a/modules/tide_external_site_link/src/Access/ShareLinkAccessCheck.php b/modules/tide_external_site_link/src/Access/ShareLinkAccessCheck.php new file mode 100755 index 000000000..83461ffc8 --- /dev/null +++ b/modules/tide_external_site_link/src/Access/ShareLinkAccessCheck.php @@ -0,0 +1,35 @@ +bundle() === 'external_site_link') { + return AccessResult::forbidden(); + } + + return AccessResult::allowed(); + } + +} diff --git a/modules/tide_external_site_link/src/Routing/ShareLinkRouteSubscriber.php b/modules/tide_external_site_link/src/Routing/ShareLinkRouteSubscriber.php new file mode 100644 index 000000000..1bde424f9 --- /dev/null +++ b/modules/tide_external_site_link/src/Routing/ShareLinkRouteSubscriber.php @@ -0,0 +1,31 @@ +get($route_name)) { + $route->setRequirement('_share_link_access_check_for_external_site_link', 'TRUE'); + } + } + } + +} diff --git a/modules/tide_external_site_link/tide_external_site_link.module b/modules/tide_external_site_link/tide_external_site_link.module index be316bc06..dd5b7c677 100644 --- a/modules/tide_external_site_link/tide_external_site_link.module +++ b/modules/tide_external_site_link/tide_external_site_link.module @@ -6,13 +6,16 @@ */ use Drupal\user\Entity\Role; +use Drupal\Core\Access\AccessResult; +use Drupal\Core\Access\AccessResultInterface; +use Drupal\node\NodeInterface; /** * Implements hook_entity_bundle_create(). */ -function tide_external_site_link_entity_bundle_create($entity_type_id, $bundle) { +function tide_external_site_link_entity_bundle_create($entity_type_id, $bundle): void { if ($entity_type_id == 'node' && $bundle == 'external_site_link') { - // Grant permissions on Test content type to Approver and Editor. + // Grant permissions to Approver and Editor. $roles = ['approver', 'editor']; $permissions = [ @@ -37,3 +40,21 @@ function tide_external_site_link_entity_bundle_create($entity_type_id, $bundle) } } } + +/** + * Implements hook_tide_site_preview_links_block_access_alter(). + */ +function tide_external_site_link_tide_site_preview_links_block_access_alter(AccessResultInterface &$access, NodeInterface $node): void { + if ($node->bundle() === 'external_site_link') { + $access = AccessResult::forbidden(); + } +} + +/** + * Implements hook_tide_share_link_form_revision_overview_form_access_alter(). + */ +function tide_external_site_link_tide_share_link_form_revision_overview_form_access_alter(AccessResultInterface &$access, NodeInterface $node): void { + if ($node->bundle() === 'external_site_link') { + $access = AccessResult::forbidden(); + } +} diff --git a/modules/tide_external_site_link/tide_external_site_link.services.yml b/modules/tide_external_site_link/tide_external_site_link.services.yml new file mode 100644 index 000000000..e6c689362 --- /dev/null +++ b/modules/tide_external_site_link/tide_external_site_link.services.yml @@ -0,0 +1,10 @@ +services: + tide_external_site_link.route_subscriber: + class: Drupal\tide_external_site_link\Routing\ShareLinkRouteSubscriber + tags: + - { name: event_subscriber } + + tide_external_site_link.share_link_access_check: + class: Drupal\tide_external_site_link\Access\ShareLinkAccessCheck + tags: + - { name: access_check, applies_to: _share_link_access_check_for_external_site_link } diff --git a/modules/tide_site/modules/tide_site_preview/src/Plugin/Block/PreviewLinksBlock.php b/modules/tide_site/modules/tide_site_preview/src/Plugin/Block/PreviewLinksBlock.php index d350d1695..58ecef9d3 100644 --- a/modules/tide_site/modules/tide_site_preview/src/Plugin/Block/PreviewLinksBlock.php +++ b/modules/tide_site/modules/tide_site_preview/src/Plugin/Block/PreviewLinksBlock.php @@ -119,7 +119,15 @@ public function blockSubmit($form, FormStateInterface $form_state) { * {@inheritdoc} */ public function blockAccess(AccountInterface $account) { - return AccessResult::allowedIf($account->hasPermission('view tide_site preview links')); + $access = AccessResult::allowedIf($account->hasPermission('view tide_site preview links')); + + if (!$this->currentNode || !$this->isValidRoute()) { + return $access; + } + + \Drupal::moduleHandler()->alter('tide_site_preview_links_block_access', $access, $this->currentNode); + + return $access; } /** From 18c26a7e997ac8fe2940bded1185d3f525b1943e Mon Sep 17 00:00:00 2001 From: David Featherston Date: Fri, 29 May 2026 14:07:54 +1000 Subject: [PATCH 06/12] feat: remove sections for external site link node form, update status message and node path --- .../pathauto.pattern.external_site_links.yml | 21 ++++++++ .../tide_external_site_link.info.yml | 2 + .../tide_external_site_link.module | 48 +++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 modules/tide_external_site_link/config/optional/pathauto.pattern.external_site_links.yml diff --git a/modules/tide_external_site_link/config/optional/pathauto.pattern.external_site_links.yml b/modules/tide_external_site_link/config/optional/pathauto.pattern.external_site_links.yml new file mode 100644 index 000000000..82a67a210 --- /dev/null +++ b/modules/tide_external_site_link/config/optional/pathauto.pattern.external_site_links.yml @@ -0,0 +1,21 @@ +langcode: en +status: true +dependencies: + module: + - node +id: external_site_links +label: 'External Site Links' +type: 'canonical_entities:node' +pattern: '/external-[node:title]' +selection_criteria: + 8c134b99-1ffd-45e8-9203-853160c079bf: + id: 'entity_bundle:node' + bundles: + external_site_link: external_site_link + negate: false + context_mapping: + node: node + uuid: 8c134b99-1ffd-45e8-9203-853160c079bf +selection_logic: and +weight: -40 +relationships: { } diff --git a/modules/tide_external_site_link/tide_external_site_link.info.yml b/modules/tide_external_site_link/tide_external_site_link.info.yml index caf77baba..fc91d2256 100644 --- a/modules/tide_external_site_link/tide_external_site_link.info.yml +++ b/modules/tide_external_site_link/tide_external_site_link.info.yml @@ -25,3 +25,5 @@ config_devel: - field.field.node.external_site_link.field_tags.yml - field.field.node.external_site_link.field_topic.yml - node.type.external_site_link.yml + optional: + - pathauto.pattern.external_site_links diff --git a/modules/tide_external_site_link/tide_external_site_link.module b/modules/tide_external_site_link/tide_external_site_link.module index dd5b7c677..3f2f2b46b 100644 --- a/modules/tide_external_site_link/tide_external_site_link.module +++ b/modules/tide_external_site_link/tide_external_site_link.module @@ -8,6 +8,7 @@ use Drupal\user\Entity\Role; use Drupal\Core\Access\AccessResult; use Drupal\Core\Access\AccessResultInterface; +use Drupal\Core\Form\FormStateInterface; use Drupal\node\NodeInterface; /** @@ -43,6 +44,8 @@ function tide_external_site_link_entity_bundle_create($entity_type_id, $bundle): /** * Implements hook_tide_site_preview_links_block_access_alter(). + * + * Removes the preview links block from the external site link node type. */ function tide_external_site_link_tide_site_preview_links_block_access_alter(AccessResultInterface &$access, NodeInterface $node): void { if ($node->bundle() === 'external_site_link') { @@ -52,9 +55,54 @@ function tide_external_site_link_tide_site_preview_links_block_access_alter(Acce /** * Implements hook_tide_share_link_form_revision_overview_form_access_alter(). + * + * Removes the share link button from the external site link node type revisions. */ function tide_external_site_link_tide_share_link_form_revision_overview_form_access_alter(AccessResultInterface &$access, NodeInterface $node): void { if ($node->bundle() === 'external_site_link') { $access = AccessResult::forbidden(); } } + +/** + * Implements hook_form_BASE_FORM_ID_alter(). + * + * Remove some fields from the external site link node form that aren't relevant. + */ +function tide_external_site_link_form_node_form_alter(&$form, FormStateInterface $form_state, $form_id): void { + if ($form_id === 'node_external_site_link_form' || $form_id === 'node_external_site_link_edit_form') { + unset($form['promote']); // Promotion to front page + unset($form['sticky']); // Sticky in lists + unset($form['menu']); // Menu settings + unset($form['path']); // URL alias + unset($form['url_redirects']); // URL redirects + unset($form['simple_sitemap']); // Simple XML Sitemap + + $form['actions']['submit']['#submit'][] = 'tide_external_site_link_node_form_submit'; + } +} + +/** + * Override the default status message for the external site link node form. + * + * We don't want to display the node link here, + * this content type isn't displayed on the site, just in site search results. + */ +function tide_external_site_link_node_form_submit(array &$form, FormStateInterface $form_state): void { + $node = $form_state->getFormObject()->getEntity(); + + if ($node instanceof NodeInterface && $node->bundle() === 'external_site_link') { + \Drupal::messenger()->deleteByType('status'); + + $operation = $node->isNew() ? 'created' : 'updated'; + + \Drupal::messenger()->addStatus(t( + '@type %title has been @operation.', + [ + '@type' => $node->type->entity->label(), + '%title' => $node->label(), + '@operation' => $operation, + ] + )); + } +} From 5947a3c0e7cb903ce3f78db3d164b0c69fb36d4d Mon Sep 17 00:00:00 2001 From: David Featherston Date: Fri, 29 May 2026 16:34:56 +1000 Subject: [PATCH 07/12] fix: appease the linter --- .../tide_external_site_link.module | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/modules/tide_external_site_link/tide_external_site_link.module b/modules/tide_external_site_link/tide_external_site_link.module index 3f2f2b46b..7b0701480 100644 --- a/modules/tide_external_site_link/tide_external_site_link.module +++ b/modules/tide_external_site_link/tide_external_site_link.module @@ -5,11 +5,11 @@ * Tide external site link module functionality. */ -use Drupal\user\Entity\Role; use Drupal\Core\Access\AccessResult; use Drupal\Core\Access\AccessResultInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\node\NodeInterface; +use Drupal\user\Entity\Role; /** * Implements hook_entity_bundle_create(). @@ -56,7 +56,7 @@ function tide_external_site_link_tide_site_preview_links_block_access_alter(Acce /** * Implements hook_tide_share_link_form_revision_overview_form_access_alter(). * - * Removes the share link button from the external site link node type revisions. + * Removes the share link button from external site link node type revisions. */ function tide_external_site_link_tide_share_link_form_revision_overview_form_access_alter(AccessResultInterface &$access, NodeInterface $node): void { if ($node->bundle() === 'external_site_link') { @@ -67,16 +67,22 @@ function tide_external_site_link_tide_share_link_form_revision_overview_form_acc /** * Implements hook_form_BASE_FORM_ID_alter(). * - * Remove some fields from the external site link node form that aren't relevant. + * Remove fields from external site link node form that are irrelevant. */ function tide_external_site_link_form_node_form_alter(&$form, FormStateInterface $form_state, $form_id): void { if ($form_id === 'node_external_site_link_form' || $form_id === 'node_external_site_link_edit_form') { - unset($form['promote']); // Promotion to front page - unset($form['sticky']); // Sticky in lists - unset($form['menu']); // Menu settings - unset($form['path']); // URL alias - unset($form['url_redirects']); // URL redirects - unset($form['simple_sitemap']); // Simple XML Sitemap + // Promotion to front page. + unset($form['promote']); + // Sticky in lists. + unset($form['sticky']); + // Menu settings. + unset($form['menu']); + // URL alias. + unset($form['path']); + // URL redirects. + unset($form['url_redirects']); + // Simple XML Sitemap. + unset($form['simple_sitemap']); $form['actions']['submit']['#submit'][] = 'tide_external_site_link_node_form_submit'; } From a651e630575ec28bed9729ad42b4dfcc2d87b572 Mon Sep 17 00:00:00 2001 From: David Featherston Date: Fri, 29 May 2026 17:12:17 +1000 Subject: [PATCH 08/12] feat: remove preview button from external site link node form and add more tests --- .../tests/behat/features/fields.feature | 36 ++++++++++++++++++- .../tide_external_site_link.module | 2 ++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/modules/tide_external_site_link/tests/behat/features/fields.feature b/modules/tide_external_site_link/tests/behat/features/fields.feature index 1b43f88e1..f64ee9a75 100644 --- a/modules/tide_external_site_link/tests/behat/features/fields.feature +++ b/modules/tide_external_site_link/tests/behat/features/fields.feature @@ -5,7 +5,12 @@ Feature: Fields for external site link content type @api Scenario: The content type has the expected fields (and labels where we can use them). - Given I am logged in as a user with the "create external_site_link content" permission + Given I am logged in as a user with the "administrator" role + + Given department terms: + | name | tid | + | [TEST] Department | 9087601 | + When I visit "node/add/external_site_link" And save screenshot @@ -24,3 +29,32 @@ Feature: Fields for external site link content type And I see field "Keywords" And I should see an "input#edit-field-content-keywords-0-value" element And I should not see an "input#edit-field-content-keywords-0-value.required" element + + # Hidden elements + Then I should not see the text "Menu settings" in the "content" + And I should not see the text "Promotion options" in the "content" + And I should not see the text "URL redirects" in the "content" + And I should not see the text "URL alias" in the "content" + And I should not see the text "Simple XML Sitemap" in the "content" + + And I should not see the text "Preview" in the "content" + + # Fill and submit + Then I fill in "Title" with "My External Site" + Then I fill in "Summary" with "My External Site Summary" + Then I fill in "Website" with "https://my-external-site.vic.gov.au/" + And I select "Arts" from "Topic" + And I select "[TEST] Department" from "Department" + And I select "Published" from "Save as" + Then I press the "Save" button + + # Status message and lnk + Then I should see the text "External site link My External Site has been updated." + And I should not see the text "Share links" + And I should not see the text "Create a share preview link" + And I should not see the text "Click the links below to preview" + + # Revision previews + When I click "Revisions" + Then I should see the text "Current revision" + And I should not see the text "Create a share preview link" diff --git a/modules/tide_external_site_link/tide_external_site_link.module b/modules/tide_external_site_link/tide_external_site_link.module index 7b0701480..7368b4143 100644 --- a/modules/tide_external_site_link/tide_external_site_link.module +++ b/modules/tide_external_site_link/tide_external_site_link.module @@ -83,6 +83,8 @@ function tide_external_site_link_form_node_form_alter(&$form, FormStateInterface unset($form['url_redirects']); // Simple XML Sitemap. unset($form['simple_sitemap']); + // Preview button. + unset($form['actions']['preview']); $form['actions']['submit']['#submit'][] = 'tide_external_site_link_node_form_submit'; } From 135cb86ab64658c6a1012e24c0669cef20b9840c Mon Sep 17 00:00:00 2001 From: David Featherston Date: Mon, 1 Jun 2026 08:59:03 +1000 Subject: [PATCH 09/12] feat: add extra test to check external site link path --- .circleci/test.sh | 4 ++-- .../tests/behat/features/fields.feature | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/.circleci/test.sh b/.circleci/test.sh index b9673d5c7..b38bc6e81 100755 --- a/.circleci/test.sh +++ b/.circleci/test.sh @@ -24,11 +24,11 @@ ahoy cli "drush en tide_landing_page -y" ahoy cli "./vendor/bin/behat --strict --colors --tags="~@skipped" modules/tide_landing_page" ahoy cli "drush en tide_site -y" ahoy cli "./vendor/bin/behat --strict --colors modules/tide_site" -ahoy cli "drush en tide_external_site_link -y" -ahoy cli "./vendor/bin/behat --strict --colors modules/tide_external_site_link" ahoy cli "drush en tide_ui_restriction -y" ahoy cli "./vendor/bin/behat --strict --colors modules/tide_ui_restriction" ahoy cli "drush en tide_api -y" ahoy cli "drush en tide_content_collection_ui -y" ahoy cli "drush en tide_share_link -y" ahoy cli "./vendor/bin/behat --strict --colors --tags="~@skipped" modules/tide_api" +ahoy cli "drush en tide_external_site_link -y" +ahoy cli "./vendor/bin/behat --strict --colors --tags="~@skipped" modules/tide_external_site_link" diff --git a/modules/tide_external_site_link/tests/behat/features/fields.feature b/modules/tide_external_site_link/tests/behat/features/fields.feature index f64ee9a75..aa242d6ff 100644 --- a/modules/tide_external_site_link/tests/behat/features/fields.feature +++ b/modules/tide_external_site_link/tests/behat/features/fields.feature @@ -7,9 +7,12 @@ Feature: Fields for external site link content type Scenario: The content type has the expected fields (and labels where we can use them). Given I am logged in as a user with the "administrator" role + Given sites terms: + | name | tid | + | [TEST] Site ESL | 20091 | Given department terms: - | name | tid | - | [TEST] Department | 9087601 | + | name | tid | + | [TEST] Department ESL | 200091 | When I visit "node/add/external_site_link" And save screenshot @@ -41,15 +44,17 @@ Feature: Fields for external site link content type # Fill and submit Then I fill in "Title" with "My External Site" - Then I fill in "Summary" with "My External Site Summary" - Then I fill in "Website" with "https://my-external-site.vic.gov.au/" + And I fill in "Summary" with "My External Site Summary" + And I fill in "Website" with "https://my-external-site.vic.gov.au/" And I select "Arts" from "Topic" - And I select "[TEST] Department" from "Department" - And I select "Published" from "Save as" + And I select "[TEST] Department ESL" from "Department" + And I check "[TEST] Site ESL" + And I select the radio button "[TEST] Site ESL" Then I press the "Save" button # Status message and lnk - Then I should see the text "External site link My External Site has been updated." + Then I should be on "/site-20091/external-my-external-site" + And I should see the text "External site link My External Site has been updated." And I should not see the text "Share links" And I should not see the text "Create a share preview link" And I should not see the text "Click the links below to preview" From 8686e8fe8301c7e6dcea4b3ac7ef89b88964f598 Mon Sep 17 00:00:00 2001 From: David Featherston Date: Tue, 9 Jun 2026 16:34:06 +1000 Subject: [PATCH 10/12] chore: fix content type reference --- .../tide_external_site_link.module | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/tide_external_site_link/tide_external_site_link.module b/modules/tide_external_site_link/tide_external_site_link.module index 7368b4143..3ea3de8a6 100644 --- a/modules/tide_external_site_link/tide_external_site_link.module +++ b/modules/tide_external_site_link/tide_external_site_link.module @@ -20,14 +20,14 @@ function tide_external_site_link_entity_bundle_create($entity_type_id, $bundle): $roles = ['approver', 'editor']; $permissions = [ - 'create profile content', - 'delete any profile content', - 'delete own profile content', - 'delete profile revisions', - 'edit any profile content', - 'edit own profile content', - 'revert profile revisions', - 'view profile revisions', + 'create external_site_link content', + 'delete any external_site_link content', + 'delete own external_site_link content', + 'delete external_site_link revisions', + 'edit any external_site_link content', + 'edit own external_site_link content', + 'revert external_site_link revisions', + 'view external_site_link revisions', ]; foreach ($roles as $role_name) { From 7bd043e4039c174a4e7d294e4d7e8ebb234dd7a9 Mon Sep 17 00:00:00 2001 From: David Featherston Date: Fri, 12 Jun 2026 10:34:04 +1000 Subject: [PATCH 11/12] chore: remove tide_external_site_link.permissions.yml file --- .../tide_external_site_link.permissions.yml | 33 ------------------- 1 file changed, 33 deletions(-) delete mode 100644 modules/tide_external_site_link/tide_external_site_link.permissions.yml diff --git a/modules/tide_external_site_link/tide_external_site_link.permissions.yml b/modules/tide_external_site_link/tide_external_site_link.permissions.yml deleted file mode 100644 index 9cf3e6dff..000000000 --- a/modules/tide_external_site_link/tide_external_site_link.permissions.yml +++ /dev/null @@ -1,33 +0,0 @@ -'add scheduled transitions node external_site_link': - title: 'Add scheduled transitions for node external_site_link' - description: 'Allows user to add scheduled transitions for external_site_link content type.' -'create external_site_link content': - title: 'Create external_site_link content' - description: 'Allows user to create external_site_link content.' -'clone external_site_link content': - title: 'Clone external_site_link content' - description: 'Allows user to clone external_site_link content.' -'delete any external_site_link content': - title: 'Delete any external_site_link content' - description: 'Allows user to delete any external_site_link content.' -'delete external_site_link revisions': - title: 'Delete external_site_link revisions' - description: 'Allows user to delete external_site_link revisions.' -'delete own external_site_link content': - title: 'Delete own external_site_link content' - description: 'Allows user to delete own external_site_link content.' -'edit any external_site_link content': - title: 'Edit any external_site_link content' - description: 'Allows user to edit any external_site_link content.' -'edit own external_site_link content': - title: 'Edit own external_site_link content' - description: 'Allows user to edit own external_site_link content.' -'revert external_site_link revisions': - title: 'Revert external_site_link revisions' - description: 'Allows user to revert external_site_link revisions.' -'view external_site_link revisions': - title: 'View external_site_link revisions' - description: 'Allows user to view external_site_link revisions.' -'view scheduled transitions node external_site_link': - title: 'View scheduled transitions for node external_site_link' - description: 'Allows user to view all scheduled transitions for external_site_link content type.' From 4307b8f56e82f84faa3f1a8fcb4dc50c53260ba0 Mon Sep 17 00:00:00 2001 From: David Featherston Date: Thu, 18 Jun 2026 14:15:00 +1000 Subject: [PATCH 12/12] feat: add site restriction support to external site link --- .../src/TideExternalSiteLinkOperation.php | 26 ++++++++++++++----- .../tide_external_site_link.install | 1 + 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/modules/tide_external_site_link/src/TideExternalSiteLinkOperation.php b/modules/tide_external_site_link/src/TideExternalSiteLinkOperation.php index 2cdb117fe..17295da54 100644 --- a/modules/tide_external_site_link/src/TideExternalSiteLinkOperation.php +++ b/modules/tide_external_site_link/src/TideExternalSiteLinkOperation.php @@ -112,14 +112,28 @@ public static function addFieldsToSearchApi() { $index = $index_storage->load('node'); // Index the keywords field. - $summary_field = new Field($index, 'field_content_keywords'); - $summary_field->setType('string'); - $summary_field->setPropertyPath('field_content_keywords'); - $summary_field->setDatasourceId('entity:node'); - $summary_field->setLabel('Content keywords'); - $index->addField($summary_field); + $keywords_field = new Field($index, 'field_content_keywords'); + $keywords_field->setType('text'); + $keywords_field->setPropertyPath('field_content_keywords'); + $keywords_field->setDatasourceId('entity:node'); + $keywords_field->setLabel('Content keywords'); + $index->addField($keywords_field); $index->save(); } + /** + * Add site restriction support to site and primary site fields. + */ + public static function addSiteRestrictionSupport() { + if (!(\Drupal::moduleHandler()->moduleExists('tide_site_restriction'))) { + return; + } + + $config = \Drupal::configFactory()->getEditable('core.entity_form_display.node.external_site_link.default'); + $config->set('content.field_node_primary_site.type', 'tide_site_restriction_field_widget'); + $config->set('content.field_node_site.type', 'tide_site_restriction_field_widget'); + $config->save(); + } + } diff --git a/modules/tide_external_site_link/tide_external_site_link.install b/modules/tide_external_site_link/tide_external_site_link.install index ef154ac2e..63b3d3fdf 100644 --- a/modules/tide_external_site_link/tide_external_site_link.install +++ b/modules/tide_external_site_link/tide_external_site_link.install @@ -19,4 +19,5 @@ function tide_external_site_link_install() { TideExternalSiteLinkOperation::addToWorkflows(); TideExternalSiteLinkOperation::assignNecessaryPermissions(); TideExternalSiteLinkOperation::addFieldsToSearchApi(); + TideExternalSiteLinkOperation::addSiteRestrictionSupport(); }