---
name: "Lemonldap::NG::Portal::MenuTab"
section: "3pm"
platform: "linux"
package: "liblemonldap-ng-portal-perl"
version: "2.21.2+ds-1+deb13u3"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Lemonldap::NG::Portal::MenuTab"
---

# Lemonldap::NG::Portal::MenuTab(3pm)

Writing custom menu tabs for LemonLDAP::NG

## NAME

Lemonldap:NG::Portal::MenuTab - Writing custom menu tabs for LemonLDAP::NG

## SYNOPSIS

```
  package Lemonldap::NG::Portal::Plugins::CustomMenuTab;
  use strict;
  use warnings;
  use Mouse;
  our $VERSION = '0.1';
  extends 'Lemonldap::NG::Portal::Main::Plugin';
  use constant name => "CustomMenuTab";
  has rule => (
      is      => "ro",
      lazy    => 1,
      builder => sub { $_[0]->conf->{customPluginsParams}->{customMenuRule} },
  );
  with 'Lemonldap::NG::Portal::MenuTab';
  sub display {
      my ( $self, $req ) = @_;
      return {
          logo => "wrench",
          name => "myplugin",
          id   => "myplugin",
          html => $self->loadTemplate($req, "mytemplate"),
      };
  }
  sub init {
      my $self = shift;
      # [your initialization stuff]
      return 1;
  }
  1;
```

## DESCRIPTION

A MenuTab module handles displaying an additional tab to authenticated users.

### Methods that must be provided by a MenuTab module

*rule*

This method must return the text of a rule that decides whether or not the tab is displayed to a user.

Rules can be simple expressions such as `"$uid eq "dwho""`. If you want the tab to always be displayed, simply return a non-zero integer

```
    use constant rule => 1;
```

*name*

This method must return a name for the plugin. This name is used for ordering the tab in the `"portalDisplayOrder"` variable. It is not displayed to the user.

*display($req)*

This method is called by the portal in order to display the tab. It takes the current request object as a parameters, and must return a hash with the following subkeys:

- "logo": name of a fontawesome icon for the tab

  - "name": user-displayed name of the tab, which should be translated in *lang*.json files.

  - "id": HTML element id for the tab, must be unique

  - "html": HTML content of the tab

  The `"display"` method can call helper functions such as `"loadTemplate"` to render a template

### Ordering of portal tabs

You can use the `"portalDisplayOrder"` variable to change the order of portal tabs.

Use the `"name"` of your plugin in this list, or use the special `"_unknown"` keyword to specify an order for all plugin-managed tabs. If multiple modules are loaded, they will be displayed in the order they were loaded.

```
    portalDisplayOrder = Appslist ChangePassword CustomMenuTab LoginHistory \
        OidcConsents _unknown Logout
```

## METHODS

### Accessors and methods provided by Lemonldap::NG::Portal::Main::Plugin

- p: portal object

  - conf: configuration hash (as reference)

  - logger alias for p-\>logger accessor

  - userLogger alias for p-\>userLogger accessor

  - error: alias for p-\>error method

  - loadTemplate: render a HTML template from a .tpl file

  ### "Routes" management

Like each module that inherits from Lemonldap::NG::Portal::Plugin, you can define dedicated routes in a MenuTab plugin.

- addAuthRoute: wrapper to Lemonldap::NG::Handler::PSGI::Try **addAuthRoute()** method

  - addUnauthRoute: wrapper to Lemonldap::NG::Handler::PSGI::Try **addUnauthRoute()** method

  ## LOGGING

Logging is provided by `"$self->logger"` and `"$self->userLogger"`. See Lemonldap::NG::Portal::Main::Plugin for a detailed description of logging levels.

## AUTHORS

- LemonLDAP::NG team \<http://lemonldap-ng.org/team\>

  ## BUG REPORT

Use OW2 system to report bug or ask for features: \<https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/issues\>

## DOWNLOAD

Lemonldap::NG is available at \<https://lemonldap-ng.org/download\>

## COPYRIGHT AND LICENSE

See COPYING file for details.

This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version.

This program 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 General Public License for more details.

You should have received a copy of the GNU General Public License along with this program.  If not, see \<http://www.gnu.org/licenses/\>.
