Skip to main content

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:

ConstantValuePurpose
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 IDPanelControllerDefaultAuto-reloadNotes
registryRegistryPanelRegistryPanelControllerYesYesDefault tab on dashboard load
agentsAgentsPanelAgentsPanelControllerYes
reportsReportsPanelReportsPanelControllerYes
logsLogsPanelLogsPanelControllerYes
emailEmailPanelEmailPanelController
permissionsPermissionsPanelPermissionsPanelControllerYesReloads on server restart
usersUsersPanelUsersPanelControllerdeclaredBy: "users"
organizationsOrganizationsPanelOrganizationsPanelController
duplicityDuplicityCheckPanelDuplicityCheckController
appRuntimeRuntimeToolRuntimeToolControllerYesReloads on server restart
appSettingsAppSettingsPanelAppSettingsControllerYes
notificationsEditorNotificationsEditorPanelNotificationsEditorPanelController
addressesAddressesPanelAddressesPanelControllerYes
webhooksWebhooksPanelWebhooksPanelControllerYes
gql——External link to /graphiql
faqFAQPanelFAQPanelControllerMobile only, disabled by default
feedbackFeedbackPanelFeedbackPanelControllerMobile 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 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

Controls which users see a menu item:

ScopeValueVisibility
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).

In MenuPageLayoutController.afterTabsRegister():

  1. Iterates all registered tabs
  2. Creates MenuItem instances via getTabMenuInstance()
  3. Checks tab.scope to determine container placement
  4. Shows/hides scope sections:
    • mobileOnly — shown if user.IsMobile
    • sysAdminOnly — shown if user.IsSysAdmin
    • adminOnly — shown if user.IsAdmin

Tool Registration for Solution Projects​

Solution projects extend the dashboard by overriding getTabsConfiguration() on their own DashboardPage subclass.

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.

warning

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:

RouteBehavior
/dashboardOpens default tab (Registry)
/dashboard#/registryOpens specific tab by hash fragment
/tools/{toolId}Opens tool panel registered by solution project
/backdoorLoginOpens 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