diff --git a/app/pages/admin/members/[id].vue b/app/pages/admin/members/[id].vue index 4d8be5d..9a0acad 100644 --- a/app/pages/admin/members/[id].vue +++ b/app/pages/admin/members/[id].vue @@ -39,11 +39,11 @@
- +
- +
@@ -106,8 +106,19 @@
Slack invite
-
- {{ member.slackInvited ? "Invited" : "Pending" }} +
+ Invited {{ formatDate(member.slackInvitedAt) }} +
+
+ Not yet invited +
@@ -155,12 +166,6 @@ {{ member.onboarding?.completedAt ? formatDate(member.onboarding.completedAt) : 'In progress' }}
-
-
Slack status
-
- {{ member.slackInviteStatus || 'none' }} -
-
@@ -356,12 +361,31 @@ const hasBoardEngaged = computed(() => { ) }) -const slackStatusClass = computed(() => { - const status = member.value?.slackInviteStatus - if (status === 'joined') return 'status-ok' - if (status === 'invited') return 'status-dim' - return 'status-dim' -}) +const markingSlackInvited = ref(false) + +async function markSlackInvited() { + if (!member.value || markingSlackInvited.value) return + markingSlackInvited.value = true + try { + const res = await $fetch( + `/api/admin/members/${route.params.id}/slack-status`, + { + method: "PATCH", + body: { slackInvited: true }, + }, + ) + member.value = { ...member.value, ...res.member } + toast.add({ title: "Marked as Slack invited", color: "success" }) + } catch (err) { + toast.add({ + title: "Failed to mark Slack invited", + description: err.data?.statusMessage || err.message, + color: "error", + }) + } finally { + markingSlackInvited.value = false + } +} // Activity log const activityEntries = ref([]) @@ -553,6 +577,32 @@ onMounted(loadActivity) word-break: break-all; } +.meta-action { + display: flex; + align-items: center; + gap: 10px; + flex-wrap: wrap; +} + +.link-btn { + background: none; + border: none; + color: var(--candle); + cursor: pointer; + font-family: "Commit Mono", monospace; + font-size: 11px; + padding: 2px 6px; +} + +.link-btn:hover { + text-decoration: underline; +} + +.link-btn:disabled { + opacity: 0.6; + cursor: not-allowed; +} + .mono { font-family: "Commit Mono", monospace; font-size: 11px; diff --git a/app/pages/admin/members/index.vue b/app/pages/admin/members/index.vue index 48ca472..4e8f28d 100644 --- a/app/pages/admin/members/index.vue +++ b/app/pages/admin/members/index.vue @@ -124,8 +124,11 @@ - - {{ member.slackInvited ? "Invited" : "Pending" }} + + Invited {{ formatDate(member.slackInvitedAt) }} + + + Not yet invited @@ -135,8 +138,12 @@ View - @@ -829,8 +836,24 @@ const submitInvites = async () => { }; // --- Existing actions --- -const sendSlackInvite = (member) => { - console.log("Send Slack invite to:", member.email); +const markSlackInvited = async (member) => { + try { + const res = await $fetch( + `/api/admin/members/${member._id}/slack-status`, + { + method: "PATCH", + body: { slackInvited: true }, + }, + ); + Object.assign(member, res.member); + toast.add({ title: "Marked as Slack invited", color: "success" }); + } catch (err) { + toast.add({ + title: "Failed to mark Slack invited", + description: err.data?.statusMessage || err.message, + color: "error", + }); + } }; // --- Edit Member ---