manuxi / sulu-appointment-bundle
Sulu Appointment Bundle
Package info
github.com/manuxi/SuluAppointmentBundle
Type:sulu-bundle
pkg:composer/manuxi/sulu-appointment-bundle
Requires
- php: ^8.2
- manuxi/sulu-admin-extras-bundle: ^1.7.0
- sulu/sulu: ^3.0
Requires (Dev)
- phpunit/phpunit: ^10.5 || ^11.0
README
A Sulu CMS bundle for appointment management with an integrated calendar view (FullCalendar) instead of the traditional list view.
English | 🇩🇪 Deutsch
Features
- 📅 Calendar Overview with month, week and day views (FullCalendar TimeGrid & DayGrid)
- 🕒 Split Business Hours: Configurable morning/afternoon slots per weekday
- 📋 Day View with appointment list on day click
- 🔒 Collision Detection for resources (doctor/room/device)
- 🌍 Multilingual (Sulu DimensionContent)
- ✅ Appointment Status: scheduled, confirmed, arrived, cancelled, completed
- 🎨 Configurable Status Colors per status
- 📝 Status Audit Log: Every status change is tracked with timestamp and user
- 🏥 Flexible Resources: Doctor, room, device with JSON metadata
- 💡 View Persistence: Calendar remembers last view and date (localStorage)
- 🖱️ Rich Tooltips: Detailed appointment info on hover
- 🗂️ Sub-Appointments: Break appointments into multiple time slots with individual resources, statuses, and drag-and-drop reordering via a side drawer UI
- ⏱️ Appointment Search (Availability Wizard): Smart time suggestions respecting business hours, preventing collisions, and automatically detecting the next available slot
- ✨ Bulk Actions: Update multiple appointments in the list view simultaneously (e.g., mark as "Arrived")
Installation
Requirement: Sulu CMS 3.0+
1. Add Bundle as Local Path
In your project composer.json:
{
"repositories": [
{
"type": "path",
"url": "../SuluAppointmentBundle"
}
],
"require": {
"manuxi/sulu-appointment-bundle": "*"
}
}
Then:
composer update manuxi/sulu-appointment-bundle
2. Register Bundle
In config/bundles.php:
return [ // ... Manuxi\SuluAppointmentBundle\SuluAppointmentBundle::class => ['all' => true], ];
3. Import Routes
Create config/routes/sulu_appointment.yaml:
sulu_appointment: resource: "@SuluAppointmentBundle/Resources/config/routes.yaml"
4. Create Database Schema
php bin/console doctrine:schema:update --force
Or with migrations:
php bin/console doctrine:migrations:diff php bin/console doctrine:migrations:migrate
5. Admin Assets
Add the bundle to assets/admin/package.json:
{
"dependencies": {
"sulu-appointment-bundle": "../../vendor/manuxi/sulu-appointment-bundle/src/Resources"
}
}
Important: Add the import to assets/admin/app.js:
import 'sulu-appointment-bundle';
Install FullCalendar dependencies and build:
cd assets/admin
npm install @fullcalendar/react @fullcalendar/core @fullcalendar/daygrid @fullcalendar/interaction @fullcalendar/timegrid @fullcalendar/multimonth
npm install
npm run build
6. Clear Cache
php bin/console cache:clear
Security Context
For permissions in the admin area:
sulu.appointments.appointments
Assign permissions under Settings → Roles.
Database Tables
The bundle creates the following tables:
| Table | Description |
|---|---|
app_appointments |
Main entity (UUID) |
app_appointment_dimension_contents |
Multilingual content (title, start/end, status) |
app_appointment_resources |
Resources (doctor, room, device with color + locale-independent fields) |
app_appointment_resource_dimension_contents |
Multilingual resource content (title, description, image) |
app_appointment_settings |
Calendar and display settings |
app_appointment_status_log |
Status change audit trail |
app_sub_appointments |
Sub-appointments with resource assignment and status |
Usage
After installation, a new "Appointments" entry (calendar icon) appears in the admin menu.
- Month View: Overview of all appointments with configurable display (dots, blocks, borders)
- Week View: Detailed view with time slots and business hours
- Day Click: Opens day view with list of all appointments
- Create Appointment: Via "+" button in the toolbar
Appointment Status Flow
scheduled → confirmed → arrived → completed
↘ cancelled
Each status change is automatically logged with timestamp and user for full traceability.
Configuration
Calendar Settings
Access via Admin → Appointments → Settings
See Settings Documentation for detailed configuration options.
Resources
Resources represent entities that appointments are assigned to (doctors, rooms, devices). Each resource uses Sulu DimensionContent for multilingual title, description, and image, plus locale-independent fields like type, color, and capacity.
See Resources Documentation for details.
Sub-Appointments
Appointments can be broken down into individual time slots (sub-appointments), each assigned to a specific resource with its own status and time range. A side drawer provides a visual management interface with drag-and-drop reordering and progress tracking.
See Sub-Appointments Documentation for details.
Troubleshooting
Calendar Not Showing
- Check that FullCalendar dependencies are installed
- Check browser console for JS errors
- Verify the import exists in
assets/admin/app.js - Rebuild:
npm run buildinassets/adminfolder
API Error 404
Check that routes are loaded correctly:
php bin/console debug:router | grep appointment
No Appointments Visible
Appointments must be in LIVE stage. The calendar only shows published appointments.
