@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.
@@ -1,34 +1,30 @@
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');
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: internal_cjs.identity,
14
- noEventsContent: internal_cjs.identity,
15
- noEventsDidMount: internal_cjs.identity,
16
- noEventsWillUnmount: internal_cjs.identity,
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 : internal_cjs.createFormatter(input);
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
- internal_cjs.injectStyles(css_248z);
20
+ injectStyles(css_248z);
25
21
 
26
- var index = index_cjs.createPlugin({
22
+ var index = createPlugin({
27
23
  name: '@fullcalendar/list',
28
24
  optionRefiners: OPTION_REFINERS,
29
25
  views: {
30
26
  list: {
31
- component: internalCommon.ListView,
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
- exports["default"] = index;
55
+ export { index as default };
package/index.global.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- FullCalendar List View Plugin v6.0.2
2
+ FullCalendar List View Plugin v6.0.3
3
3
  Docs & License: https://fullcalendar.io/docs/list-view
4
4
  (c) 2022 Adam Shaw
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- FullCalendar List View Plugin v6.0.2
2
+ FullCalendar List View Plugin v6.0.3
3
3
  Docs & License: https://fullcalendar.io/docs/list-view
4
4
  (c) 2022 Adam Shaw
5
5
  */
package/index.js CHANGED
@@ -1,30 +1,34 @@
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';
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
- export { index as default };
59
+ exports["default"] = index;
@@ -1,75 +1,71 @@
1
- 'use strict';
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
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var internal_cjs = require('@fullcalendar/core/internal.cjs');
6
- var preact_cjs = require('@fullcalendar/core/preact.cjs');
7
-
8
- class ListViewHeaderRow extends internal_cjs.BaseComponent {
4
+ class ListViewHeaderRow extends BaseComponent {
9
5
  constructor() {
10
6
  super(...arguments);
11
7
  this.state = {
12
- textId: internal_cjs.getUniqueDomId(),
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 = internal_cjs.getDateMeta(dayDate, todayRange);
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: internal_cjs.buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: internal_cjs.buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta);
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 (preact_cjs.createElement(internal_cjs.ContentContainer, { elTag: "tr", elClasses: [
24
+ return (createElement(ContentContainer, { elTag: "tr", elClasses: [
29
25
  'fc-list-day',
30
- ...internal_cjs.getDayClassNames(dayMeta, theme),
26
+ ...getDayClassNames(dayMeta, theme),
31
27
  ], elAttrs: {
32
- 'data-date': internal_cjs.formatDayString(dayDate),
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
- preact_cjs.createElement("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId },
35
- preact_cjs.createElement(InnerContent, { elTag: "div", elClasses: [
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 (preact_cjs.createElement(preact_cjs.Fragment, null,
43
- props.text && (preact_cjs.createElement("a", Object.assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text)),
44
- props.sideText && ( /* not keyboard tabbable */preact_cjs.createElement("a", Object.assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText))));
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 = internal_cjs.createFormatter({
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 internal_cjs.BaseComponent {
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 (preact_cjs.createElement(internal_cjs.EventContainer, Object.assign({}, props, { elTag: "tr", elClasses: [
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) => (preact_cjs.createElement(preact_cjs.Fragment, null,
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
- preact_cjs.createElement("td", { "aria-hidden": true, className: "fc-list-event-graphic" },
64
- preact_cjs.createElement("span", { className: "fc-list-event-dot", style: {
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
- preact_cjs.createElement(InnerContent, { elTag: "td", elClasses: ['fc-list-event-title'], elAttrs: { headers: `${eventHeaderId} ${dateHeaderId}` } })))));
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 = internal_cjs.getSegAnchorAttrs(seg, context);
72
- return (preact_cjs.createElement("a", Object.assign({}, interactiveAttrs), seg.eventRange.def.title));
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 (internal_cjs.isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead?
80
+ else if (isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead?
85
81
  if (seg.isStart) {
86
- timeText = internal_cjs.buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end);
82
+ timeText = buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end);
87
83
  }
88
84
  else if (seg.isEnd) {
89
- timeText = internal_cjs.buildSegTimeText(seg, timeFormat, context, null, null, seg.start, eventInstance.range.end);
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 = internal_cjs.buildSegTimeText(seg, timeFormat, context);
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 (preact_cjs.createElement(internal_cjs.ContentContainer, { elTag: "td", elClasses: ['fc-list-event-time'], elAttrs: {
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 (preact_cjs.createElement("td", { className: "fc-list-event-time" }, timeText));
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 internal_cjs.DateComponent {
114
+ class ListView extends DateComponent {
119
115
  constructor() {
120
116
  super(...arguments);
121
- this.computeDateVars = internal_cjs.memoize(computeDateVars);
122
- this.eventStoreToSegs = internal_cjs.memoize(this._eventStoreToSegs);
117
+ this.computeDateVars = memoize(computeDateVars);
118
+ this.eventStoreToSegs = memoize(this._eventStoreToSegs);
123
119
  this.state = {
124
- timeHeaderId: internal_cjs.getUniqueDomId(),
125
- eventHeaderId: internal_cjs.getUniqueDomId(),
126
- dateHeaderIdRoot: internal_cjs.getUniqueDomId(),
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 (preact_cjs.createElement(internal_cjs.ViewContainer, { elRef: this.setRootEl, elClasses: [
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
- preact_cjs.createElement(internal_cjs.Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ?
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 (preact_cjs.createElement(internal_cjs.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_cjs.createElement(InnerContent, { elTag: "div", elClasses: ['fc-list-empty-cushion'] }))));
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 (preact_cjs.createElement(internal_cjs.NowTimer, { unit: "day" }, (nowDate, todayRange) => {
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 = internal_cjs.formatDayString(dayDates[dayIndex]);
167
+ let dayStr = formatDayString(dayDates[dayIndex]);
172
168
  let dateHeaderId = dateHeaderIdRoot + '-' + dayStr;
173
169
  // append a day header
174
- innerNodes.push(preact_cjs.createElement(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange }));
175
- daySegs = internal_cjs.sortEventSegs(daySegs, options.eventOrder);
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(preact_cjs.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_cjs.getSegMeta(seg, todayRange, nowDate))));
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 (preact_cjs.createElement("table", { className: 'fc-list-table ' + theme.getClass('table') },
182
- preact_cjs.createElement("thead", null,
183
- preact_cjs.createElement("tr", null,
184
- preact_cjs.createElement("th", { scope: "col", id: timeHeaderId }, options.timeHint),
185
- preact_cjs.createElement("th", { scope: "col", "aria-hidden": true }),
186
- preact_cjs.createElement("th", { scope: "col", id: eventHeaderId }, options.eventHint))),
187
- preact_cjs.createElement("tbody", null, innerNodes)));
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(internal_cjs.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges);
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 = internal_cjs.intersectRanges(range, dayRanges[dayIndex]);
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 = internal_cjs.startOfDay(dateProfile.renderRange.start);
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: internal_cjs.addDays(dayStart, 1),
245
+ end: addDays(dayStart, 1),
250
246
  });
251
- dayStart = internal_cjs.addDays(dayStart, 1);
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
- exports.ListView = ListView;
264
+ export { ListView };
package/internal.js CHANGED
@@ -1,71 +1,75 @@
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.js';
2
- import { createElement, Fragment } from '@fullcalendar/core/preact.js';
1
+ 'use strict';
3
2
 
4
- class ListViewHeaderRow extends BaseComponent {
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
- export { ListView };
268
+ exports.ListView = ListView;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fullcalendar/list",
3
- "version": "6.0.2",
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.2"
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.cjs",
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.cjs",
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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"}