@@ -231,15 +231,42 @@ |
| 231 | 231 | var openers = document.querySelectorAll("[data-pins-open]"); |
| 232 | 232 | var closeButton = modal.querySelector("[data-pins-close]"); |
| 233 | 233 | var filter = modal.querySelector("[data-pins-filter]"); |
| 234 | + var list = modal.querySelector("[data-pins-list]"); |
| 234 | 235 | var rows = Array.prototype.slice.call(modal.querySelectorAll("[data-pins-row]")); |
| 235 | 236 | var checkboxes = Array.prototype.slice.call(modal.querySelectorAll("[data-pins-checkbox]")); |
| 236 | 237 | var remaining = modal.querySelector("[data-pins-remaining]"); |
| 237 | 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 | 244 | function checkedCount() { |
| 240 | 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 | 270 | function refreshPins() { |
| 244 | 271 | var count = checkedCount(); |
| 245 | 272 | var left = Math.max(0, 6 - count); |
@@ -256,6 +283,7 @@ |
| 256 | 283 | function applyFilter() { |
| 257 | 284 | if (!filter) return; |
| 258 | 285 | var query = filter.value.trim().toLowerCase(); |
| 286 | + arrangeRows(query); |
| 259 | 287 | rows.forEach(function (row) { |
| 260 | 288 | var haystack = (row.getAttribute("data-pins-search") || "").toLowerCase(); |
| 261 | 289 | row.hidden = query !== "" && haystack.indexOf(query) === -1; |
@@ -287,7 +315,10 @@ |
| 287 | 315 | }); |
| 288 | 316 | if (filter) filter.addEventListener("input", applyFilter); |
| 289 | 317 | checkboxes.forEach(function (box) { |
| 290 | | - box.addEventListener("change", refreshPins); |
| 318 | + box.addEventListener("change", function () { |
| 319 | + refreshPins(); |
| 320 | + applyFilter(); |
| 321 | + }); |
| 291 | 322 | }); |
| 292 | 323 | refreshPins(); |
| 293 | 324 | })(); |