fullcalendar 6.0.0-beta.4 → 6.0.1
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/README.md +52 -9
- package/index.cjs +6 -7
- package/index.global.js +861 -852
- package/index.global.min.js +3 -3
- package/index.js +2 -2
- package/package.json +14 -15
package/index.global.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
FullCalendar Standard Bundle v6.0.
|
|
3
|
-
Docs & License: https://fullcalendar.io/
|
|
2
|
+
FullCalendar Standard Bundle v6.0.1
|
|
3
|
+
Docs & License: https://fullcalendar.io/docs/initialize-globals
|
|
4
4
|
(c) 2022 Adam Shaw
|
|
5
5
|
*/
|
|
6
6
|
var FullCalendar = (function (exports) {
|
|
@@ -251,8 +251,6 @@ var FullCalendar = (function (exports) {
|
|
|
251
251
|
return res;
|
|
252
252
|
}
|
|
253
253
|
|
|
254
|
-
const globalLocales = [];
|
|
255
|
-
|
|
256
254
|
// TODO: new util arrayify?
|
|
257
255
|
function removeExact(array, exactVal) {
|
|
258
256
|
let removeCnt = 0;
|
|
@@ -689,165 +687,6 @@ var FullCalendar = (function (exports) {
|
|
|
689
687
|
contentWidthEl.getBoundingClientRect().width;
|
|
690
688
|
}
|
|
691
689
|
|
|
692
|
-
// TODO: easier way to add new hooks? need to update a million things
|
|
693
|
-
function createPlugin(input) {
|
|
694
|
-
return {
|
|
695
|
-
id: guid(),
|
|
696
|
-
name: input.name,
|
|
697
|
-
premiumReleaseDate: input.premiumReleaseDate ? new Date(input.premiumReleaseDate) : undefined,
|
|
698
|
-
deps: input.deps || [],
|
|
699
|
-
reducers: input.reducers || [],
|
|
700
|
-
isLoadingFuncs: input.isLoadingFuncs || [],
|
|
701
|
-
contextInit: [].concat(input.contextInit || []),
|
|
702
|
-
eventRefiners: input.eventRefiners || {},
|
|
703
|
-
eventDefMemberAdders: input.eventDefMemberAdders || [],
|
|
704
|
-
eventSourceRefiners: input.eventSourceRefiners || {},
|
|
705
|
-
isDraggableTransformers: input.isDraggableTransformers || [],
|
|
706
|
-
eventDragMutationMassagers: input.eventDragMutationMassagers || [],
|
|
707
|
-
eventDefMutationAppliers: input.eventDefMutationAppliers || [],
|
|
708
|
-
dateSelectionTransformers: input.dateSelectionTransformers || [],
|
|
709
|
-
datePointTransforms: input.datePointTransforms || [],
|
|
710
|
-
dateSpanTransforms: input.dateSpanTransforms || [],
|
|
711
|
-
views: input.views || {},
|
|
712
|
-
viewPropsTransformers: input.viewPropsTransformers || [],
|
|
713
|
-
isPropsValid: input.isPropsValid || null,
|
|
714
|
-
externalDefTransforms: input.externalDefTransforms || [],
|
|
715
|
-
viewContainerAppends: input.viewContainerAppends || [],
|
|
716
|
-
eventDropTransformers: input.eventDropTransformers || [],
|
|
717
|
-
componentInteractions: input.componentInteractions || [],
|
|
718
|
-
calendarInteractions: input.calendarInteractions || [],
|
|
719
|
-
themeClasses: input.themeClasses || {},
|
|
720
|
-
eventSourceDefs: input.eventSourceDefs || [],
|
|
721
|
-
cmdFormatter: input.cmdFormatter,
|
|
722
|
-
recurringTypes: input.recurringTypes || [],
|
|
723
|
-
namedTimeZonedImpl: input.namedTimeZonedImpl,
|
|
724
|
-
initialView: input.initialView || '',
|
|
725
|
-
elementDraggingImpl: input.elementDraggingImpl,
|
|
726
|
-
optionChangeHandlers: input.optionChangeHandlers || {},
|
|
727
|
-
scrollGridImpl: input.scrollGridImpl || null,
|
|
728
|
-
listenerRefiners: input.listenerRefiners || {},
|
|
729
|
-
optionRefiners: input.optionRefiners || {},
|
|
730
|
-
propSetHandlers: input.propSetHandlers || {},
|
|
731
|
-
};
|
|
732
|
-
}
|
|
733
|
-
function buildPluginHooks(pluginDefs, globalDefs) {
|
|
734
|
-
let currentPluginIds = {};
|
|
735
|
-
let hooks = {
|
|
736
|
-
premiumReleaseDate: undefined,
|
|
737
|
-
reducers: [],
|
|
738
|
-
isLoadingFuncs: [],
|
|
739
|
-
contextInit: [],
|
|
740
|
-
eventRefiners: {},
|
|
741
|
-
eventDefMemberAdders: [],
|
|
742
|
-
eventSourceRefiners: {},
|
|
743
|
-
isDraggableTransformers: [],
|
|
744
|
-
eventDragMutationMassagers: [],
|
|
745
|
-
eventDefMutationAppliers: [],
|
|
746
|
-
dateSelectionTransformers: [],
|
|
747
|
-
datePointTransforms: [],
|
|
748
|
-
dateSpanTransforms: [],
|
|
749
|
-
views: {},
|
|
750
|
-
viewPropsTransformers: [],
|
|
751
|
-
isPropsValid: null,
|
|
752
|
-
externalDefTransforms: [],
|
|
753
|
-
viewContainerAppends: [],
|
|
754
|
-
eventDropTransformers: [],
|
|
755
|
-
componentInteractions: [],
|
|
756
|
-
calendarInteractions: [],
|
|
757
|
-
themeClasses: {},
|
|
758
|
-
eventSourceDefs: [],
|
|
759
|
-
cmdFormatter: null,
|
|
760
|
-
recurringTypes: [],
|
|
761
|
-
namedTimeZonedImpl: null,
|
|
762
|
-
initialView: '',
|
|
763
|
-
elementDraggingImpl: null,
|
|
764
|
-
optionChangeHandlers: {},
|
|
765
|
-
scrollGridImpl: null,
|
|
766
|
-
listenerRefiners: {},
|
|
767
|
-
optionRefiners: {},
|
|
768
|
-
propSetHandlers: {},
|
|
769
|
-
};
|
|
770
|
-
function addDefs(defs) {
|
|
771
|
-
for (let def of defs) {
|
|
772
|
-
const pluginName = def.name;
|
|
773
|
-
const currentId = currentPluginIds[pluginName];
|
|
774
|
-
if (currentId === undefined) {
|
|
775
|
-
currentPluginIds[pluginName] = def.id;
|
|
776
|
-
addDefs(def.deps);
|
|
777
|
-
hooks = combineHooks(hooks, def);
|
|
778
|
-
}
|
|
779
|
-
else if (currentId !== def.id) {
|
|
780
|
-
// different ID than the one already added
|
|
781
|
-
console.warn(`Duplicate plugin '${pluginName}'`);
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
if (pluginDefs) {
|
|
786
|
-
addDefs(pluginDefs);
|
|
787
|
-
}
|
|
788
|
-
addDefs(globalDefs);
|
|
789
|
-
return hooks;
|
|
790
|
-
}
|
|
791
|
-
function buildBuildPluginHooks() {
|
|
792
|
-
let currentOverrideDefs = [];
|
|
793
|
-
let currentGlobalDefs = [];
|
|
794
|
-
let currentHooks;
|
|
795
|
-
return (overrideDefs, globalDefs) => {
|
|
796
|
-
if (!currentHooks || !isArraysEqual(overrideDefs, currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) {
|
|
797
|
-
currentHooks = buildPluginHooks(overrideDefs, globalDefs);
|
|
798
|
-
}
|
|
799
|
-
currentOverrideDefs = overrideDefs;
|
|
800
|
-
currentGlobalDefs = globalDefs;
|
|
801
|
-
return currentHooks;
|
|
802
|
-
};
|
|
803
|
-
}
|
|
804
|
-
function combineHooks(hooks0, hooks1) {
|
|
805
|
-
return {
|
|
806
|
-
premiumReleaseDate: compareOptionalDates(hooks0.premiumReleaseDate, hooks1.premiumReleaseDate),
|
|
807
|
-
reducers: hooks0.reducers.concat(hooks1.reducers),
|
|
808
|
-
isLoadingFuncs: hooks0.isLoadingFuncs.concat(hooks1.isLoadingFuncs),
|
|
809
|
-
contextInit: hooks0.contextInit.concat(hooks1.contextInit),
|
|
810
|
-
eventRefiners: Object.assign(Object.assign({}, hooks0.eventRefiners), hooks1.eventRefiners),
|
|
811
|
-
eventDefMemberAdders: hooks0.eventDefMemberAdders.concat(hooks1.eventDefMemberAdders),
|
|
812
|
-
eventSourceRefiners: Object.assign(Object.assign({}, hooks0.eventSourceRefiners), hooks1.eventSourceRefiners),
|
|
813
|
-
isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
|
|
814
|
-
eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
|
|
815
|
-
eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
|
|
816
|
-
dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
|
|
817
|
-
datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
|
|
818
|
-
dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
|
|
819
|
-
views: Object.assign(Object.assign({}, hooks0.views), hooks1.views),
|
|
820
|
-
viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
|
|
821
|
-
isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
|
|
822
|
-
externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
|
|
823
|
-
viewContainerAppends: hooks0.viewContainerAppends.concat(hooks1.viewContainerAppends),
|
|
824
|
-
eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
|
|
825
|
-
calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
|
|
826
|
-
componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
|
|
827
|
-
themeClasses: Object.assign(Object.assign({}, hooks0.themeClasses), hooks1.themeClasses),
|
|
828
|
-
eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
|
|
829
|
-
cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
|
|
830
|
-
recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
|
|
831
|
-
namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
|
|
832
|
-
initialView: hooks0.initialView || hooks1.initialView,
|
|
833
|
-
elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
|
|
834
|
-
optionChangeHandlers: Object.assign(Object.assign({}, hooks0.optionChangeHandlers), hooks1.optionChangeHandlers),
|
|
835
|
-
scrollGridImpl: hooks1.scrollGridImpl || hooks0.scrollGridImpl,
|
|
836
|
-
listenerRefiners: Object.assign(Object.assign({}, hooks0.listenerRefiners), hooks1.listenerRefiners),
|
|
837
|
-
optionRefiners: Object.assign(Object.assign({}, hooks0.optionRefiners), hooks1.optionRefiners),
|
|
838
|
-
propSetHandlers: Object.assign(Object.assign({}, hooks0.propSetHandlers), hooks1.propSetHandlers),
|
|
839
|
-
};
|
|
840
|
-
}
|
|
841
|
-
function compareOptionalDates(date0, date1) {
|
|
842
|
-
if (date0 === undefined) {
|
|
843
|
-
return date1;
|
|
844
|
-
}
|
|
845
|
-
if (date1 === undefined) {
|
|
846
|
-
return date0;
|
|
847
|
-
}
|
|
848
|
-
return new Date(Math.max(date0.valueOf(), date1.valueOf()));
|
|
849
|
-
}
|
|
850
|
-
|
|
851
690
|
const DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
|
|
852
691
|
// Adding
|
|
853
692
|
function addWeeks(m, n) {
|
|
@@ -3547,229 +3386,65 @@ var FullCalendar = (function (exports) {
|
|
|
3547
3386
|
return null;
|
|
3548
3387
|
}
|
|
3549
3388
|
|
|
3550
|
-
function
|
|
3551
|
-
let activeRange = dateProfile ? dateProfile.activeRange : null;
|
|
3552
|
-
return addSources({}, parseInitialSources(calendarOptions, context), activeRange, context);
|
|
3553
|
-
}
|
|
3554
|
-
function reduceEventSources(eventSources, action, dateProfile, context) {
|
|
3555
|
-
let activeRange = dateProfile ? dateProfile.activeRange : null; // need this check?
|
|
3389
|
+
function reduceEventStore(eventStore, action, eventSources, dateProfile, context) {
|
|
3556
3390
|
switch (action.type) {
|
|
3557
|
-
case '
|
|
3558
|
-
return
|
|
3559
|
-
case '
|
|
3560
|
-
return
|
|
3391
|
+
case 'RECEIVE_EVENTS': // raw
|
|
3392
|
+
return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, context);
|
|
3393
|
+
case 'ADD_EVENTS': // already parsed, but not expanded
|
|
3394
|
+
return addEvent(eventStore, action.eventStore, // new ones
|
|
3395
|
+
dateProfile ? dateProfile.activeRange : null, context);
|
|
3396
|
+
case 'RESET_EVENTS':
|
|
3397
|
+
return action.eventStore;
|
|
3398
|
+
case 'MERGE_EVENTS': // already parsed and expanded
|
|
3399
|
+
return mergeEventStores(eventStore, action.eventStore);
|
|
3561
3400
|
case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
|
|
3562
3401
|
case 'NEXT':
|
|
3563
3402
|
case 'CHANGE_DATE':
|
|
3564
3403
|
case 'CHANGE_VIEW_TYPE':
|
|
3565
3404
|
if (dateProfile) {
|
|
3566
|
-
return
|
|
3405
|
+
return expandRecurring(eventStore, dateProfile.activeRange, context);
|
|
3567
3406
|
}
|
|
3568
|
-
return
|
|
3569
|
-
case '
|
|
3570
|
-
return
|
|
3571
|
-
|
|
3572
|
-
|
|
3573
|
-
case 'RECEIVE_EVENTS':
|
|
3574
|
-
case 'RECEIVE_EVENT_ERROR':
|
|
3575
|
-
return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
|
|
3407
|
+
return eventStore;
|
|
3408
|
+
case 'REMOVE_EVENTS':
|
|
3409
|
+
return excludeSubEventStore(eventStore, action.eventStore);
|
|
3410
|
+
case 'REMOVE_EVENT_SOURCE':
|
|
3411
|
+
return excludeEventsBySourceId(eventStore, action.sourceId);
|
|
3576
3412
|
case 'REMOVE_ALL_EVENT_SOURCES':
|
|
3577
|
-
return
|
|
3413
|
+
return filterEventStoreDefs(eventStore, (eventDef) => (!eventDef.sourceId // only keep events with no source id
|
|
3414
|
+
));
|
|
3415
|
+
case 'REMOVE_ALL_EVENTS':
|
|
3416
|
+
return createEmptyEventStore();
|
|
3578
3417
|
default:
|
|
3579
|
-
return
|
|
3418
|
+
return eventStore;
|
|
3580
3419
|
}
|
|
3581
3420
|
}
|
|
3582
|
-
function
|
|
3583
|
-
|
|
3584
|
-
|
|
3585
|
-
|
|
3586
|
-
|
|
3587
|
-
|
|
3588
|
-
|
|
3589
|
-
return true;
|
|
3421
|
+
function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, context) {
|
|
3422
|
+
if (eventSource && // not already removed
|
|
3423
|
+
fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
|
|
3424
|
+
) {
|
|
3425
|
+
let subset = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context);
|
|
3426
|
+
if (fetchRange) {
|
|
3427
|
+
subset = expandRecurring(subset, fetchRange, context);
|
|
3590
3428
|
}
|
|
3429
|
+
return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
|
|
3591
3430
|
}
|
|
3592
|
-
return
|
|
3431
|
+
return eventStore;
|
|
3593
3432
|
}
|
|
3594
|
-
function
|
|
3595
|
-
let
|
|
3596
|
-
|
|
3597
|
-
|
|
3433
|
+
function transformRawEvents(rawEvents, eventSource, context) {
|
|
3434
|
+
let calEachTransform = context.options.eventDataTransform;
|
|
3435
|
+
let sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
|
|
3436
|
+
if (sourceEachTransform) {
|
|
3437
|
+
rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
|
|
3598
3438
|
}
|
|
3599
|
-
if (
|
|
3600
|
-
|
|
3439
|
+
if (calEachTransform) {
|
|
3440
|
+
rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
|
|
3601
3441
|
}
|
|
3602
|
-
return
|
|
3603
|
-
}
|
|
3604
|
-
function removeSource(eventSourceHash, sourceId) {
|
|
3605
|
-
return filterHash(eventSourceHash, (eventSource) => eventSource.sourceId !== sourceId);
|
|
3606
|
-
}
|
|
3607
|
-
function fetchDirtySources(sourceHash, fetchRange, context) {
|
|
3608
|
-
return fetchSourcesByIds(sourceHash, filterHash(sourceHash, (eventSource) => isSourceDirty(eventSource, fetchRange, context)), fetchRange, false, context);
|
|
3442
|
+
return rawEvents;
|
|
3609
3443
|
}
|
|
3610
|
-
function
|
|
3611
|
-
|
|
3612
|
-
|
|
3613
|
-
|
|
3614
|
-
return !context.options.lazyFetching ||
|
|
3615
|
-
!eventSource.fetchRange ||
|
|
3616
|
-
eventSource.isFetching || // always cancel outdated in-progress fetches
|
|
3617
|
-
fetchRange.start < eventSource.fetchRange.start ||
|
|
3618
|
-
fetchRange.end > eventSource.fetchRange.end;
|
|
3619
|
-
}
|
|
3620
|
-
function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, isRefetch, context) {
|
|
3621
|
-
let nextSources = {};
|
|
3622
|
-
for (let sourceId in prevSources) {
|
|
3623
|
-
let source = prevSources[sourceId];
|
|
3624
|
-
if (sourceIdHash[sourceId]) {
|
|
3625
|
-
nextSources[sourceId] = fetchSource(source, fetchRange, isRefetch, context);
|
|
3626
|
-
}
|
|
3627
|
-
else {
|
|
3628
|
-
nextSources[sourceId] = source;
|
|
3629
|
-
}
|
|
3630
|
-
}
|
|
3631
|
-
return nextSources;
|
|
3632
|
-
}
|
|
3633
|
-
function fetchSource(eventSource, fetchRange, isRefetch, context) {
|
|
3634
|
-
let { options, calendarApi } = context;
|
|
3635
|
-
let sourceDef = context.pluginHooks.eventSourceDefs[eventSource.sourceDefId];
|
|
3636
|
-
let fetchId = guid();
|
|
3637
|
-
sourceDef.fetch({
|
|
3638
|
-
eventSource,
|
|
3639
|
-
range: fetchRange,
|
|
3640
|
-
isRefetch,
|
|
3641
|
-
context,
|
|
3642
|
-
}, (res) => {
|
|
3643
|
-
let { rawEvents } = res;
|
|
3644
|
-
if (options.eventSourceSuccess) {
|
|
3645
|
-
rawEvents = options.eventSourceSuccess.call(calendarApi, rawEvents, res.response) || rawEvents;
|
|
3646
|
-
}
|
|
3647
|
-
if (eventSource.success) {
|
|
3648
|
-
rawEvents = eventSource.success.call(calendarApi, rawEvents, res.response) || rawEvents;
|
|
3649
|
-
}
|
|
3650
|
-
context.dispatch({
|
|
3651
|
-
type: 'RECEIVE_EVENTS',
|
|
3652
|
-
sourceId: eventSource.sourceId,
|
|
3653
|
-
fetchId,
|
|
3654
|
-
fetchRange,
|
|
3655
|
-
rawEvents,
|
|
3656
|
-
});
|
|
3657
|
-
}, (error) => {
|
|
3658
|
-
let errorHandled = false;
|
|
3659
|
-
if (options.eventSourceFailure) {
|
|
3660
|
-
options.eventSourceFailure.call(calendarApi, error);
|
|
3661
|
-
errorHandled = true;
|
|
3662
|
-
}
|
|
3663
|
-
if (eventSource.failure) {
|
|
3664
|
-
eventSource.failure(error);
|
|
3665
|
-
errorHandled = true;
|
|
3666
|
-
}
|
|
3667
|
-
if (!errorHandled) {
|
|
3668
|
-
console.warn(error.message, error);
|
|
3669
|
-
}
|
|
3670
|
-
context.dispatch({
|
|
3671
|
-
type: 'RECEIVE_EVENT_ERROR',
|
|
3672
|
-
sourceId: eventSource.sourceId,
|
|
3673
|
-
fetchId,
|
|
3674
|
-
fetchRange,
|
|
3675
|
-
error,
|
|
3676
|
-
});
|
|
3677
|
-
});
|
|
3678
|
-
return Object.assign(Object.assign({}, eventSource), { isFetching: true, latestFetchId: fetchId });
|
|
3679
|
-
}
|
|
3680
|
-
function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
|
|
3681
|
-
let eventSource = sourceHash[sourceId];
|
|
3682
|
-
if (eventSource && // not already removed
|
|
3683
|
-
fetchId === eventSource.latestFetchId) {
|
|
3684
|
-
return Object.assign(Object.assign({}, sourceHash), { [sourceId]: Object.assign(Object.assign({}, eventSource), { isFetching: false, fetchRange }) });
|
|
3685
|
-
}
|
|
3686
|
-
return sourceHash;
|
|
3687
|
-
}
|
|
3688
|
-
function excludeStaticSources(eventSources, context) {
|
|
3689
|
-
return filterHash(eventSources, (eventSource) => doesSourceNeedRange(eventSource, context));
|
|
3690
|
-
}
|
|
3691
|
-
function parseInitialSources(rawOptions, context) {
|
|
3692
|
-
let refiners = buildEventSourceRefiners(context);
|
|
3693
|
-
let rawSources = [].concat(rawOptions.eventSources || []);
|
|
3694
|
-
let sources = []; // parsed
|
|
3695
|
-
if (rawOptions.initialEvents) {
|
|
3696
|
-
rawSources.unshift(rawOptions.initialEvents);
|
|
3697
|
-
}
|
|
3698
|
-
if (rawOptions.events) {
|
|
3699
|
-
rawSources.unshift(rawOptions.events);
|
|
3700
|
-
}
|
|
3701
|
-
for (let rawSource of rawSources) {
|
|
3702
|
-
let source = parseEventSource(rawSource, context, refiners);
|
|
3703
|
-
if (source) {
|
|
3704
|
-
sources.push(source);
|
|
3705
|
-
}
|
|
3706
|
-
}
|
|
3707
|
-
return sources;
|
|
3708
|
-
}
|
|
3709
|
-
function doesSourceNeedRange(eventSource, context) {
|
|
3710
|
-
let defs = context.pluginHooks.eventSourceDefs;
|
|
3711
|
-
return !defs[eventSource.sourceDefId].ignoreRange;
|
|
3712
|
-
}
|
|
3713
|
-
|
|
3714
|
-
function reduceEventStore(eventStore, action, eventSources, dateProfile, context) {
|
|
3715
|
-
switch (action.type) {
|
|
3716
|
-
case 'RECEIVE_EVENTS': // raw
|
|
3717
|
-
return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, context);
|
|
3718
|
-
case 'ADD_EVENTS': // already parsed, but not expanded
|
|
3719
|
-
return addEvent(eventStore, action.eventStore, // new ones
|
|
3720
|
-
dateProfile ? dateProfile.activeRange : null, context);
|
|
3721
|
-
case 'RESET_EVENTS':
|
|
3722
|
-
return action.eventStore;
|
|
3723
|
-
case 'MERGE_EVENTS': // already parsed and expanded
|
|
3724
|
-
return mergeEventStores(eventStore, action.eventStore);
|
|
3725
|
-
case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
|
|
3726
|
-
case 'NEXT':
|
|
3727
|
-
case 'CHANGE_DATE':
|
|
3728
|
-
case 'CHANGE_VIEW_TYPE':
|
|
3729
|
-
if (dateProfile) {
|
|
3730
|
-
return expandRecurring(eventStore, dateProfile.activeRange, context);
|
|
3731
|
-
}
|
|
3732
|
-
return eventStore;
|
|
3733
|
-
case 'REMOVE_EVENTS':
|
|
3734
|
-
return excludeSubEventStore(eventStore, action.eventStore);
|
|
3735
|
-
case 'REMOVE_EVENT_SOURCE':
|
|
3736
|
-
return excludeEventsBySourceId(eventStore, action.sourceId);
|
|
3737
|
-
case 'REMOVE_ALL_EVENT_SOURCES':
|
|
3738
|
-
return filterEventStoreDefs(eventStore, (eventDef) => (!eventDef.sourceId // only keep events with no source id
|
|
3739
|
-
));
|
|
3740
|
-
case 'REMOVE_ALL_EVENTS':
|
|
3741
|
-
return createEmptyEventStore();
|
|
3742
|
-
default:
|
|
3743
|
-
return eventStore;
|
|
3744
|
-
}
|
|
3745
|
-
}
|
|
3746
|
-
function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, context) {
|
|
3747
|
-
if (eventSource && // not already removed
|
|
3748
|
-
fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
|
|
3749
|
-
) {
|
|
3750
|
-
let subset = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context);
|
|
3751
|
-
if (fetchRange) {
|
|
3752
|
-
subset = expandRecurring(subset, fetchRange, context);
|
|
3753
|
-
}
|
|
3754
|
-
return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
|
|
3755
|
-
}
|
|
3756
|
-
return eventStore;
|
|
3757
|
-
}
|
|
3758
|
-
function transformRawEvents(rawEvents, eventSource, context) {
|
|
3759
|
-
let calEachTransform = context.options.eventDataTransform;
|
|
3760
|
-
let sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
|
|
3761
|
-
if (sourceEachTransform) {
|
|
3762
|
-
rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
|
|
3763
|
-
}
|
|
3764
|
-
if (calEachTransform) {
|
|
3765
|
-
rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
|
|
3766
|
-
}
|
|
3767
|
-
return rawEvents;
|
|
3768
|
-
}
|
|
3769
|
-
function transformEachRawEvent(rawEvents, func) {
|
|
3770
|
-
let refinedEvents;
|
|
3771
|
-
if (!func) {
|
|
3772
|
-
refinedEvents = rawEvents;
|
|
3444
|
+
function transformEachRawEvent(rawEvents, func) {
|
|
3445
|
+
let refinedEvents;
|
|
3446
|
+
if (!func) {
|
|
3447
|
+
refinedEvents = rawEvents;
|
|
3773
3448
|
}
|
|
3774
3449
|
else {
|
|
3775
3450
|
refinedEvents = [];
|
|
@@ -3894,25 +3569,6 @@ var FullCalendar = (function (exports) {
|
|
|
3894
3569
|
return rawDefs;
|
|
3895
3570
|
}
|
|
3896
3571
|
|
|
3897
|
-
let eventSourceDef$2 = {
|
|
3898
|
-
ignoreRange: true,
|
|
3899
|
-
parseMeta(refined) {
|
|
3900
|
-
if (Array.isArray(refined.events)) {
|
|
3901
|
-
return refined.events;
|
|
3902
|
-
}
|
|
3903
|
-
return null;
|
|
3904
|
-
},
|
|
3905
|
-
fetch(arg, successCallback) {
|
|
3906
|
-
successCallback({
|
|
3907
|
-
rawEvents: arg.eventSource.meta,
|
|
3908
|
-
});
|
|
3909
|
-
},
|
|
3910
|
-
};
|
|
3911
|
-
const arrayEventSourcePlugin = createPlugin({
|
|
3912
|
-
name: 'array-event-source',
|
|
3913
|
-
eventSourceDefs: [eventSourceDef$2],
|
|
3914
|
-
});
|
|
3915
|
-
|
|
3916
3572
|
function triggerDateSelect(selection, pev, context) {
|
|
3917
3573
|
context.emitter.trigger('select', Object.assign(Object.assign({}, buildDateSpanApiWithContext(selection, context)), { jsEvent: pev ? pev.origEvent : null, view: context.viewApi || context.calendarApi.view }));
|
|
3918
3574
|
}
|
|
@@ -4798,24 +4454,6 @@ var FullCalendar = (function (exports) {
|
|
|
4798
4454
|
}
|
|
4799
4455
|
}
|
|
4800
4456
|
|
|
4801
|
-
let eventSourceDef$1 = {
|
|
4802
|
-
parseMeta(refined) {
|
|
4803
|
-
if (typeof refined.events === 'function') {
|
|
4804
|
-
return refined.events;
|
|
4805
|
-
}
|
|
4806
|
-
return null;
|
|
4807
|
-
},
|
|
4808
|
-
fetch(arg, successCallback, errorCallback) {
|
|
4809
|
-
const { dateEnv } = arg.context;
|
|
4810
|
-
const func = arg.eventSource.meta;
|
|
4811
|
-
unpromisify(func.bind(null, buildRangeApiWithTimeZone(arg.range, dateEnv)), (rawEvents) => successCallback({ rawEvents }), errorCallback);
|
|
4812
|
-
},
|
|
4813
|
-
};
|
|
4814
|
-
const funcEventSourcePlugin = createPlugin({
|
|
4815
|
-
name: 'func-event-source',
|
|
4816
|
-
eventSourceDefs: [eventSourceDef$1],
|
|
4817
|
-
});
|
|
4818
|
-
|
|
4819
4457
|
class JsonRequestError extends Error {
|
|
4820
4458
|
constructor(message, response) {
|
|
4821
4459
|
super(message);
|
|
@@ -4851,232 +4489,18 @@ var FullCalendar = (function (exports) {
|
|
|
4851
4489
|
});
|
|
4852
4490
|
}
|
|
4853
4491
|
|
|
4854
|
-
|
|
4855
|
-
|
|
4856
|
-
|
|
4857
|
-
|
|
4858
|
-
endParam: String,
|
|
4859
|
-
timeZoneParam: String,
|
|
4860
|
-
};
|
|
4861
|
-
|
|
4862
|
-
let eventSourceDef = {
|
|
4863
|
-
parseMeta(refined) {
|
|
4864
|
-
if (refined.url && (refined.format === 'json' || !refined.format)) {
|
|
4865
|
-
return {
|
|
4866
|
-
url: refined.url,
|
|
4867
|
-
format: 'json',
|
|
4868
|
-
method: (refined.method || 'GET').toUpperCase(),
|
|
4869
|
-
extraParams: refined.extraParams,
|
|
4870
|
-
startParam: refined.startParam,
|
|
4871
|
-
endParam: refined.endParam,
|
|
4872
|
-
timeZoneParam: refined.timeZoneParam,
|
|
4873
|
-
};
|
|
4874
|
-
}
|
|
4875
|
-
return null;
|
|
4876
|
-
},
|
|
4877
|
-
fetch(arg, successCallback, errorCallback) {
|
|
4878
|
-
const { meta } = arg.eventSource;
|
|
4879
|
-
const requestParams = buildRequestParams(meta, arg.range, arg.context);
|
|
4880
|
-
requestJson(meta.method, meta.url, requestParams).then(([rawEvents, response]) => {
|
|
4881
|
-
successCallback({ rawEvents, response });
|
|
4882
|
-
}, errorCallback);
|
|
4883
|
-
},
|
|
4884
|
-
};
|
|
4885
|
-
const jsonFeedEventSourcePlugin = createPlugin({
|
|
4886
|
-
name: 'json-event-source',
|
|
4887
|
-
eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS,
|
|
4888
|
-
eventSourceDefs: [eventSourceDef],
|
|
4889
|
-
});
|
|
4890
|
-
function buildRequestParams(meta, range, context) {
|
|
4891
|
-
let { dateEnv, options } = context;
|
|
4892
|
-
let startParam;
|
|
4893
|
-
let endParam;
|
|
4894
|
-
let timeZoneParam;
|
|
4895
|
-
let customRequestParams;
|
|
4896
|
-
let params = {};
|
|
4897
|
-
startParam = meta.startParam;
|
|
4898
|
-
if (startParam == null) {
|
|
4899
|
-
startParam = options.startParam;
|
|
4900
|
-
}
|
|
4901
|
-
endParam = meta.endParam;
|
|
4902
|
-
if (endParam == null) {
|
|
4903
|
-
endParam = options.endParam;
|
|
4492
|
+
let canVGrowWithinCell;
|
|
4493
|
+
function getCanVGrowWithinCell() {
|
|
4494
|
+
if (canVGrowWithinCell == null) {
|
|
4495
|
+
canVGrowWithinCell = computeCanVGrowWithinCell();
|
|
4904
4496
|
}
|
|
4905
|
-
|
|
4906
|
-
|
|
4907
|
-
|
|
4908
|
-
|
|
4909
|
-
//
|
|
4910
|
-
if (typeof
|
|
4911
|
-
|
|
4912
|
-
customRequestParams = meta.extraParams();
|
|
4913
|
-
}
|
|
4914
|
-
else {
|
|
4915
|
-
// probably supplied as a straight key/value object
|
|
4916
|
-
customRequestParams = meta.extraParams || {};
|
|
4917
|
-
}
|
|
4918
|
-
Object.assign(params, customRequestParams);
|
|
4919
|
-
params[startParam] = dateEnv.formatIso(range.start);
|
|
4920
|
-
params[endParam] = dateEnv.formatIso(range.end);
|
|
4921
|
-
if (dateEnv.timeZone !== 'local') {
|
|
4922
|
-
params[timeZoneParam] = dateEnv.timeZone;
|
|
4923
|
-
}
|
|
4924
|
-
return params;
|
|
4925
|
-
}
|
|
4926
|
-
|
|
4927
|
-
const SIMPLE_RECURRING_REFINERS = {
|
|
4928
|
-
daysOfWeek: identity,
|
|
4929
|
-
startTime: createDuration,
|
|
4930
|
-
endTime: createDuration,
|
|
4931
|
-
duration: createDuration,
|
|
4932
|
-
startRecur: identity,
|
|
4933
|
-
endRecur: identity,
|
|
4934
|
-
};
|
|
4935
|
-
|
|
4936
|
-
let recurring = {
|
|
4937
|
-
parse(refined, dateEnv) {
|
|
4938
|
-
if (refined.daysOfWeek || refined.startTime || refined.endTime || refined.startRecur || refined.endRecur) {
|
|
4939
|
-
let recurringData = {
|
|
4940
|
-
daysOfWeek: refined.daysOfWeek || null,
|
|
4941
|
-
startTime: refined.startTime || null,
|
|
4942
|
-
endTime: refined.endTime || null,
|
|
4943
|
-
startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null,
|
|
4944
|
-
endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null,
|
|
4945
|
-
};
|
|
4946
|
-
let duration;
|
|
4947
|
-
if (refined.duration) {
|
|
4948
|
-
duration = refined.duration;
|
|
4949
|
-
}
|
|
4950
|
-
if (!duration && refined.startTime && refined.endTime) {
|
|
4951
|
-
duration = subtractDurations(refined.endTime, refined.startTime);
|
|
4952
|
-
}
|
|
4953
|
-
return {
|
|
4954
|
-
allDayGuess: Boolean(!refined.startTime && !refined.endTime),
|
|
4955
|
-
duration,
|
|
4956
|
-
typeData: recurringData, // doesn't need endTime anymore but oh well
|
|
4957
|
-
};
|
|
4958
|
-
}
|
|
4959
|
-
return null;
|
|
4960
|
-
},
|
|
4961
|
-
expand(typeData, framingRange, dateEnv) {
|
|
4962
|
-
let clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
|
|
4963
|
-
if (clippedFramingRange) {
|
|
4964
|
-
return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
|
|
4965
|
-
}
|
|
4966
|
-
return [];
|
|
4967
|
-
},
|
|
4968
|
-
};
|
|
4969
|
-
const simpleRecurringEventsPlugin = createPlugin({
|
|
4970
|
-
name: 'simple-recurring-event',
|
|
4971
|
-
recurringTypes: [recurring],
|
|
4972
|
-
eventRefiners: SIMPLE_RECURRING_REFINERS,
|
|
4973
|
-
});
|
|
4974
|
-
function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
|
|
4975
|
-
let dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
|
|
4976
|
-
let dayMarker = startOfDay(framingRange.start);
|
|
4977
|
-
let endMarker = framingRange.end;
|
|
4978
|
-
let instanceStarts = [];
|
|
4979
|
-
while (dayMarker < endMarker) {
|
|
4980
|
-
let instanceStart;
|
|
4981
|
-
// if everyday, or this particular day-of-week
|
|
4982
|
-
if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
|
|
4983
|
-
if (startTime) {
|
|
4984
|
-
instanceStart = dateEnv.add(dayMarker, startTime);
|
|
4985
|
-
}
|
|
4986
|
-
else {
|
|
4987
|
-
instanceStart = dayMarker;
|
|
4988
|
-
}
|
|
4989
|
-
instanceStarts.push(instanceStart);
|
|
4990
|
-
}
|
|
4991
|
-
dayMarker = addDays(dayMarker, 1);
|
|
4992
|
-
}
|
|
4993
|
-
return instanceStarts;
|
|
4994
|
-
}
|
|
4995
|
-
|
|
4996
|
-
const changeHandlerPlugin = createPlugin({
|
|
4997
|
-
name: 'change-handler',
|
|
4998
|
-
optionChangeHandlers: {
|
|
4999
|
-
events(events, context) {
|
|
5000
|
-
handleEventSources([events], context);
|
|
5001
|
-
},
|
|
5002
|
-
eventSources: handleEventSources,
|
|
5003
|
-
},
|
|
5004
|
-
});
|
|
5005
|
-
/*
|
|
5006
|
-
BUG: if `event` was supplied, all previously-given `eventSources` will be wiped out
|
|
5007
|
-
*/
|
|
5008
|
-
function handleEventSources(inputs, context) {
|
|
5009
|
-
let unfoundSources = hashValuesToArray(context.getCurrentData().eventSources);
|
|
5010
|
-
let newInputs = [];
|
|
5011
|
-
for (let input of inputs) {
|
|
5012
|
-
let inputFound = false;
|
|
5013
|
-
for (let i = 0; i < unfoundSources.length; i += 1) {
|
|
5014
|
-
if (unfoundSources[i]._raw === input) {
|
|
5015
|
-
unfoundSources.splice(i, 1); // delete
|
|
5016
|
-
inputFound = true;
|
|
5017
|
-
break;
|
|
5018
|
-
}
|
|
5019
|
-
}
|
|
5020
|
-
if (!inputFound) {
|
|
5021
|
-
newInputs.push(input);
|
|
5022
|
-
}
|
|
5023
|
-
}
|
|
5024
|
-
for (let unfoundSource of unfoundSources) {
|
|
5025
|
-
context.dispatch({
|
|
5026
|
-
type: 'REMOVE_EVENT_SOURCE',
|
|
5027
|
-
sourceId: unfoundSource.sourceId,
|
|
5028
|
-
});
|
|
5029
|
-
}
|
|
5030
|
-
for (let newInput of newInputs) {
|
|
5031
|
-
context.calendarApi.addEventSource(newInput);
|
|
5032
|
-
}
|
|
5033
|
-
}
|
|
5034
|
-
|
|
5035
|
-
function handleDateProfile(dateProfile, context) {
|
|
5036
|
-
context.emitter.trigger('datesSet', Object.assign(Object.assign({}, buildRangeApiWithTimeZone(dateProfile.activeRange, context.dateEnv)), { view: context.viewApi }));
|
|
5037
|
-
}
|
|
5038
|
-
|
|
5039
|
-
function handleEventStore(eventStore, context) {
|
|
5040
|
-
let { emitter } = context;
|
|
5041
|
-
if (emitter.hasHandlers('eventsSet')) {
|
|
5042
|
-
emitter.trigger('eventsSet', buildEventApis(eventStore, context));
|
|
5043
|
-
}
|
|
5044
|
-
}
|
|
5045
|
-
|
|
5046
|
-
/*
|
|
5047
|
-
this array is exposed on the root namespace so that UMD plugins can add to it.
|
|
5048
|
-
see the rollup-bundles script.
|
|
5049
|
-
*/
|
|
5050
|
-
const globalPlugins = [
|
|
5051
|
-
arrayEventSourcePlugin,
|
|
5052
|
-
funcEventSourcePlugin,
|
|
5053
|
-
jsonFeedEventSourcePlugin,
|
|
5054
|
-
simpleRecurringEventsPlugin,
|
|
5055
|
-
changeHandlerPlugin,
|
|
5056
|
-
createPlugin({
|
|
5057
|
-
name: 'misc',
|
|
5058
|
-
isLoadingFuncs: [
|
|
5059
|
-
(state) => computeEventSourcesLoading(state.eventSources),
|
|
5060
|
-
],
|
|
5061
|
-
propSetHandlers: {
|
|
5062
|
-
dateProfile: handleDateProfile,
|
|
5063
|
-
eventStore: handleEventStore,
|
|
5064
|
-
},
|
|
5065
|
-
}),
|
|
5066
|
-
];
|
|
5067
|
-
|
|
5068
|
-
let canVGrowWithinCell;
|
|
5069
|
-
function getCanVGrowWithinCell() {
|
|
5070
|
-
if (canVGrowWithinCell == null) {
|
|
5071
|
-
canVGrowWithinCell = computeCanVGrowWithinCell();
|
|
5072
|
-
}
|
|
5073
|
-
return canVGrowWithinCell;
|
|
5074
|
-
}
|
|
5075
|
-
function computeCanVGrowWithinCell() {
|
|
5076
|
-
// for SSR, because this function is call immediately at top-level
|
|
5077
|
-
// TODO: just make this logic execute top-level, immediately, instead of doing lazily
|
|
5078
|
-
if (typeof document === 'undefined') {
|
|
5079
|
-
return true;
|
|
4497
|
+
return canVGrowWithinCell;
|
|
4498
|
+
}
|
|
4499
|
+
function computeCanVGrowWithinCell() {
|
|
4500
|
+
// for SSR, because this function is call immediately at top-level
|
|
4501
|
+
// TODO: just make this logic execute top-level, immediately, instead of doing lazily
|
|
4502
|
+
if (typeof document === 'undefined') {
|
|
4503
|
+
return true;
|
|
5080
4504
|
}
|
|
5081
4505
|
let el = document.createElement('div');
|
|
5082
4506
|
el.style.position = 'absolute';
|
|
@@ -7975,8 +7399,6 @@ var FullCalendar = (function (exports) {
|
|
|
7975
7399
|
getStickyFooterScrollbar: getStickyFooterScrollbar,
|
|
7976
7400
|
getStickyHeaderDates: getStickyHeaderDates,
|
|
7977
7401
|
getUniqueDomId: getUniqueDomId,
|
|
7978
|
-
globalLocales: globalLocales,
|
|
7979
|
-
globalPlugins: globalPlugins,
|
|
7980
7402
|
greatestDurationDenominator: greatestDurationDenominator,
|
|
7981
7403
|
groupIntersectingEntries: groupIntersectingEntries,
|
|
7982
7404
|
guid: guid,
|
|
@@ -8043,9 +7465,11 @@ var FullCalendar = (function (exports) {
|
|
|
8043
7465
|
wholeDivideDurations: wholeDivideDurations
|
|
8044
7466
|
};
|
|
8045
7467
|
|
|
8046
|
-
var css_248z$3 = "\n/*\nfor css vars only.\nthese values are automatically known in all stylesheets.\nthe :root statement itself is only included in the common stylesheet.\nthis file is not processed by postcss when imported into the postcss-custom-properties plugin,\nso only write standard css!\n\nNOTE: for old browsers, will need to restart watcher after changing a variable\n*/\n\n:root {\n --fc-small-font-size: .85em;\n --fc-page-bg-color: #fff;\n --fc-neutral-bg-color: rgba(208, 208, 208, 0.3);\n --fc-neutral-text-color: #808080;\n --fc-border-color: #ddd;\n\n --fc-button-text-color: #fff;\n --fc-button-bg-color: #2C3E50;\n --fc-button-border-color: #2C3E50;\n --fc-button-hover-bg-color: #1e2b37;\n --fc-button-hover-border-color: #1a252f;\n --fc-button-active-bg-color: #1a252f;\n --fc-button-active-border-color: #151e27;\n\n --fc-event-bg-color: #3788d8;\n --fc-event-border-color: #3788d8;\n --fc-event-text-color: #fff;\n --fc-event-selected-overlay-color: rgba(0, 0, 0, 0.25);\n\n --fc-more-link-bg-color: #d0d0d0;\n --fc-more-link-text-color: inherit;\n\n --fc-event-resizer-thickness: 8px;\n --fc-event-resizer-dot-total-width: 8px;\n --fc-event-resizer-dot-border-width: 1px;\n\n --fc-non-business-color: rgba(215, 215, 215, 0.3);\n --fc-bg-event-color: rgb(143, 223, 130);\n --fc-bg-event-opacity: 0.3;\n --fc-highlight-color: rgba(188, 232, 241, 0.3);\n --fc-today-bg-color: rgba(255, 220, 40, 0.15);\n --fc-now-indicator-color: red;\n}\n\n/* classes attached to <body> */\n\n/* TODO: make fc-event selector work when calender in shadow DOM */\n\n.fc-not-allowed,\n.fc-not-allowed .fc-event { /* override events' custom cursors */\n cursor: not-allowed;\n}\n\n/* TODO: not attached to body. attached to specific els. move */\n\n.fc-unselectable {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n -webkit-touch-callout: none;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n.fc {\n /* layout of immediate children */\n display: flex;\n flex-direction: column;\n\n font-size: 1em\n}\n.fc,\n .fc *,\n .fc *:before,\n .fc *:after {\n box-sizing: border-box;\n }\n.fc table {\n border-collapse: collapse;\n border-spacing: 0;\n font-size: 1em; /* normalize cross-browser */\n }\n.fc th {\n text-align: center;\n }\n.fc th,\n .fc td {\n vertical-align: top;\n padding: 0;\n }\n.fc a[data-navlink] {\n cursor: pointer;\n }\n.fc a[data-navlink]:hover {\n text-decoration: underline;\n }\n.fc-direction-ltr {\n direction: ltr;\n text-align: left;\n}\n.fc-direction-rtl {\n direction: rtl;\n text-align: right;\n}\n.fc-theme-standard td,\n .fc-theme-standard th {\n border: 1px solid var(--fc-border-color);\n }\n/* for FF, which doesn't expand a 100% div within a table cell. use absolute positioning */\n/* inner-wrappers are responsible for being absolute */\n/* TODO: best place for this? */\n.fc-liquid-hack td,\n .fc-liquid-hack th {\n position: relative;\n }\n\n@font-face {\n font-family: 'fcicons';\n src: url(\"data:application/x-font-ttf;charset=utf-8;base64,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\") format('truetype');\n font-weight: normal;\n font-style: normal;\n}\n\n.fc-icon {\n /* added for fc */\n display: inline-block;\n width: 1em;\n height: 1em;\n text-align: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n\n /* use !important to prevent issues with browser extensions that change fonts */\n font-family: 'fcicons' !important;\n speak: none;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n\n /* Better Font Rendering =========== */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.fc-icon-chevron-left:before {\n content: \"\\e900\";\n}\n\n.fc-icon-chevron-right:before {\n content: \"\\e901\";\n}\n\n.fc-icon-chevrons-left:before {\n content: \"\\e902\";\n}\n\n.fc-icon-chevrons-right:before {\n content: \"\\e903\";\n}\n\n.fc-icon-minus-square:before {\n content: \"\\e904\";\n}\n\n.fc-icon-plus-square:before {\n content: \"\\e905\";\n}\n\n.fc-icon-x:before {\n content: \"\\e906\";\n}\n/*\nLots taken from Flatly (MIT): https://bootswatch.com/4/flatly/bootstrap.css\n\nThese styles only apply when the standard-theme is activated.\nWhen it's NOT activated, the fc-button classes won't even be in the DOM.\n*/\n.fc {\n\n /* reset */\n\n}\n.fc .fc-button {\n border-radius: 0;\n overflow: visible;\n text-transform: none;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n }\n.fc .fc-button:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n }\n.fc .fc-button {\n -webkit-appearance: button;\n }\n.fc .fc-button:not(:disabled) {\n cursor: pointer;\n }\n.fc .fc-button::-moz-focus-inner {\n padding: 0;\n border-style: none;\n }\n.fc {\n\n /* theme */\n\n}\n.fc .fc-button {\n display: inline-block;\n font-weight: 400;\n text-align: center;\n vertical-align: middle;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.4em 0.65em;\n font-size: 1em;\n line-height: 1.5;\n border-radius: 0.25em;\n }\n.fc .fc-button:hover {\n text-decoration: none;\n }\n.fc .fc-button:focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25);\n }\n.fc .fc-button:disabled {\n opacity: 0.65;\n }\n.fc {\n\n /* \"primary\" coloring */\n\n}\n.fc .fc-button-primary {\n color: var(--fc-button-text-color);\n background-color: var(--fc-button-bg-color);\n border-color: var(--fc-button-border-color);\n }\n.fc .fc-button-primary:hover {\n color: var(--fc-button-text-color);\n background-color: var(--fc-button-hover-bg-color);\n border-color: var(--fc-button-hover-border-color);\n }\n.fc .fc-button-primary:disabled { /* not DRY */\n color: var(--fc-button-text-color);\n background-color: var(--fc-button-bg-color);\n border-color: var(--fc-button-border-color); /* overrides :hover */\n }\n.fc .fc-button-primary:focus {\n box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);\n }\n.fc .fc-button-primary:not(:disabled):active,\n .fc .fc-button-primary:not(:disabled).fc-button-active {\n color: var(--fc-button-text-color);\n background-color: var(--fc-button-active-bg-color);\n border-color: var(--fc-button-active-border-color);\n }\n.fc .fc-button-primary:not(:disabled):active:focus,\n .fc .fc-button-primary:not(:disabled).fc-button-active:focus {\n box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);\n }\n.fc {\n\n /* icons within buttons */\n\n}\n.fc .fc-button .fc-icon {\n vertical-align: middle;\n font-size: 1.5em; /* bump up the size (but don't make it bigger than line-height of button, which is 1.5em also) */\n }\n.fc .fc-button-group {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n }\n.fc .fc-button-group > .fc-button {\n position: relative;\n flex: 1 1 auto;\n }\n.fc .fc-button-group > .fc-button:hover {\n z-index: 1;\n }\n.fc .fc-button-group > .fc-button:focus,\n .fc .fc-button-group > .fc-button:active,\n .fc .fc-button-group > .fc-button.fc-button-active {\n z-index: 1;\n }\n.fc-direction-ltr .fc-button-group > .fc-button:not(:first-child) {\n margin-left: -1px;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n.fc-direction-ltr .fc-button-group > .fc-button:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n.fc-direction-rtl .fc-button-group > .fc-button:not(:first-child) {\n margin-right: -1px;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n.fc-direction-rtl .fc-button-group > .fc-button:not(:last-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n.fc .fc-toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n.fc .fc-toolbar.fc-header-toolbar {\n margin-bottom: 1.5em;\n }\n.fc .fc-toolbar.fc-footer-toolbar {\n margin-top: 1.5em;\n }\n.fc .fc-toolbar-title {\n font-size: 1.75em;\n margin: 0;\n }\n.fc-direction-ltr .fc-toolbar > * > :not(:first-child) {\n margin-left: .75em; /* space between */\n }\n.fc-direction-rtl .fc-toolbar > * > :not(:first-child) {\n margin-right: .75em; /* space between */\n }\n.fc-direction-rtl .fc-toolbar-ltr { /* when the toolbar-chunk positioning system is explicitly left-to-right */\n flex-direction: row-reverse;\n }\n.fc .fc-scroller {\n -webkit-overflow-scrolling: touch;\n position: relative; /* for abs-positioned elements within */\n }\n.fc .fc-scroller-liquid {\n height: 100%;\n }\n.fc .fc-scroller-liquid-absolute {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n bottom: 0;\n }\n.fc .fc-scroller-harness {\n position: relative;\n overflow: hidden;\n direction: ltr;\n /* hack for chrome computing the scroller's right/left wrong for rtl. undone below... */\n /* TODO: demonstrate in codepen */\n }\n.fc .fc-scroller-harness-liquid {\n height: 100%;\n }\n.fc-direction-rtl .fc-scroller-harness > .fc-scroller { /* undo above hack */\n direction: rtl;\n }\n.fc-theme-standard .fc-scrollgrid {\n border: 1px solid var(--fc-border-color); /* bootstrap does this. match */\n }\n.fc .fc-scrollgrid,\n .fc .fc-scrollgrid table { /* all tables (self included) */\n width: 100%; /* because tables don't normally do this */\n table-layout: fixed;\n }\n.fc .fc-scrollgrid table { /* inner tables */\n border-top-style: hidden;\n border-left-style: hidden;\n border-right-style: hidden;\n }\n.fc .fc-scrollgrid {\n\n border-collapse: separate;\n border-right-width: 0;\n border-bottom-width: 0;\n\n }\n.fc .fc-scrollgrid-liquid {\n height: 100%;\n }\n.fc .fc-scrollgrid-section { /* a <tr> */\n height: 1px /* better than 0, for firefox */\n\n }\n.fc .fc-scrollgrid-section > td {\n height: 1px; /* needs a height so inner div within grow. better than 0, for firefox */\n }\n.fc .fc-scrollgrid-section table {\n height: 1px;\n /* for most browsers, if a height isn't set on the table, can't do liquid-height within cells */\n /* serves as a min-height. harmless */\n }\n.fc .fc-scrollgrid-section-liquid > td {\n height: 100%; /* better than `auto`, for firefox */\n }\n.fc .fc-scrollgrid-section > * {\n border-top-width: 0;\n border-left-width: 0;\n }\n.fc .fc-scrollgrid-section-header > *,\n .fc .fc-scrollgrid-section-footer > * {\n border-bottom-width: 0;\n }\n.fc .fc-scrollgrid-section-body table,\n .fc .fc-scrollgrid-section-footer table {\n border-bottom-style: hidden; /* head keeps its bottom border tho */\n }\n.fc {\n\n /* stickiness */\n\n}\n.fc .fc-scrollgrid-section-sticky > * {\n background: var(--fc-page-bg-color);\n position: sticky;\n z-index: 3; /* TODO: var */\n /* TODO: box-shadow when sticking */\n }\n.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky > * {\n top: 0; /* because border-sharing causes a gap at the top */\n /* TODO: give safari -1. has bug */\n }\n.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky > * {\n bottom: 0; /* known bug: bottom-stickiness doesn't work in safari */\n }\n.fc .fc-scrollgrid-sticky-shim { /* for horizontal scrollbar */\n height: 1px; /* needs height to create scrollbars */\n margin-bottom: -1px;\n }\n.fc-sticky { /* no .fc wrap because used as child of body */\n position: sticky;\n}\n.fc .fc-view-harness {\n flex-grow: 1; /* because this harness is WITHIN the .fc's flexbox */\n position: relative;\n }\n.fc {\n\n /* when the harness controls the height, make the view liquid */\n\n}\n.fc .fc-view-harness-active > .fc-view {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n.fc .fc-col-header-cell-cushion {\n display: inline-block; /* x-browser for when sticky (when multi-tier header) */\n padding: 2px 4px;\n }\n.fc .fc-bg-event,\n .fc .fc-non-business,\n .fc .fc-highlight {\n /* will always have a harness with position:relative/absolute, so absolutely expand */\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n.fc .fc-non-business {\n background: var(--fc-non-business-color);\n }\n.fc .fc-bg-event {\n background: var(--fc-bg-event-color);\n opacity: var(--fc-bg-event-opacity)\n }\n.fc .fc-bg-event .fc-event-title {\n margin: .5em;\n font-size: var(--fc-small-font-size);\n font-style: italic;\n }\n.fc .fc-highlight {\n background: var(--fc-highlight-color);\n }\n.fc .fc-cell-shaded,\n .fc .fc-day-disabled {\n background: var(--fc-neutral-bg-color);\n }\n/* link resets */\n/* ---------------------------------------------------------------------------------------------------- */\na.fc-event,\na.fc-event:hover {\n text-decoration: none;\n}\n/* cursor */\n.fc-event[href],\n.fc-event.fc-event-draggable {\n cursor: pointer;\n}\n/* event text content */\n/* ---------------------------------------------------------------------------------------------------- */\n.fc-event .fc-event-main {\n position: relative;\n z-index: 2;\n }\n/* dragging */\n/* ---------------------------------------------------------------------------------------------------- */\n.fc-event-dragging:not(.fc-event-selected) { /* MOUSE */\n opacity: 0.75;\n }\n.fc-event-dragging.fc-event-selected { /* TOUCH */\n box-shadow: 0 2px 7px rgba(0, 0, 0, 0.3);\n }\n/* resizing */\n/* ---------------------------------------------------------------------------------------------------- */\n/* (subclasses should hone positioning for touch and non-touch) */\n.fc-event .fc-event-resizer {\n display: none;\n position: absolute;\n z-index: 4;\n }\n.fc-event:hover, /* MOUSE */\n.fc-event-selected { /* TOUCH */\n\n}\n.fc-event:hover .fc-event-resizer, .fc-event-selected .fc-event-resizer {\n display: block;\n }\n.fc-event-selected .fc-event-resizer {\n border-radius: calc(var(--fc-event-resizer-dot-total-width) / 2);\n border-width: var(--fc-event-resizer-dot-border-width);\n width: var(--fc-event-resizer-dot-total-width);\n height: var(--fc-event-resizer-dot-total-width);\n border-style: solid;\n border-color: inherit;\n background: var(--fc-page-bg-color)\n\n /* expand hit area */\n\n }\n.fc-event-selected .fc-event-resizer:before {\n content: '';\n position: absolute;\n top: -20px;\n left: -20px;\n right: -20px;\n bottom: -20px;\n }\n/* selecting (always TOUCH) */\n/* OR, focused by tab-index */\n/* (TODO: maybe not the best focus-styling for .fc-daygrid-dot-event) */\n/* ---------------------------------------------------------------------------------------------------- */\n.fc-event-selected,\n.fc-event:focus {\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2)\n\n /* expand hit area (subclasses should expand) */\n\n}\n.fc-event-selected:before, .fc-event:focus:before {\n content: \"\";\n position: absolute;\n z-index: 3;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n.fc-event-selected,\n.fc-event:focus {\n\n /* dimmer effect */\n\n}\n.fc-event-selected:after, .fc-event:focus:after {\n content: \"\";\n background: var(--fc-event-selected-overlay-color);\n position: absolute;\n z-index: 1;\n\n /* assume there's a border on all sides. overcome it. */\n /* sometimes there's NOT a border, in which case the dimmer will go over */\n /* an adjacent border, which looks fine. */\n top: -1px;\n left: -1px;\n right: -1px;\n bottom: -1px;\n }\n/*\nA HORIZONTAL event\n*/\n.fc-h-event { /* allowed to be top-level */\n display: block;\n border: 1px solid var(--fc-event-border-color);\n background-color: var(--fc-event-bg-color)\n\n}\n.fc-h-event .fc-event-main {\n color: var(--fc-event-text-color);\n }\n.fc-h-event .fc-event-main-frame {\n display: flex; /* for make fc-event-title-container expand */\n }\n.fc-h-event .fc-event-time {\n max-width: 100%; /* clip overflow on this element */\n overflow: hidden;\n }\n.fc-h-event .fc-event-title-container { /* serves as a container for the sticky cushion */\n flex-grow: 1;\n flex-shrink: 1;\n min-width: 0; /* important for allowing to shrink all the way */\n }\n.fc-h-event .fc-event-title {\n display: inline-block; /* need this to be sticky cross-browser */\n vertical-align: top; /* for not messing up line-height */\n left: 0; /* for sticky */\n right: 0; /* for sticky */\n max-width: 100%; /* clip overflow on this element */\n overflow: hidden;\n }\n.fc-h-event.fc-event-selected:before {\n /* expand hit area */\n top: -10px;\n bottom: -10px;\n }\n/* adjust border and border-radius (if there is any) for non-start/end */\n.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),\n.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n border-left-width: 0;\n}\n.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),\n.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n border-right-width: 0;\n}\n/* resizers */\n.fc-h-event:not(.fc-event-selected) .fc-event-resizer {\n top: 0;\n bottom: 0;\n width: var(--fc-event-resizer-thickness);\n}\n.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,\n.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end {\n cursor: w-resize;\n left: calc(-0.5 * var(--fc-event-resizer-thickness));\n}\n.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,\n.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start {\n cursor: e-resize;\n right: calc(-0.5 * var(--fc-event-resizer-thickness));\n}\n/* resizers for TOUCH */\n.fc-h-event.fc-event-selected .fc-event-resizer {\n top: 50%;\n margin-top: calc(-0.5 * var(--fc-event-resizer-dot-total-width));\n}\n.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,\n.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end {\n left: calc(-0.5 * var(--fc-event-resizer-dot-total-width));\n}\n.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,\n.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start {\n right: calc(-0.5 * var(--fc-event-resizer-dot-total-width));\n}\n.fc .fc-popover {\n position: absolute;\n z-index: 9999;\n box-shadow: 0 2px 6px rgba(0,0,0,.15);\n }\n.fc .fc-popover-header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding: 3px 4px;\n }\n.fc .fc-popover-title {\n margin: 0 2px;\n }\n.fc .fc-popover-close {\n cursor: pointer;\n opacity: 0.65;\n font-size: 1.1em;\n }\n.fc-theme-standard .fc-popover {\n border: 1px solid var(--fc-border-color);\n background: var(--fc-page-bg-color);\n }\n.fc-theme-standard .fc-popover-header {\n background: var(--fc-neutral-bg-color);\n }\n";
|
|
7468
|
+
var css_248z$3 = ":root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-unselectable{-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-moz-user-select:none;user-select:none}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url(\"data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\") format(\"truetype\")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:\"\\e900\"}.fc-icon-chevron-right:before{content:\"\\e901\"}.fc-icon-chevrons-left:before{content:\"\\e902\"}.fc-icon-chevrons-right:before{content:\"\\e903\"}.fc-icon-minus-square:before{content:\"\\e904\"}.fc-icon-plus-square:before{content:\"\\e905\"}.fc-icon-x:before{content:\"\\e906\"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button::-moz-focus-inner{border-style:none;padding:0}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:\"\";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:\"\";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}";
|
|
8047
7469
|
injectStyles(css_248z$3);
|
|
8048
7470
|
|
|
7471
|
+
const globalLocales = [];
|
|
7472
|
+
|
|
8049
7473
|
const MINIMAL_RAW_EN_LOCALE = {
|
|
8050
7474
|
code: 'en',
|
|
8051
7475
|
week: {
|
|
@@ -8139,89 +7563,248 @@ var FullCalendar = (function (exports) {
|
|
|
8139
7563
|
};
|
|
8140
7564
|
}
|
|
8141
7565
|
|
|
8142
|
-
|
|
8143
|
-
|
|
8144
|
-
StandardTheme.prototype.classes = {
|
|
8145
|
-
root: 'fc-theme-standard',
|
|
8146
|
-
tableCellShaded: 'fc-cell-shaded',
|
|
8147
|
-
buttonGroup: 'fc-button-group',
|
|
8148
|
-
button: 'fc-button fc-button-primary',
|
|
8149
|
-
buttonActive: 'fc-button-active',
|
|
8150
|
-
};
|
|
8151
|
-
StandardTheme.prototype.baseIconClass = 'fc-icon';
|
|
8152
|
-
StandardTheme.prototype.iconClasses = {
|
|
8153
|
-
close: 'fc-icon-x',
|
|
8154
|
-
prev: 'fc-icon-chevron-left',
|
|
8155
|
-
next: 'fc-icon-chevron-right',
|
|
8156
|
-
prevYear: 'fc-icon-chevrons-left',
|
|
8157
|
-
nextYear: 'fc-icon-chevrons-right',
|
|
8158
|
-
};
|
|
8159
|
-
StandardTheme.prototype.rtlIconClasses = {
|
|
8160
|
-
prev: 'fc-icon-chevron-right',
|
|
8161
|
-
next: 'fc-icon-chevron-left',
|
|
8162
|
-
prevYear: 'fc-icon-chevrons-right',
|
|
8163
|
-
nextYear: 'fc-icon-chevrons-left',
|
|
8164
|
-
};
|
|
8165
|
-
StandardTheme.prototype.iconOverrideOption = 'buttonIcons'; // TODO: make TS-friendly
|
|
8166
|
-
StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
|
|
8167
|
-
StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
|
|
8168
|
-
|
|
8169
|
-
function compileViewDefs(defaultConfigs, overrideConfigs) {
|
|
8170
|
-
let hash = {};
|
|
8171
|
-
let viewType;
|
|
8172
|
-
for (viewType in defaultConfigs) {
|
|
8173
|
-
ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
|
|
8174
|
-
}
|
|
8175
|
-
for (viewType in overrideConfigs) {
|
|
8176
|
-
ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
|
|
8177
|
-
}
|
|
8178
|
-
return hash;
|
|
8179
|
-
}
|
|
8180
|
-
function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
|
|
8181
|
-
if (hash[viewType]) {
|
|
8182
|
-
return hash[viewType];
|
|
8183
|
-
}
|
|
8184
|
-
let viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
|
|
8185
|
-
if (viewDef) {
|
|
8186
|
-
hash[viewType] = viewDef;
|
|
8187
|
-
}
|
|
8188
|
-
return viewDef;
|
|
8189
|
-
}
|
|
8190
|
-
function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
|
|
8191
|
-
let defaultConfig = defaultConfigs[viewType];
|
|
8192
|
-
let overrideConfig = overrideConfigs[viewType];
|
|
8193
|
-
let queryProp = (name) => ((defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :
|
|
8194
|
-
((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null));
|
|
8195
|
-
let theComponent = queryProp('component');
|
|
8196
|
-
let superType = queryProp('superType');
|
|
8197
|
-
let superDef = null;
|
|
8198
|
-
if (superType) {
|
|
8199
|
-
if (superType === viewType) {
|
|
8200
|
-
throw new Error('Can\'t have a custom view type that references itself');
|
|
8201
|
-
}
|
|
8202
|
-
superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
|
|
8203
|
-
}
|
|
8204
|
-
if (!theComponent && superDef) {
|
|
8205
|
-
theComponent = superDef.component;
|
|
8206
|
-
}
|
|
8207
|
-
if (!theComponent) {
|
|
8208
|
-
return null; // don't throw a warning, might be settings for a single-unit view
|
|
8209
|
-
}
|
|
7566
|
+
// TODO: easier way to add new hooks? need to update a million things
|
|
7567
|
+
function createPlugin(input) {
|
|
8210
7568
|
return {
|
|
8211
|
-
|
|
8212
|
-
|
|
8213
|
-
|
|
8214
|
-
|
|
8215
|
-
|
|
8216
|
-
|
|
8217
|
-
|
|
8218
|
-
|
|
8219
|
-
|
|
8220
|
-
|
|
8221
|
-
|
|
8222
|
-
|
|
8223
|
-
|
|
8224
|
-
input
|
|
7569
|
+
id: guid(),
|
|
7570
|
+
name: input.name,
|
|
7571
|
+
premiumReleaseDate: input.premiumReleaseDate ? new Date(input.premiumReleaseDate) : undefined,
|
|
7572
|
+
deps: input.deps || [],
|
|
7573
|
+
reducers: input.reducers || [],
|
|
7574
|
+
isLoadingFuncs: input.isLoadingFuncs || [],
|
|
7575
|
+
contextInit: [].concat(input.contextInit || []),
|
|
7576
|
+
eventRefiners: input.eventRefiners || {},
|
|
7577
|
+
eventDefMemberAdders: input.eventDefMemberAdders || [],
|
|
7578
|
+
eventSourceRefiners: input.eventSourceRefiners || {},
|
|
7579
|
+
isDraggableTransformers: input.isDraggableTransformers || [],
|
|
7580
|
+
eventDragMutationMassagers: input.eventDragMutationMassagers || [],
|
|
7581
|
+
eventDefMutationAppliers: input.eventDefMutationAppliers || [],
|
|
7582
|
+
dateSelectionTransformers: input.dateSelectionTransformers || [],
|
|
7583
|
+
datePointTransforms: input.datePointTransforms || [],
|
|
7584
|
+
dateSpanTransforms: input.dateSpanTransforms || [],
|
|
7585
|
+
views: input.views || {},
|
|
7586
|
+
viewPropsTransformers: input.viewPropsTransformers || [],
|
|
7587
|
+
isPropsValid: input.isPropsValid || null,
|
|
7588
|
+
externalDefTransforms: input.externalDefTransforms || [],
|
|
7589
|
+
viewContainerAppends: input.viewContainerAppends || [],
|
|
7590
|
+
eventDropTransformers: input.eventDropTransformers || [],
|
|
7591
|
+
componentInteractions: input.componentInteractions || [],
|
|
7592
|
+
calendarInteractions: input.calendarInteractions || [],
|
|
7593
|
+
themeClasses: input.themeClasses || {},
|
|
7594
|
+
eventSourceDefs: input.eventSourceDefs || [],
|
|
7595
|
+
cmdFormatter: input.cmdFormatter,
|
|
7596
|
+
recurringTypes: input.recurringTypes || [],
|
|
7597
|
+
namedTimeZonedImpl: input.namedTimeZonedImpl,
|
|
7598
|
+
initialView: input.initialView || '',
|
|
7599
|
+
elementDraggingImpl: input.elementDraggingImpl,
|
|
7600
|
+
optionChangeHandlers: input.optionChangeHandlers || {},
|
|
7601
|
+
scrollGridImpl: input.scrollGridImpl || null,
|
|
7602
|
+
listenerRefiners: input.listenerRefiners || {},
|
|
7603
|
+
optionRefiners: input.optionRefiners || {},
|
|
7604
|
+
propSetHandlers: input.propSetHandlers || {},
|
|
7605
|
+
};
|
|
7606
|
+
}
|
|
7607
|
+
function buildPluginHooks(pluginDefs, globalDefs) {
|
|
7608
|
+
let currentPluginIds = {};
|
|
7609
|
+
let hooks = {
|
|
7610
|
+
premiumReleaseDate: undefined,
|
|
7611
|
+
reducers: [],
|
|
7612
|
+
isLoadingFuncs: [],
|
|
7613
|
+
contextInit: [],
|
|
7614
|
+
eventRefiners: {},
|
|
7615
|
+
eventDefMemberAdders: [],
|
|
7616
|
+
eventSourceRefiners: {},
|
|
7617
|
+
isDraggableTransformers: [],
|
|
7618
|
+
eventDragMutationMassagers: [],
|
|
7619
|
+
eventDefMutationAppliers: [],
|
|
7620
|
+
dateSelectionTransformers: [],
|
|
7621
|
+
datePointTransforms: [],
|
|
7622
|
+
dateSpanTransforms: [],
|
|
7623
|
+
views: {},
|
|
7624
|
+
viewPropsTransformers: [],
|
|
7625
|
+
isPropsValid: null,
|
|
7626
|
+
externalDefTransforms: [],
|
|
7627
|
+
viewContainerAppends: [],
|
|
7628
|
+
eventDropTransformers: [],
|
|
7629
|
+
componentInteractions: [],
|
|
7630
|
+
calendarInteractions: [],
|
|
7631
|
+
themeClasses: {},
|
|
7632
|
+
eventSourceDefs: [],
|
|
7633
|
+
cmdFormatter: null,
|
|
7634
|
+
recurringTypes: [],
|
|
7635
|
+
namedTimeZonedImpl: null,
|
|
7636
|
+
initialView: '',
|
|
7637
|
+
elementDraggingImpl: null,
|
|
7638
|
+
optionChangeHandlers: {},
|
|
7639
|
+
scrollGridImpl: null,
|
|
7640
|
+
listenerRefiners: {},
|
|
7641
|
+
optionRefiners: {},
|
|
7642
|
+
propSetHandlers: {},
|
|
7643
|
+
};
|
|
7644
|
+
function addDefs(defs) {
|
|
7645
|
+
for (let def of defs) {
|
|
7646
|
+
const pluginName = def.name;
|
|
7647
|
+
const currentId = currentPluginIds[pluginName];
|
|
7648
|
+
if (currentId === undefined) {
|
|
7649
|
+
currentPluginIds[pluginName] = def.id;
|
|
7650
|
+
addDefs(def.deps);
|
|
7651
|
+
hooks = combineHooks(hooks, def);
|
|
7652
|
+
}
|
|
7653
|
+
else if (currentId !== def.id) {
|
|
7654
|
+
// different ID than the one already added
|
|
7655
|
+
console.warn(`Duplicate plugin '${pluginName}'`);
|
|
7656
|
+
}
|
|
7657
|
+
}
|
|
7658
|
+
}
|
|
7659
|
+
if (pluginDefs) {
|
|
7660
|
+
addDefs(pluginDefs);
|
|
7661
|
+
}
|
|
7662
|
+
addDefs(globalDefs);
|
|
7663
|
+
return hooks;
|
|
7664
|
+
}
|
|
7665
|
+
function buildBuildPluginHooks() {
|
|
7666
|
+
let currentOverrideDefs = [];
|
|
7667
|
+
let currentGlobalDefs = [];
|
|
7668
|
+
let currentHooks;
|
|
7669
|
+
return (overrideDefs, globalDefs) => {
|
|
7670
|
+
if (!currentHooks || !isArraysEqual(overrideDefs, currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) {
|
|
7671
|
+
currentHooks = buildPluginHooks(overrideDefs, globalDefs);
|
|
7672
|
+
}
|
|
7673
|
+
currentOverrideDefs = overrideDefs;
|
|
7674
|
+
currentGlobalDefs = globalDefs;
|
|
7675
|
+
return currentHooks;
|
|
7676
|
+
};
|
|
7677
|
+
}
|
|
7678
|
+
function combineHooks(hooks0, hooks1) {
|
|
7679
|
+
return {
|
|
7680
|
+
premiumReleaseDate: compareOptionalDates(hooks0.premiumReleaseDate, hooks1.premiumReleaseDate),
|
|
7681
|
+
reducers: hooks0.reducers.concat(hooks1.reducers),
|
|
7682
|
+
isLoadingFuncs: hooks0.isLoadingFuncs.concat(hooks1.isLoadingFuncs),
|
|
7683
|
+
contextInit: hooks0.contextInit.concat(hooks1.contextInit),
|
|
7684
|
+
eventRefiners: Object.assign(Object.assign({}, hooks0.eventRefiners), hooks1.eventRefiners),
|
|
7685
|
+
eventDefMemberAdders: hooks0.eventDefMemberAdders.concat(hooks1.eventDefMemberAdders),
|
|
7686
|
+
eventSourceRefiners: Object.assign(Object.assign({}, hooks0.eventSourceRefiners), hooks1.eventSourceRefiners),
|
|
7687
|
+
isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
|
|
7688
|
+
eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
|
|
7689
|
+
eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
|
|
7690
|
+
dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
|
|
7691
|
+
datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
|
|
7692
|
+
dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
|
|
7693
|
+
views: Object.assign(Object.assign({}, hooks0.views), hooks1.views),
|
|
7694
|
+
viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
|
|
7695
|
+
isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
|
|
7696
|
+
externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
|
|
7697
|
+
viewContainerAppends: hooks0.viewContainerAppends.concat(hooks1.viewContainerAppends),
|
|
7698
|
+
eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
|
|
7699
|
+
calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
|
|
7700
|
+
componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
|
|
7701
|
+
themeClasses: Object.assign(Object.assign({}, hooks0.themeClasses), hooks1.themeClasses),
|
|
7702
|
+
eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
|
|
7703
|
+
cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
|
|
7704
|
+
recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
|
|
7705
|
+
namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
|
|
7706
|
+
initialView: hooks0.initialView || hooks1.initialView,
|
|
7707
|
+
elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
|
|
7708
|
+
optionChangeHandlers: Object.assign(Object.assign({}, hooks0.optionChangeHandlers), hooks1.optionChangeHandlers),
|
|
7709
|
+
scrollGridImpl: hooks1.scrollGridImpl || hooks0.scrollGridImpl,
|
|
7710
|
+
listenerRefiners: Object.assign(Object.assign({}, hooks0.listenerRefiners), hooks1.listenerRefiners),
|
|
7711
|
+
optionRefiners: Object.assign(Object.assign({}, hooks0.optionRefiners), hooks1.optionRefiners),
|
|
7712
|
+
propSetHandlers: Object.assign(Object.assign({}, hooks0.propSetHandlers), hooks1.propSetHandlers),
|
|
7713
|
+
};
|
|
7714
|
+
}
|
|
7715
|
+
function compareOptionalDates(date0, date1) {
|
|
7716
|
+
if (date0 === undefined) {
|
|
7717
|
+
return date1;
|
|
7718
|
+
}
|
|
7719
|
+
if (date1 === undefined) {
|
|
7720
|
+
return date0;
|
|
7721
|
+
}
|
|
7722
|
+
return new Date(Math.max(date0.valueOf(), date1.valueOf()));
|
|
7723
|
+
}
|
|
7724
|
+
|
|
7725
|
+
class StandardTheme extends Theme {
|
|
7726
|
+
}
|
|
7727
|
+
StandardTheme.prototype.classes = {
|
|
7728
|
+
root: 'fc-theme-standard',
|
|
7729
|
+
tableCellShaded: 'fc-cell-shaded',
|
|
7730
|
+
buttonGroup: 'fc-button-group',
|
|
7731
|
+
button: 'fc-button fc-button-primary',
|
|
7732
|
+
buttonActive: 'fc-button-active',
|
|
7733
|
+
};
|
|
7734
|
+
StandardTheme.prototype.baseIconClass = 'fc-icon';
|
|
7735
|
+
StandardTheme.prototype.iconClasses = {
|
|
7736
|
+
close: 'fc-icon-x',
|
|
7737
|
+
prev: 'fc-icon-chevron-left',
|
|
7738
|
+
next: 'fc-icon-chevron-right',
|
|
7739
|
+
prevYear: 'fc-icon-chevrons-left',
|
|
7740
|
+
nextYear: 'fc-icon-chevrons-right',
|
|
7741
|
+
};
|
|
7742
|
+
StandardTheme.prototype.rtlIconClasses = {
|
|
7743
|
+
prev: 'fc-icon-chevron-right',
|
|
7744
|
+
next: 'fc-icon-chevron-left',
|
|
7745
|
+
prevYear: 'fc-icon-chevrons-right',
|
|
7746
|
+
nextYear: 'fc-icon-chevrons-left',
|
|
7747
|
+
};
|
|
7748
|
+
StandardTheme.prototype.iconOverrideOption = 'buttonIcons'; // TODO: make TS-friendly
|
|
7749
|
+
StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
|
|
7750
|
+
StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
|
|
7751
|
+
|
|
7752
|
+
function compileViewDefs(defaultConfigs, overrideConfigs) {
|
|
7753
|
+
let hash = {};
|
|
7754
|
+
let viewType;
|
|
7755
|
+
for (viewType in defaultConfigs) {
|
|
7756
|
+
ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
|
|
7757
|
+
}
|
|
7758
|
+
for (viewType in overrideConfigs) {
|
|
7759
|
+
ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
|
|
7760
|
+
}
|
|
7761
|
+
return hash;
|
|
7762
|
+
}
|
|
7763
|
+
function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
|
|
7764
|
+
if (hash[viewType]) {
|
|
7765
|
+
return hash[viewType];
|
|
7766
|
+
}
|
|
7767
|
+
let viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
|
|
7768
|
+
if (viewDef) {
|
|
7769
|
+
hash[viewType] = viewDef;
|
|
7770
|
+
}
|
|
7771
|
+
return viewDef;
|
|
7772
|
+
}
|
|
7773
|
+
function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
|
|
7774
|
+
let defaultConfig = defaultConfigs[viewType];
|
|
7775
|
+
let overrideConfig = overrideConfigs[viewType];
|
|
7776
|
+
let queryProp = (name) => ((defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :
|
|
7777
|
+
((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null));
|
|
7778
|
+
let theComponent = queryProp('component');
|
|
7779
|
+
let superType = queryProp('superType');
|
|
7780
|
+
let superDef = null;
|
|
7781
|
+
if (superType) {
|
|
7782
|
+
if (superType === viewType) {
|
|
7783
|
+
throw new Error('Can\'t have a custom view type that references itself');
|
|
7784
|
+
}
|
|
7785
|
+
superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
|
|
7786
|
+
}
|
|
7787
|
+
if (!theComponent && superDef) {
|
|
7788
|
+
theComponent = superDef.component;
|
|
7789
|
+
}
|
|
7790
|
+
if (!theComponent) {
|
|
7791
|
+
return null; // don't throw a warning, might be settings for a single-unit view
|
|
7792
|
+
}
|
|
7793
|
+
return {
|
|
7794
|
+
type: viewType,
|
|
7795
|
+
component: theComponent,
|
|
7796
|
+
defaults: Object.assign(Object.assign({}, (superDef ? superDef.defaults : {})), (defaultConfig ? defaultConfig.rawOptions : {})),
|
|
7797
|
+
overrides: Object.assign(Object.assign({}, (superDef ? superDef.overrides : {})), (overrideConfig ? overrideConfig.rawOptions : {})),
|
|
7798
|
+
};
|
|
7799
|
+
}
|
|
7800
|
+
|
|
7801
|
+
function parseViewConfigs(inputs) {
|
|
7802
|
+
return mapHash(inputs, parseViewConfig);
|
|
7803
|
+
}
|
|
7804
|
+
function parseViewConfig(input) {
|
|
7805
|
+
let rawOptions = typeof input === 'function' ?
|
|
7806
|
+
{ component: input } :
|
|
7807
|
+
input;
|
|
8225
7808
|
let { component } = rawOptions;
|
|
8226
7809
|
if (rawOptions.content) {
|
|
8227
7810
|
component = createViewHookComponent(rawOptions);
|
|
@@ -8343,29 +7926,193 @@ var FullCalendar = (function (exports) {
|
|
|
8343
7926
|
default:
|
|
8344
7927
|
return dynamicOptionOverrides;
|
|
8345
7928
|
}
|
|
8346
|
-
}
|
|
8347
|
-
|
|
8348
|
-
function reduceDateProfile(currentDateProfile, action, currentDate, dateProfileGenerator) {
|
|
8349
|
-
let dp;
|
|
8350
|
-
switch (action.type) {
|
|
8351
|
-
case 'CHANGE_VIEW_TYPE':
|
|
8352
|
-
return dateProfileGenerator.build(action.dateMarker || currentDate);
|
|
8353
|
-
case 'CHANGE_DATE':
|
|
8354
|
-
return dateProfileGenerator.build(action.dateMarker);
|
|
8355
|
-
case 'PREV':
|
|
8356
|
-
dp = dateProfileGenerator.buildPrev(currentDateProfile, currentDate);
|
|
8357
|
-
if (dp.isValid) {
|
|
8358
|
-
return dp;
|
|
8359
|
-
}
|
|
8360
|
-
break;
|
|
8361
|
-
case 'NEXT':
|
|
8362
|
-
dp = dateProfileGenerator.buildNext(currentDateProfile, currentDate);
|
|
8363
|
-
if (dp.isValid) {
|
|
8364
|
-
return dp;
|
|
8365
|
-
}
|
|
8366
|
-
break;
|
|
7929
|
+
}
|
|
7930
|
+
|
|
7931
|
+
function reduceDateProfile(currentDateProfile, action, currentDate, dateProfileGenerator) {
|
|
7932
|
+
let dp;
|
|
7933
|
+
switch (action.type) {
|
|
7934
|
+
case 'CHANGE_VIEW_TYPE':
|
|
7935
|
+
return dateProfileGenerator.build(action.dateMarker || currentDate);
|
|
7936
|
+
case 'CHANGE_DATE':
|
|
7937
|
+
return dateProfileGenerator.build(action.dateMarker);
|
|
7938
|
+
case 'PREV':
|
|
7939
|
+
dp = dateProfileGenerator.buildPrev(currentDateProfile, currentDate);
|
|
7940
|
+
if (dp.isValid) {
|
|
7941
|
+
return dp;
|
|
7942
|
+
}
|
|
7943
|
+
break;
|
|
7944
|
+
case 'NEXT':
|
|
7945
|
+
dp = dateProfileGenerator.buildNext(currentDateProfile, currentDate);
|
|
7946
|
+
if (dp.isValid) {
|
|
7947
|
+
return dp;
|
|
7948
|
+
}
|
|
7949
|
+
break;
|
|
7950
|
+
}
|
|
7951
|
+
return currentDateProfile;
|
|
7952
|
+
}
|
|
7953
|
+
|
|
7954
|
+
function initEventSources(calendarOptions, dateProfile, context) {
|
|
7955
|
+
let activeRange = dateProfile ? dateProfile.activeRange : null;
|
|
7956
|
+
return addSources({}, parseInitialSources(calendarOptions, context), activeRange, context);
|
|
7957
|
+
}
|
|
7958
|
+
function reduceEventSources(eventSources, action, dateProfile, context) {
|
|
7959
|
+
let activeRange = dateProfile ? dateProfile.activeRange : null; // need this check?
|
|
7960
|
+
switch (action.type) {
|
|
7961
|
+
case 'ADD_EVENT_SOURCES': // already parsed
|
|
7962
|
+
return addSources(eventSources, action.sources, activeRange, context);
|
|
7963
|
+
case 'REMOVE_EVENT_SOURCE':
|
|
7964
|
+
return removeSource(eventSources, action.sourceId);
|
|
7965
|
+
case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
|
|
7966
|
+
case 'NEXT':
|
|
7967
|
+
case 'CHANGE_DATE':
|
|
7968
|
+
case 'CHANGE_VIEW_TYPE':
|
|
7969
|
+
if (dateProfile) {
|
|
7970
|
+
return fetchDirtySources(eventSources, activeRange, context);
|
|
7971
|
+
}
|
|
7972
|
+
return eventSources;
|
|
7973
|
+
case 'FETCH_EVENT_SOURCES':
|
|
7974
|
+
return fetchSourcesByIds(eventSources, action.sourceIds ? // why no type?
|
|
7975
|
+
arrayToHash(action.sourceIds) :
|
|
7976
|
+
excludeStaticSources(eventSources, context), activeRange, action.isRefetch || false, context);
|
|
7977
|
+
case 'RECEIVE_EVENTS':
|
|
7978
|
+
case 'RECEIVE_EVENT_ERROR':
|
|
7979
|
+
return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
|
|
7980
|
+
case 'REMOVE_ALL_EVENT_SOURCES':
|
|
7981
|
+
return {};
|
|
7982
|
+
default:
|
|
7983
|
+
return eventSources;
|
|
7984
|
+
}
|
|
7985
|
+
}
|
|
7986
|
+
function reduceEventSourcesNewTimeZone(eventSources, dateProfile, context) {
|
|
7987
|
+
let activeRange = dateProfile ? dateProfile.activeRange : null; // need this check?
|
|
7988
|
+
return fetchSourcesByIds(eventSources, excludeStaticSources(eventSources, context), activeRange, true, context);
|
|
7989
|
+
}
|
|
7990
|
+
function computeEventSourcesLoading(eventSources) {
|
|
7991
|
+
for (let sourceId in eventSources) {
|
|
7992
|
+
if (eventSources[sourceId].isFetching) {
|
|
7993
|
+
return true;
|
|
7994
|
+
}
|
|
7995
|
+
}
|
|
7996
|
+
return false;
|
|
7997
|
+
}
|
|
7998
|
+
function addSources(eventSourceHash, sources, fetchRange, context) {
|
|
7999
|
+
let hash = {};
|
|
8000
|
+
for (let source of sources) {
|
|
8001
|
+
hash[source.sourceId] = source;
|
|
8002
|
+
}
|
|
8003
|
+
if (fetchRange) {
|
|
8004
|
+
hash = fetchDirtySources(hash, fetchRange, context);
|
|
8005
|
+
}
|
|
8006
|
+
return Object.assign(Object.assign({}, eventSourceHash), hash);
|
|
8007
|
+
}
|
|
8008
|
+
function removeSource(eventSourceHash, sourceId) {
|
|
8009
|
+
return filterHash(eventSourceHash, (eventSource) => eventSource.sourceId !== sourceId);
|
|
8010
|
+
}
|
|
8011
|
+
function fetchDirtySources(sourceHash, fetchRange, context) {
|
|
8012
|
+
return fetchSourcesByIds(sourceHash, filterHash(sourceHash, (eventSource) => isSourceDirty(eventSource, fetchRange, context)), fetchRange, false, context);
|
|
8013
|
+
}
|
|
8014
|
+
function isSourceDirty(eventSource, fetchRange, context) {
|
|
8015
|
+
if (!doesSourceNeedRange(eventSource, context)) {
|
|
8016
|
+
return !eventSource.latestFetchId;
|
|
8017
|
+
}
|
|
8018
|
+
return !context.options.lazyFetching ||
|
|
8019
|
+
!eventSource.fetchRange ||
|
|
8020
|
+
eventSource.isFetching || // always cancel outdated in-progress fetches
|
|
8021
|
+
fetchRange.start < eventSource.fetchRange.start ||
|
|
8022
|
+
fetchRange.end > eventSource.fetchRange.end;
|
|
8023
|
+
}
|
|
8024
|
+
function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, isRefetch, context) {
|
|
8025
|
+
let nextSources = {};
|
|
8026
|
+
for (let sourceId in prevSources) {
|
|
8027
|
+
let source = prevSources[sourceId];
|
|
8028
|
+
if (sourceIdHash[sourceId]) {
|
|
8029
|
+
nextSources[sourceId] = fetchSource(source, fetchRange, isRefetch, context);
|
|
8030
|
+
}
|
|
8031
|
+
else {
|
|
8032
|
+
nextSources[sourceId] = source;
|
|
8033
|
+
}
|
|
8034
|
+
}
|
|
8035
|
+
return nextSources;
|
|
8036
|
+
}
|
|
8037
|
+
function fetchSource(eventSource, fetchRange, isRefetch, context) {
|
|
8038
|
+
let { options, calendarApi } = context;
|
|
8039
|
+
let sourceDef = context.pluginHooks.eventSourceDefs[eventSource.sourceDefId];
|
|
8040
|
+
let fetchId = guid();
|
|
8041
|
+
sourceDef.fetch({
|
|
8042
|
+
eventSource,
|
|
8043
|
+
range: fetchRange,
|
|
8044
|
+
isRefetch,
|
|
8045
|
+
context,
|
|
8046
|
+
}, (res) => {
|
|
8047
|
+
let { rawEvents } = res;
|
|
8048
|
+
if (options.eventSourceSuccess) {
|
|
8049
|
+
rawEvents = options.eventSourceSuccess.call(calendarApi, rawEvents, res.response) || rawEvents;
|
|
8050
|
+
}
|
|
8051
|
+
if (eventSource.success) {
|
|
8052
|
+
rawEvents = eventSource.success.call(calendarApi, rawEvents, res.response) || rawEvents;
|
|
8053
|
+
}
|
|
8054
|
+
context.dispatch({
|
|
8055
|
+
type: 'RECEIVE_EVENTS',
|
|
8056
|
+
sourceId: eventSource.sourceId,
|
|
8057
|
+
fetchId,
|
|
8058
|
+
fetchRange,
|
|
8059
|
+
rawEvents,
|
|
8060
|
+
});
|
|
8061
|
+
}, (error) => {
|
|
8062
|
+
let errorHandled = false;
|
|
8063
|
+
if (options.eventSourceFailure) {
|
|
8064
|
+
options.eventSourceFailure.call(calendarApi, error);
|
|
8065
|
+
errorHandled = true;
|
|
8066
|
+
}
|
|
8067
|
+
if (eventSource.failure) {
|
|
8068
|
+
eventSource.failure(error);
|
|
8069
|
+
errorHandled = true;
|
|
8070
|
+
}
|
|
8071
|
+
if (!errorHandled) {
|
|
8072
|
+
console.warn(error.message, error);
|
|
8073
|
+
}
|
|
8074
|
+
context.dispatch({
|
|
8075
|
+
type: 'RECEIVE_EVENT_ERROR',
|
|
8076
|
+
sourceId: eventSource.sourceId,
|
|
8077
|
+
fetchId,
|
|
8078
|
+
fetchRange,
|
|
8079
|
+
error,
|
|
8080
|
+
});
|
|
8081
|
+
});
|
|
8082
|
+
return Object.assign(Object.assign({}, eventSource), { isFetching: true, latestFetchId: fetchId });
|
|
8083
|
+
}
|
|
8084
|
+
function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
|
|
8085
|
+
let eventSource = sourceHash[sourceId];
|
|
8086
|
+
if (eventSource && // not already removed
|
|
8087
|
+
fetchId === eventSource.latestFetchId) {
|
|
8088
|
+
return Object.assign(Object.assign({}, sourceHash), { [sourceId]: Object.assign(Object.assign({}, eventSource), { isFetching: false, fetchRange }) });
|
|
8089
|
+
}
|
|
8090
|
+
return sourceHash;
|
|
8091
|
+
}
|
|
8092
|
+
function excludeStaticSources(eventSources, context) {
|
|
8093
|
+
return filterHash(eventSources, (eventSource) => doesSourceNeedRange(eventSource, context));
|
|
8094
|
+
}
|
|
8095
|
+
function parseInitialSources(rawOptions, context) {
|
|
8096
|
+
let refiners = buildEventSourceRefiners(context);
|
|
8097
|
+
let rawSources = [].concat(rawOptions.eventSources || []);
|
|
8098
|
+
let sources = []; // parsed
|
|
8099
|
+
if (rawOptions.initialEvents) {
|
|
8100
|
+
rawSources.unshift(rawOptions.initialEvents);
|
|
8101
|
+
}
|
|
8102
|
+
if (rawOptions.events) {
|
|
8103
|
+
rawSources.unshift(rawOptions.events);
|
|
8367
8104
|
}
|
|
8368
|
-
|
|
8105
|
+
for (let rawSource of rawSources) {
|
|
8106
|
+
let source = parseEventSource(rawSource, context, refiners);
|
|
8107
|
+
if (source) {
|
|
8108
|
+
sources.push(source);
|
|
8109
|
+
}
|
|
8110
|
+
}
|
|
8111
|
+
return sources;
|
|
8112
|
+
}
|
|
8113
|
+
function doesSourceNeedRange(eventSource, context) {
|
|
8114
|
+
let defs = context.pluginHooks.eventSourceDefs;
|
|
8115
|
+
return !defs[eventSource.sourceDefId].ignoreRange;
|
|
8369
8116
|
}
|
|
8370
8117
|
|
|
8371
8118
|
function reduceDateSelection(currentSelection, action) {
|
|
@@ -8518,41 +8265,292 @@ var FullCalendar = (function (exports) {
|
|
|
8518
8265
|
], calendarButtonText[buttonName]);
|
|
8519
8266
|
}
|
|
8520
8267
|
}
|
|
8521
|
-
return { buttonName, buttonClick, buttonIcon, buttonText, buttonHint };
|
|
8522
|
-
})));
|
|
8523
|
-
return { widgets, viewsWithButtons, hasTitle };
|
|
8524
|
-
}
|
|
8525
|
-
|
|
8526
|
-
// always represents the current view. otherwise, it'd need to change value every time date changes
|
|
8527
|
-
class ViewImpl {
|
|
8528
|
-
constructor(type, getCurrentData, dateEnv) {
|
|
8529
|
-
this.type = type;
|
|
8530
|
-
this.getCurrentData = getCurrentData;
|
|
8531
|
-
this.dateEnv = dateEnv;
|
|
8532
|
-
}
|
|
8533
|
-
get calendar() {
|
|
8534
|
-
return this.getCurrentData().calendarApi;
|
|
8535
|
-
}
|
|
8536
|
-
get title() {
|
|
8537
|
-
return this.getCurrentData().viewTitle;
|
|
8538
|
-
}
|
|
8539
|
-
get activeStart() {
|
|
8540
|
-
return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start);
|
|
8541
|
-
}
|
|
8542
|
-
get activeEnd() {
|
|
8543
|
-
return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end);
|
|
8268
|
+
return { buttonName, buttonClick, buttonIcon, buttonText, buttonHint };
|
|
8269
|
+
})));
|
|
8270
|
+
return { widgets, viewsWithButtons, hasTitle };
|
|
8271
|
+
}
|
|
8272
|
+
|
|
8273
|
+
// always represents the current view. otherwise, it'd need to change value every time date changes
|
|
8274
|
+
class ViewImpl {
|
|
8275
|
+
constructor(type, getCurrentData, dateEnv) {
|
|
8276
|
+
this.type = type;
|
|
8277
|
+
this.getCurrentData = getCurrentData;
|
|
8278
|
+
this.dateEnv = dateEnv;
|
|
8279
|
+
}
|
|
8280
|
+
get calendar() {
|
|
8281
|
+
return this.getCurrentData().calendarApi;
|
|
8282
|
+
}
|
|
8283
|
+
get title() {
|
|
8284
|
+
return this.getCurrentData().viewTitle;
|
|
8285
|
+
}
|
|
8286
|
+
get activeStart() {
|
|
8287
|
+
return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start);
|
|
8288
|
+
}
|
|
8289
|
+
get activeEnd() {
|
|
8290
|
+
return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end);
|
|
8291
|
+
}
|
|
8292
|
+
get currentStart() {
|
|
8293
|
+
return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start);
|
|
8294
|
+
}
|
|
8295
|
+
get currentEnd() {
|
|
8296
|
+
return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end);
|
|
8297
|
+
}
|
|
8298
|
+
getOption(name) {
|
|
8299
|
+
return this.getCurrentData().options[name]; // are the view-specific options
|
|
8300
|
+
}
|
|
8301
|
+
}
|
|
8302
|
+
|
|
8303
|
+
let eventSourceDef$2 = {
|
|
8304
|
+
ignoreRange: true,
|
|
8305
|
+
parseMeta(refined) {
|
|
8306
|
+
if (Array.isArray(refined.events)) {
|
|
8307
|
+
return refined.events;
|
|
8308
|
+
}
|
|
8309
|
+
return null;
|
|
8310
|
+
},
|
|
8311
|
+
fetch(arg, successCallback) {
|
|
8312
|
+
successCallback({
|
|
8313
|
+
rawEvents: arg.eventSource.meta,
|
|
8314
|
+
});
|
|
8315
|
+
},
|
|
8316
|
+
};
|
|
8317
|
+
const arrayEventSourcePlugin = createPlugin({
|
|
8318
|
+
name: 'array-event-source',
|
|
8319
|
+
eventSourceDefs: [eventSourceDef$2],
|
|
8320
|
+
});
|
|
8321
|
+
|
|
8322
|
+
let eventSourceDef$1 = {
|
|
8323
|
+
parseMeta(refined) {
|
|
8324
|
+
if (typeof refined.events === 'function') {
|
|
8325
|
+
return refined.events;
|
|
8326
|
+
}
|
|
8327
|
+
return null;
|
|
8328
|
+
},
|
|
8329
|
+
fetch(arg, successCallback, errorCallback) {
|
|
8330
|
+
const { dateEnv } = arg.context;
|
|
8331
|
+
const func = arg.eventSource.meta;
|
|
8332
|
+
unpromisify(func.bind(null, buildRangeApiWithTimeZone(arg.range, dateEnv)), (rawEvents) => successCallback({ rawEvents }), errorCallback);
|
|
8333
|
+
},
|
|
8334
|
+
};
|
|
8335
|
+
const funcEventSourcePlugin = createPlugin({
|
|
8336
|
+
name: 'func-event-source',
|
|
8337
|
+
eventSourceDefs: [eventSourceDef$1],
|
|
8338
|
+
});
|
|
8339
|
+
|
|
8340
|
+
const JSON_FEED_EVENT_SOURCE_REFINERS = {
|
|
8341
|
+
method: String,
|
|
8342
|
+
extraParams: identity,
|
|
8343
|
+
startParam: String,
|
|
8344
|
+
endParam: String,
|
|
8345
|
+
timeZoneParam: String,
|
|
8346
|
+
};
|
|
8347
|
+
|
|
8348
|
+
let eventSourceDef = {
|
|
8349
|
+
parseMeta(refined) {
|
|
8350
|
+
if (refined.url && (refined.format === 'json' || !refined.format)) {
|
|
8351
|
+
return {
|
|
8352
|
+
url: refined.url,
|
|
8353
|
+
format: 'json',
|
|
8354
|
+
method: (refined.method || 'GET').toUpperCase(),
|
|
8355
|
+
extraParams: refined.extraParams,
|
|
8356
|
+
startParam: refined.startParam,
|
|
8357
|
+
endParam: refined.endParam,
|
|
8358
|
+
timeZoneParam: refined.timeZoneParam,
|
|
8359
|
+
};
|
|
8360
|
+
}
|
|
8361
|
+
return null;
|
|
8362
|
+
},
|
|
8363
|
+
fetch(arg, successCallback, errorCallback) {
|
|
8364
|
+
const { meta } = arg.eventSource;
|
|
8365
|
+
const requestParams = buildRequestParams(meta, arg.range, arg.context);
|
|
8366
|
+
requestJson(meta.method, meta.url, requestParams).then(([rawEvents, response]) => {
|
|
8367
|
+
successCallback({ rawEvents, response });
|
|
8368
|
+
}, errorCallback);
|
|
8369
|
+
},
|
|
8370
|
+
};
|
|
8371
|
+
const jsonFeedEventSourcePlugin = createPlugin({
|
|
8372
|
+
name: 'json-event-source',
|
|
8373
|
+
eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS,
|
|
8374
|
+
eventSourceDefs: [eventSourceDef],
|
|
8375
|
+
});
|
|
8376
|
+
function buildRequestParams(meta, range, context) {
|
|
8377
|
+
let { dateEnv, options } = context;
|
|
8378
|
+
let startParam;
|
|
8379
|
+
let endParam;
|
|
8380
|
+
let timeZoneParam;
|
|
8381
|
+
let customRequestParams;
|
|
8382
|
+
let params = {};
|
|
8383
|
+
startParam = meta.startParam;
|
|
8384
|
+
if (startParam == null) {
|
|
8385
|
+
startParam = options.startParam;
|
|
8386
|
+
}
|
|
8387
|
+
endParam = meta.endParam;
|
|
8388
|
+
if (endParam == null) {
|
|
8389
|
+
endParam = options.endParam;
|
|
8390
|
+
}
|
|
8391
|
+
timeZoneParam = meta.timeZoneParam;
|
|
8392
|
+
if (timeZoneParam == null) {
|
|
8393
|
+
timeZoneParam = options.timeZoneParam;
|
|
8394
|
+
}
|
|
8395
|
+
// retrieve any outbound GET/POST data from the options
|
|
8396
|
+
if (typeof meta.extraParams === 'function') {
|
|
8397
|
+
// supplied as a function that returns a key/value object
|
|
8398
|
+
customRequestParams = meta.extraParams();
|
|
8399
|
+
}
|
|
8400
|
+
else {
|
|
8401
|
+
// probably supplied as a straight key/value object
|
|
8402
|
+
customRequestParams = meta.extraParams || {};
|
|
8403
|
+
}
|
|
8404
|
+
Object.assign(params, customRequestParams);
|
|
8405
|
+
params[startParam] = dateEnv.formatIso(range.start);
|
|
8406
|
+
params[endParam] = dateEnv.formatIso(range.end);
|
|
8407
|
+
if (dateEnv.timeZone !== 'local') {
|
|
8408
|
+
params[timeZoneParam] = dateEnv.timeZone;
|
|
8409
|
+
}
|
|
8410
|
+
return params;
|
|
8411
|
+
}
|
|
8412
|
+
|
|
8413
|
+
const SIMPLE_RECURRING_REFINERS = {
|
|
8414
|
+
daysOfWeek: identity,
|
|
8415
|
+
startTime: createDuration,
|
|
8416
|
+
endTime: createDuration,
|
|
8417
|
+
duration: createDuration,
|
|
8418
|
+
startRecur: identity,
|
|
8419
|
+
endRecur: identity,
|
|
8420
|
+
};
|
|
8421
|
+
|
|
8422
|
+
let recurring = {
|
|
8423
|
+
parse(refined, dateEnv) {
|
|
8424
|
+
if (refined.daysOfWeek || refined.startTime || refined.endTime || refined.startRecur || refined.endRecur) {
|
|
8425
|
+
let recurringData = {
|
|
8426
|
+
daysOfWeek: refined.daysOfWeek || null,
|
|
8427
|
+
startTime: refined.startTime || null,
|
|
8428
|
+
endTime: refined.endTime || null,
|
|
8429
|
+
startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null,
|
|
8430
|
+
endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null,
|
|
8431
|
+
};
|
|
8432
|
+
let duration;
|
|
8433
|
+
if (refined.duration) {
|
|
8434
|
+
duration = refined.duration;
|
|
8435
|
+
}
|
|
8436
|
+
if (!duration && refined.startTime && refined.endTime) {
|
|
8437
|
+
duration = subtractDurations(refined.endTime, refined.startTime);
|
|
8438
|
+
}
|
|
8439
|
+
return {
|
|
8440
|
+
allDayGuess: Boolean(!refined.startTime && !refined.endTime),
|
|
8441
|
+
duration,
|
|
8442
|
+
typeData: recurringData, // doesn't need endTime anymore but oh well
|
|
8443
|
+
};
|
|
8444
|
+
}
|
|
8445
|
+
return null;
|
|
8446
|
+
},
|
|
8447
|
+
expand(typeData, framingRange, dateEnv) {
|
|
8448
|
+
let clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
|
|
8449
|
+
if (clippedFramingRange) {
|
|
8450
|
+
return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
|
|
8451
|
+
}
|
|
8452
|
+
return [];
|
|
8453
|
+
},
|
|
8454
|
+
};
|
|
8455
|
+
const simpleRecurringEventsPlugin = createPlugin({
|
|
8456
|
+
name: 'simple-recurring-event',
|
|
8457
|
+
recurringTypes: [recurring],
|
|
8458
|
+
eventRefiners: SIMPLE_RECURRING_REFINERS,
|
|
8459
|
+
});
|
|
8460
|
+
function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
|
|
8461
|
+
let dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
|
|
8462
|
+
let dayMarker = startOfDay(framingRange.start);
|
|
8463
|
+
let endMarker = framingRange.end;
|
|
8464
|
+
let instanceStarts = [];
|
|
8465
|
+
while (dayMarker < endMarker) {
|
|
8466
|
+
let instanceStart;
|
|
8467
|
+
// if everyday, or this particular day-of-week
|
|
8468
|
+
if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
|
|
8469
|
+
if (startTime) {
|
|
8470
|
+
instanceStart = dateEnv.add(dayMarker, startTime);
|
|
8471
|
+
}
|
|
8472
|
+
else {
|
|
8473
|
+
instanceStart = dayMarker;
|
|
8474
|
+
}
|
|
8475
|
+
instanceStarts.push(instanceStart);
|
|
8476
|
+
}
|
|
8477
|
+
dayMarker = addDays(dayMarker, 1);
|
|
8478
|
+
}
|
|
8479
|
+
return instanceStarts;
|
|
8480
|
+
}
|
|
8481
|
+
|
|
8482
|
+
const changeHandlerPlugin = createPlugin({
|
|
8483
|
+
name: 'change-handler',
|
|
8484
|
+
optionChangeHandlers: {
|
|
8485
|
+
events(events, context) {
|
|
8486
|
+
handleEventSources([events], context);
|
|
8487
|
+
},
|
|
8488
|
+
eventSources: handleEventSources,
|
|
8489
|
+
},
|
|
8490
|
+
});
|
|
8491
|
+
/*
|
|
8492
|
+
BUG: if `event` was supplied, all previously-given `eventSources` will be wiped out
|
|
8493
|
+
*/
|
|
8494
|
+
function handleEventSources(inputs, context) {
|
|
8495
|
+
let unfoundSources = hashValuesToArray(context.getCurrentData().eventSources);
|
|
8496
|
+
let newInputs = [];
|
|
8497
|
+
for (let input of inputs) {
|
|
8498
|
+
let inputFound = false;
|
|
8499
|
+
for (let i = 0; i < unfoundSources.length; i += 1) {
|
|
8500
|
+
if (unfoundSources[i]._raw === input) {
|
|
8501
|
+
unfoundSources.splice(i, 1); // delete
|
|
8502
|
+
inputFound = true;
|
|
8503
|
+
break;
|
|
8504
|
+
}
|
|
8505
|
+
}
|
|
8506
|
+
if (!inputFound) {
|
|
8507
|
+
newInputs.push(input);
|
|
8508
|
+
}
|
|
8544
8509
|
}
|
|
8545
|
-
|
|
8546
|
-
|
|
8510
|
+
for (let unfoundSource of unfoundSources) {
|
|
8511
|
+
context.dispatch({
|
|
8512
|
+
type: 'REMOVE_EVENT_SOURCE',
|
|
8513
|
+
sourceId: unfoundSource.sourceId,
|
|
8514
|
+
});
|
|
8547
8515
|
}
|
|
8548
|
-
|
|
8549
|
-
|
|
8516
|
+
for (let newInput of newInputs) {
|
|
8517
|
+
context.calendarApi.addEventSource(newInput);
|
|
8550
8518
|
}
|
|
8551
|
-
|
|
8552
|
-
|
|
8519
|
+
}
|
|
8520
|
+
|
|
8521
|
+
function handleDateProfile(dateProfile, context) {
|
|
8522
|
+
context.emitter.trigger('datesSet', Object.assign(Object.assign({}, buildRangeApiWithTimeZone(dateProfile.activeRange, context.dateEnv)), { view: context.viewApi }));
|
|
8523
|
+
}
|
|
8524
|
+
|
|
8525
|
+
function handleEventStore(eventStore, context) {
|
|
8526
|
+
let { emitter } = context;
|
|
8527
|
+
if (emitter.hasHandlers('eventsSet')) {
|
|
8528
|
+
emitter.trigger('eventsSet', buildEventApis(eventStore, context));
|
|
8553
8529
|
}
|
|
8554
8530
|
}
|
|
8555
8531
|
|
|
8532
|
+
/*
|
|
8533
|
+
this array is exposed on the root namespace so that UMD plugins can add to it.
|
|
8534
|
+
see the rollup-bundles script.
|
|
8535
|
+
*/
|
|
8536
|
+
const globalPlugins = [
|
|
8537
|
+
arrayEventSourcePlugin,
|
|
8538
|
+
funcEventSourcePlugin,
|
|
8539
|
+
jsonFeedEventSourcePlugin,
|
|
8540
|
+
simpleRecurringEventsPlugin,
|
|
8541
|
+
changeHandlerPlugin,
|
|
8542
|
+
createPlugin({
|
|
8543
|
+
name: 'misc',
|
|
8544
|
+
isLoadingFuncs: [
|
|
8545
|
+
(state) => computeEventSourcesLoading(state.eventSources),
|
|
8546
|
+
],
|
|
8547
|
+
propSetHandlers: {
|
|
8548
|
+
dateProfile: handleDateProfile,
|
|
8549
|
+
eventStore: handleEventStore,
|
|
8550
|
+
},
|
|
8551
|
+
}),
|
|
8552
|
+
];
|
|
8553
|
+
|
|
8556
8554
|
class TaskRunner {
|
|
8557
8555
|
constructor(runTaskOption, drainedOption) {
|
|
8558
8556
|
this.runTaskOption = runTaskOption;
|
|
@@ -9571,7 +9569,7 @@ var FullCalendar = (function (exports) {
|
|
|
9571
9569
|
return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg;
|
|
9572
9570
|
}
|
|
9573
9571
|
|
|
9574
|
-
const version = '6.0.
|
|
9572
|
+
const version = '6.0.1';
|
|
9575
9573
|
|
|
9576
9574
|
config.touchMouseIgnoreWait = 500;
|
|
9577
9575
|
let ignoreMouseDepth = 0;
|
|
@@ -11668,6 +11666,87 @@ var FullCalendar = (function (exports) {
|
|
|
11668
11666
|
listenerRefiners: LISTENER_REFINERS,
|
|
11669
11667
|
});
|
|
11670
11668
|
|
|
11669
|
+
/* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells.
|
|
11670
|
+
----------------------------------------------------------------------------------------------------------------------*/
|
|
11671
|
+
// It is a manager for a Table subcomponent, which does most of the heavy lifting.
|
|
11672
|
+
// It is responsible for managing width/height.
|
|
11673
|
+
class TableView extends DateComponent {
|
|
11674
|
+
constructor() {
|
|
11675
|
+
super(...arguments);
|
|
11676
|
+
this.headerElRef = y();
|
|
11677
|
+
}
|
|
11678
|
+
renderSimpleLayout(headerRowContent, bodyContent) {
|
|
11679
|
+
let { props, context } = this;
|
|
11680
|
+
let sections = [];
|
|
11681
|
+
let stickyHeaderDates = getStickyHeaderDates(context.options);
|
|
11682
|
+
if (headerRowContent) {
|
|
11683
|
+
sections.push({
|
|
11684
|
+
type: 'header',
|
|
11685
|
+
key: 'header',
|
|
11686
|
+
isSticky: stickyHeaderDates,
|
|
11687
|
+
chunk: {
|
|
11688
|
+
elRef: this.headerElRef,
|
|
11689
|
+
tableClassName: 'fc-col-header',
|
|
11690
|
+
rowContent: headerRowContent,
|
|
11691
|
+
},
|
|
11692
|
+
});
|
|
11693
|
+
}
|
|
11694
|
+
sections.push({
|
|
11695
|
+
type: 'body',
|
|
11696
|
+
key: 'body',
|
|
11697
|
+
liquid: true,
|
|
11698
|
+
chunk: { content: bodyContent },
|
|
11699
|
+
});
|
|
11700
|
+
return (h(ViewContainer$1, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec },
|
|
11701
|
+
h(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [] /* TODO: make optional? */, sections: sections })));
|
|
11702
|
+
}
|
|
11703
|
+
renderHScrollLayout(headerRowContent, bodyContent, colCnt, dayMinWidth) {
|
|
11704
|
+
let ScrollGrid = this.context.pluginHooks.scrollGridImpl;
|
|
11705
|
+
if (!ScrollGrid) {
|
|
11706
|
+
throw new Error('No ScrollGrid implementation');
|
|
11707
|
+
}
|
|
11708
|
+
let { props, context } = this;
|
|
11709
|
+
let stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options);
|
|
11710
|
+
let stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options);
|
|
11711
|
+
let sections = [];
|
|
11712
|
+
if (headerRowContent) {
|
|
11713
|
+
sections.push({
|
|
11714
|
+
type: 'header',
|
|
11715
|
+
key: 'header',
|
|
11716
|
+
isSticky: stickyHeaderDates,
|
|
11717
|
+
chunks: [{
|
|
11718
|
+
key: 'main',
|
|
11719
|
+
elRef: this.headerElRef,
|
|
11720
|
+
tableClassName: 'fc-col-header',
|
|
11721
|
+
rowContent: headerRowContent,
|
|
11722
|
+
}],
|
|
11723
|
+
});
|
|
11724
|
+
}
|
|
11725
|
+
sections.push({
|
|
11726
|
+
type: 'body',
|
|
11727
|
+
key: 'body',
|
|
11728
|
+
liquid: true,
|
|
11729
|
+
chunks: [{
|
|
11730
|
+
key: 'main',
|
|
11731
|
+
content: bodyContent,
|
|
11732
|
+
}],
|
|
11733
|
+
});
|
|
11734
|
+
if (stickyFooterScrollbar) {
|
|
11735
|
+
sections.push({
|
|
11736
|
+
type: 'footer',
|
|
11737
|
+
key: 'footer',
|
|
11738
|
+
isSticky: true,
|
|
11739
|
+
chunks: [{
|
|
11740
|
+
key: 'main',
|
|
11741
|
+
content: renderScrollShim,
|
|
11742
|
+
}],
|
|
11743
|
+
});
|
|
11744
|
+
}
|
|
11745
|
+
return (h(ViewContainer$1, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec },
|
|
11746
|
+
h(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections })));
|
|
11747
|
+
}
|
|
11748
|
+
}
|
|
11749
|
+
|
|
11671
11750
|
function splitSegsByRow(segs, rowCnt) {
|
|
11672
11751
|
let byRow = [];
|
|
11673
11752
|
for (let i = 0; i < rowCnt; i += 1) {
|
|
@@ -12057,6 +12136,11 @@ var FullCalendar = (function (exports) {
|
|
|
12057
12136
|
maxContentHeight: null,
|
|
12058
12137
|
eventInstanceHeights: {},
|
|
12059
12138
|
};
|
|
12139
|
+
this.handleResize = (isForced) => {
|
|
12140
|
+
if (isForced) {
|
|
12141
|
+
this.updateSizing(true); // isExternal=true
|
|
12142
|
+
}
|
|
12143
|
+
};
|
|
12060
12144
|
}
|
|
12061
12145
|
render() {
|
|
12062
12146
|
let { props, state, context } = this;
|
|
@@ -12088,11 +12172,15 @@ var FullCalendar = (function (exports) {
|
|
|
12088
12172
|
}
|
|
12089
12173
|
componentDidMount() {
|
|
12090
12174
|
this.updateSizing(true);
|
|
12175
|
+
this.context.addResizeHandler(this.handleResize);
|
|
12091
12176
|
}
|
|
12092
12177
|
componentDidUpdate(prevProps, prevState) {
|
|
12093
12178
|
let currentProps = this.props;
|
|
12094
12179
|
this.updateSizing(!isPropsEqual(prevProps, currentProps));
|
|
12095
12180
|
}
|
|
12181
|
+
componentWillUnmount() {
|
|
12182
|
+
this.context.removeResizeHandler(this.handleResize);
|
|
12183
|
+
}
|
|
12096
12184
|
getHighlightSegs() {
|
|
12097
12185
|
let { props } = this;
|
|
12098
12186
|
if (props.eventDrag && props.eventDrag.segs.length) { // messy check
|
|
@@ -12376,87 +12464,6 @@ var FullCalendar = (function (exports) {
|
|
|
12376
12464
|
}
|
|
12377
12465
|
}
|
|
12378
12466
|
|
|
12379
|
-
/* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells.
|
|
12380
|
-
----------------------------------------------------------------------------------------------------------------------*/
|
|
12381
|
-
// It is a manager for a Table subcomponent, which does most of the heavy lifting.
|
|
12382
|
-
// It is responsible for managing width/height.
|
|
12383
|
-
class TableView extends DateComponent {
|
|
12384
|
-
constructor() {
|
|
12385
|
-
super(...arguments);
|
|
12386
|
-
this.headerElRef = y();
|
|
12387
|
-
}
|
|
12388
|
-
renderSimpleLayout(headerRowContent, bodyContent) {
|
|
12389
|
-
let { props, context } = this;
|
|
12390
|
-
let sections = [];
|
|
12391
|
-
let stickyHeaderDates = getStickyHeaderDates(context.options);
|
|
12392
|
-
if (headerRowContent) {
|
|
12393
|
-
sections.push({
|
|
12394
|
-
type: 'header',
|
|
12395
|
-
key: 'header',
|
|
12396
|
-
isSticky: stickyHeaderDates,
|
|
12397
|
-
chunk: {
|
|
12398
|
-
elRef: this.headerElRef,
|
|
12399
|
-
tableClassName: 'fc-col-header',
|
|
12400
|
-
rowContent: headerRowContent,
|
|
12401
|
-
},
|
|
12402
|
-
});
|
|
12403
|
-
}
|
|
12404
|
-
sections.push({
|
|
12405
|
-
type: 'body',
|
|
12406
|
-
key: 'body',
|
|
12407
|
-
liquid: true,
|
|
12408
|
-
chunk: { content: bodyContent },
|
|
12409
|
-
});
|
|
12410
|
-
return (h(ViewContainer$1, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec },
|
|
12411
|
-
h(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [] /* TODO: make optional? */, sections: sections })));
|
|
12412
|
-
}
|
|
12413
|
-
renderHScrollLayout(headerRowContent, bodyContent, colCnt, dayMinWidth) {
|
|
12414
|
-
let ScrollGrid = this.context.pluginHooks.scrollGridImpl;
|
|
12415
|
-
if (!ScrollGrid) {
|
|
12416
|
-
throw new Error('No ScrollGrid implementation');
|
|
12417
|
-
}
|
|
12418
|
-
let { props, context } = this;
|
|
12419
|
-
let stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options);
|
|
12420
|
-
let stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options);
|
|
12421
|
-
let sections = [];
|
|
12422
|
-
if (headerRowContent) {
|
|
12423
|
-
sections.push({
|
|
12424
|
-
type: 'header',
|
|
12425
|
-
key: 'header',
|
|
12426
|
-
isSticky: stickyHeaderDates,
|
|
12427
|
-
chunks: [{
|
|
12428
|
-
key: 'main',
|
|
12429
|
-
elRef: this.headerElRef,
|
|
12430
|
-
tableClassName: 'fc-col-header',
|
|
12431
|
-
rowContent: headerRowContent,
|
|
12432
|
-
}],
|
|
12433
|
-
});
|
|
12434
|
-
}
|
|
12435
|
-
sections.push({
|
|
12436
|
-
type: 'body',
|
|
12437
|
-
key: 'body',
|
|
12438
|
-
liquid: true,
|
|
12439
|
-
chunks: [{
|
|
12440
|
-
key: 'main',
|
|
12441
|
-
content: bodyContent,
|
|
12442
|
-
}],
|
|
12443
|
-
});
|
|
12444
|
-
if (stickyFooterScrollbar) {
|
|
12445
|
-
sections.push({
|
|
12446
|
-
type: 'footer',
|
|
12447
|
-
key: 'footer',
|
|
12448
|
-
isSticky: true,
|
|
12449
|
-
chunks: [{
|
|
12450
|
-
key: 'main',
|
|
12451
|
-
content: renderScrollShim,
|
|
12452
|
-
}],
|
|
12453
|
-
});
|
|
12454
|
-
}
|
|
12455
|
-
return (h(ViewContainer$1, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec },
|
|
12456
|
-
h(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections })));
|
|
12457
|
-
}
|
|
12458
|
-
}
|
|
12459
|
-
|
|
12460
12467
|
class DayTableView extends TableView {
|
|
12461
12468
|
constructor() {
|
|
12462
12469
|
super(...arguments);
|
|
@@ -12508,7 +12515,7 @@ var FullCalendar = (function (exports) {
|
|
|
12508
12515
|
}
|
|
12509
12516
|
}
|
|
12510
12517
|
|
|
12511
|
-
var css_248z$2 = "
|
|
12518
|
+
var css_248z$2 = ":root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:\"\";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;padding:2px 3px 0}.fc .fc-daygrid-day-bottom:before{clear:both;content:\"\";display:table}.fc .fc-daygrid-more-link{cursor:pointer;position:relative;z-index:4}.fc .fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}";
|
|
12512
12519
|
injectStyles(css_248z$2);
|
|
12513
12520
|
|
|
12514
12521
|
var index$2 = createPlugin({
|
|
@@ -13677,7 +13684,7 @@ var FullCalendar = (function (exports) {
|
|
|
13677
13684
|
allDaySlot: Boolean,
|
|
13678
13685
|
};
|
|
13679
13686
|
|
|
13680
|
-
var css_248z$1 = "
|
|
13687
|
+
var css_248z$1 = ".fc-v-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-v-event .fc-event-main{color:var(--fc-event-text-color);height:100%}.fc-v-event .fc-event-main-frame{display:flex;flex-direction:column;height:100%}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{bottom:0;max-height:100%;overflow:hidden;top:0}.fc-v-event:not(.fc-event-start){border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.fc-v-event:not(.fc-event-end){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:var(--fc-event-resizer-thickness);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%;position:relative;z-index:1}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:\"\\00a0\"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:\"\\00a0-\\00a0\"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}";
|
|
13681
13688
|
injectStyles(css_248z$1);
|
|
13682
13689
|
|
|
13683
13690
|
var index$1 = createPlugin({
|
|
@@ -13976,7 +13983,7 @@ var FullCalendar = (function (exports) {
|
|
|
13976
13983
|
return input === false ? null : createFormatter(input);
|
|
13977
13984
|
}
|
|
13978
13985
|
|
|
13979
|
-
var css_248z = "
|
|
13986
|
+
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}";
|
|
13980
13987
|
injectStyles(css_248z);
|
|
13981
13988
|
|
|
13982
13989
|
var index = createPlugin({
|
|
@@ -14022,6 +14029,8 @@ var FullCalendar = (function (exports) {
|
|
|
14022
14029
|
exports.createPlugin = createPlugin;
|
|
14023
14030
|
exports.formatDate = formatDate;
|
|
14024
14031
|
exports.formatRange = formatRange;
|
|
14032
|
+
exports.globalLocales = globalLocales;
|
|
14033
|
+
exports.globalPlugins = globalPlugins;
|
|
14025
14034
|
exports.sliceEvents = sliceEvents;
|
|
14026
14035
|
exports.version = version;
|
|
14027
14036
|
|