From 84bd84ffd7a65d2e64c4779cf1e2e6aebf9ca3ab Mon Sep 17 00:00:00 2001
From: Vaibhav Mule <vaibhavmule135@gmail.com>
Date: Fri, 6 Mar 2020 13:51:10 +0000
Subject: [PATCH] upgrade Django Select 2

---
 .../static/js/django_select2-checkboxes.js    |  54 ++++--
 .../static/js/select2.multi-checkboxes.js     | 181 +++++++++++-------
 .../src/sass/apply/components/_select2.scss   |   8 +-
 requirements.txt                              |   2 +-
 4 files changed, 152 insertions(+), 93 deletions(-)

diff --git a/hypha/apply/dashboard/static/js/django_select2-checkboxes.js b/hypha/apply/dashboard/static/js/django_select2-checkboxes.js
index a024d320e..63ecf8588 100644
--- a/hypha/apply/dashboard/static/js/django_select2-checkboxes.js
+++ b/hypha/apply/dashboard/static/js/django_select2-checkboxes.js
@@ -1,23 +1,35 @@
-(function ($) {
-    var init = function ($element) {
-        options = {
-            placeholder: $element.data('placeholder'),
-            templateSelection: function(selected, total) {
-                let filterType = this.placeholder;
-                if ( !selected.length ) {
-                    return filterType;
-                } else if ( selected.length===total ) {
-                    return 'All ' + filterType + ' selected';
-                }
-                return selected.length + ' of ' + total + ' ' + filterType + ' selected';
-            }
-        };
-        $element.select2MultiCheckboxes(options);
-    };
-    $(function () {
+/* global jQuery */
+(function($) {
+  $.fn.select2.amd.require(
+    [
+      'select2/multi-checkboxes/dropdown',
+      'select2/multi-checkboxes/selection',
+      'select2/multi-checkboxes/results'
+    ],
+    function(DropdownAdapter, SelectionAdapter, ResultsAdapter) {
+
+      $(function () {
         $('.django-select2-checkboxes').each(function (i, element) {
-            var $element = $(element);
-            init($element);
+          var $element = $(element)
+
+          $element.select2({
+            placeholder: $element.data('placeholder'),
+            templateSelection: function(data) {
+              let filterType = $element.data('placeholder');
+
+              if (!data.selected.length) {
+                return filterType
+              } else if (data.selected.length == data.all.length ) {
+                return 'All ' + filterType + ' selected';
+              }
+              return data.selected.length + ' of ' + data.all.length + ' ' + filterType + ' selected';
+            },
+            selectionAdapter: SelectionAdapter,
+            resultsAdapter: ResultsAdapter
+          });
+
         });
-    });
-}(this.jQuery));
+      });
+    }
+  );
+}(this.jQuery));
\ No newline at end of file
diff --git a/hypha/apply/dashboard/static/js/select2.multi-checkboxes.js b/hypha/apply/dashboard/static/js/select2.multi-checkboxes.js
index ec6182afb..815268be4 100644
--- a/hypha/apply/dashboard/static/js/select2.multi-checkboxes.js
+++ b/hypha/apply/dashboard/static/js/select2.multi-checkboxes.js
@@ -3,77 +3,124 @@
  * - allow to select multi values via normal dropdown control
  *
  * author      : wasikuss
- * repo        : https://github.com/wasikuss/select2-multi-checkboxes
+ * repo        : https://github.com/wasikuss/select2-multi-checkboxes/tree/amd
  * inspired by : https://github.com/select2/select2/issues/411
  * License     : MIT
  */
