@unclepaul/allcountjs
Version:
The open source framework for rapid business application development with Node.js
80 lines (70 loc) • 3.37 kB
JavaScript
var _ = require('underscore');
module.exports = function (entityDescriptionService, viewService, linkBuilder) {
var menuItems;
var menuService = {};
menuService.compile = function (objects, errors) {
menuItems = _.flatten(objects.map(function (item) {
return item.propertyValue('menuItems') && item.propertyValue('menuItems').map(function (i) { return i.evaluateProperties()}) || [];
}));
menuItems.forEach(menuService.compileCheck(errors));
objects.forEach(function (obj) {
var appName = obj.propertyValue('appName');
if (appName) {
exports.appNameValue = appName;
}
var appIcon = obj.propertyValue('appIcon');
if (appIcon) {
menuService.appIconValue = appIcon;
}
var appTitle = obj.propertyValue('appTitle');
if (appTitle) {
menuService.appTitle = appTitle;
}
});
};
menuService.compileCheck = function (errors) {
return function compileCheckRecursive(item) {
if (item.children) {
if (item.entityTypeId || item.view) {
errors.error("Item '%s' has children and defines reference simultaneously", item.name);
}
item.children.forEach(compileCheckRecursive);
} else if ((item.entityTypeId || item.view) && !(_.isString(item.entityTypeId) || _.isString(item.view))) {
errors.error('Entity type or view references either should be string type');
} else if (item.view && item.entityTypeId) { //TODO compile check
errors.error("Item '%s' defines multiple references simultaneously", item.name);
} else if (item.view && !viewService.views[item.view]) {
errors.error("View '%s' referenced in item '%s' is not defined", item.view, item.name);
} else if (item.entityTypeId && !entityDescriptionService.hasEntityDescription(item.entityTypeId)) {
errors.error("Entity type '%s' referenced in item '%s' is not defined", item.entityTypeId, item.name);
} else {
item.url = linkBuilder.buildLinkTo(item);
}
}
};
menuService.menus = function (user) {
return menuItems.map(menuService.filterMenus(user)).filter(function (menu) {return !!menu});
};
menuService.filterMenus = function (user) {
return function filterMenusRecursive(item) {
if (item.children) {
var newItem = _.clone(item);
newItem.children = item.children.map(filterMenusRecursive).filter(function (i) {
return !!i
});
return newItem.children.length > 0 ? newItem : undefined;
} else if (item.view) { //TODO security
return item;
} else {
return entityDescriptionService.userHasReadAccess({entityTypeId: item.entityTypeId}, user) ? item : undefined;
}
}
};
menuService.appName = function () {
return exports.appNameValue;
};
menuService.appIcon = function () {
return menuService.appIconValue;
};
return menuService;
};