You are here

InlineParagraphsBrowserWidgetTrait.php in Paragraphs Browser 8

Paragraphs Previewer widget trait implementation for paragraphs.

File

src/Plugin/Field/FieldWidget/InlineParagraphsBrowserWidgetTrait.php
View source
<?php

/**
 * @file
 * Paragraphs Previewer widget trait implementation for paragraphs.
 */
namespace Drupal\paragraphs_browser\Plugin\Field\FieldWidget;

use Drupal\Core\Url;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Field\FieldItemListInterface;

/**
 * Trait of Plugin implementation of the 'entity_reference paragraphs' widget.
 *
 * @var Trait
 * @see \Drupal\paragraphs_browser\Plugin\Field\FieldWidget\ParagraphsBrowserWidget
 * @see \Drupal\paragraphs_browser\Plugin\Field\FieldWidget\InlineParagraphsBrowserWidget
 */
trait InlineParagraphsBrowserWidgetTrait {

  /**
   * {@inheritdoc}
   */
  public static function defaultSettings() {
    $settings = parent::defaultSettings();
    $settings['paragraphs_browser'] = '_na';
    $settings['modal_width'] = '80%';
    $settings['modal_height'] = 'auto';
    return $settings;
  }
  public function settingsForm(array $form, FormStateInterface $form_state) {
    $elements = parent::settingsForm($form, $form_state);
    $elements['add_mode'] = array(
      '#type' => 'hidden',
      '#value' => 'paragraphs_browser',
    );
    $paragraph_storage = \Drupal::entityTypeManager()
      ->getStorage('paragraphs_browser_type');
    $paragraph_browsers = $paragraph_storage
      ->loadMultiple();
    $options = array(
      '_na' => 'No Groups',
    );
    foreach ($paragraph_browsers as $type) {
      $options[$type->id] = $type->label;
    }
    $elements['paragraphs_browser'] = array(
      '#type' => 'select',
      '#title' => $this
        ->t('Paragraphs Browser'),
      '#description' => $this
        ->t('Select which browser to use.'),
      '#options' => $options,
      '#default_value' => $this
        ->getSetting('paragraphs_browser'),
      '#required' => TRUE,
    );
    $elements['modal_width'] = array(
      '#type' => 'textfield',
      '#title' => $this
        ->t('Paragraphs Browser Modal Width'),
      '#description' => 'The width of the modal in px or percentage.',
      '#default_value' => $this
        ->getSetting('modal_width'),
      '#required' => FALSE,
    );
    $elements['modal_height'] = array(
      '#type' => 'textfield',
      '#title' => $this
        ->t('Paragraphs Browser Modal Height'),
      '#description' => 'The height of the modal in px or "auto".',
      '#default_value' => $this
        ->getSetting('modal_height'),
      '#required' => FALSE,
    );
    return $elements;
  }

  /**
   * {@inheritdoc}
   *
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {

    // Call parent function
    $element = parent::formElement($items, $delta, $element, $form, $form_state);

    // Add styles
    $form['#attached']['library'][] = 'paragraphs_browser/modal';
    $type = $element['#paragraph_type'];
    $current_title = $element['top']['paragraph_type_title']['info']['#markup'];

    // Get Paragraph group info
    $paragraph_types = \Drupal::entityTypeManager()
      ->getStorage('paragraphs_browser_type')
      ->loadMultiple();
    foreach ($paragraph_types as $paragraph_type) {
      $groups = $paragraph_type
        ->groupManager();
      $group_name = $paragraph_type
        ->getGroupMap($type);
      $group = $groups
        ->getGroup($group_name);
      if ($group) {
        $element['top']['paragraph_type_title']['info'] = array(
          '#markup' => $current_title,
        );
      }
    }
    return $element;
  }
  public function formMultipleElements(FieldItemListInterface $items, array &$form, FormStateInterface $form_state) {
    $elements = parent::formMultipleElements($items, $form, $form_state);

    // If the Paragraph browser hasn't been set, return un-modified form.
    if ($this
      ->getSetting('paragraphs_browser') == '_na') {
      return $elements;
    }

    //    $elements['add_more'] = array(
    //      '#type' => 'container',
    //      '#theme_wrappers' => array('paragraphs_dropbutton_wrapper'),
    //    );
    if (empty($this->uuid)) {
      $this->uuid = \Drupal::service('uuid')
        ->generate();
    }
    $elements['add_more']['add_more_select']['#attributes']['data-uuid'] = $this->uuid;
    $elements['add_more']['add_more_select']['#attributes']['class'][] = 'js-hide';
    $elements['add_more']['add_more_select']['#title_display'] = 'hidden';
    $elements['add_more']['add_more_button']['#attributes']['data-uuid'] = $this->uuid;
    $elements['add_more']['add_more_button']['#attributes']['class'][] = 'js-hide';
    unset($elements['add_more']['add_more_button']['#suffix']);
    unset($elements['add_more']['add_more_button']['#prefix']);
    $elements['#attached']['library'][] = 'paragraphs_browser/modal';
    $storage = $form_state
      ->getStorage();
    if (!$this->fieldDefinition
      ->isTranslatable() && isset($storage['content_translation'])) {
      unset($elements['add_more']);
    }
    else {
      $elements['add_more']['browse'] = array(
        '#type' => 'submit',
        '#value' => $this
          ->t('Add :title', [
          ':title' => $this
            ->getSetting('title'),
        ]),
        '#attributes' => [
          'class' => [
            'js-show',
          ],
        ],
        '#ajax' => [
          'url' => Url::fromRoute('paragraphs_browser.paragraphs_browser_controller', [
            'field_config' => implode('.', array(
              $items
                ->getEntity()
                ->getEntityTypeId(),
              $items
                ->getEntity()
                ->bundle(),
              $this->fieldDefinition
                ->getName(),
            )),
            'paragraphs_browser_type' => $this
              ->getSetting('paragraphs_browser'),
            'uuid' => $this->uuid,
          ]),
        ],
      );
    }
    if (isset($elements['#cardinality']) && $elements['#cardinality'] != -1) {
      $keyCount = count(array_filter(array_keys($elements), 'is_numeric'));
      if ($elements['#cardinality'] <= $keyCount) {
        unset($elements['add_more']);
      }
    }
    return $elements;
  }

}

Traits

Namesort descending Description
InlineParagraphsBrowserWidgetTrait Trait of Plugin implementation of the 'entity_reference paragraphs' widget.