@fullcalendar/list 7.0.0-beta.3 → 7.0.0-beta.5

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