+ /**
+ * Provides a list of subqueues where an entity can be added.
+ *
+ * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+ * The route match.
+ * @param string $entity_type_id
+ * (optional) The entity type ID.
+ * @param \Drupal\Core\Entity\EntityInterface $entity
+ * (optional) An entity object.
+ *
+ * @return array
+ * Array of page elements to render.
+ */
+ public function subqueueListForEntity(RouteMatchInterface $route_match, $entity_type_id = NULL, EntityInterface $entity = NULL) {
+ if (!$entity) {
+ $entity = $route_match->getParameter($entity_type_id);
+ }
+
+ $queues = $this->getAvailableQueuesForEntity($entity);
+ $subqueues = $this->entityTypeManager()->getStorage('entity_subqueue')->loadByProperties(['queue' => array_keys($queues)]);
+ $list_builder = $this->entityTypeManager()->getListBuilder('entity_subqueue');
+
+ $build['#title'] = $this->t('Entityqueues for %title', ['%title' => $entity->label()]);
+ $build['#type'] = 'container';
+ $build['#attributes']['id'] = 'entity-subqueue-list';
+ $build['#attached']['library'][] = 'core/drupal.ajax';
+ $build['table'] = [
+ '#type' => 'table',
+ '#header' => $list_builder->buildHeader(),
+ '#rows' => [],
+ '#cache' => [],
+ '#empty' => $this->t('There are no queues available.'),
+ ];
+
+ /** @var \Drupal\entityqueue\EntitySubqueueInterface $subqueue */
+ foreach ($subqueues as $subqueue_id => $subqueue) {
+ $row = $list_builder->buildRow($subqueue);
+
+ // Check if entity is in queue
+ $subqueue_items = $subqueue->get('items')->getValue();
+ if (in_array($entity->id(), array_column($subqueue_items, 'target_id'), TRUE)) {
+ $row['operations']['data']['#links'] = [
+ 'remove-item' => [
+ 'title' => $this->t('Remove from queue'),
+ 'url' => Url::fromRoute('entity.entity_subqueue.remove_item', ['entity_queue' => $queues[$subqueue->bundle()]->id(), 'entity_subqueue' => $subqueue_id, 'entity' => $entity->id()]),
+ 'attributes' => [
+ 'class' => ['use-ajax'],
+ ],
+ ],
+ ];
+ }
+ else {
+ $row['operations']['data']['#links'] = [
+ 'add-item' => [
+ 'title' => $this->t('Add to queue'),
+ 'url' => Url::fromRoute('entity.entity_subqueue.add_item', ['entity_queue' => $queues[$subqueue->bundle()]->id(), 'entity_subqueue' => $subqueue_id, 'entity' => $entity->id()]),
+ 'attributes' => [
+ 'class' => ['use-ajax'],
+ ],
+ ],
+ ];
+ }
+
+ // Add an operation for editing the subqueue items.
+ // First, compute the destination to send the user back to the
+ // entityqueue tab they're currently on. We can't rely on <current>
+ // since if any of the AJAX links are used and the page is rebuilt,
+ // <current> will point to the most recent AJAX callback, not the
+ // original entityqueue tab.
+ $destination = Url::fromRoute("entity.$entity_type_id.entityqueue", [$entity_type_id => $entity->id()])->toString();
+ $row['operations']['data']['#links']['edit-subqueue-items'] = [
+ 'title' => $this->t('Edit subqueue items'),
+ 'url' => $subqueue->toUrl('edit-form', ['query' => ['destination' => $destination]]),
+ ];
+
+ $build['table']['#rows'][$subqueue->id()] = $row;
+ }
+
+ return $build;
+ }
+