Phase 2: Admin availability UI with calendar grid, edit modal, and e2e tests

This commit is contained in:
counterweight 2025-12-20 23:54:34 +01:00
parent 64d2e99d73
commit f6cf093cb1
Signed by: counterweight
GPG key ID: 883EDBAA726BD96C
5 changed files with 1130 additions and 1 deletions

View file

@ -312,6 +312,50 @@ export interface paths {
patch?: never;
trace?: never;
};
"/api/admin/availability": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get Availability
* @description Get availability slots for a date range.
*/
get: operations["get_availability_api_admin_availability_get"];
/**
* Set Availability
* @description Set availability for a specific date. Replaces any existing availability.
*/
put: operations["set_availability_api_admin_availability_put"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/admin/availability/copy": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Copy Availability
* @description Copy availability from one day to multiple target days.
*/
post: operations["copy_availability_api_admin_availability_copy_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/meta/constants": {
parameters: {
query?: never;
@ -346,6 +390,27 @@ export interface components {
/** Email */
email: string;
};
/**
* AvailabilityDay
* @description Availability for a single day.
*/
AvailabilityDay: {
/**
* Date
* Format: date
*/
date: string;
/** Slots */
slots: components["schemas"]["TimeSlot"][];
};
/**
* AvailabilityResponse
* @description Response model for availability query.
*/
AvailabilityResponse: {
/** Days */
days: components["schemas"]["AvailabilityDay"][];
};
/**
* ConstantsResponse
* @description Response model for shared constants.
@ -358,6 +423,19 @@ export interface components {
/** Invite Statuses */
invite_statuses: string[];
};
/**
* CopyAvailabilityRequest
* @description Request to copy availability from one day to others.
*/
CopyAvailabilityRequest: {
/**
* Source Date
* Format: date
*/
source_date: string;
/** Target Dates */
target_dates: string[];
};
/**
* CounterRecordResponse
* @description Response model for a counter audit record.
@ -515,6 +593,19 @@ export interface components {
/** Invite Identifier */
invite_identifier: string;
};
/**
* SetAvailabilityRequest
* @description Request to set availability for a specific date.
*/
SetAvailabilityRequest: {
/**
* Date
* Format: date
*/
date: string;
/** Slots */
slots: components["schemas"]["TimeSlot"][];
};
/**
* SumRecordResponse
* @description Response model for a sum audit record.
@ -558,6 +649,22 @@ export interface components {
/** Result */
result: number;
};
/**
* TimeSlot
* @description A single time slot (start and end time).
*/
TimeSlot: {
/**
* Start Time
* Format: time
*/
start_time: string;
/**
* End Time
* Format: time
*/
end_time: string;
};
/**
* UserCredentials
* @description Base model for user email/password.
@ -1097,6 +1204,106 @@ export interface operations {
};
};
};
get_availability_api_admin_availability_get: {
parameters: {
query: {
/** @description Start date (inclusive) */
from: string;
/** @description End date (inclusive) */
to: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["AvailabilityResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
set_availability_api_admin_availability_put: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["SetAvailabilityRequest"];
};
};
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["AvailabilityDay"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
copy_availability_api_admin_availability_copy_post: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CopyAvailabilityRequest"];
};
};
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["AvailabilityResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
get_constants_api_meta_constants_get: {
parameters: {
query?: never;