feat: manage waitlist and remove group members

- Add group-waitlist module (list/promote/remove entries)
- Remove attendee with optional atomic promotion from waitlist
- Block removal when attendee has payments (attendee_has_payments)
- Waitlist detail modal matching members UI; optimistic add-to-waitlist
- Responsive tweaks for the members/waitlist tabs
This commit is contained in:
Jose Selesan
2026-09-22 17:04:41 -03:00
parent 785d54df7e
commit fc30927b8b
19 changed files with 1417 additions and 103 deletions

View File

@@ -1,5 +1,6 @@
import { z } from 'zod';
import { createPageSchema, createPageSizeSchema, createPaginationSchema } from './pagination.js';
import { GroupWaitlistEntryDtoSchema } from './waitlist.js';
const isoDateTimeSchema = z.string().datetime();
const pageSchema = createPageSchema();
@@ -92,4 +93,20 @@ export const BulkCreateAttendeesResultSchema = z.object({
message: z.string(),
created: z.array(AttendeeDtoSchema),
});
export type BulkCreateAttendeesResult = z.output<typeof BulkCreateAttendeesResultSchema>;
export type BulkCreateAttendeesResult = z.output<typeof BulkCreateAttendeesResultSchema>;
export const PromoteGroupWaitlistEntryResultSchema = z.object({
attendee: AttendeeDtoSchema,
});
export type PromoteGroupWaitlistEntryResult = z.output<typeof PromoteGroupWaitlistEntryResultSchema>;
export const RemoveAttendeeQuerySchema = z.object({
promoteFromWaitlist: z.coerce.boolean().optional(),
});
export type RemoveAttendeeQuery = z.output<typeof RemoveAttendeeQuerySchema>;
export const RemoveAttendeeResultSchema = z.object({
removedAttendeeId: z.string(),
promoted: GroupWaitlistEntryDtoSchema.nullable(),
});
export type RemoveAttendeeResult = z.output<typeof RemoveAttendeeResultSchema>;

View File

@@ -50,4 +50,21 @@ export const CreateGroupWaitlistEntrySchema = z.object({
email: z.string().trim().email('Email inválido').optional().or(z.literal('')),
notes: z.string().trim().optional(),
});
export type CreateGroupWaitlistEntry = z.output<typeof CreateGroupWaitlistEntrySchema>;
export type CreateGroupWaitlistEntry = z.output<typeof CreateGroupWaitlistEntrySchema>;
export const GroupWaitlistQuerySchema = z.object({
page: pageSchema,
pageSize: pageSizeSchema,
});
export type GroupWaitlistQuery = z.output<typeof GroupWaitlistQuerySchema>;
export const GroupWaitlistListSchema = z.object({
data: z.array(GroupWaitlistEntryDtoSchema),
pagination: paginationSchema,
});
export type GroupWaitlistList = z.output<typeof GroupWaitlistListSchema>;
export const RemoveGroupWaitlistEntryResultSchema = z.object({
deleted: z.boolean(),
});
export type RemoveGroupWaitlistEntryResult = z.output<typeof RemoveGroupWaitlistEntryResultSchema>;