You are here

class MediaDirectoriesLibraryUiBuilder in Media Directories 3.x

Service which builds the media library.

Hierarchy

Expanded class hierarchy of MediaDirectoriesLibraryUiBuilder

2 files declare their use of MediaDirectoriesLibraryUiBuilder
MediaDirectoriesLibraryWidget.php in modules/media_directories_ui/src/Plugin/Field/FieldWidget/MediaDirectoriesLibraryWidget.php
OEmbedForm.php in modules/media_directories_ui/src/Form/OEmbedForm.php
1 string reference to 'MediaDirectoriesLibraryUiBuilder'
media_directories_ui.services.yml in modules/media_directories_ui/media_directories_ui.services.yml
modules/media_directories_ui/media_directories_ui.services.yml
1 service uses MediaDirectoriesLibraryUiBuilder
media_directories_ui.ui_builder in modules/media_directories_ui/media_directories_ui.services.yml
Drupal\media_directories_ui\MediaDirectoriesLibraryUiBuilder

File

modules/media_directories_ui/src/MediaDirectoriesLibraryUiBuilder.php, line 18

Namespace

Drupal\media_directories_ui
View source
class MediaDirectoriesLibraryUiBuilder extends MediaLibraryUiBuilder {

  /**
   * {@inheritdoc}
   */
  public function buildUi(MediaLibraryState $state = NULL) {
    if (!$state) {
      $state = MediaDirectoriesLibraryState::fromRequest($this->request);
    }

    // When navigating to a media type through the vertical tabs, we only want
    // to load the changed library content. This is not only more efficient, but
    // also provides a more accessible user experience for screen readers.
    if ($state
      ->get('media_library_content') === '1') {
      return $this
        ->buildLibraryContent($state);
    }
    else {
      return [
        '#type' => 'html_tag',
        '#tag' => 'div',
        '#attributes' => [
          'id' => 'media-library-wrapper',
          'class' => [
            'media-library-wrapper',
            'media-directories-library-wrapper',
          ],
        ],
        'tree' => $this
          ->buildMediaDirectoryTree($state),
        'content' => $this
          ->buildLibraryContent($state),
        // Attach the JavaScript for the media library UI. The number of
        // available slots needs to be added to make sure users can't select
        // more items than allowed.
        '#attached' => [
          'library' => [
            'media_library/ui',
            'media_directories_ui/media-ui',
          ],
          'drupalSettings' => [
            'media_library' => [
              'selection_remaining' => $state
                ->getAvailableSlots(),
            ],
            'media_directories' => [
              'cardinality' => $state
                ->getAvailableSlots(),
              // TODO migrate js code.
              'remaining' => $state
                ->getAvailableSlots(),
              'target_bundles' => $state
                ->getAllowedTypeIds(),
              'url' => [
                'directory.tree' => Url::fromRoute('media_directories_ui.directory.tree')
                  ->toString(),
                'directory.add' => Url::fromRoute('media_directories_ui.directory.add')
                  ->toString(),
                'directory.rename' => Url::fromRoute('media_directories_ui.directory.rename')
                  ->toString(),
                'directory.delete' => Url::fromRoute('media_directories_ui.directory.delete')
                  ->toString(),
                'directory.move' => Url::fromRoute('media_directories_ui.directory.move')
                  ->toString(),
                'media.add' => Url::fromRoute('media_directories_ui.media.add')
                  ->toString(),
                'media.edit' => Url::fromRoute('media_directories_ui.media.edit')
                  ->toString(),
                'media.move' => Url::fromRoute('media_directories_ui.media.move')
                  ->toString(),
                'media.delete' => Url::fromRoute('media_directories_ui.media.delete')
                  ->toString(),
              ],
            ],
          ],
        ],
      ];
    }
  }
  public function buildUploadUi(MediaLibraryState $state = NULL) {
    return $this
      ->buildLibraryUpload($state);
  }

