docs(help): Comprehensive Scheduler documentation with all features

Rewrote HelpScheduler.tsx to document actual scheduler features including:
- Drag-and-drop to reschedule, change resource, or delete appointments
- Resize appointments by dragging edges (start or end)
- Pending appointments sidebar with archive zone
- Undo/Redo with Ctrl+Z/Ctrl+Y (up to 50 actions)
- Zoom controls for timeline detail
- Status colors (blue/yellow/red/green/gray)
- Filtering by status, resource, and service
- Overlapping appointment lanes
- Real-time WebSocket updates
- Month view click-to-day and drag overlay features

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-03 02:27:39 -05:00
parent 5aa49399d0
commit baffe7e577

View File

@@ -22,6 +22,18 @@ import {
Eye,
Calendar,
Grid,
Move,
GripVertical,
Undo,
Redo,
ZoomIn,
ZoomOut,
Archive,
AlertCircle,
Inbox,
MousePointer,
Keyboard,
Layers,
} from 'lucide-react';
const HelpScheduler: React.FC = () => {
@@ -50,7 +62,7 @@ const HelpScheduler: React.FC = () => {
Scheduler Guide
</h1>
<p className="text-gray-500 dark:text-gray-400">
Manage appointments and view your calendar
Master your appointment calendar with drag-and-drop scheduling
</p>
</div>
</div>
@@ -64,10 +76,14 @@ const HelpScheduler: React.FC = () => {
</h2>
<div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-6">
<p className="text-gray-600 dark:text-gray-300 mb-4">
The Scheduler is your central hub for managing all appointments and events. It provides a visual calendar interface that lets you see availability, book new appointments, and manage existing bookings efficiently.
The Scheduler is a powerful, interactive calendar designed for fast appointment management.
It features full drag-and-drop support, real-time updates via WebSocket, and a horizontal timeline
layout that shows all your resources (staff, rooms, equipment) at once.
</p>
<p className="text-gray-600 dark:text-gray-300">
The scheduler supports multiple view modes and filtering options to help you find exactly what you need, whether you're looking at a single day or planning weeks ahead.
You can reschedule appointments by dragging them, resize them by pulling their edges,
filter by status/resource/service, and even undo mistakes with keyboard shortcuts.
Pending appointment requests appear in a sidebar, ready to be dragged onto the schedule.
</p>
</div>
</section>
@@ -85,7 +101,9 @@ const HelpScheduler: React.FC = () => {
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Day View</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
See all appointments for a single day in a detailed timeline format. Best for managing busy days with many appointments.
See a single day in detail with a horizontal timeline. Each resource gets its own row.
The timeline scrolls horizontally and auto-centers on the current time when you open it.
Perfect for managing a busy day with many appointments across multiple staff or rooms.
</p>
</div>
</div>
@@ -94,7 +112,9 @@ const HelpScheduler: React.FC = () => {
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Week View</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
View an entire week at once, ideal for planning and understanding weekly patterns. See appointments across all days.
View all 7 days side-by-side with each day separated on the timeline.
Drag appointments between days or across resources. Great for weekly planning
and seeing patterns in your schedule.
</p>
</div>
</div>
@@ -102,8 +122,72 @@ const HelpScheduler: React.FC = () => {
<CalendarDays size={20} className="text-purple-500 mt-0.5" />
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Month View</h4>
<p className="text-sm text-gray-500 dark:text-gray-400 mb-2">
Traditional calendar grid showing the entire month. Each day cell shows a summary of
appointments for that day, color-coded by status.
</p>
<ul className="text-sm text-gray-500 dark:text-gray-400 space-y-1 ml-4">
<li><strong>Click a day</strong> to jump directly to that day's detailed Day View</li>
<li><strong>Drag an appointment</strong> over a day and hover for 1 second - a mini Day View scheduler overlay opens where you can drop it at the exact time and resource you want</li>
<li>The overlay shows hour slots and resource columns, just like Day View, for precise placement</li>
</ul>
</div>
</div>
</div>
</div>
</section>
{/* Drag and Drop Section */}
<section className="mb-10">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<Move size={20} className="text-brand-500" />
Drag and Drop
</h2>
<div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-6">
<p className="text-gray-600 dark:text-gray-300 mb-4">
Drag-and-drop is the fastest way to manage your schedule. Simply click and drag any
appointment to reschedule it.
</p>
<div className="space-y-4">
<div className="flex items-start gap-3 p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg border border-blue-200 dark:border-blue-800">
<GripVertical size={20} className="text-blue-500 mt-0.5" />
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Reschedule Appointments</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Get a high-level overview of the entire month. Great for identifying busy periods and planning ahead.
Drag an appointment left or right to change its time, or up/down to move it to a
different resource. The appointment snaps to 15-minute increments. A ghost preview
shows where it will land.
</p>
</div>
</div>
<div className="flex items-start gap-3 p-4 bg-green-50 dark:bg-green-900/20 rounded-lg border border-green-200 dark:border-green-800">
<Inbox size={20} className="text-green-500 mt-0.5" />
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Schedule Pending Requests</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Pending appointments (from online booking or manual entry) appear in the sidebar on
the right. Drag them onto the timeline to schedule them - they'll automatically be
confirmed. The pending sidebar shows customer name, service, and requested duration.
</p>
</div>
</div>
<div className="flex items-start gap-3 p-4 bg-yellow-50 dark:bg-yellow-900/20 rounded-lg border border-yellow-200 dark:border-yellow-800">
<Undo size={20} className="text-yellow-600 mt-0.5" />
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Return to Pending</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Drag a scheduled appointment back to the pending sidebar to unschedule it.
The appointment returns to pending status and can be rescheduled later.
</p>
</div>
</div>
<div className="flex items-start gap-3 p-4 bg-red-50 dark:bg-red-900/20 rounded-lg border border-red-200 dark:border-red-800">
<Archive size={20} className="text-red-500 mt-0.5" />
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Archive (Delete)</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Drag an appointment to the archive zone at the bottom of the pending sidebar to
delete it permanently. This is useful for removing cancelled or test appointments.
</p>
</div>
</div>
@@ -111,47 +195,356 @@ const HelpScheduler: React.FC = () => {
</div>
</section>
{/* Key Features Section */}
{/* Resizing Appointments Section */}
<section className="mb-10">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<Clock size={20} className="text-brand-500" />
Key Features
<MousePointer size={20} className="text-brand-500" />
Resizing Appointments
</h2>
<div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-6">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<p className="text-gray-600 dark:text-gray-300 mb-4">
Change an appointment's duration by dragging its edges. This is helpful when a service
takes more or less time than expected.
</p>
<div className="space-y-4">
<div className="flex items-start gap-3 p-4 bg-gray-50 dark:bg-gray-700/50 rounded-lg">
<Plus size={20} className="text-green-500 mt-0.5" />
<ChevronRight size={20} className="text-brand-500 mt-0.5" />
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Create Appointments</h4>
<h4 className="font-medium text-gray-900 dark:text-white">Extend Duration</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Click on any time slot to create a new appointment. Select customer, service, and resource.
Hover over the right edge of an appointment until you see the resize cursor,
then drag right to make it longer. Duration snaps to 15-minute increments.
Minimum duration is 15 minutes.
</p>
</div>
</div>
<div className="flex items-start gap-3 p-4 bg-gray-50 dark:bg-gray-700/50 rounded-lg">
<Edit size={20} className="text-blue-500 mt-0.5" />
<ChevronRight size={20} className="text-brand-500 mt-0.5 rotate-180" />
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Edit Appointments</h4>
<h4 className="font-medium text-gray-900 dark:text-white">Change Start Time</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Click on any existing appointment to modify its details, reschedule, or add notes.
Drag the left edge to change when the appointment starts. Dragging left makes
it start earlier (and longer), dragging right makes it start later (and shorter).
</p>
</div>
</div>
</div>
</div>
</section>
{/* Status Colors Section */}
<section className="mb-10">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<Eye size={20} className="text-brand-500" />
Status Colors
</h2>
<div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-6">
<p className="text-gray-600 dark:text-gray-300 mb-4">
Appointments are color-coded so you can see their status at a glance:
</p>
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
<div className="flex items-center gap-3 p-3 bg-blue-100 dark:bg-blue-900/50 border-l-4 border-blue-500 rounded">
<span className="font-medium text-blue-900 dark:text-blue-200">Blue - Upcoming</span>
<span className="text-sm text-blue-700 dark:text-blue-300">Confirmed, hasn't started yet</span>
</div>
<div className="flex items-center gap-3 p-3 bg-yellow-100 dark:bg-yellow-900/50 border-l-4 border-yellow-500 rounded">
<span className="font-medium text-yellow-900 dark:text-yellow-200">Yellow - In Progress</span>
<span className="text-sm text-yellow-700 dark:text-yellow-300">Currently happening</span>
</div>
<div className="flex items-center gap-3 p-3 bg-red-100 dark:bg-red-900/50 border-l-4 border-red-500 rounded">
<span className="font-medium text-red-900 dark:text-red-200">Red - Overdue</span>
<span className="text-sm text-red-700 dark:text-red-300">Past end time, not completed</span>
</div>
<div className="flex items-center gap-3 p-3 bg-green-100 dark:bg-green-900/50 border-l-4 border-green-500 rounded">
<span className="font-medium text-green-900 dark:text-green-200">Green - Completed</span>
<span className="text-sm text-green-700 dark:text-green-300">Successfully finished</span>
</div>
<div className="flex items-center gap-3 p-3 bg-gray-100 dark:bg-gray-700 border-l-4 border-gray-400 rounded">
<span className="font-medium text-gray-700 dark:text-gray-300">Gray - No-show</span>
<span className="text-sm text-gray-600 dark:text-gray-400">Customer didn't arrive</span>
</div>
<div className="flex items-center gap-3 p-3 bg-gray-100 dark:bg-gray-700 border-l-4 border-gray-400 rounded opacity-75">
<span className="font-medium text-gray-500 dark:text-gray-400">Gray (faded) - Cancelled</span>
<span className="text-sm text-gray-500 dark:text-gray-500">Appointment was cancelled</span>
</div>
</div>
</div>
</section>
{/* Filtering Section */}
<section className="mb-10">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<Filter size={20} className="text-brand-500" />
Filtering Appointments
</h2>
<div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-6">
<p className="text-gray-600 dark:text-gray-300 mb-4">
Use the filter button in the toolbar to narrow down what you see:
</p>
<div className="space-y-4">
<div className="flex items-start gap-3 p-4 bg-gray-50 dark:bg-gray-700/50 rounded-lg">
<AlertCircle size={20} className="text-orange-500 mt-0.5" />
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Filter by Status</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Show or hide appointments by status (Pending, Confirmed, Completed, Cancelled, No-show).
Useful for focusing on confirmed appointments only or finding no-shows.
</p>
</div>
</div>
<div className="flex items-start gap-3 p-4 bg-gray-50 dark:bg-gray-700/50 rounded-lg">
<Filter size={20} className="text-purple-500 mt-0.5" />
<Users size={20} className="text-blue-500 mt-0.5" />
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Filter by Resource</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Filter the calendar to show only specific staff members, rooms, or equipment.
Show only specific staff members, rooms, or equipment. Great for viewing one
person's schedule or a specific treatment room.
</p>
</div>
</div>
<div className="flex items-start gap-3 p-4 bg-gray-50 dark:bg-gray-700/50 rounded-lg">
<Eye size={20} className="text-orange-500 mt-0.5" />
<Clock size={20} className="text-purple-500 mt-0.5" />
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Status Colors</h4>
<h4 className="font-medium text-gray-900 dark:text-white">Filter by Service</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Appointments are color-coded by status: scheduled, confirmed, completed, cancelled, no-show.
Show only appointments for specific services. Helpful for tracking how often
certain services are booked or finding all massage appointments.
</p>
</div>
</div>
</div>
<p className="text-sm text-gray-500 dark:text-gray-400 mt-4">
A badge appears on the filter button when filters are active. Click "Clear All" to reset.
</p>
</div>
</section>
{/* Keyboard Shortcuts Section */}
<section className="mb-10">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<Keyboard size={20} className="text-brand-500" />
Keyboard Shortcuts
</h2>
<div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-6">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="flex items-center gap-4 p-3 bg-gray-50 dark:bg-gray-700/50 rounded-lg">
<div className="flex gap-1">
<kbd className="px-2 py-1 bg-gray-200 dark:bg-gray-600 rounded text-xs font-mono">Ctrl</kbd>
<span>+</span>
<kbd className="px-2 py-1 bg-gray-200 dark:bg-gray-600 rounded text-xs font-mono">Z</kbd>
</div>
<div>
<span className="font-medium text-gray-900 dark:text-white">Undo</span>
<p className="text-xs text-gray-500 dark:text-gray-400">Undo the last move or resize</p>
</div>
</div>
<div className="flex items-center gap-4 p-3 bg-gray-50 dark:bg-gray-700/50 rounded-lg">
<div className="flex gap-1">
<kbd className="px-2 py-1 bg-gray-200 dark:bg-gray-600 rounded text-xs font-mono">Ctrl</kbd>
<span>+</span>
<kbd className="px-2 py-1 bg-gray-200 dark:bg-gray-600 rounded text-xs font-mono">Y</kbd>
</div>
<div>
<span className="font-medium text-gray-900 dark:text-white">Redo</span>
<p className="text-xs text-gray-500 dark:text-gray-400">Redo the last undone action</p>
</div>
</div>
<div className="flex items-center gap-4 p-3 bg-gray-50 dark:bg-gray-700/50 rounded-lg">
<div className="flex gap-1">
<kbd className="px-2 py-1 bg-gray-200 dark:bg-gray-600 rounded text-xs font-mono">Ctrl</kbd>
<span>+</span>
<kbd className="px-2 py-1 bg-gray-200 dark:bg-gray-600 rounded text-xs font-mono">Shift</kbd>
<span>+</span>
<kbd className="px-2 py-1 bg-gray-200 dark:bg-gray-600 rounded text-xs font-mono">Z</kbd>
</div>
<div>
<span className="font-medium text-gray-900 dark:text-white">Redo (Alt)</span>
<p className="text-xs text-gray-500 dark:text-gray-400">Alternative redo shortcut</p>
</div>
</div>
</div>
<p className="text-sm text-gray-500 dark:text-gray-400 mt-4">
The scheduler keeps a history of up to 50 actions, so you can undo multiple changes.
</p>
</div>
</section>
{/* Zoom Controls Section */}
<section className="mb-10">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<ZoomIn size={20} className="text-brand-500" />
Zoom Controls
</h2>
<div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-6">
<p className="text-gray-600 dark:text-gray-300 mb-4">
Adjust the zoom level to see more or less detail in the timeline (Day and Week views only):
</p>
<div className="flex items-center gap-4 p-4 bg-gray-50 dark:bg-gray-700/50 rounded-lg">
<div className="flex items-center gap-2">
<ZoomOut size={20} className="text-gray-500" />
<span className="text-sm text-gray-600 dark:text-gray-400">Zoom out to see more hours at once</span>
</div>
<div className="flex items-center gap-2">
<ZoomIn size={20} className="text-gray-500" />
<span className="text-sm text-gray-600 dark:text-gray-400">Zoom in for precise time placement</span>
</div>
</div>
<p className="text-sm text-gray-500 dark:text-gray-400 mt-4">
Use the zoom slider in the toolbar to adjust. The timeline width scales proportionally.
</p>
</div>
</section>
{/* Overlapping Appointments Section */}
<section className="mb-10">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<Layers size={20} className="text-brand-500" />
Overlapping Appointments
</h2>
<div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-6">
<p className="text-gray-600 dark:text-gray-300 mb-4">
When appointments overlap in time for the same resource, the scheduler automatically
stacks them in multiple "lanes" so you can see all of them:
</p>
<ul className="space-y-2">
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-600 dark:text-gray-300">
Each resource row expands vertically to accommodate overlapping appointments
</span>
</li>
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-600 dark:text-gray-300">
Overlapping appointments are shown stacked, with each in its own horizontal lane
</span>
</li>
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-600 dark:text-gray-300">
This helps identify double-bookings or intentional concurrent appointments
</span>
</li>
</ul>
</div>
</section>
{/* Pending Sidebar Section */}
<section className="mb-10">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<Inbox size={20} className="text-brand-500" />
Pending Appointments Sidebar
</h2>
<div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-6">
<p className="text-gray-600 dark:text-gray-300 mb-4">
The sidebar on the right shows all pending (unscheduled) appointment requests:
</p>
<ul className="space-y-2">
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-600 dark:text-gray-300">
<strong>Online Bookings:</strong> When customers book online, their requests appear here until you assign them to a resource
</span>
</li>
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-600 dark:text-gray-300">
<strong>Drag to Schedule:</strong> Drag any pending appointment onto the timeline to schedule it with a specific resource
</span>
</li>
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-600 dark:text-gray-300">
<strong>Auto-Confirm:</strong> Pending appointments automatically change to "Confirmed" when scheduled
</span>
</li>
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-600 dark:text-gray-300">
<strong>Archive Zone:</strong> Drag to the archive section at the bottom to delete unwanted requests
</span>
</li>
</ul>
</div>
</section>
{/* Real-time Updates Section */}
<section className="mb-10">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<AlertCircle size={20} className="text-brand-500" />
Real-time Updates
</h2>
<div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-6">
<p className="text-gray-600 dark:text-gray-300 mb-4">
The scheduler uses WebSocket connections to update in real-time:
</p>
<ul className="space-y-2">
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-600 dark:text-gray-300">
When a customer books online, the appointment appears instantly
</span>
</li>
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-600 dark:text-gray-300">
When another staff member makes changes, you see them without refreshing
</span>
</li>
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-600 dark:text-gray-300">
No need to manually refresh the page - the schedule stays current
</span>
</li>
</ul>
</div>
</section>
{/* Editing Appointments Section */}
<section className="mb-10">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<Edit size={20} className="text-brand-500" />
Editing Appointment Details
</h2>
<div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-6">
<p className="text-gray-600 dark:text-gray-300 mb-4">
Click on any appointment to open its detail modal where you can:
</p>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="flex items-start gap-3 p-4 bg-gray-50 dark:bg-gray-700/50 rounded-lg">
<Clock size={20} className="text-blue-500 mt-0.5" />
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Change Date & Time</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Use the date/time picker for precise scheduling
</p>
</div>
</div>
<div className="flex items-start gap-3 p-4 bg-gray-50 dark:bg-gray-700/50 rounded-lg">
<Users size={20} className="text-green-500 mt-0.5" />
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Reassign Resource</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Move the appointment to a different staff member or room
</p>
</div>
</div>
<div className="flex items-start gap-3 p-4 bg-gray-50 dark:bg-gray-700/50 rounded-lg">
<Clock size={20} className="text-purple-500 mt-0.5" />
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Adjust Duration</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Change how long the appointment lasts
</p>
</div>
</div>
<div className="flex items-start gap-3 p-4 bg-gray-50 dark:bg-gray-700/50 rounded-lg">
<CheckCircle size={20} className="text-orange-500 mt-0.5" />
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Update Status</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Mark as completed, no-show, or cancelled
</p>
</div>
</div>
@@ -159,93 +552,42 @@ const HelpScheduler: React.FC = () => {
</div>
</section>
{/* How to Use Section */}
{/* Tips Section */}
<section className="mb-10">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<CheckCircle size={20} className="text-brand-500" />
How to Use
</h2>
<div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-6">
<ol className="space-y-4">
<li className="flex items-start gap-3">
<span className="flex-shrink-0 w-6 h-6 rounded-full bg-brand-600 text-white text-sm flex items-center justify-center">1</span>
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Navigate to Scheduler</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Click "Scheduler" in the sidebar to open the calendar view.
</p>
</div>
</li>
<li className="flex items-start gap-3">
<span className="flex-shrink-0 w-6 h-6 rounded-full bg-brand-600 text-white text-sm flex items-center justify-center">2</span>
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Choose Your View</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Select day, week, or month view using the view toggle buttons.
</p>
</div>
</li>
<li className="flex items-start gap-3">
<span className="flex-shrink-0 w-6 h-6 rounded-full bg-brand-600 text-white text-sm flex items-center justify-center">3</span>
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Create an Appointment</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Click the "+" button or click on an empty time slot to open the appointment form.
</p>
</div>
</li>
<li className="flex items-start gap-3">
<span className="flex-shrink-0 w-6 h-6 rounded-full bg-brand-600 text-white text-sm flex items-center justify-center">4</span>
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Fill in Details</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Select a customer, choose a service, pick an available resource, and set the time.
</p>
</div>
</li>
<li className="flex items-start gap-3">
<span className="flex-shrink-0 w-6 h-6 rounded-full bg-brand-600 text-white text-sm flex items-center justify-center">5</span>
<div>
<h4 className="font-medium text-gray-900 dark:text-white">Save & Confirm</h4>
<p className="text-sm text-gray-500 dark:text-gray-400">
Click "Save" to create the appointment. Customers can receive automatic notifications.
</p>
</div>
</li>
</ol>
</div>
</section>
{/* Benefits Section */}
<section className="mb-10">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white mb-4 flex items-center gap-2">
<CheckCircle size={20} className="text-brand-500" />
Benefits
<HelpCircle size={20} className="text-brand-500" />
Pro Tips
</h2>
<div className="bg-gradient-to-r from-brand-50 to-blue-50 dark:from-brand-900/20 dark:to-blue-900/20 rounded-xl border border-brand-200 dark:border-brand-800 p-6">
<ul className="space-y-3">
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-700 dark:text-gray-300">
<strong>Visual Scheduling:</strong> See your entire schedule at a glance with intuitive calendar layouts
<strong>Drag from where you grab:</strong> When dragging, the appointment time adjusts based on where you clicked on it, making repositioning intuitive
</span>
</li>
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-700 dark:text-gray-300">
<strong>Conflict Prevention:</strong> System prevents double-booking of resources and staff
<strong>Use filters to focus:</strong> When the schedule is busy, filter to show only what you need
</span>
</li>
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-700 dark:text-gray-300">
<strong>Quick Actions:</strong> Create, edit, and cancel appointments with just a few clicks
<strong>Ctrl+Z is your friend:</strong> Made a mistake? Undo it instantly without finding and fixing manually
</span>
</li>
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-700 dark:text-gray-300">
<strong>Multi-Resource:</strong> Manage staff, rooms, and equipment schedules in one place
<strong>Month view drag overlay:</strong> While dragging in month view, hover over any day for 1 second to open a mini Day View scheduler - drop the appointment at the exact time and resource
</span>
</li>
<li className="flex items-start gap-2">
<ChevronRight size={16} className="text-brand-500 mt-1 flex-shrink-0" />
<span className="text-gray-700 dark:text-gray-300">
<strong>Check red appointments:</strong> Red means overdue - these need to be completed or rescheduled
</span>
</li>
</ul>
@@ -274,6 +616,14 @@ const HelpScheduler: React.FC = () => {
<span className="text-gray-900 dark:text-white">Services Guide</span>
<ChevronRight size={16} className="text-gray-400 ml-auto" />
</Link>
<Link
to="/help/customers"
className="flex items-center gap-3 p-4 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 hover:border-brand-500 transition-colors"
>
<Users size={20} className="text-brand-500" />
<span className="text-gray-900 dark:text-white">Customers Guide</span>
<ChevronRight size={16} className="text-gray-400 ml-auto" />
</Link>
</div>
</section>