"use strict"; import {Utils} from "../Utils/Utils.ecma.js"; /** * @callback menu_view_event_callback * @param {!HTMLElement} item * @param {!Event} event * @returns {void} */ export const MenuView = (function(){ const MenuView = function(routes_maker){ const self = this; let built = false; const constructor = () => {}; const load_database = (item, event) => { Utils.upload((...data) => { try{ const [layers, routes, menu] = JSON.parse(data[0].content); menu.forEach(([type, key]) => { if(routes[key]){ const [name, dots] = routes[key]; routes_maker.routes.add(name, key); add_new_item(routes_maker[type].get(key), type); dots.forEach(([longitude, latitude]) => { routes_maker.map.set_point(longitude, latitude); }); }; }); }catch(exception){ console.error(exception); }; }); }; const save_database = (item, event) => { Utils.download([ [], routes_maker.routes.get_data(), [...routes_maker.base.item.querySelectorAll(".map-menu [data-field=items] li")].map(item => [ item.getAttribute("data-type"), item.getAttribute("data-key") ]) ], "application/json"); }; const add_new_item = (object, type) => { object && select_item(Utils.set_html(".map-menu [data-field=items] ul", [ ["li", { data_type : type, data_name : object.name, data_key : object.key, data_selected : true, title : object.name }, [ ["span", { class : "name", on_click : (item, event) => { select_item(item.parentNode); } }, object.name] ]] ], routes_maker.base.item)[0]); }; const add_new_route = (item, event) => { add_new_item(routes_maker.routes.add(item.parentNode.querySelector("[type=text]").value.trim()), "routes"); }; const add_new_layer = (item, event) => { add_new_item(null, "layers"); }; const select_item = item => { routes_maker.base.item.querySelectorAll(".map-menu [data-field=items] ul>[data-selected=true]").forEach(item => { item.setAttribute("data-selected", false); }); item.setAttribute("data-selected", true); }; const clear_item_name = (item, event) => { item.parentNode.querySelector("[type=text]").value = ""; }; const show_markers = (item, event) => { Utils.set_attributes(".map", {data_show_markers : item.checked}, routes_maker.base.item); }; const show_routes = (item, event) => { Utils.set_attributes(".map", {data_show_routes : item.checked}, routes_maker.base.item); }; this.build = () => { if(!built && routes_maker.base.item){ built = true; Utils.set_html(routes_maker.base.item, [ ["form", { class : "map-menu", method : "GET", action : "#", on_submit : (form, event) => false }, [ ["fieldset", null, [ ["legend", {data_i18n : "menu"}, "Menu"], ["nav", null, [ ["ul", null, [ MenuView.create_button("load_database", load_database, "Load database"), MenuView.create_button("save_database", save_database, "Save database"), MenuView.create_item("item_name", [ ["label", {for : "item_name"}, [ ["span", {data_i18n : "item_name"}, "Item name"], ["input", { type : "text", name : "item_name", id : "item_name", data_i18n : "item_name", data_i18n_without : true, placeholder : "Item name...", value : "" }] ]], MenuView.button("add_route", add_new_route, "Add route"), MenuView.button("add_layer", add_new_layer, "Add layer"), MenuView.button("clear", clear_item_name, "Clear") ], "Item name"), MenuView.create_item("items", [["nav", null, [["ul", null]]]], "Items"), MenuView.create_item("distance", [["label", {for : "distance"}, [ ["span", {data_i18n : "distance"}, "Distance"], ["input", { type : "number", name : "distance", readonly : true, id : "distance", data_i18n : "distance", data_i18n_without : true, placeholder : "Distance...", value : 0 }], ["span", {data_i18n : "meters_symbol"}, "m"] ]]], "Distance"), MenuView.create_checkbox("show_markers", true, show_markers, "Show markers"), MenuView.create_checkbox("show_routes", true, show_routes, "Show routes") ]] ]] ]] ]] ]); }; }; /** * @returns {string|null} * @access public */ this.get_route_selected = () => { /** @type {HTMLLIElement|null} */ const item_selected = routes_maker.base.item.querySelector(".map-menu [data-field=items] [data-selected=true]"); return item_selected ? item_selected.getAttribute("data-key") : null; }; constructor(); }; /** * @param {!string} name * @returns {string} * @access public * @static */ MenuView.get_id = name => name.replace(/_/g, "-").toLowerCase(); /** * @param {!string} name * @param {!Array.>} item * @param {!string} text * @returns {[string, Object., Array.]} * @access public * @static */ MenuView.create_item = (name, item, text) => ["li", { data_field : name, data_i18n : name, data_i18n_without : true, title : text }, item]; /** * @param {!string} name * @param {!boolean} checked * @param {!menu_view_event_callback} action * @param {!string} text * @returns {[string, Object., Array.]} * @access public * @static */ MenuView.create_checkbox = (name, checked, action, text) => { /** @type {string} */ const id = MenuView.get_id(name); return MenuView.create_item(name, [["label", {for : id}, [ ["input", { type : "checkbox", name : name, id : id, checked : checked, on_change : action }], ["span", {data_i18n : name}, text] ]]], text); }; /** * @param {!string} name * @param {!menu_view_event_callback} action * @param {!string} text * @returns {[string, Object., Array.]} * @access public * @static */ MenuView.button = (name, action, text) => ["button", { type : "button", data_i18n : name, data_i18n_without : true, title : text, on_click : action }, [ ["span", {data_icon : name}], ["span", {data_i18n : name}, text] ]]; /** * @param {!string} name * @param {!menu_view_event_callback} action * @param {!string} text * @returns {[string, Object., Array.]} * @access public * @static */ MenuView.create_button = (name, action, text) => MenuView.create_item(name, [["button", { type : "button", data_i18n : name, data_i18n_without : true, title : text, on_click : action }, [ ["span", {data_icon : name}], ["span", {data_i18n : name}, text] ]]], text) return MenuView; })();