manuxi/sulu-appointment-bundle

Sulu Appointment Bundle

Maintainers

Package info

github.com/manuxi/SuluAppointmentBundle

Type:sulu-bundle

pkg:composer/manuxi/sulu-appointment-bundle

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.2 2026-03-11 00:06 UTC

README

License: MIT Supports Sulu 3.0 or later

A Sulu CMS bundle for appointment management with an integrated calendar view (FullCalendar) instead of the traditional list view.

English | 🇩🇪 Deutsch

Overview

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

  1. Check that FullCalendar dependencies are installed
  2. Check browser console for JS errors
  3. Verify the import exists in assets/admin/app.js
  4. Rebuild: npm run build in assets/admin folder

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.

Documentation