Integrated new member state into manage members page

Implemented suspend/unsuspend
This commit is contained in:
2026-02-08 13:54:23 -05:00
parent cf880ed124
commit 921e74f188
5 changed files with 104 additions and 13 deletions

View File

@@ -135,4 +135,26 @@ export async function dischargeMember(data: Discharge): Promise<boolean> {
throw new Error("Failed to discharge member");
}
return true;
}
export async function suspendMember(memberID: number): Promise<boolean> {
const response = await fetch(`${addr}/members/suspend?target=${memberID}`, {
credentials: 'include',
method: 'POST',
});
if (!response.ok) {
throw new Error("Failed to discharge member");
}
return true;
}
export async function unsuspendMember(memberID: number): Promise<boolean> {
const response = await fetch(`${addr}/members/unsuspend?target=${memberID}`, {
credentials: 'include',
method: 'POST',
});
if (!response.ok) {
throw new Error("Failed to discharge member");
}
return true;
}

View File

@@ -15,7 +15,7 @@
} from '@/components/ui/pagination'
// API & Types
import { getMembersFiltered } from "@/api/member";
import { getMembersFiltered, suspendMember, unsuspendMember } from "@/api/member";
import { getUnits } from "@/api/units";
import type { Member } from "@shared/types/member";
import { MemberState } from "@shared/types/member";
@@ -145,8 +145,12 @@
isDischargeOpen.value = true
}
function suspendMember(member: Member) {
async function onSuspend(member: Member) {
await suspendMember(member.member_id);
}
async function onUnsuspend(member: Member) {
await unsuspendMember(member.member_id);
}
function handleDischargeSuccess(data) {
@@ -222,7 +226,7 @@
<TableHead class="w-[200px]">Member</TableHead>
<TableHead>Rank</TableHead>
<TableHead>Unit</TableHead>
<TableHead>Status</TableHead>
<TableHead>State</TableHead>
<TableHead></TableHead>
<TableHead class="text-right">Actions</TableHead>
</TableRow>
@@ -238,7 +242,7 @@
<TableCell>{{ member.rank }}</TableCell>
<TableCell>{{ member.unit }}</TableCell>
<TableCell>
<Badge variant="outline" class="capitalize font-normal">{{ member.status }}</Badge>
<Badge variant="outline" class="capitalize font-normal">{{ MemberState[member.member_state] }}</Badge>
</TableCell>
<TableCell>
<Badge v-if="member.loa_until" variant="secondary"
@@ -259,10 +263,14 @@
class="text-destructive focus:bg-destructive focus:text-destructive-foreground font-medium">
Discharge Member
</DropdownMenuItem>
<DropdownMenuItem @click="suspendMember(member)"
<DropdownMenuItem v-if="member.member_state !== MemberState.Suspended" @click="onSuspend(member)"
class="text-destructive focus:bg-destructive focus:text-destructive-foreground font-medium">
Suspend Member
</DropdownMenuItem>
<DropdownMenuItem v-else @click="onUnsuspend(member)"
class="text-destructive focus:bg-destructive focus:text-destructive-foreground font-medium">
Remove Suspension
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</TableCell>