-(function($) {
-  var S2MultiCheckboxes = function(options, element) {
-    var self = this;
-    self.options = options;
-    self.$element = $(element);
-  var values = self.$element.val();
-    self.$element.removeAttr('multiple');
-    self.select2 = self.$element.select2({
-      allowClear: true,
-      minimumResultsForSearch: options.minimumResultsForSearch,
-      placeholder: options.placeholder,
-      closeOnSelect: false,
-      templateSelection: function() {
-        return self.options.templateSelection(self.$element.val() || [], $('option', self.$element).length);
-      },
-      templateResult: function(result) {
-        if (result.loading !== undefined)
-          return result.text;
-        return $('<div>').text(result.text).addClass(self.options.wrapClass);
-      },
-      matcher: function(params, data) {
-        var original_matcher = $.fn.select2.defaults.defaults.matcher;
-        var result = original_matcher(params, data);
-        if (result && self.options.searchMatchOptGroups && data.children && result.children && data.children.length != result.children.length) {
-          result.children = data.children;
-        }
-        return result;
-      }
-    }).data('select2');
-    self.select2.$results.off("mouseup").on("mouseup", ".select2-results__option[aria-selected]", (function(self) {
-      return function(evt) {
-        var $this = $(this);
-
-        var data = $this.data('data');
-
-        if ($this.attr('aria-selected') === 'true') {
-          self.trigger('unselect', {
-            originalEvent: evt,
-            data: data
-          });
-          return;
-        }
-
-        self.trigger('select', {
-          originalEvent: evt,
-          data: data
-        });
-      }
-    })(self.select2));
-    self.$element.attr('multiple', 'multiple').val(values).trigger('change.select2');
+
+/* global define jQuery */
+(function(factory) {
+  if (typeof define === 'function' && define.amd) {
+    define(['jquery'], factory);
+  } else {
+    // Browser globals
+    factory(jQuery);
+  }
+}(function(jQuery) {
+  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
+    define = jQuery.fn.select2.amd.define;
   }
+  var define;
 
-  $.fn.extend({
-    select2MultiCheckboxes: function() {
-      var options = $.extend({
-        placeholder: 'Choose elements',
-        templateSelection: function(selected, total) {
-          return selected.length + ' > ' + total + ' total';
-        },
-        wrapClass: 'wrap',
-        minimumResultsForSearch: -1,
-        searchMatchOptGroups: true
-      }, arguments[0]);
-
-      this.each(function() {
-        new S2MultiCheckboxes(options, this);
-      });
+  /* global define */
+  define('select2/multi-checkboxes/dropdown', [
+    'select2/utils',
+    'select2/dropdown',
+    'select2/dropdown/search',
+    'select2/dropdown/attachBody'
+  ],
+  function(Utils, Dropdown, DropdownSearch, AttachBody) {
+    return Utils.Decorate(
+      Utils.Decorate(
+        Dropdown,
+        DropdownSearch
+      ),
+      AttachBody
+    );
+  });
+
+
+  /* global define */
+  define('select2/multi-checkboxes/results', [
+    'jquery',
+    'select2/utils',
+    'select2/results'
+  ],
+  function($, Utils, _Results) {
+    function Results() {
+      Results.__super__.constructor.apply(this, arguments);
     }
+    Utils.Extend(Results, _Results);
+
+    Results.prototype.highlightFirstItem = function() {
+      this.ensureHighlightVisible();
+    };
+
+    Results.prototype.bind = function(container) {
+      container.on('open', function() {
+        var $options = this.$results.find('.select2-results__option[aria-selected]');
+        var $selected = $options.filter('[aria-selected=true]');
+        var $optionToScrollTo = ($selected.length > 0 ? $selected : $selected).first();
+        $optionToScrollTo.trigger('mouseenter');
+      });
+      Results.__super__.bind.apply(this, arguments);
+    };
+
+    Results.prototype.template = function(result, container) {
+      var template = this.options.get('templateResult');
+      var escapeMarkup = this.options.get('escapeMarkup');
+
+      var content = template(result, container);
+      $(container).addClass('multi-checkboxes_wrap');
+
+      if (content == null) {
+        container.style.display = 'none';
+      } else if (typeof content === 'string') {
+        container.innerHTML = escapeMarkup(content);
+      } else {
+        $(container).append(content);
+      }
+    };
+
+    return Results;
+  });
+
+
+  /* global define */
+  define('select2/multi-checkboxes/selection', [
+    'select2/utils',
+    'select2/selection/multiple',
+    'select2/selection/placeholder',
+    'select2/selection/single',
+    'select2/selection/eventRelay'
+  ],
+  function(Utils, MultipleSelection, Placeholder, SingleSelection, EventRelay) {
+    var adapter = Utils.Decorate(MultipleSelection, Placeholder);
+    adapter = Utils.Decorate(adapter, EventRelay);
+
+    adapter.prototype.render = function() {
+      return SingleSelection.prototype.render.call(this);
+    };
+
+    adapter.prototype.update = function(data) {
+      var $rendered = this.$selection.find('.select2-selection__rendered');
+      var formatted = '';
+
+      if (data.length === 0) {
+        formatted = this.options.get('placeholder') || '';
+      } else {
+        var itemsData = {
+          selected: data || [],
+          all: this.$element.find('option') || []
+        };
+        formatted = this.display(itemsData, $rendered);
+      }
+
+      $rendered.empty().append(formatted);
+      $rendered.prop('title', formatted);
+    };
+
+    return adapter;
   });
-})(jQuery);
+})
+);
diff --git a/hypha/static_src/src/sass/apply/components/_select2.scss b/hypha/static_src/src/sass/apply/components/_select2.scss
index dff4cdb83..fa4207c8d 100644
--- a/hypha/static_src/src/sass/apply/components/_select2.scss
+++ b/hypha/static_src/src/sass/apply/components/_select2.scss
@@ -71,17 +71,17 @@ $dropdown-height: 45px;
         padding: 0;
 
         &[aria-selected='true'] {
-            .wrap {
+
                 &::before {
                     background: url('./../../images/tick.svg') $color--dark-blue center no-repeat;
                     background-size: 12px;
                     border: 1px solid $color--dark-blue;
                     content: '';
                 }
-            }
+            
         }
 
-        .wrap {
+
             display: flex;
             align-items: center;
             padding: 6px;
@@ -94,6 +94,6 @@ $dropdown-height: 45px;
                 border: 1px solid $color--mid-grey;
                 content: '';
             }
-        }
+    
     }
 }
diff --git a/requirements.txt b/requirements.txt
index 17af6dd3e..33881388f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -25,7 +25,7 @@ django-tables2==1.21.2
 django-tinymce4-lite==1.7.5
 django-two-factor-auth==1.9.1
 django-webpack-loader==0.6.0
-django_select2==7.1.1
+django_select2==7.2.0
 djangorestframework==3.9.2
 djangorestframework-api-key==1.4.1
 django==2.2.11
-- 
GitLab