Add service addons and manual scheduling features

Service Addons:
- Add ServiceAddon model with optional resource assignment
- Create AddonSelection component for booking flow
- Add ServiceAddonManager for service configuration
- Include addon API endpoints and serializers

Manual Scheduling:
- Add requires_manual_scheduling and capture_preferred_time to Service model
- Add preferred_datetime and preferred_time_notes to Event model
- Create ManualSchedulingRequest component for booking callback flow
- Auto-open pending sidebar when requests exist or arrive via websocket
- Show preferred times on pending items with detail modal popup
- Add interactive UnscheduledBookingDemo component for help docs

Scheduler Improvements:
- Consolidate Create/EditAppointmentModal into single AppointmentModal
- Update pending sidebar to show preferred schedule info
- Add modal for pending request details with Schedule Now action

Documentation:
- Add Manual Scheduling section to HelpScheduler with interactive demo
- Add Manual Scheduling section to HelpServices with interactive demo

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-23 21:27:24 -05:00
parent 2bfa01e0d4
commit fa7ecf16b1
31 changed files with 4955 additions and 803 deletions

View File

@@ -115,6 +115,9 @@ const HelpSettingsEmailTemplates = React.lazy(() => import('./pages/help/HelpSet
const HelpSettingsEmbedWidget = React.lazy(() => import('./pages/help/HelpSettingsEmbedWidget'));
const HelpSettingsStaffRoles = React.lazy(() => import('./pages/help/HelpSettingsStaffRoles'));
const HelpSettingsCommunication = React.lazy(() => import('./pages/help/HelpSettingsCommunication'));
// TEMP: Demo page for UI options - DELETE AFTER DECISION
const TempUIDemo = React.lazy(() => import('./pages/TempUIDemo'));
const HelpComprehensive = React.lazy(() => import('./pages/help/HelpComprehensive'));
const StaffHelp = React.lazy(() => import('./pages/help/StaffHelp'));
const PlatformSupport = React.lazy(() => import('./pages/PlatformSupport')); // Import Platform Support page (for businesses to contact SmoothSchedule)
@@ -799,6 +802,8 @@ const AppContent: React.FC = () => {
/>
<Route path="/dashboard/scheduler" element={<Scheduler />} />
<Route path="/dashboard/tickets" element={<Tickets />} />
{/* TEMP: Demo page for UI options - DELETE AFTER DECISION */}
<Route path="/dashboard/temp-ui-demo" element={<TempUIDemo />} />
<Route
path="/dashboard/help"
element={