@fullcalendar/list 7.0.0-beta.4 → 7.0.0-beta.6

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/index.d.ts DELETED
@@ -1,27 +0,0 @@
1
- import { ClassNamesGenerator, FormatterInput, PluginDef } from '@fullcalendar/core';
2
- import { Identity, CustomContentGenerator, DidMountHandler, WillUnmountHandler, DateFormatter } from '@fullcalendar/core/internal';
3
- import { N as NoEventsContentArg, a as NoEventsMountArg } from './internal-common.js';
4
- export { N as NoEventsContentArg, a as NoEventsMountArg } from './internal-common.js';
5
- import '@fullcalendar/core/preact';
6
-
7
- declare const OPTION_REFINERS: {
8
- listDayFormat: typeof createFalsableFormatter;
9
- listDaySideFormat: typeof createFalsableFormatter;
10
- noEventsClassNames: Identity<ClassNamesGenerator<NoEventsContentArg>>;
11
- noEventsContent: Identity<CustomContentGenerator<NoEventsContentArg>>;
12
- noEventsDidMount: Identity<DidMountHandler<NoEventsMountArg>>;
13
- noEventsWillUnmount: Identity<WillUnmountHandler<NoEventsMountArg>>;
14
- };
15
- declare function createFalsableFormatter(input: FormatterInput | false): DateFormatter;
16
-
17
- type ExtraOptionRefiners = typeof OPTION_REFINERS;
18
- declare module '@fullcalendar/core/internal' {
19
- interface BaseOptionRefiners extends ExtraOptionRefiners {
20
- }
21
- }
22
- //# sourceMappingURL=ambient.d.ts.map
23
-
24
- declare const _default: PluginDef;
25
- //# sourceMappingURL=index.d.ts.map
26
-
27
- export { _default as default };
package/index.global.js DELETED
@@ -1,334 +0,0 @@
1
- /*!
2
- FullCalendar List View Plugin v7.0.0-beta.4
3
- Docs & License: https://fullcalendar.io/docs/list-view
4
- (c) 2024 Adam Shaw
5
- */
6
- FullCalendar.List = (function (exports, core, internal$1, preact) {
7
- 'use strict';
8
-
9
- class ListDayHeader extends internal$1.BaseComponent {
10
- render() {
11
- let { dateEnv, options, viewApi } = this.context;
12
- let { dayDate, todayRange } = this.props;
13
- let stickyHeaderDates = !this.props.forPrint && internal$1.getStickyHeaderDates(options);
14
- let dayMeta = internal$1.getDateMeta(dayDate, todayRange);
15
- // will ever be falsy?
16
- let text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : '';
17
- // will ever be falsy? also, BAD NAME "alt"
18
- let sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : '';
19
- let isNavLink = options.navLinks;
20
- let renderProps = Object.assign({ date: dateEnv.toDate(dayDate), view: viewApi, text,
21
- sideText, navLinkAttrs: isNavLink
22
- ? internal$1.buildNavLinkAttrs(this.context, dayDate, undefined, text)
23
- : {}, sideNavLinkAttrs: isNavLink
24
- // duplicate navLink, so does not need to be tabbable
25
- ? internal$1.buildNavLinkAttrs(this.context, dayDate, undefined, sideText, /* isTabbable = */ false)
26
- : {} }, dayMeta);
27
- // TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too)
28
- return (preact.createElement("div", { className: internal$1.joinClassNames('fc-list-day-outer', stickyHeaderDates && 'fc-list-day-outer-sticky') },
29
- preact.createElement(internal$1.ContentContainer, { tag: "div", className: internal$1.joinClassNames('fc-list-day', internal$1.getDayClassName(dayMeta)), attrs: Object.assign({ 'data-date': internal$1.formatDayString(dayDate) }, (dayMeta.isToday ? { 'aria-current': 'date' } : {})), renderProps: renderProps, generatorName: "dayHeaderContent", customGenerator: options.dayHeaderContent, defaultGenerator: renderInnerContent, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount })));
30
- }
31
- }
32
- function renderInnerContent(props) {
33
- return (preact.createElement(preact.Fragment, null,
34
- props.text && (preact.createElement("div", Object.assign({ className: "fc-list-day-text" }, props.navLinkAttrs), props.text)),
35
- props.sideText && (preact.createElement("div", Object.assign({ className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText))));
36
- }
37
-
38
- const DEFAULT_TIME_FORMAT = internal$1.createFormatter({
39
- hour: 'numeric',
40
- minute: '2-digit',
41
- meridiem: 'short',
42
- });
43
- class ListEvent extends internal$1.BaseComponent {
44
- constructor() {
45
- super(...arguments);
46
- this.handleTitleEl = (titleEl) => {
47
- if (this.disconnectTitleWidth) {
48
- this.disconnectTitleWidth();
49
- }
50
- if (titleEl) {
51
- this.disconnectTitleWidth = internal$1.watchWidth(titleEl, (titleWidth) => {
52
- internal$1.setRef(this.props.timeWidthRef, titleWidth);
53
- });
54
- }
55
- };
56
- }
57
- render() {
58
- let { props, context } = this;
59
- let { eventRange } = props;
60
- let { options } = context;
61
- let timeFormat = options.eventTimeFormat || DEFAULT_TIME_FORMAT;
62
- let [tag, attrs] = internal$1.getEventTagAndAttrs(eventRange, context);
63
- return (preact.createElement(internal$1.EventContainer, Object.assign({}, props, { tag: tag, attrs: Object.assign({ role: 'listitem' }, attrs), className: 'fc-list-event', defaultGenerator: renderEventTitleOnly, eventRange: eventRange, timeText: "", disableDragging: true, disableResizing: true }), (InnerContent, eventContentArg) => (preact.createElement(preact.Fragment, null,
64
- preact.createElement("div", { className: 'fc-list-event-time-outer', style: { width: props.timeOuterWidth } }, this.buildTimeContent(eventRange, props.slicedStart, props.slicedEnd, props.isStart, props.isEnd, timeFormat, context)),
65
- preact.createElement("div", { className: "fc-list-event-dot-outer" },
66
- preact.createElement("span", { className: "fc-list-event-dot", style: {
67
- borderColor: eventContentArg.borderColor || eventContentArg.backgroundColor,
68
- } })),
69
- preact.createElement(InnerContent, { tag: "div", className: 'fc-list-event-title' })))));
70
- }
71
- buildTimeContent(eventRange, // whole-day span
72
- slicedStart, // view-sliced whole-day span
73
- slicedEnd, // view-sliced whole-day span
74
- isStart, isEnd, timeFormat, context) {
75
- let { options } = context;
76
- if (options.displayEventTime !== false) {
77
- if (eventRange.def.allDay || (!isStart && !isEnd)) {
78
- let renderProps = {
79
- text: context.options.allDayText,
80
- view: context.viewApi,
81
- };
82
- return (preact.createElement(internal$1.ContentContainer, { tag: "div", className: 'fc-list-event-time', renderProps: renderProps, elRef: this.handleTitleEl, generatorName: "allDayContent", customGenerator: options.allDayContent, defaultGenerator: renderAllDayInner, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }));
83
- }
84
- else {
85
- return (preact.createElement("div", { className: "fc-list-event-time", ref: this.handleTitleEl }, internal$1.buildEventRangeTimeText(timeFormat, eventRange, slicedStart, slicedEnd, isStart, isEnd, context)));
86
- }
87
- }
88
- return null;
89
- }
90
- componentWillUnmount() {
91
- internal$1.setRef(this.props.timeWidthRef, null);
92
- }
93
- }
94
- function renderEventTitleOnly(renderProps) {
95
- return renderProps.event.title;
96
- }
97
- function renderAllDayInner(renderProps) {
98
- return renderProps.text;
99
- }
100
-
101
- class ListDay extends internal$1.BaseComponent {
102
- constructor() {
103
- super(...arguments);
104
- // memo
105
- this.sortEventSegs = internal$1.memoize(internal$1.sortEventSegs);
106
- // ref
107
- this.timeWidthRefMap = new internal$1.RefMap(() => {
108
- internal$1.afterSize(this.handleTimeWidths);
109
- });
110
- this.handleTimeWidths = () => {
111
- const timeWidthMap = this.timeWidthRefMap.current;
112
- let max = 0;
113
- for (const timeWidth of timeWidthMap.values()) {
114
- max = Math.max(max, timeWidth);
115
- }
116
- internal$1.setRef(this.props.timeWidthRef, max);
117
- };
118
- }
119
- render() {
120
- const { props, context, timeWidthRefMap } = this;
121
- const { nowDate, todayRange } = props;
122
- const { options } = context;
123
- const segs = this.sortEventSegs(props.segs, options.eventOrder);
124
- const fullDateStr = internal$1.buildDateStr(this.context, props.dayDate);
125
- return (preact.createElement("div", { role: 'listitem', "aria-label": fullDateStr, className: 'fc-list-day-and-events' },
126
- preact.createElement(ListDayHeader, { dayDate: props.dayDate, todayRange: todayRange, forPrint: props.forPrint }),
127
- preact.createElement("div", { role: 'list', "aria-label": options.eventsHint }, segs.map((seg) => {
128
- const key = internal$1.getEventKey(seg);
129
- return (preact.createElement(ListEvent, Object.assign({ key: key, eventRange: seg.eventRange, slicedStart: seg.slicedStart, slicedEnd: seg.slicedEnd, isStart: seg.isStart, isEnd: seg.isEnd, timeWidthRef: timeWidthRefMap.createRef(key), timeOuterWidth: props.timeOuterWidth, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false }, internal$1.getEventRangeMeta(seg.eventRange, todayRange, nowDate))));
130
- }))));
131
- }
132
- componentWillUnmount() {
133
- internal$1.setRef(this.props.timeWidthRef, null);
134
- }
135
- }
136
-
137
- /*
138
- Responsible for the scroller, and forwarding event-related actions into the "grid".
139
- */
140
- class ListView extends internal$1.DateComponent {
141
- constructor() {
142
- super(...arguments);
143
- // memo
144
- this.computeDateVars = internal$1.memoize(computeDateVars);
145
- this.eventStoreToSegs = internal$1.memoize(this._eventStoreToSegs);
146
- // ref
147
- this.timeWidthRefMap = new internal$1.RefMap(() => {
148
- internal$1.afterSize(this.handleTimeWidths);
149
- });
150
- this.setRootEl = (rootEl) => {
151
- if (rootEl) {
152
- this.context.registerInteractiveComponent(this, {
153
- el: rootEl,
154
- disableHits: true, // HACK to not do date-clicking/selecting
155
- });
156
- }
157
- else {
158
- this.context.unregisterInteractiveComponent(this);
159
- }
160
- };
161
- this.handleTimeWidths = () => {
162
- const timeWidthMap = this.timeWidthRefMap.current;
163
- let max = 0;
164
- for (const timeWidth of timeWidthMap.values()) {
165
- max = Math.max(max, timeWidth);
166
- }
167
- this.setState({ timeOuterWidth: max });
168
- };
169
- }
170
- render() {
171
- let { props, context } = this;
172
- let { options } = context;
173
- let { dayDates, dayRanges } = this.computeDateVars(props.dateProfile);
174
- let eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges);
175
- let verticalScrolling = !props.forPrint && !internal$1.getIsHeightAuto(options);
176
- return (preact.createElement(internal$1.ViewContainer, { viewSpec: context.viewSpec, className: 'fc-list fc-flex-col fc-border', elRef: this.setRootEl },
177
- preact.createElement(internal$1.Scroller // TODO: don't need heavyweight component
178
- , { vertical: verticalScrolling, className: verticalScrolling ? 'fc-liquid' : '' },
179
- this.renderSegList(eventSegs, dayDates),
180
- !eventSegs.length && this.renderEmptyMessage())));
181
- }
182
- renderEmptyMessage() {
183
- let { options, viewApi } = this.context;
184
- let renderProps = {
185
- text: options.noEventsText,
186
- view: viewApi,
187
- };
188
- return (preact.createElement(internal$1.ContentContainer, { tag: "div", attrs: {
189
- role: 'status', // does a polite announcement
190
- }, className: 'fc-list-empty', renderProps: renderProps, generatorName: "noEventsContent", customGenerator: options.noEventsContent, defaultGenerator: renderNoEventsInner, classNameGenerator: options.noEventsClassNames, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, (InnerContent) => (preact.createElement(InnerContent, { tag: "div", className: 'fc-list-empty-inner' }))));
191
- }
192
- renderSegList(allSegs, dayDates) {
193
- let segsByDay = groupSegsByDay(allSegs); // sparse array
194
- return (preact.createElement("div", { role: 'list', "aria-labelledby": this.props.labelId, "aria-label": this.props.labelStr },
195
- preact.createElement(internal$1.NowTimer, { unit: "day" }, (nowDate, todayRange) => {
196
- const dayNodes = [];
197
- for (let dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) {
198
- let daySegs = segsByDay[dayIndex];
199
- if (daySegs) { // sparse array, so might be undefined
200
- const dayDate = dayDates[dayIndex];
201
- const key = internal$1.formatDayString(dayDate);
202
- dayNodes.push(preact.createElement(ListDay, { key: key, dayDate: dayDate, nowDate: nowDate, todayRange: todayRange, segs: daySegs, forPrint: this.props.forPrint, timeWidthRef: this.timeWidthRefMap.createRef(key), timeOuterWidth: this.state.timeOuterWidth }));
203
- }
204
- }
205
- return (preact.createElement(preact.Fragment, null, dayNodes));
206
- })));
207
- }
208
- _eventStoreToSegs(eventStore, eventUiBases, dayRanges) {
209
- return this.eventRangesToSegs(internal$1.sliceEventStore(eventStore, eventUiBases,
210
- // HACKY to reference internal state...
211
- this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges);
212
- }
213
- eventRangesToSegs(fullDayEventRanges, dayRanges) {
214
- let segs = [];
215
- for (let fullDayEventRange of fullDayEventRanges) {
216
- segs.push(...this.eventRangeToSegs(fullDayEventRange, dayRanges));
217
- }
218
- return segs;
219
- }
220
- eventRangeToSegs(fullDayEventRange, dayRanges) {
221
- let fullDayRange = fullDayEventRange.range;
222
- let dayIndex;
223
- let segs = [];
224
- for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex += 1) {
225
- const slicedFullDayRange = internal$1.intersectRanges(fullDayRange, dayRanges[dayIndex]);
226
- if (slicedFullDayRange) {
227
- segs.push({
228
- eventRange: fullDayEventRange,
229
- slicedStart: slicedFullDayRange.start,
230
- slicedEnd: slicedFullDayRange.end,
231
- isStart: fullDayEventRange.isStart && fullDayRange.start.valueOf() === slicedFullDayRange.start.valueOf(),
232
- isEnd: fullDayEventRange.isEnd && fullDayRange.end.valueOf() === slicedFullDayRange.end.valueOf(),
233
- dayIndex,
234
- });
235
- }
236
- }
237
- return segs;
238
- }
239
- }
240
- function renderNoEventsInner(renderProps) {
241
- return renderProps.text;
242
- }
243
- function computeDateVars(dateProfile) {
244
- let dayStart = internal$1.startOfDay(dateProfile.renderRange.start);
245
- let viewEnd = dateProfile.renderRange.end;
246
- let dayDates = [];
247
- let dayRanges = [];
248
- while (dayStart < viewEnd) {
249
- dayDates.push(dayStart);
250
- dayRanges.push({
251
- start: dayStart,
252
- end: internal$1.addDays(dayStart, 1),
253
- });
254
- dayStart = internal$1.addDays(dayStart, 1);
255
- }
256
- return { dayDates, dayRanges };
257
- }
258
- // Returns a sparse array of arrays, segs grouped by their dayIndex
259
- function groupSegsByDay(segs) {
260
- let segsByDay = []; // sparse array
261
- let i;
262
- let seg;
263
- for (i = 0; i < segs.length; i += 1) {
264
- seg = segs[i];
265
- (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
266
- .push(seg);
267
- }
268
- return segsByDay;
269
- }
270
-
271
- const OPTION_REFINERS = {
272
- listDayFormat: createFalsableFormatter,
273
- listDaySideFormat: createFalsableFormatter,
274
- noEventsClassNames: internal$1.identity,
275
- noEventsContent: internal$1.identity,
276
- noEventsDidMount: internal$1.identity,
277
- noEventsWillUnmount: internal$1.identity,
278
- // noEventsText is defined in base options
279
- };
280
- function createFalsableFormatter(input) {
281
- return input === false ? null : internal$1.createFormatter(input);
282
- }
283
-
284
- var css_248z = ":root{--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-list-day,.fc-list-event-dot-outer,.fc-list-event-time,.fc-list-event-title{padding:8px 14px}.fc-direction-ltr .fc-list-event-dot-outer{padding-right:0}.fc-direction-rtl .fc-list-event-dot-outer{padding-left:0}.fc-list-empty{align-items:center;background-color:var(--fc-neutral-bg-color);display:flex;height:100%;justify-content:center}.fc-list-empty-inner{margin:5em 0}.fc-list-day,.fc-list-event:not(.fc-list-day-and-events:last-child .fc-list-event:last-child){border-bottom:1px solid var(--fc-border-color)}.fc-list-day-outer-sticky{background:var(--fc-page-bg-color);position:sticky;top:0}.fc-list-day{background:var(--fc-neutral-bg-color);display:flex;font-weight:700;justify-content:space-between}.fc-list-event{display:flex;flex-direction:row}a.fc-list-event{color:inherit;text-decoration:none}.fc-list-event:hover{background-color:var(--fc-list-event-hover-bg-color)}.fc-list-event-time-outer{display:flex;flex-direction:row}.fc-list-event-dot-outer,.fc-list-event-time{white-space:nowrap}.fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}a.fc-list-event:hover .fc-list-event-title{text-decoration:underline}";
285
- internal$1.injectStyles(css_248z);
286
-
287
- var plugin = core.createPlugin({
288
- name: '@fullcalendar/list',
289
- optionRefiners: OPTION_REFINERS,
290
- views: {
291
- list: {
292
- component: ListView,
293
- buttonTextKey: 'list',
294
- listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' }, // like "January 1, 2016"
295
- },
296
- listDay: {
297
- type: 'list',
298
- duration: { days: 1 },
299
- listDayFormat: { weekday: 'long' }, // day-of-week is all we need. full date is probably in headerToolbar
300
- },
301
- listWeek: {
302
- type: 'list',
303
- duration: { weeks: 1 },
304
- listDayFormat: { weekday: 'long' },
305
- listDaySideFormat: { month: 'long', day: 'numeric', year: 'numeric' },
306
- },
307
- listMonth: {
308
- type: 'list',
309
- duration: { month: 1 },
310
- listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have
311
- },
312
- listYear: {
313
- type: 'list',
314
- duration: { year: 1 },
315
- listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have
316
- },
317
- },
318
- });
319
-
320
- var internal = {
321
- __proto__: null,
322
- ListView: ListView
323
- };
324
-
325
- core.globalPlugins.push(plugin);
326
-
327
- exports.Internal = internal;
328
- exports["default"] = plugin;
329
-
330
- Object.defineProperty(exports, '__esModule', { value: true });
331
-
332
- return exports;
333
-
334
- })({}, FullCalendar, FullCalendar.Internal, FullCalendar.Preact);
@@ -1,6 +0,0 @@
1
- /*!
2
- FullCalendar List View Plugin v7.0.0-beta.4
3
- Docs & License: https://fullcalendar.io/docs/list-view
4
- (c) 2024 Adam Shaw
5
- */
6
- FullCalendar.List=function(e,t,n,i){"use strict";class a extends n.BaseComponent{render(){let{dateEnv:e,options:t,viewApi:a}=this.context,{dayDate:r,todayRange:l}=this.props,o=!this.props.forPrint&&n.getStickyHeaderDates(t),d=n.getDateMeta(r,l),c=t.listDayFormat?e.format(r,t.listDayFormat):"",m=t.listDaySideFormat?e.format(r,t.listDaySideFormat):"",u=t.navLinks,f=Object.assign({date:e.toDate(r),view:a,text:c,sideText:m,navLinkAttrs:u?n.buildNavLinkAttrs(this.context,r,void 0,c):{},sideNavLinkAttrs:u?n.buildNavLinkAttrs(this.context,r,void 0,m,!1):{}},d);return i.createElement("div",{className:n.joinClassNames("fc-list-day-outer",o&&"fc-list-day-outer-sticky")},i.createElement(n.ContentContainer,{tag:"div",className:n.joinClassNames("fc-list-day",n.getDayClassName(d)),attrs:Object.assign({"data-date":n.formatDayString(r)},d.isToday?{"aria-current":"date"}:{}),renderProps:f,generatorName:"dayHeaderContent",customGenerator:t.dayHeaderContent,defaultGenerator:s,classNameGenerator:t.dayHeaderClassNames,didMount:t.dayHeaderDidMount,willUnmount:t.dayHeaderWillUnmount}))}}function s(e){return i.createElement(i.Fragment,null,e.text&&i.createElement("div",Object.assign({className:"fc-list-day-text"},e.navLinkAttrs),e.text),e.sideText&&i.createElement("div",Object.assign({className:"fc-list-day-side-text"},e.sideNavLinkAttrs),e.sideText))}const r=n.createFormatter({hour:"numeric",minute:"2-digit",meridiem:"short"});class l extends n.BaseComponent{constructor(){super(...arguments),this.handleTitleEl=e=>{this.disconnectTitleWidth&&this.disconnectTitleWidth(),e&&(this.disconnectTitleWidth=n.watchWidth(e,e=>{n.setRef(this.props.timeWidthRef,e)}))}}render(){let{props:e,context:t}=this,{eventRange:a}=e,{options:s}=t,l=s.eventTimeFormat||r,[d,c]=n.getEventTagAndAttrs(a,t);return i.createElement(n.EventContainer,Object.assign({},e,{tag:d,attrs:Object.assign({role:"listitem"},c),className:"fc-list-event",defaultGenerator:o,eventRange:a,timeText:"",disableDragging:!0,disableResizing:!0}),(n,s)=>i.createElement(i.Fragment,null,i.createElement("div",{className:"fc-list-event-time-outer",style:{width:e.timeOuterWidth}},this.buildTimeContent(a,e.slicedStart,e.slicedEnd,e.isStart,e.isEnd,l,t)),i.createElement("div",{className:"fc-list-event-dot-outer"},i.createElement("span",{className:"fc-list-event-dot",style:{borderColor:s.borderColor||s.backgroundColor}})),i.createElement(n,{tag:"div",className:"fc-list-event-title"})))}buildTimeContent(e,t,a,s,r,l,o){let{options:c}=o;if(!1!==c.displayEventTime){if(e.def.allDay||!s&&!r){let e={text:o.options.allDayText,view:o.viewApi};return i.createElement(n.ContentContainer,{tag:"div",className:"fc-list-event-time",renderProps:e,elRef:this.handleTitleEl,generatorName:"allDayContent",customGenerator:c.allDayContent,defaultGenerator:d,classNameGenerator:c.allDayClassNames,didMount:c.allDayDidMount,willUnmount:c.allDayWillUnmount})}return i.createElement("div",{className:"fc-list-event-time",ref:this.handleTitleEl},n.buildEventRangeTimeText(l,e,t,a,s,r,o))}return null}componentWillUnmount(){n.setRef(this.props.timeWidthRef,null)}}function o(e){return e.event.title}function d(e){return e.text}class c extends n.BaseComponent{constructor(){super(...arguments),this.sortEventSegs=n.memoize(n.sortEventSegs),this.timeWidthRefMap=new n.RefMap(()=>{n.afterSize(this.handleTimeWidths)}),this.handleTimeWidths=()=>{const e=this.timeWidthRefMap.current;let t=0;for(const n of e.values())t=Math.max(t,n);n.setRef(this.props.timeWidthRef,t)}}render(){const{props:e,context:t,timeWidthRefMap:s}=this,{nowDate:r,todayRange:o}=e,{options:d}=t,c=this.sortEventSegs(e.segs,d.eventOrder),m=n.buildDateStr(this.context,e.dayDate);return i.createElement("div",{role:"listitem","aria-label":m,className:"fc-list-day-and-events"},i.createElement(a,{dayDate:e.dayDate,todayRange:o,forPrint:e.forPrint}),i.createElement("div",{role:"list","aria-label":d.eventsHint},c.map(t=>{const a=n.getEventKey(t);return i.createElement(l,Object.assign({key:a,eventRange:t.eventRange,slicedStart:t.slicedStart,slicedEnd:t.slicedEnd,isStart:t.isStart,isEnd:t.isEnd,timeWidthRef:s.createRef(a),timeOuterWidth:e.timeOuterWidth,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1},n.getEventRangeMeta(t.eventRange,o,r)))})))}componentWillUnmount(){n.setRef(this.props.timeWidthRef,null)}}class m extends n.DateComponent{constructor(){super(...arguments),this.computeDateVars=n.memoize(f),this.eventStoreToSegs=n.memoize(this._eventStoreToSegs),this.timeWidthRefMap=new n.RefMap(()=>{n.afterSize(this.handleTimeWidths)}),this.setRootEl=e=>{e?this.context.registerInteractiveComponent(this,{el:e,disableHits:!0}):this.context.unregisterInteractiveComponent(this)},this.handleTimeWidths=()=>{const e=this.timeWidthRefMap.current;let t=0;for(const n of e.values())t=Math.max(t,n);this.setState({timeOuterWidth:t})}}render(){let{props:e,context:t}=this,{options:a}=t,{dayDates:s,dayRanges:r}=this.computeDateVars(e.dateProfile),l=this.eventStoreToSegs(e.eventStore,e.eventUiBases,r),o=!e.forPrint&&!n.getIsHeightAuto(a);return i.createElement(n.ViewContainer,{viewSpec:t.viewSpec,className:"fc-list fc-flex-col fc-border",elRef:this.setRootEl},i.createElement(n.Scroller,{vertical:o,className:o?"fc-liquid":""},this.renderSegList(l,s),!l.length&&this.renderEmptyMessage()))}renderEmptyMessage(){let{options:e,viewApi:t}=this.context,a={text:e.noEventsText,view:t};return i.createElement(n.ContentContainer,{tag:"div",attrs:{role:"status"},className:"fc-list-empty",renderProps:a,generatorName:"noEventsContent",customGenerator:e.noEventsContent,defaultGenerator:u,classNameGenerator:e.noEventsClassNames,didMount:e.noEventsDidMount,willUnmount:e.noEventsWillUnmount},e=>i.createElement(e,{tag:"div",className:"fc-list-empty-inner"}))}renderSegList(e,t){let a=function(e){let t,n,i=[];for(t=0;t<e.length;t+=1)n=e[t],(i[n.dayIndex]||(i[n.dayIndex]=[])).push(n);return i}(e);return i.createElement("div",{role:"list","aria-labelledby":this.props.labelId,"aria-label":this.props.labelStr},i.createElement(n.NowTimer,{unit:"day"},(e,s)=>{const r=[];for(let l=0;l<a.length;l+=1){let o=a[l];if(o){const a=t[l],d=n.formatDayString(a);r.push(i.createElement(c,{key:d,dayDate:a,nowDate:e,todayRange:s,segs:o,forPrint:this.props.forPrint,timeWidthRef:this.timeWidthRefMap.createRef(d),timeOuterWidth:this.state.timeOuterWidth}))}}return i.createElement(i.Fragment,null,r)}))}_eventStoreToSegs(e,t,i){return this.eventRangesToSegs(n.sliceEventStore(e,t,this.props.dateProfile.activeRange,this.context.options.nextDayThreshold).fg,i)}eventRangesToSegs(e,t){let n=[];for(let i of e)n.push(...this.eventRangeToSegs(i,t));return n}eventRangeToSegs(e,t){let i,a=e.range,s=[];for(i=0;i<t.length;i+=1){const r=n.intersectRanges(a,t[i]);r&&s.push({eventRange:e,slicedStart:r.start,slicedEnd:r.end,isStart:e.isStart&&a.start.valueOf()===r.start.valueOf(),isEnd:e.isEnd&&a.end.valueOf()===r.end.valueOf(),dayIndex:i})}return s}}function u(e){return e.text}function f(e){let t=n.startOfDay(e.renderRange.start),i=e.renderRange.end,a=[],s=[];for(;t<i;)a.push(t),s.push({start:t,end:n.addDays(t,1)}),t=n.addDays(t,1);return{dayDates:a,dayRanges:s}}const h={listDayFormat:v,listDaySideFormat:v,noEventsClassNames:n.identity,noEventsContent:n.identity,noEventsDidMount:n.identity,noEventsWillUnmount:n.identity};function v(e){return!1===e?null:n.createFormatter(e)}n.injectStyles(":root{--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-list-day,.fc-list-event-dot-outer,.fc-list-event-time,.fc-list-event-title{padding:8px 14px}.fc-direction-ltr .fc-list-event-dot-outer{padding-right:0}.fc-direction-rtl .fc-list-event-dot-outer{padding-left:0}.fc-list-empty{align-items:center;background-color:var(--fc-neutral-bg-color);display:flex;height:100%;justify-content:center}.fc-list-empty-inner{margin:5em 0}.fc-list-day,.fc-list-event:not(.fc-list-day-and-events:last-child .fc-list-event:last-child){border-bottom:1px solid var(--fc-border-color)}.fc-list-day-outer-sticky{background:var(--fc-page-bg-color);position:sticky;top:0}.fc-list-day{background:var(--fc-neutral-bg-color);display:flex;font-weight:700;justify-content:space-between}.fc-list-event{display:flex;flex-direction:row}a.fc-list-event{color:inherit;text-decoration:none}.fc-list-event:hover{background-color:var(--fc-list-event-hover-bg-color)}.fc-list-event-time-outer{display:flex;flex-direction:row}.fc-list-event-dot-outer,.fc-list-event-time{white-space:nowrap}.fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}a.fc-list-event:hover .fc-list-event-title{text-decoration:underline}");var g=t.createPlugin({name:"@fullcalendar/list",optionRefiners:h,views:{list:{component:m,buttonTextKey:"list",listDayFormat:{month:"long",day:"numeric",year:"numeric"}},listDay:{type:"list",duration:{days:1},listDayFormat:{weekday:"long"}},listWeek:{type:"list",duration:{weeks:1},listDayFormat:{weekday:"long"},listDaySideFormat:{month:"long",day:"numeric",year:"numeric"}},listMonth:{type:"list",duration:{month:1},listDaySideFormat:{weekday:"long"}},listYear:{type:"list",duration:{year:1},listDaySideFormat:{weekday:"long"}}}}),y={__proto__:null,ListView:m};return t.globalPlugins.push(g),e.Internal=y,e.default=g,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal,FullCalendar.Preact);