kalendly 0.1.7 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +317 -681
- package/dist/core/index.js +3 -3
- package/dist/index.d.mts +48 -602
- package/dist/index.d.ts +48 -602
- package/dist/index.js +753 -2359
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +727 -2348
- package/dist/index.mjs.map +1 -1
- package/dist/{vanilla/index.umd.js → index.umd.js} +218 -218
- package/dist/index.umd.js.map +1 -0
- package/package.json +41 -91
- package/dist/react/index.d.mts +0 -251
- package/dist/react/index.d.ts +0 -251
- package/dist/react/index.js +0 -969
- package/dist/react/index.js.map +0 -1
- package/dist/react/index.mjs +0 -924
- package/dist/react/index.mjs.map +0 -1
- package/dist/react-native/index.d.mts +0 -642
- package/dist/react-native/index.d.ts +0 -642
- package/dist/react-native/index.js +0 -1649
- package/dist/react-native/index.js.map +0 -1
- package/dist/react-native/index.mjs +0 -1615
- package/dist/react-native/index.mjs.map +0 -1
- package/dist/vanilla/index.d.mts +0 -271
- package/dist/vanilla/index.d.ts +0 -271
- package/dist/vanilla/index.js +0 -1064
- package/dist/vanilla/index.js.map +0 -1
- package/dist/vanilla/index.mjs +0 -1013
- package/dist/vanilla/index.mjs.map +0 -1
- package/dist/vanilla/index.umd.js.map +0 -1
- package/dist/vue/components/Calendar.vue.d.ts +0 -43
- package/dist/vue/components/Calendar.vue.d.ts.map +0 -1
- package/dist/vue/index.d.ts +0 -134
- package/dist/vue/index.d.ts.map +0 -1
- package/dist/vue/index.js +0 -1
- package/dist/vue/index.mjs +0 -717
- package/dist/vue/types.d.ts +0 -21
- package/dist/vue/types.d.ts.map +0 -1
|
@@ -18,34 +18,11 @@ var Kalendly = (() => {
|
|
|
18
18
|
};
|
|
19
19
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
20
|
|
|
21
|
-
// src/
|
|
22
|
-
var
|
|
23
|
-
__export(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
DEFAULT_CATEGORY_COLORS: () => DEFAULT_CATEGORY_COLORS,
|
|
27
|
-
MONTHS: () => MONTHS,
|
|
28
|
-
MONTHS_FULL: () => MONTHS_FULL,
|
|
29
|
-
VanillaCalendar: () => VanillaCalendar,
|
|
30
|
-
createCalendar: () => createCalendar,
|
|
31
|
-
formatAttendees: () => formatAttendees,
|
|
32
|
-
formatDateForDisplay: () => formatDateForDisplay,
|
|
33
|
-
formatTimeRange: () => formatTimeRange,
|
|
34
|
-
generateCalendarDates: () => generateCalendarDates,
|
|
35
|
-
generateYears: () => generateYears,
|
|
36
|
-
getCategoryColor: () => getCategoryColor,
|
|
37
|
-
getCellClasses: () => getCellClasses,
|
|
38
|
-
getDefaultEventColor: () => getDefaultEventColor,
|
|
39
|
-
getEventsForDate: () => getEventsForDate,
|
|
40
|
-
getMonthYearText: () => getMonthYearText,
|
|
41
|
-
getPopupPositionClass: () => getPopupPositionClass,
|
|
42
|
-
hasEvents: () => hasEvents,
|
|
43
|
-
isSameDay: () => isSameDay,
|
|
44
|
-
isToday: () => isToday,
|
|
45
|
-
isValidHexColor: () => isValidHexColor,
|
|
46
|
-
mergeCategoryColors: () => mergeCategoryColors,
|
|
47
|
-
normalizeDate: () => normalizeDate,
|
|
48
|
-
sortEventsByTime: () => sortEventsByTime
|
|
21
|
+
// src/web-components/CalendarElement.ts
|
|
22
|
+
var CalendarElement_exports = {};
|
|
23
|
+
__export(CalendarElement_exports, {
|
|
24
|
+
CalendarElement: () => CalendarElement,
|
|
25
|
+
defineCalendarElement: () => defineCalendarElement
|
|
49
26
|
});
|
|
50
27
|
|
|
51
28
|
// src/core/utils.ts
|
|
@@ -108,9 +85,6 @@ var Kalendly = (() => {
|
|
|
108
85
|
return eventDate.getTime() === normalizedTargetDate.getTime();
|
|
109
86
|
});
|
|
110
87
|
}
|
|
111
|
-
function hasEvents(events, date) {
|
|
112
|
-
return getEventsForDate(events, date).length > 0;
|
|
113
|
-
}
|
|
114
88
|
function generateCalendarDates(year, month, events = [], weekStartsOn = 0) {
|
|
115
89
|
const firstDay = new Date(year, month, 1);
|
|
116
90
|
const lastDay = new Date(year, month + 1, 0);
|
|
@@ -212,16 +186,6 @@ var Kalendly = (() => {
|
|
|
212
186
|
if (attendees.length === 2) return attendees.join(" and ");
|
|
213
187
|
return `${attendees.slice(0, -1).join(", ")}, and ${attendees[attendees.length - 1]}`;
|
|
214
188
|
}
|
|
215
|
-
function sortEventsByTime(events) {
|
|
216
|
-
return [...events].sort((a, b) => {
|
|
217
|
-
const aAllDay = a.allDay || !a.startTime && !a.endTime;
|
|
218
|
-
const bAllDay = b.allDay || !b.startTime && !b.endTime;
|
|
219
|
-
if (aAllDay && !bAllDay) return -1;
|
|
220
|
-
if (!aAllDay && bAllDay) return 1;
|
|
221
|
-
if (!a.startTime || !b.startTime) return 0;
|
|
222
|
-
return a.startTime.localeCompare(b.startTime);
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
189
|
var DEFAULT_CATEGORY_COLORS = {
|
|
226
190
|
work: "#3b82f6",
|
|
227
191
|
personal: "#8b5cf6",
|
|
@@ -230,13 +194,6 @@ var Kalendly = (() => {
|
|
|
230
194
|
appointment: "#f59e0b",
|
|
231
195
|
other: "#6b7280"
|
|
232
196
|
};
|
|
233
|
-
function getDefaultEventColor(category, customColors) {
|
|
234
|
-
const colorMap = customColors || DEFAULT_CATEGORY_COLORS;
|
|
235
|
-
if (category && colorMap[category]) {
|
|
236
|
-
return colorMap[category];
|
|
237
|
-
}
|
|
238
|
-
return "#fc8917";
|
|
239
|
-
}
|
|
240
197
|
function mergeCategoryColors(customColors) {
|
|
241
198
|
return {
|
|
242
199
|
...DEFAULT_CATEGORY_COLORS,
|
|
@@ -480,83 +437,174 @@ var Kalendly = (() => {
|
|
|
480
437
|
}
|
|
481
438
|
};
|
|
482
439
|
|
|
483
|
-
// src/
|
|
484
|
-
var
|
|
485
|
-
constructor(
|
|
440
|
+
// src/web-components/CalendarElement.ts
|
|
441
|
+
var CalendarElement = class extends HTMLElement {
|
|
442
|
+
constructor() {
|
|
443
|
+
super(...arguments);
|
|
444
|
+
this.engine = null;
|
|
486
445
|
this.unsubscribe = null;
|
|
446
|
+
this.actions = null;
|
|
487
447
|
this.pickerOpen = false;
|
|
488
448
|
this.yearInput = "";
|
|
489
449
|
this.yearInputValid = true;
|
|
450
|
+
this.listenersAttached = false;
|
|
490
451
|
this.clickOutsideHandler = null;
|
|
491
452
|
this.delegatedClickHandler = null;
|
|
492
453
|
this.delegatedInputHandler = null;
|
|
493
454
|
this.delegatedBlurHandler = null;
|
|
494
455
|
this.delegatedKeydownHandler = null;
|
|
495
|
-
|
|
496
|
-
this.
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
456
|
+
// Rich property backing fields
|
|
457
|
+
this._events = [];
|
|
458
|
+
this._theme = null;
|
|
459
|
+
this._categoryColors = null;
|
|
460
|
+
this._renderEvent = null;
|
|
461
|
+
this._renderNoEvents = null;
|
|
462
|
+
}
|
|
463
|
+
get events() {
|
|
464
|
+
return this._events;
|
|
465
|
+
}
|
|
466
|
+
set events(val) {
|
|
467
|
+
this._events = val;
|
|
468
|
+
if (this.engine) {
|
|
469
|
+
this.engine.updateEvents(val);
|
|
505
470
|
}
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
minYear: props.minYear,
|
|
510
|
-
maxYear: props.maxYear,
|
|
511
|
-
weekStartsOn: props.weekStartsOn
|
|
512
|
-
});
|
|
513
|
-
this.actions = this.engine.getActions();
|
|
471
|
+
}
|
|
472
|
+
set theme(val) {
|
|
473
|
+
this._theme = val;
|
|
514
474
|
this.applyTheme();
|
|
515
|
-
this.init();
|
|
516
475
|
}
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
if (theme.primary)
|
|
522
|
-
root.style.setProperty("--calendar-primary-color", theme.primary);
|
|
523
|
-
if (theme.secondary)
|
|
524
|
-
root.style.setProperty("--calendar-secondary-color", theme.secondary);
|
|
525
|
-
if (theme.tertiary)
|
|
526
|
-
root.style.setProperty("--calendar-tertiary-color", theme.tertiary);
|
|
527
|
-
if (theme.textColor)
|
|
528
|
-
root.style.setProperty("--calendar-text-color", theme.textColor);
|
|
529
|
-
if (theme.textLight)
|
|
530
|
-
root.style.setProperty("--calendar-text-light", theme.textLight);
|
|
531
|
-
if (theme.background)
|
|
532
|
-
root.style.setProperty("--calendar-background", theme.background);
|
|
533
|
-
if (theme.cellHover)
|
|
534
|
-
root.style.setProperty("--calendar-cell-hover", theme.cellHover);
|
|
535
|
-
if (theme.borderColor)
|
|
536
|
-
root.style.setProperty("--calendar-border-color", theme.borderColor);
|
|
537
|
-
if (theme.todayOutline)
|
|
538
|
-
root.style.setProperty("--calendar-today-outline", theme.todayOutline);
|
|
539
|
-
if (theme.selectedBg)
|
|
540
|
-
root.style.setProperty("--calendar-selected-bg", theme.selectedBg);
|
|
541
|
-
if (theme.eventIndicator)
|
|
542
|
-
root.style.setProperty(
|
|
543
|
-
"--calendar-event-indicator",
|
|
544
|
-
theme.eventIndicator
|
|
545
|
-
);
|
|
476
|
+
set categoryColors(val) {
|
|
477
|
+
this._categoryColors = val;
|
|
478
|
+
if (this.engine) {
|
|
479
|
+
this.engine.updateCategoryColors(val);
|
|
546
480
|
}
|
|
547
481
|
}
|
|
548
|
-
|
|
549
|
-
this.
|
|
550
|
-
if (this.
|
|
551
|
-
|
|
552
|
-
|
|
482
|
+
set renderEvent(val) {
|
|
483
|
+
this._renderEvent = val;
|
|
484
|
+
if (this.engine) this.render();
|
|
485
|
+
}
|
|
486
|
+
set renderNoEvents(val) {
|
|
487
|
+
this._renderNoEvents = val;
|
|
488
|
+
if (this.engine) this.render();
|
|
489
|
+
}
|
|
490
|
+
connectedCallback() {
|
|
491
|
+
this.classList.add("kalendly-calendar");
|
|
492
|
+
this.initEngine();
|
|
493
|
+
this.render();
|
|
494
|
+
}
|
|
495
|
+
disconnectedCallback() {
|
|
496
|
+
this.cleanup();
|
|
497
|
+
this.classList.remove("kalendly-calendar");
|
|
498
|
+
this.innerHTML = "";
|
|
499
|
+
}
|
|
500
|
+
attributeChangedCallback(_name, oldVal, newVal) {
|
|
501
|
+
if (oldVal === newVal) return;
|
|
502
|
+
this.reinit();
|
|
503
|
+
}
|
|
504
|
+
get minYear() {
|
|
505
|
+
const val = this.getAttribute("min-year");
|
|
506
|
+
return val ? parseInt(val, 10) : (/* @__PURE__ */ new Date()).getFullYear() - 30;
|
|
507
|
+
}
|
|
508
|
+
get maxYear() {
|
|
509
|
+
const val = this.getAttribute("max-year");
|
|
510
|
+
return val ? parseInt(val, 10) : (/* @__PURE__ */ new Date()).getFullYear() + 10;
|
|
511
|
+
}
|
|
512
|
+
initEngine() {
|
|
513
|
+
const initialDateAttr = this.getAttribute("initial-date");
|
|
514
|
+
const initialDate = initialDateAttr ? new Date(initialDateAttr) : void 0;
|
|
515
|
+
const weekStartsOnAttr = this.getAttribute("week-starts-on");
|
|
516
|
+
const weekStartsOn = weekStartsOnAttr === "1" ? 1 : 0;
|
|
517
|
+
this.engine = new CalendarEngine({
|
|
518
|
+
events: this._events,
|
|
519
|
+
initialDate,
|
|
520
|
+
minYear: this.minYear,
|
|
521
|
+
maxYear: this.maxYear,
|
|
522
|
+
weekStartsOn,
|
|
523
|
+
categoryColors: this._categoryColors ?? void 0
|
|
524
|
+
});
|
|
525
|
+
this.actions = this.engine.getActions();
|
|
526
|
+
this.applyTheme();
|
|
553
527
|
this.unsubscribe = this.engine.subscribe(() => {
|
|
554
528
|
this.render();
|
|
555
529
|
});
|
|
530
|
+
}
|
|
531
|
+
reinit() {
|
|
532
|
+
if (!this.engine) return;
|
|
533
|
+
this.cleanup();
|
|
534
|
+
this.initEngine();
|
|
556
535
|
this.render();
|
|
557
536
|
}
|
|
537
|
+
cleanup() {
|
|
538
|
+
if (this.unsubscribe) {
|
|
539
|
+
this.unsubscribe();
|
|
540
|
+
this.unsubscribe = null;
|
|
541
|
+
}
|
|
542
|
+
if (this.delegatedClickHandler) {
|
|
543
|
+
this.removeEventListener("click", this.delegatedClickHandler);
|
|
544
|
+
this.delegatedClickHandler = null;
|
|
545
|
+
}
|
|
546
|
+
if (this.delegatedInputHandler) {
|
|
547
|
+
this.removeEventListener("input", this.delegatedInputHandler);
|
|
548
|
+
this.delegatedInputHandler = null;
|
|
549
|
+
}
|
|
550
|
+
if (this.delegatedBlurHandler) {
|
|
551
|
+
this.removeEventListener("blur", this.delegatedBlurHandler, true);
|
|
552
|
+
this.delegatedBlurHandler = null;
|
|
553
|
+
}
|
|
554
|
+
if (this.delegatedKeydownHandler) {
|
|
555
|
+
this.removeEventListener("keydown", this.delegatedKeydownHandler);
|
|
556
|
+
this.delegatedKeydownHandler = null;
|
|
557
|
+
}
|
|
558
|
+
if (this.clickOutsideHandler) {
|
|
559
|
+
document.removeEventListener("click", this.clickOutsideHandler);
|
|
560
|
+
this.clickOutsideHandler = null;
|
|
561
|
+
}
|
|
562
|
+
this.listenersAttached = false;
|
|
563
|
+
if (this.engine) {
|
|
564
|
+
this.engine.destroy();
|
|
565
|
+
this.engine = null;
|
|
566
|
+
}
|
|
567
|
+
this.actions = null;
|
|
568
|
+
}
|
|
569
|
+
applyTheme() {
|
|
570
|
+
if (!this._theme) return;
|
|
571
|
+
const root = document.documentElement;
|
|
572
|
+
const t = this._theme;
|
|
573
|
+
if (t.primary)
|
|
574
|
+
root.style.setProperty("--calendar-primary-color", t.primary);
|
|
575
|
+
if (t.secondary)
|
|
576
|
+
root.style.setProperty("--calendar-secondary-color", t.secondary);
|
|
577
|
+
if (t.tertiary)
|
|
578
|
+
root.style.setProperty("--calendar-tertiary-color", t.tertiary);
|
|
579
|
+
if (t.textColor)
|
|
580
|
+
root.style.setProperty("--calendar-text-color", t.textColor);
|
|
581
|
+
if (t.textLight)
|
|
582
|
+
root.style.setProperty("--calendar-text-light", t.textLight);
|
|
583
|
+
if (t.background)
|
|
584
|
+
root.style.setProperty("--calendar-background", t.background);
|
|
585
|
+
if (t.cellHover)
|
|
586
|
+
root.style.setProperty("--calendar-cell-hover", t.cellHover);
|
|
587
|
+
if (t.borderColor)
|
|
588
|
+
root.style.setProperty("--calendar-border-color", t.borderColor);
|
|
589
|
+
if (t.todayOutline)
|
|
590
|
+
root.style.setProperty("--calendar-today-outline", t.todayOutline);
|
|
591
|
+
if (t.selectedBg)
|
|
592
|
+
root.style.setProperty("--calendar-selected-bg", t.selectedBg);
|
|
593
|
+
if (t.eventIndicator)
|
|
594
|
+
root.style.setProperty("--calendar-event-indicator", t.eventIndicator);
|
|
595
|
+
}
|
|
558
596
|
render() {
|
|
597
|
+
if (!this.engine) return;
|
|
559
598
|
const viewModel = this.engine.getViewModel();
|
|
599
|
+
const useShortMonths = this.hasAttribute("use-short-month-names");
|
|
600
|
+
const title = this.getAttribute("title");
|
|
601
|
+
const minYear = this.minYear;
|
|
602
|
+
const maxYear = this.maxYear;
|
|
603
|
+
const today = /* @__PURE__ */ new Date();
|
|
604
|
+
const todayMonth = today.getMonth();
|
|
605
|
+
const todayYear = today.getFullYear();
|
|
606
|
+
const isCurrentMonth = viewModel.currentYear === todayYear && viewModel.currentMonth === todayMonth;
|
|
607
|
+
const showScrollHint = viewModel.tasks.length > 3;
|
|
560
608
|
const defaultRenderEvent = (event) => {
|
|
561
609
|
const timeRange = formatTimeRange(event);
|
|
562
610
|
const attendeesList = formatAttendees(event.attendees);
|
|
@@ -602,46 +650,46 @@ var Kalendly = (() => {
|
|
|
602
650
|
${event.status && event.status !== "scheduled" ? `<span class="badge status-${event.status}">${getStatusLabel(event.status)}</span>` : ""}
|
|
603
651
|
</div>
|
|
604
652
|
</div>
|
|
605
|
-
|
|
653
|
+
|
|
606
654
|
${timeRange ? `
|
|
607
655
|
<div class="event-time">
|
|
608
656
|
<span class="event-time-label">Time:</span>
|
|
609
657
|
<span class="event-time-value">${timeRange}</span>
|
|
610
658
|
</div>
|
|
611
659
|
` : ""}
|
|
612
|
-
|
|
660
|
+
|
|
613
661
|
${event.description ? `
|
|
614
662
|
<div class="event-description">${event.description}</div>
|
|
615
663
|
` : ""}
|
|
616
|
-
|
|
664
|
+
|
|
617
665
|
${event.location ? `
|
|
618
666
|
<div class="event-time">
|
|
619
667
|
<span class="event-time-label">Location:</span>
|
|
620
668
|
<span class="event-time-value">${event.location}</span>
|
|
621
669
|
</div>
|
|
622
670
|
` : ""}
|
|
623
|
-
|
|
671
|
+
|
|
624
672
|
${attendeesList ? `
|
|
625
673
|
<div class="event-time">
|
|
626
674
|
<span class="event-time-label">Attendees:</span>
|
|
627
675
|
<span class="event-time-value">${attendeesList}</span>
|
|
628
676
|
</div>
|
|
629
677
|
` : ""}
|
|
630
|
-
|
|
678
|
+
|
|
631
679
|
${event.organizer ? `
|
|
632
680
|
<div class="event-time">
|
|
633
681
|
<span class="event-time-label">Organizer:</span>
|
|
634
682
|
<span class="event-time-value">${event.organizer}</span>
|
|
635
683
|
</div>
|
|
636
684
|
` : ""}
|
|
637
|
-
|
|
685
|
+
|
|
638
686
|
${event.notes ? `
|
|
639
687
|
<div class="event-time">
|
|
640
688
|
<span class="event-time-label">Notes:</span>
|
|
641
689
|
<span class="event-time-value">${event.notes}</span>
|
|
642
690
|
</div>
|
|
643
691
|
` : ""}
|
|
644
|
-
|
|
692
|
+
|
|
645
693
|
${event.url ? `
|
|
646
694
|
<div class="event-time">
|
|
647
695
|
<a href="${event.url}" target="_blank" rel="noopener noreferrer" class="event-link">
|
|
@@ -649,7 +697,7 @@ var Kalendly = (() => {
|
|
|
649
697
|
</a>
|
|
650
698
|
</div>
|
|
651
699
|
` : ""}
|
|
652
|
-
|
|
700
|
+
|
|
653
701
|
${event.tags && event.tags.length > 0 ? `
|
|
654
702
|
<div class="event-tags">
|
|
655
703
|
${event.tags.map((tag) => `<span class="event-tag">${tag}</span>`).join("")}
|
|
@@ -659,25 +707,17 @@ var Kalendly = (() => {
|
|
|
659
707
|
`;
|
|
660
708
|
};
|
|
661
709
|
const defaultRenderNoEvents = () => '<div class="no-events-message">No events scheduled for this day.</div>';
|
|
662
|
-
const renderEvent = this.
|
|
663
|
-
const renderNoEvents = this.
|
|
664
|
-
const showScrollHint = viewModel.tasks.length > 3;
|
|
665
|
-
const today = /* @__PURE__ */ new Date();
|
|
666
|
-
const todayMonth = today.getMonth();
|
|
667
|
-
const todayYear = today.getFullYear();
|
|
668
|
-
const minYear = this.props.minYear ?? todayYear - 30;
|
|
669
|
-
const maxYear = this.props.maxYear ?? todayYear + 10;
|
|
670
|
-
const isCurrentMonth = viewModel.currentYear === todayYear && viewModel.currentMonth === todayMonth;
|
|
710
|
+
const renderEvent = this._renderEvent || defaultRenderEvent;
|
|
711
|
+
const renderNoEvents = this._renderNoEvents || defaultRenderNoEvents;
|
|
671
712
|
const html = `
|
|
672
|
-
${
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
713
|
+
${title ? `
|
|
714
|
+
<div class="page--title">
|
|
715
|
+
<h1>${title}</h1>
|
|
716
|
+
</div>
|
|
676
717
|
` : ""}
|
|
677
718
|
|
|
678
719
|
<div class="calendar--content">
|
|
679
720
|
<div class="calendar--card">
|
|
680
|
-
<!-- Navigation Header -->
|
|
681
721
|
<div class="calendar--nav-header">
|
|
682
722
|
<button type="button" class="calendar--nav-arrow" data-action="previous" aria-label="Previous month">
|
|
683
723
|
‹
|
|
@@ -691,7 +731,7 @@ var Kalendly = (() => {
|
|
|
691
731
|
aria-expanded="${this.pickerOpen ? "true" : "false"}"
|
|
692
732
|
aria-haspopup="true"
|
|
693
733
|
>
|
|
694
|
-
${
|
|
734
|
+
${useShortMonths ? `${MONTHS[viewModel.currentMonth]} ${viewModel.currentYear}` : viewModel.monthAndYearText}
|
|
695
735
|
<span class="calendar--picker-chevron">▾</span>
|
|
696
736
|
</button>
|
|
697
737
|
|
|
@@ -722,7 +762,7 @@ var Kalendly = (() => {
|
|
|
722
762
|
</div>
|
|
723
763
|
|
|
724
764
|
<div class="calendar--picker-months">
|
|
725
|
-
${(
|
|
765
|
+
${(useShortMonths ? MONTHS : MONTHS_FULL).map((month, index) => {
|
|
726
766
|
const isSelected = index === viewModel.currentMonth;
|
|
727
767
|
const isCurrent = index === todayMonth && viewModel.currentYear === todayYear;
|
|
728
768
|
return `
|
|
@@ -795,26 +835,21 @@ var Kalendly = (() => {
|
|
|
795
835
|
` : ""}
|
|
796
836
|
|
|
797
837
|
<div class="events-container">
|
|
798
|
-
${viewModel.tasks.length > 0 ?
|
|
799
|
-
${viewModel.tasks.map((event) => renderEvent(event)).join("")}
|
|
800
|
-
` : renderNoEvents()}
|
|
838
|
+
${viewModel.tasks.length > 0 ? viewModel.tasks.map((event) => renderEvent(event)).join("") : renderNoEvents()}
|
|
801
839
|
</div>
|
|
802
840
|
</div>
|
|
803
841
|
` : ""}
|
|
804
842
|
</div>
|
|
805
843
|
</div>
|
|
806
844
|
`;
|
|
807
|
-
this.
|
|
845
|
+
this.innerHTML = html;
|
|
808
846
|
this.attachEventListeners();
|
|
809
847
|
}
|
|
810
848
|
attachEventListeners() {
|
|
811
849
|
if (this.listenersAttached) return;
|
|
812
850
|
this.listenersAttached = true;
|
|
813
|
-
const
|
|
814
|
-
const
|
|
815
|
-
const todayMonth = today.getMonth();
|
|
816
|
-
const minYear = this.props.minYear ?? todayYear - 30;
|
|
817
|
-
const maxYear = this.props.maxYear ?? todayYear + 10;
|
|
851
|
+
const minYear = this.minYear;
|
|
852
|
+
const maxYear = this.maxYear;
|
|
818
853
|
this.delegatedClickHandler = (e) => {
|
|
819
854
|
const target = e.target;
|
|
820
855
|
const cell = target.closest('td[data-clickable="true"]');
|
|
@@ -823,8 +858,12 @@ var Kalendly = (() => {
|
|
|
823
858
|
const date = new Date(cell.dataset.date);
|
|
824
859
|
const dayIndex = parseInt(cell.dataset.dayIndex || "0");
|
|
825
860
|
this.engine.handleDateClick(date, dayIndex);
|
|
826
|
-
this.
|
|
827
|
-
new CustomEvent("
|
|
861
|
+
this.dispatchEvent(
|
|
862
|
+
new CustomEvent("cal-date-select", {
|
|
863
|
+
bubbles: true,
|
|
864
|
+
composed: true,
|
|
865
|
+
detail: { date, events: this.engine.getEventsForDate(date) }
|
|
866
|
+
})
|
|
828
867
|
);
|
|
829
868
|
return;
|
|
830
869
|
}
|
|
@@ -844,11 +883,7 @@ var Kalendly = (() => {
|
|
|
844
883
|
case "today":
|
|
845
884
|
this.actions.goToToday();
|
|
846
885
|
this.pickerOpen = false;
|
|
847
|
-
this.
|
|
848
|
-
new CustomEvent("monthChange", {
|
|
849
|
-
detail: { year: todayYear, month: todayMonth }
|
|
850
|
-
})
|
|
851
|
-
);
|
|
886
|
+
this.dispatchMonthChange();
|
|
852
887
|
break;
|
|
853
888
|
case "toggle-picker":
|
|
854
889
|
this.pickerOpen = !this.pickerOpen;
|
|
@@ -921,118 +956,83 @@ var Kalendly = (() => {
|
|
|
921
956
|
this.delegatedKeydownHandler = (e) => {
|
|
922
957
|
const target = e.target;
|
|
923
958
|
if (!target.matches("[data-year-input]")) return;
|
|
924
|
-
if (e.key === "Enter")
|
|
925
|
-
target.blur();
|
|
926
|
-
}
|
|
959
|
+
if (e.key === "Enter") target.blur();
|
|
927
960
|
};
|
|
928
|
-
this.
|
|
929
|
-
this.
|
|
930
|
-
this.
|
|
931
|
-
this.
|
|
961
|
+
this.addEventListener("click", this.delegatedClickHandler);
|
|
962
|
+
this.addEventListener("input", this.delegatedInputHandler);
|
|
963
|
+
this.addEventListener("blur", this.delegatedBlurHandler, true);
|
|
964
|
+
this.addEventListener("keydown", this.delegatedKeydownHandler);
|
|
932
965
|
this.clickOutsideHandler = (e) => {
|
|
933
966
|
const target = e.target;
|
|
934
|
-
if (this.
|
|
967
|
+
if (this.contains(target)) return;
|
|
935
968
|
if (this.pickerOpen) {
|
|
936
969
|
this.pickerOpen = false;
|
|
937
970
|
this.render();
|
|
938
971
|
return;
|
|
939
972
|
}
|
|
940
|
-
const popup = this.
|
|
973
|
+
const popup = this.querySelector(".date-popup");
|
|
941
974
|
if (popup) {
|
|
942
975
|
this.engine.clearSelection();
|
|
943
976
|
}
|
|
944
977
|
};
|
|
945
978
|
document.addEventListener("click", this.clickOutsideHandler);
|
|
946
979
|
}
|
|
947
|
-
// Targeted update for picker year - avoids full DOM rebuild
|
|
948
980
|
updatePickerYear(year) {
|
|
949
|
-
const input = this.
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
if (input) {
|
|
953
|
-
input.value = String(year);
|
|
954
|
-
}
|
|
955
|
-
const today = /* @__PURE__ */ new Date();
|
|
956
|
-
const todayYear = today.getFullYear();
|
|
957
|
-
const minYear = this.props.minYear ?? todayYear - 30;
|
|
958
|
-
const maxYear = this.props.maxYear ?? todayYear + 10;
|
|
959
|
-
const prevBtn = this.container.querySelector(
|
|
981
|
+
const input = this.querySelector("[data-year-input]");
|
|
982
|
+
if (input) input.value = String(year);
|
|
983
|
+
const prevBtn = this.querySelector(
|
|
960
984
|
'[data-action="year-prev"]'
|
|
961
985
|
);
|
|
962
|
-
const nextBtn = this.
|
|
986
|
+
const nextBtn = this.querySelector(
|
|
963
987
|
'[data-action="year-next"]'
|
|
964
988
|
);
|
|
965
|
-
if (prevBtn) prevBtn.disabled = year <= minYear;
|
|
966
|
-
if (nextBtn) nextBtn.disabled = year >= maxYear;
|
|
989
|
+
if (prevBtn) prevBtn.disabled = year <= this.minYear;
|
|
990
|
+
if (nextBtn) nextBtn.disabled = year >= this.maxYear;
|
|
967
991
|
}
|
|
968
992
|
dispatchMonthChange() {
|
|
993
|
+
if (!this.engine) return;
|
|
969
994
|
const vm = this.engine.getViewModel();
|
|
970
|
-
this.
|
|
971
|
-
new CustomEvent("
|
|
995
|
+
this.dispatchEvent(
|
|
996
|
+
new CustomEvent("cal-month-change", {
|
|
997
|
+
bubbles: true,
|
|
998
|
+
composed: true,
|
|
972
999
|
detail: { year: vm.currentYear, month: vm.currentMonth }
|
|
973
1000
|
})
|
|
974
1001
|
);
|
|
975
1002
|
}
|
|
1003
|
+
// Public API
|
|
976
1004
|
updateEvents(events) {
|
|
977
|
-
this.
|
|
1005
|
+
this.events = events;
|
|
978
1006
|
}
|
|
979
1007
|
updateTheme(theme) {
|
|
980
|
-
this.
|
|
981
|
-
this.applyTheme();
|
|
1008
|
+
this.theme = theme;
|
|
982
1009
|
}
|
|
983
1010
|
getCurrentDate() {
|
|
984
|
-
return this.engine
|
|
1011
|
+
return this.engine?.getViewModel().selectedDate ?? null;
|
|
985
1012
|
}
|
|
986
1013
|
goToDate(date) {
|
|
987
|
-
this.actions
|
|
1014
|
+
this.actions?.jump(date.getFullYear(), date.getMonth());
|
|
988
1015
|
}
|
|
989
1016
|
getEngine() {
|
|
1017
|
+
if (!this.engine)
|
|
1018
|
+
throw new Error("CalendarElement is not connected to the DOM");
|
|
990
1019
|
return this.engine;
|
|
991
1020
|
}
|
|
992
|
-
destroy() {
|
|
993
|
-
if (this.unsubscribe) {
|
|
994
|
-
this.unsubscribe();
|
|
995
|
-
this.unsubscribe = null;
|
|
996
|
-
}
|
|
997
|
-
if (this.delegatedClickHandler) {
|
|
998
|
-
this.container.removeEventListener("click", this.delegatedClickHandler);
|
|
999
|
-
this.delegatedClickHandler = null;
|
|
1000
|
-
}
|
|
1001
|
-
if (this.delegatedInputHandler) {
|
|
1002
|
-
this.container.removeEventListener("input", this.delegatedInputHandler);
|
|
1003
|
-
this.delegatedInputHandler = null;
|
|
1004
|
-
}
|
|
1005
|
-
if (this.delegatedBlurHandler) {
|
|
1006
|
-
this.container.removeEventListener(
|
|
1007
|
-
"blur",
|
|
1008
|
-
this.delegatedBlurHandler,
|
|
1009
|
-
true
|
|
1010
|
-
);
|
|
1011
|
-
this.delegatedBlurHandler = null;
|
|
1012
|
-
}
|
|
1013
|
-
if (this.delegatedKeydownHandler) {
|
|
1014
|
-
this.container.removeEventListener(
|
|
1015
|
-
"keydown",
|
|
1016
|
-
this.delegatedKeydownHandler
|
|
1017
|
-
);
|
|
1018
|
-
this.delegatedKeydownHandler = null;
|
|
1019
|
-
}
|
|
1020
|
-
if (this.clickOutsideHandler) {
|
|
1021
|
-
document.removeEventListener("click", this.clickOutsideHandler);
|
|
1022
|
-
this.clickOutsideHandler = null;
|
|
1023
|
-
}
|
|
1024
|
-
this.listenersAttached = false;
|
|
1025
|
-
this.engine.destroy();
|
|
1026
|
-
this.container.innerHTML = "";
|
|
1027
|
-
this.container.classList.remove("kalendly-calendar");
|
|
1028
|
-
if (this.props.className) {
|
|
1029
|
-
this.container.classList.remove(this.props.className);
|
|
1030
|
-
}
|
|
1031
|
-
}
|
|
1032
1021
|
};
|
|
1033
|
-
|
|
1034
|
-
|
|
1022
|
+
CalendarElement.observedAttributes = [
|
|
1023
|
+
"initial-date",
|
|
1024
|
+
"min-year",
|
|
1025
|
+
"max-year",
|
|
1026
|
+
"week-starts-on",
|
|
1027
|
+
"title",
|
|
1028
|
+
"use-short-month-names"
|
|
1029
|
+
];
|
|
1030
|
+
function defineCalendarElement(tagName = "kal-calendar") {
|
|
1031
|
+
if (typeof customElements !== "undefined" && !customElements.get(tagName)) {
|
|
1032
|
+
customElements.define(tagName, CalendarElement);
|
|
1033
|
+
}
|
|
1035
1034
|
}
|
|
1036
|
-
return __toCommonJS(
|
|
1035
|
+
return __toCommonJS(CalendarElement_exports);
|
|
1037
1036
|
})();
|
|
1037
|
+
if (typeof customElements !== 'undefined' && !customElements.get('kal-calendar')) { customElements.define('kal-calendar', Kalendly.CalendarElement); }
|
|
1038
1038
|
//# sourceMappingURL=index.umd.js.map
|