From fc21363e13d2178b52363ef8821d08bfafcacc5a Mon Sep 17 00:00:00 2001
From: sks444 <krishnasingh.ss30@gmail.com>
Date: Wed, 28 Oct 2020 11:57:58 +0530
Subject: [PATCH] Change screening status form choices dynamically

---
 hypha/apply/funds/models/submissions.py       | 17 ++++++-
 .../applicationsubmission_admin_detail.html   |  2 +-
 .../funds/includes/screening_form.html        |  4 +-
 .../includes/screening_status_block.html      |  2 +-
 .../src/javascript/apply/screening-status.js  | 44 ++++++++++++++++++-
 5 files changed, 63 insertions(+), 6 deletions(-)

diff --git a/hypha/apply/funds/models/submissions.py b/hypha/apply/funds/models/submissions.py
index 197a90a00..397fd5e75 100644
--- a/hypha/apply/funds/models/submissions.py
+++ b/hypha/apply/funds/models/submissions.py
@@ -1,6 +1,7 @@
 from functools import partialmethod
-
+import json
 from django.conf import settings
+from django.apps import apps
 from django.contrib.auth import get_user_model
 from django.contrib.auth.models import Group
 from django.contrib.contenttypes.fields import GenericRelation
@@ -824,6 +825,20 @@ class ApplicationSubmission(
     def joined_screening_statuses(self):
         return ', '.join([s.title for s in self.screening_statuses.all()])
 
+    @property
+    def yes_screening_statuses(self):
+        ScreeningStatus = apps.get_model('funds', 'ScreeningStatus')
+        return json.dumps(
+            {status.title: status.id for status in ScreeningStatus.objects.filter(yes=True)}
+        )
+
+    @property
+    def no_screening_statuses(self):
+        ScreeningStatus = apps.get_model('funds', 'ScreeningStatus')
+        return json.dumps(
+            {status.title: status.id for status in ScreeningStatus.objects.filter(yes=False)}
+        )
+
 
 @receiver(post_transition, sender=ApplicationSubmission)
 def log_status_update(sender, **kwargs):
diff --git a/hypha/apply/funds/templates/funds/applicationsubmission_admin_detail.html b/hypha/apply/funds/templates/funds/applicationsubmission_admin_detail.html
index 3316d6202..3f2d4b1c4 100644
--- a/hypha/apply/funds/templates/funds/applicationsubmission_admin_detail.html
+++ b/hypha/apply/funds/templates/funds/applicationsubmission_admin_detail.html
@@ -17,7 +17,7 @@
     <div class="js-actions-sidebar sidebar__inner sidebar__inner--light-blue sidebar__inner--actions {% if mobile %}sidebar__inner--mobile{% endif %}">
         {% include "funds/includes/admin_primary_actions.html" %}
     </div>
-    {% include "funds/includes/screening_form.html" with submission=object %}
+    {% include "funds/includes/screening_form.html" with submission=object default_yes=default_yes_screening_status default_no=default_no_screening_status %}
     {% include "funds/includes/progress_form.html" %}
     {% include "funds/includes/update_lead_form.html" %}
     {% include "funds/includes/update_reviewer_form.html" %}
diff --git a/hypha/apply/funds/templates/funds/includes/screening_form.html b/hypha/apply/funds/templates/funds/includes/screening_form.html
index 6d51f81a5..1495e3723 100644
--- a/hypha/apply/funds/templates/funds/includes/screening_form.html
+++ b/hypha/apply/funds/templates/funds/includes/screening_form.html
@@ -1,7 +1,7 @@
 {% if screening_form.should_show %}
-<div class="modal" id="screen-application">
+<div class="modal" id="screen-application" data-yes-statuses="{{ submission.yes_screening_statuses }}" data-no-statuses="{{ submission.no_screening_statuses }}" data-default-yes="{{ default_yes }}" data-default-no="{{ default_no }}">
     <h4 class="modal__header-bar">Update status</h4>
-    <p>Current statuses: {{ submission.screening_statuses.all|join:', ' }}</p>
+    <p id="current-status">Current statuses: {{ submission.screening_statuses.all|join:', ' }}</p>
     {% include 'funds/includes/delegated_form_base.html' with form=screening_form value='Screen'%}
 </div>
 {% endif %}
diff --git a/hypha/apply/funds/templates/funds/includes/screening_status_block.html b/hypha/apply/funds/templates/funds/includes/screening_status_block.html
index ab85d5cf4..d46b93996 100644
--- a/hypha/apply/funds/templates/funds/includes/screening_status_block.html
+++ b/hypha/apply/funds/templates/funds/includes/screening_status_block.html
@@ -24,7 +24,7 @@
         {% if object.has_default_screening_status_set %}
             <p id="screening-options-para">
                 {{ object.screening_statuses.all|join:', ' }}
-                <a id="screening-options" data-fancybox="" data-src="#screen-application" class="link link--secondary-change" href="#">Screening Options</a>
+                <a id="screening-options" data-fancybox="" data-src="#screen-application" data-yes="{% if object.has_yes_default_screening_status_set %}true{% else %}false{% endif %}" class="link link--secondary-change" href="#">Screening Options</a>
             </p>
         {% endif %}
     </div>
diff --git a/hypha/static_src/src/javascript/apply/screening-status.js b/hypha/static_src/src/javascript/apply/screening-status.js
index 5ba76667c..3ad2ccb9c 100644
--- a/hypha/static_src/src/javascript/apply/screening-status.js
+++ b/hypha/static_src/src/javascript/apply/screening-status.js
@@ -15,7 +15,7 @@
             data: {yes: yes},
             success: function (json) {
                 if (json) {
-                    var screeningOptions = $('<p id="screening-options-para">' + json.title + '<a id="screening-options" data-fancybox="" data-src="#screen-application" class="link link--secondary-change" href="#">Screening Options</a></p>');
+                    var screeningOptions = $('<p id="screening-options-para">' + json.title + '<a id="screening-options-ajax" data-fancybox="" data-src="#screen-application" data-yes=' + yes + ' class="link link--secondary-change" href="#"> Screening Options</a></p>');
                     $('.show-screening-options').find('#screening-options-para').remove();
                     $('.show-screening-options').append(screeningOptions);
                     if (yes === true) {
@@ -30,4 +30,46 @@
             }
         });
     });
