contacts_events-8.x-1.x-dev/modules/teams/src/Plugin/Block/ContactsDashboardTeams.php
modules/teams/src/Plugin/Block/ContactsDashboardTeams.php
<?php
namespace Drupal\contacts_events_teams\Plugin\Block;
use Drupal\Component\Datetime\TimeInterface;
use Drupal\contacts_events_teams\TeamQueries;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Provides a block to view a contact dashboard summary.
*
* @Block(
* id = "contacts_events_teams",
* admin_label = @Translation("Contact Teams"),
* category = @Translation("Dashboard Blocks"),
* dashboard_block = TRUE,
* context_definitions = {
* "user" = @ContextDefinition("entity:user", required = TRUE, label = @Translation("User"))
* }
* )
*/
class ContactsDashboardTeams extends BlockBase implements ContainerFactoryPluginInterface {
/**
* The team application entity storage.
*
* @var \Drupal\Core\Entity\EntityStorageInterface
*/
protected $storage;
/**
* The time service.
*
* @var \DateTimeInterface
*/
protected $time;
/**
* The team queries service.
*
* @var \Drupal\contacts_events_teams\TeamQueries
*/
protected $queries;
/**
* Construct the teams block.
*
* @param array $configuration
* The plugin configuration.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param \Drupal\Core\Entity\EntityStorageInterface $storage
* The team application entity storage.
* @param \Drupal\Component\Datetime\TimeInterface $time
* The time service.
* @param \Drupal\contacts_events_teams\TeamQueries $queries
* The team queries service.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityStorageInterface $storage, TimeInterface $time, TeamQueries $queries) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->storage = $storage;
$this->time = $time;
$this->queries = $queries;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration, $plugin_id, $plugin_definition,
$container->get('entity_type.manager')->getStorage('contacts_ticket'),
$container->get('datetime.time'),
$container->get('contacts_events_teams.queries')
);
}
/**
* {@inheritdoc}
*/
public function build() {
/** @var \Drupal\user\Entity\User $user */
$user = $this->getContextValue('user');
$cut_off = date(DateTimeItemInterface::DATETIME_STORAGE_FORMAT, $this->time->getRequestTime());
// Upcoming events first.
$query = $this->storage->getQuery();
$query->accessCheck(TRUE);
$query->condition('contact', $user->id());
$query->condition('is_team_ticket', TRUE);
$query->condition('event.entity.date.end_value', $cut_off, '>=');
$query->sort('event.entity.date.value', 'DESC');
$ids = $query->execute();
$build['upcoming'] = $this->buildAppTable($ids);
// Past events second.
$query = $this->storage->getQuery();
$query->accessCheck(TRUE);
$query->condition('contact', $user->id());
$query->condition('is_team_ticket', TRUE);
$query->condition('event.entity.date.end_value', $cut_off, '<');
$query->sort('event.entity.date.value', 'DESC');
$ids = $query->execute();
if ($ids) {
$build['past_title'] = [
'#type' => 'html_tag',
'#tag' => 'h3',
'#value' => $this->t('Past events'),
];
$build['past'] = $this->buildAppTable($ids);
}
return $build;
}
/**
* Build the application table for a set of IDs.
*
* @param array $ids
* The application IDs for the table.
*
* @return array
* The render array.
*/
protected function buildAppTable(array $ids) {
$build = [
'#type' => 'table',
'#attributes' => ['class' => ['table', 'table-hover', 'table-striped']],
'#header' => [
'event' => $this->t('Event'),
'team' => $this->t('Team'),
'status' => $this->t('Status'),
'view' => $this->t('View'),
'edit' => $this->t('Edit'),
'operations' => $this->t('Operations'),
],
'#rows' => [],
'#empty' => $this->t('No team applications'),
];
/** @var \Drupal\contacts_events\Entity\TicketInterface $ticket */
foreach ($this->storage->loadMultiple($ids) as $ticket) {
/** @var \Drupal\contacts_events\Entity\EventInterface $event */
$event = $ticket->get('event')->entity;
$app = $this->queries->getTeamApplicationForTicket($ticket);
$row = [];
$row['event'] = ['#markup' => $event->label()];
$row['team'] = [
'#markup' => $ticket->get('team')->entity ? $ticket->get('team')->entity->label() : $this->t('Missing Team'),
];
$row['status'] = [
'#markup' => $app ? $app->state->first()->getLabel() : $this->t('Not started'),
];
$row['view'] = [
'#markup' => $app ? $app->toLink($this->t('View Application'))->toString() : '',
];
$row['edit'] = [
'#markup' => $app ? $app->toLink($this->t('Edit'), 'edit-form')->toString() : '',
];
$row['operations'] = $app ?
$app->get('state')->view([
'type' => 'state_transition_form',
'label' => 'hidden',
]) :
['#markup' => ''];
$build[$ticket->id()] = $row;
}
return $build;
}
}
