@fullcalendar/list 6.0.2 → 6.0.3
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.cjs → index.esm.js} +13 -17
- package/index.global.js +1 -1
- package/index.global.min.js +1 -1
- package/index.js +17 -13
- package/{internal.cjs → internal.esm.js} +56 -60
- package/internal.js +60 -56
- package/package.json +8 -12
- package/index.js.map +0 -1
- package/internal.js.map +0 -1
|
@@ -1,34 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var index_cjs = require('@fullcalendar/core/index.cjs');
|
|
6
|
-
var internalCommon = require('./internal.cjs');
|
|
7
|
-
var internal_cjs = require('@fullcalendar/core/internal.cjs');
|
|
8
|
-
require('@fullcalendar/core/preact.cjs');
|
|
1
|
+
import { createPlugin } from '@fullcalendar/core';
|
|
2
|
+
import { ListView } from './internal.esm.js';
|
|
3
|
+
import { identity, createFormatter, injectStyles } from '@fullcalendar/core/internal';
|
|
4
|
+
import '@fullcalendar/core/preact';
|
|
9
5
|
|
|
10
6
|
const OPTION_REFINERS = {
|
|
11
7
|
listDayFormat: createFalsableFormatter,
|
|
12
8
|
listDaySideFormat: createFalsableFormatter,
|
|
13
|
-
noEventsClassNames:
|
|
14
|
-
noEventsContent:
|
|
15
|
-
noEventsDidMount:
|
|
16
|
-
noEventsWillUnmount:
|
|
9
|
+
noEventsClassNames: identity,
|
|
10
|
+
noEventsContent: identity,
|
|
11
|
+
noEventsDidMount: identity,
|
|
12
|
+
noEventsWillUnmount: identity,
|
|
17
13
|
// noEventsText is defined in base options
|
|
18
14
|
};
|
|
19
15
|
function createFalsableFormatter(input) {
|
|
20
|
-
return input === false ? null :
|
|
16
|
+
return input === false ? null : createFormatter(input);
|
|
21
17
|
}
|
|
22
18
|
|
|
23
19
|
var css_248z = ":root{--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-theme-standard .fc-list{border:1px solid var(--fc-border-color)}.fc .fc-list-empty{align-items:center;background-color:var(--fc-neutral-bg-color);display:flex;height:100%;justify-content:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{border-style:hidden;width:100%}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:\"\";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .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}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}";
|
|
24
|
-
|
|
20
|
+
injectStyles(css_248z);
|
|
25
21
|
|
|
26
|
-
var index =
|
|
22
|
+
var index = createPlugin({
|
|
27
23
|
name: '@fullcalendar/list',
|
|
28
24
|
optionRefiners: OPTION_REFINERS,
|
|
29
25
|
views: {
|
|
30
26
|
list: {
|
|
31
|
-
component:
|
|
27
|
+
component: ListView,
|
|
32
28
|
buttonTextKey: 'list',
|
|
33
29
|
listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' }, // like "January 1, 2016"
|
|
34
30
|
},
|
|
@@ -56,4 +52,4 @@ var index = index_cjs.createPlugin({
|
|
|
56
52
|
},
|
|
57
53
|
});
|
|
58
54
|
|
|
59
|
-
|
|
55
|
+
export { index as default };
|
package/index.global.js
CHANGED
package/index.global.min.js
CHANGED
package/index.js
CHANGED
|
@@ -1,30 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var core = require('@fullcalendar/core');
|
|
6
|
+
var internalCommon = require('./internal.js');
|
|
7
|
+
var internal = require('@fullcalendar/core/internal');
|
|
8
|
+
require('@fullcalendar/core/preact');
|
|
5
9
|
|
|
6
10
|
const OPTION_REFINERS = {
|
|
7
11
|
listDayFormat: createFalsableFormatter,
|
|
8
12
|
listDaySideFormat: createFalsableFormatter,
|
|
9
|
-
noEventsClassNames: identity,
|
|
10
|
-
noEventsContent: identity,
|
|
11
|
-
noEventsDidMount: identity,
|
|
12
|
-
noEventsWillUnmount: identity,
|
|
13
|
+
noEventsClassNames: internal.identity,
|
|
14
|
+
noEventsContent: internal.identity,
|
|
15
|
+
noEventsDidMount: internal.identity,
|
|
16
|
+
noEventsWillUnmount: internal.identity,
|
|
13
17
|
// noEventsText is defined in base options
|
|
14
18
|
};
|
|
15
19
|
function createFalsableFormatter(input) {
|
|
16
|
-
return input === false ? null : createFormatter(input);
|
|
20
|
+
return input === false ? null : internal.createFormatter(input);
|
|
17
21
|
}
|
|
18
22
|
|
|
19
23
|
var css_248z = ":root{--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-theme-standard .fc-list{border:1px solid var(--fc-border-color)}.fc .fc-list-empty{align-items:center;background-color:var(--fc-neutral-bg-color);display:flex;height:100%;justify-content:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{border-style:hidden;width:100%}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:\"\";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .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}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}";
|
|
20
|
-
injectStyles(css_248z);
|
|
24
|
+
internal.injectStyles(css_248z);
|
|
21
25
|
|
|
22
|
-
var index = createPlugin({
|
|
26
|
+
var index = core.createPlugin({
|
|
23
27
|
name: '@fullcalendar/list',
|
|
24
28
|
optionRefiners: OPTION_REFINERS,
|
|
25
29
|
views: {
|
|
26
30
|
list: {
|
|
27
|
-
component: ListView,
|
|
31
|
+
component: internalCommon.ListView,
|
|
28
32
|
buttonTextKey: 'list',
|
|
29
33
|
listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' }, // like "January 1, 2016"
|
|
30
34
|
},
|
|
@@ -52,4 +56,4 @@ var index = createPlugin({
|
|
|
52
56
|
},
|
|
53
57
|
});
|
|
54
58
|
|
|
55
|
-
|
|
59
|
+
exports["default"] = index;
|
|
@@ -1,75 +1,71 @@
|
|
|
1
|
-
|
|
1
|
+
import { BaseComponent, getUniqueDomId, getDateMeta, buildNavLinkAttrs, ContentContainer, getDayClassNames, formatDayString, createFormatter, EventContainer, getSegAnchorAttrs, isMultiDayRange, buildSegTimeText, DateComponent, memoize, ViewContainer, Scroller, NowTimer, sortEventSegs, getSegMeta, sliceEventStore, intersectRanges, startOfDay, addDays } from '@fullcalendar/core/internal';
|
|
2
|
+
import { createElement, Fragment } from '@fullcalendar/core/preact';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var internal_cjs = require('@fullcalendar/core/internal.cjs');
|
|
6
|
-
var preact_cjs = require('@fullcalendar/core/preact.cjs');
|
|
7
|
-
|
|
8
|
-
class ListViewHeaderRow extends internal_cjs.BaseComponent {
|
|
4
|
+
class ListViewHeaderRow extends BaseComponent {
|
|
9
5
|
constructor() {
|
|
10
6
|
super(...arguments);
|
|
11
7
|
this.state = {
|
|
12
|
-
textId:
|
|
8
|
+
textId: getUniqueDomId(),
|
|
13
9
|
};
|
|
14
10
|
}
|
|
15
11
|
render() {
|
|
16
12
|
let { theme, dateEnv, options, viewApi } = this.context;
|
|
17
13
|
let { cellId, dayDate, todayRange } = this.props;
|
|
18
14
|
let { textId } = this.state;
|
|
19
|
-
let dayMeta =
|
|
15
|
+
let dayMeta = getDateMeta(dayDate, todayRange);
|
|
20
16
|
// will ever be falsy?
|
|
21
17
|
let text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : '';
|
|
22
18
|
// will ever be falsy? also, BAD NAME "alt"
|
|
23
19
|
let sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : '';
|
|
24
20
|
let renderProps = Object.assign({ date: dateEnv.toDate(dayDate), view: viewApi, textId,
|
|
25
21
|
text,
|
|
26
|
-
sideText, navLinkAttrs:
|
|
22
|
+
sideText, navLinkAttrs: buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta);
|
|
27
23
|
// TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too)
|
|
28
|
-
return (
|
|
24
|
+
return (createElement(ContentContainer, { elTag: "tr", elClasses: [
|
|
29
25
|
'fc-list-day',
|
|
30
|
-
...
|
|
26
|
+
...getDayClassNames(dayMeta, theme),
|
|
31
27
|
], elAttrs: {
|
|
32
|
-
'data-date':
|
|
28
|
+
'data-date': formatDayString(dayDate),
|
|
33
29
|
}, renderProps: renderProps, generatorName: "dayHeaderContent", generator: options.dayHeaderContent || renderInnerContent, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => ( // TODO: force-hide top border based on :first-child
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
createElement("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId },
|
|
31
|
+
createElement(InnerContent, { elTag: "div", elClasses: [
|
|
36
32
|
'fc-list-day-cushion',
|
|
37
33
|
theme.getClass('tableCellShaded'),
|
|
38
34
|
] })))));
|
|
39
35
|
}
|
|
40
36
|
}
|
|
41
37
|
function renderInnerContent(props) {
|
|
42
|
-
return (
|
|
43
|
-
props.text && (
|
|
44
|
-
props.sideText && ( /* not keyboard tabbable */
|
|
38
|
+
return (createElement(Fragment, null,
|
|
39
|
+
props.text && (createElement("a", Object.assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text)),
|
|
40
|
+
props.sideText && ( /* not keyboard tabbable */createElement("a", Object.assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText))));
|
|
45
41
|
}
|
|
46
42
|
|
|
47
|
-
const DEFAULT_TIME_FORMAT =
|
|
43
|
+
const DEFAULT_TIME_FORMAT = createFormatter({
|
|
48
44
|
hour: 'numeric',
|
|
49
45
|
minute: '2-digit',
|
|
50
46
|
meridiem: 'short',
|
|
51
47
|
});
|
|
52
|
-
class ListViewEventRow extends
|
|
48
|
+
class ListViewEventRow extends BaseComponent {
|
|
53
49
|
render() {
|
|
54
50
|
let { props, context } = this;
|
|
55
51
|
let { options } = context;
|
|
56
52
|
let { seg, timeHeaderId, eventHeaderId, dateHeaderId } = props;
|
|
57
53
|
let timeFormat = options.eventTimeFormat || DEFAULT_TIME_FORMAT;
|
|
58
|
-
return (
|
|
54
|
+
return (createElement(EventContainer, Object.assign({}, props, { elTag: "tr", elClasses: [
|
|
59
55
|
'fc-list-event',
|
|
60
56
|
seg.eventRange.def.url && 'fc-event-forced-url',
|
|
61
|
-
], defaultGenerator: () => renderEventInnerContent(seg, context) /* weird */, seg: seg, timeText: "", disableDragging: true, disableResizing: true }), (InnerContent, eventContentArg) => (
|
|
57
|
+
], defaultGenerator: () => renderEventInnerContent(seg, context) /* weird */, seg: seg, timeText: "", disableDragging: true, disableResizing: true }), (InnerContent, eventContentArg) => (createElement(Fragment, null,
|
|
62
58
|
buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId),
|
|
63
|
-
|
|
64
|
-
|
|
59
|
+
createElement("td", { "aria-hidden": true, className: "fc-list-event-graphic" },
|
|
60
|
+
createElement("span", { className: "fc-list-event-dot", style: {
|
|
65
61
|
borderColor: eventContentArg.borderColor || eventContentArg.backgroundColor,
|
|
66
62
|
} })),
|
|
67
|
-
|
|
63
|
+
createElement(InnerContent, { elTag: "td", elClasses: ['fc-list-event-title'], elAttrs: { headers: `${eventHeaderId} ${dateHeaderId}` } })))));
|
|
68
64
|
}
|
|
69
65
|
}
|
|
70
66
|
function renderEventInnerContent(seg, context) {
|
|
71
|
-
let interactiveAttrs =
|
|
72
|
-
return (
|
|
67
|
+
let interactiveAttrs = getSegAnchorAttrs(seg, context);
|
|
68
|
+
return (createElement("a", Object.assign({}, interactiveAttrs), seg.eventRange.def.title));
|
|
73
69
|
}
|
|
74
70
|
function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId) {
|
|
75
71
|
let { options } = context;
|
|
@@ -81,30 +77,30 @@ function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId)
|
|
|
81
77
|
if (eventDef.allDay) {
|
|
82
78
|
doAllDay = true;
|
|
83
79
|
}
|
|
84
|
-
else if (
|
|
80
|
+
else if (isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead?
|
|
85
81
|
if (seg.isStart) {
|
|
86
|
-
timeText =
|
|
82
|
+
timeText = buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end);
|
|
87
83
|
}
|
|
88
84
|
else if (seg.isEnd) {
|
|
89
|
-
timeText =
|
|
85
|
+
timeText = buildSegTimeText(seg, timeFormat, context, null, null, seg.start, eventInstance.range.end);
|
|
90
86
|
}
|
|
91
87
|
else {
|
|
92
88
|
doAllDay = true;
|
|
93
89
|
}
|
|
94
90
|
}
|
|
95
91
|
else {
|
|
96
|
-
timeText =
|
|
92
|
+
timeText = buildSegTimeText(seg, timeFormat, context);
|
|
97
93
|
}
|
|
98
94
|
if (doAllDay) {
|
|
99
95
|
let renderProps = {
|
|
100
96
|
text: context.options.allDayText,
|
|
101
97
|
view: context.viewApi,
|
|
102
98
|
};
|
|
103
|
-
return (
|
|
99
|
+
return (createElement(ContentContainer, { elTag: "td", elClasses: ['fc-list-event-time'], elAttrs: {
|
|
104
100
|
headers: `${timeHeaderId} ${dateHeaderId}`,
|
|
105
101
|
}, renderProps: renderProps, generatorName: "allDayContent", generator: options.allDayContent || renderAllDayInner, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }));
|
|
106
102
|
}
|
|
107
|
-
return (
|
|
103
|
+
return (createElement("td", { className: "fc-list-event-time" }, timeText));
|
|
108
104
|
}
|
|
109
105
|
return null;
|
|
110
106
|
}
|
|
@@ -115,15 +111,15 @@ function renderAllDayInner(renderProps) {
|
|
|
115
111
|
/*
|
|
116
112
|
Responsible for the scroller, and forwarding event-related actions into the "grid".
|
|
117
113
|
*/
|
|
118
|
-
class ListView extends
|
|
114
|
+
class ListView extends DateComponent {
|
|
119
115
|
constructor() {
|
|
120
116
|
super(...arguments);
|
|
121
|
-
this.computeDateVars =
|
|
122
|
-
this.eventStoreToSegs =
|
|
117
|
+
this.computeDateVars = memoize(computeDateVars);
|
|
118
|
+
this.eventStoreToSegs = memoize(this._eventStoreToSegs);
|
|
123
119
|
this.state = {
|
|
124
|
-
timeHeaderId:
|
|
125
|
-
eventHeaderId:
|
|
126
|
-
dateHeaderIdRoot:
|
|
120
|
+
timeHeaderId: getUniqueDomId(),
|
|
121
|
+
eventHeaderId: getUniqueDomId(),
|
|
122
|
+
dateHeaderIdRoot: getUniqueDomId(),
|
|
127
123
|
};
|
|
128
124
|
this.setRootEl = (rootEl) => {
|
|
129
125
|
if (rootEl) {
|
|
@@ -140,14 +136,14 @@ class ListView extends internal_cjs.DateComponent {
|
|
|
140
136
|
let { props, context } = this;
|
|
141
137
|
let { dayDates, dayRanges } = this.computeDateVars(props.dateProfile);
|
|
142
138
|
let eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges);
|
|
143
|
-
return (
|
|
139
|
+
return (createElement(ViewContainer, { elRef: this.setRootEl, elClasses: [
|
|
144
140
|
'fc-list',
|
|
145
141
|
context.theme.getClass('table'),
|
|
146
142
|
context.options.stickyHeaderDates !== false ?
|
|
147
143
|
'fc-list-sticky' :
|
|
148
144
|
'',
|
|
149
145
|
], viewSpec: context.viewSpec },
|
|
150
|
-
|
|
146
|
+
createElement(Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ?
|
|
151
147
|
this.renderSegList(eventSegs, dayDates) :
|
|
152
148
|
this.renderEmptyMessage())));
|
|
153
149
|
}
|
|
@@ -157,38 +153,38 @@ class ListView extends internal_cjs.DateComponent {
|
|
|
157
153
|
text: options.noEventsText,
|
|
158
154
|
view: viewApi,
|
|
159
155
|
};
|
|
160
|
-
return (
|
|
156
|
+
return (createElement(ContentContainer, { elTag: "div", elClasses: ['fc-list-empty'], renderProps: renderProps, generatorName: "noEventsContent", generator: options.noEventsContent || renderNoEventsInner, classNameGenerator: options.noEventsClassNames, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, (InnerContent) => (createElement(InnerContent, { elTag: "div", elClasses: ['fc-list-empty-cushion'] }))));
|
|
161
157
|
}
|
|
162
158
|
renderSegList(allSegs, dayDates) {
|
|
163
159
|
let { theme, options } = this.context;
|
|
164
160
|
let { timeHeaderId, eventHeaderId, dateHeaderIdRoot } = this.state;
|
|
165
161
|
let segsByDay = groupSegsByDay(allSegs); // sparse array
|
|
166
|
-
return (
|
|
162
|
+
return (createElement(NowTimer, { unit: "day" }, (nowDate, todayRange) => {
|
|
167
163
|
let innerNodes = [];
|
|
168
164
|
for (let dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) {
|
|
169
165
|
let daySegs = segsByDay[dayIndex];
|
|
170
166
|
if (daySegs) { // sparse array, so might be undefined
|
|
171
|
-
let dayStr =
|
|
167
|
+
let dayStr = formatDayString(dayDates[dayIndex]);
|
|
172
168
|
let dateHeaderId = dateHeaderIdRoot + '-' + dayStr;
|
|
173
169
|
// append a day header
|
|
174
|
-
innerNodes.push(
|
|
175
|
-
daySegs =
|
|
170
|
+
innerNodes.push(createElement(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange }));
|
|
171
|
+
daySegs = sortEventSegs(daySegs, options.eventOrder);
|
|
176
172
|
for (let seg of daySegs) {
|
|
177
|
-
innerNodes.push(
|
|
173
|
+
innerNodes.push(createElement(ListViewEventRow, Object.assign({ key: dayStr + ':' + seg.eventRange.instance.instanceId /* are multiple segs for an instanceId */, seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, timeHeaderId: timeHeaderId, eventHeaderId: eventHeaderId, dateHeaderId: dateHeaderId }, getSegMeta(seg, todayRange, nowDate))));
|
|
178
174
|
}
|
|
179
175
|
}
|
|
180
176
|
}
|
|
181
|
-
return (
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
177
|
+
return (createElement("table", { className: 'fc-list-table ' + theme.getClass('table') },
|
|
178
|
+
createElement("thead", null,
|
|
179
|
+
createElement("tr", null,
|
|
180
|
+
createElement("th", { scope: "col", id: timeHeaderId }, options.timeHint),
|
|
181
|
+
createElement("th", { scope: "col", "aria-hidden": true }),
|
|
182
|
+
createElement("th", { scope: "col", id: eventHeaderId }, options.eventHint))),
|
|
183
|
+
createElement("tbody", null, innerNodes)));
|
|
188
184
|
}));
|
|
189
185
|
}
|
|
190
186
|
_eventStoreToSegs(eventStore, eventUiBases, dayRanges) {
|
|
191
|
-
return this.eventRangesToSegs(
|
|
187
|
+
return this.eventRangesToSegs(sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges);
|
|
192
188
|
}
|
|
193
189
|
eventRangesToSegs(eventRanges, dayRanges) {
|
|
194
190
|
let segs = [];
|
|
@@ -207,7 +203,7 @@ class ListView extends internal_cjs.DateComponent {
|
|
|
207
203
|
let seg;
|
|
208
204
|
let segs = [];
|
|
209
205
|
for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex += 1) {
|
|
210
|
-
segRange =
|
|
206
|
+
segRange = intersectRanges(range, dayRanges[dayIndex]);
|
|
211
207
|
if (segRange) {
|
|
212
208
|
seg = {
|
|
213
209
|
component: this,
|
|
@@ -238,7 +234,7 @@ function renderNoEventsInner(renderProps) {
|
|
|
238
234
|
return renderProps.text;
|
|
239
235
|
}
|
|
240
236
|
function computeDateVars(dateProfile) {
|
|
241
|
-
let dayStart =
|
|
237
|
+
let dayStart = startOfDay(dateProfile.renderRange.start);
|
|
242
238
|
let viewEnd = dateProfile.renderRange.end;
|
|
243
239
|
let dayDates = [];
|
|
244
240
|
let dayRanges = [];
|
|
@@ -246,9 +242,9 @@ function computeDateVars(dateProfile) {
|
|
|
246
242
|
dayDates.push(dayStart);
|
|
247
243
|
dayRanges.push({
|
|
248
244
|
start: dayStart,
|
|
249
|
-
end:
|
|
245
|
+
end: addDays(dayStart, 1),
|
|
250
246
|
});
|
|
251
|
-
dayStart =
|
|
247
|
+
dayStart = addDays(dayStart, 1);
|
|
252
248
|
}
|
|
253
249
|
return { dayDates, dayRanges };
|
|
254
250
|
}
|
|
@@ -265,4 +261,4 @@ function groupSegsByDay(segs) {
|
|
|
265
261
|
return segsByDay;
|
|
266
262
|
}
|
|
267
263
|
|
|
268
|
-
|
|
264
|
+
export { ListView };
|
package/internal.js
CHANGED
|
@@ -1,71 +1,75 @@
|
|
|
1
|
-
|
|
2
|
-
import { createElement, Fragment } from '@fullcalendar/core/preact.js';
|
|
1
|
+
'use strict';
|
|
3
2
|
|
|
4
|
-
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var internal = require('@fullcalendar/core/internal');
|
|
6
|
+
var preact = require('@fullcalendar/core/preact');
|
|
7
|
+
|
|
8
|
+
class ListViewHeaderRow extends internal.BaseComponent {
|
|
5
9
|
constructor() {
|
|
6
10
|
super(...arguments);
|
|
7
11
|
this.state = {
|
|
8
|
-
textId: getUniqueDomId(),
|
|
12
|
+
textId: internal.getUniqueDomId(),
|
|
9
13
|
};
|
|
10
14
|
}
|
|
11
15
|
render() {
|
|
12
16
|
let { theme, dateEnv, options, viewApi } = this.context;
|
|
13
17
|
let { cellId, dayDate, todayRange } = this.props;
|
|
14
18
|
let { textId } = this.state;
|
|
15
|
-
let dayMeta = getDateMeta(dayDate, todayRange);
|
|
19
|
+
let dayMeta = internal.getDateMeta(dayDate, todayRange);
|
|
16
20
|
// will ever be falsy?
|
|
17
21
|
let text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : '';
|
|
18
22
|
// will ever be falsy? also, BAD NAME "alt"
|
|
19
23
|
let sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : '';
|
|
20
24
|
let renderProps = Object.assign({ date: dateEnv.toDate(dayDate), view: viewApi, textId,
|
|
21
25
|
text,
|
|
22
|
-
sideText, navLinkAttrs: buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta);
|
|
26
|
+
sideText, navLinkAttrs: internal.buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: internal.buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta);
|
|
23
27
|
// TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too)
|
|
24
|
-
return (createElement(ContentContainer, { elTag: "tr", elClasses: [
|
|
28
|
+
return (preact.createElement(internal.ContentContainer, { elTag: "tr", elClasses: [
|
|
25
29
|
'fc-list-day',
|
|
26
|
-
...getDayClassNames(dayMeta, theme),
|
|
30
|
+
...internal.getDayClassNames(dayMeta, theme),
|
|
27
31
|
], elAttrs: {
|
|
28
|
-
'data-date': formatDayString(dayDate),
|
|
32
|
+
'data-date': internal.formatDayString(dayDate),
|
|
29
33
|
}, renderProps: renderProps, generatorName: "dayHeaderContent", generator: options.dayHeaderContent || renderInnerContent, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => ( // TODO: force-hide top border based on :first-child
|
|
30
|
-
createElement("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId },
|
|
31
|
-
createElement(InnerContent, { elTag: "div", elClasses: [
|
|
34
|
+
preact.createElement("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId },
|
|
35
|
+
preact.createElement(InnerContent, { elTag: "div", elClasses: [
|
|
32
36
|
'fc-list-day-cushion',
|
|
33
37
|
theme.getClass('tableCellShaded'),
|
|
34
38
|
] })))));
|
|
35
39
|
}
|
|
36
40
|
}
|
|
37
41
|
function renderInnerContent(props) {
|
|
38
|
-
return (createElement(Fragment, null,
|
|
39
|
-
props.text && (createElement("a", Object.assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text)),
|
|
40
|
-
props.sideText && ( /* not keyboard tabbable */createElement("a", Object.assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText))));
|
|
42
|
+
return (preact.createElement(preact.Fragment, null,
|
|
43
|
+
props.text && (preact.createElement("a", Object.assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text)),
|
|
44
|
+
props.sideText && ( /* not keyboard tabbable */preact.createElement("a", Object.assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText))));
|
|
41
45
|
}
|
|
42
46
|
|
|
43
|
-
const DEFAULT_TIME_FORMAT = createFormatter({
|
|
47
|
+
const DEFAULT_TIME_FORMAT = internal.createFormatter({
|
|
44
48
|
hour: 'numeric',
|
|
45
49
|
minute: '2-digit',
|
|
46
50
|
meridiem: 'short',
|
|
47
51
|
});
|
|
48
|
-
class ListViewEventRow extends BaseComponent {
|
|
52
|
+
class ListViewEventRow extends internal.BaseComponent {
|
|
49
53
|
render() {
|
|
50
54
|
let { props, context } = this;
|
|
51
55
|
let { options } = context;
|
|
52
56
|
let { seg, timeHeaderId, eventHeaderId, dateHeaderId } = props;
|
|
53
57
|
let timeFormat = options.eventTimeFormat || DEFAULT_TIME_FORMAT;
|
|
54
|
-
return (createElement(EventContainer, Object.assign({}, props, { elTag: "tr", elClasses: [
|
|
58
|
+
return (preact.createElement(internal.EventContainer, Object.assign({}, props, { elTag: "tr", elClasses: [
|
|
55
59
|
'fc-list-event',
|
|
56
60
|
seg.eventRange.def.url && 'fc-event-forced-url',
|
|
57
|
-
], defaultGenerator: () => renderEventInnerContent(seg, context) /* weird */, seg: seg, timeText: "", disableDragging: true, disableResizing: true }), (InnerContent, eventContentArg) => (createElement(Fragment, null,
|
|
61
|
+
], defaultGenerator: () => renderEventInnerContent(seg, context) /* weird */, seg: seg, timeText: "", disableDragging: true, disableResizing: true }), (InnerContent, eventContentArg) => (preact.createElement(preact.Fragment, null,
|
|
58
62
|
buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId),
|
|
59
|
-
createElement("td", { "aria-hidden": true, className: "fc-list-event-graphic" },
|
|
60
|
-
createElement("span", { className: "fc-list-event-dot", style: {
|
|
63
|
+
preact.createElement("td", { "aria-hidden": true, className: "fc-list-event-graphic" },
|
|
64
|
+
preact.createElement("span", { className: "fc-list-event-dot", style: {
|
|
61
65
|
borderColor: eventContentArg.borderColor || eventContentArg.backgroundColor,
|
|
62
66
|
} })),
|
|
63
|
-
createElement(InnerContent, { elTag: "td", elClasses: ['fc-list-event-title'], elAttrs: { headers: `${eventHeaderId} ${dateHeaderId}` } })))));
|
|
67
|
+
preact.createElement(InnerContent, { elTag: "td", elClasses: ['fc-list-event-title'], elAttrs: { headers: `${eventHeaderId} ${dateHeaderId}` } })))));
|
|
64
68
|
}
|
|
65
69
|
}
|
|
66
70
|
function renderEventInnerContent(seg, context) {
|
|
67
|
-
let interactiveAttrs = getSegAnchorAttrs(seg, context);
|
|
68
|
-
return (createElement("a", Object.assign({}, interactiveAttrs), seg.eventRange.def.title));
|
|
71
|
+
let interactiveAttrs = internal.getSegAnchorAttrs(seg, context);
|
|
72
|
+
return (preact.createElement("a", Object.assign({}, interactiveAttrs), seg.eventRange.def.title));
|
|
69
73
|
}
|
|
70
74
|
function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId) {
|
|
71
75
|
let { options } = context;
|
|
@@ -77,30 +81,30 @@ function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId)
|
|
|
77
81
|
if (eventDef.allDay) {
|
|
78
82
|
doAllDay = true;
|
|
79
83
|
}
|
|
80
|
-
else if (isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead?
|
|
84
|
+
else if (internal.isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead?
|
|
81
85
|
if (seg.isStart) {
|
|
82
|
-
timeText = buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end);
|
|
86
|
+
timeText = internal.buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end);
|
|
83
87
|
}
|
|
84
88
|
else if (seg.isEnd) {
|
|
85
|
-
timeText = buildSegTimeText(seg, timeFormat, context, null, null, seg.start, eventInstance.range.end);
|
|
89
|
+
timeText = internal.buildSegTimeText(seg, timeFormat, context, null, null, seg.start, eventInstance.range.end);
|
|
86
90
|
}
|
|
87
91
|
else {
|
|
88
92
|
doAllDay = true;
|
|
89
93
|
}
|
|
90
94
|
}
|
|
91
95
|
else {
|
|
92
|
-
timeText = buildSegTimeText(seg, timeFormat, context);
|
|
96
|
+
timeText = internal.buildSegTimeText(seg, timeFormat, context);
|
|
93
97
|
}
|
|
94
98
|
if (doAllDay) {
|
|
95
99
|
let renderProps = {
|
|
96
100
|
text: context.options.allDayText,
|
|
97
101
|
view: context.viewApi,
|
|
98
102
|
};
|
|
99
|
-
return (createElement(ContentContainer, { elTag: "td", elClasses: ['fc-list-event-time'], elAttrs: {
|
|
103
|
+
return (preact.createElement(internal.ContentContainer, { elTag: "td", elClasses: ['fc-list-event-time'], elAttrs: {
|
|
100
104
|
headers: `${timeHeaderId} ${dateHeaderId}`,
|
|
101
105
|
}, renderProps: renderProps, generatorName: "allDayContent", generator: options.allDayContent || renderAllDayInner, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }));
|
|
102
106
|
}
|
|
103
|
-
return (createElement("td", { className: "fc-list-event-time" }, timeText));
|
|
107
|
+
return (preact.createElement("td", { className: "fc-list-event-time" }, timeText));
|
|
104
108
|
}
|
|
105
109
|
return null;
|
|
106
110
|
}
|
|
@@ -111,15 +115,15 @@ function renderAllDayInner(renderProps) {
|
|
|
111
115
|
/*
|
|
112
116
|
Responsible for the scroller, and forwarding event-related actions into the "grid".
|
|
113
117
|
*/
|
|
114
|
-
class ListView extends DateComponent {
|
|
118
|
+
class ListView extends internal.DateComponent {
|
|
115
119
|
constructor() {
|
|
116
120
|
super(...arguments);
|
|
117
|
-
this.computeDateVars = memoize(computeDateVars);
|
|
118
|
-
this.eventStoreToSegs = memoize(this._eventStoreToSegs);
|
|
121
|
+
this.computeDateVars = internal.memoize(computeDateVars);
|
|
122
|
+
this.eventStoreToSegs = internal.memoize(this._eventStoreToSegs);
|
|
119
123
|
this.state = {
|
|
120
|
-
timeHeaderId: getUniqueDomId(),
|
|
121
|
-
eventHeaderId: getUniqueDomId(),
|
|
122
|
-
dateHeaderIdRoot: getUniqueDomId(),
|
|
124
|
+
timeHeaderId: internal.getUniqueDomId(),
|
|
125
|
+
eventHeaderId: internal.getUniqueDomId(),
|
|
126
|
+
dateHeaderIdRoot: internal.getUniqueDomId(),
|
|
123
127
|
};
|
|
124
128
|
this.setRootEl = (rootEl) => {
|
|
125
129
|
if (rootEl) {
|
|
@@ -136,14 +140,14 @@ class ListView extends DateComponent {
|
|
|
136
140
|
let { props, context } = this;
|
|
137
141
|
let { dayDates, dayRanges } = this.computeDateVars(props.dateProfile);
|
|
138
142
|
let eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges);
|
|
139
|
-
return (createElement(ViewContainer, { elRef: this.setRootEl, elClasses: [
|
|
143
|
+
return (preact.createElement(internal.ViewContainer, { elRef: this.setRootEl, elClasses: [
|
|
140
144
|
'fc-list',
|
|
141
145
|
context.theme.getClass('table'),
|
|
142
146
|
context.options.stickyHeaderDates !== false ?
|
|
143
147
|
'fc-list-sticky' :
|
|
144
148
|
'',
|
|
145
149
|
], viewSpec: context.viewSpec },
|
|
146
|
-
createElement(Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ?
|
|
150
|
+
preact.createElement(internal.Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ?
|
|
147
151
|
this.renderSegList(eventSegs, dayDates) :
|
|
148
152
|
this.renderEmptyMessage())));
|
|
149
153
|
}
|
|
@@ -153,38 +157,38 @@ class ListView extends DateComponent {
|
|
|
153
157
|
text: options.noEventsText,
|
|
154
158
|
view: viewApi,
|
|
155
159
|
};
|
|
156
|
-
return (createElement(ContentContainer, { elTag: "div", elClasses: ['fc-list-empty'], renderProps: renderProps, generatorName: "noEventsContent", generator: options.noEventsContent || renderNoEventsInner, classNameGenerator: options.noEventsClassNames, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, (InnerContent) => (createElement(InnerContent, { elTag: "div", elClasses: ['fc-list-empty-cushion'] }))));
|
|
160
|
+
return (preact.createElement(internal.ContentContainer, { elTag: "div", elClasses: ['fc-list-empty'], renderProps: renderProps, generatorName: "noEventsContent", generator: options.noEventsContent || renderNoEventsInner, classNameGenerator: options.noEventsClassNames, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, (InnerContent) => (preact.createElement(InnerContent, { elTag: "div", elClasses: ['fc-list-empty-cushion'] }))));
|
|
157
161
|
}
|
|
158
162
|
renderSegList(allSegs, dayDates) {
|
|
159
163
|
let { theme, options } = this.context;
|
|
160
164
|
let { timeHeaderId, eventHeaderId, dateHeaderIdRoot } = this.state;
|
|
161
165
|
let segsByDay = groupSegsByDay(allSegs); // sparse array
|
|
162
|
-
return (createElement(NowTimer, { unit: "day" }, (nowDate, todayRange) => {
|
|
166
|
+
return (preact.createElement(internal.NowTimer, { unit: "day" }, (nowDate, todayRange) => {
|
|
163
167
|
let innerNodes = [];
|
|
164
168
|
for (let dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) {
|
|
165
169
|
let daySegs = segsByDay[dayIndex];
|
|
166
170
|
if (daySegs) { // sparse array, so might be undefined
|
|
167
|
-
let dayStr = formatDayString(dayDates[dayIndex]);
|
|
171
|
+
let dayStr = internal.formatDayString(dayDates[dayIndex]);
|
|
168
172
|
let dateHeaderId = dateHeaderIdRoot + '-' + dayStr;
|
|
169
173
|
// append a day header
|
|
170
|
-
innerNodes.push(createElement(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange }));
|
|
171
|
-
daySegs = sortEventSegs(daySegs, options.eventOrder);
|
|
174
|
+
innerNodes.push(preact.createElement(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange }));
|
|
175
|
+
daySegs = internal.sortEventSegs(daySegs, options.eventOrder);
|
|
172
176
|
for (let seg of daySegs) {
|
|
173
|
-
innerNodes.push(createElement(ListViewEventRow, Object.assign({ key: dayStr + ':' + seg.eventRange.instance.instanceId /* are multiple segs for an instanceId */, seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, timeHeaderId: timeHeaderId, eventHeaderId: eventHeaderId, dateHeaderId: dateHeaderId }, getSegMeta(seg, todayRange, nowDate))));
|
|
177
|
+
innerNodes.push(preact.createElement(ListViewEventRow, Object.assign({ key: dayStr + ':' + seg.eventRange.instance.instanceId /* are multiple segs for an instanceId */, seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, timeHeaderId: timeHeaderId, eventHeaderId: eventHeaderId, dateHeaderId: dateHeaderId }, internal.getSegMeta(seg, todayRange, nowDate))));
|
|
174
178
|
}
|
|
175
179
|
}
|
|
176
180
|
}
|
|
177
|
-
return (createElement("table", { className: 'fc-list-table ' + theme.getClass('table') },
|
|
178
|
-
createElement("thead", null,
|
|
179
|
-
createElement("tr", null,
|
|
180
|
-
createElement("th", { scope: "col", id: timeHeaderId }, options.timeHint),
|
|
181
|
-
createElement("th", { scope: "col", "aria-hidden": true }),
|
|
182
|
-
createElement("th", { scope: "col", id: eventHeaderId }, options.eventHint))),
|
|
183
|
-
createElement("tbody", null, innerNodes)));
|
|
181
|
+
return (preact.createElement("table", { className: 'fc-list-table ' + theme.getClass('table') },
|
|
182
|
+
preact.createElement("thead", null,
|
|
183
|
+
preact.createElement("tr", null,
|
|
184
|
+
preact.createElement("th", { scope: "col", id: timeHeaderId }, options.timeHint),
|
|
185
|
+
preact.createElement("th", { scope: "col", "aria-hidden": true }),
|
|
186
|
+
preact.createElement("th", { scope: "col", id: eventHeaderId }, options.eventHint))),
|
|
187
|
+
preact.createElement("tbody", null, innerNodes)));
|
|
184
188
|
}));
|
|
185
189
|
}
|
|
186
190
|
_eventStoreToSegs(eventStore, eventUiBases, dayRanges) {
|
|
187
|
-
return this.eventRangesToSegs(sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges);
|
|
191
|
+
return this.eventRangesToSegs(internal.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges);
|
|
188
192
|
}
|
|
189
193
|
eventRangesToSegs(eventRanges, dayRanges) {
|
|
190
194
|
let segs = [];
|
|
@@ -203,7 +207,7 @@ class ListView extends DateComponent {
|
|
|
203
207
|
let seg;
|
|
204
208
|
let segs = [];
|
|
205
209
|
for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex += 1) {
|
|
206
|
-
segRange = intersectRanges(range, dayRanges[dayIndex]);
|
|
210
|
+
segRange = internal.intersectRanges(range, dayRanges[dayIndex]);
|
|
207
211
|
if (segRange) {
|
|
208
212
|
seg = {
|
|
209
213
|
component: this,
|
|
@@ -234,7 +238,7 @@ function renderNoEventsInner(renderProps) {
|
|
|
234
238
|
return renderProps.text;
|
|
235
239
|
}
|
|
236
240
|
function computeDateVars(dateProfile) {
|
|
237
|
-
let dayStart = startOfDay(dateProfile.renderRange.start);
|
|
241
|
+
let dayStart = internal.startOfDay(dateProfile.renderRange.start);
|
|
238
242
|
let viewEnd = dateProfile.renderRange.end;
|
|
239
243
|
let dayDates = [];
|
|
240
244
|
let dayRanges = [];
|
|
@@ -242,9 +246,9 @@ function computeDateVars(dateProfile) {
|
|
|
242
246
|
dayDates.push(dayStart);
|
|
243
247
|
dayRanges.push({
|
|
244
248
|
start: dayStart,
|
|
245
|
-
end: addDays(dayStart, 1),
|
|
249
|
+
end: internal.addDays(dayStart, 1),
|
|
246
250
|
});
|
|
247
|
-
dayStart = addDays(dayStart, 1);
|
|
251
|
+
dayStart = internal.addDays(dayStart, 1);
|
|
248
252
|
}
|
|
249
253
|
return { dayDates, dayRanges };
|
|
250
254
|
}
|
|
@@ -261,4 +265,4 @@ function groupSegsByDay(segs) {
|
|
|
261
265
|
return segsByDay;
|
|
262
266
|
}
|
|
263
267
|
|
|
264
|
-
|
|
268
|
+
exports.ListView = ListView;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fullcalendar/list",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.3",
|
|
4
4
|
"title": "FullCalendar List View Plugin",
|
|
5
5
|
"description": "Display events on a calendar view that looks like a bulleted list",
|
|
6
6
|
"keywords": [
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
],
|
|
13
13
|
"homepage": "https://fullcalendar.io/docs/list-view",
|
|
14
14
|
"peerDependencies": {
|
|
15
|
-
"@fullcalendar/core": "~6.0.
|
|
15
|
+
"@fullcalendar/core": "~6.0.3"
|
|
16
16
|
},
|
|
17
17
|
"type": "module",
|
|
18
18
|
"bugs": "https://fullcalendar.io/reporting-bugs",
|
|
@@ -28,26 +28,22 @@
|
|
|
28
28
|
"url": "http://arshaw.com/"
|
|
29
29
|
},
|
|
30
30
|
"copyright": "2022 Adam Shaw",
|
|
31
|
-
"main": "./index.cjs",
|
|
32
|
-
"module": "./index.js",
|
|
33
31
|
"types": "./index.d.ts",
|
|
32
|
+
"main": "./index.js",
|
|
33
|
+
"module": "./index.esm.js",
|
|
34
34
|
"unpkg": "./index.global.min.js",
|
|
35
35
|
"jsdelivr": "./index.global.min.js",
|
|
36
36
|
"exports": {
|
|
37
37
|
"./package.json": "./package.json",
|
|
38
|
-
"./index.cjs": "./index.cjs",
|
|
39
|
-
"./index.js": "./index.js",
|
|
40
38
|
".": {
|
|
41
39
|
"types": "./index.d.ts",
|
|
42
|
-
"require": "./index.
|
|
43
|
-
"import": "./index.js"
|
|
40
|
+
"require": "./index.js",
|
|
41
|
+
"import": "./index.esm.js"
|
|
44
42
|
},
|
|
45
|
-
"./internal.cjs": "./internal.cjs",
|
|
46
|
-
"./internal.js": "./internal.js",
|
|
47
43
|
"./internal": {
|
|
48
44
|
"types": "./internal.d.ts",
|
|
49
|
-
"require": "./internal.
|
|
50
|
-
"import": "./internal.js"
|
|
45
|
+
"require": "./internal.js",
|
|
46
|
+
"import": "./internal.esm.js"
|
|
51
47
|
}
|
|
52
48
|
},
|
|
53
49
|
"sideEffects": false
|
package/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/option-refiners.ts","../src/index.ts"],"sourcesContent":["import { ClassNamesGenerator, FormatterInput } from '@fullcalendar/core'\nimport {\n identity,\n Identity,\n CustomContentGenerator,\n DidMountHandler,\n WillUnmountHandler,\n createFormatter,\n DateFormatter,\n} from '@fullcalendar/core/internal'\nimport {\n NoEventsContentArg,\n NoEventsMountArg,\n} from './public-types.js'\n\nexport const OPTION_REFINERS = {\n listDayFormat: createFalsableFormatter, // defaults specified in list plugins\n listDaySideFormat: createFalsableFormatter, // \"\n\n noEventsClassNames: identity as Identity<ClassNamesGenerator<NoEventsContentArg>>,\n noEventsContent: identity as Identity<CustomContentGenerator<NoEventsContentArg>>,\n noEventsDidMount: identity as Identity<DidMountHandler<NoEventsMountArg>>,\n noEventsWillUnmount: identity as Identity<WillUnmountHandler<NoEventsMountArg>>,\n\n // noEventsText is defined in base options\n}\n\nfunction createFalsableFormatter(input: FormatterInput | false): DateFormatter {\n return input === false ? null : createFormatter(input)\n}\n","import { createPlugin, PluginDef } from '@fullcalendar/core'\nimport { ListView } from './ListView.js'\nimport { OPTION_REFINERS } from './option-refiners.js'\nimport './ambient.js'\nimport './index.css'\n\nexport default createPlugin({\n name: '<%= pkgName %>',\n optionRefiners: OPTION_REFINERS,\n views: {\n list: {\n component: ListView,\n buttonTextKey: 'list', // what to lookup in locale files\n listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' }, // like \"January 1, 2016\"\n },\n listDay: {\n type: 'list',\n duration: { days: 1 },\n listDayFormat: { weekday: 'long' }, // day-of-week is all we need. full date is probably in headerToolbar\n },\n listWeek: {\n type: 'list',\n duration: { weeks: 1 },\n listDayFormat: { weekday: 'long' }, // day-of-week is more important\n listDaySideFormat: { month: 'long', day: 'numeric', year: 'numeric' },\n },\n listMonth: {\n type: 'list',\n duration: { month: 1 },\n listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have\n },\n listYear: {\n type: 'list',\n duration: { year: 1 },\n listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have\n },\n },\n}) as PluginDef\n\nexport * from './public-types.js'\n"],"names":[],"mappings":";;;;;AAeO,MAAM,eAAe,GAAG;AAC7B,IAAA,aAAa,EAAE,uBAAuB;AACtC,IAAA,iBAAiB,EAAE,uBAAuB;AAE1C,IAAA,kBAAkB,EAAE,QAA6D;AACjF,IAAA,eAAe,EAAE,QAAgE;AACjF,IAAA,gBAAgB,EAAE,QAAuD;AACzE,IAAA,mBAAmB,EAAE,QAA0D;;CAGhF,CAAA;AAED,SAAS,uBAAuB,CAAC,KAA6B,EAAA;AAC5D,IAAA,OAAO,KAAK,KAAK,KAAK,GAAG,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;AACxD;;;;;ACvBA,YAAe,YAAY,CAAC;AAC1B,IAAA,IAAI,EAAE,oBAAgB;AACtB,IAAA,cAAc,EAAE,eAAe;AAC/B,IAAA,KAAK,EAAE;AACL,QAAA,IAAI,EAAE;AACJ,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,aAAa,EAAE,MAAM;AACrB,YAAA,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AAClE,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;AACrB,YAAA,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;AACnC,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;AACtB,YAAA,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;AAClC,YAAA,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AACtE,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;AACtB,YAAA,iBAAiB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;AACvC,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;AACrB,YAAA,iBAAiB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;AACvC,SAAA;AACF,KAAA;AACF,CAAA,CAAc;;;;"}
|
package/internal.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"internal.js","sources":["../src/ListViewHeaderRow.tsx","../src/ListViewEventRow.tsx","../src/ListView.tsx"],"sourcesContent":["import { DayHeaderContentArg } from '@fullcalendar/core'\nimport {\n BaseComponent, DateMarker, DateRange, getDateMeta,\n getDayClassNames, formatDayString, buildNavLinkAttrs, getUniqueDomId, ContentContainer,\n} from '@fullcalendar/core/internal'\nimport { createElement, Fragment } from '@fullcalendar/core/preact'\n\nexport interface ListViewHeaderRowProps {\n cellId: string\n dayDate: DateMarker\n todayRange: DateRange\n}\n\nexport class ListViewHeaderRow extends BaseComponent<ListViewHeaderRowProps> {\n state = {\n textId: getUniqueDomId(),\n }\n\n render() {\n let { theme, dateEnv, options, viewApi } = this.context\n let { cellId, dayDate, todayRange } = this.props\n let { textId } = this.state\n let dayMeta = getDateMeta(dayDate, todayRange)\n\n // will ever be falsy?\n let text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : ''\n\n // will ever be falsy? also, BAD NAME \"alt\"\n let sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : ''\n\n let renderProps: RenderProps = {\n date: dateEnv.toDate(dayDate),\n view: viewApi,\n textId,\n text,\n sideText,\n navLinkAttrs: buildNavLinkAttrs(this.context, dayDate),\n sideNavLinkAttrs: buildNavLinkAttrs(this.context, dayDate, 'day', false),\n ...dayMeta,\n }\n\n // TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too)\n return (\n <ContentContainer\n elTag=\"tr\"\n elClasses={[\n 'fc-list-day',\n ...getDayClassNames(dayMeta, theme),\n ]}\n elAttrs={{\n 'data-date': formatDayString(dayDate),\n }}\n renderProps={renderProps}\n generatorName=\"dayHeaderContent\"\n generator={options.dayHeaderContent || renderInnerContent}\n classNameGenerator={options.dayHeaderClassNames}\n didMount={options.dayHeaderDidMount}\n willUnmount={options.dayHeaderWillUnmount}\n >\n {(InnerContent) => ( // TODO: force-hide top border based on :first-child\n <th scope=\"colgroup\" colSpan={3} id={cellId} aria-labelledby={textId}>\n <InnerContent\n elTag=\"div\"\n elClasses={[\n 'fc-list-day-cushion',\n theme.getClass('tableCellShaded'),\n ]}\n />\n </th>\n )}\n </ContentContainer>\n )\n }\n}\n\n// doesn't enforce much since DayCellContentArg allow extra props\ninterface RenderProps extends DayHeaderContentArg {\n textId: string // for aria-labelledby\n text: string\n sideText: string\n}\n\nfunction renderInnerContent(props: RenderProps) {\n return (\n <Fragment>\n {props.text && (\n <a id={props.textId} className=\"fc-list-day-text\" {...props.navLinkAttrs}>\n {props.text}\n </a>\n )}\n {props.sideText && (/* not keyboard tabbable */\n <a aria-hidden className=\"fc-list-day-side-text\" {...props.sideNavLinkAttrs}>\n {props.sideText}\n </a>\n )}\n </Fragment>\n )\n}\n","import { AllDayContentArg } from '@fullcalendar/core'\nimport {\n MinimalEventProps, BaseComponent, ViewContext,\n Seg, isMultiDayRange, DateFormatter, buildSegTimeText, createFormatter,\n getSegAnchorAttrs, EventContainer, ContentContainer,\n} from '@fullcalendar/core/internal'\nimport {\n createElement,\n ComponentChildren,\n Fragment,\n ComponentChild,\n} from '@fullcalendar/core/preact'\n\nconst DEFAULT_TIME_FORMAT = createFormatter({\n hour: 'numeric',\n minute: '2-digit',\n meridiem: 'short',\n})\n\nexport interface ListViewEventRowProps extends MinimalEventProps {\n timeHeaderId: string\n eventHeaderId: string\n dateHeaderId: string\n}\n\nexport class ListViewEventRow extends BaseComponent<ListViewEventRowProps> {\n render() {\n let { props, context } = this\n let { options } = context\n let { seg, timeHeaderId, eventHeaderId, dateHeaderId } = props\n let timeFormat = options.eventTimeFormat || DEFAULT_TIME_FORMAT\n\n return (\n <EventContainer\n {...props}\n elTag=\"tr\"\n elClasses={[\n 'fc-list-event',\n seg.eventRange.def.url && 'fc-event-forced-url',\n ]}\n defaultGenerator={() => renderEventInnerContent(seg, context) /* weird */}\n seg={seg}\n timeText=\"\"\n disableDragging={true}\n disableResizing={true}\n >\n {(InnerContent, eventContentArg) => (\n <Fragment>\n {buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId)}\n <td aria-hidden className=\"fc-list-event-graphic\">\n <span\n className=\"fc-list-event-dot\"\n style={{\n borderColor: eventContentArg.borderColor || eventContentArg.backgroundColor,\n }}\n />\n </td>\n <InnerContent\n elTag=\"td\"\n elClasses={['fc-list-event-title']}\n elAttrs={{ headers: `${eventHeaderId} ${dateHeaderId}` }}\n />\n </Fragment>\n )}\n </EventContainer>\n )\n }\n}\n\nfunction renderEventInnerContent(seg: Seg, context: ViewContext) {\n let interactiveAttrs = getSegAnchorAttrs(seg, context)\n return (\n <a {...interactiveAttrs}>\n {/* TODO: document how whole row become clickable */}\n {seg.eventRange.def.title}\n </a>\n )\n}\n\nfunction buildTimeContent(\n seg: Seg,\n timeFormat: DateFormatter,\n context: ViewContext,\n timeHeaderId: string,\n dateHeaderId: string,\n): ComponentChildren {\n let { options } = context\n\n if (options.displayEventTime !== false) {\n let eventDef = seg.eventRange.def\n let eventInstance = seg.eventRange.instance\n let doAllDay = false\n let timeText: string\n\n if (eventDef.allDay) {\n doAllDay = true\n } else if (isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead?\n if (seg.isStart) {\n timeText = buildSegTimeText(\n seg,\n timeFormat,\n context,\n null,\n null,\n eventInstance.range.start,\n seg.end,\n )\n } else if (seg.isEnd) {\n timeText = buildSegTimeText(\n seg,\n timeFormat,\n context,\n null,\n null,\n seg.start,\n eventInstance.range.end,\n )\n } else {\n doAllDay = true\n }\n } else {\n timeText = buildSegTimeText(\n seg,\n timeFormat,\n context,\n )\n }\n\n if (doAllDay) {\n let renderProps: AllDayContentArg = {\n text: context.options.allDayText,\n view: context.viewApi,\n }\n\n return (\n <ContentContainer\n elTag=\"td\"\n elClasses={['fc-list-event-time']}\n elAttrs={{\n headers: `${timeHeaderId} ${dateHeaderId}`,\n }}\n renderProps={renderProps}\n generatorName=\"allDayContent\"\n generator={options.allDayContent || renderAllDayInner}\n classNameGenerator={options.allDayClassNames}\n didMount={options.allDayDidMount}\n willUnmount={options.allDayWillUnmount}\n />\n )\n }\n\n return (\n <td className=\"fc-list-event-time\">\n {timeText}\n </td>\n )\n }\n\n return null\n}\n\nfunction renderAllDayInner(renderProps: AllDayContentArg): ComponentChild {\n return renderProps.text\n}\n","import { ViewApi, EventRenderRange } from '@fullcalendar/core'\nimport {\n ViewProps,\n Scroller,\n DateMarker,\n addDays,\n startOfDay,\n DateRange,\n intersectRanges,\n DateProfile,\n EventUiHash,\n sliceEventStore,\n EventStore,\n memoize,\n Seg,\n sortEventSegs,\n getSegMeta,\n NowTimer,\n ViewContainer,\n DateComponent,\n MountArg,\n getUniqueDomId,\n formatDayString,\n ContentContainer,\n} from '@fullcalendar/core/internal'\nimport {\n ComponentChild,\n createElement,\n VNode,\n} from '@fullcalendar/core/preact'\nimport { ListViewHeaderRow } from './ListViewHeaderRow.js'\nimport { ListViewEventRow } from './ListViewEventRow.js'\n\nexport interface NoEventsContentArg {\n text: string\n view: ViewApi\n}\n\nexport type NoEventsMountArg = MountArg<NoEventsContentArg>\n\n/*\nResponsible for the scroller, and forwarding event-related actions into the \"grid\".\n*/\nexport class ListView extends DateComponent<ViewProps> {\n private computeDateVars = memoize(computeDateVars)\n private eventStoreToSegs = memoize(this._eventStoreToSegs)\n state = {\n timeHeaderId: getUniqueDomId(),\n eventHeaderId: getUniqueDomId(),\n dateHeaderIdRoot: getUniqueDomId(),\n }\n\n render() {\n let { props, context } = this\n let { dayDates, dayRanges } = this.computeDateVars(props.dateProfile)\n let eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges)\n\n return (\n <ViewContainer\n elRef={this.setRootEl}\n elClasses={[\n 'fc-list',\n context.theme.getClass('table'), // just for the outer border. will be on div\n context.options.stickyHeaderDates !== false ?\n 'fc-list-sticky' :\n '',\n ]}\n viewSpec={context.viewSpec}\n >\n <Scroller\n liquid={!props.isHeightAuto}\n overflowX={props.isHeightAuto ? 'visible' : 'hidden'}\n overflowY={props.isHeightAuto ? 'visible' : 'auto'}\n >\n {eventSegs.length > 0 ?\n this.renderSegList(eventSegs, dayDates) :\n this.renderEmptyMessage()}\n </Scroller>\n </ViewContainer>\n )\n }\n\n setRootEl = (rootEl: HTMLElement | null) => {\n if (rootEl) {\n this.context.registerInteractiveComponent(this, { // TODO: make aware that it doesn't do Hits\n el: rootEl,\n })\n } else {\n this.context.unregisterInteractiveComponent(this)\n }\n }\n\n renderEmptyMessage() {\n let { options, viewApi } = this.context\n let renderProps: NoEventsContentArg = {\n text: options.noEventsText,\n view: viewApi,\n }\n\n return (\n <ContentContainer\n elTag=\"div\"\n elClasses={['fc-list-empty']}\n renderProps={renderProps}\n generatorName=\"noEventsContent\"\n generator={options.noEventsContent || renderNoEventsInner}\n classNameGenerator={options.noEventsClassNames}\n didMount={options.noEventsDidMount}\n willUnmount={options.noEventsWillUnmount}\n >\n {(InnerContent) => (\n <InnerContent\n elTag=\"div\"\n elClasses={['fc-list-empty-cushion']}\n />\n )}\n </ContentContainer>\n )\n }\n\n renderSegList(allSegs: Seg[], dayDates: DateMarker[]) {\n let { theme, options } = this.context\n let { timeHeaderId, eventHeaderId, dateHeaderIdRoot } = this.state\n let segsByDay = groupSegsByDay(allSegs) // sparse array\n\n return (\n <NowTimer unit=\"day\">\n {(nowDate: DateMarker, todayRange: DateRange) => {\n let innerNodes: VNode[] = []\n\n for (let dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) {\n let daySegs = segsByDay[dayIndex]\n\n if (daySegs) { // sparse array, so might be undefined\n let dayStr = formatDayString(dayDates[dayIndex])\n let dateHeaderId = dateHeaderIdRoot + '-' + dayStr\n\n // append a day header\n innerNodes.push(\n <ListViewHeaderRow\n key={dayStr}\n cellId={dateHeaderId}\n dayDate={dayDates[dayIndex]}\n todayRange={todayRange}\n />,\n )\n\n daySegs = sortEventSegs(daySegs, options.eventOrder)\n\n for (let seg of daySegs) {\n innerNodes.push(\n <ListViewEventRow\n key={dayStr + ':' + seg.eventRange.instance.instanceId /* are multiple segs for an instanceId */}\n seg={seg}\n isDragging={false}\n isResizing={false}\n isDateSelecting={false}\n isSelected={false}\n timeHeaderId={timeHeaderId}\n eventHeaderId={eventHeaderId}\n dateHeaderId={dateHeaderId}\n {...getSegMeta(seg, todayRange, nowDate)}\n />,\n )\n }\n }\n }\n\n return (\n <table className={'fc-list-table ' + theme.getClass('table')}>\n <thead>\n <tr>\n <th scope=\"col\" id={timeHeaderId}>{options.timeHint}</th>\n <th scope=\"col\" aria-hidden />\n <th scope=\"col\" id={eventHeaderId}>{options.eventHint}</th>\n </tr>\n </thead>\n <tbody>{innerNodes}</tbody>\n </table>\n )\n }}\n </NowTimer>\n )\n }\n\n _eventStoreToSegs(eventStore: EventStore, eventUiBases: EventUiHash, dayRanges: DateRange[]): Seg[] {\n return this.eventRangesToSegs(\n sliceEventStore(\n eventStore,\n eventUiBases,\n this.props.dateProfile.activeRange,\n this.context.options.nextDayThreshold,\n ).fg,\n dayRanges,\n )\n }\n\n eventRangesToSegs(eventRanges: EventRenderRange[], dayRanges: DateRange[]) {\n let segs = []\n\n for (let eventRange of eventRanges) {\n segs.push(...this.eventRangeToSegs(eventRange, dayRanges))\n }\n\n return segs\n }\n\n eventRangeToSegs(eventRange: EventRenderRange, dayRanges: DateRange[]) {\n let { dateEnv } = this.context\n let { nextDayThreshold } = this.context.options\n let range = eventRange.range\n let allDay = eventRange.def.allDay\n let dayIndex\n let segRange\n let seg\n let segs = []\n\n for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex += 1) {\n segRange = intersectRanges(range, dayRanges[dayIndex])\n\n if (segRange) {\n seg = {\n component: this,\n eventRange,\n start: segRange.start,\n end: segRange.end,\n isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(),\n isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(),\n dayIndex,\n }\n\n segs.push(seg)\n\n // detect when range won't go fully into the next day,\n // and mutate the latest seg to the be the end.\n if (\n !seg.isEnd && !allDay &&\n dayIndex + 1 < dayRanges.length &&\n range.end <\n dateEnv.add(\n dayRanges[dayIndex + 1].start,\n nextDayThreshold,\n )\n ) {\n seg.end = range.end\n seg.isEnd = true\n break\n }\n }\n }\n\n return segs\n }\n}\n\nfunction renderNoEventsInner(renderProps: NoEventsContentArg): ComponentChild {\n return renderProps.text\n}\n\nfunction computeDateVars(dateProfile: DateProfile) {\n let dayStart = startOfDay(dateProfile.renderRange.start)\n let viewEnd = dateProfile.renderRange.end\n let dayDates: DateMarker[] = []\n let dayRanges: DateRange[] = []\n\n while (dayStart < viewEnd) {\n dayDates.push(dayStart)\n\n dayRanges.push({\n start: dayStart,\n end: addDays(dayStart, 1),\n })\n\n dayStart = addDays(dayStart, 1)\n }\n\n return { dayDates, dayRanges }\n}\n\n// Returns a sparse array of arrays, segs grouped by their dayIndex\nfunction groupSegsByDay(segs): Seg[][] {\n let segsByDay = [] // sparse array\n let i\n let seg\n\n for (i = 0; i < segs.length; i += 1) {\n seg = segs[i];\n (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))\n .push(seg)\n }\n\n return segsByDay\n}\n"],"names":[],"mappings":"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"}
|