filters intersection almost works, except remove checkbox action

This commit is contained in:
lenovo
2022-11-16 21:36:56 +01:00
parent cd22796539
commit b98610e58a
3 changed files with 409 additions and 47 deletions

View File

@@ -116,53 +116,106 @@ function redraw_clusters(indexes) {
}
/*
should iterate through all dom elements with class "menu_items"
and invert (if exist, suppress, else create) the class construct like this :
disabled_by_menu-name
where menu-name is not the name of the menu that contains the item,
but the name of the menu within wich the click provide. exemple :
- you click on menu-item:"france" in menu:"country"
- it disable menu-item:"conference-table-ronde" in menu:"category"
- by adding class "disabled_by_country"
- and if you click again on menu-item:"france" in menu:"country"
- it will remove class "disabled_by_country"
- if it's the last class containing "disabled_by_" it will be re-enabled
see css attribute selectors : https://www.w3schools.com/css/css_attribute_selectors.asp
' pays ' '-- categories --'
' [france] ' ' table ron. '
' chili ' '-- conferenc. --'
' bresil ' ' atelier '
' canada ' '-- forums --'
' benin ' '-- seminaire. --'
' rencontre. '
' autres '
' [pays ] ' ' categories '
' france ' ' table ron. '
' chili ' ' conferenc. '
' bresil ' ' atelier '
' canada ' ' forums '
' benin ' ' seminaire. '
' rencontre. '
' autres '
'-- pays --' ' categories '
' france ' ' table ron. '
' chili ' ' conferenc. '
'-- bresil --' ' [atelier ] '
'-- canada --' ' forums '
'-- benin --' ' seminaire. '
' rencontre. '
' autres '
' pays ' ' [categories] '
' france ' ' table ron. '
' chili ' ' conferenc. '
' bresil ' ' atelier '
' canada ' ' forums '
' benin ' ' seminaire. '
' rencontre. '
' autres '
' pays ' '-- categories --'
' france ' '-- table ron. --'
' [chili ] ' '-- conferenc. --'
' bresil ' ' atelier '
' canada ' ' forums '
' benin ' '-- seminaire. --'
'-- rencontre. --'
' autres '
' pays ' '-- categories --'
' [france] ' ' table ron. '
' chili ' '-- conferenc. --'
' bresil ' ' atelier '
' canada ' '-- forums --'
' benin ' '-- seminaire. --'
' rencontre. '
' autres '
' pays ' '-- categories --'
' [france] ' ' table ron. '
' chili ' '-- conferenc. --'
' bresil ' ' [atelier ] '
' canada ' '-- forums --'
' benin ' '-- seminaire. --'
' rencontre. '
' autres '
*/
function toggle_one_class(menu_from, menu_name, menu_item) {
/*
*/
console.log("\n" + menu_name + " from " + menu_from + ":");
console.log("- " + menu_item);
let html_id = `filter_${menu_name}_${menu_item}`;
let html_class = `disabled_by_${menu_from}`;
let item = document.getElementById(html_id);
let item_classes = item.classList;
item_classes.toggle(html_class);
function html_item(menu_name, menu_item) {
let item = menu_item.replace(/ /g, "_");
let html_id = `filter_${menu_name}_${item}`;
return document.getElementById(html_id);
}
function toggle_all_classes() {
/*
*/
// loop through all items elements of menu in html, and toggle "disabled" if there is or not a class "disabled_by_*"
// get all elements in all menus
let items = document.getElementsByClassName("filter_menu_item");
function toggle_menu_items(menu_name, x_abled) {
let name = menu_name.replace(/ /g, "_");
let class_name = `filter_menu_${name}`;
let items = document.getElementsByClassName(class_name);
for (let item of items) {
let item_classes = item.classList;
let item_classes_value = item_classes.value;
if ( item_classes_value.includes("disabled_by_") )
item.classList.remove('enable');
if (x_abled === "disable") {
item.setAttribute('disabled', '');
else
}
else {
item.removeAttribute('disabled');
}
}
}
function disable_menus(menu_name_ori, menu_item_ori) {
function disable_menus(menu_name_ori, menu_item_ori, is_menu_title) {
let menu_item_name = menu_item_ori._name;
let item_ori_html = html_item(menu_name_ori, menu_item_name);
let is_enabled = item_ori_html.classList.contains('enable');
let keys = Object.keys(menu_item_ori);
// loop through list of other menu_items available for this menu_item
// loop though menu names (pays, categories, mode)
@@ -171,15 +224,21 @@ function disable_menus(menu_name_ori, menu_item_ori) {
continue;
if (menu_name === "indexes")
continue;
// loop through items in menu names (ex. for "pays" : france, chili, cuba)
for (let item of menu_item_ori[menu_name]) {
toggle_one_class( menu_name_ori, menu_name, item.replace(/ /g, "_") );
if (is_menu_title) {
// true == enable
toggle_menu_items(menu_name, "enable");
}
else if (! is_enabled) {
// false == disable
toggle_menu_items(menu_name, "disable");
// loop through items in menu names (ex. for "pays" : france, chili, cuba)
for (let item of menu_item_ori[menu_name]) {
let item_html = html_item(menu_name, item);
item_html.classList.add('enable');
item_html.removeAttribute('disabled');
}
}
}
toggle_all_classes();
/*
*/
}
function filter_show_only(element, menu_name) {
@@ -188,9 +247,12 @@ function filter_show_only(element, menu_name) {
let menu_index = element.getAttribute("data-menu_index");
let menu_item = filters[menu_name][menu_index];
let is_menu_title = true;
let indexes = [];
if (menu_index != "menu_name")
if (menu_index != "menu_name") {
is_menu_title = false;
indexes = menu_item.indexes;
}
add = false;
reverse = false;
@@ -199,7 +261,7 @@ function filter_show_only(element, menu_name) {
add = true;
}
disable_menus(menu_name, menu_item);
disable_menus(menu_name, menu_item, is_menu_title);
let index_array = filter_selection_indexes(menu_name, indexes, reverse, add);
@@ -212,6 +274,9 @@ function filter_show_all() {
g_infowindow.close();
// "item" as a menu name will select all items in all menus
toggle_menu_items("item", "enable");
g_indexes = {};
g_marker_cluster.clearMarkers(true);
g_marker_cluster.addMarkers(g_markers);