From 0081716841ee83335d0c143062ac17b35473ab39 Mon Sep 17 00:00:00 2001
From: Kevin Brown <kevin@kevinbrown.in>
Date: Sat, 30 Aug 2014 17:46:34 -0400
Subject: [PATCH] Header and footer decorators

Added examples of header and footer decorators.
---
 dist/js/select2.amd.full.js      |  2 +-
 dist/js/select2.amd.js           |  2 +-
 dist/js/select2.full.js          |  2 +-
 dist/js/select2.js               |  2 +-
 playground/basic/decorators.html | 33 +++++++++++++++++++++++++++++---
 src/js/select2/options.js        |  2 +-
 6 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/dist/js/select2.amd.full.js b/dist/js/select2.amd.full.js
index cddc8bee..e2738ebf 100644
--- a/dist/js/select2.amd.full.js
+++ b/dist/js/select2.amd.full.js
@@ -507,7 +507,7 @@ define('select2/options',[
 
     this.dataAdapter = SelectData;
     this.resultsAdapter = ResultsList;
-    this.dropdownAdapter = Dropdown;
+    this.dropdownAdapter = options.dropdownAdapter || Dropdown;
     this.selectionAdapter = options.selectionAdapter;
 
     if (this.selectionAdapter == null) {
diff --git a/dist/js/select2.amd.js b/dist/js/select2.amd.js
index cddc8bee..e2738ebf 100644
--- a/dist/js/select2.amd.js
+++ b/dist/js/select2.amd.js
@@ -507,7 +507,7 @@ define('select2/options',[
 
     this.dataAdapter = SelectData;
     this.resultsAdapter = ResultsList;
-    this.dropdownAdapter = Dropdown;
+    this.dropdownAdapter = options.dropdownAdapter || Dropdown;
     this.selectionAdapter = options.selectionAdapter;
 
     if (this.selectionAdapter == null) {
diff --git a/dist/js/select2.full.js b/dist/js/select2.full.js
index d9573e7f..f61d2daa 100644
--- a/dist/js/select2.full.js
+++ b/dist/js/select2.full.js
@@ -10044,7 +10044,7 @@ define('select2/options',[
 
     this.dataAdapter = SelectData;
     this.resultsAdapter = ResultsList;
-    this.dropdownAdapter = Dropdown;
+    this.dropdownAdapter = options.dropdownAdapter || Dropdown;
     this.selectionAdapter = options.selectionAdapter;
 
     if (this.selectionAdapter == null) {
diff --git a/dist/js/select2.js b/dist/js/select2.js
index 14d04fa4..125ee08a 100644
--- a/dist/js/select2.js
+++ b/dist/js/select2.js
@@ -935,7 +935,7 @@ define('select2/options',[
 
     this.dataAdapter = SelectData;
     this.resultsAdapter = ResultsList;
-    this.dropdownAdapter = Dropdown;
+    this.dropdownAdapter = options.dropdownAdapter || Dropdown;
     this.selectionAdapter = options.selectionAdapter;
 
     if (this.selectionAdapter == null) {
diff --git a/playground/basic/decorators.html b/playground/basic/decorators.html
index 90b42ab0..706b9b5f 100644
--- a/playground/basic/decorators.html
+++ b/playground/basic/decorators.html
@@ -152,7 +152,8 @@
 </style>
 
 <script>
-require(["select2/core", "select2/utils", "select2/selection"], function (Select2, Utils, Selection) {
+require(["select2/core", "select2/utils", "select2/selection/single",
+         "select2/dropdown"], function (Select2, Utils, Selection, Dropdown) {
     function ClearSelection () { }
 
     ClearSelection.prototype.render = function (decorated) {
@@ -203,10 +204,36 @@ require(["select2/core", "select2/utils", "select2/selection"], function (Select
         }
     };
 
-    var CustomSelection = Utils.Decorate(Selection, ClearSelection);
+    function DropdownFooter () { }
+
+    DropdownFooter.prototype.render = function (decorated) {
+        var $dropdown = decorated.call(this);
+
+        $dropdown.append('<div class="footer">My custom footer</div>');
+
+        return $dropdown;
+    }
+
+    function DropdownHeader () { }
+
+    DropdownHeader.prototype.render = function (decorated) {
+        var $dropdown = decorated.call(this);
+
+        $dropdown.prepend('<div class="header">Some custom header</div>');
+
+        return $dropdown;
+    }
+
+    var CustomSelection = Utils.Decorate(Selection, ClearSelection)
+
+    var CustomDropdown = Utils.Decorate(
+        Utils.Decorate(Dropdown, DropdownHeader),
+        DropdownFooter
+    );
 
     var s2 = new Select2($("#source"), {
-        selectionAdapter: CustomSelection
+        selectionAdapter: CustomSelection,
+        dropdownAdapter: CustomDropdown
     });
 });
 </script>
diff --git a/src/js/select2/options.js b/src/js/select2/options.js
index 1a0589c4..dce6212e 100644
--- a/src/js/select2/options.js
+++ b/src/js/select2/options.js
@@ -11,7 +11,7 @@ define([
 
     this.dataAdapter = SelectData;
     this.resultsAdapter = ResultsList;
-    this.dropdownAdapter = Dropdown;
+    this.dropdownAdapter = options.dropdownAdapter || Dropdown;
     this.selectionAdapter = options.selectionAdapter;
 
     if (this.selectionAdapter == null) {