From 3c51ed3b9d199ddef268c22d5167b4901e80ad93 Mon Sep 17 00:00:00 2001 From: Adnan Date: Wed, 17 May 2023 18:14:51 +0100 Subject: [PATCH 01/15] Feat: Group integration. Provides: - A Group plugin for Alert banners. - A View for listing Alert banners belonging to groups. - User permissions to go along with the localgov_microsites_group module. --- modules/group_alert_banner/README.md | 15 + ..._type.microsite-41d536b28977e933e431cc.yml | 16 + .../views.view.group_alert_banners.yml | 927 ++++++++++++++++++ .../group_alert_banner.group.permissions.yml | 3 + .../group_alert_banner.info.yml | 8 + .../group_alert_banner.links.action.yml | 11 + .../group_alert_banner.module | 69 ++ .../group_alert_banner.services.yml | 5 + .../Group/Relation/GroupAlertBanner.php | 58 ++ .../Relation/GroupAlertBannerDeriver.php | 36 + .../src/Routing/RouteSubscriber.php | 32 + 11 files changed, 1180 insertions(+) create mode 100644 modules/group_alert_banner/README.md create mode 100644 modules/group_alert_banner/config/optional/group.relationship_type.microsite-41d536b28977e933e431cc.yml create mode 100644 modules/group_alert_banner/config/optional/views.view.group_alert_banners.yml create mode 100644 modules/group_alert_banner/group_alert_banner.group.permissions.yml create mode 100644 modules/group_alert_banner/group_alert_banner.info.yml create mode 100644 modules/group_alert_banner/group_alert_banner.links.action.yml create mode 100644 modules/group_alert_banner/group_alert_banner.module create mode 100644 modules/group_alert_banner/group_alert_banner.services.yml create mode 100644 modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBanner.php create mode 100644 modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBannerDeriver.php create mode 100644 modules/group_alert_banner/src/Routing/RouteSubscriber.php diff --git a/modules/group_alert_banner/README.md b/modules/group_alert_banner/README.md new file mode 100644 index 00000000..34bdd3c9 --- /dev/null +++ b/modules/group_alert_banner/README.md @@ -0,0 +1,15 @@ +# Group Alert banner +LocalGov Alert banner integration with the [Group module](https://www.drupal.org/project/group). + +## Configuration +If you are using this module alongside the [localgov_microsites_group](https://github.com/localgovdrupal/localgov_microsites_group) module, then user permissions will be automatically setup during module installation. + +Otherwise enable at least the following permissions for **Groups**: +- "Entity: View any alert banner entities" for both anonymous and authenticated users. +- "Access Alert banner listing page" for group admins. + +## Banner listing +Once this module is installed, an *Alert banner* tab should appear in each Group page. This page will list all the banners belonging to a Group. + +## Todo +- Automated tests. diff --git a/modules/group_alert_banner/config/optional/group.relationship_type.microsite-41d536b28977e933e431cc.yml b/modules/group_alert_banner/config/optional/group.relationship_type.microsite-41d536b28977e933e431cc.yml new file mode 100644 index 00000000..ec89967e --- /dev/null +++ b/modules/group_alert_banner/config/optional/group.relationship_type.microsite-41d536b28977e933e431cc.yml @@ -0,0 +1,16 @@ +langcode: en +status: true +dependencies: + config: + - group.type.microsite + - localgov_alert_banner.localgov_alert_banner_type.localgov_alert_banner + module: + - group_alert_banner + - localgov_alert_banner +id: microsite-41d536b28977e933e431cc +group_type: microsite +content_plugin: 'group_localgov_alert_banner:localgov_alert_banner' +plugin_config: + group_cardinality: 0 + entity_cardinality: 1 + use_creation_wizard: false diff --git a/modules/group_alert_banner/config/optional/views.view.group_alert_banners.yml b/modules/group_alert_banner/config/optional/views.view.group_alert_banners.yml new file mode 100644 index 00000000..5c8d856f --- /dev/null +++ b/modules/group_alert_banner/config/optional/views.view.group_alert_banners.yml @@ -0,0 +1,927 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.localgov_alert_banner.type_of_alert + - group.type.microsite + module: + - group + - localgov_alert_banner + - options + enforced: + module: + - localgov_alert_banner +id: group_alert_banners +label: 'Group Alert banners' +module: views +description: '' +tag: '' +base_table: localgov_alert_banner_field_data +base_field: id +display: + default: + id: default + display_title: Master + display_plugin: default + position: 0 + display_options: + title: 'Manage Alert Banners' + fields: + title: + id: title + table: localgov_alert_banner_field_data + field: title + relationship: none + group_type: group + admin_label: '' + entity_type: null + entity_field: title + plugin_id: field + label: Title + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: string + settings: { } + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + type_of_alert: + id: type_of_alert + table: localgov_alert_banner__type_of_alert + field: type_of_alert + relationship: none + group_type: group + admin_label: '' + plugin_id: field + label: Type + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: N/A + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: list_default + settings: { } + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + type: + id: type + table: localgov_alert_banner_field_data + field: type + relationship: none + group_type: group + admin_label: '' + entity_type: localgov_alert_banner + entity_field: type + plugin_id: field + label: 'Banner type' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: entity_reference_label + settings: + link: false + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + uid: + id: uid + table: localgov_alert_banner_field_data + field: uid + relationship: none + group_type: group + admin_label: '' + entity_type: localgov_alert_banner + entity_field: uid + plugin_id: field + label: Author + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: entity_reference_label + settings: + link: false + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + changed: + id: changed + table: localgov_alert_banner_field_data + field: changed + relationship: none + group_type: group + admin_label: '' + entity_type: localgov_alert_banner + entity_field: changed + plugin_id: field + label: Updated + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: timestamp + settings: + date_format: short + custom_date_format: '' + timezone: '' + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + status: + id: status + table: localgov_alert_banner_field_data + field: status + relationship: none + group_type: group + admin_label: '' + entity_type: localgov_alert_banner + entity_field: status + plugin_id: field + label: Status + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: boolean + settings: + format: custom + format_custom_false: 'Off' + format_custom_true: Live + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + status_confirm_page: + id: status_confirm_page + table: localgov_alert_banner + field: status_confirm_page + relationship: none + group_type: group + admin_label: '' + entity_type: localgov_alert_banner + plugin_id: localgov_alert_banner_status_page + label: '' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: false + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + publish_text: 'Set banner live' + unpublish_text: 'Remove banner' + operations: + id: operations + table: localgov_alert_banner + field: operations + relationship: none + group_type: group + admin_label: '' + entity_type: localgov_alert_banner + plugin_id: entity_operations + label: Operations + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + destination: true + pager: + type: mini + options: + offset: 0 + items_per_page: 10 + total_pages: null + id: 0 + tags: + next: ›› + previous: ‹‹ + expose: + items_per_page: false + items_per_page_label: 'Items per page' + items_per_page_options: '5, 10, 25, 50' + items_per_page_options_all: false + items_per_page_options_all_label: '- All -' + offset: false + offset_label: Offset + exposed_form: + type: basic + options: + submit_button: Apply + reset_button: false + reset_button_label: Reset + exposed_sorts_label: 'Sort by' + expose_sort_order: true + sort_asc_label: Asc + sort_desc_label: Desc + access: + type: group_permission + options: + group_permission: 'access localgov_alert_banner overview' + cache: + type: tag + options: { } + empty: { } + sorts: + changed: + id: changed + table: localgov_alert_banner_field_data + field: changed + relationship: none + group_type: group + admin_label: '' + entity_type: localgov_alert_banner + entity_field: changed + plugin_id: date + order: DESC + expose: + label: '' + field_identifier: changed + exposed: false + granularity: second + created: + id: created + table: localgov_alert_banner_field_data + field: created + relationship: none + group_type: group + admin_label: '' + entity_type: localgov_alert_banner + entity_field: created + plugin_id: date + order: DESC + expose: + label: '' + field_identifier: created + exposed: false + granularity: second + id: + id: id + table: localgov_alert_banner_field_data + field: id + relationship: none + group_type: group + admin_label: '' + entity_type: localgov_alert_banner + entity_field: id + plugin_id: standard + order: DESC + expose: + label: '' + field_identifier: id + exposed: false + arguments: + gid: + id: gid + table: group_relationship_field_data + field: gid + relationship: group_relationship + group_type: group + admin_label: '' + entity_type: group_relationship + entity_field: gid + plugin_id: group_id + default_action: 'access denied' + exception: + value: all + title_enable: false + title: All + title_enable: true + title: '{{ arguments.gid|placeholder }} Alert banners' + default_argument_type: fixed + default_argument_options: + argument: '' + default_argument_skip_url: false + summary_options: + base_path: '' + count: true + override: false + items_per_page: 25 + summary: + sort_order: asc + number_of_records: 0 + format: default_summary + specify_validation: true + validate: + type: 'entity:group' + fail: 'not found' + validate_options: + bundles: + microsite: microsite + access: false + operation: view + multiple: 0 + break_phrase: false + not: false + filters: + title: + id: title + table: localgov_alert_banner_field_data + field: title + relationship: none + group_type: group + admin_label: '' + entity_type: localgov_alert_banner + entity_field: title + plugin_id: string + operator: allwords + value: '' + group: 1 + exposed: true + expose: + operator_id: title_op + label: Title + description: '' + use_operator: false + operator: title_op + operator_limit_selection: false + operator_list: { } + identifier: title + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + emergency_publisher: '0' + anonymous: '0' + placeholder: '' + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + type_of_alert_value: + id: type_of_alert_value + table: localgov_alert_banner__type_of_alert + field: type_of_alert_value + relationship: none + group_type: group + admin_label: '' + plugin_id: list_field + operator: or + value: { } + group: 1 + exposed: true + expose: + operator_id: type_of_alert_value_op + label: 'Alert type' + description: '' + use_operator: false + operator: type_of_alert_value_op + operator_limit_selection: false + operator_list: { } + identifier: type_of_alert_value + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + emergency_publisher: '0' + anonymous: '0' + reduce: false + is_grouped: false + group_info: + label: 'Alert type' + description: '' + identifier: type_of_alert_value + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: + 1: + title: '' + operator: or + value: { } + reduce_duplicates: false + type: + id: type + table: localgov_alert_banner_field_data + field: type + relationship: none + group_type: group + admin_label: '' + entity_type: localgov_alert_banner + entity_field: type + plugin_id: bundle + operator: in + value: { } + group: 1 + exposed: true + expose: + operator_id: type_op + label: 'Banner type' + description: '' + use_operator: false + operator: type_op + operator_limit_selection: false + operator_list: { } + identifier: type + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + emergency_publisher: '0' + anonymous: '0' + localgov_editor: '0' + localgov_author: '0' + admin: '0' + user_manager: '0' + web_manager: '0' + reduce: false + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + style: + type: table + options: + grouping: { } + row_class: '' + default_row_class: true + columns: + title: title + type_of_alert: type_of_alert + type: type + uid: uid + changed: changed + status: status + status_confirm_page: status_confirm_page + operations: operations + default: changed + info: + title: + sortable: true + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + type_of_alert: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: priority-low + type: + sortable: true + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: priority-low + uid: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: priority-low + changed: + sortable: true + default_sort_order: desc + align: '' + separator: '' + empty_column: false + responsive: '' + status: + sortable: true + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + status_confirm_page: + align: '' + separator: '' + empty_column: false + responsive: priority-medium + operations: + align: '' + separator: '' + empty_column: false + responsive: '' + override: true + sticky: false + summary: '' + empty_table: false + caption: '' + description: '' + row: + type: fields + query: + type: views_query + options: + query_comment: '' + disable_sql_rewrite: false + distinct: false + replica: false + query_tags: { } + relationships: + group_relationship: + id: group_relationship + table: localgov_alert_banner_field_data + field: group_relationship + relationship: none + group_type: group + admin_label: 'Group relationship' + entity_type: localgov_alert_banner + plugin_id: group_relationship_to_entity_reverse + required: true + group_relation_plugins: + 'group_localgov_alert_banner:localgov_alert_banner': '0' + header: { } + footer: { } + display_extenders: { } + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - route.group + - url + - url.query_args + - user.group_permissions + tags: + - 'config:field.storage.localgov_alert_banner.type_of_alert' + admin_list_page: + id: admin_list_page + display_title: Page + display_plugin: page + position: 1 + display_options: + display_extenders: { } + path: group/%group/alert-banners + menu: + type: tab + title: 'Alert banners' + description: '' + weight: 83 + expanded: false + menu_name: main + parent: '' + context: '0' + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - route.group + - url + - url.query_args + - user.group_permissions + tags: + - 'config:field.storage.localgov_alert_banner.type_of_alert' diff --git a/modules/group_alert_banner/group_alert_banner.group.permissions.yml b/modules/group_alert_banner/group_alert_banner.group.permissions.yml new file mode 100644 index 00000000..4e604517 --- /dev/null +++ b/modules/group_alert_banner/group_alert_banner.group.permissions.yml @@ -0,0 +1,3 @@ +access localgov_alert_banner overview: + title: 'Access Alert banner listing page' + description: 'Access the Alert banner listing and management page, regardless of banner type.' diff --git a/modules/group_alert_banner/group_alert_banner.info.yml b/modules/group_alert_banner/group_alert_banner.info.yml new file mode 100644 index 00000000..72044d3d --- /dev/null +++ b/modules/group_alert_banner/group_alert_banner.info.yml @@ -0,0 +1,8 @@ +name: 'Group Alert banner' +type: module +description: 'Enables Group functionality for Alert banners.' +package: 'LocalGov Drupal' +core_version_requirement: ^8.8 || ^9 || ^10 +dependencies: + - group:group + - localgov_alert_banner:localgov_alert_banner diff --git a/modules/group_alert_banner/group_alert_banner.links.action.yml b/modules/group_alert_banner/group_alert_banner.links.action.yml new file mode 100644 index 00000000..f710cc55 --- /dev/null +++ b/modules/group_alert_banner/group_alert_banner.links.action.yml @@ -0,0 +1,11 @@ +group_relationship.group_alert_banner_add_banner: + route_name: 'entity.group_relationship.group_alert_banner_add_banner' + title: 'Add existing Alert banner' + appears_on: + - 'view.group_alert_banners.admin_list_page' + +group_relationship.group_alert_banner_create_banner: + route_name: 'entity.group_relationship.group_alert_banner_create_banner' + title: 'Add new Alert banner' + appears_on: + - 'view.group_alert_banners.admin_list_page' diff --git a/modules/group_alert_banner/group_alert_banner.module b/modules/group_alert_banner/group_alert_banner.module new file mode 100644 index 00000000..50ec5e12 --- /dev/null +++ b/modules/group_alert_banner/group_alert_banner.module @@ -0,0 +1,69 @@ + [ + Drupal\localgov_microsites_group\RolesHelper::MICROSITES_CONTROLLER_ROLE => [ + 'access localgov alert banner listing page', + 'use localgov_alert_banners transition create_new_draft', + 'use localgov_alert_banners transition publish', + 'use localgov_alert_banners transition unpublish', + 'view all localgov alert banner entities', + 'view all localgov alert banner entity pages', + ], + Drupal\localgov_microsites_group\RolesHelper::MICROSITES_EDITOR_ROLE => [ + 'access localgov alert banner listing page', + 'use localgov_alert_banners transition create_new_draft', + 'use localgov_alert_banners transition publish', + 'use localgov_alert_banners transition unpublish', + 'view all localgov alert banner entities', + 'view all localgov alert banner entity pages', + ], + ], + 'group' => [ + Drupal\localgov_microsites_group\RolesHelper::GROUP_ADMIN_ROLE => [ + 'access localgov_alert_banner overview', + 'create group_localgov_alert_banner:localgov_alert_banner entity', + 'create group_localgov_alert_banner:localgov_alert_banner relationship', + 'delete any group_localgov_alert_banner:localgov_alert_banner entity', + 'delete own group_localgov_alert_banner:localgov_alert_banner entity', + 'delete any group_localgov_alert_banner:localgov_alert_banner relationship', + 'delete own group_localgov_alert_banner:localgov_alert_banner relationship', + 'update any group_localgov_alert_banner:localgov_alert_banner entity', + 'update own group_localgov_alert_banner:localgov_alert_banner entity', + 'update any group_localgov_alert_banner:localgov_alert_banner relationship', + 'update own group_localgov_alert_banner:localgov_alert_banner relationship', + 'view group_localgov_alert_banner:localgov_alert_banner entity', + 'view group_localgov_alert_banner:localgov_alert_banner relationship', + 'view any unpublished group_localgov_alert_banner:localgov_alert_banner entity', + ], + Drupal\localgov_microsites_group\RolesHelper::GROUP_MEMBER_ROLE => [ + 'access localgov_alert_banner overview', + 'view group_localgov_alert_banner:localgov_alert_banner entity', + ], + Drupal\localgov_microsites_group\RolesHelper::GROUP_OUTSIDER_ROLE => [ + 'view group_localgov_alert_banner:localgov_alert_banner entity', + ], + Drupal\localgov_microsites_group\RolesHelper::GROUP_ANONYMOUS_ROLE => [ + 'view group_localgov_alert_banner:localgov_alert_banner entity', + ], + ], + // phpcs:enable + ]; + + return $alert_banner_related_role_permissions; +} diff --git a/modules/group_alert_banner/group_alert_banner.services.yml b/modules/group_alert_banner/group_alert_banner.services.yml new file mode 100644 index 00000000..e54b7de4 --- /dev/null +++ b/modules/group_alert_banner/group_alert_banner.services.yml @@ -0,0 +1,5 @@ +services: + group_alert_banner.route_subscriber: + class: 'Drupal\group_alert_banner\Routing\RouteSubscriber' + tags: + - { name: 'event_subscriber' } diff --git a/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBanner.php b/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBanner.php new file mode 100644 index 00000000..60f39c54 --- /dev/null +++ b/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBanner.php @@ -0,0 +1,58 @@ +t("This field has been disabled by the plugin to guarantee the functionality that's expected of it."); + $form['entity_cardinality']['#disabled'] = TRUE; + $form['entity_cardinality']['#description'] .= '
' . $info . ''; + + return $form; + } + + /** + * {@inheritdoc} + */ + public function calculateDependencies() { + $dependencies = parent::calculateDependencies(); + $dependencies['config'][] = 'localgov_alert_banner.type.' . $this->getRelationType()->getEntityBundle(); + return $dependencies; + } + +} diff --git a/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBannerDeriver.php b/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBannerDeriver.php new file mode 100644 index 00000000..36272db5 --- /dev/null +++ b/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBannerDeriver.php @@ -0,0 +1,36 @@ +derivatives = []; + + foreach (AlertBannerEntityType::loadMultiple() as $name => $alert_banner_type) { + $label = $alert_banner_type->label(); + + $this->derivatives[$name] = clone $base_plugin_definition; + $this->derivatives[$name]->set('entity_bundle', $name); + $this->derivatives[$name]->set('label', $this->t('Group Alert banner (@type)', ['@type' => $label])); + $this->derivatives[$name]->set('description', $this->t('Adds %type Alert banner to groups both publicly and privately.', ['%type' => $label])); + } + + return $this->derivatives; + } + +} diff --git a/modules/group_alert_banner/src/Routing/RouteSubscriber.php b/modules/group_alert_banner/src/Routing/RouteSubscriber.php new file mode 100644 index 00000000..e0c9e989 --- /dev/null +++ b/modules/group_alert_banner/src/Routing/RouteSubscriber.php @@ -0,0 +1,32 @@ +get('entity.group_relationship.create_page')) { + $copy = clone $route; + $copy->setPath('group/{group}/alert-banner/create'); + $copy->setDefault('base_plugin_id', 'group_localgov_alert_banner'); + $collection->add('entity.group_relationship.group_alert_banner_create_banner', $copy); + } + + if ($route = $collection->get('entity.group_relationship.add_page')) { + $copy = clone $route; + $copy->setPath('group/{group}/alert-banner/add'); + $copy->setDefault('base_plugin_id', 'group_localgov_alert_banner'); + $collection->add('entity.group_relationship.group_alert_banner_add_banner', $copy); + } + } + +} From eabe58fc5813d11c492bf331e7723b24a96e32f9 Mon Sep 17 00:00:00 2001 From: Adnan Date: Thu, 18 May 2023 17:03:09 +0100 Subject: [PATCH 02/15] Fix: Group integration. - Fixed Alert banner's entity *type* name during config dependency calculation. - Added group relation type cached clear during Alert banner bundle creation. This is needed for config import to work. --- .../group_alert_banner/group_alert_banner.module | 13 +++++++++++++ .../src/Plugin/Group/Relation/GroupAlertBanner.php | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/modules/group_alert_banner/group_alert_banner.module b/modules/group_alert_banner/group_alert_banner.module index 50ec5e12..44bcd856 100644 --- a/modules/group_alert_banner/group_alert_banner.module +++ b/modules/group_alert_banner/group_alert_banner.module @@ -5,6 +5,19 @@ * Various hook implementations. */ +use Drupal\localgov_alert_banner\Entity\AlertBannerEntityTypeInterface; + +/** + * Implements hook_ENTITY_TYPE_insert(). + * + * This is necessary during configuration imports. This makes the plugin + * definitions from this module immediately available to other config files. + */ +function group_alert_banner_localgov_alert_banner_type_insert(AlertBannerEntityTypeInterface $banner_type) { + + \Drupal::service('group_relation_type.manager')->clearCachedDefinitions(); +} + /** * Implements hook_localgov_microsites_roles_default(). * diff --git a/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBanner.php b/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBanner.php index 60f39c54..a7655e54 100644 --- a/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBanner.php +++ b/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBanner.php @@ -51,7 +51,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta */ public function calculateDependencies() { $dependencies = parent::calculateDependencies(); - $dependencies['config'][] = 'localgov_alert_banner.type.' . $this->getRelationType()->getEntityBundle(); + $dependencies['config'][] = 'localgov_alert_banner.localgov_alert_banner_type.' . $this->getRelationType()->getEntityBundle(); return $dependencies; } From 93b11ee7211a0fba34f61dd63b7802d51b8db19c Mon Sep 17 00:00:00 2001 From: Adnan Date: Fri, 9 Jun 2023 13:06:49 +0100 Subject: [PATCH 03/15] Test: Group integration. Automated test for banner allocation to a test group bundle. --- modules/group_alert_banner/README.md | 3 - ..._type.test_group-41d536b28977e933e431c.yml | 16 ++++ .../config/install/group.type.test_group.yml | 10 ++ .../group_alert_banner_test.info.yml | 7 ++ .../group_alert_banner_test.module | 6 ++ .../tests/src/Kernel/GroupAlertBannerTest.php | 96 +++++++++++++++++++ 6 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 modules/group_alert_banner/tests/modules/group_alert_banner_test/config/install/group.relationship_type.test_group-41d536b28977e933e431c.yml create mode 100644 modules/group_alert_banner/tests/modules/group_alert_banner_test/config/install/group.type.test_group.yml create mode 100644 modules/group_alert_banner/tests/modules/group_alert_banner_test/group_alert_banner_test.info.yml create mode 100644 modules/group_alert_banner/tests/modules/group_alert_banner_test/group_alert_banner_test.module create mode 100644 modules/group_alert_banner/tests/src/Kernel/GroupAlertBannerTest.php diff --git a/modules/group_alert_banner/README.md b/modules/group_alert_banner/README.md index 34bdd3c9..7441baf8 100644 --- a/modules/group_alert_banner/README.md +++ b/modules/group_alert_banner/README.md @@ -10,6 +10,3 @@ Otherwise enable at least the following permissions for **Groups**: ## Banner listing Once this module is installed, an *Alert banner* tab should appear in each Group page. This page will list all the banners belonging to a Group. - -## Todo -- Automated tests. diff --git a/modules/group_alert_banner/tests/modules/group_alert_banner_test/config/install/group.relationship_type.test_group-41d536b28977e933e431c.yml b/modules/group_alert_banner/tests/modules/group_alert_banner_test/config/install/group.relationship_type.test_group-41d536b28977e933e431c.yml new file mode 100644 index 00000000..058394db --- /dev/null +++ b/modules/group_alert_banner/tests/modules/group_alert_banner_test/config/install/group.relationship_type.test_group-41d536b28977e933e431c.yml @@ -0,0 +1,16 @@ +langcode: en +status: true +dependencies: + config: + - group.type.test_group + - localgov_alert_banner.localgov_alert_banner_type.localgov_alert_banner + module: + - group_alert_banner + - localgov_alert_banner +id: test_group-41d536b28977e933e431c +group_type: test_group +content_plugin: 'group_localgov_alert_banner:localgov_alert_banner' +plugin_config: + group_cardinality: 0 + entity_cardinality: 1 + use_creation_wizard: false diff --git a/modules/group_alert_banner/tests/modules/group_alert_banner_test/config/install/group.type.test_group.yml b/modules/group_alert_banner/tests/modules/group_alert_banner_test/config/install/group.type.test_group.yml new file mode 100644 index 00000000..37ca80cb --- /dev/null +++ b/modules/group_alert_banner/tests/modules/group_alert_banner_test/config/install/group.type.test_group.yml @@ -0,0 +1,10 @@ +langcode: en +status: true +dependencies: { } +id: test_group +label: 'Test group label' +description: 'Test group description.' +new_revision: true +creator_membership: true +creator_wizard: true +creator_roles: { } diff --git a/modules/group_alert_banner/tests/modules/group_alert_banner_test/group_alert_banner_test.info.yml b/modules/group_alert_banner/tests/modules/group_alert_banner_test/group_alert_banner_test.info.yml new file mode 100644 index 00000000..2955712c --- /dev/null +++ b/modules/group_alert_banner/tests/modules/group_alert_banner_test/group_alert_banner_test.info.yml @@ -0,0 +1,7 @@ +name: 'Group alert banner test' +type: module +description: 'Provides a test Group type for Alert banner test.' +package: Testing +version: VERSION +dependencies: + localgov_alert_banner:group_alert_banner diff --git a/modules/group_alert_banner/tests/modules/group_alert_banner_test/group_alert_banner_test.module b/modules/group_alert_banner/tests/modules/group_alert_banner_test/group_alert_banner_test.module new file mode 100644 index 00000000..795567a7 --- /dev/null +++ b/modules/group_alert_banner/tests/modules/group_alert_banner_test/group_alert_banner_test.module @@ -0,0 +1,6 @@ +createGroup(['type' => 'test_group']); + $group1 = $this->createGroup(['type' => 'test_group']); + + $alert_banner_for_group0 = $this->container->get('entity_type.manager')->getStorage('localgov_alert_banner')->create([ + 'type' => 'localgov_alert_banner', + 'title' => 'Alert banner for Group zero', + 'type_of_alert' => '00--announcement', + 'moderation_state' => 'published', + ]); + $alert_banner_for_group0->save(); + + $alert_banner_for_group1 = $this->container->get('entity_type.manager')->getStorage('localgov_alert_banner')->create([ + 'type' => 'localgov_alert_banner', + 'title' => 'Alert banner for Group one', + 'type_of_alert' => '00--announcement', + 'moderation_state' => 'published', + ]); + $alert_banner_for_group1->save(); + + // Allocate banners to their respective groups. + $group0->addRelationship($alert_banner_for_group0, static::OUR_ALERT_BANNER_PLUGIN_ID); + $group1->addRelationship($alert_banner_for_group1, static::OUR_ALERT_BANNER_PLUGIN_ID); + + // Finally, verify banner allocation. + $banners_for_group0 = $group0->getRelatedEntities(static::OUR_ALERT_BANNER_PLUGIN_ID); + $this->assertCount(1, $banners_for_group0); + $first_banner_for_group0 = current($banners_for_group0); + $this->assertEquals($alert_banner_for_group0->id(), $first_banner_for_group0->id()); + + $banners_for_group1 = $group1->getRelatedEntities(static::OUR_ALERT_BANNER_PLUGIN_ID); + $this->assertCount(1, $banners_for_group1); + $first_banner_for_group1 = current($banners_for_group1); + $this->assertEquals($alert_banner_for_group1->id(), $first_banner_for_group1->id()); + } + + /** + * Installs necessary configs. + */ + protected function setUp(): void { + + parent::setUp(); + + $this->installEntitySchema('content_moderation_state'); + $this->installEntitySchema('localgov_alert_banner'); + $this->installConfig([ + 'content_moderation', + 'group_alert_banner', + 'localgov_alert_banner', + 'group_alert_banner_test', + ]); + } + + /** + * Modules to enable. + * + * @var array + */ + protected static $modules = [ + 'link', + 'condition_field', + 'content_moderation', + 'group_alert_banner', + 'group_alert_banner_test', + 'localgov_alert_banner', + 'views', + 'workflows', + ]; + + /** + * This plugin relates group types to banner types. + */ + const OUR_ALERT_BANNER_PLUGIN_ID = 'group_localgov_alert_banner:localgov_alert_banner'; + +} From 91610ea508c5d790cf89ded7f3fbb53e66b4602d Mon Sep 17 00:00:00 2001 From: Adnan Date: Fri, 9 Jun 2023 14:07:25 +0100 Subject: [PATCH 04/15] Fix: Coding standards. --- .../group_alert_banner_test/group_alert_banner_test.info.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/group_alert_banner/tests/modules/group_alert_banner_test/group_alert_banner_test.info.yml b/modules/group_alert_banner/tests/modules/group_alert_banner_test/group_alert_banner_test.info.yml index 2955712c..2551fbae 100644 --- a/modules/group_alert_banner/tests/modules/group_alert_banner_test/group_alert_banner_test.info.yml +++ b/modules/group_alert_banner/tests/modules/group_alert_banner_test/group_alert_banner_test.info.yml @@ -2,6 +2,5 @@ name: 'Group alert banner test' type: module description: 'Provides a test Group type for Alert banner test.' package: Testing -version: VERSION dependencies: - localgov_alert_banner:group_alert_banner + - localgov_alert_banner:group_alert_banner From 570d2cfaf75f72adf9293cf167553a03ba002e6f Mon Sep 17 00:00:00 2001 From: Adnan Date: Fri, 9 Jun 2023 16:17:04 +0100 Subject: [PATCH 05/15] Test: Requiring suggested dependencies. The suggested dependencies (e.g. group) from composer.json are required to run some of the tests. --- .github/workflows/test.yml | 3 +++ composer.json | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 68a71a29..5ece52b6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -100,6 +100,9 @@ jobs: with: path: ${{ env.LOCALGOV_DRUPAL_PROJECT_PATH }} + - name: Obtain suggested dependencies + run: composer --working-dir=./html/${LOCALGOV_DRUPAL_PROJECT_PATH} suggests --list | xargs composer require + phpcs: name: Coding standards checks needs: build diff --git a/composer.json b/composer.json index e5a09af3..f2445c9c 100644 --- a/composer.json +++ b/composer.json @@ -13,6 +13,7 @@ }, "suggest": { "drupal/scheduled_transitions": "Gives the ability to schedule the publishing and unpublishing of alert banners", - "localgovdrupal/localgov_core": "^1 || ^2" + "localgovdrupal/localgov_core": "^1 || ^2", + "drupal/group": "For Group integration." } } From 9fd20b1d7a929ef26caedbf51c2fe8f254b801f0 Mon Sep 17 00:00:00 2001 From: Adnan Date: Fri, 9 Jun 2023 16:30:43 +0100 Subject: [PATCH 06/15] Test: Requiring suggested dependencies. Fix for composer command in test runner to grab suggested packages. --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5ece52b6..ee8a3c80 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -101,7 +101,7 @@ jobs: path: ${{ env.LOCALGOV_DRUPAL_PROJECT_PATH }} - name: Obtain suggested dependencies - run: composer --working-dir=./html/${LOCALGOV_DRUPAL_PROJECT_PATH} suggests --list | xargs composer require + run: composer --working-dir=./html/${LOCALGOV_DRUPAL_PROJECT_PATH} suggests --list | xargs composer --working-dir=./html require phpcs: name: Coding standards checks From a6577c217321abb792a07f830b817c6b08a40245 Mon Sep 17 00:00:00 2001 From: Adnan Date: Mon, 4 Sep 2023 14:09:47 +0100 Subject: [PATCH 07/15] Fix: Group banner publishing. When a new banner is set to go live, we should end up in the "Put banner live" tab of the new banner after the banner form is submitted. At the moment we are ending up in the banner's "View" tab. Also, group banners should only appear in group pages and not all over the site. --- .../views.view.group_alert_banners.yml | 4 +- .../group_alert_banner.module | 82 +++++++++++++++++++ 2 files changed, 83 insertions(+), 3 deletions(-) diff --git a/modules/group_alert_banner/config/optional/views.view.group_alert_banners.yml b/modules/group_alert_banner/config/optional/views.view.group_alert_banners.yml index 5c8d856f..4459b6c5 100644 --- a/modules/group_alert_banner/config/optional/views.view.group_alert_banners.yml +++ b/modules/group_alert_banner/config/optional/views.view.group_alert_banners.yml @@ -3,7 +3,6 @@ status: true dependencies: config: - field.storage.localgov_alert_banner.type_of_alert - - group.type.microsite module: - group - localgov_alert_banner @@ -640,8 +639,7 @@ display: type: 'entity:group' fail: 'not found' validate_options: - bundles: - microsite: microsite + bundles: { } access: false operation: view multiple: 0 diff --git a/modules/group_alert_banner/group_alert_banner.module b/modules/group_alert_banner/group_alert_banner.module index 44bcd856..f8d17389 100644 --- a/modules/group_alert_banner/group_alert_banner.module +++ b/modules/group_alert_banner/group_alert_banner.module @@ -5,6 +5,10 @@ * Various hook implementations. */ +use Drupal\Core\Block\BlockPluginInterface; +use Drupal\Core\Database\Query\AlterableInterface; +use Drupal\Core\Database\Query\SelectInterface; +use Drupal\Core\Form\FormStateInterface; use Drupal\localgov_alert_banner\Entity\AlertBannerEntityTypeInterface; /** @@ -80,3 +84,81 @@ function group_alert_banner_localgov_microsites_roles_default() { return $alert_banner_related_role_permissions; } + +/** + * Implements hook_query_TAG_alter(). + * + * On group pages, only list group banners belonging to the current group OR + * site-wide banners. + */ +function group_alert_banner_query_entity_query_alter(AlterableInterface $query) { + + if (!$query instanceof SelectInterface) { + return; + } + + $entity_type_id = $query->getMetaData('entity_type'); + if ($entity_type_id !== 'localgov_alert_banner' || !$query->hasTag($entity_type_id . '_access')) { + return; + } + + $group = \Drupal::service('group.group_route_context')->getGroupFromRoute(); + $gid = empty($group) ? -1 : $group->id(); + + // The 'gcfd' table alias is set in + // Drupal\group\QueryAccess\EntityQueryAlter::doAlter() for the + // group_relationship_field_data table. + $query->where( + "(gcfd.entity_id IS NOT NULL AND gcfd.gid = :gid) OR gcfd.entity_id IS NULL", + [':gid' => $gid] + ); +} + +/** + * Implements hook_block_build_alter(). + * + * Alterations: + * - Adds the "route.group" context to alert blocks. This lets us list + * different alert banners in different groups. + */ +function group_alert_banner_block_build_alter(array &$build, BlockPluginInterface $block_plugin) { + + $block_type = $block_plugin->getBaseId(); + if ($block_type === 'localgov_alert_banner_block') { + $build['#cache']['contexts'][] = 'route.group'; + } +} + +/** + * Implements hook_form_BASE_FORM_ID_alter() for hook_form_localgov_alert_banner_form_alter(). + */ +function group_alert_banner_form_localgov_alert_banner_form_alter(&$form, FormStateInterface $form_state, $form_id) { + + $is_banner_add_form = strpos($form_id, '_add_form', -9); + $is_group_context = \Drupal::service('group.group_route_context')->getGroupFromRoute(); + if ($is_banner_add_form && $is_group_context) { + $form['actions']['submit']['#submit'][] = 'group_alert_banner_restore_publish_page_redirect'; + } +} + +/** + * Alert banner add form submit handler. + * + * Restores form redirect to original target. This has earlier been overridden + * in group_relationship_entity_submit(). + * + * @see AlertBannerEntityForm::save() + * @see group_relationship_entity_submit() + */ +function group_alert_banner_restore_publish_page_redirect($form, FormStateInterface $form_state) { + + if ($form_state->getValue('status-change') == TRUE) { + $entity = $form_state->getFormObject()->getEntity(); + + // Remove destination query and pass it through to the confirmation form. + $request = Drupal::service('request_stack'); + $destination = $request->getCurrentRequest()->query->get('destination'); + $request->getCurrentRequest()->query->remove('destination'); + $form_state->setRedirect('entity.localgov_alert_banner.status_form', ['localgov_alert_banner' => $entity->id()], ['query' => ['destination' => $destination]]); + } +} From 9c84f6a4e58c141eb401449519d4628a4fc8eb7d Mon Sep 17 00:00:00 2001 From: Adnan Date: Mon, 4 Sep 2023 15:01:46 +0100 Subject: [PATCH 08/15] Fix: Account for Domain group. Decide the active group either based on the current path or the current domain. This is useful where we are using the domain_group module to associate a domain with a group. --- modules/group_alert_banner/group_alert_banner.module | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/group_alert_banner/group_alert_banner.module b/modules/group_alert_banner/group_alert_banner.module index f8d17389..7081c683 100644 --- a/modules/group_alert_banner/group_alert_banner.module +++ b/modules/group_alert_banner/group_alert_banner.module @@ -104,6 +104,10 @@ function group_alert_banner_query_entity_query_alter(AlterableInterface $query) $group = \Drupal::service('group.group_route_context')->getGroupFromRoute(); $gid = empty($group) ? -1 : $group->id(); + if (empty($group) && Drupal::getContainer()->has('domain_group_resolver')) { + $gid_from_domain = Drupal::service('domain_group_resolver')->getActiveDomainGroupId(); + $gid = $gid_from_domain ?? $gid; + } // The 'gcfd' table alias is set in // Drupal\group\QueryAccess\EntityQueryAlter::doAlter() for the @@ -131,6 +135,8 @@ function group_alert_banner_block_build_alter(array &$build, BlockPluginInterfac /** * Implements hook_form_BASE_FORM_ID_alter() for hook_form_localgov_alert_banner_form_alter(). + * + * Appends a custom form submit handler for the group banner add form. */ function group_alert_banner_form_localgov_alert_banner_form_alter(&$form, FormStateInterface $form_state, $form_id) { From 8b3991a82e6256271821ba1fef9e97ca9a63ed01 Mon Sep 17 00:00:00 2001 From: Adnan Date: Mon, 4 Sep 2023 15:16:52 +0100 Subject: [PATCH 09/15] Chore: Coding standards fix. --- .../src/Plugin/Group/Relation/GroupAlertBanner.php | 2 +- .../src/Plugin/Group/Relation/GroupAlertBannerDeriver.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBanner.php b/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBanner.php index a7655e54..85ff3ae4 100644 --- a/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBanner.php +++ b/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBanner.php @@ -2,8 +2,8 @@ namespace Drupal\group_alert_banner\Plugin\Group\Relation; -use Drupal\group\Plugin\Group\Relation\GroupRelationBase; use Drupal\Core\Form\FormStateInterface; +use Drupal\group\Plugin\Group\Relation\GroupRelationBase; /** * Provides a group relation type for Alert banners. diff --git a/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBannerDeriver.php b/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBannerDeriver.php index 36272db5..60d8d2f3 100644 --- a/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBannerDeriver.php +++ b/modules/group_alert_banner/src/Plugin/Group/Relation/GroupAlertBannerDeriver.php @@ -2,10 +2,10 @@ namespace Drupal\group_alert_banner\Plugin\Group\Relation; -use Drupal\group\Plugin\Group\Relation\GroupRelationTypeInterface; -use Drupal\localgov_alert_banner\Entity\AlertBannerEntityType; use Drupal\Component\Plugin\Derivative\DeriverBase; use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\group\Plugin\Group\Relation\GroupRelationTypeInterface; +use Drupal\localgov_alert_banner\Entity\AlertBannerEntityType; /** * Alert banner plugin deriver for Group. From fb1c9cd13623cb7936c3102260278ba5995a8395 Mon Sep 17 00:00:00 2001 From: Adnan Date: Mon, 4 Sep 2023 15:48:20 +0100 Subject: [PATCH 10/15] Fix: Post-banner publishing redirection. Once a group banner is published, redirect to the group banner listing page instead of to the site-wide banner listing page. --- modules/group_alert_banner/group_alert_banner.module | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/modules/group_alert_banner/group_alert_banner.module b/modules/group_alert_banner/group_alert_banner.module index 7081c683..94f6bf83 100644 --- a/modules/group_alert_banner/group_alert_banner.module +++ b/modules/group_alert_banner/group_alert_banner.module @@ -159,12 +159,9 @@ function group_alert_banner_form_localgov_alert_banner_form_alter(&$form, FormSt function group_alert_banner_restore_publish_page_redirect($form, FormStateInterface $form_state) { if ($form_state->getValue('status-change') == TRUE) { - $entity = $form_state->getFormObject()->getEntity(); + $banner = $form_state->getFormObject()->getEntity(); + $group = \Drupal::service('group.group_route_context')->getGroupFromRoute(); - // Remove destination query and pass it through to the confirmation form. - $request = Drupal::service('request_stack'); - $destination = $request->getCurrentRequest()->query->get('destination'); - $request->getCurrentRequest()->query->remove('destination'); - $form_state->setRedirect('entity.localgov_alert_banner.status_form', ['localgov_alert_banner' => $entity->id()], ['query' => ['destination' => $destination]]); + $form_state->setRedirect('entity.localgov_alert_banner.status_form', ['localgov_alert_banner' => $banner->id()], ['query' => ['destination' => "group/{$group->id()}/alert-banners"]]); } } From ba9bdb22d674001acce9b0d7c406b3bfb2557cf6 Mon Sep 17 00:00:00 2001 From: Andy Broomfield Date: Wed, 6 Sep 2023 09:50:08 +0100 Subject: [PATCH 11/15] Add Github action on demand support to test Adds the key `workflow_dispatch:` to the on section. --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 01118394..f55b3f0f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,6 +10,7 @@ on: pull_request: branches: - '1.x' + workflow_dispatch: env: LOCALGOV_DRUPAL_PROJECT: localgovdrupal/localgov_alert_banner From 7c26e17a0fb2b338c2160103d872683b480c7207 Mon Sep 17 00:00:00 2001 From: Adnan Date: Fri, 29 Sep 2023 12:09:23 +0100 Subject: [PATCH 12/15] Feat: Group banner block. Optional Alert banner block configuration for the localgov_microsites_base theme. Automates setup of the Alert banner block for LocalGov Drupal Microsites distribution users. --- modules/group_alert_banner/README.md | 4 ++++ ....localgov_alert_banner_microsites_base.yml | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/group_alert_banner/config/optional/block.block.localgov_alert_banner_microsites_base.yml diff --git a/modules/group_alert_banner/README.md b/modules/group_alert_banner/README.md index 7441baf8..46fb8456 100644 --- a/modules/group_alert_banner/README.md +++ b/modules/group_alert_banner/README.md @@ -2,11 +2,15 @@ LocalGov Alert banner integration with the [Group module](https://www.drupal.org/project/group). ## Configuration +### User permissions If you are using this module alongside the [localgov_microsites_group](https://github.com/localgovdrupal/localgov_microsites_group) module, then user permissions will be automatically setup during module installation. Otherwise enable at least the following permissions for **Groups**: - "Entity: View any alert banner entities" for both anonymous and authenticated users. - "Access Alert banner listing page" for group admins. +### Block placement +If you are using the [localgov_microsites_base theme](https://github.com/localgovdrupal/localgov_microsites_base), which is the default theme of the [LocalGov Drupal Microsites distribution](https://github.com/localgovdrupal/localgov_microsites_project), an Alert banner block will be automatically placed in the *Header* region. For all other themes, place an Alert banner block in a theme region towards the top of the page. + ## Banner listing Once this module is installed, an *Alert banner* tab should appear in each Group page. This page will list all the banners belonging to a Group. diff --git a/modules/group_alert_banner/config/optional/block.block.localgov_alert_banner_microsites_base.yml b/modules/group_alert_banner/config/optional/block.block.localgov_alert_banner_microsites_base.yml new file mode 100644 index 00000000..1c14503a --- /dev/null +++ b/modules/group_alert_banner/config/optional/block.block.localgov_alert_banner_microsites_base.yml @@ -0,0 +1,21 @@ +langcode: en +status: true +dependencies: + module: + - localgov_alert_banner + theme: + - localgov_microsites_base +id: localgov_alert_banner_microsites_base +theme: localgov_microsites_base +region: header +weight: -10 +provider: null +plugin: localgov_alert_banner_block +settings: + id: localgov_alert_banner_block + label: 'Alert banner' + label_display: '0' + provider: localgov_alert_banner + include_types: + localgov_alert_banner: '0' +visibility: { } From 321d0215d540e55f930ac2c6efda547361ca7383 Mon Sep 17 00:00:00 2001 From: Lee Mills <8024370+millnut@users.noreply.github.com> Date: Fri, 29 Sep 2023 17:16:47 +0100 Subject: [PATCH 13/15] fix: phpstan issues --- src/Form/AlertBannerEntityForm.php | 2 ++ .../AlertBannerEntityRevisionRevertTranslationForm.php | 4 ++-- src/Form/AlertBannerEntityTypeForm.php | 2 ++ tests/src/Functional/AlertBannerBlockTest.php | 2 +- tests/src/Functional/PermissionsTest.php | 9 ++++++++- tests/src/Kernel/AlertBannerBlockOrderTest.php | 7 +++++++ 6 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Form/AlertBannerEntityForm.php b/src/Form/AlertBannerEntityForm.php index 7efba1aa..65c193f4 100644 --- a/src/Form/AlertBannerEntityForm.php +++ b/src/Form/AlertBannerEntityForm.php @@ -229,6 +229,8 @@ public function save(array $form, FormStateInterface $form_state) { else { $form_state->setRedirect('entity.localgov_alert_banner.collection', ['localgov_alert_banner' => $entity->id()]); } + + return $status; } } diff --git a/src/Form/AlertBannerEntityRevisionRevertTranslationForm.php b/src/Form/AlertBannerEntityRevisionRevertTranslationForm.php index 694cb18d..beb43b28 100644 --- a/src/Form/AlertBannerEntityRevisionRevertTranslationForm.php +++ b/src/Form/AlertBannerEntityRevisionRevertTranslationForm.php @@ -12,7 +12,7 @@ * @ingroup localgov_alert_banner */ class AlertBannerEntityRevisionRevertTranslationForm extends AlertBannerEntityRevisionRevertForm { - + /** * The language to be reverted. * @@ -84,7 +84,7 @@ protected function prepareRevertedRevision(AlertBannerEntityInterface $revision, $revert_untranslated_fields = $form_state->getValue('revert_untranslated_fields'); /** @var \Drupal\localgov_alert_banner\Entity\AlertBannerEntityInterface $default_revision */ - $latest_revision = $this->AlertBannerEntityStorage->load($revision->id()); + $latest_revision = $this->alertBannerEntityStorage->load($revision->id()); $latest_revision_translation = $latest_revision->getTranslation($this->langcode); $revision_translation = $revision->getTranslation($this->langcode); diff --git a/src/Form/AlertBannerEntityTypeForm.php b/src/Form/AlertBannerEntityTypeForm.php index 59498fc4..e7ef7afc 100644 --- a/src/Form/AlertBannerEntityTypeForm.php +++ b/src/Form/AlertBannerEntityTypeForm.php @@ -60,6 +60,8 @@ public function save(array $form, FormStateInterface $form_state) { ])); } $form_state->setRedirectUrl($localgov_alert_banner_type->toUrl('collection')); + + return $status; } } diff --git a/tests/src/Functional/AlertBannerBlockTest.php b/tests/src/Functional/AlertBannerBlockTest.php index 4db786e2..ae333486 100644 --- a/tests/src/Functional/AlertBannerBlockTest.php +++ b/tests/src/Functional/AlertBannerBlockTest.php @@ -48,7 +48,7 @@ protected function placeAlterBlock(array $settings = []) { $this->adminUser = $this->drupalCreateUser(['administer blocks']); $this->drupalLogin($this->adminUser); $block = $this->drupalPlaceBlock('localgov_alert_banner_block', $settings); - $this->drupalLogout($this->adminUser); + $this->drupalLogout(); return $block; } diff --git a/tests/src/Functional/PermissionsTest.php b/tests/src/Functional/PermissionsTest.php index f96cba6b..a5c6e010 100644 --- a/tests/src/Functional/PermissionsTest.php +++ b/tests/src/Functional/PermissionsTest.php @@ -25,6 +25,13 @@ class PermissionsTest extends BrowserTestBase { 'user', ]; + /** + * A user with the 'administer blocks' permission. + * + * @var \Drupal\user\UserInterface + */ + protected $adminUser; + /** * {@inheritdoc} */ @@ -71,7 +78,7 @@ public function setUp(): void { $this->adminUser = $this->drupalCreateUser(['administer blocks']); $this->drupalLogin($this->adminUser); $this->drupalPlaceBlock('localgov_alert_banner_block', []); - $this->drupalLogout($this->adminUser); + $this->drupalLogout(); } /** diff --git a/tests/src/Kernel/AlertBannerBlockOrderTest.php b/tests/src/Kernel/AlertBannerBlockOrderTest.php index ca2224cd..1134ccd8 100644 --- a/tests/src/Kernel/AlertBannerBlockOrderTest.php +++ b/tests/src/Kernel/AlertBannerBlockOrderTest.php @@ -69,6 +69,7 @@ public function testAlertBannerBlockOrder() { ]; // Set up alert banners. + $alert = []; foreach ($alert_details as $key => $value) { $alert_entity = $this->container->get('entity_type.manager')->getStorage('localgov_alert_banner') ->create([ @@ -90,6 +91,7 @@ public function testAlertBannerBlockOrder() { // Render the block and get the alert banner IDs as an array. $render = $plugin_block->build(); + $result = []; foreach ($render as $render_value) { $result[] = $render_value['#localgov_alert_banner']->id(); } @@ -100,6 +102,7 @@ public function testAlertBannerBlockOrder() { $this->assertEquals($expected, $result); // More banners - Order should be type then most recent first. + $alert_new = []; foreach ($alert_details as $key => $value) { $alert_entity = $this->container->get('entity_type.manager')->getStorage('localgov_alert_banner') ->create([ @@ -116,6 +119,7 @@ public function testAlertBannerBlockOrder() { // Create and render the block and get the alert banner IDs as an array. $plugin_block = $block_manager->createInstance('localgov_alert_banner_block', $config); $render = $plugin_block->build(); + $result_2 = []; foreach ($render as $render_value) { $result_2[] = $render_value['#localgov_alert_banner']->id(); } @@ -141,6 +145,7 @@ public function testAlertBannerBlockOrder() { // Create and render the block and get the alert banner IDs as an array. $plugin_block = $block_manager->createInstance('localgov_alert_banner_block', $config); $render = $plugin_block->build(); + $result_3 = []; foreach ($render as $render_value) { $result_3[] = $render_value['#localgov_alert_banner']->id(); } @@ -184,6 +189,7 @@ public function testAlertBannerBlockOrderWithoutTypeOfAlert() { ]; // Set up alert banners. + $alert = []; foreach ($alert_times as $changed) { $alert_entity = $this->container->get('entity_type.manager')->getStorage('localgov_alert_banner') ->create([ @@ -201,6 +207,7 @@ public function testAlertBannerBlockOrderWithoutTypeOfAlert() { $config = []; $plugin_block = $block_manager->createInstance('localgov_alert_banner_block', $config); $render = $plugin_block->build(); + $result = []; foreach ($render as $render_value) { $result[] = $render_value['#localgov_alert_banner']->id(); } From 59b4fc9ea3148514e94a1b0f528b926b86b09093 Mon Sep 17 00:00:00 2001 From: Lee Mills <8024370+millnut@users.noreply.github.com> Date: Fri, 29 Sep 2023 17:31:12 +0100 Subject: [PATCH 14/15] fix: phpstan issues --- src/Form/AlertBannerEntityRevisionRevertTranslationForm.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Form/AlertBannerEntityRevisionRevertTranslationForm.php b/src/Form/AlertBannerEntityRevisionRevertTranslationForm.php index beb43b28..98a0871c 100644 --- a/src/Form/AlertBannerEntityRevisionRevertTranslationForm.php +++ b/src/Form/AlertBannerEntityRevisionRevertTranslationForm.php @@ -12,7 +12,6 @@ * @ingroup localgov_alert_banner */ class AlertBannerEntityRevisionRevertTranslationForm extends AlertBannerEntityRevisionRevertForm { - /** * The language to be reverted. * From 4c381bc53a059e2bc6a754701c3900cb419605ac Mon Sep 17 00:00:00 2001 From: Lee Mills <8024370+millnut@users.noreply.github.com> Date: Fri, 29 Sep 2023 17:35:37 +0100 Subject: [PATCH 15/15] fix: phpstan issues --- src/Form/AlertBannerEntityRevisionRevertTranslationForm.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Form/AlertBannerEntityRevisionRevertTranslationForm.php b/src/Form/AlertBannerEntityRevisionRevertTranslationForm.php index 98a0871c..1fcaf20e 100644 --- a/src/Form/AlertBannerEntityRevisionRevertTranslationForm.php +++ b/src/Form/AlertBannerEntityRevisionRevertTranslationForm.php @@ -12,6 +12,7 @@ * @ingroup localgov_alert_banner */ class AlertBannerEntityRevisionRevertTranslationForm extends AlertBannerEntityRevisionRevertForm { + /** * The language to be reverted. *