From a05e6b7914c81e5a81f94ff63bb6225259ecb4f6 Mon Sep 17 00:00:00 2001
From: Pierre-Yves Chibon <pingou@pingoured.fr>
Date: Dec 07 2018 15:19:15 +0000
Subject: Allow filtering the issue list by the close status


Relates to https://pagure.io/pagure/issue/1749

Signed-off-by: Pierre-Yves Chibon <pingou@pingoured.fr>

---

diff --git a/pagure/templates/issues.html b/pagure/templates/issues.html
index aa72da1..600615f 100644
--- a/pagure/templates/issues.html
+++ b/pagure/templates/issues.html
@@ -216,7 +216,7 @@
                               username=username,
                               namespace=repo.namespace,
                               repo=repo.name ) }}" method="GET">
-                          <input type="hidden" name="status" value="{{ status or 'all' }}" />
+                          <input type="hidden" name="status" id="hidden_status" value="{{ status or 'all' }}" />
 
                           <div class="form-group row mb-1" id="tags-filter-group">
                             <label for="tags" class="col-auto align-self-center pl-1 pr-0"><i class="text-muted fa fa-fw fa-tag"></i></label>
@@ -321,6 +321,21 @@
                             </div>
                           </div>
 
+                          <div class="form-group row mb-1" id="close_status-filter-group">
+                            <label for="close_status" class="col-auto align-self-center pl-1 pr-0"><i class="text-muted fa fa-fw fa-user"></i></label>
+                            <div class="col pl-1">
+                              <select name="close_status" id="close_status-selectize" placeholder="Closed as">
+                                <option value="" {% if not close_status %}selected="selected"{% endif %}></option>
+                                {% for p in repo.close_status | sort %}
+                                  <option value="{{ p }}" {% if p == close_status %}selected="selected"{% endif %}>{{ p }}</option>
+                                {% endfor %}
+                              </select>
+                            </div>
+                            <div class="col-auto pl-0 pr-1 pt-1">
+                              <i class="fa fa-times fa-fw text-muted" id="close_status-selectize-reset"></i>
+                            </div>
+                          </div>
+
                           <input type="submit" class="btn btn-block btn-primary" value="Apply Filters" />
 
                           <a href="{{ url_for('ui_ns.view_issues',
@@ -557,14 +572,14 @@ $(document).ready(function() {
         event.stopPropagation();
       })
     }
-    });
-    var milestone_selectize_control = $milestone_selectize[0].selectize;
+  });
+  var milestone_selectize_control = $milestone_selectize[0].selectize;
 
-    $("#milestone-selectize-reset").on('click', function(e){
-      milestone_selectize_control.clear();
-    });
+  $("#milestone-selectize-reset").on('click', function(e){
+    milestone_selectize_control.clear();
+  });
 
