diff --git a/web/src/lib/api/types.ts b/web/src/lib/api/types.ts index 40d3b99..98dd3cd 100644 --- a/web/src/lib/api/types.ts +++ b/web/src/lib/api/types.ts @@ -20,6 +20,7 @@ export interface PaginationMeta { // Market types export interface MarketSummary { id: string; + series_id?: string; slug: string; name: string; city: string; @@ -33,6 +34,7 @@ export interface MarketSummary { image_url: string; organizer_name: string; distance?: number; // meters, only in geo queries + edition_count?: number; } export interface MarketDetail { @@ -70,6 +72,12 @@ export interface AdmissionInfo { notes: string; } +export interface EditionBrief { + year: number; + start_date: string; + end_date: string; +} + // Auth types export interface AuthData { access_token: string; @@ -99,15 +107,26 @@ export interface ProfileData { } // Admin types -export type MarketStatus = 'pending' | 'approved' | 'rejected'; +export type EditionStatus = + | 'rumored' + | 'confirmed' + | 'active' + | 'completed' + | 'cancelled' + | 'archived'; + +// Keep backward compat alias +export type MarketStatus = EditionStatus; export interface AdminMarketSummary { id: string; + series_id: string; + year: number; slug: string; name: string; city: string; state: string; - status: MarketStatus; + status: EditionStatus; start_date: string; end_date: string; organizer_name: string; @@ -117,7 +136,10 @@ export interface AdminMarketSummary { export interface AdminMarketDetail { id: string; + series_id: string; + year: number; slug: string; + series_name: string; name: string; description: string; street: string; @@ -134,7 +156,8 @@ export interface AdminMarketDetail { website: string; organizer_name: string; image_url: string; - status: MarketStatus; + sources: string[] | null; + status: EditionStatus; submitter_email?: string; submitter_name: string; admin_notes: string; @@ -160,6 +183,52 @@ export interface SubmitMarketRequest { turnstile_token: string; } +// AI Research types +export interface ResearchResult { + suggestions: FieldSuggestion[]; + sources: string[]; +} + +export interface FieldSuggestion { + field: string; + current_value: unknown; + suggested_value: unknown; + confidence: 'high' | 'medium' | 'low'; + reason: string; +} + +// Duplicate detection +export interface DuplicateMarket { + id: string; + name: string; + city: string; + start_date: string; + end_date: string; + similarity: number; +} + +// Series types +export interface SeriesSummary { + id: string; + slug: string; + name: string; + city: string; + country: string; +} + +export interface AdminSeriesGroup { + series_id: string; + slug: string; + series_name: string; + city: string; + editions: AdminMarketSummary[]; +} + +export interface SeriesEditionsResponse { + series: SeriesSummary; + editions: AdminMarketSummary[]; +} + // Search params (mirrors backend SearchParams) export interface MarketSearchParams { lat?: number; diff --git a/web/src/lib/components/admin/MarketForm.svelte b/web/src/lib/components/admin/MarketForm.svelte index b4be2e9..014dfaa 100644 --- a/web/src/lib/components/admin/MarketForm.svelte +++ b/web/src/lib/components/admin/MarketForm.svelte @@ -1,15 +1,129 @@ {#if error} @@ -26,7 +140,14 @@
@@ -46,15 +169,40 @@