Skip to Content

Schema: sam_ui_theme

Schema: sam_ui_theme

Technical Truth - Models, controllers, and theme architecture


Module Overview

Attribute Value
Technical Name sam_ui_theme
Version 18.0.21.0.0
Total Models 3 (1 regular, 2 extensions)
Total Controllers 1
API Endpoints 2

Models

sam.theme.settings (Theme Settings)

Purpose: Store company-specific theme customization settings.

Field Type Required Default Description
company_id Many2one Yes Current company Link to res.company
active Boolean No True Active flag
primary_color Char No #4A90E2 Main brand color
secondary_color Char No #F4C430 Accent/gold color
accent_color Char No #FF5AC4 Third accent color
navbar_bg_color Char No #4A90E2 Navbar background
navbar_text_color Char No #FFFFFF Navbar text color
bling_color_1 Char No #4A90E2 Bling gradient color 1
bling_color_2 Char No #F4C430 Bling gradient color 2
bling_color_3 Char No #FF5AC4 Bling gradient color 3
bling_enabled Boolean No True Show bling line
font_display Selection No plus_jakarta Heading font
font_body Selection No dm_sans Body text font
button_radius Selection No 8 Button corner radius
card_radius Selection No 16 Card corner radius
card_side_color Char No #F4C430 Kanban card left border
theme_preset Selection No sam_default Quick theme preset

Key Methods:
| Method | Purpose | Returns |
|--------|---------|---------|
| get_theme_settings() | Get settings for current company | Dict of settings |
| _onchange_theme_preset() | Apply preset colors when changed | None |

SQL Constraints:
- company_unique - One theme setting per company


Theme Presets

Preset Primary Secondary Accent Navbar
sam_default #4A90E2 #F4C430 #FF5AC4 #4A90E2
sam_dark #2D3748 #F4C430 #A25DDC #1A202C
sam_ocean #0077B6 #00B4D8 #90E0EF #0077B6
sam_forest #2D6A4F #52B788 #95D5B2 #1B4332
sam_sunset #E85D04 #FAA307 #FFBA08 #D00000
sam_purple #7B2CBF #E0AAFF #C77DFF #5A189A

Font Options

Key Display Name CSS Family
plus_jakarta Plus Jakarta Sans 'Plus Jakarta Sans', system fonts...
dm_sans DM Sans 'DM Sans', system fonts...
inter Inter 'Inter', system fonts...
roboto Roboto 'Roboto', system fonts...
system System Default -apple-system, BlinkMacSystemFont...

Controllers / API Endpoints

SamThemeController

File: controllers/main.py

Route Method Auth Purpose
/sam_ui_theme/dynamic.css HTTP GET public Generate dynamic CSS from settings
/sam_ui_theme/settings JSON-RPC user Return theme settings as JSON

GET /sam_ui_theme/dynamic.css

Generates CSS with all theme variables based on current settings.

Response Headers:
- Content-Type: text/css
- Cache-Control: public, max-age=300 (5 minute cache)

Response: Complete CSS file with:
- CSS custom properties (:root variables)
- Navbar styling
- Bling line styling
- Button styling
- Typography
- Card/panel styling
- Link colors
- Login page styling

POST /sam_ui_theme/settings (JSON-RPC)

Returns current theme settings for JavaScript use.

Response:

{
    "primary_color": "#4A90E2",
    "secondary_color": "#F4C430",
    "accent_color": "#FF5AC4",
    "navbar_bg_color": "#4A90E2",
    "navbar_text_color": "#FFFFFF",
    "bling_color_1": "#4A90E2",
    "bling_color_2": "#F4C430",
    "bling_color_3": "#FF5AC4",
    "bling_enabled": true,
    "font_display": "plus_jakarta",
    "font_body": "dm_sans",
    "button_radius": "8",
    "card_radius": "16",
    "card_side_color": "#F4C430"
}

CSS Architecture

CSS Variable Hierarchy

┌─────────────────────────────────────────────────────────────┐
│  sam_brand_variables.css (Static defaults)                   │
│  - Defines base CSS custom properties                        │
│  - Loaded FIRST in both frontend and backend                 │
└─────────────────────────┬───────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│  _primary_variables.scss (SCSS variables)                    │
│  - Uses "prepend" to load BEFORE other SCSS                  │
│  - Sets $o-brand-* variables                                 │
└─────────────────────────┬───────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│  dynamic.css (Runtime generated)                             │
│  - Fetched from /sam_ui_theme/dynamic.css                    │
│  - Overrides :root variables with user settings              │
│  - Loaded by sam_theme_loader.esm.js                         │
└─────────────────────────────────────────────────────────────┘

