Commit c6ccb0b0 authored by Andreas De Rijcke's avatar Andreas De Rijcke
Browse files

Issue #3284884 Added extra User display and Views field showing Mail Group memberships.

parent 0f9e36ec
Loading
Loading
Loading
Loading
+75 −1
Original line number Diff line number Diff line
@@ -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().
@@ -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().
 */
@@ -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,
      ],
    ],
  ];
}

@@ -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.
 *
+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'
+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'];
  }

}
+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 %}
+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 %}