UNPKG

@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

346 lines (276 loc) 11.9 kB
/** * Date Controller Demo * * This file demonstrates basic and intermediate features of the Date Controller * Run with: node date-controller-demo.js */ const { CalendarController } = require('../../dist/index.js'); console.log('📅 Date Controller Demo\n'); console.log('======================\n'); // ======================================== // 1. Basic Calendar Setup // ======================================== console.log('1. 📋 Basic Calendar Setup'); console.log('--------------------------'); const basicCalendar = CalendarController({ firstDayOfWeek: 1, // Monday start locale: 'en-US' }); console.log('✅ Basic calendar created'); console.log(` Current month: ${basicCalendar.bindings.monthName.current}`); console.log(` Current year: ${basicCalendar.bindings.currentYear.current}`); console.log(` First day of week: ${basicCalendar.methods.getWeekdayNames(true)[0]}`); console.log(''); // ======================================== // 2. Date Selection // ======================================== console.log('2. 📅 Date Selection'); console.log('--------------------'); // Select today's date const today = new Date(); basicCalendar.methods.selectDate(today); console.log(`✅ Selected date: ${basicCalendar.bindings.selectedDate.current?.toDateString()}`); console.log(` Formatted: ${basicCalendar.methods.getFormattedDate()}`); // Select a specific date basicCalendar.methods.selectDate(2025, 11, 25); // Christmas 2025 console.log(` Christmas 2025: ${basicCalendar.bindings.selectedDate.current?.toDateString()}`); console.log(''); // ======================================== // 3. Calendar Navigation // ======================================== console.log('3. 🧭 Calendar Navigation'); console.log('-------------------------'); console.log('✅ Navigation demo:'); console.log(` Current: ${basicCalendar.bindings.monthName.current} ${basicCalendar.bindings.currentYear.current}`); basicCalendar.methods.goToNextMonth(); console.log(` Next month: ${basicCalendar.bindings.monthName.current} ${basicCalendar.bindings.currentYear.current}`); basicCalendar.methods.goToPreviousMonth(); basicCalendar.methods.goToNextYear(); console.log(` Next year: ${basicCalendar.bindings.monthName.current} ${basicCalendar.bindings.currentYear.current}`); basicCalendar.methods.goToToday(); console.log(` Back to today: ${basicCalendar.bindings.monthName.current} ${basicCalendar.bindings.currentYear.current}`); console.log(''); // ======================================== // 4. Date Constraints // ======================================== console.log('4. 🚫 Date Constraints'); console.log('----------------------'); const constrainedCalendar = CalendarController({ firstDayOfWeek: 1 }); // Set date range (next 30 days) const minDate = new Date(); const maxDate = new Date(); maxDate.setDate(maxDate.getDate() + 30); constrainedCalendar.methods.setMinDate(minDate); constrainedCalendar.methods.setMaxDate(maxDate); console.log('✅ Date constraints applied:'); console.log(` Min date: ${minDate.toDateString()}`); console.log(` Max date: ${maxDate.toDateString()}`); // Disable weekends constrainedCalendar.methods.setDisabledDaysOfWeek([0, 6]); // Sunday and Saturday console.log(' Weekends disabled'); // Test some dates const testDates = [ new Date(2024, 5, 26), // Past date new Date(2025, 5, 28), // Saturday new Date(2025, 6, 1), // Tuesday (valid) new Date(2025, 7, 15) // Future date beyond range ]; testDates.forEach(date => { const isDisabled = constrainedCalendar.methods.isDateDisabled(date); console.log(` ${date.toDateString()}: ${isDisabled ? '❌ Disabled' : '✅ Available'}`); }); console.log(''); // ======================================== // 5. Date Range Selection // ======================================== console.log('5. 📊 Date Range Selection'); console.log('--------------------------'); const rangeCalendar = CalendarController({ isRangeSelection: true, firstDayOfWeek: 1 }); console.log('✅ Range selection enabled'); // Select a date range const startDate = new Date(2025, 6, 10); const endDate = new Date(2025, 6, 17); rangeCalendar.methods.selectDate(startDate); rangeCalendar.methods.selectDate(endDate); const dateRange = rangeCalendar.selectedDateRange; console.log(` Range start: ${dateRange.startDate?.toDateString()}`); console.log(` Range end: ${dateRange.endDate?.toDateString()}`); if (dateRange.startDate && dateRange.endDate) { const days = Math.ceil((dateRange.endDate - dateRange.startDate) / (1000 * 60 * 60 * 24)) + 1; console.log(` Duration: ${days} days`); } console.log(''); // ======================================== // 6. Calendar Generation // ======================================== console.log('6. 🗓️ Calendar Generation'); console.log('-------------------------'); const generator = CalendarController({ firstDayOfWeek: 1, hideOtherMonthDays: false }); generator.methods.goToMonth(6, 2025); // July 2025 console.log('✅ Calendar data generation:'); // Generate month view const monthView = generator.methods.generateMonthView(); console.log(` Month view for ${monthView.month + 1}/${monthView.year}:`); console.log(` Weeks: ${monthView.weeks.length}`); console.log(` Weekdays: ${monthView.weekdays.join(', ')}`); // Show first week as example if (monthView.weeks.length > 0) { console.log(' First week:'); monthView.weeks[0].days.forEach(day => { const marker = day.isCurrentMonth ? '' : '(other month)'; console.log(` ${day.day} ${marker}`); }); } // Generate year view const yearMonths = generator.methods.generateCalendarMonths(); console.log(`\n Year view: ${yearMonths.length} months`); yearMonths.slice(0, 3).forEach(month => { const monthName = generator.methods.getMonthNames()[month.month]; console.log(` ${monthName}: ${month.isDisabled ? 'Disabled' : 'Available'}`); }); // Generate decade view const yearData = generator.methods.generateCalendarYears(); console.log(`\n Decade view: ${yearData.length} years (${yearData[0].year}-${yearData[yearData.length-1].year})`); console.log(''); // ======================================== // 7. Internationalization // ======================================== console.log('7. 🌐 Internationalization'); console.log('--------------------------'); const i18nCalendars = [ { locale: 'en-US', name: 'English (US)' }, { locale: 'fr-FR', name: 'French' }, { locale: 'de-DE', name: 'German' }, { locale: 'ja-JP', name: 'Japanese' } ]; const testDate = new Date(2025, 5, 26); console.log('✅ Same date in different locales:'); i18nCalendars.forEach(({ locale, name }) => { const calendar = CalendarController({ locale }); calendar.methods.selectDate(testDate); const formatted = calendar.methods.formatDate(testDate); const monthNames = calendar.methods.getMonthNames(); console.log(` ${name}: ${formatted}`); console.log(` June: ${monthNames[5]}`); }); console.log(''); // ======================================== // 8. Event Handling // ======================================== console.log('8. 🎭 Event Handling'); console.log('--------------------'); const eventCalendar = CalendarController({ firstDayOfWeek: 1 }); console.log('✅ Setting up event listeners:'); let eventCount = 0; // Subscribe to date selection events if (eventCalendar.events.dateSelected) { eventCalendar.events.dateSelected.subscribe((date) => { eventCount++; console.log(` 📅 Date selected: ${date.toDateString()}`); }); } // Subscribe to month change events if (eventCalendar.events.monthChanged) { eventCalendar.events.monthChanged.subscribe((month) => { eventCount++; const monthName = eventCalendar.methods.getMonthNames()[month]; console.log(` 📆 Month changed: ${monthName}`); }); } // Trigger some events console.log('\n Triggering events:'); eventCalendar.methods.selectDate(new Date(2025, 7, 15)); eventCalendar.methods.goToNextMonth(); eventCalendar.methods.selectDate(new Date(2025, 8, 10)); console.log(`\n Total events fired: ${eventCount}`); console.log(''); // ======================================== // 9. Accessibility Features // ======================================== console.log('9. ♿ Accessibility Features'); console.log('---------------------------'); const a11yCalendar = CalendarController({ firstDayOfWeek: 1 }); const focusTestDate = new Date(2025, 5, 26); a11yCalendar.methods.setFocusedDate(focusTestDate); console.log('✅ Accessibility features:'); console.log(` Focused date: ${a11yCalendar.bindings.focusedDate.current?.toDateString()}`); // Test accessible labels const accessibilityTestDates = [ new Date(), // Today new Date(2025, 5, 27), // Tomorrow new Date(2025, 5, 29) // Sunday ]; accessibilityTestDates.forEach(date => { const label = a11yCalendar.methods.getAccessibleDateLabel(date); const isToday = a11yCalendar.methods.isToday(date); console.log(` ${date.toDateString()}: "${label}" ${isToday ? '(Today)' : ''}`); }); // Keyboard navigation demo console.log('\n Keyboard navigation:'); a11yCalendar.methods.moveFocusRight(); console.log(` Move right: ${a11yCalendar.bindings.focusedDate.current?.toDateString()}`); a11yCalendar.methods.moveFocusDown(); console.log(` Move down (next week): ${a11yCalendar.bindings.focusedDate.current?.toDateString()}`); console.log(''); // ======================================== // 10. Calendar Utilities // ======================================== console.log('10. 🛠️ Calendar Utilities'); console.log('-------------------------'); const utilityCalendar = CalendarController({ firstDayOfWeek: 1 }); console.log('✅ Calendar utilities:'); // Week number calculation const weekTestDate = new Date(2025, 5, 26); const weekNumber = utilityCalendar.methods.getWeekNumber(weekTestDate); console.log(` Week number for ${weekTestDate.toDateString()}: ${weekNumber}`); // Month and weekday names const monthNames = utilityCalendar.methods.getMonthNames(); const weekdayNames = utilityCalendar.methods.getWeekdayNames(true); console.log(` All months: ${monthNames.slice(0, 3).join(', ')}...`); console.log(` Weekdays (short): ${weekdayNames.join(', ')}`); // Date formatting options utilityCalendar.methods.setDateFormatOptions({ year: 'numeric', month: 'long', day: 'numeric', weekday: 'long' }); utilityCalendar.methods.selectDate(weekTestDate); console.log(` Custom format: ${utilityCalendar.methods.getFormattedDate()}`); // Current locale info console.log(` Current locale: ${utilityCalendar.methods.getLocale()}`); console.log(''); console.log('🎯 Date Controller Demo Complete!'); console.log('================================='); console.log(''); console.log('Features demonstrated:'); console.log('• 📋 Basic calendar setup & configuration'); console.log('• 📅 Date selection (single & range)'); console.log('• 🧭 Calendar navigation'); console.log('• 🚫 Date constraints & validation'); console.log('• 🗓️ Calendar data generation'); console.log('• 🌐 Internationalization support'); console.log('• 🎭 Event handling & subscriptions'); console.log('• ♿ Accessibility features'); console.log('• 🛠️ Utility functions'); console.log(''); console.log('This controller is ready for:'); console.log('• Building date picker components'); console.log('• Creating calendar widgets'); console.log('• Implementing booking systems'); console.log('• Multi-language applications'); console.log('• Accessible date selection interfaces');