A common use case for creating a custom module-list layout is to alter the list of modules that appear across the top Mega Menu and More Modules layouts. This can still be accomplished with the sidebar-nav layout, but as you may have guessed, your customization will need to be moved to a different layout. By default, the list of modules in sidebar is built in the sidebar-nav-item-group-modules layout.
Example: Hide Contacts Module for Non-Admin Users
If you had a previous custom layout to hide the Contacts module for non-admin users, it may have been similar to this:
./custom/clients/base/layouts/module-list/module-list.js
({
extendsFrom: 'ModuleListLayout',
initialize: function(options) {
this._super('initialize', [options])
},
_addDefaultMenus: function() {
var moduleList = app.metadata.getModuleNames({filter: 'display_tab', access: 'read'});
if (app.user.get('type') !== 'admin'){
moduleList = _.filter(moduleList, m => { if(m !== 'Contacts') return m });
}
_.each(moduleList, function(module) {
this._addMenu(module, true);
}, this);
},
})
As mentioned, these changes are now home in a new layout: ./clients/base/layouts/sidebar-nav-item-group-modules. Using a similar pattern as above, we can hide this module in the sidebar-nav layout.
({
extendsFrom: 'SidebarNavItemGroupModulesLayout',
initialize: function(options) {
this._super('initialize', [options])
},
_getDefaultModuleList: function() {
let moduleList = app.metadata.getModuleNames({filter: 'display_tab', access: 'read'});
if (app.user.get('type') === 'admin'){
moduleList = _.filter(moduleList, m => { if(m !== 'Contacts') return m });
}
return _.without(moduleList, 'Home');
},
})
Once these changes are added, you can run a Quick Repair and Rebuild and the list of modules will be updated.
Note: You may need to refresh the page to see the profile menu items removed.