From a325722ff40358d933ce30076d57f021ce82928f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Herv=C3=A9=20=20MENAGER?= <herve.menager@pasteur.fr>
Date: Wed, 6 Dec 2017 15:46:31 +0100
Subject: [PATCH] refactor menu lists on compounds list page + more/less links

Former-commit-id: aa0b65eb2886ffc98f4504b09ec06e4ddaff7e10
---
 ippisite/ippidb/templates/base.html           | 12 ++++
 ippisite/ippidb/templates/compound_list.html  | 61 +------------------
 .../templates/multiselection_list_menu.html   | 29 +++++++++
 ippisite/ippidb/views.py                      | 25 +++++++-
 4 files changed, 67 insertions(+), 60 deletions(-)
 create mode 100644 ippisite/ippidb/templates/multiselection_list_menu.html

diff --git a/ippisite/ippidb/templates/base.html b/ippisite/ippidb/templates/base.html
index 38929b5a..527c0626 100644
--- a/ippisite/ippidb/templates/base.html
+++ b/ippisite/ippidb/templates/base.html
@@ -9,6 +9,18 @@
         <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script>
         <script type="text/javascript" src="/static/Kekule.js-master/release/kekule.js?modules=chemWidget,openbabel,indigo"></script>
         <script src="/static/js/ippidb.js" type="text/javascript"></script>
+        <script type="text/javascript">
+            var modifyUrl = function(paramName, paramValue){
+                var url = new URL(location.href);
+                if(paramValue!=null){
+                    url.searchParams.set(paramName, paramValue);
+                }else{
+                    url.searchParams.delete(paramName);
+                }
+                var modifiedUrl = url.toString();
+                window.location = modifiedUrl;
+            };
+        </script>
     </head>
 
     <body>    
diff --git a/ippisite/ippidb/templates/compound_list.html b/ippisite/ippidb/templates/compound_list.html
index 5139a412..e852b03a 100644
--- a/ippisite/ippidb/templates/compound_list.html
+++ b/ippisite/ippidb/templates/compound_list.html
@@ -29,69 +29,14 @@
         </div>
     </nav>
 </div>
-{% include "kekule_display.html" %}
 
 <div class="container-fluid">
 <div class="row flex-xl-nowrap">
   <div class="col-12 col-md-3 col-xl-2 bd-sidebar">
 <form>
-  <fieldset class="form-group row border border-info m-2">
-    <div class="bg-info col-12"><legend>PPI</legend></div>
-    {% for ppi in selected_ppis  %}
-    <div class="form-check col-12">
-      <label class="form-check-label">
-        <input class="form-check-input text-right" type="checkbox" checked value="{{ ppi.id }}" onchange="this.form.submit()" name="ppi" style="width: auto; margin-right: 1em;">
-        {{ ppi.name }}
-      </label>
-    </div>
-    {% endfor %}
-    {% for ppi in ppis|slice:":5"  %}
-    <div class="form-check col-12">
-      <label class="form-check-label">
-        <input class="form-check-input text-right" type="checkbox" value="{{ ppi.id }}" onchange="this.form.submit()" name="ppi" style="width: auto; margin-right: 1em;">
-        {{ ppi.name }}
-      </label>
-    </div>
-    {% endfor %}
-  </fieldset>
-  <fieldset class="form-group row border border-info m-2">
-    <div class="bg-info col-12"><legend>Disease</legend></div>
-    {% for disease in selected_diseases  %}
-    <div class="form-check col-12">
-      <label class="form-check-label">
-        <input class="form-check-input text-right" type="checkbox" checked value="{{ disease.id }}" onchange="this.form.submit()" name="disease" style="width: auto; margin-right: 1em;">
-        {{ disease.name }}
-      </label>
-    </div>
-    {% endfor %}
-    {% for disease in diseases|slice:":5"  %}
-    <div class="form-check col-12">
-      <label class="form-check-label">
-        <input class="form-check-input text-right" type="checkbox" value="{{ disease.id }}" onchange="this.form.submit()" name="disease" style="width: auto; margin-right: 1em;">
-        {{ disease.name }}
-      </label>
-    </div>
-    {% endfor %}
-  </fieldset>
-  <fieldset class="form-group row border border-info m-2">
-    <div class="bg-info col-12"><legend>Organism</legend></div>
-    {% for taxonomy in selected_taxonomies  %}
-    <div class="form-check col-12">
-      <label class="form-check-label">
-        <input class="form-check-input text-right" type="checkbox" checked value="{{ taxonomy.id }}" onchange="this.form.submit()" name="taxonomy" style="width: auto; margin-right: 1em;">
-        {{ taxonomy.name }}
-      </label>
-    </div>
-    {% endfor %}
-    {% for taxonomy in taxonomies|slice:":5"  %}
-    <div class="form-check col-12">
-      <label class="form-check-label">
-        <input class="form-check-input text-right" type="checkbox" value="{{ taxonomy.id }}" onchange="this.form.submit()" name="taxonomy" style="width: auto; margin-right: 1em;">
-        {{ taxonomy.name }}
-      </label>
-    </div>
-    {% endfor %}
-  </fieldset>
+  {% include "multiselection_list_menu.html" with label="PPI" selected_list=selected_ppis unselected_list=ppis param_name="ppi" limit_param_name="ppis_limit" limit_param_value=ppis_limit %}
+  {% include "multiselection_list_menu.html" with label="Disease" selected_list=selected_diseases unselected_list=diseases param_name="disease" limit_param_name="diseases_limit" limit_param_value=diseases_limit %}
+  {% include "multiselection_list_menu.html" with label="Organism" selected_list=selected_taxonomies unselected_list=taxonomies param_name="taxonomy" limit_param_name="taxonomies_limit" limit_param_value=taxonomies_limit %}
 </form>
 </div>
 <main class="col-12 col-md-9 col-xl-10 pl-md-5 bd-content" role="main">
