From 591771d3bab8b3d79192299ecc605edb46a174d9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jean-S=C3=A9bastien=20Caux?= <git@jscaux.org>
Date: Fri, 9 Dec 2022 20:54:59 +0100
Subject: [PATCH] Improve submissions listing in edadmin and pool

---
 .../edadmin/_hx_submissions_list.html         |  49 +++----
 scipost_django/edadmin/views/base.py          |  13 +-
 .../submissions/managers/submission.py        |   3 +
 .../_submission_ontological_info_table.html   |  27 ++++
 .../submissions/_submission_summary.html      |  28 +---
 .../pool/_hx_submission_details.html          | 137 ++++++++++++++++++
 .../pool/_hx_submissions_list.html            |  20 ++-
 .../_submission_details_summary_contents.html | 106 ++++++++++++++
 .../templates/submissions/pool/pool.html      |   2 +-
 9 files changed, 318 insertions(+), 67 deletions(-)
 create mode 100644 scipost_django/submissions/templates/submissions/_submission_ontological_info_table.html
 create mode 100644 scipost_django/submissions/templates/submissions/pool/_hx_submission_details.html
 create mode 100644 scipost_django/submissions/templates/submissions/pool/_submission_details_summary_contents.html

diff --git a/scipost_django/edadmin/templates/edadmin/_hx_submissions_list.html b/scipost_django/edadmin/templates/edadmin/_hx_submissions_list.html
index ed22dfeba..1691b6386 100644
--- a/scipost_django/edadmin/templates/edadmin/_hx_submissions_list.html
+++ b/scipost_django/edadmin/templates/edadmin/_hx_submissions_list.html
@@ -1,33 +1,14 @@
-<h3 class="m-4">{{ submissions|length }} Submissions in this stage</h3>
-{% for submission in submissions %}
+{% for submission in page_obj %}
+
+  <div class="ms-3 mt-3"><strong>{{ forloop.counter0|add:start_index }} of {{ count }}</strong></div>
 
   <details id="submission-{{ submission.pk }}-details"
-	   class="border border-2 m-4"
+	   class="border border-2 mx-3"
   >
-    <summary class="px-4 py-2 bg-primary bg-opacity-10">
-      <div class="row">
-	<div class="col col-lg-10">
-	  <table>
-	    <tbody>
-	      <tr>
-		<td>{{ submission.title }}</td>
-	      </tr>
-	      <tr>
-		<td>{{ submission.author_list }}</td>
-	      </tr>
-	      <tr>
-		<td>Submitted {{ submission.submission_date|date:"Y-m-d" }} to {{ submission.submitted_to }}</td>
-	      </tr>
-	    </tbody>
-	  </table>
-	</div>
-	<div class="col col-lg-2">
-	  <ul class="list list-unstyled">
-	    <li class="mb-2"><a href="{% url 'submissions:submission' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr %}" target="_blank">{% include "bi/arrow-right-square-fill.html" %}submission page</a></li>
-	    <li class="mb-2"><a href="{% url 'submissions:editorial_page' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr %}" target="_blank" class="text-danger">{% include "bi/arrow-right-square-fill.html" %}editorial page</a></li>
-	  </ul>
-	</div>
-      </div>
+    <summary style="list-style: none;"
+	     class="p-2 bg-primary bg-opacity-10"
+    >
+      {% include "submissions/pool/_submission_details_summary_contents.html" with submission=submission %}
     </summary>
     <div id="submission-{{ submission.pk }}-edadmin"
 	 hx-get="{% url 'edadmin:_hx_submission' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr %}"
@@ -38,3 +19,17 @@
 {% empty %}
   <p><strong>No Submission found</strong></p>
 {% endfor %}
