Files
meanTorrent/modules/core/client/services/menu.client.service.js
2017-05-12 21:50:59 +08:00

201 lines
5.8 KiB
JavaScript

(function () {
'use strict';
angular
.module('core')
.factory('menuService', menuService);
menuService.$inject = ['MeanTorrentConfig'];
function menuService(MeanTorrentConfig) {
var shouldRender;
var service = {
addMenu: addMenu,
addMenuItem: addMenuItem,
addSubMenuItem: addSubMenuItem,
defaultRoles: MeanTorrentConfig.meanTorrentConfig.userRoles,
getMenu: getMenu,
menus: {},
removeMenu: removeMenu,
removeMenuItem: removeMenuItem,
removeSubMenuItem: removeSubMenuItem,
validateMenuExistence: validateMenuExistence
};
init();
return service;
// Add new menu object by menu id
function addMenu(menuId, options) {
options = options || {};
// Create the new menu
service.menus[menuId] = {
roles: options.roles || service.defaultRoles,
items: options.items || [],
shouldRender: shouldRender
};
// Return the menu object
return service.menus[menuId];
}
// Add menu item object
function addMenuItem(menuId, options) {
options = options || {};
// Validate that the menu exists
service.validateMenuExistence(menuId);
// Push new menu item
service.menus[menuId].items.push({
title: options.title || '',
state: options.state || '',
type: options.type || 'item',
class: options.class,
roles: ((options.roles === null || typeof options.roles === 'undefined') ? service.defaultRoles : options.roles),
position: options.position || 0,
items: [],
shouldRender: shouldRender,
target: options.target || undefined
});
// Add submenu items
if (options.items) {
for (var i in options.items) {
if (options.items.hasOwnProperty(i)) {
service.addSubMenuItem(menuId, options.state, options.items[i]);
}
}
}
// Return the menu object
return service.menus[menuId];
}
// Add submenu item object
function addSubMenuItem(menuId, parentItemState, options) {
options = options || {};
// Validate that the menu exists
service.validateMenuExistence(menuId);
// Search for menu item
for (var itemIndex in service.menus[menuId].items) {
if (service.menus[menuId].items[itemIndex].state === parentItemState) {
// Push new submenu item
service.menus[menuId].items[itemIndex].items.push({
title: options.title || '',
state: options.state || '',
params: options.params || {},
roles: ((options.roles === null || typeof options.roles === 'undefined') ? service.menus[menuId].items[itemIndex].roles : options.roles),
position: options.position || 0,
shouldRender: shouldRender,
target: options.target || undefined
});
}
}
// Return the menu object
return service.menus[menuId];
}
// Get the menu object by menu id
function getMenu(menuId) {
// Validate that the menu exists
service.validateMenuExistence(menuId);
// Return the menu object
return service.menus[menuId];
}
function init() {
// A private function for rendering decision
shouldRender = function (user) {
if (this.roles.indexOf('*') !== -1) {
return true;
} else {
if (!user) {
return false;
}
for (var userRoleIndex in user.roles) {
if (user.roles.hasOwnProperty(userRoleIndex)) {
for (var roleIndex in this.roles) {
if (this.roles.hasOwnProperty(roleIndex) && this.roles[roleIndex] === user.roles[userRoleIndex]) {
return true;
}
}
}
}
}
return false;
};
// Adding the topbar menu
addMenu('topbar', {
roles: ['*']
});
}
// Remove existing menu object by menu id
function removeMenu(menuId) {
// Validate that the menu exists
service.validateMenuExistence(menuId);
delete service.menus[menuId];
}
// Remove existing menu object by menu id
function removeMenuItem(menuId, menuItemState) {
// Validate that the menu exists
service.validateMenuExistence(menuId);
// Search for menu item to remove
for (var itemIndex in service.menus[menuId].items) {
if (service.menus[menuId].items.hasOwnProperty(itemIndex) && service.menus[menuId].items[itemIndex].state === menuItemState) {
service.menus[menuId].items.splice(itemIndex, 1);
}
}
// Return the menu object
return service.menus[menuId];
}
// Remove existing menu object by menu id
function removeSubMenuItem(menuId, submenuItemState) {
// Validate that the menu exists
service.validateMenuExistence(menuId);
// Search for menu item to remove
for (var itemIndex in service.menus[menuId].items) {
if (this.menus[menuId].items.hasOwnProperty(itemIndex)) {
for (var subitemIndex in service.menus[menuId].items[itemIndex].items) {
if (this.menus[menuId].items[itemIndex].items.hasOwnProperty(subitemIndex) && service.menus[menuId].items[itemIndex].items[subitemIndex].state === submenuItemState) {
service.menus[menuId].items[itemIndex].items.splice(subitemIndex, 1);
}
}
}
}
// Return the menu object
return service.menus[menuId];
}
// Validate menu existance
function validateMenuExistence(menuId) {
if (menuId && menuId.length) {
if (service.menus[menuId]) {
return true;
} else {
throw new Error('Menu does not exist');
}
} else {
throw new Error('MenuId was not provided');
}
}
}
}());