onlyoffice_docspace-1.1.0/src/Form/OODSPUserListBuilder.php

src/Form/OODSPUserListBuilder.php
<?php

namespace Drupal\onlyoffice_docspace\Form;

/**
 * Copyright (c) Ascensio System SIA 2024.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Datetime\DateFormatterInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Extension\ModuleExtensionList;
use Drupal\Core\Routing\RedirectDestinationInterface;
use Drupal\Core\Utility\TableSort;
use Drupal\onlyoffice_docspace\Manager\RequestManager\RequestManagerInterface;
use Drupal\onlyoffice_docspace\Manager\SecurityManager\SecurityManagerInterface;
use Drupal\user\UserListBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Defines a class to build a listing of user entities.
 *
 * @see \Drupal\user\Entity\User
 */
class OODSPUserListBuilder extends UserListBuilder {

  /**
   * Is connected to ONLYOFFICE DocSpace.
   *
   * @var bool
   */
  private $isConnectedToDocSpace = FALSE;

  /**
   * List ONLYOFFICE DocSpace Users.
   *
   * @var array
   */
  private $listDocSpaceUsers = [];

  /**
   * The ONLYOFFICE DocSpace request manager.
   *
   * @var \Drupal\onlyoffice_docspace\Manager\RequestManager\RequestManagerInterface
   */
  protected $requestManager;

  /**
   * The ONLYOFFICE DocSpace security manager.
   *
   * @var \Drupal\onlyoffice_docspace\Manager\SecurityManager\SecurityManagerInterface
   */
  protected $securityManager;

  /**
   * The list of available modules.
   *
   * @var \Drupal\Core\Extension\ModuleExtensionList
   */
  protected $extensionListModule;

  /**
   * The factory for configuration objects.
   *
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  protected $configFactory;

  /**
   * Constructs a new OODSPUserListBuilder object.
   *
   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
   *   The entity type definition.
   * @param \Drupal\Core\Entity\EntityStorageInterface $storage
   *   The entity storage class.
   * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter
   *   The date formatter service.
   * @param \Drupal\Core\Routing\RedirectDestinationInterface $redirect_destination
   *   The redirect destination service.
   * @param \Drupal\onlyoffice_docspace\Manager\RequestManager\RequestManagerInterface $request_manager
   *   The ONLYOFFICE DocSpace request manager.
   * @param \Drupal\onlyoffice_docspace\Manager\SecurityManager\SecurityManagerInterface $security_manager
   *   The ONLYOFFICE DocSpace security manager.
   * @param \Drupal\Core\Extension\ModuleExtensionList $extension_list_module
   *   The module extension list.
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   The factory for configuration objects.
   */
  public function __construct(
    EntityTypeInterface $entity_type,
    EntityStorageInterface $storage,
    DateFormatterInterface $date_formatter,
    RedirectDestinationInterface $redirect_destination,
    RequestManagerInterface $request_manager,
    SecurityManagerInterface $security_manager,
    ModuleExtensionList $extension_list_module,
    ConfigFactoryInterface $config_factory
  ) {
    parent::__construct($entity_type, $storage, $date_formatter, $redirect_destination);

    $this->requestManager = $request_manager;
    $this->securityManager = $security_manager;
    $this->extensionListModule = $extension_list_module;
    $this->configFactory = $config_factory;
  }