+{% if page_obj.has_next %}
+  <div hx-get="{% url 'edadmin:_hx_submissions_in_stage' stage=stage %}?page={{ page_obj.next_page_number }}"
+       hx-trigger="revealed"
+       hx-swap="afterend"
+       hx-indicator="#indicator-search-page-{{ page_obj.number }}"
+  >
+    <div id="indicator-search-page-{{ page_obj.number }}" class="htmx-indicator p-2">
+      <button class="btn btn-warning" type="button" disabled>
+	<strong>Loading page {{ page_obj.next_page_number }} out of {{ page_obj.paginator.num_pages }}</strong>
+	<div class="spinner-grow spinner-grow-sm ms-2" role="status" aria-hidden="true"></div>
+      </button>
+    </div>
+  </div>
+{% endif %}
diff --git a/scipost_django/edadmin/views/base.py b/scipost_django/edadmin/views/base.py
index 32192a4e8..04aa60a6c 100644
--- a/scipost_django/edadmin/views/base.py
+++ b/scipost_django/edadmin/views/base.py
@@ -5,6 +5,7 @@ __license__ = "AGPL v3"
 import operator
 
 from django.contrib.auth.decorators import login_required, user_passes_test
+from django.core.paginator import Paginator
 from django.http import Http404
 from django.shortcuts import get_object_or_404, render
 
@@ -33,8 +34,18 @@ def _hx_submissions_in_stage(request, stage):
     if stage not in Submission.STAGE_SLUGS:
         raise Http404(f"This Submission stage does not exist: {stage}")
     submissions = get_objects_for_user(request.user, "submissions.take_edadmin_actions")
+    submissions = operator.attrgetter(f"in_stage_{stage}")(submissions)()
+    paginator = Paginator(submissions, 16)
+    page_nr = request.GET.get("page")
+    page_obj = paginator.get_page(page_nr)
+    count = paginator.count
+    start_index = page_obj.start_index
     context = {
-        "submissions": operator.attrgetter(f"in_stage_{stage}")(submissions)(),
+        "stage": stage,
+        "count": count,
+        "page_obj":
+        page_obj,
+        "start_index": start_index,
     }
     return render(request, "edadmin/_hx_submissions_list.html", context)
 
diff --git a/scipost_django/submissions/managers/submission.py b/scipost_django/submissions/managers/submission.py
index dcc66ff84..2079c24db 100644
--- a/scipost_django/submissions/managers/submission.py
+++ b/scipost_django/submissions/managers/submission.py
@@ -120,6 +120,9 @@ class SubmissionQuerySet(models.QuerySet):
     def stage_decisionmaking_completed(self):
         return self.filter(status__in=self.model.STAGE_DECIDED)
 
+    def in_state_in_production(self):
+        return self.filter(status__in=self.model.STAGE_IN_PRODUCTION)
+
     #### Other managers mixing statuses ####
 
     def under_consideration(self):
diff --git a/scipost_django/submissions/templates/submissions/_submission_ontological_info_table.html b/scipost_django/submissions/templates/submissions/_submission_ontological_info_table.html
new file mode 100644
index 000000000..7dc085946
--- /dev/null
+++ b/scipost_django/submissions/templates/submissions/_submission_ontological_info_table.html
@@ -0,0 +1,27 @@
+<table class="submission summary">
+  <thead class="bg-info">
+    <th colspan="2" class="px-1 bg-info">Ontological classification</th>
+  </thead>
+  <tbody>
+    <tr>
+      <td>Academic field:</td>
+      <td>{{ submission.acad_field }}</td>
+    </tr>
+    <tr>
+      <td>Specialties:</td>
+      <td>
+	<ul class="m-0 ps-4">
+	  {% for specialty in submission.specialties.all %}
+	    <li>{{ specialty }}</li>
+	  {% endfor %}
+	</ul>
+      </td>
+    </tr>
+    {% if submission.approaches %}
+      <tr>
+	<td>Approach{% if submission.approaches|length > 1 %}es{% endif %}:</td>
+	<td>{% for approach in submission.approaches %}{% if not forloop.first %}, {% endif %}{{ approach|capfirst }}{% endfor %}</td>
+      </tr>
+    {% endif %}
+  </tbody>
+</table>
diff --git a/scipost_django/submissions/templates/submissions/_submission_summary.html b/scipost_django/submissions/templates/submissions/_submission_summary.html
index a3fc7f87e..a448cd802 100644
--- a/scipost_django/submissions/templates/submissions/_submission_summary.html
+++ b/scipost_django/submissions/templates/submissions/_submission_summary.html
@@ -102,33 +102,7 @@
     </table>
   </div>
   <div class="mt-2 col col-xl-6">
