Dashboard and Tools Menu
The admin dashboard (/dashboard) is a MenuPageLayout with a sidebar menu that organizes tool panels by role. Access requires IsAuthenticated && IsAdmin.
Dashboard Tab Registry
DashboardPage extends MenuPageLayout and defines all dashboard tabs in getTabsConfiguration(). Each tab maps to a panel view + panel controller pair.
DashboardTabIds
DashboardTabIds extends PageTabIds with dashboard-specific constants:
| Constant | Value | Purpose |
|---|---|---|
REGISTRY | "registry" | Configuration registry browser |
AGENTS | "agents" | Sync agent status |
REPORTS | "reports" | Usage and system reports |
LOGS | "logs" | System log viewer |
EMAIL | "email" | Email/sendmail configuration |
PERMISSIONS | "permissions" | Permission and role management |
USERS | "users" | User management |
ORGANIZATIONS | "organizations" | Organization profiles |
DUPLICITY_CHECK | "duplicity" | Data duplication check |
APP_RUNTIME | "appRuntime" | Runtime diagnostics |
APP_SETTINGS | "appSettings" | Global application settings |
WEBHOOKS | "webhooks" | Webhook management |
GQL | "gql" | GraphQL API explorer |
Inherited from PageTabIds: FAQ, FEEDBACK, RELEASE_NOTES, NOTIFICATIONS.
Built-in Panels
| Tab ID | Panel | Controller | Default | Auto-reload | Notes |
|---|---|---|---|---|---|
registry | RegistryPanel | RegistryPanelController | Yes | Yes | Default tab on dashboard load |
agents | AgentsPanel | AgentsPanelController | Yes | ||
reports | ReportsPanel | ReportsPanelController | Yes | ||
logs | LogsPanel | LogsPanelController | Yes | ||
email | EmailPanel | EmailPanelController | |||
permissions | PermissionsPanel | PermissionsPanelController | Yes | Reloads on server restart | |
users | UsersPanel | UsersPanelController | declaredBy: "users" | ||
organizations | OrganizationsPanel | OrganizationsPanelController | |||
duplicity | DuplicityCheckPanel | DuplicityCheckController | |||
appRuntime | RuntimeTool | RuntimeToolController | Yes | Reloads on server restart | |
appSettings | AppSettingsPanel | AppSettingsController | Yes | ||
notificationsEditor | NotificationsEditorPanel | NotificationsEditorPanelController | |||
addresses | AddressesPanel | AddressesPanelController | Yes | ||
webhooks | WebhooksPanel | WebhooksPanelController | Yes | ||
gql | — | — | External link to /graphiql | ||
faq | FAQPanel | FAQPanelController | Mobile only, disabled by default | ||
feedback | FeedbackPanel | FeedbackPanelController | Mobile only, disabled by default | ||
releaseNotes | — | — | Mobile only, disabled by default | ||
notifications | — | — | Mobile only, disabled by default |
The backToApp entry is a navigation link to /#/main, not an actual panel.
MenuPanel Architecture
MenuPanel is the sidebar component that renders menu items organized into four scope containers:
MenuPanel
├── forAll — visible to all dashboard users
├── forMobile — visible only on mobile devices
├── forSysAdmins — visible only to system administrators
└── forAdmins — visible only to administrators
MenuItemScope
Controls which users see a menu item:
| Scope | Value | Visibility |
|---|---|---|
FOR_ALL | "all" | All authenticated admin users |
MOBILE_ONLY | "mobile" | Mobile devices only |
ADMINS | "admins" | Admin group members |
SYS_ADMINS | "sysadmins" | System admin group members |
HIDDEN | "hidden" | Not shown in menu (accessible via direct URL) |
Adding Menu Items
menuPanel.AddItem("Tool Name", "/toolRoute", svgIconString, MenuItemScope.ADMINS);
The MenuPageLayoutController automatically creates menu items from tab configurations during afterTabsRegister(). Scope sections are shown/hidden based on the current user's role via CSS class toggling (d-none).
Menu Visibility Logic
In MenuPageLayoutController.afterTabsRegister():
- Iterates all registered tabs
- Creates
MenuIteminstances viagetTabMenuInstance() - Checks
tab.scopeto determine container placement - Shows/hides scope sections:
mobileOnly— shown ifuser.IsMobilesysAdminOnly— shown ifuser.IsSysAdminadminOnly— shown ifuser.IsAdmin
Tool Registration for Solution Projects
Solution projects extend the dashboard by overriding getTabsConfiguration() on their own DashboardPage subclass.
Recommended: Override getTabsConfiguration()
import { DashboardPage as Parent } from "@io-oidis-hub-gui/Io/Oidis/Hub/Gui/Pages/DashboardPage.js";
import { ITabDescriptor } from "@io-oidis-hub-gui/Io/Oidis/Hub/Gui/Primitives/BasePageLayout.js";
export class DashboardPage extends Parent {
protected getTabsConfiguration() : ITabDescriptor[] {
return {
...super.getTabsConfiguration(),
myTool: {
name : "My Tool",
icon : `<svg>...</svg>`,
content : MyToolPanel,
controller: MyToolPanelController,
autoReload: true
}
};
}
}
Deprecated: registerTool()
The DashboardPageController.registerTool() method dynamically adds tabs at runtime. It is deprecated in favor of the getTabsConfiguration() override pattern.
registerTool() is deprecated. New solution projects should override getTabsConfiguration() instead. See Extending Hub GUI for the full guide.
Dashboard Routes
The DashboardPageController handles these routes:
| Route | Behavior |
|---|---|
/dashboard | Opens default tab (Registry) |
/dashboard#/registry | Opens specific tab by hash fragment |
/tools/{toolId} | Opens tool panel registered by solution project |
/backdoorLogin | Opens backdoor login dialog |
Route-to-tab matching uses the link and altLinks properties of ITabDescriptor, with pattern matching for parameterized routes (e.g. {toolId} → wildcard).
See also: Hub GUI Overview | Pages and Routing | Extending Hub GUI | GUI Panels and Controllers