@@ -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 | })(); |