diff --git a/src/lib/types/api/crew.ts b/src/lib/types/api/crew.ts
index 7dde60a2..c64411dc 100644
--- a/src/lib/types/api/crew.ts
+++ b/src/lib/types/api/crew.ts
@@ -114,9 +114,11 @@ export interface UpdatePhantomPlayerInput {
granblueId?: string
notes?: string
joinedAt?: string
+ retired?: boolean
}
export interface UpdateMembershipInput {
role?: CrewRole
joinedAt?: string
+ retired?: boolean
}
diff --git a/src/routes/(app)/crew/members/+page.svelte b/src/routes/(app)/crew/members/+page.svelte
index 85706ac2..542d40e7 100644
--- a/src/routes/(app)/crew/members/+page.svelte
+++ b/src/routes/(app)/crew/members/+page.svelte
@@ -18,6 +18,8 @@
import ModalHeader from '$lib/components/ui/ModalHeader.svelte'
import ModalBody from '$lib/components/ui/ModalBody.svelte'
import ModalFooter from '$lib/components/ui/ModalFooter.svelte'
+ import SettingsRow from '$lib/components/ui/SettingsRow.svelte'
+ import Switch from '$lib/components/ui/switch/Switch.svelte'
import CrewHeader from '$lib/components/crew/CrewHeader.svelte'
import ScoutUserModal from '$lib/components/crew/ScoutUserModal.svelte'
import BulkPhantomModal from '$lib/components/crew/BulkPhantomModal.svelte'
@@ -101,11 +103,12 @@
let confirmAction = $state<'remove' | 'promote' | 'demote' | null>(null)
let selectedMember = $state(null)
- // Dialog state for editing join date
- let editJoinDateDialogOpen = $state(false)
+ // Dialog state for editing member/phantom
+ let editDialogOpen = $state(false)
let editingMember = $state(null)
let editingPhantom = $state(null)
let editJoinDate = $state('')
+ let editRetired = $state(false)
// Dialog state for scout modal
let scoutModalOpen = $state(false)
@@ -193,23 +196,25 @@
confirmAction = null
}
- // Join date editing
- function openEditJoinDateDialog(member: CrewMembership) {
+ // Member/phantom editing
+ function openEditMemberDialog(member: CrewMembership) {
editingMember = member
editingPhantom = null
// Format date for input
editJoinDate = member.joinedAt ? member.joinedAt.split('T')[0] ?? '' : ''
- editJoinDateDialogOpen = true
+ editRetired = member.retired
+ editDialogOpen = true
}
- function openEditPhantomJoinDateDialog(phantom: PhantomPlayer) {
+ function openEditPhantomDialog(phantom: PhantomPlayer) {
editingPhantom = phantom
editingMember = null
editJoinDate = phantom.joinedAt ? phantom.joinedAt.split('T')[0] ?? '' : ''
- editJoinDateDialogOpen = true
+ editRetired = phantom.retired
+ editDialogOpen = true
}
- async function handleSaveJoinDate() {
+ async function handleSaveEdit() {
if (!crewStore.crew) return
try {
@@ -217,12 +222,13 @@
await updateMembershipMutation.mutateAsync({
crewId: crewStore.crew.id,
membershipId: editingMember.id,
- input: { joinedAt: editJoinDate }
+ input: { joinedAt: editJoinDate, retired: editRetired }
})
} else if (editingPhantom) {
// Call the phantom update directly through the adapter
await crewAdapter.updatePhantom(crewStore.crew.id, editingPhantom.id, {
- joinedAt: editJoinDate
+ joinedAt: editJoinDate,
+ retired: editRetired
})
// Invalidate members query
membersQuery.refetch()
@@ -230,13 +236,14 @@
// Invalidate GW event queries since membersDuringEvent depends on join dates
queryClient.invalidateQueries({ queryKey: ['crew', 'gw'] })
} catch (error) {
- console.error('Failed to update join date:', error)
+ console.error('Failed to update:', error)
}
- editJoinDateDialogOpen = false
+ editDialogOpen = false
editingMember = null
editingPhantom = null
editJoinDate = ''
+ editRetired = false
}
function openDeletePhantomDialog(phantom: PhantomPlayer) {
@@ -401,7 +408,7 @@
{#snippet menu()}
@@ -479,7 +486,7 @@
{#snippet menu()}
@@ -544,8 +551,8 @@
{/snippet}
-
-
+
+ {#snippet control()}
+
+ {/snippet}
+
(editJoinDateDialogOpen = false)}
+ onCancel={() => (editDialogOpen = false)}
primaryAction={{
label: 'Save',
- onclick: handleSaveJoinDate,
+ onclick: handleSaveEdit,
disabled: !editJoinDate
}}
/>