@fullcalendar/timeline 7.0.0-beta.1 → 7.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.cjs +1 -1
- package/index.global.js +118 -230
- package/index.global.min.js +2 -2
- package/index.js +1 -1
- package/internal.cjs +116 -228
- package/internal.d.ts +29 -55
- package/internal.js +118 -228
- package/package.json +4 -4
package/internal.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { config, createFormatter, greatestDurationDenominator, asCleanDays, createDuration, wholeDivideDurations, asRoughMs, addDays, startOfDay, asRoughSeconds, asRoughMinutes, diffWholeDays, isInt, computeVisibleDayRange, padStart, BaseComponent, getDateMeta, ContentContainer,
|
|
1
|
+
import { config, createFormatter, greatestDurationDenominator, asCleanDays, createDuration, wholeDivideDurations, asRoughMs, addDays, startOfDay, asRoughSeconds, asRoughMinutes, diffWholeDays, isInt, computeVisibleDayRange, padStart, BaseComponent, getDateMeta, ContentContainer, joinClassNames, getDayClassName, getSlotClassName, watchWidth, setRef, RefMap, afterSize, getEventKey, SegHierarchy, groupIntersectingSegs, buildEventRangeKey, BgEvent, getEventRangeMeta, renderFill, Slicer, intersectRanges, addMs, StandardEvent, MoreLinkContainer, watchHeight, memoize, sortEventSegs, memoizeObjArg, watchSize, buildNavLinkAttrs, NowIndicatorContainer, DateComponent, getIsHeightAuto, getStickyHeaderDates, getStickyFooterScrollbar, NowTimer, rangeContainsMarker, ViewContainer, Scroller, multiplyDuration, injectStyles } from '@fullcalendar/core/internal.js';
|
|
2
2
|
import { createRef, createElement, Fragment, Component } from '@fullcalendar/core/preact.js';
|
|
3
3
|
import { ScrollerSyncer } from '@fullcalendar/scrollgrid/internal.js';
|
|
4
4
|
|
|
@@ -448,42 +448,35 @@ class TimelineSlatCell extends BaseComponent {
|
|
|
448
448
|
}
|
|
449
449
|
render() {
|
|
450
450
|
let { props, context } = this;
|
|
451
|
-
let { dateEnv, options
|
|
451
|
+
let { dateEnv, options } = context;
|
|
452
452
|
let { date, tDateProfile, isEm } = props;
|
|
453
453
|
let dateMeta = getDateMeta(props.date, props.todayRange, props.nowDate, props.dateProfile);
|
|
454
454
|
let renderProps = Object.assign(Object.assign({ date: dateEnv.toDate(props.date) }, dateMeta), { view: context.viewApi });
|
|
455
|
-
return (createElement(ContentContainer, {
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
'fc-timeline-slot-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
'fc-timeline-slot-major' :
|
|
465
|
-
'fc-timeline-slot-minor') : '',
|
|
466
|
-
...(props.isDay ?
|
|
467
|
-
getDayClassNames(dateMeta, theme) :
|
|
468
|
-
getSlotClassNames(dateMeta, theme)),
|
|
469
|
-
], elAttrs: {
|
|
455
|
+
return (createElement(ContentContainer, { tag: "div",
|
|
456
|
+
// fc-align-start shrinks width of InnerContent
|
|
457
|
+
// TODO: document this semantic className fc-timeline-slot-em
|
|
458
|
+
className: joinClassNames('fc-timeline-slot', isEm && 'fc-timeline-slot-em', tDateProfile.isTimeScale && (isInt(dateEnv.countDurationsBetween(// best to do this here?
|
|
459
|
+
tDateProfile.normalizedRange.start, props.date, tDateProfile.labelInterval)) ?
|
|
460
|
+
'fc-timeline-slot-major' :
|
|
461
|
+
'fc-timeline-slot-minor'), 'fc-timeline-slot-lane fc-cell fc-flex-col fc-align-start', props.borderStart && 'fc-border-s', props.isDay ?
|
|
462
|
+
getDayClassName(dateMeta) :
|
|
463
|
+
getSlotClassName(dateMeta)), attrs: {
|
|
470
464
|
'data-date': dateEnv.formatIso(date, {
|
|
471
465
|
omitTimeZoneOffset: true,
|
|
472
466
|
omitTime: !tDateProfile.isTimeScale,
|
|
473
467
|
}),
|
|
474
|
-
},
|
|
468
|
+
}, style: {
|
|
475
469
|
width: props.width,
|
|
476
|
-
}, renderProps: renderProps, generatorName: "slotLaneContent", customGenerator: options.slotLaneContent, classNameGenerator: options.slotLaneClassNames, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount }, (InnerContent) => (createElement(
|
|
477
|
-
createElement(InnerContent, { elTag: "div", elClasses: ['fc-cell-inner'] })))));
|
|
470
|
+
}, renderProps: renderProps, generatorName: "slotLaneContent", customGenerator: options.slotLaneContent, classNameGenerator: options.slotLaneClassNames, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount }, (InnerContent) => (createElement(InnerContent, { tag: "div", className: 'fc-cell-inner', elRef: this.innerElRef }))));
|
|
478
471
|
}
|
|
479
472
|
componentDidMount() {
|
|
480
473
|
const innerEl = this.innerElRef.current;
|
|
481
|
-
this.
|
|
474
|
+
this.disconnectInnerWidth = watchWidth(innerEl, (width) => {
|
|
482
475
|
setRef(this.props.innerWidthRef, width);
|
|
483
476
|
});
|
|
484
477
|
}
|
|
485
478
|
componentWillUnmount() {
|
|
486
|
-
this.
|
|
479
|
+
this.disconnectInnerWidth();
|
|
487
480
|
setRef(this.props.innerWidthRef, null);
|
|
488
481
|
}
|
|
489
482
|
}
|
|
@@ -509,9 +502,9 @@ class TimelineSlats extends BaseComponent {
|
|
|
509
502
|
let { tDateProfile, slotWidth } = props;
|
|
510
503
|
let { slotDates, isWeekStarts } = tDateProfile;
|
|
511
504
|
let isDay = !tDateProfile.isTimeScale && !tDateProfile.largeUnit;
|
|
512
|
-
return (createElement("div", { className: "fc-timeline-slots fc-fill fc-flex-row" }, slotDates.map((slotDate, i) => {
|
|
505
|
+
return (createElement("div", { className: "fc-timeline-slots fc-fill fc-flex-row", style: { height: props.height } }, slotDates.map((slotDate, i) => {
|
|
513
506
|
let key = slotDate.toISOString();
|
|
514
|
-
return (createElement(TimelineSlatCell, { key: key, date: slotDate, dateProfile: props.dateProfile, tDateProfile: tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, isEm: isWeekStarts[i], isDay: isDay,
|
|
507
|
+
return (createElement(TimelineSlatCell, { key: key, date: slotDate, dateProfile: props.dateProfile, tDateProfile: tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, isEm: isWeekStarts[i], isDay: isDay, borderStart: Boolean(i),
|
|
515
508
|
// ref
|
|
516
509
|
innerWidthRef: innerWidthRefMap.createRef(key),
|
|
517
510
|
// dimensions
|
|
@@ -545,30 +538,6 @@ function computeDateSnapCoverage$1(date, tDateProfile, dateEnv) {
|
|
|
545
538
|
return snapCoverage;
|
|
546
539
|
}
|
|
547
540
|
/*
|
|
548
|
-
TODO: audit!!!
|
|
549
|
-
*/
|
|
550
|
-
function coordToCss(hcoord, isRtl) {
|
|
551
|
-
if (hcoord === null) {
|
|
552
|
-
return { left: '', right: '' };
|
|
553
|
-
}
|
|
554
|
-
if (isRtl) {
|
|
555
|
-
return { right: hcoord, left: '' };
|
|
556
|
-
}
|
|
557
|
-
return { left: hcoord, right: '' };
|
|
558
|
-
}
|
|
559
|
-
/*
|
|
560
|
-
TODO: audit!!!
|
|
561
|
-
*/
|
|
562
|
-
function coordsToCss(hcoords, isRtl) {
|
|
563
|
-
if (!hcoords) {
|
|
564
|
-
return { left: '', right: '' };
|
|
565
|
-
}
|
|
566
|
-
if (isRtl) {
|
|
567
|
-
return { right: hcoords.start, left: -hcoords.end };
|
|
568
|
-
}
|
|
569
|
-
return { left: hcoords.start, right: -hcoords.end };
|
|
570
|
-
}
|
|
571
|
-
/*
|
|
572
541
|
TODO: DRY up with elsewhere?
|
|
573
542
|
*/
|
|
574
543
|
function horizontalsToCss(hcoord, isRtl) {
|
|
@@ -599,7 +568,8 @@ function createVerticalStyle(props) {
|
|
|
599
568
|
};
|
|
600
569
|
}
|
|
601
570
|
}
|
|
602
|
-
function createHorizontalStyle(
|
|
571
|
+
function createHorizontalStyle(// TODO: DRY up?
|
|
572
|
+
props, isRtl) {
|
|
603
573
|
if (props) {
|
|
604
574
|
return {
|
|
605
575
|
[isRtl ? 'right' : 'left']: props.start,
|
|
@@ -672,13 +642,13 @@ function computeDateSnapCoverage(date, tDateProfile, dateEnv) {
|
|
|
672
642
|
function computeManySegHorizontals(segs, segMinWidth, dateEnv, tDateProfile, slotWidth) {
|
|
673
643
|
const res = {};
|
|
674
644
|
for (const seg of segs) {
|
|
675
|
-
res[seg
|
|
645
|
+
res[getEventKey(seg)] = computeSegHorizontals(seg, segMinWidth, dateEnv, tDateProfile, slotWidth);
|
|
676
646
|
}
|
|
677
647
|
return res;
|
|
678
648
|
}
|
|
679
649
|
function computeSegHorizontals(seg, segMinWidth, dateEnv, tDateProfile, slotWidth) {
|
|
680
|
-
const startCoord = dateToCoord(seg.
|
|
681
|
-
const endCoord = dateToCoord(seg.
|
|
650
|
+
const startCoord = dateToCoord(seg.startDate, dateEnv, tDateProfile, slotWidth);
|
|
651
|
+
const endCoord = dateToCoord(seg.endDate, dateEnv, tDateProfile, slotWidth);
|
|
682
652
|
let size = endCoord - startCoord;
|
|
683
653
|
if (segMinWidth) {
|
|
684
654
|
size = Math.max(size, segMinWidth);
|
|
@@ -686,95 +656,58 @@ function computeSegHorizontals(seg, segMinWidth, dateEnv, tDateProfile, slotWidt
|
|
|
686
656
|
return { start: startCoord, size };
|
|
687
657
|
}
|
|
688
658
|
function computeFgSegPlacements(// mostly horizontals
|
|
689
|
-
segs, segHorizontals,
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
segEntries.push({
|
|
699
|
-
index: i,
|
|
700
|
-
seg,
|
|
701
|
-
span: {
|
|
702
|
-
start: hcoords.start,
|
|
703
|
-
end: hcoords.start + hcoords.size,
|
|
704
|
-
},
|
|
705
|
-
thickness: height,
|
|
706
|
-
});
|
|
659
|
+
segs, segHorizontals, // TODO: use Map
|
|
660
|
+
segHeights, // keyed by instanceId
|
|
661
|
+
hiddenGroupHeights, strictOrder, maxDepth) {
|
|
662
|
+
const segRanges = [];
|
|
663
|
+
// isn't it true that there will either be ALL hcoords or NONE? can optimize
|
|
664
|
+
for (const seg of segs) {
|
|
665
|
+
const hcoords = segHorizontals[getEventKey(seg)];
|
|
666
|
+
if (hcoords) {
|
|
667
|
+
segRanges.push(Object.assign(Object.assign({}, seg), { start: hcoords.start, end: hcoords.start + hcoords.size }));
|
|
707
668
|
}
|
|
708
669
|
}
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
}
|
|
716
|
-
let
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
hierarchy.maxStackCnt = -1;
|
|
726
|
-
hierarchy.addSegs(hiddenGroupEntries);
|
|
727
|
-
let visibleRects = hierarchy.toRects();
|
|
728
|
-
let segTops = {};
|
|
729
|
-
let hiddenGroupTops = {};
|
|
730
|
-
for (let rect of visibleRects) {
|
|
731
|
-
const { seg, segGroup } = rect;
|
|
732
|
-
if (seg) { // regular seg
|
|
733
|
-
segTops[seg.eventRange.instance.instanceId] = rect.levelCoord;
|
|
734
|
-
}
|
|
735
|
-
else { // hiddenGroup
|
|
736
|
-
hiddenGroupTops[segGroup.key] = rect.levelCoord;
|
|
670
|
+
const hierarchy = new SegHierarchy(segRanges, (seg) => segHeights.get(getEventKey(seg)), strictOrder, undefined, // maxCoord
|
|
671
|
+
maxDepth);
|
|
672
|
+
const segTops = new Map();
|
|
673
|
+
hierarchy.traverseSegs((seg, segTop) => {
|
|
674
|
+
segTops.set(getEventKey(seg), segTop);
|
|
675
|
+
});
|
|
676
|
+
const { hiddenSegs } = hierarchy;
|
|
677
|
+
let totalHeight = 0;
|
|
678
|
+
for (const segRange of segRanges) {
|
|
679
|
+
const segKey = getEventKey(segRange);
|
|
680
|
+
const segHeight = segHeights.get(segKey);
|
|
681
|
+
const segTop = segTops.get(segKey);
|
|
682
|
+
if (segHeight != null) {
|
|
683
|
+
if (segTop != null) {
|
|
684
|
+
totalHeight = Math.max(totalHeight, segTop + segHeight);
|
|
685
|
+
}
|
|
737
686
|
}
|
|
738
687
|
}
|
|
688
|
+
const hiddenGroups = groupIntersectingSegs(hiddenSegs);
|
|
689
|
+
const hiddenGroupTops = new Map();
|
|
690
|
+
// HACK for hiddenGroup findInsertion() call
|
|
691
|
+
hierarchy.strictOrder = true;
|
|
692
|
+
for (const hiddenGroup of hiddenGroups) {
|
|
693
|
+
const { levelCoord: top } = hierarchy.findInsertion(hiddenGroup, 0);
|
|
694
|
+
const hiddenGroupHeight = hiddenGroupHeights.get(hiddenGroup.key) || 0;
|
|
695
|
+
hiddenGroupTops.set(hiddenGroup.key, top);
|
|
696
|
+
totalHeight = Math.max(totalHeight, top + hiddenGroupHeight);
|
|
697
|
+
}
|
|
739
698
|
return [
|
|
740
699
|
segTops,
|
|
741
|
-
computeMaxBottom(segs, segTops, segHeights),
|
|
742
700
|
hiddenGroups,
|
|
743
701
|
hiddenGroupTops,
|
|
702
|
+
totalHeight,
|
|
744
703
|
];
|
|
745
704
|
}
|
|
746
|
-
function computeMaxBottom(segs, segTops, segHeights) {
|
|
747
|
-
let max = 0;
|
|
748
|
-
for (const seg of segs) {
|
|
749
|
-
const { instanceId } = seg.eventRange.instance;
|
|
750
|
-
const top = segTops[instanceId];
|
|
751
|
-
const height = segHeights.get(instanceId);
|
|
752
|
-
if (top != null && height != null) {
|
|
753
|
-
max = Math.max(max, top + height);
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
return max;
|
|
757
|
-
}
|
|
758
|
-
/*
|
|
759
|
-
TODO: converge with computeMaxBottom, but keys are different
|
|
760
|
-
*/
|
|
761
|
-
function computeMoreLinkMaxBottom(hiddenGroups, hiddenGroupTops, hiddenGroupHeights) {
|
|
762
|
-
let max = 0;
|
|
763
|
-
for (const hiddenGroup of hiddenGroups) {
|
|
764
|
-
const top = hiddenGroupTops[hiddenGroup.key];
|
|
765
|
-
const height = hiddenGroupHeights.get(hiddenGroup.key);
|
|
766
|
-
if (top != null && height != null) {
|
|
767
|
-
max = Math.max(max, top + height);
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
return max;
|
|
771
|
-
}
|
|
772
705
|
|
|
773
706
|
class TimelineLaneBg extends BaseComponent {
|
|
774
707
|
render() {
|
|
775
708
|
let { props } = this;
|
|
776
709
|
let highlightSeg = [].concat(props.eventResizeSegs, props.dateSelectionSegs);
|
|
777
|
-
return (createElement(
|
|
710
|
+
return (createElement(Fragment, null,
|
|
778
711
|
this.renderSegs(props.businessHourSegs || [], 'non-business'),
|
|
779
712
|
this.renderSegs(props.bgEventSegs || [], 'bg-event'),
|
|
780
713
|
this.renderSegs(highlightSeg, 'highlight')));
|
|
@@ -788,7 +721,7 @@ class TimelineLaneBg extends BaseComponent {
|
|
|
788
721
|
let segHorizontal = computeSegHorizontals(seg, undefined, dateEnv, tDateProfile, slotWidth);
|
|
789
722
|
hStyle = horizontalsToCss(segHorizontal, isRtl);
|
|
790
723
|
}
|
|
791
|
-
return (createElement("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-
|
|
724
|
+
return (createElement("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-fill-y", style: hStyle }, fillType === 'bg-event' ?
|
|
792
725
|
createElement(BgEvent, Object.assign({ eventRange: seg.eventRange, isStart: seg.isStart, isEnd: seg.isEnd }, getEventRangeMeta(seg.eventRange, todayRange, nowDate))) : (renderFill(fillType))));
|
|
793
726
|
})));
|
|
794
727
|
}
|
|
@@ -805,8 +738,8 @@ class TimelineLaneSlicer extends Slicer {
|
|
|
805
738
|
let slicedRange = intersectRanges(normalRange, tDateProfile.normalizedRange);
|
|
806
739
|
if (slicedRange) {
|
|
807
740
|
segs.push({
|
|
808
|
-
|
|
809
|
-
|
|
741
|
+
startDate: slicedRange.start,
|
|
742
|
+
endDate: slicedRange.end,
|
|
810
743
|
isStart: slicedRange.start.valueOf() === normalRange.start.valueOf()
|
|
811
744
|
&& isValidDate(slicedRange.start, tDateProfile, dateProfile, dateProfileGenerator),
|
|
812
745
|
isEnd: slicedRange.end.valueOf() === normalRange.end.valueOf()
|
|
@@ -828,13 +761,8 @@ class TimelineEvent extends BaseComponent {
|
|
|
828
761
|
render() {
|
|
829
762
|
let { props, context } = this;
|
|
830
763
|
let { options } = context;
|
|
831
|
-
return (createElement(StandardEvent, Object.assign({}, props, {
|
|
832
|
-
'fc-timeline-event',
|
|
833
|
-
'fc-h-event',
|
|
834
|
-
options.eventOverlap === false // TODO: fix bad default
|
|
835
|
-
? 'fc-timeline-event-spacious'
|
|
836
|
-
: ''
|
|
837
|
-
], defaultTimeFormat: DEFAULT_TIME_FORMAT, defaultDisplayEventTime: !props.isTimeScale })));
|
|
764
|
+
return (createElement(StandardEvent, Object.assign({}, props, { className: joinClassNames('fc-timeline-event', options.eventOverlap === false // TODO: fix bad default
|
|
765
|
+
&& 'fc-timeline-event-spacious', 'fc-h-event'), defaultTimeFormat: DEFAULT_TIME_FORMAT, defaultDisplayEventTime: !props.isTimeScale })));
|
|
838
766
|
}
|
|
839
767
|
}
|
|
840
768
|
|
|
@@ -842,13 +770,13 @@ class TimelineLaneMoreLink extends BaseComponent {
|
|
|
842
770
|
render() {
|
|
843
771
|
let { props } = this;
|
|
844
772
|
let { hiddenSegs, resourceId, forcedInvisibleMap } = props;
|
|
845
|
-
let
|
|
846
|
-
return (createElement(MoreLinkContainer, {
|
|
773
|
+
let dateSpanProps = resourceId ? { resourceId } : {};
|
|
774
|
+
return (createElement(MoreLinkContainer, { className: 'fc-timeline-more-link', allDayDate: null, segs: hiddenSegs, hiddenSegs: hiddenSegs, dateProfile: props.dateProfile, todayRange: props.todayRange, dateSpanProps: dateSpanProps, popoverContent: () => (createElement(Fragment, null, hiddenSegs.map((seg) => {
|
|
847
775
|
let { eventRange } = seg;
|
|
848
776
|
let instanceId = eventRange.instance.instanceId;
|
|
849
777
|
return (createElement("div", { key: instanceId, style: { visibility: forcedInvisibleMap[instanceId] ? 'hidden' : '' } },
|
|
850
778
|
createElement(TimelineEvent, Object.assign({ isTimeScale: props.isTimeScale, eventRange: eventRange, isStart: seg.isStart, isEnd: seg.isEnd, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection }, getEventRangeMeta(eventRange, props.todayRange, props.nowDate)))));
|
|
851
|
-
}))) }, (InnerContent) => (createElement(InnerContent, {
|
|
779
|
+
}))) }, (InnerContent) => (createElement(InnerContent, { tag: "div", className: 'fc-timeline-more-link-inner fc-sticky-s' }))));
|
|
852
780
|
}
|
|
853
781
|
}
|
|
854
782
|
|
|
@@ -867,12 +795,12 @@ class TimelineEventHarness extends Component {
|
|
|
867
795
|
}
|
|
868
796
|
componentDidMount() {
|
|
869
797
|
const rootEl = this.rootElRef.current; // TODO: make dynamic with useEffect
|
|
870
|
-
this.
|
|
798
|
+
this.disconnectHeight = watchHeight(rootEl, (height) => {
|
|
871
799
|
setRef(this.props.heightRef, height);
|
|
872
800
|
});
|
|
873
801
|
}
|
|
874
802
|
componentWillUnmount() {
|
|
875
|
-
this.
|
|
803
|
+
this.disconnectHeight();
|
|
876
804
|
setRef(this.props.heightRef, null);
|
|
877
805
|
}
|
|
878
806
|
}
|
|
@@ -905,7 +833,7 @@ class TimelineLane extends BaseComponent {
|
|
|
905
833
|
TODO: lots of memoization needed here!
|
|
906
834
|
*/
|
|
907
835
|
render() {
|
|
908
|
-
let { props, context, segHeightRefMap } = this;
|
|
836
|
+
let { props, context, segHeightRefMap, moreLinkHeightRefMap } = this;
|
|
909
837
|
let { options } = context;
|
|
910
838
|
let { dateProfile, tDateProfile } = props;
|
|
911
839
|
let slicedProps = this.slicer.sliceProps(props, dateProfile, tDateProfile.isTimeScale ? null : props.nextDayThreshold, context, // wish we didn't have to pass in the rest of the args...
|
|
@@ -917,10 +845,7 @@ class TimelineLane extends BaseComponent {
|
|
|
917
845
|
let fgSegHorizontals = props.slotWidth != null
|
|
918
846
|
? computeManySegHorizontals(fgSegs, options.eventMinWidth, context.dateEnv, tDateProfile, props.slotWidth)
|
|
919
847
|
: {};
|
|
920
|
-
let [fgSegTops,
|
|
921
|
-
fgSegs, fgSegHorizontals, segHeightRefMap.current, options.eventOrderStrict, options.eventMaxStack);
|
|
922
|
-
let moreLinksBottom = computeMoreLinkMaxBottom(hiddenGroups, hiddenGroupTops, this.moreLinkHeightRefMap.current);
|
|
923
|
-
let innerHeight = Math.max(moreLinksBottom, fgSegsBottom);
|
|
848
|
+
let [fgSegTops, hiddenGroups, hiddenGroupTops, totalHeight] = computeFgSegPlacements(fgSegs, fgSegHorizontals, segHeightRefMap.current, moreLinkHeightRefMap.current, options.eventOrderStrict, options.eventMaxStack);
|
|
924
849
|
let forcedInvisibleMap = // TODO: more convenient/DRY
|
|
925
850
|
(slicedProps.eventDrag ? slicedProps.eventDrag.affectedInstances : null) ||
|
|
926
851
|
(slicedProps.eventResize ? slicedProps.eventResize.affectedInstances : null) ||
|
|
@@ -931,20 +856,18 @@ class TimelineLane extends BaseComponent {
|
|
|
931
856
|
bgEventSegs: slicedProps.bgEventSegs, businessHourSegs: slicedProps.businessHourSegs, dateSelectionSegs: slicedProps.dateSelectionSegs, eventResizeSegs: slicedProps.eventResize ? slicedProps.eventResize.segs : [] /* bad new empty array? */,
|
|
932
857
|
// dimensions
|
|
933
858
|
slotWidth: props.slotWidth }),
|
|
934
|
-
createElement("div", { className:
|
|
935
|
-
'fc-timeline-events'
|
|
936
|
-
'fc-content-box',
|
|
937
|
-
options.eventOverlap === false // TODO: fix bad default
|
|
938
|
-
? 'fc-timeline-events-overlap-disabled'
|
|
939
|
-
: 'fc-timeline-events-overlap-enabled'
|
|
940
|
-
].join(' '), style: { height: innerHeight } },
|
|
859
|
+
createElement("div", { className: joinClassNames('fc-timeline-events', options.eventOverlap === false // TODO: fix bad default
|
|
860
|
+
? 'fc-timeline-events-overlap-disabled'
|
|
861
|
+
: 'fc-timeline-events-overlap-enabled', 'fc-content-box'), style: { height: totalHeight } },
|
|
941
862
|
this.renderFgSegs(fgSegs, fgSegHorizontals, fgSegTops, forcedInvisibleMap, hiddenGroups, hiddenGroupTops, false, // isDragging
|
|
942
863
|
false, // isResizing
|
|
943
864
|
false),
|
|
944
865
|
this.renderFgSegs(mirrorSegs, props.slotWidth // TODO: memoize
|
|
945
866
|
? computeManySegHorizontals(mirrorSegs, options.eventMinWidth, context.dateEnv, tDateProfile, props.slotWidth)
|
|
946
867
|
: {}, fgSegTops, {}, // forcedInvisibleMap
|
|
947
|
-
[],
|
|
868
|
+
[], // hiddenGroups
|
|
869
|
+
new Map(), // hiddenGroupTops
|
|
870
|
+
Boolean(slicedProps.eventDrag), Boolean(slicedProps.eventResize), false))));
|
|
948
871
|
}
|
|
949
872
|
renderFgSegs(segs, segHorizontals, segTops, forcedInvisibleMap, hiddenGroups, hiddenGroupTops, isDragging, isResizing, isDateSelecting) {
|
|
950
873
|
let { props, context, segHeightRefMap, moreLinkHeightRefMap } = this;
|
|
@@ -953,18 +876,18 @@ class TimelineLane extends BaseComponent {
|
|
|
953
876
|
segs.map((seg) => {
|
|
954
877
|
const { eventRange } = seg;
|
|
955
878
|
const { instanceId } = eventRange.instance;
|
|
956
|
-
const segTop = segTops
|
|
879
|
+
const segTop = segTops.get(instanceId);
|
|
957
880
|
const segHorizontal = segHorizontals[instanceId];
|
|
958
881
|
const isVisible = isMirror ||
|
|
959
882
|
(segHorizontal && segTop != null && !forcedInvisibleMap[instanceId]);
|
|
960
883
|
return (createElement(TimelineEventHarness, { key: instanceId, style: Object.assign({ visibility: isVisible ? '' : 'hidden', top: segTop || 0 }, horizontalsToCss(segHorizontal, context.isRtl)), heightRef: isMirror ? undefined : segHeightRefMap.createRef(instanceId) },
|
|
961
884
|
createElement(TimelineEvent, Object.assign({ isTimeScale: props.tDateProfile.isTimeScale, eventRange: eventRange, isStart: seg.isStart, isEnd: seg.isEnd, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === props.eventSelection /* TODO: bad for mirror? */ }, getEventRangeMeta(eventRange, props.todayRange, props.nowDate)))));
|
|
962
885
|
}),
|
|
963
|
-
hiddenGroups.map((hiddenGroup) => (createElement(TimelineEventHarness, { key: hiddenGroup.key, style: Object.assign({ top: hiddenGroupTops
|
|
964
|
-
start: hiddenGroup.
|
|
965
|
-
size: hiddenGroup.
|
|
886
|
+
hiddenGroups.map((hiddenGroup) => (createElement(TimelineEventHarness, { key: hiddenGroup.key, style: Object.assign({ top: hiddenGroupTops.get(hiddenGroup.key) || 0 }, horizontalsToCss({
|
|
887
|
+
start: hiddenGroup.start,
|
|
888
|
+
size: hiddenGroup.end - hiddenGroup.start
|
|
966
889
|
}, context.isRtl)), heightRef: moreLinkHeightRefMap.createRef(hiddenGroup.key) },
|
|
967
|
-
createElement(TimelineLaneMoreLink, { hiddenSegs: hiddenGroup.segs
|
|
890
|
+
createElement(TimelineLaneMoreLink, { hiddenSegs: hiddenGroup.segs, dateProfile: props.dateProfile, nowDate: props.nowDate, todayRange: props.todayRange, isTimeScale: props.tDateProfile.isTimeScale, eventSelection: props.eventSelection, resourceId: props.resourceId, forcedInvisibleMap: forcedInvisibleMap }))))));
|
|
968
891
|
}
|
|
969
892
|
}
|
|
970
893
|
|
|
@@ -992,36 +915,21 @@ class TimelineHeaderCell extends BaseComponent {
|
|
|
992
915
|
dateEnv: context.dateEnv,
|
|
993
916
|
viewApi: context.viewApi,
|
|
994
917
|
});
|
|
995
|
-
return (createElement(ContentContainer, {
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
'fc-flex-column',
|
|
1002
|
-
'fc-justify-center',
|
|
1003
|
-
props.isCentered ? 'fc-align-center' : 'fc-align-start',
|
|
1004
|
-
...( // TODO: so slot classnames for week/month/bigger. see note above about rowUnit
|
|
1005
|
-
cell.rowUnit === 'time' ?
|
|
1006
|
-
getSlotClassNames(dateMeta, context.theme) :
|
|
1007
|
-
getDayClassNames(dateMeta, context.theme)),
|
|
1008
|
-
], elAttrs: {
|
|
918
|
+
return (createElement(ContentContainer, { tag: "div", className: joinClassNames('fc-timeline-slot-label fc-timeline-slot', cell.isWeekStart && 'fc-timeline-slot-em', // TODO: document this semantic className
|
|
919
|
+
'fc-header-cell fc-cell fc-flex-col fc-justify-center', props.borderStart && 'fc-border-s', props.isCentered ? 'fc-align-center' : 'fc-align-start',
|
|
920
|
+
// TODO: so slot classnames for week/month/bigger. see note above about rowUnit
|
|
921
|
+
cell.rowUnit === 'time' ?
|
|
922
|
+
getSlotClassName(dateMeta) :
|
|
923
|
+
getDayClassName(dateMeta)), attrs: {
|
|
1009
924
|
'data-date': dateEnv.formatIso(cell.date, {
|
|
1010
925
|
omitTime: !tDateProfile.isTimeScale,
|
|
1011
926
|
omitTimeZoneOffset: true,
|
|
1012
927
|
}),
|
|
1013
|
-
},
|
|
928
|
+
}, style: {
|
|
1014
929
|
width: props.slotWidth != null
|
|
1015
930
|
? props.slotWidth * cell.colspan
|
|
1016
931
|
: undefined,
|
|
1017
|
-
}, renderProps: renderProps, generatorName: "slotLabelContent", customGenerator: options.slotLabelContent, defaultGenerator: renderInnerContent, classNameGenerator: options.slotLabelClassNames, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, (InnerContent) => (createElement(
|
|
1018
|
-
'fc-flex-column',
|
|
1019
|
-
props.isSticky ? 'fc-sticky-x' : '',
|
|
1020
|
-
].join(' ') },
|
|
1021
|
-
createElement(InnerContent, { elTag: "a", elClasses: [
|
|
1022
|
-
'fc-cell-inner',
|
|
1023
|
-
'fc-padding-md',
|
|
1024
|
-
], elAttrs: this.buildCellNavLinkAttrs(context, cell.date, cell.rowUnit) })))));
|
|
932
|
+
}, renderProps: renderProps, generatorName: "slotLabelContent", customGenerator: options.slotLabelContent, defaultGenerator: renderInnerContent, classNameGenerator: options.slotLabelClassNames, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, (InnerContent) => (createElement(InnerContent, { tag: "a", attrs: this.buildCellNavLinkAttrs(context, cell.date, cell.rowUnit), className: joinClassNames('fc-cell-inner fc-padding-md', props.isSticky && 'fc-sticky-s'), elRef: this.innerElRef }))));
|
|
1025
933
|
}
|
|
1026
934
|
componentDidMount() {
|
|
1027
935
|
const { props } = this;
|
|
@@ -1095,13 +1003,14 @@ class TimelineHeaderRow extends BaseComponent {
|
|
|
1095
1003
|
const { props, innerWidthRefMap, innerHeightRefMap } = this;
|
|
1096
1004
|
const isCentered = !(props.tDateProfile.isTimeScale && props.isLastRow);
|
|
1097
1005
|
const isSticky = !props.isLastRow;
|
|
1098
|
-
return (createElement("div", { className: 'fc-row',
|
|
1006
|
+
return (createElement("div", { className: joinClassNames('fc-flex-row fc-grow', // TODO: move fc-grow to parent?
|
|
1007
|
+
!props.isLastRow && 'fc-border-b') }, props.cells.map((cell, cellI) => {
|
|
1099
1008
|
// TODO: make this part of the cell obj?
|
|
1100
1009
|
// TODO: rowUnit seems wrong sometimes. says 'month' when it should be day
|
|
1101
1010
|
// TODO: rowUnit is relevant to whole row. put it on a row object, not the cells
|
|
1102
1011
|
// TODO: use rowUnit to key the Row itself?
|
|
1103
1012
|
const key = cell.rowUnit + ':' + cell.date.toISOString();
|
|
1104
|
-
return (createElement(TimelineHeaderCell, { key: key, cell: cell, rowLevel: props.rowLevel, dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, todayRange: props.todayRange, nowDate: props.nowDate, isCentered: isCentered, isSticky: isSticky,
|
|
1013
|
+
return (createElement(TimelineHeaderCell, { key: key, cell: cell, rowLevel: props.rowLevel, dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, todayRange: props.todayRange, nowDate: props.nowDate, isCentered: isCentered, isSticky: isSticky, borderStart: Boolean(cellI),
|
|
1105
1014
|
// refs
|
|
1106
1015
|
innerWidthRef: innerWidthRefMap.createRef(key), innerHeightRef: innerHeightRefMap.createRef(key),
|
|
1107
1016
|
// dimensions
|
|
@@ -1119,7 +1028,7 @@ class TimelineNowIndicatorLine extends BaseComponent {
|
|
|
1119
1028
|
const { props, context } = this;
|
|
1120
1029
|
return (createElement("div", { className: "fc-timeline-now-indicator-container" },
|
|
1121
1030
|
createElement(NowIndicatorContainer // TODO: make separate component?
|
|
1122
|
-
, {
|
|
1031
|
+
, { className: 'fc-timeline-now-indicator-line', style: props.slotWidth != null
|
|
1123
1032
|
? horizontalCoordToCss(dateToCoord(props.nowDate, context.dateEnv, props.tDateProfile, props.slotWidth), context.isRtl)
|
|
1124
1033
|
: {}, isAxis: false, date: props.nowDate })));
|
|
1125
1034
|
}
|
|
@@ -1129,7 +1038,7 @@ class TimelineNowIndicatorArrow extends BaseComponent {
|
|
|
1129
1038
|
render() {
|
|
1130
1039
|
const { props, context } = this;
|
|
1131
1040
|
return (createElement("div", { className: "fc-timeline-now-indicator-container" },
|
|
1132
|
-
createElement(NowIndicatorContainer, {
|
|
1041
|
+
createElement(NowIndicatorContainer, { className: 'fc-timeline-now-indicator-arrow', style: props.slotWidth != null
|
|
1133
1042
|
? horizontalCoordToCss(dateToCoord(props.nowDate, context.dateEnv, props.tDateProfile, props.slotWidth), context.isRtl)
|
|
1134
1043
|
: {}, isAxis: true, date: props.nowDate })));
|
|
1135
1044
|
}
|
|
@@ -1162,19 +1071,14 @@ class TimelineView extends DateComponent {
|
|
|
1162
1071
|
this.setState({ slotInnerWidth });
|
|
1163
1072
|
}
|
|
1164
1073
|
};
|
|
1165
|
-
this.
|
|
1166
|
-
this.setState({
|
|
1167
|
-
scrollerWidth,
|
|
1168
|
-
});
|
|
1169
|
-
};
|
|
1170
|
-
this.handleLeftScrollbarWidth = (leftScrollbarWidth) => {
|
|
1074
|
+
this.handleClientWidth = (clientWidth) => {
|
|
1171
1075
|
this.setState({
|
|
1172
|
-
|
|
1076
|
+
clientWidth,
|
|
1173
1077
|
});
|
|
1174
1078
|
};
|
|
1175
|
-
this.
|
|
1079
|
+
this.handleEndScrollbarWidth = (endScrollbarWidth) => {
|
|
1176
1080
|
this.setState({
|
|
1177
|
-
|
|
1081
|
+
endScrollbarWidth
|
|
1178
1082
|
});
|
|
1179
1083
|
};
|
|
1180
1084
|
this.handleTimeScroll = (scrollTime) => {
|
|
@@ -1186,7 +1090,7 @@ class TimelineView extends DateComponent {
|
|
|
1186
1090
|
if (scrollTime != null && slotWidth != null) {
|
|
1187
1091
|
let x = timeToCoord(scrollTime, context.dateEnv, props.dateProfile, tDateProfile, slotWidth);
|
|
1188
1092
|
if (x) {
|
|
1189
|
-
x +=
|
|
1093
|
+
x += 1; // overcome border. TODO: DRY this up
|
|
1190
1094
|
}
|
|
1191
1095
|
this.syncedScroller.scrollTo({ x });
|
|
1192
1096
|
}
|
|
@@ -1219,44 +1123,30 @@ class TimelineView extends DateComponent {
|
|
|
1219
1123
|
const stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(options);
|
|
1220
1124
|
/* table positions */
|
|
1221
1125
|
const [canvasWidth, slotWidth] = this.computeSlotWidth(tDateProfile.slotCnt, tDateProfile.slotsPerLabel, options.slotMinWidth, state.slotInnerWidth, // is ACTUALLY the label width. rename?
|
|
1222
|
-
state.
|
|
1126
|
+
state.clientWidth);
|
|
1223
1127
|
this.slotWidth = slotWidth;
|
|
1224
1128
|
return (createElement(NowTimer, { unit: timerUnit }, (nowDate, todayRange) => {
|
|
1225
1129
|
const enableNowIndicator = // TODO: DRY
|
|
1226
1130
|
options.nowIndicator &&
|
|
1227
1131
|
slotWidth != null &&
|
|
1228
1132
|
rangeContainsMarker(props.dateProfile.currentRange, nowDate);
|
|
1229
|
-
return (createElement(ViewContainer, { viewSpec: context.viewSpec,
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
'fc-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
createElement("div", { className: 'fc-rel fc-content-box' // origin for now-indicator
|
|
1240
|
-
, style: {
|
|
1241
|
-
width: canvasWidth,
|
|
1242
|
-
paddingLeft: state.leftScrollbarWidth,
|
|
1243
|
-
paddingRight: state.rightScrollbarWidth,
|
|
1244
|
-
} },
|
|
1245
|
-
createElement("div", null, cellRows.map((cells, rowLevel) => {
|
|
1133
|
+
return (createElement(ViewContainer, { viewSpec: context.viewSpec, className: joinClassNames('fc-timeline fc-border',
|
|
1134
|
+
// HACK for Safari print-mode, where fc-scroller-no-bars won't take effect for
|
|
1135
|
+
// the below Scrollers if they have liquid flex height
|
|
1136
|
+
!props.forPrint && 'fc-flex-col') },
|
|
1137
|
+
createElement(Scroller, { horizontal: true, hideScrollbars: true, className: joinClassNames('fc-timeline-header fc-flex-row fc-border-b', stickyHeaderDates && 'fc-table-header-sticky'), ref: this.headerScrollerRef },
|
|
1138
|
+
createElement("div", {
|
|
1139
|
+
// TODO: DRY
|
|
1140
|
+
className: joinClassNames('fc-rel', // origin for now-indicator
|
|
1141
|
+
canvasWidth == null && 'fc-liquid'), style: { width: canvasWidth } },
|
|
1142
|
+
cellRows.map((cells, rowLevel) => {
|
|
1246
1143
|
const isLast = rowLevel === cellRows.length - 1;
|
|
1247
1144
|
return (createElement(TimelineHeaderRow, { key: rowLevel, dateProfile: props.dateProfile, tDateProfile: tDateProfile, nowDate: nowDate, todayRange: todayRange, rowLevel: rowLevel, isLastRow: isLast, cells: cells, slotWidth: slotWidth, innerWidthRef: this.headerRowInnerWidthMap.createRef(rowLevel) }));
|
|
1248
|
-
})
|
|
1249
|
-
enableNowIndicator && (
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
'fc-timeline-body',
|
|
1254
|
-
'fc-rowgroup',
|
|
1255
|
-
verticalScrolling ? 'fc-liquid' : '',
|
|
1256
|
-
], ref: this.bodyScrollerRef, widthRef: this.handleScrollerWidth, leftScrollbarWidthRef: this.handleLeftScrollbarWidth, rightScrollbarWidthRef: this.handleRightScrollbarWidth },
|
|
1257
|
-
createElement("div", { className: "fc-rel fc-grow", style: {
|
|
1258
|
-
width: canvasWidth,
|
|
1259
|
-
}, ref: this.handeBodyEl },
|
|
1145
|
+
}),
|
|
1146
|
+
enableNowIndicator && (createElement(TimelineNowIndicatorArrow, { tDateProfile: tDateProfile, nowDate: nowDate, slotWidth: slotWidth }))),
|
|
1147
|
+
Boolean(state.endScrollbarWidth) && (createElement("div", { className: 'fc-border-s fc-filler', style: { minWidth: state.endScrollbarWidth } }))),
|
|
1148
|
+
createElement(Scroller, { vertical: verticalScrolling, horizontal: true, hideScrollbars: props.forPrint, className: joinClassNames('fc-timeline-body fc-flex-col', verticalScrolling && 'fc-liquid'), ref: this.bodyScrollerRef, clientWidthRef: this.handleClientWidth, endScrollbarWidthRef: this.handleEndScrollbarWidth },
|
|
1149
|
+
createElement("div", { className: "fc-rel fc-grow", style: { width: canvasWidth }, ref: this.handeBodyEl },
|
|
1260
1150
|
createElement(TimelineSlats, { dateProfile: props.dateProfile, tDateProfile: tDateProfile, nowDate: nowDate, todayRange: todayRange,
|
|
1261
1151
|
// ref
|
|
1262
1152
|
innerWidthRef: this.handleBodySlotInnerWidth,
|
|
@@ -1349,7 +1239,7 @@ class TimelineView extends DateComponent {
|
|
|
1349
1239
|
}
|
|
1350
1240
|
}
|
|
1351
1241
|
|
|
1352
|
-
var css_248z = ".fc-timeline-slots{z-index:1}.fc-timeline-
|
|
1242
|
+
var css_248z = ".fc-timeline-slots{z-index:1}.fc-timeline-events{position:relative;z-index:2}.fc-timeline-slot-minor{border-style:dotted}.fc-timeline-events-overlap-enabled{padding-bottom:10px}.fc-timeline-event{border-radius:0;font-size:var(--fc-small-font-size);margin-bottom:1px}.fc-direction-ltr .fc-timeline-event.fc-event-end{margin-right:1px}.fc-direction-rtl .fc-timeline-event.fc-event-end{margin-left:1px}.fc-timeline-event .fc-event-inner{align-items:center;display:flex;flex-direction:row;padding:2px 1px}.fc-timeline-event-spacious .fc-event-inner{padding-bottom:5px;padding-top:5px}.fc-timeline-event .fc-event-time{font-weight:700}.fc-timeline-event .fc-event-time,.fc-timeline-event .fc-event-title{padding:0 2px}.fc-timeline-event:not(.fc-event-end) .fc-event-inner:after,.fc-timeline-event:not(.fc-event-start) .fc-event-inner:before{border-color:transparent #000;border-style:solid;border-width:5px;content:\"\";flex-grow:0;flex-shrink:0;height:0;margin:0 1px;opacity:.5;width:0}.fc-direction-ltr .fc-timeline-event:not(.fc-event-start) .fc-event-inner:before,.fc-direction-rtl .fc-timeline-event:not(.fc-event-end) .fc-event-inner:after{border-left:0}.fc-direction-ltr .fc-timeline-event:not(.fc-event-end) .fc-event-inner:after,.fc-direction-rtl .fc-timeline-event:not(.fc-event-start) .fc-event-inner:before{border-right:0}.fc-timeline-more-link{align-items:flex-start;background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;display:flex;flex-direction:column;font-size:var(--fc-small-font-size);padding:1px}.fc-direction-ltr .fc-timeline-more-link{margin-right:1px}.fc-direction-rtl .fc-timeline-more-link{margin-left:1px}.fc-timeline-more-link-inner{padding:2px}.fc-timeline-now-indicator-container{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;z-index:4}.fc-timeline-now-indicator-arrow{border-bottom-style:solid;border-bottom-width:0;border-color:var(--fc-now-indicator-color);border-left:5px solid transparent;border-right:5px solid transparent;border-top-style:solid;border-top-width:6px;height:0;margin:0 -5px;position:absolute;top:0;width:0}.fc-timeline-now-indicator-line{border-left:1px solid var(--fc-now-indicator-color);bottom:0;position:absolute;top:0}";
|
|
1353
1243
|
injectStyles(css_248z);
|
|
1354
1244
|
|
|
1355
|
-
export { TimelineHeaderRow, TimelineLane, TimelineLaneBg, TimelineLaneSlicer, TimelineNowIndicatorArrow, TimelineNowIndicatorLine, TimelineSlats, TimelineView, buildTimelineDateProfile, computeSlotWidth,
|
|
1245
|
+
export { TimelineHeaderRow, TimelineLane, TimelineLaneBg, TimelineLaneSlicer, TimelineNowIndicatorArrow, TimelineNowIndicatorLine, TimelineSlats, TimelineView, buildTimelineDateProfile, computeSlotWidth, createHorizontalStyle, createVerticalStyle, timeToCoord };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fullcalendar/timeline",
|
|
3
|
-
"version": "7.0.0-beta.
|
|
3
|
+
"version": "7.0.0-beta.3",
|
|
4
4
|
"title": "FullCalendar Timeline Plugin",
|
|
5
5
|
"description": "Display events on a horizontal time axis (without resources)",
|
|
6
6
|
"keywords": [
|
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
],
|
|
16
16
|
"homepage": "https://fullcalendar.io/docs/timeline-view-no-resources",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@fullcalendar/premium-common": "7.0.0-beta.
|
|
19
|
-
"@fullcalendar/scrollgrid": "7.0.0-beta.
|
|
18
|
+
"@fullcalendar/premium-common": "7.0.0-beta.3",
|
|
19
|
+
"@fullcalendar/scrollgrid": "7.0.0-beta.3"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"@fullcalendar/core": "7.0.0-beta.
|
|
22
|
+
"@fullcalendar/core": "7.0.0-beta.3"
|
|
23
23
|
},
|
|
24
24
|
"type": "module",
|
|
25
25
|
"bugs": "https://fullcalendar.io/reporting-bugs",
|