diff --git a/changelog.md b/changelog.md
index b8b2ecc..3f7104f 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,12 @@
# Changelog
+## 2026-04-04 - 12.8.1 - fix(ops-view-routes)
+correct route form dropdown selection handling for security profiles and network targets
+
+- Update route edit and create forms to use selectedOption for dropdowns backed by the newer dees-catalog version
+- Normalize submitted dropdown values to extract option keys before storing securityProfileRef and networkTargetRef
+- Refresh documentation to reflect expanded stats coverage for network, RADIUS, and VPN metrics
+
## 2026-04-03 - 12.8.0 - feat(certificates)
add force renew option for domain certificate reprovisioning
diff --git a/package.json b/package.json
index 53b22df..db9d6f7 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,7 @@
"@api.global/typedserver": "^8.4.6",
"@api.global/typedsocket": "^4.1.2",
"@apiclient.xyz/cloudflare": "^7.1.0",
- "@design.estate/dees-catalog": "^3.52.3",
+ "@design.estate/dees-catalog": "^3.55.1",
"@design.estate/dees-element": "^2.2.4",
"@push.rocks/lik": "^6.4.0",
"@push.rocks/projectinfo": "^5.1.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4d4ab83..11d4f96 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -24,8 +24,8 @@ importers:
specifier: ^7.1.0
version: 7.1.0
'@design.estate/dees-catalog':
- specifier: ^3.52.3
- version: 3.52.3(@tiptap/pm@2.27.2)
+ specifier: ^3.55.1
+ version: 3.55.1(@tiptap/pm@2.27.2)
'@design.estate/dees-element':
specifier: ^2.2.4
version: 2.2.4
@@ -350,8 +350,8 @@ packages:
'@configvault.io/interfaces@1.0.17':
resolution: {integrity: sha512-bEcCUR2VBDJsTin8HQh8Uw/mlYl2v8A3jMIaQ+MTB9Hrqd6CZL2dL7iJdWyFl/3EIX+LDxWFR+Oq7liIq7w+1Q==}
- '@design.estate/dees-catalog@3.52.3':
- resolution: {integrity: sha512-4/vybRZQtdkpa3IOZQ/EbL6gGjIMO+430db43RRfdw+HPXird7Jl+oIXz6pDh+rGah2H2+Srb/c+eve46xAhtQ==}
+ '@design.estate/dees-catalog@3.55.1':
+ resolution: {integrity: sha512-UXBC68Dg+L2cGJynvrXyaJATlSLnmiA5SMrE1SWVcp2H1niXqHph6KVi9+E52YSLoEmsCS23cf+XjUjoRNgZTw==}
'@design.estate/dees-comms@1.0.30':
resolution: {integrity: sha512-KchMlklJfKAjQiJiR0xmofXtQ27VgZtBIxcMwPE9d+h3jJRv+lPZxzBQVOM0eyM0uS44S5vJMZ11IeV4uDXSHg==}
@@ -4342,7 +4342,7 @@ snapshots:
'@api.global/typedrequest-interfaces': 3.0.19
'@api.global/typedsocket': 4.1.2(@push.rocks/smartserve@2.0.3)
'@cloudflare/workers-types': 4.20260317.1
- '@design.estate/dees-catalog': 3.52.3(@tiptap/pm@2.27.2)
+ '@design.estate/dees-catalog': 3.55.1(@tiptap/pm@2.27.2)
'@design.estate/dees-comms': 1.0.30
'@push.rocks/lik': 6.4.0
'@push.rocks/smartdelay': 3.0.5
@@ -4871,7 +4871,7 @@ snapshots:
dependencies:
'@api.global/typedrequest-interfaces': 3.0.19
- '@design.estate/dees-catalog@3.52.3(@tiptap/pm@2.27.2)':
+ '@design.estate/dees-catalog@3.55.1(@tiptap/pm@2.27.2)':
dependencies:
'@design.estate/dees-domtools': 2.5.4
'@design.estate/dees-element': 2.2.4
@@ -6909,7 +6909,7 @@ snapshots:
'@serve.zone/catalog@2.11.0(@tiptap/pm@2.27.2)':
dependencies:
- '@design.estate/dees-catalog': 3.52.3(@tiptap/pm@2.27.2)
+ '@design.estate/dees-catalog': 3.55.1(@tiptap/pm@2.27.2)
'@design.estate/dees-domtools': 2.5.4
'@design.estate/dees-element': 2.2.4
'@design.estate/dees-wcctools': 3.8.0
diff --git a/readme.md b/readme.md
index 7110ec5..b76fc8f 100644
--- a/readme.md
+++ b/readme.md
@@ -25,7 +25,7 @@ For reporting bugs, issues, or security vulnerabilities, please visit [community
- [Remote Ingress](#remote-ingress)
- [VPN Access Control](#vpn-access-control)
- [Certificate Management](#certificate-management)
-- [Storage & Caching](#storage--caching)
+- [Storage & Database](#storage--database)
- [Security Features](#security-features)
- [OpsServer Dashboard](#opsserver-dashboard)
- [API Client](#api-client)
diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts
index 34fb3b8..5011ad5 100644
--- a/ts/00_commitinfo_data.ts
+++ b/ts/00_commitinfo_data.ts
@@ -3,6 +3,6 @@
*/
export const commitinfo = {
name: '@serve.zone/dcrouter',
- version: '12.8.0',
+ version: '12.8.1',
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
}
diff --git a/ts_interfaces/readme.md b/ts_interfaces/readme.md
index 22e3e52..68d701d 100644
--- a/ts_interfaces/readme.md
+++ b/ts_interfaces/readme.md
@@ -80,6 +80,8 @@ interface IIdentity {
| `IQueueStatus` | Queue name, size, processing/failed/retrying counts |
| `IHealthStatus` | Healthy flag, uptime, per-service status map |
| `INetworkMetrics` | Bandwidth, connection counts, top endpoints |
+| `IRadiusStats` | Running, uptime, auth requests/accepts/rejects, sessions, data transfer |
+| `IVpnStats` | Running, subnet, registered/connected clients, WireGuard port |
| `ILogEntry` | Timestamp, level, category, message, metadata |
#### Route Management Interfaces
@@ -135,7 +137,8 @@ TypedRequest interfaces for the OpsServer API, organized by domain:
| `IReq_GetActiveConnections` | `getActiveConnections` | Active connection list |
| `IReq_GetQueueStatus` | `getQueueStatus` | Email queue status |
| `IReq_GetHealthStatus` | `getHealthStatus` | System health check |
-| `IReq_GetCombinedMetrics` | `getCombinedMetrics` | All metrics in one request |
+| `IReq_GetNetworkStats` | `getNetworkStats` | Network throughput and connection analytics |
+| `IReq_GetCombinedMetrics` | `getCombinedMetrics` | All metrics in one request (server, email, DNS, security, network, RADIUS, VPN) |
#### ⚙️ Configuration
| Interface | Method | Description |
diff --git a/ts_web/00_commitinfo_data.ts b/ts_web/00_commitinfo_data.ts
index 34fb3b8..5011ad5 100644
--- a/ts_web/00_commitinfo_data.ts
+++ b/ts_web/00_commitinfo_data.ts
@@ -3,6 +3,6 @@
*/
export const commitinfo = {
name: '@serve.zone/dcrouter',
- version: '12.8.0',
+ version: '12.8.1',
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
}
diff --git a/ts_web/elements/ops-view-routes.ts b/ts_web/elements/ops-view-routes.ts
index 11bfade..46d5019 100644
--- a/ts_web/elements/ops-view-routes.ts
+++ b/ts_web/elements/ops-view-routes.ts
@@ -431,8 +431,8 @@ export class OpsViewRoutes extends DeesElement {
-
-
+ o.key === (merged.metadata?.securityProfileRef || '')) || null}>
+ o.key === (merged.metadata?.networkTargetRef || '')) || null}>
@@ -477,11 +477,15 @@ export class OpsViewRoutes extends DeesElement {
};
const metadata: any = {};
- if (formData.securityProfileRef) {
- metadata.securityProfileRef = formData.securityProfileRef;
+ const profileRefValue = formData.securityProfileRef as any;
+ const profileKey = typeof profileRefValue === 'string' ? profileRefValue : profileRefValue?.key;
+ if (profileKey) {
+ metadata.securityProfileRef = profileKey;
}
- if (formData.networkTargetRef) {
- metadata.networkTargetRef = formData.networkTargetRef;
+ const targetRefValue = formData.networkTargetRef as any;
+ const targetKey = typeof targetRefValue === 'string' ? targetRefValue : targetRefValue?.key;
+ if (targetKey) {
+ metadata.networkTargetRef = targetKey;
}
await appstate.routeManagementStatePart.dispatchAction(
@@ -528,8 +532,8 @@ export class OpsViewRoutes extends DeesElement {
-
-
+
+
@@ -575,11 +579,15 @@ export class OpsViewRoutes extends DeesElement {
// Build metadata if profile/target selected
const metadata: any = {};
- if (formData.securityProfileRef) {
- metadata.securityProfileRef = formData.securityProfileRef;
+ const profileRefValue = formData.securityProfileRef as any;
+ const profileKey = typeof profileRefValue === 'string' ? profileRefValue : profileRefValue?.key;
+ if (profileKey) {
+ metadata.securityProfileRef = profileKey;
}
- if (formData.networkTargetRef) {
- metadata.networkTargetRef = formData.networkTargetRef;
+ const targetRefValue = formData.networkTargetRef as any;
+ const targetKey = typeof targetRefValue === 'string' ? targetRefValue : targetRefValue?.key;
+ if (targetKey) {
+ metadata.networkTargetRef = targetKey;
}
await appstate.routeManagementStatePart.dispatchAction(
diff --git a/ts_web/readme.md b/ts_web/readme.md
index 7a24ab1..791c802 100644
--- a/ts_web/readme.md
+++ b/ts_web/readme.md
@@ -131,7 +131,7 @@ The app uses `@push.rocks/smartstate` v2.3+ with multiple state parts, scheduled
| State Part | Mode | Description |
|-----------|------|-------------|
| `loginStatePart` | Persistent (IndexedDB) | JWT identity and login status |
-| `statsStatePart` | Soft (memory) | Server, email, DNS, security metrics |
+| `statsStatePart` | Soft (memory) | Server, email, DNS, security, RADIUS, VPN metrics |
| `configStatePart` | Soft | Current system configuration |
| `uiStatePart` | Soft | Active view, sidebar, auto-refresh, theme |
| `logStatePart` | Soft | Recent logs, streaming status, filters |