+
+    $('.show-screening-options').on('click', '#screening-options-ajax', function(){
+
+        var $screeningOptions = $(this);
+        var currentStatus = $screeningOptions.data('yes');
+        var $screenApplication = $('#screen-application');
+        var yesStatuses = $screenApplication.data('yes-statuses');
+        var noStatuses = $screenApplication.data('no-statuses');
+        var defaultYes = $screenApplication.data('default-yes');
+        var defaultNo = $screenApplication.data('default-no');
+        var $screeningStatuses = $screenApplication.find('#id_screening_statuses');
+        $screeningStatuses = $screeningStatuses.empty();
+        if (currentStatus === true) {
+            $('#current-status').text('Current statuses: ' + defaultYes);
+            $.each(yesStatuses, function(key,value) {
+                if(key === defaultYes) {
+                    $screeningStatuses.append($('<option></option>')
+                    .attr('value', value)
+                    .attr('selected', 'selected').text(key));
+                }
+                else {
+                    $screeningStatuses.append($('<option></option>')
+                    .attr('value', value).text(key));   
+                }
+              });
+        }
+        else {
+            $('#current-status').text('Current statuses: ' + defaultNo);
+            $.each(noStatuses, function(key,value) {
+                if(key === defaultNo) {
+                    $screeningStatuses.append($("<option></option>")
+                    .attr("value", value)
+                    .attr("selected","selected").text(key));
+                }
+                else {
+                    $screeningStatuses.append($("<option></option>")
+                    .attr("value", value).text(key));   
+                }
+            }); 
+        }
+    });
+    
 })(jQuery);
-- 
GitLab