Skip to content

The admin panel

The admin panel (admin/ in the repository) is a React application built on Umi and Ant Design Pro. It has no data of its own: every screen calls the ulams REST API, and what you can see and do depends on the permissions of your account.

Each tenant has its own admin panel host. In local development it is {slug}.admin.localhost, for example http://coffee.admin.localhost, and the panel derives the tenant API host from it (http://coffee.localhost). Accounts, roles, settings and content belong to one tenant; an account in one tenant cannot sign in to another. See Tenants and Tenancy.

The sign-in screen is at /user/login. Enter your email and password; Remember me is sent with the request. After a successful sign-in the panel stores the API token in the browser, loads your user, the tenant settings, the list of installed packages and the panel translations, and opens the page you were trying to reach (or the dashboard).

Any account can sign in, but the panel only shows screens the account has permissions for. An account without the access dashboard permission (the default student role) sees no menu at all.

The look of the sign-in screen comes from the global settings logoLogin, showLoginBackgroundImage, loginHeaderBackgroundColor, loginHeaderFontColor and loginFormBackgroundColor (see Settings).

  1. On the sign-in screen click Forgot password, enter your email and send the form. The API (POST /api/auth/password/forgot) emails a reset link that points back to the panel’s /user/reset-password page.
  2. The link carries token and email in the query string. Enter a new password on /user/reset-password; the panel sends it with the token to POST /api/auth/password/reset and returns you to the sign-in screen.

The email is built from the template for the ResetPassword event (see Templates).

The avatar menu in the top-right corner leads to My profile and signs you out. Next to it are the notification bell (see Notifications) and the language switcher, which changes the panel language and the X-locale header sent to the API.

The dashboard with course and sales widgets

/welcome is the start page. It needs only the access dashboard permission. It is a grid of widgets that you can drag, resize, remove and add back with the Add widget:

  • tutorial, your courses, hall of fame (best selling and best rated courses), ratings, current users, customers and sales,
  • pie charts of the report metrics: money spent per course, course popularity, time spent per course and tutor popularity.

The layout is saved in your browser (localStorage), not on the server, so it is per browser and not shared with other administrators. The metrics come from the reports package; see Reports and analytics.

When the global.frontURL setting is set, the dashboard shows a Go to platform button that opens the learner site with your token appended (#/login?token=…, the format of the legacy React learner app).

The left menu is generated from admin/config/routes.ts. Each top-level group and where it is documented:

Menu group Screens Documented in
Courses Course list and editor, H5P content, LiaScript, SCORM packages, access requests, quiz reports Content creators
Courses Categories Categories and tags
Courses Webinars Webinars
Courses H5P libraries H5P libraries
Integrations LTI LTI 1.3 integrations
Sales Orders, payments, vouchers, products Sales
Users List, user fields Users
Users Roles and permissions Roles and permissions
Users User groups User groups
Users Notifications (push) Notifications
Teacher, Competency challenges Subjects, challenges Teacher and competency challenges
Analytics Notifications, reports, logs Reports and analytics
Configuration Files Files
Configuration Settings Settings
Configuration Templates (email, PDF, SMS) Templates
Configuration Translations, panel translations Translations
Other activities Consultations, consultation requests Consultations
Other activities Stationary events Stationary events
Other activities Questionnaires Questionnaires
Other activities Pages Pages
Other activities Tasks Tasks
Other activities Dictionary Dictionaries

My profile (/my-profile) is not in the menu; open it from the avatar menu. Tenants are managed from the command line, not from the panel (Tenants).

Every route in routes.ts has an access key, a named rule defined in admin/src/access.ts. A route whose rule is false is removed from the menu, and opening its URL directly shows the 403 page. A rule combines up to three checks:

  1. Permissions. Almost every rule requires access dashboard plus at least one of the listed permissions. For example the Users group appears with any of user_list, permission_role_list or user-group_list, and the Configuration group with any of file_list, settings_list, template_read or translation_list. The permissions come from your roles; see Roles and permissions.
  2. Installed packages. Some screens also need an API package to be installed, read from GET /api/core/packages (for example Translations needs ulams/translations, Dictionary needs ulams/dictionaries, H5P needs ulams/h5p). The Teacher and Competency challenges screens depend on packages that are not part of this repository.
  3. Settings. An administrator can hide items for everyone with boolean global settings named after the route: hideInMenu-CoursesCategories, hideInMenu-OtherDictionary, hideInMenu-ConfigurationTranslations and so on. Some features have their own switch: disable-ECommerce hides Sales, disable-Certificates hides the PDF templates tab. If such a setting holds an array of role names instead of a boolean, the item is hidden only for users whose every role is in the array. See Settings.

The other pages of this section cover sales, webinars, consultations, stationary events, tasks, questionnaires, reports and analytics, H5P libraries, LTI, teacher and competency screens, tenants and demo mode.