Better Helpdesk
Inbox and team

Agent UI

HelpdeskAdmin's props, its sections and URLs, its keyboard shortcuts, and the CSS custom properties it reads.

better-helpdesk/admin exports the agent UI, HelpdeskAdmin, and two constants. The module starts with 'use client'. The UI calls the agent/* routes, which answer only an agent. Related guide: Theme the widget and the agent UI.

app/helpdesk/[[...slug]]/page.tsx
import { HelpdeskAdmin } from 'better-helpdesk/admin';

export default function Page() {
  return <HelpdeskAdmin api="/api/helpdesk" basePath="/helpdesk" locale="en" />;
}

Props

Prop

Type

Exports

NameValue
HelpdeskAdminThe component.
HELPDESK_SECTIONS['inbox', 'contacts', 'companies', 'deals', 'canned', 'overview', 'settings', 'audit']
HELPDESK_CHANGED'helpdesk:changed', an Event dispatched on window after each successful request the UI makes that is not a GET.

Sections and URLs

Each screen is a path under basePath; inbox filters are in the query string.

SectionPathShows
inbox{basePath}/conversations/The conversation list, saved views, bulk actions, and New conversation, which opens one in the agent's name to a contact or an address.
{basePath}/conversations/{id}/One conversation beside the list.
contacts{basePath}/contacts/ and {basePath}/contacts/{id}/Contacts, and one contact with its timeline.
companies{basePath}/companies/ and {basePath}/companies/{id}/Companies, and one company with its timeline.
deals{basePath}/deals/The deals board.
canned{basePath}/canned/Canned replies.
overview{basePath}/overview/Statistics: volume, response and resolution times, ratings and tags, each figure a link into the inbox filtered to its conversations.
settings{basePath}/settings/The widget's confirmation text, one language tab at a time, who gets emails about new requests, the closed days, what the AI may do when one is configured, the team with each member's role, and where an agent can remove another.
audit{basePath}/audit/The audit log of every change made in the agent UI, 25 entries a page.

A section that features switched off has no tab, and a link into it lands on the inbox. The same goes for audit when the agent may not read the log: once any agent has the supervisor role, only supervisors see it. A host that renders its own tabs from HELPDESK_SECTIONS can hide that tab by the auditLog field of GET agent/me.

The inbox list reads inbox, status, assignee, q, tag, tier, channel, sort, priority and days from the query string. status is one of the statuses, any, snoozed, rated-good or rated-bad; assignee is me, none or an agent id; sort is empty for longest waiting, priority, or sla for the nearest deadline, which the tray offers once the config has service levels. A row shows its tier and how long until its deadline, or how far past it. days is 7, 30 or 90, the Statistics periods: it keeps conversations resolved in that time for status=resolved, rated in it for rated-good and rated-bad, and opened, resolved or rated in it otherwise, so each figure on Statistics opens the conversations it counts. The All, Assigned to me and Unassigned counts are of the list the other filters give. Changing a filter keeps the open conversation open.

The bar above the list is one line: the assignee tabs, the search with the High and urgent switch beside it, which keeps the two highest of your priorities, a Filters button and New conversation. Saved views are a second row of tabs under the bar, styled like the assignee tabs, each with its count. The button opens a tray with the status, inbox, assignee, tag, tier, channel and sort filters and the period, and a footer with the work-the-queue switch on the left and, on the right, Reset view once any filter is set, the link to save the current filters as a view, the default Open list included, and Rename and Delete for the active view. The tray opens only from the button; a filter set elsewhere, by a saved view or a tag on a row, shows as a count on it. The bulk bar under a selection also offers Reply to all and Note on all, one text written to each selected conversation, with the same formatting toolbar as a reply; a reply to all assigns each unassigned conversation to the agent. A viewer sees a line at the top saying they can change nothing: no checkboxes and no bulk bar, no New conversation button, and in a conversation the properties as text instead of controls and no composer. Beside an open conversation the search and High and urgent move into the tray too. On a wide screen the list and the thread each scroll inside their own pane, so opening another conversation never moves the page, the two panes fill the window below whatever your app shows above them, so the reply box stays in view, and the list keeps its width when the side panel opens or closes; on a narrow one a conversation opened from deep in the list scrolls into view by the least amount. Agent emails link to {adminUrl}/conversations/{id}/, which opens the agent UI when adminUrl is the URL that basePath is mounted at.

Keyboard shortcuts

? opens the list of shortcuts in the UI. Single-key shortcuts, ? among them, do not fire while focus is in a text field, while a dialog is open, during IME composition, with Cmd, Ctrl or Alt held, or when they are switched off. Mod is Cmd on a Mac and Ctrl elsewhere.

KeysWhereDoes
j, kInboxNext or previous conversation
EnterInboxOpen the highlighted conversation, unless focus is on a button or link
xInboxSelect or unselect it
Shift xInboxSelect everything up to it
eConversationResolve
aConversationAssign to me
rConversationWrite a reply
nConversationWrite an internal note
sConversationSkip to the next conversation; only while working the queue
zConversationSnooze
Mod EnterComposerSend
Mod Shift EnterComposerSend and resolve; also in the menu beside Send, with "Resolve without a reply", which needs no text
Mod B, I, UComposerBold, italic, underline
Mod KComposer with the formatting toolbarLink
/Empty replyCanned replies; the text after / filters them by title
↑, ↓, EnterCanned-reply or @ mention listMove, insert
EscapeConversationFocus its row in the list
?EverywhereThe list of shortcuts

Preferences

Each agent's switches are kept in that browser's localStorage.

KeyDefaultSwitch
helpdesk.keysonSingle-key shortcuts, turned off in the list of shortcuts
helpdesk.queueoffWorking the queue: after a reply, the next conversation in the list opens
helpdesk.titleCountonNew notifications counted in the tab title
helpdesk.asideby widthThe conversation's side panel open or closed

CSS custom properties

The agent UI renders into the host page, not a shadow root, and inherits the host's font. It reads these properties from any ancestor.

PropertyDefaultStyles
--helpdesk-bg#ffffffBackground
--helpdesk-fg#0c2034Text
--helpdesk-muted#486581Secondary text
--helpdesk-border#e6e9efBorders
--helpdesk-subtle#f6f7f9Quiet backgrounds
--helpdesk-accent#0c2034Buttons, links, the selected tab
--helpdesk-accent-hover#243b53Accent on hover
--helpdesk-accent-fg#f0f4f8Text on the accent
--helpdesk-danger#cf1124Errors
--helpdesk-warning#b44d12Warnings
--helpdesk-focus#f55068Focus ring
--helpdesk-radius10pxCorners; controls step down from it and dialogs step up
--helpdesk-header-bg#d9e2ecInitials avatars other than agents', which use the accent
--helpdesk-note-border#f0b429Border of internal notes
--helpdesk-notethe note border mixed with the backgroundBackground of internal notes

The widget's own properties are on Widget.

On this page