diff --git a/ippisite/ippidb/templates/multiselection_list_menu.html b/ippisite/ippidb/templates/multiselection_list_menu.html
new file mode 100644
index 00000000..9cc39d02
--- /dev/null
+++ b/ippisite/ippidb/templates/multiselection_list_menu.html
@@ -0,0 +1,29 @@
+  <fieldset class="form-group row border border-info m-2">
+    <div class="bg-info col-12">
+        <legend>{{ label }}
+            {% if limit_param_value %}
+              <a href="#" class="float-right text-light" title="Display all {{ label }}s" onclick="modifyUrl('{{ limit_param_name }}',null);">[+]</a>
+              <input type="hidden" name="{{ limit_param_name }}" value="{{ limit_param_value }}" />
+            {% endif %}
+            {% if not limit_param_value %}
+              <a href="#" class="float-right text-light" title="Show only top 5 {{ label }}s" onclick="modifyUrl('{{ limit_param_name }}',5);">[-]</a>
+            {% endif %}
+        </legend>
+    </div>
+    {% for element in selected_list  %}
+    <div class="form-check col-12">
+      <label class="form-check-label">
+        <input class="form-check-input text-right" type="checkbox" checked value="{{ element.id }}" onchange="this.form.submit()" name="{{ param_name }}" style="width: auto; margin-right: 1em;">
+        {{ element.name }}
+      </label>
+    </div>
+    {% endfor %}
+    {% for element in unselected_list %}
+    <div class="form-check col-12">
+      <label class="form-check-label">
+        <input class="form-check-input text-right" type="checkbox" value="{{ element.id }}" onchange="this.form.submit()" name="{{ param_name }}" style="width: auto; margin-right: 1em;">
+        {{ element.name }}
+      </label>
+    </div>
+    {% endfor %}
+  </fieldset>
diff --git a/ippisite/ippidb/views.py b/ippisite/ippidb/views.py
index e229aeab..22e88df0 100644
--- a/ippisite/ippidb/views.py
+++ b/ippisite/ippidb/views.py
@@ -195,12 +195,30 @@ def compound_list(request):
         compounds = compounds.filter(compoundaction__ppi__id__in=request.GET.getlist('ppi'))
     if request.GET.get('disease'):
         compounds = compounds.filter(compoundaction__ppi__diseases__id__in=request.GET.getlist('disease'))
-    selected_ppis = Ppi.objects.filter(id__in=request.GET.getlist('ppi')) 
+    try:
+        ppis_limit = int(request.GET.get('ppis_limit'))
+    except:
+        ppis_limit = None
+    try:
+        diseases_limit = int(request.GET.get('diseases_limit'))
+    except:
+        diseases_limit = None
+    try:
+        taxonomies_limit = int(request.GET.get('taxonomies_limit'))
+    except:
+        taxonomies_limit = None
+    selected_ppis = Ppi.objects.filter(id__in=request.GET.getlist('ppi'))
     ppis = Ppi.objects.exclude(id__in=request.GET.getlist('ppi'))
+    if ppis_limit is not None:
+        ppis = ppis[:ppis_limit]
     selected_diseases = Disease.objects.filter(id__in=request.GET.getlist('disease'))
     diseases = Disease.objects.exclude(id__in=request.GET.getlist('disease'))
+    if diseases_limit is not None:
+        diseases = diseases[:diseases_limit]
     selected_taxonomies = Taxonomy.objects.filter(id__in=request.GET.getlist('taxonomy'))
     taxonomies = Taxonomy.objects.exclude(id__in=request.GET.getlist('taxonomy'))
+    if taxonomies_limit is not None:
+        taxonomies = taxonomies[:taxonomies_limit]
     # handle pagination in compounds list
     paginator = Paginator(compounds, 5)
     page = request.GET.get('page')
@@ -215,10 +233,13 @@ def compound_list(request):
     return render(request, 'compound_list.html', {'compounds': compounds, 
                                                   'selected_ppis': selected_ppis,
                                                   'ppis': ppis,
+                                                  'ppis_limit': ppis_limit,
                                                   'selected_diseases': selected_diseases,
                                                   'diseases': diseases,
+                                                  'diseases_limit': ppis_limit,
                                                   'selected_taxonomies': selected_taxonomies,
-                                                  'taxonomies': taxonomies})
+                                                  'taxonomies': taxonomies,
+                                                  'taxonomies_limit': taxonomies_limit})
 
 def compound_card(request, compound_id):
     try:
-- 
GitLab