-    <table class="submission summary">
-      <thead class="bg-info">
-	<th colspan="2" class="px-1 bg-info">Ontological classification</th>
-      </thead>
-      <tbody>
-	<tr>
-	  <td>Academic field:</td>
-	  <td>{{ submission.acad_field }}</td>
-	</tr>
-	<tr>
-	  <td>Specialties:</td>
-	  <td>
-	    <ul class="m-0 ps-4">
-	      {% for specialty in submission.specialties.all %}
-		<li>{{ specialty }}</li>
-	      {% endfor %}
-	    </ul>
-	  </td>
-	</tr>
-	{% if submission.approaches %}
-	  <tr>
-	    <td>Approach{% if submission.approaches|length > 1 %}es{% endif %}:</td>
-	    <td>{% for approach in submission.approaches %}{% if not forloop.first %}, {% endif %}{{ approach|capfirst }}{% endfor %}</td>
-	  </tr>
-	{% endif %}
-      </tbody>
-    </table>
+{% include "submissions/_submission_ontological_info_table.html" with submission=submission %}
   </div>
 </div>
 
diff --git a/scipost_django/submissions/templates/submissions/pool/_hx_submission_details.html b/scipost_django/submissions/templates/submissions/pool/_hx_submission_details.html
new file mode 100644
index 000000000..e9601b751
--- /dev/null
+++ b/scipost_django/submissions/templates/submissions/pool/_hx_submission_details.html
@@ -0,0 +1,137 @@
+{% load static %}
+{% load submissions_pool %}
+{% load user_groups %}
+
+{% is_ed_admin request.user as is_ed_admin %}
+
+
+<details>
+  <summary>
+  </summary>
+</details>
+
+
+<div class="pool-item">
+  <div class="row">
+    <div class="col-md-7">
+      <a href="{% url 'submissions:submission' submission.preprint.identifier_w_vn_nr %}">{{ submission.title }}</a>
+      <br>
+      <em>by {{ submission.author_list }}</em>
+      <br>
+      <div class="my-2">
+	<span class="text-secondary">{% include 'bi/bullseye.html' %}:&nbsp;</span>
+	{{ submission.submitted_to }}
+      </div>
+    </div>
+    <div class="col-md-5">
+      <ul class="bg-secondary py-1">
+	{% for specialty in submission.specialties.all %}
+	  <li><small>{{ specialty }}</small></li>
+	{% endfor %}
+      </ul>
+    </div>
+  </div>
+
+  <div class="row mb-0">
+    <div class="col-md-3">
+      <small class="text-muted">Editor-in-charge</small>
+      <br>
+      <ul class="list list-unstyled">
+	{% if submission.status == 'seeking_assignment' %}
+	  {% if is_ed_admin %}
+	    <li>Seeking assignment</li>
+	  {% else %}
+            <li>You can
+	      <a href="{% url 'submissions:pool:editorial_assignment' submission.preprint.identifier_w_vn_nr %}"><strong class="text-danger">volunteer to become Editor-in-charge</strong></a>
+	    </li>
+	  {% endif %}
+	  {% if request.user.contributor.is_active_senior_fellow %}
+	    <li>As Senior Fellow: <a href="{% url 'submissions:editor_invitations' submission.preprint.identifier_w_vn_nr %}"><strong class="text-danger">view/update editor invitations</strong></a></li>
+	  {% endif %}
+	{% elif submission.editor_in_charge == request.user.contributor %}
+          <li>
+	    <strong>You are the EIC</strong>
+            <a role="button" class="btn btn-info px-1 py-0" href="{% url 'submissions:editorial_page' submission.preprint.identifier_w_vn_nr %}"><small>{% include 'bi/arrow-right.html' %} Editorial&nbsp;page</small></a>
+	  </li>
+	{% else %}
+          <li>{{ submission.editor_in_charge }}</li>
+	{% endif %}
+      </ul>
+    </div>
+    <div class="col-md-3">
+      <small class="text-muted">Original submission date</small>
+      <br>
+      {{ submission.original_submission_date|date:'Y-m-d' }}
+    </div>
+    <div class="col-md-2">
+      <small class="text-muted">Latest activity</small>
+      <br>
+      {{ submission.latest_activity }}
+    </div>
+    <div class="col-md-4">
+      <small class="text-muted">Submission Status</small>
+      <br>
+      <span class="label label-sm label-secondary text-wrap">{{ submission.get_status_display }}</span>
+      {% with recommendation=submission.eicrecommendations.active.first %}
+	{% if recommendation %}
+	  <br>
+          <small class="text-muted">EIC Recommendation &amp; Status</small>
+          <br>
+	  <span class="label label-sm label-secondary text-wrap">{{ recommendation.get_full_status_display }}</span>
+	  <br>
+	  <small class="text-muted">{{ recommendation.eligible_to_vote.count }} voting: {{ recommendation.voted_for.count }} agreed, {{ recommendation.voted_against.count }} disagreed, {{ recommendation.voted_abstain.count }} abstained</small>
+	{% endif %}
+      {% endwith %}
+      {% if submission.editorial_decision %}
+	<br>
+	<small class="text-muted">Editorial Decision Status</small>
+	<br>
+	<span class="label label-sm label-secondary text-wrap">{{ submission.editorial_decision.get_status_display }}</span>
+      {% endif %}
+    </div>
+  </div>
+  {% if is_ed_admin and submission.has_inadequate_fellowship_composition %}
+    <div class="border border-danger text-danger mt-1 py-1 px-2">
+      <strong>
+        {% include 'bi/exclamation-triangle-fill.html' %}
+        Notice to admin: The current editor is not assigned to the pool. Therefore, the editor will not be able to reach the editorial page.
+      </strong>
+    </div>
+  {% endif %}
+
+  {% if submission.cycle.has_required_actions %}
+    <div class="card-text bg-danger text-white mt-1 py-1 px-2">
+      <button type="button" class="btn p-0" disabled>
+	<small class="text-white">This Submission contains required actions.</small>
+      </button>
+      {% if is_ed_admin %}{% include 'submissions/pool/_required_actions_tooltip.html' with submission=submission classes='text-white' %}{% endif %}
+    </div>
+  {% endif %}
+
+  {% if submission.status == 'seeking_assignment' %}
+    {% get_editor_invitations submission request.user as invitations %}
+    {% if invitations %}
+      <div class="border border-warning mt-1 py-1 px-2">
+        <span class="mt-1 px-1 text-danger">{% include 'bi/exclamation.html' %}</i>
+          You are invited to become Editor-in-charge of this Submission. <a href="{% url 'submissions:pool:editorial_assignment' submission.preprint.identifier_w_vn_nr %}">You can reply to this invitation here</a>.
+      </div>
+    {% endif %}
+  {% endif %}
+
+  <div id="details_{{ submission.id }}" class="mt-2">
+    <button type="button" class="btn btn-primary p-1 mx-auto"
+	    hx-get="{% url 'submissions:pool:_hx_submission_li_details' submission.preprint.identifier_w_vn_nr %}"
+	    hx-target="#details_{{ submission.id }}"
+	    hx-indicator="#indicator-details-{{ submission.id }}"
+    >
+      <small>View details</small>
+    </button>
+    <span id="indicator-details-{{ submission.id }}" class="htmx-indicator p-1">
+      <button class="btn btn-sm btn-warning p-2" type="button" disabled>
+	<small><strong>Loading...</strong></small>
+	<div class="spinner-grow spinner-grow-sm ms-2" role="status" aria-hidden="true"></div>
+      </button>
+    </span>
+  </div>
+
+</div>
diff --git a/scipost_django/submissions/templates/submissions/pool/_hx_submissions_list.html b/scipost_django/submissions/templates/submissions/pool/_hx_submissions_list.html
index bc01be873..56bd5b886 100644
--- a/scipost_django/submissions/templates/submissions/pool/_hx_submissions_list.html
+++ b/scipost_django/submissions/templates/submissions/pool/_hx_submissions_list.html
@@ -1,17 +1,15 @@
 {% for submission in page_obj %}
