diff --git a/.circleci/test.sh b/.circleci/test.sh
index 6a65db138..b38bc6e81 100755
--- a/.circleci/test.sh
+++ b/.circleci/test.sh
@@ -30,3 +30,5 @@ 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/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_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/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
+
+[](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..c374911c8
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/core.entity_form_display.node.external_site_link.default.yml
@@ -0,0 +1,265 @@
+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
+ - 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
+ - workflows.workflow.editorial
+ module:
+ - content_moderation
+ - entity_browser
+ - field_group
+ - link
+ - path
+ - select2
+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_content_category
+ - 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: 6
+ 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_category:
+ type: select2_entity_reference
+ weight: 4
+ region: content
+ settings:
+ width: 100%
+ autocomplete: false
+ match_operator: CONTAINS
+ match_limit: 10
+ 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: 5
+ 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: options_buttons
+ weight: 6
+ region: content
+ settings: { }
+ third_party_settings: { }
+ field_name: field_node_primary_site
+ field_node_site:
+ type: options_buttons
+ 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..c8e5c5ae4
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.default.yml
@@ -0,0 +1,115 @@
+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
+ - 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:
+ 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
+ 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..a156e938f
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.full.yml
@@ -0,0 +1,116 @@
+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
+ - 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:
+ 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: 4
+ region: content
+ field_featured_image:
+ type: entity_reference_label
+ label: above
+ settings:
+ link: true
+ third_party_settings: { }
+ weight: 3
+ region: content
+ field_landing_page_summary:
+ type: basic_string
+ label: above
+ settings: { }
+ third_party_settings: { }
+ weight: 1
+ region: content
+ field_node_department:
+ type: entity_reference_label
+ label: above
+ settings:
+ link: true
+ third_party_settings: { }
+ weight: 8
+ 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: 2
+ region: content
+ field_node_primary_site:
+ type: entity_reference_label
+ label: above
+ settings:
+ link: true
+ third_party_settings: { }
+ weight: 9
+ region: content
+ field_node_site:
+ type: entity_reference_label
+ label: above
+ settings:
+ link: true
+ third_party_settings: { }
+ weight: 10
+ region: content
+ field_tags:
+ type: entity_reference_label
+ label: above
+ settings:
+ link: true
+ third_party_settings: { }
+ weight: 6
+ region: content
+ field_topic:
+ type: entity_reference_label
+ label: above
+ settings:
+ link: true
+ third_party_settings: { }
+ weight: 5
+ 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..62a946459
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/core.entity_view_display.node.external_site_link.teaser.yml
@@ -0,0 +1,50 @@
+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
+ - 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
+ 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
+ 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_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
new file mode 100644
index 000000000..515c93aa6
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_content_keywords.yml
@@ -0,0 +1,18 @@
+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..531b6e94a
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_featured_image.yml
@@ -0,0 +1,28 @@
+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..095fe75bb
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_landing_page_summary.yml
@@ -0,0 +1,18 @@
+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..e33f41098
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_department.yml
@@ -0,0 +1,28 @@
+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..3df6a4a2a
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_link.yml
@@ -0,0 +1,35 @@
+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..9182435b1
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_primary_site.yml
@@ -0,0 +1,23 @@
+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..519749ef8
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_node_site.yml
@@ -0,0 +1,23 @@
+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..bb6fcfd0e
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_tags.yml
@@ -0,0 +1,28 @@
+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..a4f033a33
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/field.field.node.external_site_link.field_topic.yml
@@ -0,0 +1,28 @@
+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..84b890e46
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/field.storage.node.field_content_keywords.yml
@@ -0,0 +1,20 @@
+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..97def4d70
--- /dev/null
+++ b/modules/tide_external_site_link/config/install/node.type.external_site_link.yml
@@ -0,0 +1,17 @@
+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/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/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/src/TideExternalSiteLinkOperation.php b/modules/tide_external_site_link/src/TideExternalSiteLinkOperation.php
new file mode 100644
index 000000000..17295da54
--- /dev/null
+++ b/modules/tide_external_site_link/src/TideExternalSiteLinkOperation.php
@@ -0,0 +1,139 @@
+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.
+ $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/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..aa242d6ff
--- /dev/null
+++ b/modules/tide_external_site_link/tests/behat/features/fields.feature
@@ -0,0 +1,65 @@
+@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 "administrator" role
+
+ Given sites terms:
+ | name | tid |
+ | [TEST] Site ESL | 20091 |
+ Given department terms:
+ | name | tid |
+ | [TEST] Department ESL | 200091 |
+
+ 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
+
+ # 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"
+ 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 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 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"
+
+ # 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.info.yml b/modules/tide_external_site_link/tide_external_site_link.info.yml
new file mode 100644
index 000000000..fc91d2256
--- /dev/null
+++ b/modules/tide_external_site_link/tide_external_site_link.info.yml
@@ -0,0 +1,29 @@
+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
+ - select2:select2
+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
+ optional:
+ - pathauto.pattern.external_site_links
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..63b3d3fdf
--- /dev/null
+++ b/modules/tide_external_site_link/tide_external_site_link.install
@@ -0,0 +1,23 @@
+grantPermission($permission);
+ }
+ $role->save();
+ }
+ }
+ }
+}
+
+/**
+ * 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') {
+ $access = AccessResult::forbidden();
+ }
+}
+
+/**
+ * Implements hook_tide_share_link_form_revision_overview_form_access_alter().
+ *
+ * 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') {
+ $access = AccessResult::forbidden();
+ }
+}
+
+/**
+ * Implements hook_form_BASE_FORM_ID_alter().
+ *
+ * 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') {
+ // 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']);
+ // Preview button.
+ unset($form['actions']['preview']);
+
+ $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,
+ ]
+ ));
+ }
+}
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;
}
/**