tenseleyflow/shithub / b576d25

Browse files

Restore pin modal checked ordering

Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
b576d25c11e63a2097d57d0639aa00df302e2072
Parents
cedfc23
Tree
2f1be87

1 changed file

StatusFile+-
M internal/web/templates/_layout.html 32 1
internal/web/templates/_layout.htmlmodified
@@ -231,15 +231,42 @@
231
     var openers = document.querySelectorAll("[data-pins-open]");
231
     var openers = document.querySelectorAll("[data-pins-open]");
232
     var closeButton = modal.querySelector("[data-pins-close]");
232
     var closeButton = modal.querySelector("[data-pins-close]");
233
     var filter = modal.querySelector("[data-pins-filter]");
233
     var filter = modal.querySelector("[data-pins-filter]");
234
+    var list = modal.querySelector("[data-pins-list]");
234
     var rows = Array.prototype.slice.call(modal.querySelectorAll("[data-pins-row]"));
235
     var rows = Array.prototype.slice.call(modal.querySelectorAll("[data-pins-row]"));
235
     var checkboxes = Array.prototype.slice.call(modal.querySelectorAll("[data-pins-checkbox]"));
236
     var checkboxes = Array.prototype.slice.call(modal.querySelectorAll("[data-pins-checkbox]"));
236
     var remaining = modal.querySelector("[data-pins-remaining]");
237
     var remaining = modal.querySelector("[data-pins-remaining]");
237
     var submit = modal.querySelector("[data-pins-submit]");
238
     var submit = modal.querySelector("[data-pins-submit]");
238
 
239
 
240
+    rows.forEach(function (row, index) {
241
+      row.setAttribute("data-pins-index", String(index));
242
+    });
243
+
239
     function checkedCount() {
244
     function checkedCount() {
240
       return checkboxes.filter(function (box) { return box.checked; }).length;
245
       return checkboxes.filter(function (box) { return box.checked; }).length;
241
     }
246
     }
242
 
247
 
248
+    function rowCheckbox(row) {
249
+      return row.querySelector("[data-pins-checkbox]");
250
+    }
251
+
252
+    function rowIndex(row) {
253
+      return Number(row.getAttribute("data-pins-index") || "0");
254
+    }
255
+
256
+    function arrangeRows(query) {
257
+      if (!list) return;
258
+      var ordered = rows.slice();
259
+      ordered.sort(function (left, right) {
260
+        if (query === "") {
261
+          var leftChecked = !!(rowCheckbox(left) && rowCheckbox(left).checked);
262
+          var rightChecked = !!(rowCheckbox(right) && rowCheckbox(right).checked);
263
+          if (leftChecked !== rightChecked) return leftChecked ? -1 : 1;
264
+        }
265
+        return rowIndex(left) - rowIndex(right);
266
+      });
267
+      ordered.forEach(function (row) { list.appendChild(row); });
268
+    }
269
+
243
     function refreshPins() {
270
     function refreshPins() {
244
       var count = checkedCount();
271
       var count = checkedCount();
245
       var left = Math.max(0, 6 - count);
272
       var left = Math.max(0, 6 - count);
@@ -256,6 +283,7 @@
256
     function applyFilter() {
283
     function applyFilter() {
257
       if (!filter) return;
284
       if (!filter) return;
258
       var query = filter.value.trim().toLowerCase();
285
       var query = filter.value.trim().toLowerCase();
286
+      arrangeRows(query);
259
       rows.forEach(function (row) {
287
       rows.forEach(function (row) {
260
         var haystack = (row.getAttribute("data-pins-search") || "").toLowerCase();
288
         var haystack = (row.getAttribute("data-pins-search") || "").toLowerCase();
261
         row.hidden = query !== "" && haystack.indexOf(query) === -1;
289
         row.hidden = query !== "" && haystack.indexOf(query) === -1;
@@ -287,7 +315,10 @@
287
     });
315
     });
288
     if (filter) filter.addEventListener("input", applyFilter);
316
     if (filter) filter.addEventListener("input", applyFilter);
289
     checkboxes.forEach(function (box) {
317
     checkboxes.forEach(function (box) {
290
-      box.addEventListener("change", refreshPins);
318
+      box.addEventListener("change", function () {
319
+        refreshPins();
320
+        applyFilter();
321
+      });
291
     });
322
     });
292
     refreshPins();
323
     refreshPins();
293
   })();
324
   })();