Loading mailgroup.module +75 −1 Original line number Diff line number Diff line Loading @@ -9,7 +9,7 @@ use Drupal\Component\Utility\Html; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityStorageException; use Drupal\Core\Render\Element; use Drupal\mailgroup\Entity\MailGroup; use Drupal\Core\StringTranslation\TranslatableMarkup; /** * Implements hook_preprocess_HOOK(). Loading Loading @@ -55,6 +55,20 @@ function mailgroup_entity_delete(EntityInterface $entity) { } } /** * Implements hook_entity_extra_field_info(). */ function mailgroup_entity_extra_field_info() { $fields['user']['user']['display']['mailgroup_memberships'] = [ 'label' => new TranslatableMarkup('Mail Group Memberships'), 'description' => new TranslatableMarkup("The User's Mail Group Memberships."), 'visible' => FALSE, 'weight' => 0, ]; return $fields; } /** * Implements hook_mail(). */ Loading Loading @@ -86,6 +100,18 @@ function mailgroup_theme() { 'render element' => 'elements', 'template' => 'mailgroup', ], 'mailgroup_membership_list' => [ 'variables' => [ 'memberships' => [], ], ], 'mailgroup_membership_list_item' => [ 'variables' => [ 'label' => NULL, 'status' => NULL, 'url' => NULL, ], ], ]; } Loading @@ -106,6 +132,54 @@ function mailgroup_theme_suggestions_mailgroup(array $variables) { return $suggestions; } /** * Implements hook_views_data_alter(). */ function mailgroup_views_data_alter(array &$data) { $data['users']['mailgroup_memberships'] = [ 'field' => [ 'id' => 'mailgroup_memberships', 'real field' => 'uid', 'title' => new TranslatableMarkup('Mail Group Memberships'), 'help' => new TranslatableMarkup("The User's Mail Group Memberships."), ], ]; } /** * Implements hook_ENTITY_TYPE_view(). */ function mailgroup_user_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) { if ($display->getComponent('mailgroup_memberships')) { $current_user = \Drupal::currentUser(); $is_manager = $current_user->hasPermission('administer mail groups'); $is_view_allowed = $current_user->hasPermission('view mail groups'); $is_owner_allowed = ($entity->id() === $current_user->id() && $current_user->hasPermission('view own mail group memberships')); if ($is_manager || $is_owner_allowed || $is_view_allowed) { /** @var \Drupal\mailgroup\Entity\Storage\MailGroupMembershipStorageInterface $storage */ $storage = \Drupal::entityTypeManager()->getStorage('mailgroup_membership'); $memberships = $storage->loadByUid($entity->id(), NULL, FALSE); foreach ($memberships as $id => $membership) { $memberships[$id] = [ '#theme' => 'mailgroup_membership_list_item', '#label' => $membership->getGroup()->label(), '#status' => $membership->isActive(), '#url' => ($is_manager || $is_view_allowed) ? $membership->toUrl('collection')->toString() : NULL, ]; } $build['mailgroup_memberships'] = [ '#theme' => 'mailgroup_membership_list', '#memberships' => $memberships, ]; } } } /** * Prepares variables for mail group templates. * Loading mailgroup.permissions.yml +7 −0 Original line number Diff line number Diff line administer mail groups: title: 'Administer mail groups' restrict access: true add mail groups: title: 'Create new mail groups' edit mail groups: title: 'Edit mail groups' delete mail groups: title: 'Delete mail groups' view mail groups: title: 'View mail groups' view own mail group memberships: title: 'View own mail group memberships' src/Plugin/views/field/MailGroupMemberships.php 0 → 100644 +123 −0 Original line number Diff line number Diff line <?php namespace Drupal\mailgroup\Plugin\views\field; use Drupal\Core\Render\RendererInterface; use Drupal\Core\Session\AccountProxyInterface; use Drupal\mailgroup\Entity\Storage\MailGroupMembershipStorageInterface; use Drupal\views\Plugin\views\field\PrerenderList; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Provides the Mail Group Memberships of the User. * * @ingroup views_field_handlers * * @ViewsField("mailgroup_memberships") */ class MailGroupMemberships extends PrerenderList { /** * The current User. * * @var \Drupal\Core\Session\AccountProxyInterface */ protected $currentUser; /** * The Mail Group Membership storage. * * @var \Drupal\mailgroup\Entity\Storage\MailGroupMembershipStorageInterface */ protected $mailGroupMembershipStorage; /** * The renderer. * * @var \Drupal\Core\Render\RendererInterface */ protected $renderer; /** * Constructor. * * @param array $configuration * A configuration array containing information about the plugin instance. * @param string $plugin_id * The plugin_id for the plugin instance. * @param mixed $plugin_definition * The plugin implementation definition. * @param \Drupal\Core\Session\AccountProxyInterface $account * The current User. * @param \Drupal\mailgroup\Entity\Storage\MailGroupMembershipStorageInterface $mailgroup_membership_storage * The Mail Group Membership storage. * @param \Drupal\Core\Render\RendererInterface $renderer * The renderer. */ public function __construct( array $configuration, $plugin_id, $plugin_definition, AccountProxyInterface $account, MailGroupMembershipStorageInterface $mailgroup_membership_storage, RendererInterface $renderer ) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->currentUser = $account; $this->mailGroupMembershipStorage = $mailgroup_membership_storage; $this->renderer = $renderer; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { return new static( $configuration, $plugin_id, $plugin_definition, $container->get('current_user'), $container->get('entity_type.manager')->getStorage('mailgroup_membership'), $container->get('renderer') ); } /** * {@inheritdoc} */ public function preRender(&$values) { $has_administer = $this->currentUser->hasPermission('administer mail groups'); $has_view = $this->currentUser->hasPermission('view mail groups'); if ($has_administer || $has_view) { $uids = []; foreach ($values as $result) { $uids[] = $result->{$this->field_alias}; } $memberships = $this->mailGroupMembershipStorage->loadByUids($uids, NULL, FALSE); foreach ($memberships as $membership) { $build = [ '#theme' => 'mailgroup_membership_list_item', '#label' => $membership->getGroup()->label(), '#status' => $membership->isActive(), '#url' => $membership->toUrl('collection')->toString(), ]; $this->items[$membership->getOwnerId()][]['mailgroup_membership'] = $this->renderer->render($build); } } } /** * {@inheritdoc} */ public function render_item($count, $item) { return $item['mailgroup_membership']; } } templates/mailgroup-membership-list-item.html.twig 0 → 100644 +25 −0 Original line number Diff line number Diff line {# /** * @file mailgroup-membership-list-item.html.twig * Default theme implementation to present a User's Mail Group Membership. * * Available variables: * - label: The Mail Group label * - status: The Membership status (TRUE or FALSE). * - url: The url of the Mail Group members overview. * * @see template_preprocess_mailgroup() * * @ingroup themeable */ #} {% apply spaceless %} {% if url is not null %} <a href="{{ url }}" title="{{ 'View @group'|t({'@group': label}) }}" target="_blank">{{ label }}</a> {% else %} {{ label }} {% endif %} ({{ status == true ? 'Active'|t : 'Inactive'|t }}) {% endapply %} templates/mailgroup-membership-list.html.twig 0 → 100644 +24 −0 Original line number Diff line number Diff line {# /** * @file mailgroup-membership-list.html.twig * Default theme implementation to present a User's Mail Group Membership list. * * Available variables: * - memberships: An array of the User's Mail Group Memberships. * * @see template_preprocess_mailgroup() * * @ingroup themeable */ #} {% apply spaceless %} <h4 class="label">{{ 'Mail Group Memberships'|t }}</h4> {% if memberships is not empty %} <ul> {% for member in memberships %} <li>{{ member }}</li> {% endfor %} </ul> {% endif %} {% endapply %} Loading
mailgroup.module +75 −1 Original line number Diff line number Diff line Loading @@ -9,7 +9,7 @@ use Drupal\Component\Utility\Html; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityStorageException; use Drupal\Core\Render\Element; use Drupal\mailgroup\Entity\MailGroup; use Drupal\Core\StringTranslation\TranslatableMarkup; /** * Implements hook_preprocess_HOOK(). Loading Loading @@ -55,6 +55,20 @@ function mailgroup_entity_delete(EntityInterface $entity) { } } /** * Implements hook_entity_extra_field_info(). */ function mailgroup_entity_extra_field_info() { $fields['user']['user']['display']['mailgroup_memberships'] = [ 'label' => new TranslatableMarkup('Mail Group Memberships'), 'description' => new TranslatableMarkup("The User's Mail Group Memberships."), 'visible' => FALSE, 'weight' => 0, ]; return $fields; } /** * Implements hook_mail(). */ Loading Loading @@ -86,6 +100,18 @@ function mailgroup_theme() { 'render element' => 'elements', 'template' => 'mailgroup', ], 'mailgroup_membership_list' => [ 'variables' => [ 'memberships' => [], ], ], 'mailgroup_membership_list_item' => [ 'variables' => [ 'label' => NULL, 'status' => NULL, 'url' => NULL, ], ], ]; } Loading @@ -106,6 +132,54 @@ function mailgroup_theme_suggestions_mailgroup(array $variables) { return $suggestions; } /** * Implements hook_views_data_alter(). */ function mailgroup_views_data_alter(array &$data) { $data['users']['mailgroup_memberships'] = [ 'field' => [ 'id' => 'mailgroup_memberships', 'real field' => 'uid', 'title' => new TranslatableMarkup('Mail Group Memberships'), 'help' => new TranslatableMarkup("The User's Mail Group Memberships."), ], ]; } /** * Implements hook_ENTITY_TYPE_view(). */ function mailgroup_user_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) { if ($display->getComponent('mailgroup_memberships')) { $current_user = \Drupal::currentUser(); $is_manager = $current_user->hasPermission('administer mail groups'); $is_view_allowed = $current_user->hasPermission('view mail groups'); $is_owner_allowed = ($entity->id() === $current_user->id() && $current_user->hasPermission('view own mail group memberships')); if ($is_manager || $is_owner_allowed || $is_view_allowed) { /** @var \Drupal\mailgroup\Entity\Storage\MailGroupMembershipStorageInterface $storage */ $storage = \Drupal::entityTypeManager()->getStorage('mailgroup_membership'); $memberships = $storage->loadByUid($entity->id(), NULL, FALSE); foreach ($memberships as $id => $membership) { $memberships[$id] = [ '#theme' => 'mailgroup_membership_list_item', '#label' => $membership->getGroup()->label(), '#status' => $membership->isActive(), '#url' => ($is_manager || $is_view_allowed) ? $membership->toUrl('collection')->toString() : NULL, ]; } $build['mailgroup_memberships'] = [ '#theme' => 'mailgroup_membership_list', '#memberships' => $memberships, ]; } } } /** * Prepares variables for mail group templates. * Loading
mailgroup.permissions.yml +7 −0 Original line number Diff line number Diff line administer mail groups: title: 'Administer mail groups' restrict access: true add mail groups: title: 'Create new mail groups' edit mail groups: title: 'Edit mail groups' delete mail groups: title: 'Delete mail groups' view mail groups: title: 'View mail groups' view own mail group memberships: title: 'View own mail group memberships'
src/Plugin/views/field/MailGroupMemberships.php 0 → 100644 +123 −0 Original line number Diff line number Diff line <?php namespace Drupal\mailgroup\Plugin\views\field; use Drupal\Core\Render\RendererInterface; use Drupal\Core\Session\AccountProxyInterface; use Drupal\mailgroup\Entity\Storage\MailGroupMembershipStorageInterface; use Drupal\views\Plugin\views\field\PrerenderList; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Provides the Mail Group Memberships of the User. * * @ingroup views_field_handlers * * @ViewsField("mailgroup_memberships") */ class MailGroupMemberships extends PrerenderList { /** * The current User. * * @var \Drupal\Core\Session\AccountProxyInterface */ protected $currentUser; /** * The Mail Group Membership storage. * * @var \Drupal\mailgroup\Entity\Storage\MailGroupMembershipStorageInterface */ protected $mailGroupMembershipStorage; /** * The renderer. * * @var \Drupal\Core\Render\RendererInterface */ protected $renderer; /** * Constructor. * * @param array $configuration * A configuration array containing information about the plugin instance. * @param string $plugin_id * The plugin_id for the plugin instance. * @param mixed $plugin_definition * The plugin implementation definition. * @param \Drupal\Core\Session\AccountProxyInterface $account * The current User. * @param \Drupal\mailgroup\Entity\Storage\MailGroupMembershipStorageInterface $mailgroup_membership_storage * The Mail Group Membership storage. * @param \Drupal\Core\Render\RendererInterface $renderer * The renderer. */ public function __construct( array $configuration, $plugin_id, $plugin_definition, AccountProxyInterface $account, MailGroupMembershipStorageInterface $mailgroup_membership_storage, RendererInterface $renderer ) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->currentUser = $account; $this->mailGroupMembershipStorage = $mailgroup_membership_storage; $this->renderer = $renderer; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { return new static( $configuration, $plugin_id, $plugin_definition, $container->get('current_user'), $container->get('entity_type.manager')->getStorage('mailgroup_membership'), $container->get('renderer') ); } /** * {@inheritdoc} */ public function preRender(&$values) { $has_administer = $this->currentUser->hasPermission('administer mail groups'); $has_view = $this->currentUser->hasPermission('view mail groups'); if ($has_administer || $has_view) { $uids = []; foreach ($values as $result) { $uids[] = $result->{$this->field_alias}; } $memberships = $this->mailGroupMembershipStorage->loadByUids($uids, NULL, FALSE); foreach ($memberships as $membership) { $build = [ '#theme' => 'mailgroup_membership_list_item', '#label' => $membership->getGroup()->label(), '#status' => $membership->isActive(), '#url' => $membership->toUrl('collection')->toString(), ]; $this->items[$membership->getOwnerId()][]['mailgroup_membership'] = $this->renderer->render($build); } } } /** * {@inheritdoc} */ public function render_item($count, $item) { return $item['mailgroup_membership']; } }
templates/mailgroup-membership-list-item.html.twig 0 → 100644 +25 −0 Original line number Diff line number Diff line {# /** * @file mailgroup-membership-list-item.html.twig * Default theme implementation to present a User's Mail Group Membership. * * Available variables: * - label: The Mail Group label * - status: The Membership status (TRUE or FALSE). * - url: The url of the Mail Group members overview. * * @see template_preprocess_mailgroup() * * @ingroup themeable */ #} {% apply spaceless %} {% if url is not null %} <a href="{{ url }}" title="{{ 'View @group'|t({'@group': label}) }}" target="_blank">{{ label }}</a> {% else %} {{ label }} {% endif %} ({{ status == true ? 'Active'|t : 'Inactive'|t }}) {% endapply %}
templates/mailgroup-membership-list.html.twig 0 → 100644 +24 −0 Original line number Diff line number Diff line {# /** * @file mailgroup-membership-list.html.twig * Default theme implementation to present a User's Mail Group Membership list. * * Available variables: * - memberships: An array of the User's Mail Group Memberships. * * @see template_preprocess_mailgroup() * * @ingroup themeable */ #} {% apply spaceless %} <h4 class="label">{{ 'Mail Group Memberships'|t }}</h4> {% if memberships is not empty %} <ul> {% for member in memberships %} <li>{{ member }}</li> {% endfor %} </ul> {% endif %} {% endapply %}