diff --git a/src/components/admin/DesignerForm.tsx b/src/components/admin/DesignerForm.tsx index 8433b28b..b87bf518 100644 --- a/src/components/admin/DesignerForm.tsx +++ b/src/components/admin/DesignerForm.tsx @@ -12,6 +12,7 @@ import { Ruler, Save, X } from 'lucide-react'; import { Combobox } from '@/components/ui/combobox'; import { useCompanyHeadquarters } from '@/hooks/useAutocompleteData'; import { useUserRole } from '@/hooks/useUserRole'; +import { EntityImageUploader } from '@/components/upload/EntityImageUploader'; const designerSchema = z.object({ name: z.string().min(1, 'Name is required'), @@ -20,7 +21,12 @@ const designerSchema = z.object({ person_type: z.enum(['company', 'individual', 'firm', 'organization']), website_url: z.string().url().optional().or(z.literal('')), founded_year: z.number().min(1800).max(new Date().getFullYear()).optional(), - headquarters_location: z.string().optional() + headquarters_location: z.string().optional(), + logo_url: z.string().optional(), + banner_image_id: z.string().optional(), + banner_image_url: z.string().optional(), + card_image_id: z.string().optional(), + card_image_url: z.string().optional() }); type DesignerFormData = z.infer; @@ -50,7 +56,12 @@ export function DesignerForm({ onSubmit, onCancel, initialData }: DesignerFormPr person_type: initialData?.person_type || 'company', website_url: initialData?.website_url || '', founded_year: initialData?.founded_year || undefined, - headquarters_location: initialData?.headquarters_location || '' + headquarters_location: initialData?.headquarters_location || '', + logo_url: initialData?.logo_url || '', + banner_image_id: initialData?.banner_image_id || '', + banner_image_url: initialData?.banner_image_url || '', + card_image_id: initialData?.card_image_id || '', + card_image_url: initialData?.card_image_url || '' } }); @@ -169,6 +180,24 @@ export function DesignerForm({ onSubmit, onCancel, initialData }: DesignerFormPr )} + {/* Images */} + { + if (images.logo_url !== undefined) setValue('logo_url', images.logo_url); + if (images.banner_image_id !== undefined) setValue('banner_image_id', images.banner_image_id); + if (images.banner_image_url !== undefined) setValue('banner_image_url', images.banner_image_url); + if (images.card_image_id !== undefined) setValue('card_image_id', images.card_image_id); + if (images.card_image_url !== undefined) setValue('card_image_url', images.card_image_url); + }} + showLogo={true} + entityType="designer" + /> + {/* Actions */}
+ {/* Images */} + { + if (images.logo_url !== undefined) setValue('logo_url', images.logo_url); + if (images.banner_image_id !== undefined) setValue('banner_image_id', images.banner_image_id); + if (images.banner_image_url !== undefined) setValue('banner_image_url', images.banner_image_url); + if (images.card_image_id !== undefined) setValue('card_image_id', images.card_image_id); + if (images.card_image_url !== undefined) setValue('card_image_url', images.card_image_url); + }} + showLogo={true} + entityType="manufacturer" + /> + {/* Actions */}
+ {/* Images */} + { + if (images.logo_url !== undefined) setValue('logo_url', images.logo_url); + if (images.banner_image_id !== undefined) setValue('banner_image_id', images.banner_image_id); + if (images.banner_image_url !== undefined) setValue('banner_image_url', images.banner_image_url); + if (images.card_image_id !== undefined) setValue('card_image_id', images.card_image_id); + if (images.card_image_url !== undefined) setValue('card_image_url', images.card_image_url); + }} + showLogo={true} + entityType="operator" + /> + {/* Actions */}
+ {/* Images */} + { + if (images.logo_url !== undefined) setValue('logo_url', images.logo_url); + if (images.banner_image_id !== undefined) setValue('banner_image_id', images.banner_image_id); + if (images.banner_image_url !== undefined) setValue('banner_image_url', images.banner_image_url); + if (images.card_image_id !== undefined) setValue('card_image_id', images.card_image_id); + if (images.card_image_url !== undefined) setValue('card_image_url', images.card_image_url); + }} + showLogo={true} + entityType="property_owner" + /> + {/* Actions */}
+ {/* Images */} + { + if (images.banner_image_id !== undefined) setValue('banner_image_id', images.banner_image_id); + if (images.banner_image_url !== undefined) setValue('banner_image_url', images.banner_image_url); + if (images.card_image_id !== undefined) setValue('card_image_id', images.card_image_id); + if (images.card_image_url !== undefined) setValue('card_image_url', images.card_image_url); + }} + showLogo={false} + entityType="ride_model" + /> + {/* Actions */}
+
+

