argue-2.0.0-alpha4/modules/argue_proscons/src/Plugin/Field/FieldFormatter/AttachChangeRequestFormatter.php
modules/argue_proscons/src/Plugin/Field/FieldFormatter/AttachChangeRequestFormatter.php
<?php namespace Drupal\argue_proscons\Plugin\Field\FieldFormatter; use Drupal\argue_proscons\Entity\Argument; use Drupal\change_requests\Events\ChangeRequests; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\FormatterBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Link; use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\Core\Template\Attribute; use Drupal\Core\Url; /** * Plugin implementation of the 'attached_improvement_formatter' formatter. * * @FieldFormatter( * id = "attach_change_requests", * label = @Translation("Change requests"), * field_types = { * "entity_reference" * } * ) */ class AttachChangeRequestFormatter extends FormatterBase { /** * {@inheritdoc} */ public static function defaultSettings() { return [ 'display_modal' => TRUE, 'display_add_link' => TRUE, 'show_empty_field' => TRUE, ] + parent::defaultSettings(); } /** * {@inheritdoc} */ public function settingsForm(array $form, FormStateInterface $form_state) { $form = parent::settingsForm($form, $form_state); $form['display_add_link'] = [ '#type' => 'checkbox', '#title' => $this->t('Add link for a new patch.'), '#description' => $this->t("If checked an add link is displayed next to the field label."), '#default_value' => $this->getSetting('display_add_link'), ]; $form['display_modal'] = [ '#type' => 'checkbox', '#title' => $this->t('Display patch entity in modal dialog.'), '#description' => $this->t("If checked the linked patch entity will be load by ajax and displayed in a modal overlay."), '#default_value' => $this->getSetting('display_modal'), ]; $form['show_empty_field'] = [ '#type' => 'checkbox', '#title' => $this->t('Display empty field.'), '#description' => $this->t("Display field even when it is empty. (Recommended in combination with add link.)"), '#default_value' => $this->getSetting('show_empty_field'), ]; return $form; } /** * {@inheritdoc} */ public function settingsSummary() { $summary = []; $summary[] = t('Display add link: %add.', [ '%add' => ($this->getSetting('display_add_link')) ? $this->t('Yes') : $this->t('No'), ]); $summary[] = t('Display in modal dialog: %modal.', [ '%modal' => ($this->getSetting('display_modal')) ? $this->t('Yes') : $this->t('No'), ]); $summary[] = t('Display empty field: %empty.', [ '%empty' => ($this->getSetting('show_empty_field')) ? $this->t('Yes') : $this->t('No'), ]); return $summary; } /** * {@inheritdoc} */ public function view(FieldItemListInterface $items, $langcode = NULL) { $view = parent::view($items, $langcode); if ($this->getSetting('display_add_link')) { /** @var Argument $argument */ $argument = $items->getEntity(); $destination = [ 'entity_type' => $argument->getEntityTypeId(), 'entity_id' => $argument->id(), 'field' => $items->getFieldDefinition()->getName(), ]; $add_link = (\Drupal::currentUser()->hasPermission('add patch entities')) ? [ '#type' => 'link', '#title' => 'add_item', '#url' => Url::fromRoute('entity.node.edit_form', [ 'node' => $argument->getReferenceId() ], ['query' => ['attach_to' => implode('/', $destination)]] ), '#options' => ['attributes' => ['class' => ['argue-icon', 'add-link']]], ] : ['#markup' => '']; $view['#title'] = new TranslatableMarkup('<span>@title</span> @add_link', [ '@title' => $view['#title'], '@add_link' => render($add_link), ]); } if ($this->getSetting('display_modal')) { $view['#attached']['library'][] = 'core/drupal.dialog.ajax'; } return $view; } /** * {@inheritdoc} */ public function viewElements(FieldItemListInterface $items, $langcode) { $elements = []; if (!$items->isEmpty()) { $this->crStatusConstants = new ChangeRequests; foreach ($items as $delta => $item) { if ($item->entity) { /** @var Argument $entity */ $elements[] = $this->getEntityLink($item->entity); } } } elseif ($this->getSetting('show_empty_field')) { $elements[] = [ '#type' => 'container', 'content' => [ '#markup' => new TranslatableMarkup('<span class="empty">No change requests.</span>') ] ]; } return $elements; } /** * {@inheritdoc} */ public static function isApplicable(FieldDefinitionInterface $field_definition) { return ($field_definition->getSetting('target_type') == 'patch'); } /** * * * @param EntityInterface $entity * * @return array */ protected function getEntityLink(EntityInterface $entity) { $route = 'entity.patch.canonical'; $attr = ($this->getSetting('display_modal')) ? [ 'class' => ['use-ajax'], 'data-dialog-type' => 'modal', 'data-dialog-options' => '{"width":"80%","dialogClass":"popup-dialog-class"}', 'role' => 'article', ] : []; $meta_props = [ '#theme' => 'argue_chip_set', '#attributes' => ['class' => ['patch_props']], ]; $invoke_meta = \Drupal::moduleHandler()->invokeAll('argue_meta_patch_patch', [$entity, 'list-item']); if($entity instanceof EntityInterface) { $url = Url::fromRoute($route, ['patch' => $entity->id()]); return [ '#theme' => 'change_request__list_item', '#label' => $entity->label(), '#url' => $url->toString(), '#status' => array_merge($meta_props, $invoke_meta), '#attributes' => new Attribute($attr), ]; } else { return []; } } }