  /**
   * {@inheritdoc}
   */
  protected function buildLibraryContent(MediaLibraryState $state) {
    return [
      '#type' => 'html_tag',
      '#tag' => 'div',
      '#attributes' => [
        'id' => 'media-library-content',
        'class' => [
          'media-library-content',
          'media-directories-library-content',
        ],
      ],
      'view' => $this
        ->buildMediaLibraryView($state),
    ];
  }
  protected function buildLibraryUpload(MediaLibraryState $state) {
    return [
      '#theme' => 'media_directories_add',
      'links' => $this
        ->buildMediaTypeMenu($state),
      'form' => $this
        ->buildMediaTypeAddForm($state),
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function checkAccess(AccountInterface $account, MediaLibraryState $state = NULL) {
    if (!$state) {
      try {
        $state = MediaDirectoriesLibraryState::fromRequest($this->request);
      } catch (BadRequestHttpException $e) {
        return AccessResult::forbidden($e
          ->getMessage());
      } catch (\InvalidArgumentException $e) {
        return AccessResult::forbidden($e
          ->getMessage());
      }
    }

    // We override state object with our own, other logic can be same.
    return parent::checkAccess($account, $state);
  }

  /**
   * Build directory tree container.
   *
   * @param \Drupal\media_library\MediaLibraryState $state
   *
   * @return array
   */
  protected function buildMediaDirectoryTree(MediaLibraryState $state) {
    return [
      '#theme' => 'media_directories_tree',
    ];
  }

  /**
   * {@inheritdoc}
   */
  protected function buildMediaTypeMenu(MediaLibraryState $state) {

    // Add the menu for each type if we have more than 1 media type enabled for
    // the field.
    $allowed_type_ids = $state
      ->getAllowedTypeIds();
    if (count($allowed_type_ids) <= 1) {
      return [];
    }

    // @todo: Add a class to the li element.
    //   https://www.drupal.org/project/drupal/issues/3029227
    $menu = [
      '#theme' => 'links',
      '#links' => [],
      '#attributes' => [
        'class' => [
          'media-library-menu',
          'js-media-library-menu',
        ],
      ],
    ];
    $allowed_types = $this->entityTypeManager
      ->getStorage('media_type')
      ->loadMultiple($allowed_type_ids);
    $selected_type_id = $state
      ->getSelectedTypeId();
    foreach ($allowed_types as $allowed_type_id => $allowed_type) {
      $link_state = MediaDirectoriesLibraryState::create($state
        ->getOpenerId(), $state
        ->getAllowedTypeIds(), $allowed_type_id, $state
        ->getAvailableSlots(), $state
        ->getOpenerParameters());

      // Add the 'media_library_content' parameter so the response will contain
      // only the updated content for the tab.
      // @see self::buildUi()
      $link_state
        ->set('media_library_content', 1);
      $title = $allowed_type
        ->label();
      $display_title = [
        '#markup' => $this
          ->t('<span class="visually-hidden">Show </span>@title<span class="visually-hidden"> media</span>', [
          '@title' => $title,
        ]),
      ];
      if ($allowed_type_id === $selected_type_id) {
        $display_title = [
          '#markup' => $this
            ->t('<span class="visually-hidden">Show </span>@title<span class="visually-hidden"> media</span><span class="active-tab visually-hidden"> (selected)</span>', [
            '@title' => $title,
          ]),
        ];
      }
      $menu['#links']['media-library-menu-' . $allowed_type_id] = [
        'title' => $display_title,
        'url' => Url::fromRoute('media_directories_ui.media.add', [], [
          'query' => $link_state
            ->all(),
        ]),
        'attributes' => [
          'class' => [
            'media-library-menu__link',
          ],
          'role' => 'button',
          'data-title' => $title,
        ],
      ];
    }

    // Set the active menu item.
    $menu['#links']['media-library-menu-' . $selected_type_id]['attributes']['class'][] = 'active';
    return $menu;
  }

  /**
   * {@inheritdoc}
   */
  protected function buildMediaTypeAddForm(MediaLibraryState $state) {
    $selected_type_id = $state
      ->getSelectedTypeId();
    if (!$this->entityTypeManager
      ->getAccessControlHandler('media')
      ->createAccess($selected_type_id)) {
      return [];
    }
    $selected_type = $this->entityTypeManager
      ->getStorage('media_type')
      ->load($selected_type_id);
    $plugin_definition = $selected_type
      ->getSource()
      ->getPluginDefinition();
    if (empty($plugin_definition['forms']['media_library_add'])) {
      return [];
    }
    $source_field = $selected_type
      ->getSource()
      ->getConfiguration()['source_field'];
    $field_config = $this->entityTypeManager
      ->getStorage('field_config')
      ->load('media.' . $selected_type
      ->id() . '.' . $source_field);

    // After the form to add new media is submitted, we need to rebuild the
    // media library with a new instance of the media add form. The form API
    // allows us to do that by forcing empty user input.
    // @see \Drupal\Core\Form\FormBuilder::doBuildForm()
    $form_state = new FormState();
    if ($state
      ->get('_media_library_form_rebuild')) {
      $form_state
        ->setUserInput([]);
      $state
        ->remove('_media_library_form_rebuild');
    }
    $form_state
      ->set('media_library_state', $state);
    if (in_array($field_config
      ->getType(), [
      'file',
      'image',
    ])) {
      $form = \Drupal::formBuilder()
        ->buildForm(FileUploadForm::class, $form_state);
    }
    else {
      $form = \Drupal::formBuilder()
        ->buildForm(OEmbedForm::class, $form_state);
    }
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  protected function buildMediaLibraryView(MediaLibraryState $state) {

    // @todo Make the view configurable in
    //   https://www.drupal.org/project/drupal/issues/2971209
    $view = $this->entityTypeManager
      ->getStorage('view')
      ->load('media_directories_library');
    $view_executable = $this->viewsExecutableFactory
      ->get($view);
    $display_id = 'widget';

    // Make sure the state parameters are set in the request so the view can
    // pass the parameters along in the pager, filters etc.
    $view_request = $view_executable
      ->getRequest();
    $view_request->query
      ->add($state
      ->all());
    $view_executable
      ->setRequest($view_request);
    $args = [];

    // Make sure the state parameters are set in the request so the view can
    // pass the parameters along in the pager, filters etc.
    $request = $view_executable
      ->getRequest();
    $request->query
      ->add($state
      ->all());
    $view_executable
      ->setRequest($request);
    $view_executable
      ->setDisplay($display_id);
    $view_executable
      ->preExecute($args);
    $view_executable
      ->execute($display_id);
    $renderable = $view_executable
      ->buildRenderable($display_id, $args, FALSE);
    return $renderable;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
MediaDirectoriesLibraryUiBuilder::buildLibraryContent protected function Build the media library content area. Overrides MediaLibraryUiBuilder::buildLibraryContent
MediaDirectoriesLibraryUiBuilder::buildLibraryUpload protected function
MediaDirectoriesLibraryUiBuilder::buildMediaDirectoryTree protected function Build directory tree container.
MediaDirectoriesLibraryUiBuilder::buildMediaLibraryView protected function Get the media library view. Overrides MediaLibraryUiBuilder::buildMediaLibraryView
MediaDirectoriesLibraryUiBuilder::buildMediaTypeAddForm protected function Get the add form for the selected media type. Overrides MediaLibraryUiBuilder::buildMediaTypeAddForm
MediaDirectoriesLibraryUiBuilder::buildMediaTypeMenu protected function Get the media type menu for the media library. Overrides MediaLibraryUiBuilder::buildMediaTypeMenu
MediaDirectoriesLibraryUiBuilder::buildUi public function Build the media library UI. Overrides MediaLibraryUiBuilder::buildUi
MediaDirectoriesLibraryUiBuilder::buildUploadUi public function
MediaDirectoriesLibraryUiBuilder::checkAccess public function Check access to the media library. Overrides MediaLibraryUiBuilder::checkAccess
MediaLibraryUiBuilder::$entityTypeManager protected property The entity type manager.
MediaLibraryUiBuilder::$formBuilder protected property The form builder.
MediaLibraryUiBuilder::$openerResolver protected property The media library opener resolver.
MediaLibraryUiBuilder::$request protected property The currently active request object.
MediaLibraryUiBuilder::$viewsExecutableFactory protected property The views executable factory.
MediaLibraryUiBuilder::dialogOptions public static function Get media library dialog options.
MediaLibraryUiBuilder::__construct public function Constructs a MediaLibraryUiBuilder instance.
StringTranslationTrait::$stringTranslation protected property The string translation service. 4
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.