From f9f9570b13b6c484f9540e2e88f57210369c2c55 Mon Sep 17 00:00:00 2001 From: Mohammed Nassar <msh.nassar@gmail.com> Date: Fri, 20 Dec 2024 14:08:10 +0000 Subject: [PATCH] Support enforced/unenforced extenders. --- .../CollectorExtender/ExcludeOwner.php | 1 + .../src/Form/RecipientsCollectorFormBase.php | 42 +++++++++++++++---- src/Attribute/CollectorExtender.php | 3 ++ src/CollectorExtenderBase.php | 7 ++++ src/CollectorExtenderInterface.php | 8 ++++ .../CollectorExtender/IncludeActor.php | 1 + .../CollectorExtender/IncludeBlocked.php | 1 + 7 files changed, 56 insertions(+), 7 deletions(-) diff --git a/modules/message_recipient_entity/src/Plugin/MessageRecipient/CollectorExtender/ExcludeOwner.php b/modules/message_recipient_entity/src/Plugin/MessageRecipient/CollectorExtender/ExcludeOwner.php index 0dbc365..861254e 100644 --- a/modules/message_recipient_entity/src/Plugin/MessageRecipient/CollectorExtender/ExcludeOwner.php +++ b/modules/message_recipient_entity/src/Plugin/MessageRecipient/CollectorExtender/ExcludeOwner.php @@ -23,6 +23,7 @@ use Drupal\user\EntityOwnerInterface; id: 'exclude_owner', stage: CollectorExtenderType::QUERY_ALTER, types: ['user'], + config_enforced: TRUE, label: new TranslatableMarkup('Exclude owner'), description: new TranslatableMarkup("Exclude message's associated entity owner if collected by this recipients collector."), )] diff --git a/modules/message_recipient_ui/src/Form/RecipientsCollectorFormBase.php b/modules/message_recipient_ui/src/Form/RecipientsCollectorFormBase.php index bdd0c74..12ef32c 100644 --- a/modules/message_recipient_ui/src/Form/RecipientsCollectorFormBase.php +++ b/modules/message_recipient_ui/src/Form/RecipientsCollectorFormBase.php @@ -135,7 +135,14 @@ abstract class RecipientsCollectorFormBase extends FormBase { // Store extenders settings. $extenders = $this->getAllExtenders(); + /** @var \Drupal\message_recipient\CollectorExtenderInterface $extender */ foreach ($extenders as $extender_id => $extender) { + // Do not submit the extender in case it is not enforced unless it is + // enabled. And remove it in case it has been added before. + if (!$extender->isConfigEnforced() && empty($form_state->getValue(['extenders', 'status', $extender_id]))) { + $this->recipientsCollector->removeExtender($extender_id); + continue; + } $extender_form_state = SubformState::createForSubform($form['extenders']['settings'][$extender_id], $form, $form_state); $extender->submitConfigurationForm($form['extenders']['settings'][$extender_id], $extender_form_state, $this->recipientsCollector); } @@ -173,15 +180,25 @@ abstract class RecipientsCollectorFormBase extends FormBase { $form['extenders'] = [ '#type' => 'container', '#tree' => TRUE, - '#states' => [ - 'visible' => [ - ':input[name="extenders_description"]' => [ - 'checked' => TRUE, - ], - ], - ], ]; + $form['extenders']['status']['title'] = [ + '#type' => 'item', + '#title' => $this->t('Enabled optional extenders:') + ]; + + /** @var \Drupal\message_recipient\CollectorExtenderInterface $extender */ + foreach ($extenders as $extender_id => $extender) { + if ($extender->isConfigEnforced()) { + continue; + } + $form['extenders']['status'][$extender_id] = [ + '#type' => 'checkbox', + '#title' => $extender->label(), + '#default_value' => in_array($extender_id, array_keys($this->recipientsCollector->getExtenders()->getInstanceIds())), + ]; + } + // Add vertical tabs containing the settings for the extenders. $form['extenders']['extender_settings'] = [ '#title' => $this->t('Collector extender settings'), @@ -190,6 +207,7 @@ abstract class RecipientsCollectorFormBase extends FormBase { '#description_display' => 'before', ]; + // Configs for each extender. foreach ($extenders as $extender_id => $extender) { $form['extenders']['settings'][$extender_id] = [ '#type' => 'details', @@ -198,6 +216,16 @@ abstract class RecipientsCollectorFormBase extends FormBase { '#parents' => ['extenders', $extender_id, 'settings'], ]; + if (!$extender->isConfigEnforced()) { + $form['extenders']['settings'][$extender_id]['#states'] = [ + 'visible' => [ + ':input[name="extenders[status][' . $extender_id . ']"]' => [ + 'checked' => TRUE, + ], + ], + ]; + } + $extender_form_state = SubformState::createForSubform($form['extenders']['settings'][$extender_id], $form, $form_state); $form['extenders']['settings'][$extender_id] += $extender->buildConfigurationForm($form['extenders']['settings'][$extender_id], $extender_form_state, $this->recipientsCollector); } diff --git a/src/Attribute/CollectorExtender.php b/src/Attribute/CollectorExtender.php index 4ad6094..d1dadb7 100644 --- a/src/Attribute/CollectorExtender.php +++ b/src/Attribute/CollectorExtender.php @@ -21,6 +21,8 @@ class CollectorExtender extends Plugin { * The plugin ID. * @param \Drupal\message_recipient\CollectorExtenderType $stage * The stage the extender is acting in, e.g. 'query_alter', 'post_collect'. + * @param bool $config_enforced + * Whether the config for the plugin is enforced or not. * @param array $types * (optional) The applicable recipients collector types, e.g. 'user', * 'email'. @@ -33,6 +35,7 @@ class CollectorExtender extends Plugin { public readonly string $id, public readonly CollectorExtenderType $stage, public readonly array $types = [], + public readonly bool $config_enforced = FALSE, public readonly ?TranslatableMarkup $label = NULL, public readonly ?TranslatableMarkup $description = NULL, ) {} diff --git a/src/CollectorExtenderBase.php b/src/CollectorExtenderBase.php index 4b133b3..f43b948 100644 --- a/src/CollectorExtenderBase.php +++ b/src/CollectorExtenderBase.php @@ -78,6 +78,13 @@ abstract class CollectorExtenderBase extends PluginBase implements CollectorExte return $this->pluginDefinition['types']; } + /** + * {@inheritdoc} + */ + public function isConfigEnforced(): bool { + return $this->pluginDefinition['config_enforced']; + } + /** * {@inheritdoc} */ diff --git a/src/CollectorExtenderInterface.php b/src/CollectorExtenderInterface.php index e11fc79..9b2d395 100644 --- a/src/CollectorExtenderInterface.php +++ b/src/CollectorExtenderInterface.php @@ -59,6 +59,14 @@ interface CollectorExtenderInterface extends PluginInspectionInterface, Configur */ public function getTypes(): array; + /** + * Check if whether the collector extender config is enforced. + * + * @return bool + * True if the collector extender config is enforced, false otherwise. + */ + public function isConfigEnforced(): bool; + /** * Check if whether the collector extender is applicable. * diff --git a/src/Plugin/MessageRecipient/CollectorExtender/IncludeActor.php b/src/Plugin/MessageRecipient/CollectorExtender/IncludeActor.php index 4a29c4c..951d47f 100644 --- a/src/Plugin/MessageRecipient/CollectorExtender/IncludeActor.php +++ b/src/Plugin/MessageRecipient/CollectorExtender/IncludeActor.php @@ -23,6 +23,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; id: 'include_actor', stage: CollectorExtenderType::QUERY_ALTER, types: ['user'], + config_enforced: TRUE, label: new TranslatableMarkup('Include actor'), description: new TranslatableMarkup('Includes actor if collected by this recipients collector.'), )] diff --git a/src/Plugin/MessageRecipient/CollectorExtender/IncludeBlocked.php b/src/Plugin/MessageRecipient/CollectorExtender/IncludeBlocked.php index 50a3beb..76fe674 100644 --- a/src/Plugin/MessageRecipient/CollectorExtender/IncludeBlocked.php +++ b/src/Plugin/MessageRecipient/CollectorExtender/IncludeBlocked.php @@ -21,6 +21,7 @@ use Drupal\message_recipient\RecipientsCollectorInterface; id: 'include_blocked_users', stage: CollectorExtenderType::QUERY_ALTER, types: ['user'], + config_enforced: TRUE, label: new TranslatableMarkup('Include blocked users'), description: new TranslatableMarkup('Includes any blocked user collected by this recipients collector.'), )] -- GitLab