Key CSS Variables

Variable Default Used For
--sam-blue-primary #4A90E2 Primary brand color
--sam-gold-sparkle #F4C430 Secondary/gold color
--sam-primary #4A90E2 Legacy alias
--sam-secondary #F4C430 Legacy alias
--sam-accent #FF5AC4 Third color
--sam-navbar-bg #4A90E2 Navbar background
--sam-navbar-text #FFFFFF Navbar text
--sam-bling-1/2/3 varies Bling gradient colors
--sam-button-radius 8px Button corners
--sam-card-radius 16px Card corners
--sam-card-side-color #F4C430 Kanban left border

JavaScript Components

Theme Loader

File: static/src/js/sam_theme_loader.esm.js

Purpose: Dynamically load theme CSS from /sam_ui_theme/dynamic.css

Behavior:
1. On page load, creates <link> element
2. Points to /sam_ui_theme/dynamic.css
3. Appends to document head
4. CSS overrides take effect

System Overlay

File: static/src/js/overlays/system_overlay.js

Purpose: Provides loading overlay during module upgrades and asset recompilation.

Global: window.SamSystemOverlay

BlockUI Patch

File: static/src/js/overlays/block_ui_patch.js

Purpose: Patches Odoo's BlockUI to use SAM styling.

Dialog Patch

File: static/src/js/overlays/dialog_patch.js

Purpose: Enhances modal/dialog styling for consistency.


Security Rules

Model Group Read Write Create Delete
sam.theme.settings base.group_system ✅ ✅ ✅ ✅
sam.theme.settings base.group_user ✅ ❌ ❌ ❌

Note: All users can read theme settings (needed for display), only admins can modify.


Asset Load Order

web.assets_backend

1. sam_brand_variables.css      ← Static CSS variables
2. sam_overlay_base.css         ← Shared overlay sizing
3. sam_system_overlay.css       ← Loading overlay styles
4. sam_modal_override.css       ← Dialog styling
5. sam_card_grid.scss           ← Card grid layout
6. sam_enhancements.scss        ← General enhancements
7. sam_apps_menu.scss           ← App menu overlay
8. XML templates
9. JS components
10. sam_theme_loader.esm.js     ← Fetches dynamic.css
11. Overlay JS files

web._assets_primary_variables

1. _primary_variables.scss (prepend) ← MUST be first

File Structure

sam_ui_theme/
├── __init__.py
├── __manifest__.py
├── controllers/
│   ├── __init__.py
│   └── main.py                        # Dynamic CSS endpoint
├── models/
│   ├── __init__.py
│   ├── ir_module.py                   # Module extension
│   ├── res_config_settings.py         # Settings integration
│   └── sam_theme_settings.py          # Main settings model
├── security/
│   └── ir.model.access.csv
├── static/
│   ├── description/
│   │   └── icon.png
│   └── src/
│       ├── components/
│       │   ├── apps_menu/
│       │   │   ├── sam_apps_menu.esm.js
│       │   │   ├── sam_apps_menu.scss
│       │   │   └── sam_apps_menu.xml
│       │   ├── apps_menu_item/
│       │   │   ├── sam_apps_menu_item.esm.js
│       │   │   └── sam_apps_menu_item.xml
│       │   └── sam_components_registry.esm.js
│       ├── css/
│       │   ├── sam_brand_variables.css
│       │   ├── sam_login.css
│       │   ├── sam_modal_override.css
│       │   ├── sam_overlay_base.css
│       │   └── sam_system_overlay.css
│       ├── js/
│       │   ├── overlays/
│       │   │   ├── block_ui_patch.js
│       │   │   ├── dialog_patch.js
│       │   │   └── system_overlay.js
│       │   ├── sam_theme_loader.esm.js
│       │   └── sam_theme_loader_frontend.js
│       └── scss/
│           ├── _primary_variables.scss
│           ├── sam_card_grid.scss
│           └── sam_enhancements.scss
└── views/
    ├── login_templates.xml
    ├── sam_theme_settings_views.xml
    └── webclient_templates.xml

Change History

Date Change By
2025-01-26 Initial schema documentation CTO Module Docs Agent
Was this helpful?