  /**
   * {@inheritdoc}
   */
  public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
    return new static(
      $entity_type,
      $container->get('entity_type.manager')->getStorage($entity_type->id()),
      $container->get('date.formatter'),
      $container->get('redirect.destination'),
      $container->get('onlyoffice_docspace.request_manager'),
      $container->get('onlyoffice_docspace.security_manager'),
      $container->get('extension.list.module'),
      $container->get('config.factory')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function load() {
    $entity_query = $this->storage->getQuery();
    $entity_query->accessCheck(TRUE);
    $entity_query->condition('uid', 0, '<>');
    $entity_query->condition('mail', NULL, 'IS NOT NULL');

    try {
      $settins_view_user_admin_people = $this->configFactory->get('views.view.user_admin_people');
      if ($settins_view_user_admin_people) {
        $display = $settins_view_user_admin_people->get('display');
        $items_per_page = ($display['default']['display_options']['pager']['options']['items_per_page']);

        if (!empty($items_per_page)) {
          $entity_query->pager($items_per_page);
        }
      }
    }
    catch (\Exception $e) {

    }

    \Drupal::logger('locale')->error("148-t");

    $header = $this->buildHeader();

    if (TableSort::getOrder($header, \Drupal::request())['name'] != $header['docspace_user_status']['data']) {
      $entity_query->tableSort($header);
    }

    $uids = $entity_query->execute();

    $entities = $this->storage->loadMultiple($uids);
    $entities = $this->loadDocSpaceInfo($entities);

    if (TableSort::getOrder($header, \Drupal::request())['name'] == $header['docspace_user_status']['data']) {
      \Drupal::logger('locale')->error("15-t");
      $this->sortByDocSpaceUserStatus($entities, TableSort::getSort($header, \Drupal::request()));
    }

    return $entities;
  }

  /**
   * {@inheritdoc}
   */
  public function buildHeader() {
    $header = parent::buildHeader();

    unset($header['member_for']);
    unset($header['access']);
    unset($header['operations']);

    $header['docspace_user_status'] = [
      'data' => $this->t('DocSpace User Status'),
      'field' => 'docspace_user_status',
      'specifier' => 'docspace_user_status',
      'class' => [RESPONSIVE_PRIORITY_LOW],
    ];

    $header['docspace_user_type'] = [
      'data' => $this->t('DocSpace User Type'),
      'class' => [RESPONSIVE_PRIORITY_LOW],
    ];

    return $header;
  }

  /**
   * {@inheritdoc}
   */
  public function buildRow(EntityInterface $entity) {
    $row = parent::buildRow($entity);

    unset($row['member_for']);
    unset($row['access']);
    unset($row['operations']);

    $status = $row['status'];
    $row['status'] = [];
    $row['status']['data']['#markup'] = $status;

    if ($entity->docspaceStatus === 0
        || $entity->docspaceStatus === 1
        || $entity->docspaceStatus === 2) {
      $row['docspace_user_status']['data'] = [
        '#type' => 'html_tag',
        '#tag' => 'img',
        '#attributes' => [
          'src' => '/' . $this->extensionListModule->getPath('onlyoffice_docspace') . '/images/done.svg',
        ],
      ];
    }
    elseif ($entity->docspaceStatus === -1) {
      $row['docspace_user_status']['data'] = [
        '#type' => 'html_tag',
        '#tag' => 'div',
        '#attributes' => [
          'class' => ['tooltip'],
        ],
        'tooltip' => [
          '#type' => 'html_tag',
          '#tag' => 'div',
          '#value' => $this->getLabelForUnauthorized(),
          '#attributes' => [
            'class' => ['tooltip-message'],
          ],
        ],
        'status' => [
          '#type' => 'html_tag',
          '#tag' => 'img',
          '#attributes' => [
            'src' => '/' . $this->extensionListModule->getPath('onlyoffice_docspace') . '/images/not_authorization.svg',
          ],
        ],
      ];
    }
    else {
      $row['docspace_user_status']['data']['#markup'] = '';
    }

    $row['docspace_user_type']['data']['#markup'] = $entity->docspaceRole;

    return $row;
  }

  /**
   * {@inheritdoc}
   */
  public function render() {
    $build = parent::render();
    $build['onlyoffice_docspace_users'] = $build['table'];
    $build['onlyoffice_docspace_users']['#tableselect'] = TRUE;

    foreach ($build['onlyoffice_docspace_users']['#rows'] as $key => $value) {
      $build['onlyoffice_docspace_users'][$key] = $value;
    }

    unset($build['onlyoffice_docspace_users']['#rows']);
    unset($build['table']);
    unset($build['pager']);

    return $build;
  }

  /**
   * Load users from ONLYOFFICE DocSpace.
   *
   * @param \Drupal\Core\Entity\EntityInterface[] $entities
   *   The user entities.
   */
  private function loadDocSpaceInfo(array $entities) {
    $responseDocSpaceUsers = $this->requestManager->getDocSpaceUsers();

    if (!$responseDocSpaceUsers['error']) {
      $this->listDocSpaceUsers = $responseDocSpaceUsers['data'];
      $this->isConnectedToDocSpace = TRUE;

      foreach ($entities as $entity) {
        $entity->docspaceStatus = -2;
        $entity->docspaceRole = '';

        $countDocSpaceUsers = count($this->listDocSpaceUsers);

        for ($t = 0; $t < $countDocSpaceUsers; $t++) {
          if ($this->listDocSpaceUsers[$t]['email'] === $entity->getEmail()) {
            $entity->docspaceStatus = $this->listDocSpaceUsers[$t]['activationStatus'];
            $entity->docspaceRole = $this->getDocSpaceUserRoleLabel($this->listDocSpaceUsers[$t]);

            if ($entity->docspaceStatus === 0
                || $entity->docspaceStatus === 1
                || $entity->docspaceStatus === 2) {
              $userPass = $this->securityManager->getPasswordHash($entity->id());

              if (empty($userPass)) {
                $entity->docspaceStatus = -1;
              }
            }
          }
        }
      }
    }

    return $entities;
  }

  /**
   * Sort user entities by DocSpace user status.
   *
   * @param \Drupal\Core\Entity\EntityInterface[] $entities
   *   The user entities.
   * @param string $order
   *   Can be ASC or DESC.
   */
  private function sortByDocSpaceUserStatus(&$entities, $order) {
    usort(
      $entities,
      function ($a, $b) use ($order) {
        if ($a->docspaceStatus === $b->docspaceStatus) {
          return 0;
        }
        if (empty($order) || 'ASC' === strtoupper($order)) {
          return ($a->docspaceStatus > $b->docspaceStatus) ? -1 : 1;
        }
        else {
          return ($a->docspaceStatus < $b->docspaceStatus) ? -1 : 1;
        }
      }
    );
  }

  /**
   * Return label for role ONLYOFFICE DocSpace user.
   *
   * @param string $user
   *   The ONLYOFFICE DocSpace user.
   */
  private function getDocSpaceUserRoleLabel($user) {
    if ($user['isOwner']) {
      return $this->t('Owner');
    }
    elseif ($user['isAdmin']) {
      return $this->t('DocSpace admin');
    }
    elseif ($user['isCollaborator']) {
      return $this->t('Power user');
    }
    elseif ($user['isVisitor']) {
      return $this->t('User');
    }
    else {
      return $this->t('Room admin');
    }
  }

  /**
   * Return label tooltip for unauthorized users.
   */
  private function getLabelForUnauthorized() {
    $output  = '<b>' . $this->t('Problem with the account synchronization between Drupal and ONLYOFFICE DocSpace') . '</b></br></br>';
    $output .= '<b>' . $this->t('Possible cause:') . '</b> ' . $this->t('DocSpace account was not created via the DocSpace plugin for Drupal') . '</br></br>';
    $output .= $this->t('Seamless login is unavailable. Users will need to login into DocSpace to have access to the plugin.');

    return $output;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc