Cadmus
v0.1.2

Guides

The admin site

The /admin site - dashboard, lists, search, filters, bulk actions, forms, and changing its look.

/admin is where people manage the data in a browser. It works on phones as well as desktops, has light and dark themes, and shows each account only what it may do.

#Dashboard

The first page after logging in lists the models the account can see, with how many records each has and what the account may do with them (view, add, change, delete, spelled out rather than shown by colour alone). Superusers also see account totals, and everyone sees whether their two-factor login is on.

#Lists

Each model's list page has:

  • search across the model's search_fields;
  • sorting by clicking a column heading;
  • pages of results (25 by default; ModelOptions::per_page or admin.page_size);
  • on phones, each row becomes a card.

/ jumps to the search box, and every control can be reached with the keyboard.

#Filters

ModelOptions::list_filter(["published", "author_id", "created_at"]) adds a dropdown per field above the list:

Field typeChoices
true/falseYes, No
link to another modelthe related records, by name
date or date-timeToday, Past 7 days, Past 30 days, This month, This year
anything elsethe values present
optional fieldsalso "(empty)"

Filters combine with search, and sorting and paging keep them. A link someone kept from before, with a filter that no longer exists, shows nothing rather than failing.

#Acting on several rows

Rows can be ticked one by one, or all on the page, and acted on together:

  • Delete selected is offered to accounts that may delete. It asks first, and keeps rows that other rows still point to, saying how many.
  • Setting a field: set_action("publish", "Mark as published", "published", "true") sets published to true on every selected row, as editing them would.
  • Your own code: action(name, label, |ids| async move { ... }) runs with the selected primary keys:
ModelOptions::new().action("archive", "Archive", move |ids| {
    let db = db.clone();
    async move {
        post::Entity::update_many()
            .col_expr(post::Column::Archived, Expr::value(true))
            .filter(post::Column::Id.is_in(ids))
            .exec(&db)
            .await?;
        Ok(())
    }
})

Actions need the change permission, and at most 1000 rows are done at a time.

#Forms

  • Buttons appear only for what the account may do; a record it cannot change opens read-only.
  • Deleting asks for confirmation; saving confirms with a short notice.
  • Links to other models are dropdowns of the related records (see Relations).
  • File fields have a file picker, a preview for images, and "Remove the file" (see File uploads).
  • Invalid input is shown next to the field, and nothing is saved.

#Accounts pages

Superusers also get Users and Groups in the menu, to manage accounts and their permissions (see Accounts and permissions). Every account has its own pages, under the buttons by its name: two-factor login, password, and API keys.

#Changing the look

In the admin section of Settings:

SettingWhat it changes
site_titlethe name in the header and the browser tab
accent_colorthe colour of buttons and links, e.g. "#0a7f5a"
logo_urla logo instead of the initial in the corner
themeTheme::Auto (default: follows the device), Theme::Light or Theme::Dark
custom_css_urlyour own stylesheet, loaded after the built-in one
footer_texta line at the bottom of every page
nav_linksextra links in the menu
web_fontsfalse uses the system typeface instead of loading Fira Sans from Google Fonts
template_dira folder of templates that replace the built-in ones by name
pathwhere the admin lives (default /admin)