{spec.description}

+ handleUploadComplete(type, urls)} + maxFiles={1} + variant="compact" + allowedFileTypes={['image/jpeg', 'image/jpg', 'image/png', 'image/webp']} + /> + + + ); + } + + return ( + + {hasImage ? ( +
+ {`${spec.label} +
+ + +
+ {spec.label} +
+ ) : ( + + )} +
+ ); + }; + + return ( +
+
+ + + Recommended formats: JPG, PNG, WebP + +
+ +
+ {showLogo && renderImageSlot('logo')} + {renderImageSlot('banner')} + {renderImageSlot('card')} +
+
+ ); +} diff --git a/src/integrations/supabase/types.ts b/src/integrations/supabase/types.ts index aad62580..5a95a718 100644 --- a/src/integrations/supabase/types.ts +++ b/src/integrations/supabase/types.ts @@ -77,6 +77,10 @@ export type Database = { companies: { Row: { average_rating: number | null + banner_image_id: string | null + banner_image_url: string | null + card_image_id: string | null + card_image_url: string | null company_type: string created_at: string description: string | null @@ -93,6 +97,10 @@ export type Database = { } Insert: { average_rating?: number | null + banner_image_id?: string | null + banner_image_url?: string | null + card_image_id?: string | null + card_image_url?: string | null company_type: string created_at?: string description?: string | null @@ -109,6 +117,10 @@ export type Database = { } Update: { average_rating?: number | null + banner_image_id?: string | null + banner_image_url?: string | null + card_image_id?: string | null + card_image_url?: string | null company_type?: string created_at?: string description?: string | null @@ -806,6 +818,10 @@ export type Database = { } ride_models: { Row: { + banner_image_id: string | null + banner_image_url: string | null + card_image_id: string | null + card_image_url: string | null category: string created_at: string description: string | null @@ -818,6 +834,10 @@ export type Database = { updated_at: string } Insert: { + banner_image_id?: string | null + banner_image_url?: string | null + card_image_id?: string | null + card_image_url?: string | null category: string created_at?: string description?: string | null @@ -830,6 +850,10 @@ export type Database = { updated_at?: string } Update: { + banner_image_id?: string | null + banner_image_url?: string | null + card_image_id?: string | null + card_image_url?: string | null category?: string created_at?: string description?: string | null diff --git a/supabase/migrations/20251001183437_085bf43a-c185-437c-b410-dcfaf7311366.sql b/supabase/migrations/20251001183437_085bf43a-c185-437c-b410-dcfaf7311366.sql new file mode 100644 index 00000000..44dc6af3 --- /dev/null +++ b/supabase/migrations/20251001183437_085bf43a-c185-437c-b410-dcfaf7311366.sql @@ -0,0 +1,13 @@ +-- Add image fields to companies table +ALTER TABLE public.companies +ADD COLUMN IF NOT EXISTS banner_image_id TEXT, +ADD COLUMN IF NOT EXISTS banner_image_url TEXT, +ADD COLUMN IF NOT EXISTS card_image_id TEXT, +ADD COLUMN IF NOT EXISTS card_image_url TEXT; + +-- Add image fields to ride_models table +ALTER TABLE public.ride_models +ADD COLUMN IF NOT EXISTS banner_image_id TEXT, +ADD COLUMN IF NOT EXISTS banner_image_url TEXT, +ADD COLUMN IF NOT EXISTS card_image_id TEXT, +ADD COLUMN IF NOT EXISTS card_image_url TEXT; \ No newline at end of file