Building the menu
Sharp UI is organized with two menus: the main one is on a left sidebar, and the user menu is a dropdown located in the top right corner.
All links shares common things:
- an icon (from Font Awesome 5)
- a label
- and a URL
Links can be grouped in categories, like "Blog" in this screenshot.
Create a SharpMenu class
Write and declare the class
The class must extend Code16\Sharp\Utils\Menu\SharpMenu
, and define a required build()
method:
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
// ...
}
}
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
// ...
}
}
And should be declared in the config file:
// config/sharp.php
return [
// [...]
'menu' => MySharpMenu::class,
]
// config/sharp.php
return [
// [...]
'menu' => MySharpMenu::class,
]
Link to an Entity List, a Dashboard or to a single Show Page
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
return $this
->addEntityLink('post', 'Posts', 'fas fa-file')
->addEntityLink('category', 'Categories', 'fas fa-folder');
}
}
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
return $this
->addEntityLink('post', 'Posts', 'fas fa-file')
->addEntityLink('category', 'Categories', 'fas fa-folder');
}
}
In this example, "post" and "category" should be entities defined in the config file. Sharp will create a link either to the Entity List, to the Dashboard or to a single Show Page (depending on the entity configuration).
Link to an external URL
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
return $this->addExternalLink('https://google.com', 'Some external link', 'fas fa-globe');
}
}
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
return $this->addExternalLink('https://google.com', 'Some external link', 'fas fa-globe');
}
}
Group links in sections
Sections are groups that can be collapsed
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
return $this
->addSection('Admin', function(SharpMenuItemSection $section) {
$section
->addEntityLink('account', 'My account', 'fas fa-user')
->addEntityLink('user', 'Sharp users', 'fas fa-user-secret');
});
}
}
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
return $this
->addSection('Admin', function(SharpMenuItemSection $section) {
$section
->addEntityLink('account', 'My account', 'fas fa-user')
->addEntityLink('user', 'Sharp users', 'fas fa-user-secret');
});
}
}
Add separators in sections
You can add a simple labelled separator in sections:
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
return $this
->addSection('Admin', function(SharpMenuItemSection $section) {
$section
->addEntityLink('account', 'My account', 'fas fa-user')
->addSeparator('Other users')
->addEntityLink('user', 'Sharp users', 'fas fa-user-secret');
});
}
}
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
return $this
->addSection('Admin', function(SharpMenuItemSection $section) {
$section
->addEntityLink('account', 'My account', 'fas fa-user')
->addSeparator('Other users')
->addEntityLink('user', 'Sharp users', 'fas fa-user-secret');
});
}
}
Set a section to be non-collapsible
A section is collapsible by default, but you may want to always show it to the user
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
return $this
->addSection('Admin', function(SharpMenuItemSection $section) {
$section
->setCollapsible(false)
->addEntityLink('account', 'My account', 'fas fa-user');
});
}
}
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
return $this
->addSection('Admin', function(SharpMenuItemSection $section) {
$section
->setCollapsible(false)
->addEntityLink('account', 'My account', 'fas fa-user');
});
}
}
Hide the menu
If for some reason you want to hide the menu, you can do that with the setVisible()
method:
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
return $this
->setVisible(auth()->user()->isAdmin())
->addSection(...);
}
}
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
return $this
->setVisible(auth()->user()->isAdmin())
->addSection(...);
}
}
Add links in the user (profile) menu
Next to user's name or email, Sharp displays a dropdown menu with a logout link. You can add your own links in this menu:
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
return $this
->setUserMenu(function (SharpMenuUserMenu $menu) {
$menu->addEntityLink('account', 'My account', 'fas fa-user');
});
}
}
class MySharpMenu extends Code16\Sharp\Utils\Menu\SharpMenu
{
public function build(): self
{
return $this
->setUserMenu(function (SharpMenuUserMenu $menu) {
$menu->addEntityLink('account', 'My account', 'fas fa-user');
});
}
}