-  <li{% if not forloop.first %} class="mt-4"{% endif %}><strong>{{ forloop.counter0|add:start_index }} of {{ count }}</strong></li>
-  <li class="submission p-2 mb-2" id="submission_{{ submission.id }}">
-    {% include 'submissions/pool/_hx_submission_li.html' with submission=submission %}
-  </li>
+  <span>{% if not forloop.first %} class="mt-4"{% endif %}><strong>{{ forloop.counter0|add:start_index }} of {{ count }}</strong></span>
+  {% include 'submissions/pool/_hx_submission_details.html' with submission=submission %}
 {% empty %}
-  <li>No Submission could be found</li>
+  <strong>No Submission could be found</strong>
 {% endfor %}
 {% if page_obj.has_next %}
-  <li hx-post="{% url 'submissions:pool:_hx_submissions_list' %}?page={{ page_obj.next_page_number }}"
-      hx-include="#search-form"
-      hx-trigger="revealed"
-      hx-swap="afterend"
-      hx-indicator="#indicator-search-page-{{ page_obj.number }}"
+  <div hx-post="{% url 'submissions:pool:_hx_submissions_list' %}?page={{ page_obj.next_page_number }}"
+       hx-include="#search-form"
+       hx-trigger="revealed"
+       hx-swap="afterend"
+       hx-indicator="#indicator-search-page-{{ page_obj.number }}"
   >
     <div id="indicator-search-page-{{ page_obj.number }}" class="htmx-indicator p-2">
       <button class="btn btn-warning" type="button" disabled>
