@fullcalendar/list 5.11.3 → 6.0.0-beta.2
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.txt → LICENSE.md} +0 -0
- package/index.cjs +59 -0
- package/index.d.ts +27 -0
- package/index.global.js +332 -0
- package/index.global.min.js +6 -0
- package/index.js +55 -0
- package/internal-common.d.ts +27 -0
- package/internal.cjs +268 -0
- package/internal.d.ts +4 -0
- package/internal.js +264 -0
- package/package.json +38 -16
- package/main.cjs.js +0 -320
- package/main.css +0 -140
- package/main.d.ts +0 -47
- package/main.global.js +0 -365
- package/main.global.min.js +0 -6
- package/main.js +0 -318
- package/main.js.map +0 -1
- package/main.min.css +0 -1
|
File without changes
|
package/index.cjs
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
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');
|
|
9
|
+
|
|
10
|
+
const OPTION_REFINERS = {
|
|
11
|
+
listDayFormat: createFalsableFormatter,
|
|
12
|
+
listDaySideFormat: createFalsableFormatter,
|
|
13
|
+
noEventsClassNames: internal_cjs.identity,
|
|
14
|
+
noEventsContent: internal_cjs.identity,
|
|
15
|
+
noEventsDidMount: internal_cjs.identity,
|
|
16
|
+
noEventsWillUnmount: internal_cjs.identity,
|
|
17
|
+
// noEventsText is defined in base options
|
|
18
|
+
};
|
|
19
|
+
function createFalsableFormatter(input) {
|
|
20
|
+
return input === false ? null : internal_cjs.createFormatter(input);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
var css_248z = "\n:root {\n --fc-list-event-dot-width: 10px;\n --fc-list-event-hover-bg-color: #f5f5f5;\n}\n\n.fc-theme-standard .fc-list {\n border: 1px solid var(--fc-border-color);\n }\n\n.fc {\n\n /* message when no events */\n\n}\n\n.fc .fc-list-empty {\n background-color: var(--fc-neutral-bg-color);\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center; /* vertically aligns fc-list-empty-inner */\n }\n\n.fc .fc-list-empty-cushion {\n margin: 5em 0;\n }\n.fc {\n\n /* table within the scroller */\n /* ---------------------------------------------------------------------------------------------------- */\n\n}\n.fc .fc-list-table {\n width: 100%;\n border-style: hidden; /* kill outer border on theme */\n }\n.fc .fc-list-table tr > * {\n border-left: 0;\n border-right: 0;\n }\n.fc .fc-list-sticky .fc-list-day > * { /* the cells */\n position: sticky;\n top: 0;\n background: var(--fc-page-bg-color); /* for when headers are styled to be transparent and sticky */\n }\n.fc {\n\n /* only exists for aria reasons, hide for non-screen-readers */\n\n}\n.fc .fc-list-table thead {\n position: absolute;\n left: -10000px;\n }\n.fc {\n\n /* the table's border-style:hidden gets confused by hidden thead. force-hide top border of first cell */\n\n}\n.fc .fc-list-table tbody > tr:first-child th {\n border-top: 0;\n }\n.fc .fc-list-table th {\n padding: 0; /* uses an inner-wrapper instead... */\n }\n.fc .fc-list-table td,\n .fc .fc-list-day-cushion {\n padding: 8px 14px;\n }\n.fc {\n\n\n /* date heading rows */\n /* ---------------------------------------------------------------------------------------------------- */\n\n}\n.fc .fc-list-day-cushion:after {\n content: \"\";\n clear: both;\n display: table; /* clear floating */\n }\n.fc-theme-standard .fc-list-day-cushion {\n background-color: var(--fc-neutral-bg-color);\n }\n.fc-direction-ltr .fc-list-day-text,\n.fc-direction-rtl .fc-list-day-side-text {\n float: left;\n}\n.fc-direction-ltr .fc-list-day-side-text,\n.fc-direction-rtl .fc-list-day-text {\n float: right;\n}\n/* make the dot closer to the event title */\n.fc-direction-ltr .fc-list-table .fc-list-event-graphic { padding-right: 0 }\n.fc-direction-rtl .fc-list-table .fc-list-event-graphic { padding-left: 0 }\n.fc .fc-list-event.fc-event-forced-url {\n cursor: pointer; /* whole row will seem clickable */\n }\n.fc .fc-list-event:hover td {\n background-color: var(--fc-list-event-hover-bg-color);\n }\n.fc {\n\n /* shrink certain cols */\n\n}\n.fc .fc-list-event-graphic,\n .fc .fc-list-event-time {\n white-space: nowrap;\n width: 1px;\n }\n.fc .fc-list-event-dot {\n display: inline-block;\n box-sizing: content-box;\n width: 0;\n height: 0;\n border: calc(var(--fc-list-event-dot-width) / 2) solid var(--fc-event-border-color);\n border-radius: calc(var(--fc-list-event-dot-width) / 2);\n }\n.fc {\n\n /* reset <a> styling */\n\n}\n.fc .fc-list-event-title a {\n color: inherit;\n text-decoration: none;\n }\n.fc {\n\n /* underline link when hovering over any part of row */\n\n}\n.fc .fc-list-event.fc-event-forced-url:hover a {\n text-decoration: underline;\n }\n";
|
|
24
|
+
internal_cjs.injectStyles(css_248z);
|
|
25
|
+
|
|
26
|
+
var index = index_cjs.createPlugin({
|
|
27
|
+
name: '@fullcalendar/list',
|
|
28
|
+
optionRefiners: OPTION_REFINERS,
|
|
29
|
+
views: {
|
|
30
|
+
list: {
|
|
31
|
+
component: internalCommon.ListView,
|
|
32
|
+
buttonTextKey: 'list',
|
|
33
|
+
listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' }, // like "January 1, 2016"
|
|
34
|
+
},
|
|
35
|
+
listDay: {
|
|
36
|
+
type: 'list',
|
|
37
|
+
duration: { days: 1 },
|
|
38
|
+
listDayFormat: { weekday: 'long' }, // day-of-week is all we need. full date is probably in headerToolbar
|
|
39
|
+
},
|
|
40
|
+
listWeek: {
|
|
41
|
+
type: 'list',
|
|
42
|
+
duration: { weeks: 1 },
|
|
43
|
+
listDayFormat: { weekday: 'long' },
|
|
44
|
+
listDaySideFormat: { month: 'long', day: 'numeric', year: 'numeric' },
|
|
45
|
+
},
|
|
46
|
+
listMonth: {
|
|
47
|
+
type: 'list',
|
|
48
|
+
duration: { month: 1 },
|
|
49
|
+
listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have
|
|
50
|
+
},
|
|
51
|
+
listYear: {
|
|
52
|
+
type: 'list',
|
|
53
|
+
duration: { year: 1 },
|
|
54
|
+
listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
exports["default"] = index;
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
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=augment.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
ADDED
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
FullCalendar List View Plugin v6.0.0-beta.2
|
|
3
|
+
Docs & License: https://fullcalendar.io/
|
|
4
|
+
(c) 2022 Adam Shaw
|
|
5
|
+
*/
|
|
6
|
+
FullCalendar.List = (function (exports, internal$1, core, preact) {
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
class ListViewHeaderRow extends internal$1.BaseComponent {
|
|
10
|
+
constructor() {
|
|
11
|
+
super(...arguments);
|
|
12
|
+
this.state = {
|
|
13
|
+
textId: internal$1.getUniqueDomId(),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
render() {
|
|
17
|
+
let { theme, dateEnv, options, viewApi } = this.context;
|
|
18
|
+
let { cellId, dayDate, todayRange } = this.props;
|
|
19
|
+
let { textId } = this.state;
|
|
20
|
+
let dayMeta = internal$1.getDateMeta(dayDate, todayRange);
|
|
21
|
+
// will ever be falsy?
|
|
22
|
+
let text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : '';
|
|
23
|
+
// will ever be falsy? also, BAD NAME "alt"
|
|
24
|
+
let sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : '';
|
|
25
|
+
let renderProps = Object.assign({ date: dateEnv.toDate(dayDate), view: viewApi, textId,
|
|
26
|
+
text,
|
|
27
|
+
sideText, navLinkAttrs: internal$1.buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: internal$1.buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta);
|
|
28
|
+
// TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too)
|
|
29
|
+
return (preact.createElement(internal$1.ContentContainer, { elTag: "tr", elClasses: [
|
|
30
|
+
'fc-list-day',
|
|
31
|
+
...internal$1.getDayClassNames(dayMeta, theme),
|
|
32
|
+
], elAttrs: {
|
|
33
|
+
'data-date': internal$1.formatDayString(dayDate),
|
|
34
|
+
}, 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
|
|
35
|
+
preact.createElement("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId },
|
|
36
|
+
preact.createElement(InnerContent, { elTag: "div", elClasses: [
|
|
37
|
+
'fc-list-day-cushion',
|
|
38
|
+
theme.getClass('tableCellShaded'),
|
|
39
|
+
] })))));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function renderInnerContent(props) {
|
|
43
|
+
return (preact.createElement(preact.Fragment, null,
|
|
44
|
+
props.text && (preact.createElement("a", Object.assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text)),
|
|
45
|
+
props.sideText && ( /* not keyboard tabbable */preact.createElement("a", Object.assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText))));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const DEFAULT_TIME_FORMAT = internal$1.createFormatter({
|
|
49
|
+
hour: 'numeric',
|
|
50
|
+
minute: '2-digit',
|
|
51
|
+
meridiem: 'short',
|
|
52
|
+
});
|
|
53
|
+
class ListViewEventRow extends internal$1.BaseComponent {
|
|
54
|
+
render() {
|
|
55
|
+
let { props, context } = this;
|
|
56
|
+
let { options } = context;
|
|
57
|
+
let { seg, timeHeaderId, eventHeaderId, dateHeaderId } = props;
|
|
58
|
+
let timeFormat = options.eventTimeFormat || DEFAULT_TIME_FORMAT;
|
|
59
|
+
return (preact.createElement(internal$1.EventContainer, Object.assign({}, props, { elTag: "tr", elClasses: [
|
|
60
|
+
'fc-list-event',
|
|
61
|
+
seg.eventRange.def.url && 'fc-event-forced-url',
|
|
62
|
+
], defaultGenerator: () => renderEventInnerContent(seg, context) /* weird */, seg: seg, timeText: "", disableDragging: true, disableResizing: true }), (InnerContent, eventContentArg) => (preact.createElement(preact.Fragment, null,
|
|
63
|
+
buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId),
|
|
64
|
+
preact.createElement("td", { "aria-hidden": true, className: "fc-list-event-graphic" },
|
|
65
|
+
preact.createElement("span", { className: "fc-list-event-dot", style: {
|
|
66
|
+
borderColor: eventContentArg.borderColor || eventContentArg.backgroundColor,
|
|
67
|
+
} })),
|
|
68
|
+
preact.createElement(InnerContent, { elTag: "td", elClasses: ['fc-list-event-title'], elAttrs: { headers: `${eventHeaderId} ${dateHeaderId}` } })))));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function renderEventInnerContent(seg, context) {
|
|
72
|
+
let interactiveAttrs = internal$1.getSegAnchorAttrs(seg, context);
|
|
73
|
+
return (preact.createElement("a", Object.assign({}, interactiveAttrs), seg.eventRange.def.title));
|
|
74
|
+
}
|
|
75
|
+
function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId) {
|
|
76
|
+
let { options } = context;
|
|
77
|
+
if (options.displayEventTime !== false) {
|
|
78
|
+
let eventDef = seg.eventRange.def;
|
|
79
|
+
let eventInstance = seg.eventRange.instance;
|
|
80
|
+
let doAllDay = false;
|
|
81
|
+
let timeText;
|
|
82
|
+
if (eventDef.allDay) {
|
|
83
|
+
doAllDay = true;
|
|
84
|
+
}
|
|
85
|
+
else if (internal$1.isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead?
|
|
86
|
+
if (seg.isStart) {
|
|
87
|
+
timeText = internal$1.buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end);
|
|
88
|
+
}
|
|
89
|
+
else if (seg.isEnd) {
|
|
90
|
+
timeText = internal$1.buildSegTimeText(seg, timeFormat, context, null, null, seg.start, eventInstance.range.end);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
doAllDay = true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
timeText = internal$1.buildSegTimeText(seg, timeFormat, context);
|
|
98
|
+
}
|
|
99
|
+
if (doAllDay) {
|
|
100
|
+
let renderProps = {
|
|
101
|
+
text: context.options.allDayText,
|
|
102
|
+
view: context.viewApi,
|
|
103
|
+
};
|
|
104
|
+
return (preact.createElement(internal$1.ContentContainer, { elTag: "td", elClasses: ['fc-list-event-time'], elAttrs: {
|
|
105
|
+
headers: `${timeHeaderId} ${dateHeaderId}`,
|
|
106
|
+
}, renderProps: renderProps, generatorName: "allDayContent", generator: options.allDayContent || renderAllDayInner, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }));
|
|
107
|
+
}
|
|
108
|
+
return (preact.createElement("td", { className: "fc-list-event-time" }, timeText));
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
function renderAllDayInner(renderProps) {
|
|
113
|
+
return renderProps.text;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/*
|
|
117
|
+
Responsible for the scroller, and forwarding event-related actions into the "grid".
|
|
118
|
+
*/
|
|
119
|
+
class ListView extends internal$1.DateComponent {
|
|
120
|
+
constructor() {
|
|
121
|
+
super(...arguments);
|
|
122
|
+
this.computeDateVars = internal$1.memoize(computeDateVars);
|
|
123
|
+
this.eventStoreToSegs = internal$1.memoize(this._eventStoreToSegs);
|
|
124
|
+
this.state = {
|
|
125
|
+
timeHeaderId: internal$1.getUniqueDomId(),
|
|
126
|
+
eventHeaderId: internal$1.getUniqueDomId(),
|
|
127
|
+
dateHeaderIdRoot: internal$1.getUniqueDomId(),
|
|
128
|
+
};
|
|
129
|
+
this.setRootEl = (rootEl) => {
|
|
130
|
+
if (rootEl) {
|
|
131
|
+
this.context.registerInteractiveComponent(this, {
|
|
132
|
+
el: rootEl,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
this.context.unregisterInteractiveComponent(this);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
render() {
|
|
141
|
+
let { props, context } = this;
|
|
142
|
+
let { dayDates, dayRanges } = this.computeDateVars(props.dateProfile);
|
|
143
|
+
let eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges);
|
|
144
|
+
return (preact.createElement(internal$1.ViewContainer, { elRef: this.setRootEl, elClasses: [
|
|
145
|
+
'fc-list',
|
|
146
|
+
context.theme.getClass('table'),
|
|
147
|
+
context.options.stickyHeaderDates !== false ?
|
|
148
|
+
'fc-list-sticky' :
|
|
149
|
+
'',
|
|
150
|
+
], viewSpec: context.viewSpec },
|
|
151
|
+
preact.createElement(internal$1.Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ?
|
|
152
|
+
this.renderSegList(eventSegs, dayDates) :
|
|
153
|
+
this.renderEmptyMessage())));
|
|
154
|
+
}
|
|
155
|
+
renderEmptyMessage() {
|
|
156
|
+
let { options, viewApi } = this.context;
|
|
157
|
+
let renderProps = {
|
|
158
|
+
text: options.noEventsText,
|
|
159
|
+
view: viewApi,
|
|
160
|
+
};
|
|
161
|
+
return (preact.createElement(internal$1.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'] }))));
|
|
162
|
+
}
|
|
163
|
+
renderSegList(allSegs, dayDates) {
|
|
164
|
+
let { theme, options } = this.context;
|
|
165
|
+
let { timeHeaderId, eventHeaderId, dateHeaderIdRoot } = this.state;
|
|
166
|
+
let segsByDay = groupSegsByDay(allSegs); // sparse array
|
|
167
|
+
return (preact.createElement(internal$1.NowTimer, { unit: "day" }, (nowDate, todayRange) => {
|
|
168
|
+
let innerNodes = [];
|
|
169
|
+
for (let dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) {
|
|
170
|
+
let daySegs = segsByDay[dayIndex];
|
|
171
|
+
if (daySegs) { // sparse array, so might be undefined
|
|
172
|
+
let dayStr = internal$1.formatDayString(dayDates[dayIndex]);
|
|
173
|
+
let dateHeaderId = dateHeaderIdRoot + '-' + dayStr;
|
|
174
|
+
// append a day header
|
|
175
|
+
innerNodes.push(preact.createElement(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange }));
|
|
176
|
+
daySegs = internal$1.sortEventSegs(daySegs, options.eventOrder);
|
|
177
|
+
for (let seg of daySegs) {
|
|
178
|
+
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$1.getSegMeta(seg, todayRange, nowDate))));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return (preact.createElement("table", { className: 'fc-list-table ' + theme.getClass('table') },
|
|
183
|
+
preact.createElement("thead", null,
|
|
184
|
+
preact.createElement("tr", null,
|
|
185
|
+
preact.createElement("th", { scope: "col", id: timeHeaderId }, options.timeHint),
|
|
186
|
+
preact.createElement("th", { scope: "col", "aria-hidden": true }),
|
|
187
|
+
preact.createElement("th", { scope: "col", id: eventHeaderId }, options.eventHint))),
|
|
188
|
+
preact.createElement("tbody", null, innerNodes)));
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
_eventStoreToSegs(eventStore, eventUiBases, dayRanges) {
|
|
192
|
+
return this.eventRangesToSegs(internal$1.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges);
|
|
193
|
+
}
|
|
194
|
+
eventRangesToSegs(eventRanges, dayRanges) {
|
|
195
|
+
let segs = [];
|
|
196
|
+
for (let eventRange of eventRanges) {
|
|
197
|
+
segs.push(...this.eventRangeToSegs(eventRange, dayRanges));
|
|
198
|
+
}
|
|
199
|
+
return segs;
|
|
200
|
+
}
|
|
201
|
+
eventRangeToSegs(eventRange, dayRanges) {
|
|
202
|
+
let { dateEnv } = this.context;
|
|
203
|
+
let { nextDayThreshold } = this.context.options;
|
|
204
|
+
let range = eventRange.range;
|
|
205
|
+
let allDay = eventRange.def.allDay;
|
|
206
|
+
let dayIndex;
|
|
207
|
+
let segRange;
|
|
208
|
+
let seg;
|
|
209
|
+
let segs = [];
|
|
210
|
+
for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex += 1) {
|
|
211
|
+
segRange = internal$1.intersectRanges(range, dayRanges[dayIndex]);
|
|
212
|
+
if (segRange) {
|
|
213
|
+
seg = {
|
|
214
|
+
component: this,
|
|
215
|
+
eventRange,
|
|
216
|
+
start: segRange.start,
|
|
217
|
+
end: segRange.end,
|
|
218
|
+
isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(),
|
|
219
|
+
isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(),
|
|
220
|
+
dayIndex,
|
|
221
|
+
};
|
|
222
|
+
segs.push(seg);
|
|
223
|
+
// detect when range won't go fully into the next day,
|
|
224
|
+
// and mutate the latest seg to the be the end.
|
|
225
|
+
if (!seg.isEnd && !allDay &&
|
|
226
|
+
dayIndex + 1 < dayRanges.length &&
|
|
227
|
+
range.end <
|
|
228
|
+
dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) {
|
|
229
|
+
seg.end = range.end;
|
|
230
|
+
seg.isEnd = true;
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return segs;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function renderNoEventsInner(renderProps) {
|
|
239
|
+
return renderProps.text;
|
|
240
|
+
}
|
|
241
|
+
function computeDateVars(dateProfile) {
|
|
242
|
+
let dayStart = internal$1.startOfDay(dateProfile.renderRange.start);
|
|
243
|
+
let viewEnd = dateProfile.renderRange.end;
|
|
244
|
+
let dayDates = [];
|
|
245
|
+
let dayRanges = [];
|
|
246
|
+
while (dayStart < viewEnd) {
|
|
247
|
+
dayDates.push(dayStart);
|
|
248
|
+
dayRanges.push({
|
|
249
|
+
start: dayStart,
|
|
250
|
+
end: internal$1.addDays(dayStart, 1),
|
|
251
|
+
});
|
|
252
|
+
dayStart = internal$1.addDays(dayStart, 1);
|
|
253
|
+
}
|
|
254
|
+
return { dayDates, dayRanges };
|
|
255
|
+
}
|
|
256
|
+
// Returns a sparse array of arrays, segs grouped by their dayIndex
|
|
257
|
+
function groupSegsByDay(segs) {
|
|
258
|
+
let segsByDay = []; // sparse array
|
|
259
|
+
let i;
|
|
260
|
+
let seg;
|
|
261
|
+
for (i = 0; i < segs.length; i += 1) {
|
|
262
|
+
seg = segs[i];
|
|
263
|
+
(segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
|
|
264
|
+
.push(seg);
|
|
265
|
+
}
|
|
266
|
+
return segsByDay;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const OPTION_REFINERS = {
|
|
270
|
+
listDayFormat: createFalsableFormatter,
|
|
271
|
+
listDaySideFormat: createFalsableFormatter,
|
|
272
|
+
noEventsClassNames: internal$1.identity,
|
|
273
|
+
noEventsContent: internal$1.identity,
|
|
274
|
+
noEventsDidMount: internal$1.identity,
|
|
275
|
+
noEventsWillUnmount: internal$1.identity,
|
|
276
|
+
// noEventsText is defined in base options
|
|
277
|
+
};
|
|
278
|
+
function createFalsableFormatter(input) {
|
|
279
|
+
return input === false ? null : internal$1.createFormatter(input);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
var css_248z = "\n:root {\n --fc-list-event-dot-width: 10px;\n --fc-list-event-hover-bg-color: #f5f5f5;\n}\n\n.fc-theme-standard .fc-list {\n border: 1px solid var(--fc-border-color);\n }\n\n.fc {\n\n /* message when no events */\n\n}\n\n.fc .fc-list-empty {\n background-color: var(--fc-neutral-bg-color);\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center; /* vertically aligns fc-list-empty-inner */\n }\n\n.fc .fc-list-empty-cushion {\n margin: 5em 0;\n }\n.fc {\n\n /* table within the scroller */\n /* ---------------------------------------------------------------------------------------------------- */\n\n}\n.fc .fc-list-table {\n width: 100%;\n border-style: hidden; /* kill outer border on theme */\n }\n.fc .fc-list-table tr > * {\n border-left: 0;\n border-right: 0;\n }\n.fc .fc-list-sticky .fc-list-day > * { /* the cells */\n position: sticky;\n top: 0;\n background: var(--fc-page-bg-color); /* for when headers are styled to be transparent and sticky */\n }\n.fc {\n\n /* only exists for aria reasons, hide for non-screen-readers */\n\n}\n.fc .fc-list-table thead {\n position: absolute;\n left: -10000px;\n }\n.fc {\n\n /* the table's border-style:hidden gets confused by hidden thead. force-hide top border of first cell */\n\n}\n.fc .fc-list-table tbody > tr:first-child th {\n border-top: 0;\n }\n.fc .fc-list-table th {\n padding: 0; /* uses an inner-wrapper instead... */\n }\n.fc .fc-list-table td,\n .fc .fc-list-day-cushion {\n padding: 8px 14px;\n }\n.fc {\n\n\n /* date heading rows */\n /* ---------------------------------------------------------------------------------------------------- */\n\n}\n.fc .fc-list-day-cushion:after {\n content: \"\";\n clear: both;\n display: table; /* clear floating */\n }\n.fc-theme-standard .fc-list-day-cushion {\n background-color: var(--fc-neutral-bg-color);\n }\n.fc-direction-ltr .fc-list-day-text,\n.fc-direction-rtl .fc-list-day-side-text {\n float: left;\n}\n.fc-direction-ltr .fc-list-day-side-text,\n.fc-direction-rtl .fc-list-day-text {\n float: right;\n}\n/* make the dot closer to the event title */\n.fc-direction-ltr .fc-list-table .fc-list-event-graphic { padding-right: 0 }\n.fc-direction-rtl .fc-list-table .fc-list-event-graphic { padding-left: 0 }\n.fc .fc-list-event.fc-event-forced-url {\n cursor: pointer; /* whole row will seem clickable */\n }\n.fc .fc-list-event:hover td {\n background-color: var(--fc-list-event-hover-bg-color);\n }\n.fc {\n\n /* shrink certain cols */\n\n}\n.fc .fc-list-event-graphic,\n .fc .fc-list-event-time {\n white-space: nowrap;\n width: 1px;\n }\n.fc .fc-list-event-dot {\n display: inline-block;\n box-sizing: content-box;\n width: 0;\n height: 0;\n border: calc(var(--fc-list-event-dot-width) / 2) solid var(--fc-event-border-color);\n border-radius: calc(var(--fc-list-event-dot-width) / 2);\n }\n.fc {\n\n /* reset <a> styling */\n\n}\n.fc .fc-list-event-title a {\n color: inherit;\n text-decoration: none;\n }\n.fc {\n\n /* underline link when hovering over any part of row */\n\n}\n.fc .fc-list-event.fc-event-forced-url:hover a {\n text-decoration: underline;\n }\n";
|
|
283
|
+
internal$1.injectStyles(css_248z);
|
|
284
|
+
|
|
285
|
+
var plugin = core.createPlugin({
|
|
286
|
+
name: '@fullcalendar/list',
|
|
287
|
+
optionRefiners: OPTION_REFINERS,
|
|
288
|
+
views: {
|
|
289
|
+
list: {
|
|
290
|
+
component: ListView,
|
|
291
|
+
buttonTextKey: 'list',
|
|
292
|
+
listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' }, // like "January 1, 2016"
|
|
293
|
+
},
|
|
294
|
+
listDay: {
|
|
295
|
+
type: 'list',
|
|
296
|
+
duration: { days: 1 },
|
|
297
|
+
listDayFormat: { weekday: 'long' }, // day-of-week is all we need. full date is probably in headerToolbar
|
|
298
|
+
},
|
|
299
|
+
listWeek: {
|
|
300
|
+
type: 'list',
|
|
301
|
+
duration: { weeks: 1 },
|
|
302
|
+
listDayFormat: { weekday: 'long' },
|
|
303
|
+
listDaySideFormat: { month: 'long', day: 'numeric', year: 'numeric' },
|
|
304
|
+
},
|
|
305
|
+
listMonth: {
|
|
306
|
+
type: 'list',
|
|
307
|
+
duration: { month: 1 },
|
|
308
|
+
listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have
|
|
309
|
+
},
|
|
310
|
+
listYear: {
|
|
311
|
+
type: 'list',
|
|
312
|
+
duration: { year: 1 },
|
|
313
|
+
listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have
|
|
314
|
+
},
|
|
315
|
+
},
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
var internal = {
|
|
319
|
+
__proto__: null,
|
|
320
|
+
ListView: ListView
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
internal$1.globalPlugins.push(plugin);
|
|
324
|
+
|
|
325
|
+
exports.Internal = internal;
|
|
326
|
+
exports["default"] = plugin;
|
|
327
|
+
|
|
328
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
329
|
+
|
|
330
|
+
return exports;
|
|
331
|
+
|
|
332
|
+
})({}, FullCalendar.Internal, FullCalendar, FullCalendar.Preact);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
FullCalendar List View Plugin v6.0.0-beta.2
|
|
3
|
+
Docs & License: https://fullcalendar.io/
|
|
4
|
+
(c) 2022 Adam Shaw
|
|
5
|
+
*/
|
|
6
|
+
FullCalendar.List=function(e,t,n,a){"use strict";class r extends t.BaseComponent{constructor(){super(...arguments),this.state={textId:t.getUniqueDomId()}}render(){let{theme:e,dateEnv:n,options:r,viewApi:s}=this.context,{cellId:l,dayDate:o,todayRange:d}=this.props,{textId:c}=this.state,f=t.getDateMeta(o,d),g=r.listDayFormat?n.format(o,r.listDayFormat):"",u=r.listDaySideFormat?n.format(o,r.listDaySideFormat):"",m=Object.assign({date:n.toDate(o),view:s,textId:c,text:g,sideText:u,navLinkAttrs:t.buildNavLinkAttrs(this.context,o),sideNavLinkAttrs:t.buildNavLinkAttrs(this.context,o,"day",!1)},f);return a.createElement(t.ContentContainer,{elTag:"tr",elClasses:["fc-list-day",...t.getDayClassNames(f,e)],elAttrs:{"data-date":t.formatDayString(o)},renderProps:m,generatorName:"dayHeaderContent",generator:r.dayHeaderContent||i,classNameGenerator:r.dayHeaderClassNames,didMount:r.dayHeaderDidMount,willUnmount:r.dayHeaderWillUnmount},t=>a.createElement("th",{scope:"colgroup",colSpan:3,id:l,"aria-labelledby":c},a.createElement(t,{elTag:"div",elClasses:["fc-list-day-cushion",e.getClass("tableCellShaded")]})))}}function i(e){return a.createElement(a.Fragment,null,e.text&&a.createElement("a",Object.assign({id:e.textId,className:"fc-list-day-text"},e.navLinkAttrs),e.text),e.sideText&&a.createElement("a",Object.assign({"aria-hidden":!0,className:"fc-list-day-side-text"},e.sideNavLinkAttrs),e.sideText))}const s=t.createFormatter({hour:"numeric",minute:"2-digit",meridiem:"short"});class l extends t.BaseComponent{render(){let{props:e,context:n}=this,{options:r}=n,{seg:i,timeHeaderId:l,eventHeaderId:d,dateHeaderId:c}=e,f=r.eventTimeFormat||s;return a.createElement(t.EventContainer,Object.assign({},e,{elTag:"tr",elClasses:["fc-list-event",i.eventRange.def.url&&"fc-event-forced-url"],defaultGenerator:()=>function(e,n){let r=t.getSegAnchorAttrs(e,n);return a.createElement("a",Object.assign({},r),e.eventRange.def.title)}(i,n),seg:i,timeText:"",disableDragging:!0,disableResizing:!0}),(e,r)=>a.createElement(a.Fragment,null,function(e,n,r,i,s){let{options:l}=r;if(!1!==l.displayEventTime){let d,c=e.eventRange.def,f=e.eventRange.instance,g=!1;if(c.allDay?g=!0:t.isMultiDayRange(e.eventRange.range)?e.isStart?d=t.buildSegTimeText(e,n,r,null,null,f.range.start,e.end):e.isEnd?d=t.buildSegTimeText(e,n,r,null,null,e.start,f.range.end):g=!0:d=t.buildSegTimeText(e,n,r),g){let e={text:r.options.allDayText,view:r.viewApi};return a.createElement(t.ContentContainer,{elTag:"td",elClasses:["fc-list-event-time"],elAttrs:{headers:`${i} ${s}`},renderProps:e,generatorName:"allDayContent",generator:l.allDayContent||o,classNameGenerator:l.allDayClassNames,didMount:l.allDayDidMount,willUnmount:l.allDayWillUnmount})}return a.createElement("td",{className:"fc-list-event-time"},d)}return null}(i,f,n,l,c),a.createElement("td",{"aria-hidden":!0,className:"fc-list-event-graphic"},a.createElement("span",{className:"fc-list-event-dot",style:{borderColor:r.borderColor||r.backgroundColor}})),a.createElement(e,{elTag:"td",elClasses:["fc-list-event-title"],elAttrs:{headers:`${d} ${c}`}})))}}function o(e){return e.text}class d extends t.DateComponent{constructor(){super(...arguments),this.computeDateVars=t.memoize(f),this.eventStoreToSegs=t.memoize(this._eventStoreToSegs),this.state={timeHeaderId:t.getUniqueDomId(),eventHeaderId:t.getUniqueDomId(),dateHeaderIdRoot:t.getUniqueDomId()},this.setRootEl=e=>{e?this.context.registerInteractiveComponent(this,{el:e}):this.context.unregisterInteractiveComponent(this)}}render(){let{props:e,context:n}=this,{dayDates:r,dayRanges:i}=this.computeDateVars(e.dateProfile),s=this.eventStoreToSegs(e.eventStore,e.eventUiBases,i);return a.createElement(t.ViewContainer,{elRef:this.setRootEl,elClasses:["fc-list",n.theme.getClass("table"),!1!==n.options.stickyHeaderDates?"fc-list-sticky":""],viewSpec:n.viewSpec},a.createElement(t.Scroller,{liquid:!e.isHeightAuto,overflowX:e.isHeightAuto?"visible":"hidden",overflowY:e.isHeightAuto?"visible":"auto"},s.length>0?this.renderSegList(s,r):this.renderEmptyMessage()))}renderEmptyMessage(){let{options:e,viewApi:n}=this.context,r={text:e.noEventsText,view:n};return a.createElement(t.ContentContainer,{elTag:"div",elClasses:["fc-list-empty"],renderProps:r,generatorName:"noEventsContent",generator:e.noEventsContent||c,classNameGenerator:e.noEventsClassNames,didMount:e.noEventsDidMount,willUnmount:e.noEventsWillUnmount},e=>a.createElement(e,{elTag:"div",elClasses:["fc-list-empty-cushion"]}))}renderSegList(e,n){let{theme:i,options:s}=this.context,{timeHeaderId:o,eventHeaderId:d,dateHeaderIdRoot:c}=this.state,f=function(e){let t,n,a=[];for(t=0;t<e.length;t+=1)n=e[t],(a[n.dayIndex]||(a[n.dayIndex]=[])).push(n);return a}(e);return a.createElement(t.NowTimer,{unit:"day"},(e,g)=>{let u=[];for(let i=0;i<f.length;i+=1){let m=f[i];if(m){let f=t.formatDayString(n[i]),h=c+"-"+f;u.push(a.createElement(r,{key:f,cellId:h,dayDate:n[i],todayRange:g})),m=t.sortEventSegs(m,s.eventOrder);for(let n of m)u.push(a.createElement(l,Object.assign({key:f+":"+n.eventRange.instance.instanceId,seg:n,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,timeHeaderId:o,eventHeaderId:d,dateHeaderId:h},t.getSegMeta(n,g,e))))}}return a.createElement("table",{className:"fc-list-table "+i.getClass("table")},a.createElement("thead",null,a.createElement("tr",null,a.createElement("th",{scope:"col",id:o},s.timeHint),a.createElement("th",{scope:"col","aria-hidden":!0}),a.createElement("th",{scope:"col",id:d},s.eventHint))),a.createElement("tbody",null,u))})}_eventStoreToSegs(e,n,a){return this.eventRangesToSegs(t.sliceEventStore(e,n,this.props.dateProfile.activeRange,this.context.options.nextDayThreshold).fg,a)}eventRangesToSegs(e,t){let n=[];for(let a of e)n.push(...this.eventRangeToSegs(a,t));return n}eventRangeToSegs(e,n){let a,r,i,{dateEnv:s}=this.context,{nextDayThreshold:l}=this.context.options,o=e.range,d=e.def.allDay,c=[];for(a=0;a<n.length;a+=1)if(r=t.intersectRanges(o,n[a]),r&&(i={component:this,eventRange:e,start:r.start,end:r.end,isStart:e.isStart&&r.start.valueOf()===o.start.valueOf(),isEnd:e.isEnd&&r.end.valueOf()===o.end.valueOf(),dayIndex:a},c.push(i),!i.isEnd&&!d&&a+1<n.length&&o.end<s.add(n[a+1].start,l))){i.end=o.end,i.isEnd=!0;break}return c}}function c(e){return e.text}function f(e){let n=t.startOfDay(e.renderRange.start),a=e.renderRange.end,r=[],i=[];for(;n<a;)r.push(n),i.push({start:n,end:t.addDays(n,1)}),n=t.addDays(n,1);return{dayDates:r,dayRanges:i}}const g={listDayFormat:u,listDaySideFormat:u,noEventsClassNames:t.identity,noEventsContent:t.identity,noEventsDidMount:t.identity,noEventsWillUnmount:t.identity};function u(e){return!1===e?null:t.createFormatter(e)}t.injectStyles('\n:root {\n --fc-list-event-dot-width: 10px;\n --fc-list-event-hover-bg-color: #f5f5f5;\n}\n\n.fc-theme-standard .fc-list {\n border: 1px solid var(--fc-border-color);\n }\n\n.fc {\n\n /* message when no events */\n\n}\n\n.fc .fc-list-empty {\n background-color: var(--fc-neutral-bg-color);\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center; /* vertically aligns fc-list-empty-inner */\n }\n\n.fc .fc-list-empty-cushion {\n margin: 5em 0;\n }\n.fc {\n\n /* table within the scroller */\n /* ---------------------------------------------------------------------------------------------------- */\n\n}\n.fc .fc-list-table {\n width: 100%;\n border-style: hidden; /* kill outer border on theme */\n }\n.fc .fc-list-table tr > * {\n border-left: 0;\n border-right: 0;\n }\n.fc .fc-list-sticky .fc-list-day > * { /* the cells */\n position: sticky;\n top: 0;\n background: var(--fc-page-bg-color); /* for when headers are styled to be transparent and sticky */\n }\n.fc {\n\n /* only exists for aria reasons, hide for non-screen-readers */\n\n}\n.fc .fc-list-table thead {\n position: absolute;\n left: -10000px;\n }\n.fc {\n\n /* the table\'s border-style:hidden gets confused by hidden thead. force-hide top border of first cell */\n\n}\n.fc .fc-list-table tbody > tr:first-child th {\n border-top: 0;\n }\n.fc .fc-list-table th {\n padding: 0; /* uses an inner-wrapper instead... */\n }\n.fc .fc-list-table td,\n .fc .fc-list-day-cushion {\n padding: 8px 14px;\n }\n.fc {\n\n\n /* date heading rows */\n /* ---------------------------------------------------------------------------------------------------- */\n\n}\n.fc .fc-list-day-cushion:after {\n content: "";\n clear: both;\n display: table; /* clear floating */\n }\n.fc-theme-standard .fc-list-day-cushion {\n background-color: var(--fc-neutral-bg-color);\n }\n.fc-direction-ltr .fc-list-day-text,\n.fc-direction-rtl .fc-list-day-side-text {\n float: left;\n}\n.fc-direction-ltr .fc-list-day-side-text,\n.fc-direction-rtl .fc-list-day-text {\n float: right;\n}\n/* make the dot closer to the event title */\n.fc-direction-ltr .fc-list-table .fc-list-event-graphic { padding-right: 0 }\n.fc-direction-rtl .fc-list-table .fc-list-event-graphic { padding-left: 0 }\n.fc .fc-list-event.fc-event-forced-url {\n cursor: pointer; /* whole row will seem clickable */\n }\n.fc .fc-list-event:hover td {\n background-color: var(--fc-list-event-hover-bg-color);\n }\n.fc {\n\n /* shrink certain cols */\n\n}\n.fc .fc-list-event-graphic,\n .fc .fc-list-event-time {\n white-space: nowrap;\n width: 1px;\n }\n.fc .fc-list-event-dot {\n display: inline-block;\n box-sizing: content-box;\n width: 0;\n height: 0;\n border: calc(var(--fc-list-event-dot-width) / 2) solid var(--fc-event-border-color);\n border-radius: calc(var(--fc-list-event-dot-width) / 2);\n }\n.fc {\n\n /* reset <a> styling */\n\n}\n.fc .fc-list-event-title a {\n color: inherit;\n text-decoration: none;\n }\n.fc {\n\n /* underline link when hovering over any part of row */\n\n}\n.fc .fc-list-event.fc-event-forced-url:hover a {\n text-decoration: underline;\n }\n');var m=n.createPlugin({name:"@fullcalendar/list",optionRefiners:g,views:{list:{component:d,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"}}}}),h={__proto__:null,ListView:d};return t.globalPlugins.push(m),e.Internal=h,e.default=m,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar.Internal,FullCalendar,FullCalendar.Preact);
|
package/index.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createPlugin } from '@fullcalendar/core/index.js';
|
|
2
|
+
import { ListView } from './internal.js';
|
|
3
|
+
import { identity, createFormatter, injectStyles } from '@fullcalendar/core/internal.js';
|
|
4
|
+
import '@fullcalendar/core/preact.js';
|
|
5
|
+
|
|
6
|
+
const OPTION_REFINERS = {
|
|
7
|
+
listDayFormat: createFalsableFormatter,
|
|
8
|
+
listDaySideFormat: createFalsableFormatter,
|
|
9
|
+
noEventsClassNames: identity,
|
|
10
|
+
noEventsContent: identity,
|
|
11
|
+
noEventsDidMount: identity,
|
|
12
|
+
noEventsWillUnmount: identity,
|
|
13
|
+
// noEventsText is defined in base options
|
|
14
|
+
};
|
|
15
|
+
function createFalsableFormatter(input) {
|
|
16
|
+
return input === false ? null : createFormatter(input);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
var css_248z = "\n:root {\n --fc-list-event-dot-width: 10px;\n --fc-list-event-hover-bg-color: #f5f5f5;\n}\n\n.fc-theme-standard .fc-list {\n border: 1px solid var(--fc-border-color);\n }\n\n.fc {\n\n /* message when no events */\n\n}\n\n.fc .fc-list-empty {\n background-color: var(--fc-neutral-bg-color);\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center; /* vertically aligns fc-list-empty-inner */\n }\n\n.fc .fc-list-empty-cushion {\n margin: 5em 0;\n }\n.fc {\n\n /* table within the scroller */\n /* ---------------------------------------------------------------------------------------------------- */\n\n}\n.fc .fc-list-table {\n width: 100%;\n border-style: hidden; /* kill outer border on theme */\n }\n.fc .fc-list-table tr > * {\n border-left: 0;\n border-right: 0;\n }\n.fc .fc-list-sticky .fc-list-day > * { /* the cells */\n position: sticky;\n top: 0;\n background: var(--fc-page-bg-color); /* for when headers are styled to be transparent and sticky */\n }\n.fc {\n\n /* only exists for aria reasons, hide for non-screen-readers */\n\n}\n.fc .fc-list-table thead {\n position: absolute;\n left: -10000px;\n }\n.fc {\n\n /* the table's border-style:hidden gets confused by hidden thead. force-hide top border of first cell */\n\n}\n.fc .fc-list-table tbody > tr:first-child th {\n border-top: 0;\n }\n.fc .fc-list-table th {\n padding: 0; /* uses an inner-wrapper instead... */\n }\n.fc .fc-list-table td,\n .fc .fc-list-day-cushion {\n padding: 8px 14px;\n }\n.fc {\n\n\n /* date heading rows */\n /* ---------------------------------------------------------------------------------------------------- */\n\n}\n.fc .fc-list-day-cushion:after {\n content: \"\";\n clear: both;\n display: table; /* clear floating */\n }\n.fc-theme-standard .fc-list-day-cushion {\n background-color: var(--fc-neutral-bg-color);\n }\n.fc-direction-ltr .fc-list-day-text,\n.fc-direction-rtl .fc-list-day-side-text {\n float: left;\n}\n.fc-direction-ltr .fc-list-day-side-text,\n.fc-direction-rtl .fc-list-day-text {\n float: right;\n}\n/* make the dot closer to the event title */\n.fc-direction-ltr .fc-list-table .fc-list-event-graphic { padding-right: 0 }\n.fc-direction-rtl .fc-list-table .fc-list-event-graphic { padding-left: 0 }\n.fc .fc-list-event.fc-event-forced-url {\n cursor: pointer; /* whole row will seem clickable */\n }\n.fc .fc-list-event:hover td {\n background-color: var(--fc-list-event-hover-bg-color);\n }\n.fc {\n\n /* shrink certain cols */\n\n}\n.fc .fc-list-event-graphic,\n .fc .fc-list-event-time {\n white-space: nowrap;\n width: 1px;\n }\n.fc .fc-list-event-dot {\n display: inline-block;\n box-sizing: content-box;\n width: 0;\n height: 0;\n border: calc(var(--fc-list-event-dot-width) / 2) solid var(--fc-event-border-color);\n border-radius: calc(var(--fc-list-event-dot-width) / 2);\n }\n.fc {\n\n /* reset <a> styling */\n\n}\n.fc .fc-list-event-title a {\n color: inherit;\n text-decoration: none;\n }\n.fc {\n\n /* underline link when hovering over any part of row */\n\n}\n.fc .fc-list-event.fc-event-forced-url:hover a {\n text-decoration: underline;\n }\n";
|
|
20
|
+
injectStyles(css_248z);
|
|
21
|
+
|
|
22
|
+
var index = createPlugin({
|
|
23
|
+
name: '@fullcalendar/list',
|
|
24
|
+
optionRefiners: OPTION_REFINERS,
|
|
25
|
+
views: {
|
|
26
|
+
list: {
|
|
27
|
+
component: ListView,
|
|
28
|
+
buttonTextKey: 'list',
|
|
29
|
+
listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' }, // like "January 1, 2016"
|
|
30
|
+
},
|
|
31
|
+
listDay: {
|
|
32
|
+
type: 'list',
|
|
33
|
+
duration: { days: 1 },
|
|
34
|
+
listDayFormat: { weekday: 'long' }, // day-of-week is all we need. full date is probably in headerToolbar
|
|
35
|
+
},
|
|
36
|
+
listWeek: {
|
|
37
|
+
type: 'list',
|
|
38
|
+
duration: { weeks: 1 },
|
|
39
|
+
listDayFormat: { weekday: 'long' },
|
|
40
|
+
listDaySideFormat: { month: 'long', day: 'numeric', year: 'numeric' },
|
|
41
|
+
},
|
|
42
|
+
listMonth: {
|
|
43
|
+
type: 'list',
|
|
44
|
+
duration: { month: 1 },
|
|
45
|
+
listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have
|
|
46
|
+
},
|
|
47
|
+
listYear: {
|
|
48
|
+
type: 'list',
|
|
49
|
+
duration: { year: 1 },
|
|
50
|
+
listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
export { index as default };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ViewApi } from '@fullcalendar/core';
|
|
2
|
+
import { MountArg, DateComponent, ViewProps, Seg, DateMarker, EventStore, EventUiHash, DateRange, EventRenderRange } from '@fullcalendar/core/internal';
|
|
3
|
+
import { createElement } from '@fullcalendar/core/preact';
|
|
4
|
+
|
|
5
|
+
interface NoEventsContentArg {
|
|
6
|
+
text: string;
|
|
7
|
+
view: ViewApi;
|
|
8
|
+
}
|
|
9
|
+
type NoEventsMountArg = MountArg<NoEventsContentArg>;
|
|
10
|
+
declare class ListView extends DateComponent<ViewProps> {
|
|
11
|
+
private computeDateVars;
|
|
12
|
+
private eventStoreToSegs;
|
|
13
|
+
state: {
|
|
14
|
+
timeHeaderId: string;
|
|
15
|
+
eventHeaderId: string;
|
|
16
|
+
dateHeaderIdRoot: string;
|
|
17
|
+
};
|
|
18
|
+
render(): createElement.JSX.Element;
|
|
19
|
+
setRootEl: (rootEl: HTMLElement | null) => void;
|
|
20
|
+
renderEmptyMessage(): createElement.JSX.Element;
|
|
21
|
+
renderSegList(allSegs: Seg[], dayDates: DateMarker[]): createElement.JSX.Element;
|
|
22
|
+
_eventStoreToSegs(eventStore: EventStore, eventUiBases: EventUiHash, dayRanges: DateRange[]): Seg[];
|
|
23
|
+
eventRangesToSegs(eventRanges: EventRenderRange[], dayRanges: DateRange[]): any[];
|
|
24
|
+
eventRangeToSegs(eventRange: EventRenderRange, dayRanges: DateRange[]): any[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { ListView as L, NoEventsContentArg as N, NoEventsMountArg as a };
|