- 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
70 lines
2.4 KiB
TypeScript
70 lines
2.4 KiB
TypeScript
import { z } from 'zod';
|
|
import { createPageSchema, createPageSizeSchema, createPaginationSchema } from './pagination.js';
|
|
|
|
const isoDateTimeSchema = z.string().datetime();
|
|
const pageSchema = createPageSchema();
|
|
const pageSizeSchema = createPageSizeSchema(10);
|
|
const paginationSchema = createPaginationSchema();
|
|
|
|
export const waitlistStatusSchema = z.enum(['PENDING', 'INVITED', 'JOINED', 'DECLINED']);
|
|
|
|
export const WaitlistEntryDtoSchema = z.object({
|
|
id: z.string(),
|
|
email: z.string(),
|
|
name: z.string().nullable(),
|
|
status: waitlistStatusSchema,
|
|
createdAt: isoDateTimeSchema,
|
|
updatedAt: isoDateTimeSchema,
|
|
});
|
|
export type WaitlistEntryDto = z.output<typeof WaitlistEntryDtoSchema>;
|
|
|
|
export const WaitlistQuerySchema = z.object({
|
|
page: pageSchema,
|
|
pageSize: pageSizeSchema,
|
|
});
|
|
export type WaitlistQuery = z.output<typeof WaitlistQuerySchema>;
|
|
|
|
export const WaitlistListSchema = z.object({
|
|
data: z.array(WaitlistEntryDtoSchema),
|
|
pagination: paginationSchema,
|
|
});
|
|
export type WaitlistList = z.output<typeof WaitlistListSchema>;
|
|
|
|
export const GroupWaitlistEntryDtoSchema = z.object({
|
|
id: z.string(),
|
|
groupId: z.string(),
|
|
fullName: z.string(),
|
|
phone: z.string(),
|
|
email: z.string().nullable(),
|
|
notes: z.string().nullable(),
|
|
status: waitlistStatusSchema,
|
|
createdAt: isoDateTimeSchema,
|
|
updatedAt: isoDateTimeSchema,
|
|
});
|
|
export type GroupWaitlistEntryDto = z.output<typeof GroupWaitlistEntryDtoSchema>;
|
|
|
|
export const CreateGroupWaitlistEntrySchema = z.object({
|
|
firstName: z.string().trim().min(1, 'El nombre es obligatorio'),
|
|
lastName: z.string().trim().optional().default(''),
|
|
phone: z.string().trim().min(6, 'Ingresa un número de teléfono válido'),
|
|
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 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>; |