You are here

public function YamlFormUiElementTypeSelectForm::buildForm in YAML Form 8

Form constructor.

Parameters

array $form: An associative array containing the structure of the form.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Return value

array The form structure.

Overrides FormInterface::buildForm

File

modules/yamlform_ui/src/Form/YamlFormUiElementTypeSelectForm.php, line 25

Class

YamlFormUiElementTypeSelectForm
Provides a select element type form for a form element.

Namespace

Drupal\yamlform_ui\Form

Code

public function buildForm(array $form, FormStateInterface $form_state, YamlFormInterface $yamlform = NULL) {
  $parent = $this
    ->getRequest()->query
    ->get('parent');
  $headers = [
    [
      'data' => $this
        ->t('Element'),
    ],
    [
      'data' => $this
        ->t('Category'),
    ],
    [
      'data' => $this
        ->t('Operations'),
    ],
  ];
  $elements = $this->elementManager
    ->getInstances();
  $definitions = $this
    ->getDefinitions();
  $rows = [];
  foreach ($definitions as $plugin_id => $plugin_definition) {

    /** @var \Drupal\yamlform\YamlFormElementInterface $yamlform_element */
    $yamlform_element = $elements[$plugin_id];

    // Skip disabled or hidden plugins.
    if ($yamlform_element
      ->isDisabled() || $yamlform_element
      ->isHidden()) {
      continue;
    }

    // Skip wizard page which has a dedicated URL.
    if ($plugin_id == 'yamlform_wizard_page') {
      continue;
    }
    $route_parameters = [
      'yamlform' => $yamlform
        ->id(),
      'type' => $plugin_id,
    ];
    $route_options = $parent ? [
      'query' => [
        'parent' => $parent,
      ],
    ] : [];
    $row = [];
    $row['title']['data'] = [
      '#type' => 'inline_template',
      '#template' => '<div class="yamlform-form-filter-text-source">{{ label }}</div>',
      '#context' => [
        'label' => $plugin_definition['label'],
      ],
    ];
    $row['category']['data'] = $plugin_definition['category'];
    $row['operations']['data'] = [
      '#type' => 'operations',
      '#links' => [
        'add' => [
          'title' => $this
            ->t('Add element'),
          'url' => Url::fromRoute('entity.yamlform_ui.element.add_form', $route_parameters, $route_options),
          'attributes' => YamlFormDialogHelper::getModalDialogAttributes(800),
        ],
      ],
    ];

    // Issue #2741877 Nested modals don't work: when using CKEditor in a
    // modal, then clicking the image button opens another modal,
    // which closes the original modal.
    // @todo Remove the below workaround once this issue is resolved.
    if ($yamlform_element
      ->getPluginId() == 'processed_text') {
      unset($row['operations']['data']['#links']['add']['attributes']);
    }
    $rows[] = $row;
  }
  $form['#attached']['library'][] = 'yamlform/yamlform.form';
  $form['filter'] = [
    '#type' => 'search',
    '#title' => $this
      ->t('Filter'),
    '#title_display' => 'invisible',
    '#size' => 30,
    '#placeholder' => $this
      ->t('Filter by element name'),
    '#attributes' => [
      'class' => [
        'yamlform-form-filter-text',
      ],
      'data-element' => '.yamlform-ui-element-type-table',
      'title' => $this
        ->t('Enter a part of the element name to filter by.'),
      'autofocus' => 'autofocus',
    ],
  ];
  $form['elements'] = [
    '#type' => 'table',
    '#header' => $headers,
    '#rows' => $rows,
    '#empty' => $this
      ->t('No element available.'),
    '#attributes' => [
      'class' => [
        'yamlform-ui-element-type-table',
      ],
    ],
  ];
  return $form;
}