@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/internal.js DELETED
@@ -1,261 +0,0 @@
1
- import { BaseComponent, getStickyHeaderDates, getDateMeta, buildNavLinkAttrs, joinClassNames, ContentContainer, getDayClassName, formatDayString, createFormatter, watchWidth, setRef, getEventRangeAnchorAttrs, EventContainer, buildEventRangeTimeText, memoize, sortEventSegs, RefMap, afterSize, getEventKey, getEventRangeMeta, DateComponent, getIsHeightAuto, ViewContainer, Scroller, NowTimer, sliceEventStore, intersectRanges, startOfDay, addDays, injectStyles } from '@fullcalendar/core/internal.js';
2
- import { createElement, Fragment } from '@fullcalendar/core/preact.js';
3
-
4
- class ListDayHeader extends BaseComponent {
5
- render() {
6
- let { dateEnv, options, viewApi } = this.context;
7
- let { dayDate, todayRange } = this.props;
8
- let stickyHeaderDates = !this.props.forPrint && getStickyHeaderDates(options);
9
- let dayMeta = getDateMeta(dayDate, todayRange);
10
- // will ever be falsy?
11
- let text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : '';
12
- // will ever be falsy? also, BAD NAME "alt"
13
- let sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : '';
14
- let renderProps = Object.assign({ date: dateEnv.toDate(dayDate), view: viewApi, text,
15
- sideText, navLinkAttrs: buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta);
16
- // TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too)
17
- return (createElement("div", { className: joinClassNames('fc-list-day-outer', stickyHeaderDates && 'fc-list-day-outer-sticky') },
18
- createElement(ContentContainer, { tag: "div", className: joinClassNames('fc-list-day', getDayClassName(dayMeta)), attrs: {
19
- 'data-date': formatDayString(dayDate),
20
- }, renderProps: renderProps, generatorName: "dayHeaderContent", customGenerator: options.dayHeaderContent, defaultGenerator: renderInnerContent, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount })));
21
- }
22
- }
23
- function renderInnerContent(props) {
24
- return (createElement(Fragment, null,
25
- props.text && (createElement("a", Object.assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text)),
26
- props.sideText && ( /* not keyboard tabbable */createElement("a", Object.assign({ className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText))));
27
- }
28
-
29
- const DEFAULT_TIME_FORMAT = createFormatter({
30
- hour: 'numeric',
31
- minute: '2-digit',
32
- meridiem: 'short',
33
- });
34
- class ListEvent extends BaseComponent {
35
- constructor() {
36
- super(...arguments);
37
- this.handleTitleEl = (titleEl) => {
38
- if (this.disconnectTitleWidth) {
39
- this.disconnectTitleWidth();
40
- }
41
- if (titleEl) {
42
- this.disconnectTitleWidth = watchWidth(titleEl, (titleWidth) => {
43
- setRef(this.props.timeWidthRef, titleWidth);
44
- });
45
- }
46
- };
47
- }
48
- render() {
49
- let { props, context } = this;
50
- let { eventRange } = props;
51
- let { options } = context;
52
- let timeFormat = options.eventTimeFormat || DEFAULT_TIME_FORMAT;
53
- let anchorAttrs = getEventRangeAnchorAttrs(eventRange, context);
54
- return (createElement(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) => (createElement(Fragment, null,
55
- 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)),
56
- createElement("div", { className: "fc-list-event-dot-outer" },
57
- createElement("span", { className: "fc-list-event-dot", style: {
58
- borderColor: eventContentArg.borderColor || eventContentArg.backgroundColor,
59
- } })),
60
- createElement(InnerContent, { tag: "div", className: 'fc-list-event-title' })))));
61
- }
62
- buildTimeContent(eventRange, // whole-day span
63
- slicedStart, // view-sliced whole-day span
64
- slicedEnd, // view-sliced whole-day span
65
- isStart, isEnd, timeFormat, context) {
66
- let { options } = context;
67
- if (options.displayEventTime !== false) {
68
- if (eventRange.def.allDay || (!isStart && !isEnd)) {
69
- let renderProps = {
70
- text: context.options.allDayText,
71
- view: context.viewApi,
72
- };
73
- return (createElement(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 }));
74
- }
75
- else {
76
- return (createElement("div", { className: "fc-list-event-time", ref: this.handleTitleEl }, buildEventRangeTimeText(timeFormat, eventRange, slicedStart, slicedEnd, isStart, isEnd, context)));
77
- }
78
- }
79
- return null;
80
- }
81
- componentWillUnmount() {
82
- setRef(this.props.timeWidthRef, null);
83
- }
84
- }
85
- function renderEventTitleOnly(renderProps) {
86
- return renderProps.event.title;
87
- }
88
- function renderAllDayInner(renderProps) {
89
- return renderProps.text;
90
- }
91
-
92
- class ListDay extends BaseComponent {
93
- constructor() {
94
- super(...arguments);
95
- // memo
96
- this.sortEventSegs = memoize(sortEventSegs);
97
- // ref
98
- this.timeWidthRefMap = new RefMap(() => {
99
- afterSize(this.handleTimeWidths);
100
- });
101
- this.handleTimeWidths = () => {
102
- const timeWidthMap = this.timeWidthRefMap.current;
103
- let max = 0;
104
- for (const timeWidth of timeWidthMap.values()) {
105
- max = Math.max(max, timeWidth);
106
- }
107
- setRef(this.props.timeWidthRef, max);
108
- };
109
- }
110
- render() {
111
- const { props, context, timeWidthRefMap } = this;
112
- const { nowDate, todayRange } = props;
113
- const { options } = context;
114
- const segs = this.sortEventSegs(props.segs, options.eventOrder);
115
- return (createElement("div", { className: 'fc-list-day-and-events' },
116
- createElement(ListDayHeader, { dayDate: props.dayDate, todayRange: todayRange, forPrint: props.forPrint }),
117
- segs.map((seg) => {
118
- const key = getEventKey(seg);
119
- return (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 }, getEventRangeMeta(seg.eventRange, todayRange, nowDate))));
120
- })));
121
- }
122
- componentWillUnmount() {
123
- setRef(this.props.timeWidthRef, null);
124
- }
125
- }
126
-
127
- /*
128
- Responsible for the scroller, and forwarding event-related actions into the "grid".
129
- */
130
- class ListView extends DateComponent {
131
- constructor() {
132
- super(...arguments);
133
- // memo
134
- this.computeDateVars = memoize(computeDateVars);
135
- this.eventStoreToSegs = memoize(this._eventStoreToSegs);
136
- // ref
137
- this.timeWidthRefMap = new RefMap(() => {
138
- afterSize(this.handleTimeWidths);
139
- });
140
- this.setRootEl = (rootEl) => {
141
- if (rootEl) {
142
- this.context.registerInteractiveComponent(this, {
143
- el: rootEl,
144
- disableHits: true, // HACK to not do date-clicking/selecting
145
- });
146
- }
147
- else {
148
- this.context.unregisterInteractiveComponent(this);
149
- }
150
- };
151
- this.handleTimeWidths = () => {
152
- const timeWidthMap = this.timeWidthRefMap.current;
153
- let max = 0;
154
- for (const timeWidth of timeWidthMap.values()) {
155
- max = Math.max(max, timeWidth);
156
- }
157
- this.setState({ timeOuterWidth: max });
158
- };
159
- }
160
- render() {
161
- let { props, context } = this;
162
- let { options } = context;
163
- let { dayDates, dayRanges } = this.computeDateVars(props.dateProfile);
164
- let eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges);
165
- let verticalScrolling = !props.forPrint && !getIsHeightAuto(options);
166
- return (createElement(ViewContainer, { elRef: this.setRootEl, className: 'fc-list fc-flex-col fc-border', viewSpec: context.viewSpec },
167
- createElement(Scroller // TODO: don't need heavyweight component
168
- , { vertical: verticalScrolling, className: verticalScrolling ? 'fc-liquid' : '' }, eventSegs.length > 0 ?
169
- this.renderSegList(eventSegs, dayDates) :
170
- this.renderEmptyMessage())));
171
- }
172
- renderEmptyMessage() {
173
- let { options, viewApi } = this.context;
174
- let renderProps = {
175
- text: options.noEventsText,
176
- view: viewApi,
177
- };
178
- return (createElement(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) => (createElement(InnerContent, { tag: "div", className: 'fc-list-empty-inner' }))));
179
- }
180
- renderSegList(allSegs, dayDates) {
181
- let segsByDay = groupSegsByDay(allSegs); // sparse array
182
- return (createElement(NowTimer, { unit: "day" }, (nowDate, todayRange) => {
183
- const dayNodes = [];
184
- for (let dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) {
185
- let daySegs = segsByDay[dayIndex];
186
- if (daySegs) { // sparse array, so might be undefined
187
- const dayDate = dayDates[dayIndex];
188
- const key = formatDayString(dayDate);
189
- dayNodes.push(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 }));
190
- }
191
- }
192
- return (createElement(Fragment, null, dayNodes));
193
- }));
194
- }
195
- _eventStoreToSegs(eventStore, eventUiBases, dayRanges) {
196
- return this.eventRangesToSegs(sliceEventStore(eventStore, eventUiBases,
197
- // HACKY to reference internal state...
198
- this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges);
199
- }
200
- eventRangesToSegs(fullDayEventRanges, dayRanges) {
201
- let segs = [];
202
- for (let fullDayEventRange of fullDayEventRanges) {
203
- segs.push(...this.eventRangeToSegs(fullDayEventRange, dayRanges));
204
- }
205
- return segs;
206
- }
207
- eventRangeToSegs(fullDayEventRange, dayRanges) {
208
- let fullDayRange = fullDayEventRange.range;
209
- let dayIndex;
210
- let segs = [];
211
- for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex += 1) {
212
- const slicedFullDayRange = intersectRanges(fullDayRange, dayRanges[dayIndex]);
213
- if (slicedFullDayRange) {
214
- segs.push({
215
- eventRange: fullDayEventRange,
216
- slicedStart: slicedFullDayRange.start,
217
- slicedEnd: slicedFullDayRange.end,
218
- isStart: fullDayEventRange.isStart && fullDayRange.start.valueOf() === slicedFullDayRange.start.valueOf(),
219
- isEnd: fullDayEventRange.isEnd && fullDayRange.end.valueOf() === slicedFullDayRange.end.valueOf(),
220
- dayIndex,
221
- });
222
- }
223
- }
224
- return segs;
225
- }
226
- }
227
- function renderNoEventsInner(renderProps) {
228
- return renderProps.text;
229
- }
230
- function computeDateVars(dateProfile) {
231
- let dayStart = startOfDay(dateProfile.renderRange.start);
232
- let viewEnd = dateProfile.renderRange.end;
233
- let dayDates = [];
234
- let dayRanges = [];
235
- while (dayStart < viewEnd) {
236
- dayDates.push(dayStart);
237
- dayRanges.push({
238
- start: dayStart,
239
- end: addDays(dayStart, 1),
240
- });
241
- dayStart = addDays(dayStart, 1);
242
- }
243
- return { dayDates, dayRanges };
244
- }
245
- // Returns a sparse array of arrays, segs grouped by their dayIndex
246
- function groupSegsByDay(segs) {
247
- let segsByDay = []; // sparse array
248
- let i;
249
- let seg;
250
- for (i = 0; i < segs.length; i += 1) {
251
- seg = segs[i];
252
- (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
253
- .push(seg);
254
- }
255
- return segsByDay;
256
- }
257
-
258
- 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}";
259
- injectStyles(css_248z);
260
-
261
- export { ListView };
File without changes