Portal Configuration (Front-End)¶
This document describes how to configure the Domain Services Ops front‑end via portal.json.
Location in repo
apps/domain-services-ops/src/portal.json
Purpose¶
portal.json is a single, environment-specific configuration file used by the FE to
define branding, data sources, page types, and default behaviors (time zone, formats, etc.).
Key Fields¶
Top-level¶
| Field | Type | Description |
|---|---|---|
siteName |
string | Product name shown in the header. |
authHost |
string (URL) | Base URL for authentication service. |
lastDays |
number | Default lookback window for pages that support date filtering. |
logo |
string (path) | Path to the logo asset under src/assets. |
style.backgroundColor |
string (hex) | Global background color. |
style.primaryColor |
string (hex) | Primary brand color (buttons, highlights). |
style.secondaryColor |
string (hex) | Secondary brand color. |
pages[]¶
Each entry defines one visible page in the portal. Common properties:
| Field | Type | Description |
|---|---|---|
name |
string | Menu title. |
type |
enum | One of: JobList, Accounts, UserGroups, AutomationList. |
enabled |
boolean | Show/hide the page. |
configuration |
object | Page-specific configuration (see below). |
JobList configuration¶
| Field | Type | Description |
|---|---|---|
dataSources[] |
array | One or more data sources (jobs + job logs). |
newSignalRDataObj |
boolean | Use the new SignalR data transport. |
dateTimeFormat |
string | Display format (e.g., yyyy-MM-dd HH:mm:ss). |
timeZone |
string | IANA time zone (e.g., Asia/Singapore, UTC). |
disabledColumns[] |
array | Columns to hide. |
autoRefreshIntervalSeconds |
number | Auto refresh interval. |
parameters[] |
array | Optional filters (e.g., tag). |
dataSources[] object
- authHost, host, connection — primary jobs source
- authHostJobLog, hostJobLog, connectionJobLog — job log source
Note: Endpoint names are case-sensitive on some servers. Keep
DSWebAPI/DSWebApiconsistent with the backend route names.
AutomationList configuration¶
| Field | Type | Description |
|---|---|---|
dataSources[] |
array | Scalar/workflow data source. |
disabledTriggerNow |
boolean | Disable the Trigger Now action. |
jobRefferingPage |
string | Route name for the jobs page (e.g., jobs). |
disabledTextField |
object | Toggle editability of name and group. |
disabledColumns[] |
array | Columns to hide in the automation grid. |
Time Zone¶
Set timeZone per page using a valid IANA value. Examples:
- Asia/Singapore — SG local time
- UTC — Coordinated Universal Time
- Asia/Jakarta, Europe/Copenhagen, etc.
This lets each page follow regional display needs without rebuilding the app.
Example portal.json¶
{
"siteName": "DHI Operational Forecast",
"authHost": "http://IAS-Depl1/DSAuth",
"lastDays": 2,
"logo": "assets/DHILogo.png",
"style": {
"backgroundColor": "#FFF",
"primaryColor": "#004165",
"secondaryColor": "#0098DB"
},
"pages": [
{
"name": "Jobs Minion",
"type": "JobList",
"enabled": true,
"configuration": {
"dataSources": [
{
"authHost": "http://IAS-Depl1/DSAuth",
"host": "http://IAS-Depl1/DSWebApi",
"connection": "wf-jobs-Minion",
"authHostJobLog": "http://IAS-Depl1/DSAuth",
"hostJobLog": "http://IAS-Depl1/DSWebAPI",
"connectionJobLog": "wf-logs"
}
],
"newSignalRDataObj": true,
"dateTimeFormat": "yyyy-MM-dd HH:mm:ss",
"timeZone": "Asia/Singapore",
"disabledColumns": [
"accountId"
],
"autoRefreshIntervalSeconds": 30,
"parameters": [
{
"parameter": "tag",
"label": "Tag"
}
]
}
},
{
"name": "Jobs Titan",
"type": "JobList",
"enabled": true,
"configuration": {
"dataSources": [
{
"authHost": "http://IAS-Depl1/DSAuth",
"host": "http://IAS-Depl1/DSWebApi",
"connection": "wf-jobs-Titan",
"authHostJobLog": "http://IAS-Depl1/DSAuth",
"hostJobLog": "http://IAS-Depl1/DSWebAPI",
"connectionJobLog": "wf-logs"
}
],
"newSignalRDataObj": true,
"dateTimeFormat": "yyyy-MM-dd HH:mm:ss",
"timeZone": "UTC",
"disabledColumns": [
"accountId"
],
"autoRefreshIntervalSeconds": 30,
"parameters": [
{
"parameter": "tag",
"label": "Tag"
}
]
}
},
{
"name": "Accounts",
"type": "Accounts",
"enabled": true,
"configuration": {
"authHost": "http://IAS-Depl1/DSAuth"
}
},
{
"name": "User Groups",
"type": "UserGroups",
"enabled": true,
"configuration": {
"authHost": "http://IAS-Depl1/DSAuth"
}
},
{
"name": "Automations",
"type": "AutomationList",
"enabled": true,
"configuration": {
"dataSources": [
{
"host": "http://IAS-Depl1/DSWebAPI",
"connection": "wf-scalars",
"connectionJobLog": "wf-jobs"
}
],
"disabledTriggerNow": false,
"jobRefferingPage": "jobs",
"disabledTextField": {
"name": true,
"group": true
},
"disabledColumns": [
"triggerCondition.conditional",
"triggerCondition.isMet"
]
}
}
]
}
Naming & Environments¶
- Primary file:
portal.json(checked into source control). - Per‑environment pattern (optional):
portal.local.json,portal.dev.json,portal.prod.json- Load the correct file at build time or via an environment variable (e.g.,
PORTAL_CONFIG_PATH).
Keep
authHost,host, andhostJobLogon HTTPS in production environments whenever possible.
Quick Checklist¶
- [ ] Place
portal.jsonunderapps/domain-services-ops/src/ - [ ] Verify endpoint casing (
DSWebAPIvsDSWebApi) matches backend routes - [ ] Set each page’s
timeZoneto a valid IANA ID - [ ] Confirm
autoRefreshIntervalSecondsper ops needs - [ ] Hide sensitive columns with
disabledColumns - [ ] Test Trigger Now permission and visibility in
AutomationList