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 + +[![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..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; } /**