feat(d28): clickable 'Open ↗' link on module URL fields

Any module service field holding an http(s) value now shows a direct 'Open ↗' link
beside it on Client 360 — the RecoverX/CloudBackup/MobileApp portal + AWS-console
shortcuts the founder asked for, working for any URL-valued field (no new type).

Also (DB config, via PATCH /modules — audited, not code): extended the RecoverX,
CloudBackup and MobileApp field-specs with the operational fields requested
(workspace, portal URL, admin login, install date, payment status; S3 bucket / IAM
user / folder / server for cloud; corp id / server / config for the mobile app).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat/client-detail-redesign
Thomas Joise 3 days ago
parent f7e9443a56
commit fa15027f4d

@ -1153,11 +1153,22 @@ function ModuleFieldsForm(props: { cm: ClientModule; fieldSpec: FieldDef[]; onCh
{nonSecret.length > 0 && ( {nonSecret.length > 0 && (
<> <>
<div style={{ display: 'flex', gap: 14, flexWrap: 'wrap', alignItems: 'flex-end' }}> <div style={{ display: 'flex', gap: 14, flexWrap: 'wrap', alignItems: 'flex-end' }}>
{nonSecret.map((f) => ( {nonSecret.map((f) => {
<Field key={f.key} label={f.required === true ? `${f.label} *` : f.label}> // A field holding an http(s) value gets a direct "Open ↗" link (portal/console shortcut).
{control(f)} const val = draft[f.key] ?? ''
</Field> const isUrl = /^https?:\/\//i.test(val.trim())
))} return (
<Field key={f.key} label={f.required === true ? `${f.label} *` : f.label}>
<span style={{ display: 'inline-flex', gap: 6, alignItems: 'center' }}>
{control(f)}
{isUrl && (
<a href={val.trim()} target="_blank" rel="noopener noreferrer"
title="Open in a new tab" style={{ fontSize: 12, whiteSpace: 'nowrap' }}>Open </a>
)}
</span>
</Field>
)
})}
</div> </div>
<Toolbar> <Toolbar>
<Button tone="primary" disabled={busy || !dirty} onClick={save}>{busy ? 'Saving…' : 'Save fields'}</Button> <Button tone="primary" disabled={busy || !dirty} onClick={save}>{busy ? 'Saving…' : 'Save fields'}</Button>

Loading…
Cancel
Save