diff --git a/changelog.md b/changelog.md index b569039..049078a 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,12 @@ # Changelog +## 2026-04-06 - 13.0.8 - fix(ops-view-vpn) +show target profile names in VPN forms and load profile candidates for autocomplete + +- fetch target profiles when the VPN operations view connects so profile data is available in the UI +- replace comma-separated target profile ID inputs with a restricted autocomplete list based on available target profiles +- map stored target profile IDs to profile names for table and detail displays, while resolving selected names back to IDs on save + ## 2026-04-06 - 13.0.7 - fix(vpn,target-profiles) refresh VPN client security when target profiles change and include profile target IPs in direct destination allow-lists diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index e528aad..32f6ea1 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: '13.0.7', + version: '13.0.8', description: 'A multifaceted routing service handling mail and SMS delivery functions.' } diff --git a/ts_web/00_commitinfo_data.ts b/ts_web/00_commitinfo_data.ts index e528aad..32f6ea1 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: '13.0.7', + version: '13.0.8', description: 'A multifaceted routing service handling mail and SMS delivery functions.' } diff --git a/ts_web/elements/ops-view-vpn.ts b/ts_web/elements/ops-view-vpn.ts index acbeea4..55c40c4 100644 --- a/ts_web/elements/ops-view-vpn.ts +++ b/ts_web/elements/ops-view-vpn.ts @@ -60,6 +60,8 @@ export class OpsViewVpn extends DeesElement { async connectedCallback() { await super.connectedCallback(); await appstate.vpnStatePart.dispatchAction(appstate.fetchVpnAction, null); + // Ensure target profiles are loaded for autocomplete candidates + await appstate.targetProfilesStatePart.dispatchAction(appstate.fetchTargetProfilesAction, null); } public static styles = [ @@ -328,7 +330,11 @@ export class OpsViewVpn extends DeesElement { 'Routing': routingHtml, 'VPN IP': client.assignedIp || '-', 'Target Profiles': client.targetProfileIds?.length - ? html`${client.targetProfileIds.map(t => html`${t}`)}` + ? html`${client.targetProfileIds.map(id => { + const profileState = appstate.targetProfilesStatePart.getState(); + const profile = profileState?.profiles.find(p => p.id === id); + return html`${profile?.name || id}`; + })}` : '-', 'Description': client.description || '-', 'Created': new Date(client.createdAt).toLocaleDateString(), @@ -341,13 +347,14 @@ export class OpsViewVpn extends DeesElement { type: ['header'], actionFunc: async () => { const { DeesModal } = await import('@design.estate/dees-catalog'); + const profileCandidates = this.getTargetProfileCandidates(); const createModal = await DeesModal.createAndShow({ heading: 'Create VPN Client', content: html` - +