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.