@@ -19,5 +17,5 @@
 	<div class="spinner-grow spinner-grow-sm ms-2" role="status" aria-hidden="true"></div>
       </button>
     </div>
-  </li>
+  </div>
 {% endif %}
diff --git a/scipost_django/submissions/templates/submissions/pool/_submission_details_summary_contents.html b/scipost_django/submissions/templates/submissions/pool/_submission_details_summary_contents.html
new file mode 100644
index 000000000..9752d528a
--- /dev/null
+++ b/scipost_django/submissions/templates/submissions/pool/_submission_details_summary_contents.html
@@ -0,0 +1,106 @@
+<div class="row mb-0">
+  <div class="col col-md-9">
+    <table>
+      <tbody>
+	<tr>
+	  <td><strong class="text-primary">{{ submission.title }}</strong></td>
+	</tr>
+	<tr class="mt-1">
+	  <td><strong><em>by {{ submission.author_list }}</em></strong></td>
+	</tr>
+      </tbody>
+    </table>
+    <div class="row mt-2 mb-0">
+      <div class="col">
+	<small class="text-muted">Submitted to</small><br>
+	{{ submission.submitted_to }}
+      </div>
+      <div class="col">
+	{% if submission.is_resubmission_of %}
+	  <table class="m-0 p-0">
+	    <tr>
+	      <td>
+		<small class="text-muted">
+		  Resubmission:
+		</small>
+	      </td>
+	      <td class="ms-2">{{ submission.submission_date|date:"Y-m-d" }}</td>
+	    </tr>
+	    <tr>
+	      <td>
+		<small class="text-muted">Original submission:</small>
+	      </td>
+	      <td class="ms-2">{{ submission.original_submission_date|date:'Y-m-d' }}</td>
+	    </tr>
+	  </table>
+	{% else %}
+	  <small class="text-muted">Submission date</small>
+	  <br>
+	  {{ submission.submission_date|date:'Y-m-d' }}
+	{% endif %}
+      </div>
+      <div class="col">
+	<small class="text-muted">Submission Status</small>
+	<br>
+	{{ submission.get_status_display }}</span>
+	{% with recommendation=submission.eicrecommendations.active.first %}
+	  {% if recommendation %}
+	    <br>
+	    <small class="text-muted">EIC Recommendation &amp; Status</small>
+	    <br>
+	    {{ recommendation.get_full_status_display }}
+	    <br>
+	    <small class="text-muted">{{ recommendation.eligible_to_vote.count }} voting: {{ recommendation.voted_for.count }} agreed, {{ recommendation.voted_against.count }} disagreed, {{ recommendation.voted_abstain.count }} abstained</small>
+	  {% endif %}
+	{% endwith %}
+	{% if submission.editorial_decision %}
+	  <br>
+	  <small class="text-muted">Editorial Decision Status</small>
+	  <br>
+	  {{ submission.editorial_decision.get_status_display }}
+	{% endif %}
+      </div>
+    </div>
+    {% if submission.stage_preassignment_completed %}
+      <div class="row mt-2 mb-0">
+	{% if submission.editor_in_charge %}
+	  <div class="col-md-4">
+	    <small class="text-muted">Editor-in-charge</small>
+	    <br>
+	    {% if submission.editor_in_charge == request.user.contributor %}
+	      <strong>You are the EIC</strong>
+	    {% else %}
+	      <strong>{{ submission.editor_in_charge }}</strong>
+	    {% endif %}
+	  </div>
+	{% elif request.user.contributor.is_ed_admin or request.user.contributor.is_active_senior_fellow %}
+	  <div class="col-md-4">
+	    <a class="btn btn-primary" href="{% url 'submissions:editor_invitations' submission.preprint.identifier_w_vn_nr %}"><small>View/update invitations</small></a>
+	  </div>
+	{% else %}
+	  <div class="col-md-4">
+	    <a class="btn btn-success" href="{% url 'submissions:pool:editorial_assignment' submission.preprint.identifier_w_vn_nr %}"><small>Volunteer as EiC</small></a>
+	  </div>
+	{% endif %}
+      </div>
+    {% endif %}
+  </div>
+  <div class="col col-md-3 border-start">
+    <ul class="ms-2 p-0">
+      {% for specialty in submission.specialties.all %}
+	<li><small>{{ specialty }}</small></li>
+      {% endfor %}
+    </ul>
+    <ul class="ms-2 list list-unstyled">
+      <li class="mb-2"><a href="{% url 'submissions:submission' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr %}" target="_blank">{% include "bi/arrow-right-square-fill.html" %}submission page</a></li>
+      {% if request.user.contributor.is_ed_admin or request.user.contributor == submission.editor_in_charge %}
+      <li class="mb-2"><a href="{% url 'submissions:editorial_page' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr %}" target="_blank">
+	<span class="text-danger">
+	  {% include "bi/arrow-right-square-fill.html" %}
+	  editorial page
+	</span>
+      </a></li>
+      {% endif %}
+    </ul>
+  </div>
+</div>
diff --git a/scipost_django/submissions/templates/submissions/pool/pool.html b/scipost_django/submissions/templates/submissions/pool/pool.html
index 90696fbca..f08c3cea2 100644
--- a/scipost_django/submissions/templates/submissions/pool/pool.html
+++ b/scipost_django/submissions/templates/submissions/pool/pool.html
@@ -96,7 +96,7 @@
       <div class="spinner-grow spinner-grow-sm ms-2" role="status" aria-hidden="true"></div>
     </button>
   </div>
-  <ul id="search-results" class="list-unstyled pool-list mt-2"></ul>
+  <div id="search-results" class="mt-2"></div>
 
 {% endblock content %}
 {% block footer_script %}
-- 
GitLab