PHPackages                             przwl/cine-reserve - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. przwl/cine-reserve

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

przwl/cine-reserve
==================

A seamless, user-friendly Filament plugin for adding interactive movie seat selection and booking functionality to any Laravel application.

v1.1.0(5mo ago)17361MITBlade

Since Dec 21Pushed 2mo agoCompare

[ Source](https://github.com/prazwal-bns/CineReserve)[ Packagist](https://packagist.org/packages/przwl/cine-reserve)[ Docs](https://github.com/prazwal-bns/CineReserve)[ RSS](/packages/przwl-cine-reserve/feed)WikiDiscussions main Synced today

READMEChangelog (5)Dependencies (2)Versions (7)Used By (0)

CineReserve - Filament Movie Seat Selection Plugin
==================================================

[](#cinereserve---filament-movie-seat-selection-plugin)

A seamless, user-friendly plugin for adding interactive movie seat selection and booking functionality to any Laravel application.

🎬 Features
----------

[](#-features)

- **Interactive Seat Selection**: Beautiful, Customizable animated seat selection interface
- **Movie Information Display**: Showcase movie details.
- **Customizable Colors**: Choose seat colors for booked, available and selected seats.
- **Dynamic Layout**: Configure rows and seats per row via config
- **Maximum Selection Limit**: Set limits on seat selection per session
- **Pricing Display**: Built-in pricing UI with price per seat and total calculation
- **Dark Mode Support**: Fully supports Filament's dark mode
- **Extensible**: Easy to extend and customize

### Screenshots

[](#screenshots)

#### Light Mode

[](#light-mode)

[![CineReserve Light Mode](Plugin-Images/full-area.png)](Plugin-Images/full-area.png)

#### Dark Mode

[](#dark-mode)

[![CineReserve Dark Mode](Plugin-Images/full-area(dark).png)](Plugin-Images/full-area(dark).png)

📦 Installation
--------------

[](#-installation)

### Install via Composer

[](#install-via-composer)

```
composer require przwl/cine-reserve
```

### Register Plugin

[](#register-plugin)

In `AdminPanelProvider.php`:

Register the plugin from `->plugins([])`

```
use Przwl\CineReserve\Filament\CineReserve;

public function panel(Panel $panel): Panel
{
    return $panel
        ->plugins([
            CineReserve::make(),
        ]);
}
```

### Publish Config

[](#publish-config)

```
php artisan vendor:publish --tag=cine-reserve-config
```

⚙️ Quick Configuration
----------------------

[](#️-quick-configuration)

Edit `config/cine-reserve.php`:

```
// Navigation
'register_navigation' => false,        // Show/hide navigation item

// Movie Information
'show_movie_information' => true,      // Show/hide movie information component
'movie_information_fields' => [
    'poster' => true,
    'title' => true,
    'genre' => true,
    'duration' => true,
    'rating' => true,
    'date' => true,
    'start_time' => true,
    'end_time' => true,
    'theater' => true,
],

// Screen & Layout
'show_screen' => true,                 // Show/hide screen indicator
'select_seats_title_position' => 'left', // 'left', 'center', or 'right'

// Seat layout
'rows' => ['A', 'B', 'C', 'D', 'E'],
'seats_per_row' => 8,

// Maximum seats per selection (null = unlimited)
'max_selection_limit' => null,

// Seat colors
'seat_colors' => [
    'available' => 'green',
    'selected' => 'red',
    'booked' => 'gray',
],

// Pricing configuration
'price_per_seat' => 10.00,            // Price per seat (all seats same price)
'show_price_per_seat' => true,         // Display price per seat in UI
'currency_symbol' => '$',              // Currency symbol for price display
```

🚀 Quick Start
-------------

[](#-quick-start)

### 1. Create Custom SelectSeats Page

[](#1-create-custom-selectseats-page)

```
php artisan make:filament-page CustomSelectSeats --type=custom
```

### 2. Extend SelectSeats Class

[](#2-extend-selectseats-class)

```
namespace App\Filament\Pages;

use Przwl\CineReserve\Filament\Pages\SelectSeats;
use App\Models\Movie;
use App\Models\Showtime;
use App\Models\Booking;
use Illuminate\Support\Facades\Storage;

class CustomSelectSeats extends SelectSeats
{
    public ?int $showtimeId = null;
    public $total = 0;

    public function mount(?int $showtimeId = null): void
    {
        parent::mount();

        if ($showtimeId) {
            $this->showtimeId = $showtimeId;
            $this->loadShowtimeData($showtimeId);
        }
    }

    protected function loadShowtimeData(int $showtimeId): void
    {
        $showtime = Showtime::with('movie')->findOrFail($showtimeId);
        $movie = $showtime->movie;

        // Set movie information
        $this->movieTitle = $movie->title;
        $this->moviePosterUrl = $movie->poster_url ? Storage::disk('public')->url($movie->poster_url) : null;
        $this->movieGenre = $movie->genre;
        $this->movieDuration = $movie->duration . ' min';
        $this->movieRating = $movie->rating;
        $this->movieDate = $showtime->date->format('F j, Y');
        $this->movieStartTime = \Carbon\Carbon::parse($showtime->start_time)->format('g:i A');
        $this->movieEndTime = \Carbon\Carbon::parse($showtime->end_time)->format('g:i A');
        $this->movieTheater = $showtime->theater_name;

        // Load booked seats
        $this->bookedSeats = Booking::where('showtime_id', $showtimeId)
            ->where('status', '!=', 'cancelled')
            ->get()
            ->pluck('seat_ids')
            ->flatten()
            ->unique()
            ->values()
            ->toArray();
    }

    public function proceed(): void
    {
        if (empty($this->selectedSeats)) {
            Notification::make()
                ->title('Please select at least one seat')
                ->warning()
                ->send();
            return;
        }

        $this->calculateTotal();
        parent::proceed();
    }

    protected function handleBooking(array $selectedSeatDetails): void
    {
        // Create booking
        $booking = Booking::create([
            'showtime_id' => $this->showtimeId,
            'user_id' => Auth::id(),
            'seat_ids' => $this->selectedSeats,
            'total_amount' => $this->total,
            'status' => 'pending',
        ]);

        $this->selectedSeats = [];
        $this->total = 0;

        Notification::make()
            ->title('Seats booked successfully')
            ->success()
            ->send();
    }
}
```

📸 Preview
---------

[](#-preview)

### Video Demonstration

[](#video-demonstration)

[![CineReserve Demo](Plugin-Images/cine-reserve.gif)](Plugin-Images/cine-reserve.gif)

📖 Complete Integration Guide
----------------------------

[](#-complete-integration-guide)

For detailed integration instructions, database migrations, models, and advanced customization, see the [Integration Guide](INTEGRATION_GUIDE.md).

💰 Pricing Feature
-----------------

[](#-pricing-feature)

CineReserve includes a built-in pricing display system that shows:

- **Total Price**: Automatically calculated based on selected seats
- **Price Per Seat**: Configurable via config
- **Selected Seat Details**: Displays all selected seat labels (e.g., A1, A2, B3)
- **Currency Formatting**: Customizable currency symbol

### Pricing Configuration

[](#pricing-configuration)

Configure pricing in `config/cine-reserve.php`:

```
'price_per_seat' => 10.00,        // Default price per seat
'show_price_per_seat' => true,     // Show/hide price per seat in UI
'currency_symbol' => '$',          // Currency symbol ($, €, ₹, £, etc.)
```

The pricing is automatically calculated based on the number of selected seats multiplied by the price per seat configured in the config file.

🎨 Customization
---------------

[](#-customization)

### Override Methods

[](#override-methods)

The `SelectSeats` class is designed to be easily extensible:

- `mount()` - Load data and initialize booked seats
- `toggleSeat()` - Add validation (e.g., prevent booking already booked seats)
- `proceed()` - Add validation before booking
- `handleBooking()` - Implement booking logic (save to database, notifications, etc.)

### Customize Views

[](#customize-views)

To customize the appearance and layout of the seat selection interface, you can publish the views:

```
php artisan vendor:publish --tag=cine-reserve-views
```

This will copy all view files to `resources/views/vendor/cine-reserve/` where you can modify them:

- `select-seats.blade.php` - Main seat selection page layout
- `components/movie-information.blade.php` - Movie information display component
- `pricing-display.blade.php` - Pricing information display
- `proceed-button.blade.php` - Proceed to booking button
- `screen.blade.php` - Screen indicator component

After publishing, edit these files in `resources/views/vendor/cine-reserve/` to match your design requirements. The package will automatically use your customized views instead of the default ones.

### Publish Translations

[](#publish-translations)

```
php artisan vendor:publish --tag=cine-reserve-translations
```

🎯 Events
--------

[](#-events)

### seatSelected

[](#seatselected)

Emitted when user clicks "Proceed to Booking":

```
[
    'selectedSeats' => [1, 2, 3],  // Array of seat IDs
    'seatDetails' => [              // Full seat information
        ['id' => 1, 'row' => 'A', 'number' => '1', 'label' => 'A1'],
    ],
    'count' => 3,                   // Number of selected seats
    'total' => 30.00                // Total price (calculated)
]
```

📝 Available Movie Properties
----------------------------

[](#-available-movie-properties)

Set these properties in your `SelectSeats` component:

- `$moviePosterUrl` - URL or path to movie poster
- `$movieTitle` - Movie title
- `$movieGenre` - Movie genre (string, array of strings, or array of enum objects)
- `$movieDuration` - Movie duration
- `$movieRating` - Movie rating
- `$movieDate` - Show date
- `$movieStartTime` - Show start time
- `$movieEndTime` - Show end time
- `$movieTheater` - Theater name
- `$moviePosterAlt` - Alt text for poster

### Sample Values

[](#sample-values)

When no movie information is provided, the component automatically displays sample/demo values so you can see how it looks:

- **Title**: "Sample Movie Title"
- **Genre**: "Action"
- **Duration**: "120 min"
- **Rating**: "PG-13"
- **Date**: Current date (formatted)
- **Start Time**: "7:00 PM"
- **End Time**: "9:30 PM"
- **Theater**: "Theater 1"

This helps you visualize the component structure before implementing your own data. Once you set the movie properties, the actual data will replace the sample values.

⚠️ Important: File Storage Configuration
----------------------------------------

[](#️-important-file-storage-configuration)

**Movie poster images must be stored on the `public` disk for proper display.**

### Configuring Filament FileUpload

[](#configuring-filament-fileupload)

When using Filament's `FileUpload` component for movie posters, ensure you configure it to use the `public` disk:

```
use Filament\Forms\Components\FileUpload;

FileUpload::make('poster_url')
    ->image()
    ->disk('public')           // Required: Use public disk
    ->visibility('public')      // Required: Set visibility to public
    ->required(),
```

**Why is this required?** The movie information component displays images directly in the browser. Files stored on private disks cannot be accessed via direct URLs and will not display correctly. Using the `public` disk ensures that poster images are accessible and display properly.

🎨 Color Options
---------------

[](#-color-options)

Available seat colors: `amber`, `gray`, `red`, `green`, `purple`, `yellow`

📄 License
---------

[](#-license)

MIT License - see [LICENSE](LICENSE) file for details

👤 Author
--------

[](#-author)

**prazwal-bns**

- Email:
- GitHub: [@prazwal-bns](https://github.com/prazwal-bns)

---

**Built with ❤️ By Prajwal**

###  Health Score

38

—

LowBetter than 83% of packages

Maintenance79

Regular maintenance activity

Popularity17

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity39

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~7 days

Total

5

Last Release

167d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/100463229?v=4)[Prajwal Banstola](/maintainers/prazwal-bns)[@prazwal-bns](https://github.com/prazwal-bns)

---

Top Contributors

[![prazwal-bns](https://avatars.githubusercontent.com/u/100463229?v=4)](https://github.com/prazwal-bns "prazwal-bns (100 commits)")

---

Tags

filamentlaravelpluginslaravellivewirefilamentbookingcinemaseat-selectionmovie-booking

### Embed Badge

![Health badge](/badges/przwl-cine-reserve/health.svg)

```
[![Health](https://phpackages.com/badges/przwl-cine-reserve/health.svg)](https://phpackages.com/packages/przwl-cine-reserve)
```

###  Alternatives

[ysfkaya/filament-phone-input

A phone input component for Laravel Filament

3161.3M25](/packages/ysfkaya-filament-phone-input)[laraveldaily/filacheck

Static analysis for Filament projects - detect deprecated patterns and code issues

11975.6k](/packages/laraveldaily-filacheck)[asosick/filament-layout-manager

Allow users to create &amp; customize their own FilamentPHP pages composed of Livewire components

5822.2k3](/packages/asosick-filament-layout-manager)[ercogx/laravel-filament-starter-kit

This is a Filament v5 Starter Kit for Laravel 13, designed to accelerate the development of Filament-powered applications.

461.7k](/packages/ercogx-laravel-filament-starter-kit)[wsmallnews/filament-nestedset

Filament nestedset tree builder powered by kalnoy/nestedset with Filament v4 and v5 support

197.8k19](/packages/wsmallnews-filament-nestedset)[qalainau/filament-inbox

Email-like inbox messaging plugin for Filament v5 — threads, starring, trash, forwarding, read receipts, and multi-tenancy out of the box.

171.5k](/packages/qalainau-filament-inbox)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
