From 9897ba44ed50da58ff5a8a452ce21b5a0a2e2be6 Mon Sep 17 00:00:00 2001
From: Yousef Bajawi <jose@josebcdev.com>
Date: Sun, 23 Oct 2016 17:38:45 +0300
Subject: [PATCH] Issue #1054616 : Add option to reverse order in admin view

---
 config/schema/entityqueue.schema.yml |  3 +++
 src/Entity/EntityQueue.php           |  8 ++++++++
 src/EntityQueueInterface.php         |  1 +
 src/Form/EntityQueueForm.php         |  6 +++++-
 src/Form/EntitySubqueueForm.php      | 17 +++++++++++++++++
 5 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/config/schema/entityqueue.schema.yml b/config/schema/entityqueue.schema.yml
index 8c6cef9..fd21d85 100644
--- a/config/schema/entityqueue.schema.yml
+++ b/config/schema/entityqueue.schema.yml
@@ -41,3 +41,6 @@ entityqueue.entity_queue.*:
         act_as_queue:
           type: boolean
           label: 'Act as queue'
+        reverse_in_admin:
+          type: boolean
+          label: 'Reverse order in admin view'
diff --git a/src/Entity/EntityQueue.php b/src/Entity/EntityQueue.php
index 54cfef3..7113b25 100644
--- a/src/Entity/EntityQueue.php
+++ b/src/Entity/EntityQueue.php
@@ -87,6 +87,7 @@ class EntityQueue extends ConfigEntityBundleBase implements EntityQueueInterface
     'min_size' => 0,
     'max_size' => 0,
     'act_as_queue' => FALSE,
+    'reverse_in_admin' => FALSE,
   ];
 
   /**
@@ -141,6 +142,13 @@ class EntityQueue extends ConfigEntityBundleBase implements EntityQueueInterface
   /**
    * {@inheritdoc}
    */
+  public function getReverseInAdmin() {
+    return $this->queue_settings['reverse_in_admin'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getEntitySettings() {
     return $this->entity_settings;
   }
diff --git a/src/EntityQueueInterface.php b/src/EntityQueueInterface.php
index 2af3e74..245918f 100644
--- a/src/EntityQueueInterface.php
+++ b/src/EntityQueueInterface.php
@@ -87,6 +87,7 @@ interface EntityQueueInterface extends ConfigEntityInterface {
    *   - min_size: The minimum number of items that this queue can hold.
    *   - max_size: The maximum number of items that this queue can hold.
    *   - act_as_queue: The behavior of exceeding the maximum number of queue
+   *   - reverse_in_admin: Show in reverse order in admin view
    *     items.
    */
   public function getQueueSettings();
diff --git a/src/Form/EntityQueueForm.php b/src/Form/EntityQueueForm.php
index 5a49679..5781011 100644
--- a/src/Form/EntityQueueForm.php
+++ b/src/Form/EntityQueueForm.php
@@ -160,7 +160,11 @@ class EntityQueueForm extends BundleEntityFormBase {
         ],
       ],
     ];
-
+    $form['queue_settings']['reverse_in_admin'] = [
+      '#type' => 'checkbox',
+      '#default_value' => $queue->getReverseInAdmin(),
+      '#title' => $this->t('Reverse order in admin view'),
+    ];
     // We have to duplicate all the code from
     // \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem::fieldSettingsForm()
     // because field settings forms are not easily embeddable.
diff --git a/src/Form/EntitySubqueueForm.php b/src/Form/EntitySubqueueForm.php
index 68000f5..3652255 100644
--- a/src/Form/EntitySubqueueForm.php
+++ b/src/Form/EntitySubqueueForm.php
@@ -52,6 +52,12 @@ class EntitySubqueueForm extends ContentEntityForm {
    * {@inheritdoc}
    */
   public function form(array $form, FormStateInterface $form_state) {
+    // Reverse in admin form is queue is set to 'Reverse order in admin view'
+    if($this->entity->getQueue()->getReverseInAdmin()) {
+      $subqueue_items = $this->entity->get('items');
+      $items_values = $subqueue_items->getValue();
+      $subqueue_items->setValue(array_reverse($items_values));
+    }
     $form = parent::form($form, $form_state);
 
     $form['#title'] = $this->t('Edit subqueue %label', ['%label' => $this->entity->label()]);
@@ -155,6 +161,11 @@ class EntitySubqueueForm extends ContentEntityForm {
       $items_widget->extractFormValues($subqueue_items, $form, $form_state);
       $items_values = $subqueue_items->getValue();
 
+      // Revert reverse in admin form is queue is set to 'Reverse order in admin view'
+      if($entity->getQueue()->getReverseInAdmin()) {
+        $items_values = array_reverse($items_values);
+      }
+
       switch ($op) {
         case 'reverse':
           $subqueue_items->setValue(array_reverse($items_values));
@@ -221,6 +232,12 @@ class EntitySubqueueForm extends ContentEntityForm {
    */
   public function save(array $form, FormStateInterface $form_state) {
     $subqueue = $this->entity;
+    // Revert reverse in admin form in queue 
+    if($subqueue->getQueue()->getReverseInAdmin()) {
+      $subqueue_items = $subqueue->get('items');
+      $items_values = $subqueue_items->getValue();
+      $subqueue_items->setValue(array_reverse($items_values));
+    }
     $status = $subqueue->save();
 
     $edit_link = $subqueue->toLink($this->t('Edit'), 'edit-form')->toString();
-- 
1.9.1

