+function add_new_filterset() {
+ let template = document.querySelector('.filter'); // First one is fine.
+ let div = template.cloneNode(true);
+ let add_menu = div.querySelector('#filter-add-menu');
+ if (add_menu !== null) {
+ div.removeChild(add_menu);
+ }
+ let submenu = div.querySelector('#filter-submenu');
+ if (submenu !== null) {
+ div.removeChild(submenu);
+ }
+ div.querySelector('.filters').replaceChildren();
+ div.dataset.filterId = next_filterset_id++;
+ template.parentElement.appendChild(div);
+}
+
+function try_gc_filter_menus(cheap) {
+ let empties = [];
+ let divs = [];
+ for (const filter_div of document.querySelectorAll('.filter')) {
+ let id = filter_div.dataset.filterId;
+ divs.push(filter_div);
+ empties.push(global_filters[id] === undefined || global_filters[id].length === 0);
+ }
+ let last_div = divs[empties.length - 1];
+ if (cheap) {
+ // See if we have two empty filter lists at the bottom of the list;
+ // if so, we can remove one without it looking funny in the UI.
+ // If not, we'll have to wait until closing the menu.
+ // (The menu is positioned at the second-last one, so we can
+ // remove the last one without issue.)
+ if (empties.length >= 2 && empties[empties.length - 2] && empties[empties.length - 1]) {
+ delete global_filters[last_div.dataset.filterId];
+ last_div.parentElement.removeChild(last_div);
+ }
+ } else {
+ // This is a different situation from try_cheap_gc(), where we should
+ // remove the one _not_ last. We might need to move the menu to the last one,
+ // though, so it doesn't get lost.
+ for (let i = 0; i < empties.length - 1; ++i) {
+ if (!empties[i]) {
+ continue;
+ }
+ let div = divs[i];
+ delete global_filters[div.dataset.filterId];
+ let add_menu = div.querySelector('#filter-add-menu');
+ if (add_menu !== null) {
+ div.removeChild(add_menu);
+ last_div.appendChild(add_menu);
+ }
+ let submenu = div.querySelector('#filter-submenu');
+ if (submenu !== null) {
+ div.removeChild(submenu);
+ last_div.appendChild(submenu);
+ }
+ div.parentElement.removeChild(div);
+ }
+ }
+}
+
+function checkbox_changed(filter_div, filterset, e, filter_type, id) {