mockup/thet-relitemsfix: Fix filtering of non-selectable items

Johannes Raggam <jenkins-z4DKO/[email protected]> Thu, 27 Jul 2017 14:59:03 -0700 (PDT)
Newsgroups gmane.comp.web.zope.plone.cvs
Message-ID <[email protected]>
Repository: mockup
Branch: refs/heads/thet-relitemsfix
Date: 2017-07-27T23:58:47+02:00
Author: Johannes Raggam (thet) <[email protected]>
Commit: https://github.com/plone/mockup/commit/1c42f7f5f178a22d75279b6f32e2069f64b7809a

Fix filtering of non-selectable items
Do not filter out already selected items in search mode but make them non-selectable.
Also change the filtering logic where select2 kept filtered out items as empty list elements in the result list and making selecting items impossible in some cases.

Files changed:
M CHANGES.rst
M mockup/patterns/relateditems/pattern.js
M mockup/tests/pattern-relateditems-test.js

diff --git a/CHANGES.rst b/CHANGES.rst
index a5f16fbb..36f949fa 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -15,7 +15,9 @@ Incompatibile changes:
 
 Bug fixes:
 
-- * Add item here *
+- Do not filter out already selected items in search mode but make them non-selectable.
+  Also change the filtering logic where select2 kept filtered out items as empty list elements in the result list and making selecting items impossible in some cases.
+  [thet]
 
 
 2.5.0 (2017-07-03)
diff --git a/mockup/patterns/relateditems/pattern.js b/mockup/patterns/relateditems/pattern.js
index f10d3145..28aecc03 100644
--- a/mockup/patterns/relateditems/pattern.js
+++ b/mockup/patterns/relateditems/pattern.js
@@ -239,6 +239,18 @@ define([
           var more = (page * this.options.pageSize) < data.total;
           var results = data.results;
 
+          // Filter out non-selectable and non-folderish while browsing.
+          if (this.browsing) {
+            results = results.filter(
+              function (item) {
+                if (!item.is_folderish && !this.isSelectable(item)) {
+                  return false;
+                }
+                return true;
+              }.bind(this)
+            );
+          }
+
           // Extend ``data`` with a ``oneLevelUp`` item when browsing
           var path = this.currentPath.split('/');
           if (page === 1 &&           // Show level up only on top.
@@ -493,17 +505,6 @@ define([
             item.selectable = false;
           }
         }
-        if (
-          !item.selectable && (
-            !self.browsing ||
-            self.browsing && !item.is_folderish
-          )
-        ) {
-          // Filter out non-selectable and non-folderish while browsing.
-          // or
-          // Exclude already selected items while searching.
-          return;
-        }
         var result = $(self.applyTemplate('result', item));
 
         $('.pattern-relateditems-result-select', result).on('click', function(event) {
diff --git a/mockup/tests/pattern-relateditems-test.js b/mockup/tests/pattern-relateditems-test.js
index 13454588..362dfd5e 100644
--- a/mockup/tests/pattern-relateditems-test.js
+++ b/mockup/tests/pattern-relateditems-test.js
@@ -236,15 +236,18 @@ define([
       $input.trigger(keyup);
       clock.tick(1000);
 
-      // Searching for folder 2 brings up 2 items: folder2 itself and the not-yet-selected image.
-      expect($('.pattern-relateditems-result-select')).to.have.length(2);
+      // Searching for folder 2 brings up 3 items: folder2 itself, the already
+      // selected but now not selectable image and the not-yet-selected image.
+      expect($('.pattern-relateditems-result-select')).to.have.length(3);
 
       // We can even browse into folders in search mode
       $('.pattern-relateditems-result-browse[data-path="/folder2"]').click();
       clock.tick(1000);
 
-      // Being in folder 2, we see again two items...
-      expect($('.pattern-relateditems-result-select')).to.have.length(2);
+      // Being in folder 2, we see again three items...
+      expect($('.pattern-relateditems-result-select')).to.have.length(3);
+      // One of them being selectable
+      expect($('.pattern-relateditems-result-select.selectable')).to.have.length(1);
       expect($('.pattern-relateditems-result-select')[0].text).to.contain('One level up');
 
       // Selecting the image will add it to the selected items.
@@ -267,12 +270,13 @@ define([
       // result list must have expected length
       // Only Images and Folders.
       expect($('.pattern-relateditems-result-select')).to.have.length(5);
+      expect($('.pattern-relateditems-result-select.selectable')).to.have.length(3);
 
 
       // PT 2
 
       // select one element
-      $('a.pattern-relateditems-result-select')[2].click();
+      $('a.pattern-relateditems-result-select[data-path="/image1"]').click();
       expect($('input.pat-relateditems').val()).to.be.equal('UID8');
 
 
@@ -283,10 +287,10 @@ define([
       clock.tick(1000);
 
       // result list must have expected length
-      expect($('.pattern-relateditems-result-select')).to.have.length(4);
+      expect($('.pattern-relateditems-result-select.selectable')).to.have.length(2);
 
       // add another one
-      $('a.pattern-relateditems-result-select')[2].click();
+      $('a.pattern-relateditems-result-select[data-path="/image2"]').click();
       expect($('input.pat-relateditems').val()).to.be.equal('UID8,UID9');
 
       // remove first one
@@ -299,10 +303,10 @@ define([
       var keyup = $.Event('keyup-change');
       $input.trigger(keyup);
       clock.tick(1000);
-      expect($('.pattern-relateditems-result-select')).to.have.length(2);
+      expect($('.pattern-relateditems-result-select.selectable')).to.have.length(2);
 
       // add first from result
-      $('a.pattern-relateditems-result-select')[1].click();
+      $('a.pattern-relateditems-result-select[data-path="/image3"]').click();
       expect($('input.pat-relateditems').val()).to.be.equal('UID9,UID10');
 
     });
@@ -324,7 +328,7 @@ define([
       //  // PT 2
 
       //  // select one element
-      $('a.pattern-relateditems-result-select')[0].click();
+      $('a.pattern-relateditems-result-select[data-path="/document1"]').click();
       expect($('input.pat-relateditems').val()).to.be.equal('UID1');
 
 
@@ -335,10 +339,10 @@ define([
       clock.tick(1000);
 
       //  // result list must have expected length
-      expect($('.pattern-relateditems-result-select')).to.have.length(10);
+      expect($('.pattern-relateditems-result-select.selectable')).to.have.length(10);
 
       //  // add another one
-      $('a.pattern-relateditems-result-select')[0].click();
+      $('a.pattern-relateditems-result-select[data-path="/document2"]').click();
       expect($('input.pat-relateditems').val()).to.be.equal('UID1,UID2');
 
       //  // remove first one
@@ -351,10 +355,10 @@ define([
       var keyup = $.Event('keyup-change');
       $input.trigger(keyup);
       clock.tick(1000);
-      expect($('.pattern-relateditems-result-select')).to.have.length(1);
+      expect($('.pattern-relateditems-result-select.selectable')).to.have.length(1);
 
       //  // add first from result
-      $('a.pattern-relateditems-result-select')[0].click();
+      $('a.pattern-relateditems-result-select[data-path="/folder2/document15"]').click();
       expect($('input.pat-relateditems').val()).to.be.equal('UID2,UID15');
 
     });



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot