@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/LICENSE.md +1 -1
- package/README.md +6 -1
- package/cjs/index.cjs +60 -0
- package/cjs/internal.cjs +228 -0
- package/esm/index.d.ts +54 -0
- package/{index.js → esm/index.js} +15 -11
- package/{internal-common.d.ts → esm/internal-common.d.ts} +5 -10
- package/esm/internal.js +220 -0
- package/global.js +290 -0
- package/global.min.js +6 -0
- package/package.json +22 -19
- package/index.cjs +0 -56
- package/index.d.ts +0 -27
- package/index.global.js +0 -326
- package/index.global.min.js +0 -6
- package/internal.cjs +0 -265
- package/internal.js +0 -261
- /package/{internal.d.ts → esm/internal.d.ts} +0 -0
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);
|
package/index.global.min.js
DELETED
|
@@ -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;
|