jsharmony-cms
Version:
251 lines (214 loc) • 9.44 kB
JavaScript
/*
Copyright 2021 apHarmony
This file is part of jsHarmony.
jsHarmony is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
jsHarmony is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this package. If not, see <http://www.gnu.org/licenses/>.
*/
exports = module.exports = function(jsh, cms){
var _ = jsh._;
var XExt = jsh.XExt;
this.createMenuTree = function(menu, page_key){
var selected_item = null;
//Generate menu item tree
var menu_item_ids = {};
for(var i=0;i<menu.menu_items.length;i++){
var menu_item = menu.menu_items[i];
menu_item.menu_item_children = [];
menu_item_ids[menu_item.menu_item_id] = menu_item;
menu_item.menu_item_type = (menu_item.menu_item_type||'TEXT').toUpperCase();
menu_item.menu_item_link_type = (menu_item.menu_item_link_type||'').toUpperCase();
menu_item.menu_item_link_target = (menu_item.menu_item_link_target||'').toUpperCase();
menu_item.id = menu_item.menu_item_id;
menu_item.children = menu_item.menu_item_children;
//html
menu_item.html = menu_item.menu_item_text;
if(menu_item.menu_item_type != 'HTML') menu_item.html = XExt.escapeHTML(menu_item.html);
menu_item.text = XExt.StripTags(menu_item.html);
menu_item.tag = menu_item.menu_item_tag || '';
menu_item.menu_tag = menu.menu_tag || '';
menu_item.class = menu_item.menu_item_class || '';
menu_item.style = menu_item.menu_item_style || '';
menu_item.href = '';
menu_item.onclick = '';
if(menu_item.menu_item_link_type){
menu_item.href = '#';
menu_item.onclick = 'return false;';
}
menu_item.target = ((menu_item.menu_item_link_type != 'JS') && (menu_item.menu_item_link_target == 'NEWWIN')) ? '_blank' : '';
menu_item.selected = ((menu_item.menu_item_link_type=='PAGE') && ((menu_item.menu_item_link_dest||'').toString() == (page_key||'').toString()));
if(menu_item.selected) selected_item = menu_item;
}
var menu_item_tree = [];
_.each(menu.menu_items, function(menu_item){
if(!menu_item.menu_item_parent_id){
menu_item_tree.push(menu_item);
menu_item.parent = null;
}
else {
menu_item_ids[menu_item.menu_item_parent_id].children.push(menu_item);
menu_item.parent = menu_item_ids[menu_item.menu_item_parent_id];
}
});
function resolveParent(menu_item){
if(menu_item.parents) return;
if(!menu_item.parent){
menu_item.parents = [];
menu_item.depth = 1;
return;
}
if(!menu_item.parent.parents) resolveParent(menu_item.parent);
menu_item.parents = menu_item.parent.parents.concat(menu_item.parent);
menu_item.depth = menu_item.parent.depth + 1;
}
_.each(menu.menu_items, function(menu_item){
resolveParent(menu_item);
menu_item.getSiblings = function(){
var siblings = menu_item.parent ? menu_item.parent.children : menu_item_tree;
return _.filter(siblings, function(sibling){ return sibling.id != menu_item.id; });
};
});
//Add properties to menu
menu.menu_item_tree = menu_item_tree;
menu.tree = menu_item_tree;
menu.items = menu.menu_items;
menu.tag = menu.menu_tag;
menu.currentItem = selected_item;
//Aliases
menu.topItems = menu.tree;
menu.allItems = menu.items;
};
this.createSitemapTree = function(sitemap){
//Input:
// self + siblings
// parents + siblings
// children
//***Populate children, siblings, parent
//parent.siblings
//parent.children
//parent.parent
//self.siblings
//self.children
//self.parent
if(sitemap.self){
//self.parent
if(sitemap.parents && sitemap.parents.length) sitemap.self.parent = sitemap.parents[sitemap.parents.length-1];
else sitemap.self.parent = null;
//self.children
sitemap.self.children = sitemap.children || [];
//self.children.siblings
for(let i=0;i<sitemap.self.children.length;i++){
var child = sitemap.self.children[i];
child.siblings = sitemap.self.children;
child.parent = sitemap.self;
}
//self.siblings
sitemap.self.siblings = sitemap.self.sitemap_item_siblings || [sitemap.self];
for(let i=0;i<sitemap.self.siblings.length;i++){
var sibling = sitemap.self.siblings[i];
//Replace self in sitemap.self.siblings
if(sibling.sitemap_item_id == sitemap.self.sitemap_item_id) sitemap.self.siblings[i] = sitemap.self;
else{
sibling.parent = sitemap.self.parent;
sibling.children = [];
}
}
}
//Replace self in each sitemap.parents.siblings
if(sitemap.parents){
for(let i=0;i<sitemap.parents.length;i++){
let parent = sitemap.parents[i];
//parent.parent
if(i==0) parent.parent = null;
else parent.parent = sitemap.parents[i-1];
//parent.siblings
parent.siblings = parent.sitemap_item_siblings || [parent];
for(var j=0;j<parent.siblings.length;j++){
if(parent.siblings[j].sitemap_item_id == parent.sitemap_item_id) parent.siblings[j] = parent;
}
}
for(let i=0;i<sitemap.parents.length;i++){
let parent = sitemap.parents[i];
//parent.children
if(i==(sitemap.parents.length-1)) parent.children = sitemap.self.siblings;
else parent.children = sitemap.parents[i+1].siblings;
}
}
//Generate tree and root
if(sitemap.parents && sitemap.parents.length){
sitemap.tree = [sitemap.parents[0]];
sitemap.root = sitemap.parents[0];
}
else if(sitemap.self){
sitemap.root = sitemap.self;
sitemap.tree = sitemap.self.siblings;
}
else sitemap.tree = null;
//Populate allItems
sitemap.allItems = [];
_.each(sitemap.parents, function(parent){
_.each(parent.siblings, function(sibling){ sitemap.allItems.push(sibling); });
});
if(sitemap.self){
_.each(sitemap.self.siblings, function(sibling){ sitemap.allItems.push(sibling); });
_.each(sitemap.self.children, function(child){ sitemap.allItems.push(child); });
}
//Populate id and item fields
var itemsToProcess = sitemap.allItems;
_.each(sitemap.breadcrumbs, function(sitemap_item){
if(!_.includes(itemsToProcess, sitemap_item)) itemsToProcess.push(sitemap_item);
});
_.each(itemsToProcess, function(sitemap_item){
sitemap_item.id = sitemap_item.sitemap_item_id;
sitemap_item.sitemap_item_type = (sitemap_item.sitemap_item_type||'TEXT').toUpperCase();
sitemap_item.sitemap_item_link_type = (sitemap_item.sitemap_item_link_type||'').toUpperCase();
sitemap_item.sitemap_item_link_target = (sitemap_item.sitemap_item_link_target||'').toUpperCase();
//html
sitemap_item.html = sitemap_item.sitemap_item_text;
if(sitemap_item.sitemap_item_type != 'HTML') sitemap_item.html = XExt.escapeHTML(sitemap_item.html);
sitemap_item.text = XExt.StripTags(sitemap_item.html);
sitemap_item.tag = sitemap_item.sitemap_item_tag || '';
sitemap_item.sitemap_tag = sitemap.sitemap_tag || '';
sitemap_item.class = sitemap_item.sitemap_item_class || '';
sitemap_item.style = sitemap_item.sitemap_item_style || '';
sitemap_item.href = '';
sitemap_item.onclick = '';
if(sitemap_item.sitemap_item_link_type){
sitemap_item.href = '#';
sitemap_item.onclick = 'return false;';
}
sitemap_item.target = ((sitemap_item.sitemap_item_link_type != 'JS') && (sitemap_item.sitemap_item_link_target == 'NEWWIN')) ? '_blank' : '';
sitemap_item.selected = (sitemap_item.sitemap_item_id == (sitemap.self && sitemap.self.sitemap_item_id));
});
//Populate parents, depth
function resolveParent(sitemap_item){
if(sitemap_item.parents) return;
if(!sitemap_item.parent){
sitemap_item.parents = [];
sitemap_item.depth = 1;
return;
}
if(!sitemap_item.parent.parents) resolveParent(sitemap_item.parent);
sitemap_item.parents = sitemap_item.parent.parents.concat(sitemap_item.parent);
sitemap_item.depth = sitemap_item.parent.depth + 1;
}
_.each(sitemap.allItems, function(sitemap_item){
resolveParent(sitemap_item);
sitemap_item.getSiblings = function(){
var siblings = sitemap_item.parent ? sitemap_item.parent.children : sitemap.tree;
return _.filter(siblings, function(sibling){ return sibling.id != sitemap_item.id; });
};
});
//Aliases
sitemap.topItems = sitemap.tree;
sitemap.currentItem = sitemap.self;
sitemap.item = sitemap.self;
};
};