ghanem/multiple-date-picker
Composer 安装命令:
composer require ghanem/multiple-date-picker
包简介
A Laravel Nova field for selecting multiple dates with a beautiful date picker interface.
README 文档
README
A Laravel Nova field for selecting multiple dates with a beautiful date picker interface.
Requirements
php: ^8.1laravel/nova: ^4.0|^5.0
Features
- Select multiple dates in a single field
- Lightweight (~185KB) using v-calendar
- Configurable display and storage date formats
- Min/max date constraints
- Disable specific dates
- Min/max selection limits
- Automatic date sorting
- Custom placeholder text
- Index view truncation with "+N more" badge
- Full dark mode support
- Readonly/disabled state support
- Duplicate date prevention
- Graceful handling of invalid dates
- Locale / i18n support
- Dependent fields (dynamic min/max from other fields)
- Export-friendly format (comma, pipe, semicolon, newline)
- Date range mode (pick start & end, auto-fill between)
- Recurrence patterns (daily, weekly, biweekly, monthly, weekdays, weekends)
- Calendar heatmap view on detail page
- Date presets for quick selection
- Bulk actions (add/remove dates across resources)
- Before-save and after-resolve callback hooks
- JavaScript date-selected callback
Installation
composer require ghanem/multiple-date-picker
Usage
Basic Usage
use Ghanem\MultipleDatePicker\MultipleDatePicker; MultipleDatePicker::make('Event Dates', 'event_dates'),
Configuration Options
// Custom display date format (default: d/m/Y) MultipleDatePicker::make('Dates', 'dates') ->dateFormat('Y-m-d'), // Supported format tokens: d, j, D, l, m, n, M, F, Y, y // Custom storage format (default: Y-m-d) MultipleDatePicker::make('Dates', 'dates') ->storageFormat('d/m/Y'), // Min and max date constraints MultipleDatePicker::make('Dates', 'dates') ->minDate('2026-01-01') ->maxDate('2026-12-31'), // Disable specific dates MultipleDatePicker::make('Dates', 'dates') ->disabledDates(['2026-03-05', '2026-03-10']), // Limit number of selectable dates MultipleDatePicker::make('Dates', 'dates') ->minSelections(1) ->maxSelections(10), // Sort dates automatically MultipleDatePicker::make('Dates', 'dates') ->sorted(), // Custom placeholder (Nova built-in) MultipleDatePicker::make('Dates', 'dates') ->placeholder('Select your dates...'), // Truncate dates on index view (show "+N more" badge) MultipleDatePicker::make('Dates', 'dates') ->maxDisplayOnIndex(3),
Locale / i18n
// Set locale for date picker display MultipleDatePicker::make('Dates', 'dates') ->locale('ar'),
Dependent Fields
Dynamically set min/max dates based on other fields on the same form:
Date::make('Start Date', 'start_date'), MultipleDatePicker::make('Event Dates', 'event_dates') ->minDateFrom('start_date'), Date::make('End Date', 'end_date'), MultipleDatePicker::make('Available Dates', 'available_dates') ->minDateFrom('start_date') ->maxDateFrom('end_date'),
Export Format
Control how dates appear in Nova CSV exports:
// Comma-separated: "01/03/2026, 15/03/2026" MultipleDatePicker::make('Dates', 'dates') ->exportFormat('comma'), // Pipe-separated: "01/03/2026 | 15/03/2026" MultipleDatePicker::make('Dates', 'dates') ->exportFormat('pipe'), // Semicolon: "01/03/2026; 15/03/2026" MultipleDatePicker::make('Dates', 'dates') ->exportFormat('semicolon'), // Newline-separated MultipleDatePicker::make('Dates', 'dates') ->exportFormat('newline'),
Date Range Mode
Pick a start and end date, automatically store all dates in between:
MultipleDatePicker::make('Booking Dates', 'booking_dates') ->rangeMode(),
Recurrence Patterns
Generate dates based on recurring patterns:
// Allow all patterns MultipleDatePicker::make('Schedule', 'schedule_dates') ->allowRecurrence(), // Allow only specific patterns MultipleDatePicker::make('Schedule', 'schedule_dates') ->allowRecurrence(['weekly', 'monthly']), // Available patterns: daily, weekly, biweekly, monthly, weekdays, weekends
Calendar Heatmap View
Display a mini calendar on the detail page instead of badges:
MultipleDatePicker::make('Dates', 'dates') ->calendarView(),
Date Presets
Predefined date selections for quick selection:
MultipleDatePicker::make('Dates', 'dates') ->presets([ ['label' => 'Next 7 Days', 'dates' => fn () => collect(range(0, 6)) ->map(fn ($i) => now()->addDays($i)->format('Y-m-d')) ->toArray()], ['label' => 'This Month Weekdays', 'dates' => fn () => collect(range(1, now()->daysInMonth)) ->map(fn ($d) => now()->startOfMonth()->addDays($d - 1)) ->filter(fn ($d) => $d->isWeekday()) ->map(fn ($d) => $d->format('Y-m-d')) ->toArray()], ['label' => 'Specific Dates', 'dates' => ['2026-03-01', '2026-06-15', '2026-12-25']], ]),
Callback Hooks
Transform dates before saving or after resolving:
// Filter out weekends before saving MultipleDatePicker::make('Working Days', 'working_days') ->beforeSave(function (array $dates) { return collect($dates) ->filter(fn ($d) => Carbon::parse($d)->isWeekday()) ->values() ->toArray(); }), // Reverse date order when displaying MultipleDatePicker::make('Dates', 'dates') ->afterResolve(fn (array $dates) => array_reverse($dates)), // JavaScript callback when a date is selected MultipleDatePicker::make('Dates', 'dates') ->onDateSelected('handleDateChange'),
Bulk Actions
Add or remove dates across multiple resources:
// In your Nova Resource actions() method: use Ghanem\MultipleDatePicker\Actions\BulkAddDates; use Ghanem\MultipleDatePicker\Actions\BulkRemoveDates; public function actions(NovaRequest $request) { return [ new BulkAddDates('dates'), // attribute name new BulkRemoveDates('dates'), ]; }
Full Example
MultipleDatePicker::make('Event Dates', 'event_dates') ->dateFormat('d/m/Y') ->minDate('2026-01-01') ->maxDate('2026-12-31') ->disabledDates(['2026-12-25']) ->minSelections(1) ->maxSelections(20) ->sorted() ->locale('en') ->maxDisplayOnIndex(5) ->calendarView() ->exportFormat('comma') ->beforeSave(fn ($dates) => array_unique($dates)) ->placeholder('Pick event dates'),
Database Migration
The field stores dates as a JSON array:
$table->json('dates')->nullable();
Cast it in your model:
protected $casts = [ 'dates' => 'array', ];
Testing
composer test
License
Nova Multiple DatePicker is open-sourced software licensed under the MIT license.
Sponsor
ghanem/multiple-date-picker 适用场景与选型建议
ghanem/multiple-date-picker 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 7.25k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2022 年 10 月 02 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「nova」 「laravel」 「field」 「date-picker」 「multiple-dates」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 ghanem/multiple-date-picker 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 ghanem/multiple-date-picker 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 ghanem/multiple-date-picker 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A Laravel Nova card that shows you your system information.
A Laravel Nova card.
ConfirmationField is a form field for Atk14 applications. It's like the BooleanField (checkbox) but the ConfirmationField must be ticked.
Field for number with restricted count of digits and decimal places
A simple state dropdown field for SilverStripe forms
A Laravel Nova package for publishable fields
统计信息
- 总下载量: 7.25k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 2
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2022-10-02