-    var $priority_selectize = $('#priority-selectize').selectize({
+  var $priority_selectize = $('#priority-selectize').selectize({
     onInitialize: function(){
       $("#priority-filter-group .selectize-control").on('click', function(event){
         event.stopPropagation();
@@ -573,63 +588,81 @@ $(document).ready(function() {
         event.stopPropagation();
       })
     }
-    });
+  });
 
-    var priority_selectize_control = $priority_selectize[0].selectize;
+  var priority_selectize_control = $priority_selectize[0].selectize;
 
-    $("#priority-selectize-reset").on('click', function(e){
-      priority_selectize_control.clear();
-    });
+  $("#priority-selectize-reset").on('click', function(e){
+    priority_selectize_control.clear();
+  });
 
-    var $assignee_selectize = $('#assignee-selectize').selectize({
-      valueField: 'user',
-      labelField: 'user',
-      searchField: 'user',
-      maxItems: 1,
-      create: false,
-      load: function(query, callback) {
-        if (!query.length) return callback();
-        $.getJSON(
-          "{{ url_for('api_ns.api_users') }}", {
-            pattern: "*"+query+"*"
-          },
-          function( data ) {
-            callback( data.users.map(function(x) { return { user: x }; }) );
-          }
-        );
-      }
-    });
+  var $close_status_selectize = $('#close_status-selectize').selectize({
+    onInitialize: function(){
+      $("#close_status-filter-group .selectize-control").on('click', function(event){
+        event.stopPropagation();
+      })
+      $("#filters-dropdown").on('click', function(event){
+        event.stopPropagation();
+      })
+    }
+  });
 
-    var assignee_selectize_control = $assignee_selectize[0].selectize;
+  var close_status_selectize_control = $close_status_selectize[0].selectize;
 
-    $("#assignee-selectize-reset").on('click', function(e){
-      assignee_selectize_control.clear();
-    });
+  $("#close_status-selectize-reset").on('click', function(e){
+    close_status_selectize_control.clear();
+    $("#hidden_status").val("Open");
+  });
 
-var $author_selectize = $('#author-selectize').selectize({
-  valueField: 'user',
-  labelField: 'user',
-  searchField: 'user',
-  maxItems: 1,
-  create: false,
-  load: function(query, callback) {
-    if (!query.length) return callback();
-    $.getJSON(
-      "{{ url_for('api_ns.api_users') }}", {
-        pattern: "*"+query+"*"
-      },
-      function( data ) {
-        callback( data.users.map(function(x) { return { user: x }; }) );
-      }
-    );
-  }
-});
+  var $assignee_selectize = $('#assignee-selectize').selectize({
+    valueField: 'user',
+    labelField: 'user',
+    searchField: 'user',
+    maxItems: 1,
+    create: false,
+    load: function(query, callback) {
+      if (!query.length) return callback();
+      $.getJSON(
+        "{{ url_for('api_ns.api_users') }}", {
+          pattern: "*"+query+"*"
+        },
+        function( data ) {
+          callback( data.users.map(function(x) { return { user: x }; }) );
+        }
+      );
+    }
+  });
 
-    var author_selectize_control = $author_selectize[0].selectize;
+  var assignee_selectize_control = $assignee_selectize[0].selectize;
 
-$("#author-selectize-reset").on('click', function(e){
-  author_selectize_control.clear();
-});
+  $("#assignee-selectize-reset").on('click', function(e){
+    assignee_selectize_control.clear();
+  });
+
+  var $author_selectize = $('#author-selectize').selectize({
+    valueField: 'user',
+    labelField: 'user',
+    searchField: 'user',
+    maxItems: 1,
+    create: false,
+    load: function(query, callback) {
+      if (!query.length) return callback();
+      $.getJSON(
+        "{{ url_for('api_ns.api_users') }}", {
+          pattern: "*"+query+"*"
+        },
+        function( data ) {
+          callback( data.users.map(function(x) { return { user: x }; }) );
+        }
+      );
+    }
+  });
+
+  var author_selectize_control = $author_selectize[0].selectize;
+
+  $("#author-selectize-reset").on('click', function(e){
+    author_selectize_control.clear();
+  });
 
   $( "#filters_form" ).submit(function( event ) {
 
diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py
index 121bb7d..93857c1 100644
--- a/pagure/ui/issues.py
+++ b/pagure/ui/issues.py
@@ -486,6 +486,7 @@ def view_issues(repo, username=None, namespace=None):
     """
 
     status = flask.request.args.get("status", "Open")
+    status = flask.request.args.get("close_status") or status
     priority = flask.request.args.get("priority", None)
     tags = flask.request.args.getlist("tags")
     tags = [tag.strip() for tag in tags if tag.strip()]
@@ -691,6 +692,7 @@ def view_issues(repo, username=None, namespace=None):
         search_pattern=search_string,
         order=order,
         order_key=order_key,
+        close_status=flask.request.args.get("close_status"),
         status=status,
         total_open=total_open,
         total_closed=total_closed,