@uplink-protocol/calendar-controller
Version:
Flexible calendar and time picker API supporting both calendar, date-picker, and time-picker integrations for any JavaScript framework or library
292 lines (225 loc) • 10.3 kB
Markdown
# Calendar & Time Controller
A flexible calendar and time picker API supporting both calendar and time selection integrations for any JavaScript framework or library.
> **Latest Release (v0.2.3)**: Added comprehensive Time Controller with full time picker functionality alongside the existing Calendar Controller.
## Features
### Calendar Controller
- Multiple view modes (day, month, and year views)
- Date selection (single date and date range)
- Year range navigation for efficient date picking
- **Disabled weekdays** - Disable specific days of the week across all calendar views
- Date constraints (min/max dates, disabled specific dates)
- Internationalization support with locale-specific date formats
- Flexible configuration options
- Service-oriented architecture
- Framework agnostic
### Time Controller ✨ **NEW**
- Time selection (single time and time range)
- 12/24 hour format support
- Precision control (hours, minutes, seconds, milliseconds)
- Time navigation with keyboard support
- Time constraints and validation
- Accessibility features with focus management
- Locale-aware time formatting
- Reactive state bindings
- Complete service-oriented architecture
## Usage
### Calendar Controller
```javascript
import { CalendarController } from '@uplink-protocol/calendar-controller';
// Create a new calendar controller
const calendar = CalendarController({
firstDayOfWeek: 1, // Monday
dateFormat: 'MM/DD/YYYY',
initialSelectedDate: new Date(),
disabledDaysOfWeek: [0, 6] // Disable weekends
});
// Use the calendar API for date selection
calendar.methods.selectDate(2025, 4, 15);
// Work with different view modes
const days = calendar.bindings.calendarDays.get(); // Day view
const months = calendar.bindings.calendarMonths.get(); // Month view
const years = calendar.bindings.calendarYears.get(); // Year view
// Navigate between view modes
calendar.methods.selectMonth(3, 2025); // Select April 2025 in month view
calendar.methods.selectYear(2026); // Select 2026 in year view
// Navigate year ranges
calendar.methods.nextYearRange(); // Move to next decade
calendar.methods.prevYearRange(); // Move to previous decade
// Manage disabled weekdays dynamically
calendar.methods.setDisabledDaysOfWeek([0, 6]); // Disable weekends
calendar.methods.addDisabledDayOfWeek(1); // Also disable Monday
calendar.methods.removeDisabledDayOfWeek(0); // Re-enable Sunday
```
### Time Controller ✨ **NEW**
```javascript
import { TimeController } from '@uplink-protocol/calendar-controller';
// Create a new time controller
const timeController = TimeController({
use12HourFormat: true,
showSeconds: true,
locale: 'en-US',
minuteStep: 15
});
// Select a time
timeController.selectTime(9, 30, 0); // 9:30:00 AM
// Get reactive bindings
const selectedTime = timeController.bindings.selectedTime.get();
const formattedTime = timeController.methods.getFormattedTime();
// Navigate time
timeController.goToNextHour();
timeController.goToPreviousMinute();
// Time range selection
timeController.setRangeSelectionMode(true);
timeController.selectTime(9, 0); // Start time
timeController.selectTime(17, 30); // End time
// Time constraints
timeController.setMinTime(new Date(2024, 0, 1, 9, 0)); // 9:00 AM
timeController.setMaxTime(new Date(2024, 0, 1, 17, 0)); // 5:00 PM
timeController.setDisabledHours([12, 13]); // Lunch break
const disabledDays = calendar.methods.getDisabledDaysOfWeek(); // Get current disabled days
```
### Disabled Weekdays
Disable specific days of the week across all calendar views:
```javascript
// Disable weekends for business applications
const businessCalendar = CalendarController({
disabledDaysOfWeek: [0, 6] // 0 = Sunday, 6 = Saturday
});
// Disable specific business days
const customSchedule = CalendarController({
disabledDaysOfWeek: [1, 3] // Monday and Wednesday
});
// Dynamic management
businessCalendar.methods.setDisabledDaysOfWeek([0, 5, 6]); // Weekends + Friday
businessCalendar.methods.addDisabledDayOfWeek(1); // Add Monday
businessCalendar.methods.removeDisabledDayOfWeek(5); // Remove Friday
```
[See full documentation →](docs/disabled-weekdays.md)
## UI Integration
The examples provided showcase integration with:
- **Tailwind CSS** - For responsive, utility-first styling
- **Font Awesome** - For beautiful, scalable icons
### Tailwind CSS Setup
```html
<!-- Include Tailwind CSS -->
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#007bff',
'primary-light': '#e6f2ff'
}
}
}
}
</script>
```
### Font Awesome Setup
```html
<!-- Include Font Awesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">
```
## Architecture
This controller uses a service-oriented architecture where all the core functionality is delegated to specialized services:
- CalendarService - Handles basic calendar operations like getting month names
- DateSelectionService - Manages date selection logic
- DateValidationService - Validates dates against constraints
- DateFormattingService - Handles date formatting operations
- ViewStateService - Manages UI state and bindings
- EventManagerService - Manages event emission
- NavigationService - Handles calendar navigation operations
- ConstraintsService - Manages date constraints
- CalendarGeneratorService - Generates calendar days
- ConfigurationService - Manages calendar configuration options
## Configuration Options
The following configuration options can be provided when creating a new calendar controller:
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `minDate` | Date | null | Minimum selectable date |
| `maxDate` | Date | null | Maximum selectable date |
| `disabledDates` | Date[] | [] | Array of specific dates to disable |
| `initialSelectedDate` | Date | null | Pre-selected date when calendar loads |
| `firstDayOfWeek` | number | 0 | First day of week (0 = Sunday, 1 = Monday, etc.) |
| `dateFormat` | string | null | Date format string (e.g., 'MM/DD/YYYY') |
| `hideOtherMonthDays` | boolean | false | When true, hides days from previous and next months in the current month view |
### Example with hideOtherMonthDays
```javascript
// Create a calendar that hides days from other months
const calendar = CalendarController({
firstDayOfWeek: 1,
dateFormat: 'MM/DD/YYYY',
hideOtherMonthDays: true // Only show days from the current month
});
```
## Internationalization
The calendar supports internationalization with the following features:
- **Localized Month Names**: Month names are displayed according to the selected locale
- **Localized Weekday Names**: Weekday names are displayed according to the selected locale
- **Locale-based Date Formatting**: Dates can be formatted according to the locale conventions
- **RTL Support**: Right-to-left languages are supported via the browser's localization
### Configuration
```javascript
// Internationalization options
const calendar = CalendarController({
// Set locale (any valid BCP 47 language tag)
locale: 'ja-JP', // Japanese
// Optional date format options (Intl.DateTimeFormat options)
dateFormatOptions: {
year: 'numeric',
month: 'long',
day: 'numeric',
weekday: 'short'
}
});
```
### Changing Locale Dynamically
```javascript
// Change locale at runtime
calendar.methods.setLocale('ar-EG'); // Arabic (Egypt)
// Update date format options
calendar.methods.setDateFormatOptions({
year: 'numeric',
month: 'short',
day: '2-digit'
});
```
### Example
See the full example of internationalization usage in the [i18n example](examples/i18n/index.html).
## Examples
The package includes comprehensive examples demonstrating various features and use cases:
- **[Basic Calendar](examples/calendar/)** - Simple calendar implementation
- **[Date Picker](examples/date-picker/)** - Full-featured date picker with modern styling
- **[Disabled Weekdays](examples/disabled-weekdays/)** - Business rules and weekday restrictions
- **[Internationalization](examples/i18n/)** - Multi-language support
- **[Multi-view Calendar](examples/multi-view-calendar/)** - Day, month, and year views
- **[Comprehensive Demo](examples/comprehensive-date-picker/)** - Advanced features showcase
### Running Examples
All examples work directly in the browser without build tools:
```bash
# Clone the repository
git clone https://github.com/jmkcoder/uplink-protocol-calendar.git
cd uplink-protocol-calendar
# Open any example in your browser
# e.g., open examples/date-picker/index.html
```
## Documentation
### Comprehensive Guides
- **[Calendar Controller Usage Guide](docs/usage-guide.md)** - Complete calendar implementation guide
- **[Time Controller Guide](docs/time-controller-guide.md)** - Complete time picker implementation guide ✨ **NEW**
- **[Technical Architecture](docs/technical-guide.md)** - Service-oriented architecture details
- **[TypeScript Usage](docs/typescript-usage.md)** - TypeScript integration guide
- **[Internationalization Guide](docs/internationalization-guide.md)** - Multi-language support
- **[Features Guide](docs/features-guide.md)** - Advanced features and examples
### API Reference
- **[API Documentation](docs/api/)** - Complete API reference with examples
- **[Calendar Controller API](docs/api/classes/CalendarControllerClass.md)** - Calendar controller methods
- **[Time Controller API](docs/api/classes/TimeControllerClass.md)** - Time controller methods ✨ **NEW**
### v0.2.3 Improvements
- Added comprehensive Time Controller with full time picker functionality
- Complete service-oriented architecture for time operations
- Full TypeScript support with comprehensive type definitions
- 24 comprehensive tests ensuring reliability
- Reactive bindings for real-time UI updates
- Accessibility features with focus management