feat: Add photo galleries to services, resource types management, and UI improvements
Major features: - Add drag-and-drop photo gallery to Service create/edit modals - Add Resource Types management section to Settings (CRUD for custom types) - Add edit icon consistency to Resources table (pencil icon in actions) - Improve Services page with drag-to-reorder and customer preview mockup Backend changes: - Add photos JSONField to Service model with migration - Add ResourceType model with category (STAFF/OTHER), description fields - Add ResourceTypeViewSet with CRUD operations - Add service reorder endpoint for display order Frontend changes: - Services page: two-column layout, drag-reorder, photo upload - Settings page: Resource Types tab with full CRUD modal - Resources page: Edit icon in actions column instead of row click - Sidebar: Payments link visibility based on role and paymentsEnabled - Update types.ts with Service.photos and ResourceTypeDefinition Note: Removed photos from ResourceType (kept only for Service) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -38,6 +38,8 @@ export interface Business {
|
||||
primaryColor: string;
|
||||
secondaryColor: string;
|
||||
logoUrl?: string;
|
||||
emailLogoUrl?: string;
|
||||
logoDisplayMode?: 'logo-only' | 'text-only' | 'logo-and-text'; // How to display branding
|
||||
whitelabelEnabled: boolean;
|
||||
plan?: 'Free' | 'Professional' | 'Business' | 'Enterprise';
|
||||
status?: 'Active' | 'Suspended' | 'Trial';
|
||||
@@ -58,6 +60,7 @@ export interface Business {
|
||||
isTrialActive?: boolean;
|
||||
isTrialExpired?: boolean;
|
||||
daysLeftInTrial?: number;
|
||||
resourceTypes?: ResourceTypeDefinition[]; // Custom resource types
|
||||
}
|
||||
|
||||
export type UserRole = 'superuser' | 'platform_manager' | 'platform_support' | 'owner' | 'manager' | 'staff' | 'resource' | 'customer';
|
||||
@@ -87,11 +90,25 @@ export interface User {
|
||||
|
||||
export type ResourceType = 'STAFF' | 'ROOM' | 'EQUIPMENT';
|
||||
|
||||
export type ResourceTypeCategory = 'STAFF' | 'OTHER';
|
||||
|
||||
export interface ResourceTypeDefinition {
|
||||
id: string;
|
||||
name: string; // User-facing name like "Stylist", "Massage Therapist", "Treatment Room"
|
||||
description?: string; // Description of this resource type
|
||||
category: ResourceTypeCategory; // STAFF (requires staff assignment) or OTHER
|
||||
isDefault: boolean; // Cannot be deleted
|
||||
iconName?: string; // Optional icon identifier
|
||||
}
|
||||
|
||||
export interface Resource {
|
||||
id: string;
|
||||
name: string;
|
||||
type: ResourceType;
|
||||
type: ResourceType; // Legacy field - will be deprecated
|
||||
typeId?: string; // New field - references ResourceTypeDefinition
|
||||
userId?: string;
|
||||
maxConcurrentEvents: number;
|
||||
savedLaneCount?: number; // Remembered lane count when multilane is disabled
|
||||
}
|
||||
|
||||
export type AppointmentStatus = 'PENDING' | 'CONFIRMED' | 'COMPLETED' | 'CANCELLED' | 'NO_SHOW';
|
||||
@@ -147,6 +164,8 @@ export interface Service {
|
||||
durationMinutes: number;
|
||||
price: number;
|
||||
description: string;
|
||||
displayOrder: number;
|
||||
photos?: string[];
|
||||
}
|
||||
|
||||
export interface Metric {
|
||||
|
||||
Reference in New Issue
Block a user