You are here

media_directories_ui.module in Media Directories 3.x

Main module file.

File

modules/media_directories_ui/media_directories_ui.module
View source
<?php

/**
 * @file
 * Main module file.
 */
use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Drupal\media\MediaTypeForm;
use Drupal\views\Form\ViewsForm;
use Drupal\views\Plugin\views\cache\CachePluginBase;
use Drupal\views\ViewExecutable;

/**
 * Implements hook_theme().
 */
function media_directories_ui_theme($existing, $type, $theme, $path) {
  return [
    'media_directories_browser' => [
      'render element' => 'browser',
    ],
    'media_directories_tree' => [
      'render element' => 'content',
    ],
    'media_directories_add' => [
      'render element' => 'content',
    ],
    'views_view__media_directories_library' => [
      'base hook' => 'views_view',
      'template' => 'views-view--media-directories-library',
    ],
  ];
}

/**
 * Implements hook_preprocess_views_view_fields().
 */
function media_directories_ui_preprocess_views_view_fields(&$variables) {

  // Add classes to media rendered entity field so it can be targeted for
  // styling and JavaScript mouseover and click events.
  if ($variables['view']
    ->id() === 'media_directories_library' && isset($variables['fields']['rendered_entity'])) {
    if (isset($variables['fields']['rendered_entity']->wrapper_attributes)) {
      $variables['fields']['rendered_entity']->wrapper_attributes
        ->addClass('js-click-to-select-trigger media-library-item__click-to-select-trigger');
    }
  }
}

/**
 * Implements hook_form_alter().
 */
function media_directories_ui_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
  $form_object = $form_state
    ->getFormObject();
  if ($form_object instanceof ViewsForm && strpos($form_object
    ->getBaseFormId(), 'views_form_media_directories_library') === 0) {
    $form['#attributes']['class'][] = 'media-library-views-form';
    if (isset($form['header'])) {
      $form['header']['#attributes']['class'][] = 'media-library-views-form__header';
      $form['header']['media_bulk_form']['#attributes']['class'][] = 'media-library-views-form__bulk_form';
    }
    $form['actions']['submit']['#ajax']['url'] = Url::fromRoute('media_directories_library.ui');
  }

  // Add after build to fix media library views exposed filter's submit button.
  if ($form_id === 'views_exposed_form' && strpos($form['#id'], 'views-exposed-form-media-directories-library-widget') === 0) {
    $form['#after_build'][] = '_media_library_views_form_media_library_after_build';
  }

  // Configures media_library displays when a type is submitted.
  if ($form_object instanceof MediaTypeForm) {
    $form['actions']['submit']['#submit'][] = '_media_library_media_type_form_submit';
  }
}

/**
 * Implements hook_preprocess_HOOK().
 */
function media_directories_ui_preprocess_views_view__media_directories_library(&$variables) {

  /** @var \Drupal\views\ViewExecutable $view */
  $view = $variables['view'];
  if ($view->current_display === 'widget') {
    $state = \Drupal\media_directories_ui\MediaDirectoriesLibraryState::fromRequest($view
      ->getRequest());

    // These could cause issues.
    $state
      ->remove('destination');
    $state
      ->remove('ajax_form');
    $state
      ->remove('_wrapper_format');

    // Remove rebuild key from state, this will cause issues.
    // If this is present, upload form will ignore form submits.
    $state
      ->remove('_media_library_form_rebuild');
    $variables['upload_link'] = [
      '#type' => 'link',
      '#title' => t('Upload media'),
      '#url' => Url::fromRoute('media_directories_ui.media.add', [], [
        'query' => $state
          ->all(),
      ]),
      '#attributes' => [
        'class' => [
          'button',
          'use-ajax',
        ],
      ],
    ];
  }
}

/**
 * Implements hook_views_post_render().
 */
function media_directories_ui_views_post_render(ViewExecutable $view, &$output, CachePluginBase $cache) {
  if ($view
    ->id() === 'media_directories_library') {
    $output['#attached']['library'][] = 'media_library/view';
    if (strpos($view->current_display, 'widget') === 0) {
      try {
        $query = \Drupal\media_directories_ui\MediaDirectoriesLibraryState::fromRequest($view
          ->getRequest())
          ->all();
      } catch (InvalidArgumentException $e) {

        // MediaLibraryState::fromRequest() will throw an exception if the view
        // is being previewed, since not all required query parameters will be
        // present. In a preview, however, this can be omitted since we're
        // merely previewing.
        // @todo Use the views API for checking for the preview mode when it
        //   lands. https://www.drupal.org/project/drupal/issues/3060855
        if (empty($view->preview) && empty($view->live_preview)) {
          throw $e;
        }
      }

      // If the current query contains any parameters we use to contextually
      // filter the view, ensure they persist across AJAX rebuilds.
      // The ajax_path is shared for all AJAX views on the page, but our query
      // parameters are prefixed and should not interfere with any other views.
      // @todo Rework or remove this in https://www.drupal.org/node/2983451
      if (!empty($query)) {
        $ajax_path =& $output['#attached']['drupalSettings']['views']['ajax_path'];
        $parsed_url = UrlHelper::parse($ajax_path);
        $query = array_merge($query, $parsed_url['query']);
        $ajax_path = $parsed_url['path'] . '?' . UrlHelper::buildQuery($query);
      }
    }
  }
}