feat(portal): Apple Mail profile download on user rows + drawer
ci / changes (push) Successful in 3s
ci / tc_booking (push) Has been skipped
ci / tc_operator (push) Has been skipped
ci / tc_website (push) Has been skipped
ci / tc_platform_api (push) Has been skipped
ci / test_platform_api (push) Has been skipped
ci / build_booking (push) Has been skipped
ci / build_operator (push) Has been skipped
ci / build_platform_api (push) Has been skipped
ci / tc_portal (push) Successful in 25s
ci / build_portal (push) Successful in 41s
ci / deploy (push) Successful in 40s

The .mobileconfig button only lived on the transient credential dialogs
(invite/create/reset results) — nowhere to fetch a profile for an
existing mailbox. Row kebab menu gains 'Download Apple Mail profile'
(mailbox users only) and the user drawer shows the button next to the
mailbox address.
This commit is contained in:
Ronni Baslund
2026-06-11 08:00:15 +02:00
parent d964efcab7
commit 221179c4db
+10
View File
@@ -173,6 +173,7 @@ function bulkExport() {
function rowAction(u: TenantUserDoc, id: string) { function rowAction(u: TenantUserDoc, id: string) {
if (id === 'open') openUser.value = u if (id === 'open') openUser.value = u
else if (id === 'reset') resetTarget.value = u else if (id === 'reset') resetTarget.value = u
else if (id === 'apple-profile' && u.mailboxAddress) downloadAppleProfile(u.mailboxAddress, u.name)
else if (id === 'force') forceLogoutUser(u) else if (id === 'force') forceLogoutUser(u)
else if (id === 'make-owner') makeOwnerTarget.value = u else if (id === 'make-owner') makeOwnerTarget.value = u
else if (id === 'suspend') suspendTarget.value = u else if (id === 'suspend') suspendTarget.value = u
@@ -187,6 +188,9 @@ function rowItems(u: TenantUserDoc) {
return [ return [
{ id: 'open', label: 'Open profile', icon: 'external' as const }, { id: 'open', label: 'Open profile', icon: 'external' as const },
{ id: 'reset', label: 'Send password reset', icon: 'key' as const }, { id: 'reset', label: 'Send password reset', icon: 'key' as const },
...(u.mailboxAddress
? [{ id: 'apple-profile', label: 'Download Apple Mail profile', icon: 'download' as const }]
: []),
{ id: 'force', label: 'Force logout', icon: 'logout' as const }, { id: 'force', label: 'Force logout', icon: 'logout' as const },
{ id: 'sep1', separator: true }, { id: 'sep1', separator: true },
...(canManageOwnership.value && effectiveRole(u) !== 'owner' ...(canManageOwnership.value && effectiveRole(u) !== 'owner'
@@ -743,7 +747,13 @@ async function submitCreateMailbox() {
<div class="kv"> <div class="kv">
<span class="kv-k">Mailbox</span> <span class="kv-k">Mailbox</span>
<template v-if="openUser.mailboxAddress"> <template v-if="openUser.mailboxAddress">
<div class="kv-inline">
<Mono class="kv-v">{{ openUser.mailboxAddress }}</Mono> <Mono class="kv-v">{{ openUser.mailboxAddress }}</Mono>
<UiButton size="sm" variant="secondary" @click="downloadAppleProfile(openUser.mailboxAddress, openUser.name)">
<template #leading><UiIcon name="download" :size="13" /></template>
Apple Mail profile
</UiButton>
</div>
</template> </template>
<div v-else class="kv-inline"> <div v-else class="kv-inline">
<span class="kv-v muted-v">No mailbox — sign-in only</span> <span class="kv-v muted-v">No mailbox — sign-in only</span>