aboutsummaryrefslogtreecommitdiffstats
path: root/library/fullcalendar/packages/core
diff options
context:
space:
mode:
authorMario <mario@mariovavti.com>2023-01-25 13:08:05 +0000
committerMario <mario@mariovavti.com>2023-01-25 13:08:05 +0000
commit08e925758e920b898ac2d08710eab2f9638fe276 (patch)
treefed0f7b2ee8251c6534d446b3166096889c9aeb3 /library/fullcalendar/packages/core
parent213c8a6eeccc16c34d3a34229a810bd213837c56 (diff)
downloadvolse-hubzilla-08e925758e920b898ac2d08710eab2f9638fe276.tar.gz
volse-hubzilla-08e925758e920b898ac2d08710eab2f9638fe276.tar.bz2
volse-hubzilla-08e925758e920b898ac2d08710eab2f9638fe276.zip
update fullcalendar library
Diffstat (limited to 'library/fullcalendar/packages/core')
-rw-r--r--library/fullcalendar/packages/core/LICENSE.txt20
-rw-r--r--library/fullcalendar/packages/core/README.md8
-rw-r--r--library/fullcalendar/packages/core/locales-all.js1405
-rw-r--r--library/fullcalendar/packages/core/locales-all.min.js1
-rw-r--r--library/fullcalendar/packages/core/locales/af.js30
-rw-r--r--library/fullcalendar/packages/core/locales/ar-dz.js31
-rw-r--r--library/fullcalendar/packages/core/locales/ar-kw.js31
-rw-r--r--library/fullcalendar/packages/core/locales/ar-ly.js31
-rw-r--r--library/fullcalendar/packages/core/locales/ar-ma.js31
-rw-r--r--library/fullcalendar/packages/core/locales/ar-sa.js31
-rw-r--r--library/fullcalendar/packages/core/locales/ar-tn.js31
-rw-r--r--library/fullcalendar/packages/core/locales/ar.js31
-rw-r--r--library/fullcalendar/packages/core/locales/az.js32
-rw-r--r--library/fullcalendar/packages/core/locales/bg.js31
-rw-r--r--library/fullcalendar/packages/core/locales/bs.js32
-rw-r--r--library/fullcalendar/packages/core/locales/ca.js30
-rw-r--r--library/fullcalendar/packages/core/locales/cs.js32
-rw-r--r--library/fullcalendar/packages/core/locales/da.js30
-rw-r--r--library/fullcalendar/packages/core/locales/de.js33
-rw-r--r--library/fullcalendar/packages/core/locales/el.js30
-rw-r--r--library/fullcalendar/packages/core/locales/en-au.js17
-rw-r--r--library/fullcalendar/packages/core/locales/en-gb.js17
-rw-r--r--library/fullcalendar/packages/core/locales/en-nz.js17
-rw-r--r--library/fullcalendar/packages/core/locales/es-us.js30
-rw-r--r--library/fullcalendar/packages/core/locales/es.js30
-rw-r--r--library/fullcalendar/packages/core/locales/et.js32
-rw-r--r--library/fullcalendar/packages/core/locales/eu.js30
-rw-r--r--library/fullcalendar/packages/core/locales/fa.js33
-rw-r--r--library/fullcalendar/packages/core/locales/fi.js30
-rw-r--r--library/fullcalendar/packages/core/locales/fr-ca.js27
-rw-r--r--library/fullcalendar/packages/core/locales/fr-ch.js31
-rw-r--r--library/fullcalendar/packages/core/locales/fr.js31
-rw-r--r--library/fullcalendar/packages/core/locales/gl.js30
-rw-r--r--library/fullcalendar/packages/core/locales/he.js27
-rw-r--r--library/fullcalendar/packages/core/locales/hi.js32
-rw-r--r--library/fullcalendar/packages/core/locales/hr.js32
-rw-r--r--library/fullcalendar/packages/core/locales/hu.js30
-rw-r--r--library/fullcalendar/packages/core/locales/id.js30
-rw-r--r--library/fullcalendar/packages/core/locales/is.js30
-rw-r--r--library/fullcalendar/packages/core/locales/it.js32
-rw-r--r--library/fullcalendar/packages/core/locales/ja.js28
-rw-r--r--library/fullcalendar/packages/core/locales/ka.js32
-rw-r--r--library/fullcalendar/packages/core/locales/kk.js32
-rw-r--r--library/fullcalendar/packages/core/locales/ko.js26
-rw-r--r--library/fullcalendar/packages/core/locales/lb.js30
-rw-r--r--library/fullcalendar/packages/core/locales/lt.js30
-rw-r--r--library/fullcalendar/packages/core/locales/lv.js32
-rw-r--r--library/fullcalendar/packages/core/locales/mk.js28
-rw-r--r--library/fullcalendar/packages/core/locales/ms.js32
-rw-r--r--library/fullcalendar/packages/core/locales/nb.js30
-rw-r--r--library/fullcalendar/packages/core/locales/nl.js30
-rw-r--r--library/fullcalendar/packages/core/locales/nn.js30
-rw-r--r--library/fullcalendar/packages/core/locales/pl.js30
-rw-r--r--library/fullcalendar/packages/core/locales/pt-br.js28
-rw-r--r--library/fullcalendar/packages/core/locales/pt.js30
-rw-r--r--library/fullcalendar/packages/core/locales/ro.js32
-rw-r--r--library/fullcalendar/packages/core/locales/ru.js32
-rw-r--r--library/fullcalendar/packages/core/locales/sk.js32
-rw-r--r--library/fullcalendar/packages/core/locales/sl.js30
-rw-r--r--library/fullcalendar/packages/core/locales/sq.js32
-rw-r--r--library/fullcalendar/packages/core/locales/sr-cyrl.js32
-rw-r--r--library/fullcalendar/packages/core/locales/sr.js32
-rw-r--r--library/fullcalendar/packages/core/locales/sv.js30
-rw-r--r--library/fullcalendar/packages/core/locales/th.js33
-rw-r--r--library/fullcalendar/packages/core/locales/tr.js30
-rw-r--r--library/fullcalendar/packages/core/locales/ug.js20
-rw-r--r--library/fullcalendar/packages/core/locales/uk.js32
-rw-r--r--library/fullcalendar/packages/core/locales/uz.js24
-rw-r--r--library/fullcalendar/packages/core/locales/vi.js32
-rw-r--r--library/fullcalendar/packages/core/locales/zh-cn.js33
-rw-r--r--library/fullcalendar/packages/core/locales/zh-tw.js26
-rw-r--r--library/fullcalendar/packages/core/main.css1052
-rw-r--r--library/fullcalendar/packages/core/main.d.ts2736
-rw-r--r--library/fullcalendar/packages/core/main.esm.js8582
-rw-r--r--library/fullcalendar/packages/core/main.js8745
-rw-r--r--library/fullcalendar/packages/core/main.min.css1
-rw-r--r--library/fullcalendar/packages/core/main.min.js6
-rw-r--r--library/fullcalendar/packages/core/package.json30
78 files changed, 0 insertions, 24581 deletions
diff --git a/library/fullcalendar/packages/core/LICENSE.txt b/library/fullcalendar/packages/core/LICENSE.txt
deleted file mode 100644
index 2149cfbef..000000000
--- a/library/fullcalendar/packages/core/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 Adam Shaw
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/library/fullcalendar/packages/core/README.md b/library/fullcalendar/packages/core/README.md
deleted file mode 100644
index 7ed36f442..000000000
--- a/library/fullcalendar/packages/core/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Core Package
-
-Provides core functionality, including the Calendar class
-
-[View the docs &raquo;](https://fullcalendar.io/docs/initialize-es6)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/library/fullcalendar/packages/core/locales-all.js b/library/fullcalendar/packages/core/locales-all.js
deleted file mode 100644
index e6c77df2c..000000000
--- a/library/fullcalendar/packages/core/locales-all.js
+++ /dev/null
@@ -1,1405 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, global.FullCalendarLocalesAll = factory());
-}(this, function () { 'use strict';
-
- var _m0 = {
- code: "af",
- week: {
- dow: 1,
- doy: 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
- },
- buttonText: {
- prev: "Vorige",
- next: "Volgende",
- today: "Vandag",
- year: "Jaar",
- month: "Maand",
- week: "Week",
- day: "Dag",
- list: "Agenda"
- },
- allDayHtml: "Heeldag",
- eventLimitText: "Addisionele",
- noEventsMessage: "Daar is geen gebeurtenisse nie"
- };
-
- var _m1 = {
- code: "ar-dz",
- week: {
- dow: 0,
- doy: 4 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- var _m2 = {
- code: "ar-kw",
- week: {
- dow: 0,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- var _m3 = {
- code: "ar-ly",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- var _m4 = {
- code: "ar-ma",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- var _m5 = {
- code: "ar-sa",
- week: {
- dow: 0,
- doy: 6 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- var _m6 = {
- code: "ar-tn",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- var _m7 = {
- code: "ar",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- var _m8 = {
- code: "az",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Əvvəl",
- next: "Sonra",
- today: "Bu Gün",
- month: "Ay",
- week: "Həftə",
- day: "Gün",
- list: "Gündəm"
- },
- weekLabel: "Həftə",
- allDayText: "Bütün Gün",
- eventLimitText: function (n) {
- return "+ daha çox " + n;
- },
- noEventsMessage: "Göstərmək üçün hadisə yoxdur"
- };
-
- var _m9 = {
- code: "bg",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "назад",
- next: "напред",
- today: "днес",
- month: "Месец",
- week: "Седмица",
- day: "Ден",
- list: "График"
- },
- allDayText: "Цял ден",
- eventLimitText: function (n) {
- return "+още " + n;
- },
- noEventsMessage: "Няма събития за показване"
- };
-
- var _m10 = {
- code: "bs",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prošli",
- next: "Sljedeći",
- today: "Danas",
- month: "Mjesec",
- week: "Sedmica",
- day: "Dan",
- list: "Raspored"
- },
- weekLabel: "Sed",
- allDayText: "Cijeli dan",
- eventLimitText: function (n) {
- return "+ još " + n;
- },
- noEventsMessage: "Nema događaja za prikazivanje"
- };
-
- var _m11 = {
- code: "ca",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Anterior",
- next: "Següent",
- today: "Avui",
- month: "Mes",
- week: "Setmana",
- day: "Dia",
- list: "Agenda"
- },
- weekLabel: "Set",
- allDayText: "Tot el dia",
- eventLimitText: "més",
- noEventsMessage: "No hi ha esdeveniments per mostrar"
- };
-
- var _m12 = {
- code: "cs",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Dříve",
- next: "Později",
- today: "Nyní",
- month: "Měsíc",
- week: "Týden",
- day: "Den",
- list: "Agenda"
- },
- weekLabel: "Týd",
- allDayText: "Celý den",
- eventLimitText: function (n) {
- return "+další: " + n;
- },
- noEventsMessage: "Žádné akce k zobrazení"
- };
-
- var _m13 = {
- code: "da",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Forrige",
- next: "Næste",
- today: "I dag",
- month: "Måned",
- week: "Uge",
- day: "Dag",
- list: "Agenda"
- },
- weekLabel: "Uge",
- allDayText: "Hele dagen",
- eventLimitText: "flere",
- noEventsMessage: "Ingen arrangementer at vise"
- };
-
- var _m14 = {
- code: "de",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Zurück",
- next: "Vor",
- today: "Heute",
- year: "Jahr",
- month: "Monat",
- week: "Woche",
- day: "Tag",
- list: "Terminübersicht"
- },
- weekLabel: "KW",
- allDayText: "Ganztägig",
- eventLimitText: function (n) {
- return "+ weitere " + n;
- },
- noEventsMessage: "Keine Ereignisse anzuzeigen"
- };
-
- var _m15 = {
- code: "el",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4st is the first week of the year.
- },
- buttonText: {
- prev: "Προηγούμενος",
- next: "Επόμενος",
- today: "Σήμερα",
- month: "Μήνας",
- week: "Εβδομάδα",
- day: "Ημέρα",
- list: "Ατζέντα"
- },
- weekLabel: "Εβδ",
- allDayText: "Ολοήμερο",
- eventLimitText: "περισσότερα",
- noEventsMessage: "Δεν υπάρχουν γεγονότα προς εμφάνιση"
- };
-
- var _m16 = {
- code: "en-au",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- }
- };
-
- var _m17 = {
- code: "en-gb",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- }
- };
-
- var _m18 = {
- code: "en-nz",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- }
- };
-
- var _m19 = {
- code: "es",
- week: {
- dow: 0,
- doy: 6 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Ant",
- next: "Sig",
- today: "Hoy",
- month: "Mes",
- week: "Semana",
- day: "Día",
- list: "Agenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Todo<br/>el día",
- eventLimitText: "más",
- noEventsMessage: "No hay eventos para mostrar"
- };
-
- var _m20 = {
- code: "es",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Ant",
- next: "Sig",
- today: "Hoy",
- month: "Mes",
- week: "Semana",
- day: "Día",
- list: "Agenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Todo<br/>el día",
- eventLimitText: "más",
- noEventsMessage: "No hay eventos para mostrar"
- };
-
- var _m21 = {
- code: "et",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Eelnev",
- next: "Järgnev",
- today: "Täna",
- month: "Kuu",
- week: "Nädal",
- day: "Päev",
- list: "Päevakord"
- },
- weekLabel: "näd",
- allDayText: "Kogu päev",
- eventLimitText: function (n) {
- return "+ veel " + n;
- },
- noEventsMessage: "Kuvamiseks puuduvad sündmused"
- };
-
- var _m22 = {
- code: "eu",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Aur",
- next: "Hur",
- today: "Gaur",
- month: "Hilabetea",
- week: "Astea",
- day: "Eguna",
- list: "Agenda"
- },
- weekLabel: "As",
- allDayHtml: "Egun<br/>osoa",
- eventLimitText: "gehiago",
- noEventsMessage: "Ez dago ekitaldirik erakusteko"
- };
-
- var _m23 = {
- code: "fa",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "قبلی",
- next: "بعدی",
- today: "امروز",
- month: "ماه",
- week: "هفته",
- day: "روز",
- list: "برنامه"
- },
- weekLabel: "هف",
- allDayText: "تمام روز",
- eventLimitText: function (n) {
- return "بیش از " + n;
- },
- noEventsMessage: "هیچ رویدادی به نمایش"
- };
-
- var _m24 = {
- code: "fi",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Edellinen",
- next: "Seuraava",
- today: "Tänään",
- month: "Kuukausi",
- week: "Viikko",
- day: "Päivä",
- list: "Tapahtumat"
- },
- weekLabel: "Vk",
- allDayText: "Koko päivä",
- eventLimitText: "lisää",
- noEventsMessage: "Ei näytettäviä tapahtumia"
- };
-
- var _m25 = {
- code: "fr",
- buttonText: {
- prev: "Précédent",
- next: "Suivant",
- today: "Aujourd'hui",
- year: "Année",
- month: "Mois",
- week: "Semaine",
- day: "Jour",
- list: "Mon planning"
- },
- weekLabel: "Sem.",
- allDayHtml: "Toute la<br/>journée",
- eventLimitText: "en plus",
- noEventsMessage: "Aucun événement à afficher"
- };
-
- var _m26 = {
- code: "fr-ch",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Précédent",
- next: "Suivant",
- today: "Courant",
- year: "Année",
- month: "Mois",
- week: "Semaine",
- day: "Jour",
- list: "Mon planning"
- },
- weekLabel: "Sm",
- allDayHtml: "Toute la<br/>journée",
- eventLimitText: "en plus",
- noEventsMessage: "Aucun événement à afficher"
- };
-
- var _m27 = {
- code: "fr",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Précédent",
- next: "Suivant",
- today: "Aujourd'hui",
- year: "Année",
- month: "Mois",
- week: "Semaine",
- day: "Jour",
- list: "Planning"
- },
- weekLabel: "Sem.",
- allDayHtml: "Toute la<br/>journée",
- eventLimitText: "en plus",
- noEventsMessage: "Aucun événement à afficher"
- };
-
- var _m28 = {
- code: "gl",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Ant",
- next: "Seg",
- today: "Hoxe",
- month: "Mes",
- week: "Semana",
- day: "Día",
- list: "Axenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Todo<br/>o día",
- eventLimitText: "máis",
- noEventsMessage: "Non hai eventos para amosar"
- };
-
- var _m29 = {
- code: "he",
- dir: 'rtl',
- buttonText: {
- prev: "הקודם",
- next: "הבא",
- today: "היום",
- month: "חודש",
- week: "שבוע",
- day: "יום",
- list: "סדר יום"
- },
- allDayText: "כל היום",
- eventLimitText: "אחר",
- noEventsMessage: "אין אירועים להצגה",
- weekLabel: "שבוע"
- };
-
- var _m30 = {
- code: "hi",
- week: {
- dow: 0,
- doy: 6 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "पिछला",
- next: "अगला",
- today: "आज",
- month: "महीना",
- week: "सप्ताह",
- day: "दिन",
- list: "कार्यसूची"
- },
- weekLabel: "हफ्ता",
- allDayText: "सभी दिन",
- eventLimitText: function (n) {
- return "+अधिक " + n;
- },
- noEventsMessage: "कोई घटनाओं को प्रदर्शित करने के लिए"
- };
-
- var _m31 = {
- code: "hr",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prijašnji",
- next: "Sljedeći",
- today: "Danas",
- month: "Mjesec",
- week: "Tjedan",
- day: "Dan",
- list: "Raspored"
- },
- weekLabel: "Tje",
- allDayText: "Cijeli dan",
- eventLimitText: function (n) {
- return "+ još " + n;
- },
- noEventsMessage: "Nema događaja za prikaz"
- };
-
- var _m32 = {
- code: "hu",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "vissza",
- next: "előre",
- today: "ma",
- month: "Hónap",
- week: "Hét",
- day: "Nap",
- list: "Napló"
- },
- weekLabel: "Hét",
- allDayText: "Egész nap",
- eventLimitText: "további",
- noEventsMessage: "Nincs megjeleníthető esemény"
- };
-
- var _m33 = {
- code: "id",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "mundur",
- next: "maju",
- today: "hari ini",
- month: "Bulan",
- week: "Minggu",
- day: "Hari",
- list: "Agenda"
- },
- weekLabel: "Mg",
- allDayHtml: "Sehari<br/>penuh",
- eventLimitText: "lebih",
- noEventsMessage: "Tidak ada acara untuk ditampilkan"
- };
-
- var _m34 = {
- code: "is",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Fyrri",
- next: "Næsti",
- today: "Í dag",
- month: "Mánuður",
- week: "Vika",
- day: "Dagur",
- list: "Dagskrá"
- },
- weekLabel: "Vika",
- allDayHtml: "Allan<br/>daginn",
- eventLimitText: "meira",
- noEventsMessage: "Engir viðburðir til að sýna"
- };
-
- var _m35 = {
- code: "it",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Prec",
- next: "Succ",
- today: "Oggi",
- month: "Mese",
- week: "Settimana",
- day: "Giorno",
- list: "Agenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Tutto il<br/>giorno",
- eventLimitText: function (n) {
- return "+altri " + n;
- },
- noEventsMessage: "Non ci sono eventi da visualizzare"
- };
-
- var _m36 = {
- code: "ja",
- buttonText: {
- prev: "前",
- next: "次",
- today: "今日",
- month: "月",
- week: "週",
- day: "日",
- list: "予定リスト"
- },
- weekLabel: "週",
- allDayText: "終日",
- eventLimitText: function (n) {
- return "他 " + n + " 件";
- },
- noEventsMessage: "表示する予定はありません"
- };
-
- var _m37 = {
- code: "ka",
- week: {
- dow: 1,
- doy: 7
- },
- buttonText: {
- prev: "წინა",
- next: "შემდეგი",
- today: "დღეს",
- month: "თვე",
- week: "კვირა",
- day: "დღე",
- list: "დღის წესრიგი"
- },
- weekLabel: "კვ",
- allDayText: "მთელი დღე",
- eventLimitText: function (n) {
- return "+ კიდევ " + n;
- },
- noEventsMessage: "ღონისძიებები არ არის"
- };
-
- var _m38 = {
- code: "kk",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Алдыңғы",
- next: "Келесі",
- today: "Бүгін",
- month: "Ай",
- week: "Апта",
- day: "Күн",
- list: "Күн тәртібі"
- },
- weekLabel: "Не",
- allDayText: "Күні бойы",
- eventLimitText: function (n) {
- return "+ тағы " + n;
- },
- noEventsMessage: "Көрсету үшін оқиғалар жоқ"
- };
-
- var _m39 = {
- code: "ko",
- buttonText: {
- prev: "이전달",
- next: "다음달",
- today: "오늘",
- month: "월",
- week: "주",
- day: "일",
- list: "일정목록"
- },
- weekLabel: "주",
- allDayText: "종일",
- eventLimitText: "개",
- noEventsMessage: "일정이 없습니다"
- };
-
- var _m40 = {
- code: "lb",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Zréck",
- next: "Weider",
- today: "Haut",
- month: "Mount",
- week: "Woch",
- day: "Dag",
- list: "Terminiwwersiicht"
- },
- weekLabel: "W",
- allDayText: "Ganzen Dag",
- eventLimitText: "méi",
- noEventsMessage: "Nee Evenementer ze affichéieren"
- };
-
- var _m41 = {
- code: "lt",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Atgal",
- next: "Pirmyn",
- today: "Šiandien",
- month: "Mėnuo",
- week: "Savaitė",
- day: "Diena",
- list: "Darbotvarkė"
- },
- weekLabel: "SAV",
- allDayText: "Visą dieną",
- eventLimitText: "daugiau",
- noEventsMessage: "Nėra įvykių rodyti"
- };
-
- var _m42 = {
- code: "lv",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Iepr.",
- next: "Nāk.",
- today: "Šodien",
- month: "Mēnesis",
- week: "Nedēļa",
- day: "Diena",
- list: "Dienas kārtība"
- },
- weekLabel: "Ned.",
- allDayText: "Visu dienu",
- eventLimitText: function (n) {
- return "+vēl " + n;
- },
- noEventsMessage: "Nav notikumu"
- };
-
- var _m43 = {
- code: "mk",
- buttonText: {
- prev: "претходно",
- next: "следно",
- today: "Денес",
- month: "Месец",
- week: "Недела",
- day: "Ден",
- list: "График"
- },
- weekLabel: "Сед",
- allDayText: "Цел ден",
- eventLimitText: function (n) {
- return "+повеќе " + n;
- },
- noEventsMessage: "Нема настани за прикажување"
- };
-
- var _m44 = {
- code: "ms",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Sebelum",
- next: "Selepas",
- today: "hari ini",
- month: "Bulan",
- week: "Minggu",
- day: "Hari",
- list: "Agenda"
- },
- weekLabel: "Mg",
- allDayText: "Sepanjang hari",
- eventLimitText: function (n) {
- return "masih ada " + n + " acara";
- },
- noEventsMessage: "Tiada peristiwa untuk dipaparkan"
- };
-
- var _m45 = {
- code: "nb",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Forrige",
- next: "Neste",
- today: "I dag",
- month: "Måned",
- week: "Uke",
- day: "Dag",
- list: "Agenda"
- },
- weekLabel: "Uke",
- allDayText: "Hele dagen",
- eventLimitText: "til",
- noEventsMessage: "Ingen hendelser å vise"
- };
-
- var _m46 = {
- code: "nl",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Voorgaand",
- next: "Volgende",
- today: "Vandaag",
- year: "Jaar",
- month: "Maand",
- week: "Week",
- day: "Dag",
- list: "Agenda"
- },
- allDayText: "Hele dag",
- eventLimitText: "extra",
- noEventsMessage: "Geen evenementen om te laten zien"
- };
-
- var _m47 = {
- code: "nn",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Førre",
- next: "Neste",
- today: "I dag",
- month: "Månad",
- week: "Veke",
- day: "Dag",
- list: "Agenda"
- },
- weekLabel: "Veke",
- allDayText: "Heile dagen",
- eventLimitText: "til",
- noEventsMessage: "Ingen hendelser å vise"
- };
-
- var _m48 = {
- code: "pl",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Poprzedni",
- next: "Następny",
- today: "Dziś",
- month: "Miesiąc",
- week: "Tydzień",
- day: "Dzień",
- list: "Plan dnia"
- },
- weekLabel: "Tydz",
- allDayText: "Cały dzień",
- eventLimitText: "więcej",
- noEventsMessage: "Brak wydarzeń do wyświetlenia"
- };
-
- var _m49 = {
- code: "pt-br",
- buttonText: {
- prev: "Anterior",
- next: "Próximo",
- today: "Hoje",
- month: "Mês",
- week: "Semana",
- day: "Dia",
- list: "Lista"
- },
- weekLabel: "Sm",
- allDayText: "dia inteiro",
- eventLimitText: function (n) {
- return "mais +" + n;
- },
- noEventsMessage: "Não há eventos para mostrar"
- };
-
- var _m50 = {
- code: "pt",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Anterior",
- next: "Seguinte",
- today: "Hoje",
- month: "Mês",
- week: "Semana",
- day: "Dia",
- list: "Agenda"
- },
- weekLabel: "Sem",
- allDayText: "Todo o dia",
- eventLimitText: "mais",
- noEventsMessage: "Não há eventos para mostrar"
- };
-
- var _m51 = {
- code: "ro",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "precedentă",
- next: "următoare",
- today: "Azi",
- month: "Lună",
- week: "Săptămână",
- day: "Zi",
- list: "Agendă"
- },
- weekLabel: "Săpt",
- allDayText: "Toată ziua",
- eventLimitText: function (n) {
- return "+alte " + n;
- },
- noEventsMessage: "Nu există evenimente de afișat"
- };
-
- var _m52 = {
- code: "ru",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Пред",
- next: "След",
- today: "Сегодня",
- month: "Месяц",
- week: "Неделя",
- day: "День",
- list: "Повестка дня"
- },
- weekLabel: "Нед",
- allDayText: "Весь день",
- eventLimitText: function (n) {
- return "+ ещё " + n;
- },
- noEventsMessage: "Нет событий для отображения"
- };
-
- var _m53 = {
- code: "sk",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Predchádzajúci",
- next: "Nasledujúci",
- today: "Dnes",
- month: "Mesiac",
- week: "Týždeň",
- day: "Deň",
- list: "Rozvrh"
- },
- weekLabel: "Ty",
- allDayText: "Celý deň",
- eventLimitText: function (n) {
- return "+ďalšie: " + n;
- },
- noEventsMessage: "Žiadne akcie na zobrazenie"
- };
-
- var _m54 = {
- code: "sl",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prejšnji",
- next: "Naslednji",
- today: "Trenutni",
- month: "Mesec",
- week: "Teden",
- day: "Dan",
- list: "Dnevni red"
- },
- weekLabel: "Teden",
- allDayText: "Ves dan",
- eventLimitText: "več",
- noEventsMessage: "Ni dogodkov za prikaz"
- };
-
- var _m55 = {
- code: "sq",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "mbrapa",
- next: "Përpara",
- today: "sot",
- month: "Muaj",
- week: "Javë",
- day: "Ditë",
- list: "Listë"
- },
- weekLabel: "Ja",
- allDayHtml: "Gjithë<br/>ditën",
- eventLimitText: function (n) {
- return "+më tepër " + n;
- },
- noEventsMessage: "Nuk ka evente për të shfaqur"
- };
-
- var _m56 = {
- code: "sr-cyrl",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Претходна",
- next: "следећи",
- today: "Данас",
- month: "Месец",
- week: "Недеља",
- day: "Дан",
- list: "Планер"
- },
- weekLabel: "Сед",
- allDayText: "Цео дан",
- eventLimitText: function (n) {
- return "+ још " + n;
- },
- noEventsMessage: "Нема догађаја за приказ"
- };
-
- var _m57 = {
- code: "sr",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prethodna",
- next: "Sledeći",
- today: "Danas",
- month: "Mеsеc",
- week: "Nеdеlja",
- day: "Dan",
- list: "Planеr"
- },
- weekLabel: "Sed",
- allDayText: "Cеo dan",
- eventLimitText: function (n) {
- return "+ još " + n;
- },
- noEventsMessage: "Nеma događaja za prikaz"
- };
-
- var _m58 = {
- code: "sv",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Förra",
- next: "Nästa",
- today: "Idag",
- month: "Månad",
- week: "Vecka",
- day: "Dag",
- list: "Program"
- },
- weekLabel: "v.",
- allDayText: "Heldag",
- eventLimitText: "till",
- noEventsMessage: "Inga händelser att visa"
- };
-
- var _m59 = {
- code: "th",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "ก่อนหน้า",
- next: "ถัดไป",
- prevYear: 'ปีก่อนหน้า',
- nextYear: 'ปีถัดไป',
- year: 'ปี',
- today: "วันนี้",
- month: "เดือน",
- week: "สัปดาห์",
- day: "วัน",
- list: "กำหนดการ"
- },
- weekLabel: "สัปดาห์",
- allDayText: "ตลอดวัน",
- eventLimitText: "เพิ่มเติม",
- noEventsMessage: "ไม่มีกิจกรรมที่จะแสดง"
- };
-
- var _m60 = {
- code: "tr",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "geri",
- next: "ileri",
- today: "bugün",
- month: "Ay",
- week: "Hafta",
- day: "Gün",
- list: "Ajanda"
- },
- weekLabel: "Hf",
- allDayText: "Tüm gün",
- eventLimitText: "daha fazla",
- noEventsMessage: "Gösterilecek etkinlik yok"
- };
-
- var _m61 = {
- code: "ug",
- buttonText: {
- month: "ئاي",
- week: "ھەپتە",
- day: "كۈن",
- list: "كۈنتەرتىپ"
- },
- allDayText: "پۈتۈن كۈن"
- };
-
- var _m62 = {
- code: "uk",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Попередній",
- next: "далі",
- today: "Сьогодні",
- month: "Місяць",
- week: "Тиждень",
- day: "День",
- list: "Порядок денний"
- },
- weekLabel: "Тиж",
- allDayText: "Увесь день",
- eventLimitText: function (n) {
- return "+ще " + n + "...";
- },
- noEventsMessage: "Немає подій для відображення"
- };
-
- var _m63 = {
- code: "uz",
- buttonText: {
- month: "Oy",
- week: "Xafta",
- day: "Kun",
- list: "Kun tartibi"
- },
- allDayText: "Kun bo'yi",
- eventLimitText: function (n) {
- return "+ yana " + n;
- },
- noEventsMessage: "Ko'rsatish uchun voqealar yo'q"
- };
-
- var _m64 = {
- code: "vi",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Trước",
- next: "Tiếp",
- today: "Hôm nay",
- month: "Tháng",
- week: "Tuần",
- day: "Ngày",
- list: "Lịch biểu"
- },
- weekLabel: "Tu",
- allDayText: "Cả ngày",
- eventLimitText: function (n) {
- return "+ thêm " + n;
- },
- noEventsMessage: "Không có sự kiện để hiển thị"
- };
-
- var _m65 = {
- code: "zh-cn",
- week: {
- // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "上月",
- next: "下月",
- today: "今天",
- month: "月",
- week: "周",
- day: "日",
- list: "日程"
- },
- weekLabel: "周",
- allDayText: "全天",
- eventLimitText: function (n) {
- return "另外 " + n + " 个";
- },
- noEventsMessage: "没有事件显示"
- };
-
- var _m66 = {
- code: "zh-tw",
- buttonText: {
- prev: "上月",
- next: "下月",
- today: "今天",
- month: "月",
- week: "週",
- day: "天",
- list: "活動列表"
- },
- weekLabel: "周",
- allDayText: "整天",
- eventLimitText: '顯示更多',
- noEventsMessage: "没有任何活動"
- };
-
- var _rollupPluginMultiEntry_entryPoint = [
- _m0, _m1, _m2, _m3, _m4, _m5, _m6, _m7, _m8, _m9, _m10, _m11, _m12, _m13, _m14, _m15, _m16, _m17, _m18, _m19, _m20, _m21, _m22, _m23, _m24, _m25, _m26, _m27, _m28, _m29, _m30, _m31, _m32, _m33, _m34, _m35, _m36, _m37, _m38, _m39, _m40, _m41, _m42, _m43, _m44, _m45, _m46, _m47, _m48, _m49, _m50, _m51, _m52, _m53, _m54, _m55, _m56, _m57, _m58, _m59, _m60, _m61, _m62, _m63, _m64, _m65, _m66
- ];
-
- return _rollupPluginMultiEntry_entryPoint;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales-all.min.js b/library/fullcalendar/packages/core/locales-all.min.js
deleted file mode 100644
index e553f6653..000000000
--- a/library/fullcalendar/packages/core/locales-all.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).FullCalendarLocalesAll=t()}(this,(function(){"use strict";return[{code:"af",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayHtml:"Heeldag",eventLimitText:"Addisionele",noEventsMessage:"Daar is geen gebeurtenisse nie"},{code:"ar-dz",week:{dow:0,doy:4},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-kw",week:{dow:0,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-ly",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-ma",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-sa",week:{dow:0,doy:6},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-tn",week:{dow:1,doy:4},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"az",week:{dow:1,doy:4},buttonText:{prev:"Əvvəl",next:"Sonra",today:"Bu Gün",month:"Ay",week:"Həftə",day:"Gün",list:"Gündəm"},weekLabel:"Həftə",allDayText:"Bütün Gün",eventLimitText:function(e){return"+ daha çox "+e},noEventsMessage:"Göstərmək üçün hadisə yoxdur"},{code:"bg",week:{dow:1,doy:7},buttonText:{prev:"назад",next:"напред",today:"днес",month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",eventLimitText:function(e){return"+още "+e},noEventsMessage:"Няма събития за показване"},{code:"bs",week:{dow:1,doy:7},buttonText:{prev:"Prošli",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},weekLabel:"Sed",allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikazivanje"},{code:"ca",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Següent",today:"Avui",month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},weekLabel:"Set",allDayText:"Tot el dia",eventLimitText:"més",noEventsMessage:"No hi ha esdeveniments per mostrar"},{code:"cs",week:{dow:1,doy:4},buttonText:{prev:"Dříve",next:"Později",today:"Nyní",month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},weekLabel:"Týd",allDayText:"Celý den",eventLimitText:function(e){return"+další: "+e},noEventsMessage:"Žádné akce k zobrazení"},{code:"da",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Næste",today:"I dag",month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},weekLabel:"Uge",allDayText:"Hele dagen",eventLimitText:"flere",noEventsMessage:"Ingen arrangementer at vise"},{code:"de",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekLabel:"KW",allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"},{code:"el",week:{dow:1,doy:4},buttonText:{prev:"Προηγούμενος",next:"Επόμενος",today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},weekLabel:"Εβδ",allDayText:"Ολοήμερο",eventLimitText:"περισσότερα",noEventsMessage:"Δεν υπάρχουν γεγονότα προς εμφάνιση"},{code:"en-au",week:{dow:1,doy:4}},{code:"en-gb",week:{dow:1,doy:4}},{code:"en-nz",week:{dow:1,doy:4}},{code:"es",week:{dow:0,doy:6},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"},{code:"es",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"},{code:"et",week:{dow:1,doy:4},buttonText:{prev:"Eelnev",next:"Järgnev",today:"Täna",month:"Kuu",week:"Nädal",day:"Päev",list:"Päevakord"},weekLabel:"näd",allDayText:"Kogu päev",eventLimitText:function(e){return"+ veel "+e},noEventsMessage:"Kuvamiseks puuduvad sündmused"},{code:"eu",week:{dow:1,doy:7},buttonText:{prev:"Aur",next:"Hur",today:"Gaur",month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},weekLabel:"As",allDayHtml:"Egun<br/>osoa",eventLimitText:"gehiago",noEventsMessage:"Ez dago ekitaldirik erakusteko"},{code:"fa",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"قبلی",next:"بعدی",today:"امروز",month:"ماه",week:"هفته",day:"روز",list:"برنامه"},weekLabel:"هف",allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e},noEventsMessage:"هیچ رویدادی به نمایش"},{code:"fi",week:{dow:1,doy:4},buttonText:{prev:"Edellinen",next:"Seuraava",today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},weekLabel:"Vk",allDayText:"Koko päivä",eventLimitText:"lisää",noEventsMessage:"Ei näytettäviä tapahtumia"},{code:"fr",buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sem.",allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"fr-ch",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Courant",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sm",allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"fr",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Planning"},weekLabel:"Sem.",allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"gl",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Seg",today:"Hoxe",month:"Mes",week:"Semana",day:"Día",list:"Axenda"},weekLabel:"Sm",allDayHtml:"Todo<br/>o día",eventLimitText:"máis",noEventsMessage:"Non hai eventos para amosar"},{code:"he",dir:"rtl",buttonText:{prev:"הקודם",next:"הבא",today:"היום",month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},allDayText:"כל היום",eventLimitText:"אחר",noEventsMessage:"אין אירועים להצגה",weekLabel:"שבוע"},{code:"hi",week:{dow:0,doy:6},buttonText:{prev:"पिछला",next:"अगला",today:"आज",month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},weekLabel:"हफ्ता",allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e},noEventsMessage:"कोई घटनाओं को प्रदर्शित करने के लिए"},{code:"hr",week:{dow:1,doy:7},buttonText:{prev:"Prijašnji",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},weekLabel:"Tje",allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikaz"},{code:"hu",week:{dow:1,doy:4},buttonText:{prev:"vissza",next:"előre",today:"ma",month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},weekLabel:"Hét",allDayText:"Egész nap",eventLimitText:"további",noEventsMessage:"Nincs megjeleníthető esemény"},{code:"id",week:{dow:1,doy:7},buttonText:{prev:"mundur",next:"maju",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekLabel:"Mg",allDayHtml:"Sehari<br/>penuh",eventLimitText:"lebih",noEventsMessage:"Tidak ada acara untuk ditampilkan"},{code:"is",week:{dow:1,doy:4},buttonText:{prev:"Fyrri",next:"Næsti",today:"Í dag",month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},weekLabel:"Vika",allDayHtml:"Allan<br/>daginn",eventLimitText:"meira",noEventsMessage:"Engir viðburðir til að sýna"},{code:"it",week:{dow:1,doy:4},buttonText:{prev:"Prec",next:"Succ",today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Tutto il<br/>giorno",eventLimitText:function(e){return"+altri "+e},noEventsMessage:"Non ci sono eventi da visualizzare"},{code:"ja",buttonText:{prev:"前",next:"次",today:"今日",month:"月",week:"週",day:"日",list:"予定リスト"},weekLabel:"週",allDayText:"終日",eventLimitText:function(e){return"他 "+e+" 件"},noEventsMessage:"表示する予定はありません"},{code:"ka",week:{dow:1,doy:7},buttonText:{prev:"წინა",next:"შემდეგი",today:"დღეს",month:"თვე",week:"კვირა",day:"დღე",list:"დღის წესრიგი"},weekLabel:"კვ",allDayText:"მთელი დღე",eventLimitText:function(e){return"+ კიდევ "+e},noEventsMessage:"ღონისძიებები არ არის"},{code:"kk",week:{dow:1,doy:7},buttonText:{prev:"Алдыңғы",next:"Келесі",today:"Бүгін",month:"Ай",week:"Апта",day:"Күн",list:"Күн тәртібі"},weekLabel:"Не",allDayText:"Күні бойы",eventLimitText:function(e){return"+ тағы "+e},noEventsMessage:"Көрсету үшін оқиғалар жоқ"},{code:"ko",buttonText:{prev:"이전달",next:"다음달",today:"오늘",month:"월",week:"주",day:"일",list:"일정목록"},weekLabel:"주",allDayText:"종일",eventLimitText:"개",noEventsMessage:"일정이 없습니다"},{code:"lb",week:{dow:1,doy:4},buttonText:{prev:"Zréck",next:"Weider",today:"Haut",month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},weekLabel:"W",allDayText:"Ganzen Dag",eventLimitText:"méi",noEventsMessage:"Nee Evenementer ze affichéieren"},{code:"lt",week:{dow:1,doy:4},buttonText:{prev:"Atgal",next:"Pirmyn",today:"Šiandien",month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},weekLabel:"SAV",allDayText:"Visą dieną",eventLimitText:"daugiau",noEventsMessage:"Nėra įvykių rodyti"},{code:"lv",week:{dow:1,doy:4},buttonText:{prev:"Iepr.",next:"Nāk.",today:"Šodien",month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},weekLabel:"Ned.",allDayText:"Visu dienu",eventLimitText:function(e){return"+vēl "+e},noEventsMessage:"Nav notikumu"},{code:"mk",buttonText:{prev:"претходно",next:"следно",today:"Денес",month:"Месец",week:"Недела",day:"Ден",list:"График"},weekLabel:"Сед",allDayText:"Цел ден",eventLimitText:function(e){return"+повеќе "+e},noEventsMessage:"Нема настани за прикажување"},{code:"ms",week:{dow:1,doy:7},buttonText:{prev:"Sebelum",next:"Selepas",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekLabel:"Mg",allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"},{code:"nb",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Neste",today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},weekLabel:"Uke",allDayText:"Hele dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"},{code:"nl",week:{dow:1,doy:4},buttonText:{prev:"Voorgaand",next:"Volgende",today:"Vandaag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"},{code:"nn",week:{dow:1,doy:4},buttonText:{prev:"Førre",next:"Neste",today:"I dag",month:"Månad",week:"Veke",day:"Dag",list:"Agenda"},weekLabel:"Veke",allDayText:"Heile dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"},{code:"pl",week:{dow:1,doy:4},buttonText:{prev:"Poprzedni",next:"Następny",today:"Dziś",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},weekLabel:"Tydz",allDayText:"Cały dzień",eventLimitText:"więcej",noEventsMessage:"Brak wydarzeń do wyświetlenia"},{code:"pt-br",buttonText:{prev:"Anterior",next:"Próximo",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Lista"},weekLabel:"Sm",allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e},noEventsMessage:"Não há eventos para mostrar"},{code:"pt",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Seguinte",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},weekLabel:"Sem",allDayText:"Todo o dia",eventLimitText:"mais",noEventsMessage:"Não há eventos para mostrar"},{code:"ro",week:{dow:1,doy:7},buttonText:{prev:"precedentă",next:"următoare",today:"Azi",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},weekLabel:"Săpt",allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e},noEventsMessage:"Nu există evenimente de afișat"},{code:"ru",week:{dow:1,doy:4},buttonText:{prev:"Пред",next:"След",today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},weekLabel:"Нед",allDayText:"Весь день",eventLimitText:function(e){return"+ ещё "+e},noEventsMessage:"Нет событий для отображения"},{code:"sk",week:{dow:1,doy:4},buttonText:{prev:"Predchádzajúci",next:"Nasledujúci",today:"Dnes",month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},weekLabel:"Ty",allDayText:"Celý deň",eventLimitText:function(e){return"+ďalšie: "+e},noEventsMessage:"Žiadne akcie na zobrazenie"},{code:"sl",week:{dow:1,doy:7},buttonText:{prev:"Prejšnji",next:"Naslednji",today:"Trenutni",month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},weekLabel:"Teden",allDayText:"Ves dan",eventLimitText:"več",noEventsMessage:"Ni dogodkov za prikaz"},{code:"sq",week:{dow:1,doy:4},buttonText:{prev:"mbrapa",next:"Përpara",today:"sot",month:"Muaj",week:"Javë",day:"Ditë",list:"Listë"},weekLabel:"Ja",allDayHtml:"Gjithë<br/>ditën",eventLimitText:function(e){return"+më tepër "+e},noEventsMessage:"Nuk ka evente për të shfaqur"},{code:"sr-cyrl",week:{dow:1,doy:7},buttonText:{prev:"Претходна",next:"следећи",today:"Данас",month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},weekLabel:"Сед",allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Нема догађаја за приказ"},{code:"sr",week:{dow:1,doy:7},buttonText:{prev:"Prethodna",next:"Sledeći",today:"Danas",month:"Mеsеc",week:"Nеdеlja",day:"Dan",list:"Planеr"},weekLabel:"Sed",allDayText:"Cеo dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nеma događaja za prikaz"},{code:"sv",week:{dow:1,doy:4},buttonText:{prev:"Förra",next:"Nästa",today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Program"},weekLabel:"v.",allDayText:"Heldag",eventLimitText:"till",noEventsMessage:"Inga händelser att visa"},{code:"th",week:{dow:1,doy:4},buttonText:{prev:"ก่อนหน้า",next:"ถัดไป",prevYear:"ปีก่อนหน้า",nextYear:"ปีถัดไป",year:"ปี",today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"กำหนดการ"},weekLabel:"สัปดาห์",allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม",noEventsMessage:"ไม่มีกิจกรรมที่จะแสดง"},{code:"tr",week:{dow:1,doy:7},buttonText:{prev:"geri",next:"ileri",today:"bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},weekLabel:"Hf",allDayText:"Tüm gün",eventLimitText:"daha fazla",noEventsMessage:"Gösterilecek etkinlik yok"},{code:"ug",buttonText:{month:"ئاي",week:"ھەپتە",day:"كۈن",list:"كۈنتەرتىپ"},allDayText:"پۈتۈن كۈن"},{code:"uk",week:{dow:1,doy:7},buttonText:{prev:"Попередній",next:"далі",today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},weekLabel:"Тиж",allDayText:"Увесь день",eventLimitText:function(e){return"+ще "+e+"..."},noEventsMessage:"Немає подій для відображення"},{code:"uz",buttonText:{month:"Oy",week:"Xafta",day:"Kun",list:"Kun tartibi"},allDayText:"Kun bo'yi",eventLimitText:function(e){return"+ yana "+e},noEventsMessage:"Ko'rsatish uchun voqealar yo'q"},{code:"vi",week:{dow:1,doy:4},buttonText:{prev:"Trước",next:"Tiếp",today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},weekLabel:"Tu",allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e},noEventsMessage:"Không có sự kiện để hiển thị"},{code:"zh-cn",week:{dow:1,doy:4},buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"周",day:"日",list:"日程"},weekLabel:"周",allDayText:"全天",eventLimitText:function(e){return"另外 "+e+" 个"},noEventsMessage:"没有事件显示"},{code:"zh-tw",buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"週",day:"天",list:"活動列表"},weekLabel:"周",allDayText:"整天",eventLimitText:"顯示更多",noEventsMessage:"没有任何活動"}]})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/af.js b/library/fullcalendar/packages/core/locales/af.js
deleted file mode 100644
index ee9f9f747..000000000
--- a/library/fullcalendar/packages/core/locales/af.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.af = factory()));
-}(this, function () { 'use strict';
-
- var af = {
- code: "af",
- week: {
- dow: 1,
- doy: 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
- },
- buttonText: {
- prev: "Vorige",
- next: "Volgende",
- today: "Vandag",
- year: "Jaar",
- month: "Maand",
- week: "Week",
- day: "Dag",
- list: "Agenda"
- },
- allDayHtml: "Heeldag",
- eventLimitText: "Addisionele",
- noEventsMessage: "Daar is geen gebeurtenisse nie"
- };
-
- return af;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ar-dz.js b/library/fullcalendar/packages/core/locales/ar-dz.js
deleted file mode 100644
index 201eb171a..000000000
--- a/library/fullcalendar/packages/core/locales/ar-dz.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-dz'] = factory()));
-}(this, function () { 'use strict';
-
- var arDz = {
- code: "ar-dz",
- week: {
- dow: 0,
- doy: 4 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- return arDz;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ar-kw.js b/library/fullcalendar/packages/core/locales/ar-kw.js
deleted file mode 100644
index 94c690014..000000000
--- a/library/fullcalendar/packages/core/locales/ar-kw.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-kw'] = factory()));
-}(this, function () { 'use strict';
-
- var arKw = {
- code: "ar-kw",
- week: {
- dow: 0,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- return arKw;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ar-ly.js b/library/fullcalendar/packages/core/locales/ar-ly.js
deleted file mode 100644
index e1c8aeb07..000000000
--- a/library/fullcalendar/packages/core/locales/ar-ly.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-ly'] = factory()));
-}(this, function () { 'use strict';
-
- var arLy = {
- code: "ar-ly",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- return arLy;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ar-ma.js b/library/fullcalendar/packages/core/locales/ar-ma.js
deleted file mode 100644
index 00cc7c679..000000000
--- a/library/fullcalendar/packages/core/locales/ar-ma.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-ma'] = factory()));
-}(this, function () { 'use strict';
-
- var arMa = {
- code: "ar-ma",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- return arMa;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ar-sa.js b/library/fullcalendar/packages/core/locales/ar-sa.js
deleted file mode 100644
index 0361f6d87..000000000
--- a/library/fullcalendar/packages/core/locales/ar-sa.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-sa'] = factory()));
-}(this, function () { 'use strict';
-
- var arSa = {
- code: "ar-sa",
- week: {
- dow: 0,
- doy: 6 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- return arSa;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ar-tn.js b/library/fullcalendar/packages/core/locales/ar-tn.js
deleted file mode 100644
index 57a07f8f5..000000000
--- a/library/fullcalendar/packages/core/locales/ar-tn.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-tn'] = factory()));
-}(this, function () { 'use strict';
-
- var arTn = {
- code: "ar-tn",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- return arTn;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ar.js b/library/fullcalendar/packages/core/locales/ar.js
deleted file mode 100644
index f789afd15..000000000
--- a/library/fullcalendar/packages/core/locales/ar.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ar = factory()));
-}(this, function () { 'use strict';
-
- var ar = {
- code: "ar",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- return ar;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/az.js b/library/fullcalendar/packages/core/locales/az.js
deleted file mode 100644
index fbd2dc35c..000000000
--- a/library/fullcalendar/packages/core/locales/az.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.az = factory()));
-}(this, function () { 'use strict';
-
- var az = {
- code: "az",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Əvvəl",
- next: "Sonra",
- today: "Bu Gün",
- month: "Ay",
- week: "Həftə",
- day: "Gün",
- list: "Gündəm"
- },
- weekLabel: "Həftə",
- allDayText: "Bütün Gün",
- eventLimitText: function (n) {
- return "+ daha çox " + n;
- },
- noEventsMessage: "Göstərmək üçün hadisə yoxdur"
- };
-
- return az;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/bg.js b/library/fullcalendar/packages/core/locales/bg.js
deleted file mode 100644
index e7343a6c5..000000000
--- a/library/fullcalendar/packages/core/locales/bg.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.bg = factory()));
-}(this, function () { 'use strict';
-
- var bg = {
- code: "bg",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "назад",
- next: "напред",
- today: "днес",
- month: "Месец",
- week: "Седмица",
- day: "Ден",
- list: "График"
- },
- allDayText: "Цял ден",
- eventLimitText: function (n) {
- return "+още " + n;
- },
- noEventsMessage: "Няма събития за показване"
- };
-
- return bg;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/bs.js b/library/fullcalendar/packages/core/locales/bs.js
deleted file mode 100644
index d96b8adb3..000000000
--- a/library/fullcalendar/packages/core/locales/bs.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.bs = factory()));
-}(this, function () { 'use strict';
-
- var bs = {
- code: "bs",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prošli",
- next: "Sljedeći",
- today: "Danas",
- month: "Mjesec",
- week: "Sedmica",
- day: "Dan",
- list: "Raspored"
- },
- weekLabel: "Sed",
- allDayText: "Cijeli dan",
- eventLimitText: function (n) {
- return "+ još " + n;
- },
- noEventsMessage: "Nema događaja za prikazivanje"
- };
-
- return bs;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ca.js b/library/fullcalendar/packages/core/locales/ca.js
deleted file mode 100644
index d2d3e2aa7..000000000
--- a/library/fullcalendar/packages/core/locales/ca.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ca = factory()));
-}(this, function () { 'use strict';
-
- var ca = {
- code: "ca",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Anterior",
- next: "Següent",
- today: "Avui",
- month: "Mes",
- week: "Setmana",
- day: "Dia",
- list: "Agenda"
- },
- weekLabel: "Set",
- allDayText: "Tot el dia",
- eventLimitText: "més",
- noEventsMessage: "No hi ha esdeveniments per mostrar"
- };
-
- return ca;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/cs.js b/library/fullcalendar/packages/core/locales/cs.js
deleted file mode 100644
index 2624e3607..000000000
--- a/library/fullcalendar/packages/core/locales/cs.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.cs = factory()));
-}(this, function () { 'use strict';
-
- var cs = {
- code: "cs",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Dříve",
- next: "Později",
- today: "Nyní",
- month: "Měsíc",
- week: "Týden",
- day: "Den",
- list: "Agenda"
- },
- weekLabel: "Týd",
- allDayText: "Celý den",
- eventLimitText: function (n) {
- return "+další: " + n;
- },
- noEventsMessage: "Žádné akce k zobrazení"
- };
-
- return cs;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/da.js b/library/fullcalendar/packages/core/locales/da.js
deleted file mode 100644
index 73d155929..000000000
--- a/library/fullcalendar/packages/core/locales/da.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.da = factory()));
-}(this, function () { 'use strict';
-
- var da = {
- code: "da",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Forrige",
- next: "Næste",
- today: "I dag",
- month: "Måned",
- week: "Uge",
- day: "Dag",
- list: "Agenda"
- },
- weekLabel: "Uge",
- allDayText: "Hele dagen",
- eventLimitText: "flere",
- noEventsMessage: "Ingen arrangementer at vise"
- };
-
- return da;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/de.js b/library/fullcalendar/packages/core/locales/de.js
deleted file mode 100644
index ab5a815a0..000000000
--- a/library/fullcalendar/packages/core/locales/de.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.de = factory()));
-}(this, function () { 'use strict';
-
- var de = {
- code: "de",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Zurück",
- next: "Vor",
- today: "Heute",
- year: "Jahr",
- month: "Monat",
- week: "Woche",
- day: "Tag",
- list: "Terminübersicht"
- },
- weekLabel: "KW",
- allDayText: "Ganztägig",
- eventLimitText: function (n) {
- return "+ weitere " + n;
- },
- noEventsMessage: "Keine Ereignisse anzuzeigen"
- };
-
- return de;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/el.js b/library/fullcalendar/packages/core/locales/el.js
deleted file mode 100644
index cdc10a66e..000000000
--- a/library/fullcalendar/packages/core/locales/el.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.el = factory()));
-}(this, function () { 'use strict';
-
- var el = {
- code: "el",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4st is the first week of the year.
- },
- buttonText: {
- prev: "Προηγούμενος",
- next: "Επόμενος",
- today: "Σήμερα",
- month: "Μήνας",
- week: "Εβδομάδα",
- day: "Ημέρα",
- list: "Ατζέντα"
- },
- weekLabel: "Εβδ",
- allDayText: "Ολοήμερο",
- eventLimitText: "περισσότερα",
- noEventsMessage: "Δεν υπάρχουν γεγονότα προς εμφάνιση"
- };
-
- return el;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/en-au.js b/library/fullcalendar/packages/core/locales/en-au.js
deleted file mode 100644
index be10bfb66..000000000
--- a/library/fullcalendar/packages/core/locales/en-au.js
+++ /dev/null
@@ -1,17 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-au'] = factory()));
-}(this, function () { 'use strict';
-
- var enAu = {
- code: "en-au",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- }
- };
-
- return enAu;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/en-gb.js b/library/fullcalendar/packages/core/locales/en-gb.js
deleted file mode 100644
index 8a4a84e6b..000000000
--- a/library/fullcalendar/packages/core/locales/en-gb.js
+++ /dev/null
@@ -1,17 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-gb'] = factory()));
-}(this, function () { 'use strict';
-
- var enGb = {
- code: "en-gb",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- }
- };
-
- return enGb;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/en-nz.js b/library/fullcalendar/packages/core/locales/en-nz.js
deleted file mode 100644
index df56c1455..000000000
--- a/library/fullcalendar/packages/core/locales/en-nz.js
+++ /dev/null
@@ -1,17 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-nz'] = factory()));
-}(this, function () { 'use strict';
-
- var enNz = {
- code: "en-nz",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- }
- };
-
- return enNz;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/es-us.js b/library/fullcalendar/packages/core/locales/es-us.js
deleted file mode 100644
index 1efa89a4d..000000000
--- a/library/fullcalendar/packages/core/locales/es-us.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['es-us'] = factory()));
-}(this, function () { 'use strict';
-
- var esUs = {
- code: "es",
- week: {
- dow: 0,
- doy: 6 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Ant",
- next: "Sig",
- today: "Hoy",
- month: "Mes",
- week: "Semana",
- day: "Día",
- list: "Agenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Todo<br/>el día",
- eventLimitText: "más",
- noEventsMessage: "No hay eventos para mostrar"
- };
-
- return esUs;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/es.js b/library/fullcalendar/packages/core/locales/es.js
deleted file mode 100644
index bfd9af4c6..000000000
--- a/library/fullcalendar/packages/core/locales/es.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.es = factory()));
-}(this, function () { 'use strict';
-
- var es = {
- code: "es",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Ant",
- next: "Sig",
- today: "Hoy",
- month: "Mes",
- week: "Semana",
- day: "Día",
- list: "Agenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Todo<br/>el día",
- eventLimitText: "más",
- noEventsMessage: "No hay eventos para mostrar"
- };
-
- return es;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/et.js b/library/fullcalendar/packages/core/locales/et.js
deleted file mode 100644
index c44fcaec9..000000000
--- a/library/fullcalendar/packages/core/locales/et.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.et = factory()));
-}(this, function () { 'use strict';
-
- var et = {
- code: "et",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Eelnev",
- next: "Järgnev",
- today: "Täna",
- month: "Kuu",
- week: "Nädal",
- day: "Päev",
- list: "Päevakord"
- },
- weekLabel: "näd",
- allDayText: "Kogu päev",
- eventLimitText: function (n) {
- return "+ veel " + n;
- },
- noEventsMessage: "Kuvamiseks puuduvad sündmused"
- };
-
- return et;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/eu.js b/library/fullcalendar/packages/core/locales/eu.js
deleted file mode 100644
index 91903aaaf..000000000
--- a/library/fullcalendar/packages/core/locales/eu.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.eu = factory()));
-}(this, function () { 'use strict';
-
- var eu = {
- code: "eu",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Aur",
- next: "Hur",
- today: "Gaur",
- month: "Hilabetea",
- week: "Astea",
- day: "Eguna",
- list: "Agenda"
- },
- weekLabel: "As",
- allDayHtml: "Egun<br/>osoa",
- eventLimitText: "gehiago",
- noEventsMessage: "Ez dago ekitaldirik erakusteko"
- };
-
- return eu;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/fa.js b/library/fullcalendar/packages/core/locales/fa.js
deleted file mode 100644
index 031fc7b30..000000000
--- a/library/fullcalendar/packages/core/locales/fa.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fa = factory()));
-}(this, function () { 'use strict';
-
- var fa = {
- code: "fa",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "قبلی",
- next: "بعدی",
- today: "امروز",
- month: "ماه",
- week: "هفته",
- day: "روز",
- list: "برنامه"
- },
- weekLabel: "هف",
- allDayText: "تمام روز",
- eventLimitText: function (n) {
- return "بیش از " + n;
- },
- noEventsMessage: "هیچ رویدادی به نمایش"
- };
-
- return fa;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/fi.js b/library/fullcalendar/packages/core/locales/fi.js
deleted file mode 100644
index 3912845cf..000000000
--- a/library/fullcalendar/packages/core/locales/fi.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fi = factory()));
-}(this, function () { 'use strict';
-
- var fi = {
- code: "fi",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Edellinen",
- next: "Seuraava",
- today: "Tänään",
- month: "Kuukausi",
- week: "Viikko",
- day: "Päivä",
- list: "Tapahtumat"
- },
- weekLabel: "Vk",
- allDayText: "Koko päivä",
- eventLimitText: "lisää",
- noEventsMessage: "Ei näytettäviä tapahtumia"
- };
-
- return fi;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/fr-ca.js b/library/fullcalendar/packages/core/locales/fr-ca.js
deleted file mode 100644
index d554c1408..000000000
--- a/library/fullcalendar/packages/core/locales/fr-ca.js
+++ /dev/null
@@ -1,27 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['fr-ca'] = factory()));
-}(this, function () { 'use strict';
-
- var frCa = {
- code: "fr",
- buttonText: {
- prev: "Précédent",
- next: "Suivant",
- today: "Aujourd'hui",
- year: "Année",
- month: "Mois",
- week: "Semaine",
- day: "Jour",
- list: "Mon planning"
- },
- weekLabel: "Sem.",
- allDayHtml: "Toute la<br/>journée",
- eventLimitText: "en plus",
- noEventsMessage: "Aucun événement à afficher"
- };
-
- return frCa;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/fr-ch.js b/library/fullcalendar/packages/core/locales/fr-ch.js
deleted file mode 100644
index 358b8bf31..000000000
--- a/library/fullcalendar/packages/core/locales/fr-ch.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['fr-ch'] = factory()));
-}(this, function () { 'use strict';
-
- var frCh = {
- code: "fr-ch",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Précédent",
- next: "Suivant",
- today: "Courant",
- year: "Année",
- month: "Mois",
- week: "Semaine",
- day: "Jour",
- list: "Mon planning"
- },
- weekLabel: "Sm",
- allDayHtml: "Toute la<br/>journée",
- eventLimitText: "en plus",
- noEventsMessage: "Aucun événement à afficher"
- };
-
- return frCh;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/fr.js b/library/fullcalendar/packages/core/locales/fr.js
deleted file mode 100644
index 4760a71a9..000000000
--- a/library/fullcalendar/packages/core/locales/fr.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fr = factory()));
-}(this, function () { 'use strict';
-
- var fr = {
- code: "fr",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Précédent",
- next: "Suivant",
- today: "Aujourd'hui",
- year: "Année",
- month: "Mois",
- week: "Semaine",
- day: "Jour",
- list: "Planning"
- },
- weekLabel: "Sem.",
- allDayHtml: "Toute la<br/>journée",
- eventLimitText: "en plus",
- noEventsMessage: "Aucun événement à afficher"
- };
-
- return fr;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/gl.js b/library/fullcalendar/packages/core/locales/gl.js
deleted file mode 100644
index 721a6a89b..000000000
--- a/library/fullcalendar/packages/core/locales/gl.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.gl = factory()));
-}(this, function () { 'use strict';
-
- var gl = {
- code: "gl",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Ant",
- next: "Seg",
- today: "Hoxe",
- month: "Mes",
- week: "Semana",
- day: "Día",
- list: "Axenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Todo<br/>o día",
- eventLimitText: "máis",
- noEventsMessage: "Non hai eventos para amosar"
- };
-
- return gl;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/he.js b/library/fullcalendar/packages/core/locales/he.js
deleted file mode 100644
index 3521d9e33..000000000
--- a/library/fullcalendar/packages/core/locales/he.js
+++ /dev/null
@@ -1,27 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.he = factory()));
-}(this, function () { 'use strict';
-
- var he = {
- code: "he",
- dir: 'rtl',
- buttonText: {
- prev: "הקודם",
- next: "הבא",
- today: "היום",
- month: "חודש",
- week: "שבוע",
- day: "יום",
- list: "סדר יום"
- },
- allDayText: "כל היום",
- eventLimitText: "אחר",
- noEventsMessage: "אין אירועים להצגה",
- weekLabel: "שבוע"
- };
-
- return he;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/hi.js b/library/fullcalendar/packages/core/locales/hi.js
deleted file mode 100644
index 15348e697..000000000
--- a/library/fullcalendar/packages/core/locales/hi.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hi = factory()));
-}(this, function () { 'use strict';
-
- var hi = {
- code: "hi",
- week: {
- dow: 0,
- doy: 6 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "पिछला",
- next: "अगला",
- today: "आज",
- month: "महीना",
- week: "सप्ताह",
- day: "दिन",
- list: "कार्यसूची"
- },
- weekLabel: "हफ्ता",
- allDayText: "सभी दिन",
- eventLimitText: function (n) {
- return "+अधिक " + n;
- },
- noEventsMessage: "कोई घटनाओं को प्रदर्शित करने के लिए"
- };
-
- return hi;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/hr.js b/library/fullcalendar/packages/core/locales/hr.js
deleted file mode 100644
index 295b48566..000000000
--- a/library/fullcalendar/packages/core/locales/hr.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hr = factory()));
-}(this, function () { 'use strict';
-
- var hr = {
- code: "hr",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prijašnji",
- next: "Sljedeći",
- today: "Danas",
- month: "Mjesec",
- week: "Tjedan",
- day: "Dan",
- list: "Raspored"
- },
- weekLabel: "Tje",
- allDayText: "Cijeli dan",
- eventLimitText: function (n) {
- return "+ još " + n;
- },
- noEventsMessage: "Nema događaja za prikaz"
- };
-
- return hr;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/hu.js b/library/fullcalendar/packages/core/locales/hu.js
deleted file mode 100644
index 2f0fe8acb..000000000
--- a/library/fullcalendar/packages/core/locales/hu.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hu = factory()));
-}(this, function () { 'use strict';
-
- var hu = {
- code: "hu",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "vissza",
- next: "előre",
- today: "ma",
- month: "Hónap",
- week: "Hét",
- day: "Nap",
- list: "Napló"
- },
- weekLabel: "Hét",
- allDayText: "Egész nap",
- eventLimitText: "további",
- noEventsMessage: "Nincs megjeleníthető esemény"
- };
-
- return hu;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/id.js b/library/fullcalendar/packages/core/locales/id.js
deleted file mode 100644
index b742e80dd..000000000
--- a/library/fullcalendar/packages/core/locales/id.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.id = factory()));
-}(this, function () { 'use strict';
-
- var id = {
- code: "id",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "mundur",
- next: "maju",
- today: "hari ini",
- month: "Bulan",
- week: "Minggu",
- day: "Hari",
- list: "Agenda"
- },
- weekLabel: "Mg",
- allDayHtml: "Sehari<br/>penuh",
- eventLimitText: "lebih",
- noEventsMessage: "Tidak ada acara untuk ditampilkan"
- };
-
- return id;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/is.js b/library/fullcalendar/packages/core/locales/is.js
deleted file mode 100644
index dd569bce7..000000000
--- a/library/fullcalendar/packages/core/locales/is.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.is = factory()));
-}(this, function () { 'use strict';
-
- var is = {
- code: "is",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Fyrri",
- next: "Næsti",
- today: "Í dag",
- month: "Mánuður",
- week: "Vika",
- day: "Dagur",
- list: "Dagskrá"
- },
- weekLabel: "Vika",
- allDayHtml: "Allan<br/>daginn",
- eventLimitText: "meira",
- noEventsMessage: "Engir viðburðir til að sýna"
- };
-
- return is;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/it.js b/library/fullcalendar/packages/core/locales/it.js
deleted file mode 100644
index 39a2829e5..000000000
--- a/library/fullcalendar/packages/core/locales/it.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.it = factory()));
-}(this, function () { 'use strict';
-
- var it = {
- code: "it",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Prec",
- next: "Succ",
- today: "Oggi",
- month: "Mese",
- week: "Settimana",
- day: "Giorno",
- list: "Agenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Tutto il<br/>giorno",
- eventLimitText: function (n) {
- return "+altri " + n;
- },
- noEventsMessage: "Non ci sono eventi da visualizzare"
- };
-
- return it;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ja.js b/library/fullcalendar/packages/core/locales/ja.js
deleted file mode 100644
index eb4245b2a..000000000
--- a/library/fullcalendar/packages/core/locales/ja.js
+++ /dev/null
@@ -1,28 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ja = factory()));
-}(this, function () { 'use strict';
-
- var ja = {
- code: "ja",
- buttonText: {
- prev: "前",
- next: "次",
- today: "今日",
- month: "月",
- week: "週",
- day: "日",
- list: "予定リスト"
- },
- weekLabel: "週",
- allDayText: "終日",
- eventLimitText: function (n) {
- return "他 " + n + " 件";
- },
- noEventsMessage: "表示する予定はありません"
- };
-
- return ja;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ka.js b/library/fullcalendar/packages/core/locales/ka.js
deleted file mode 100644
index b971c033f..000000000
--- a/library/fullcalendar/packages/core/locales/ka.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ka = factory()));
-}(this, function () { 'use strict';
-
- var ka = {
- code: "ka",
- week: {
- dow: 1,
- doy: 7
- },
- buttonText: {
- prev: "წინა",
- next: "შემდეგი",
- today: "დღეს",
- month: "თვე",
- week: "კვირა",
- day: "დღე",
- list: "დღის წესრიგი"
- },
- weekLabel: "კვ",
- allDayText: "მთელი დღე",
- eventLimitText: function (n) {
- return "+ კიდევ " + n;
- },
- noEventsMessage: "ღონისძიებები არ არის"
- };
-
- return ka;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/kk.js b/library/fullcalendar/packages/core/locales/kk.js
deleted file mode 100644
index 5b19b99d5..000000000
--- a/library/fullcalendar/packages/core/locales/kk.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.kk = factory()));
-}(this, function () { 'use strict';
-
- var kk = {
- code: "kk",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Алдыңғы",
- next: "Келесі",
- today: "Бүгін",
- month: "Ай",
- week: "Апта",
- day: "Күн",
- list: "Күн тәртібі"
- },
- weekLabel: "Не",
- allDayText: "Күні бойы",
- eventLimitText: function (n) {
- return "+ тағы " + n;
- },
- noEventsMessage: "Көрсету үшін оқиғалар жоқ"
- };
-
- return kk;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ko.js b/library/fullcalendar/packages/core/locales/ko.js
deleted file mode 100644
index ffe985d6c..000000000
--- a/library/fullcalendar/packages/core/locales/ko.js
+++ /dev/null
@@ -1,26 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ko = factory()));
-}(this, function () { 'use strict';
-
- var ko = {
- code: "ko",
- buttonText: {
- prev: "이전달",
- next: "다음달",
- today: "오늘",
- month: "월",
- week: "주",
- day: "일",
- list: "일정목록"
- },
- weekLabel: "주",
- allDayText: "종일",
- eventLimitText: "개",
- noEventsMessage: "일정이 없습니다"
- };
-
- return ko;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/lb.js b/library/fullcalendar/packages/core/locales/lb.js
deleted file mode 100644
index b9b17e3ec..000000000
--- a/library/fullcalendar/packages/core/locales/lb.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lb = factory()));
-}(this, function () { 'use strict';
-
- var lb = {
- code: "lb",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Zréck",
- next: "Weider",
- today: "Haut",
- month: "Mount",
- week: "Woch",
- day: "Dag",
- list: "Terminiwwersiicht"
- },
- weekLabel: "W",
- allDayText: "Ganzen Dag",
- eventLimitText: "méi",
- noEventsMessage: "Nee Evenementer ze affichéieren"
- };
-
- return lb;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/lt.js b/library/fullcalendar/packages/core/locales/lt.js
deleted file mode 100644
index ec641b750..000000000
--- a/library/fullcalendar/packages/core/locales/lt.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lt = factory()));
-}(this, function () { 'use strict';
-
- var lt = {
- code: "lt",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Atgal",
- next: "Pirmyn",
- today: "Šiandien",
- month: "Mėnuo",
- week: "Savaitė",
- day: "Diena",
- list: "Darbotvarkė"
- },
- weekLabel: "SAV",
- allDayText: "Visą dieną",
- eventLimitText: "daugiau",
- noEventsMessage: "Nėra įvykių rodyti"
- };
-
- return lt;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/lv.js b/library/fullcalendar/packages/core/locales/lv.js
deleted file mode 100644
index 5453630df..000000000
--- a/library/fullcalendar/packages/core/locales/lv.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lv = factory()));
-}(this, function () { 'use strict';
-
- var lv = {
- code: "lv",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Iepr.",
- next: "Nāk.",
- today: "Šodien",
- month: "Mēnesis",
- week: "Nedēļa",
- day: "Diena",
- list: "Dienas kārtība"
- },
- weekLabel: "Ned.",
- allDayText: "Visu dienu",
- eventLimitText: function (n) {
- return "+vēl " + n;
- },
- noEventsMessage: "Nav notikumu"
- };
-
- return lv;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/mk.js b/library/fullcalendar/packages/core/locales/mk.js
deleted file mode 100644
index 6729fa63d..000000000
--- a/library/fullcalendar/packages/core/locales/mk.js
+++ /dev/null
@@ -1,28 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.mk = factory()));
-}(this, function () { 'use strict';
-
- var mk = {
- code: "mk",
- buttonText: {
- prev: "претходно",
- next: "следно",
- today: "Денес",
- month: "Месец",
- week: "Недела",
- day: "Ден",
- list: "График"
- },
- weekLabel: "Сед",
- allDayText: "Цел ден",
- eventLimitText: function (n) {
- return "+повеќе " + n;
- },
- noEventsMessage: "Нема настани за прикажување"
- };
-
- return mk;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ms.js b/library/fullcalendar/packages/core/locales/ms.js
deleted file mode 100644
index 7205ecc72..000000000
--- a/library/fullcalendar/packages/core/locales/ms.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ms = factory()));
-}(this, function () { 'use strict';
-
- var ms = {
- code: "ms",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Sebelum",
- next: "Selepas",
- today: "hari ini",
- month: "Bulan",
- week: "Minggu",
- day: "Hari",
- list: "Agenda"
- },
- weekLabel: "Mg",
- allDayText: "Sepanjang hari",
- eventLimitText: function (n) {
- return "masih ada " + n + " acara";
- },
- noEventsMessage: "Tiada peristiwa untuk dipaparkan"
- };
-
- return ms;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/nb.js b/library/fullcalendar/packages/core/locales/nb.js
deleted file mode 100644
index 6464461c6..000000000
--- a/library/fullcalendar/packages/core/locales/nb.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nb = factory()));
-}(this, function () { 'use strict';
-
- var nb = {
- code: "nb",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Forrige",
- next: "Neste",
- today: "I dag",
- month: "Måned",
- week: "Uke",
- day: "Dag",
- list: "Agenda"
- },
- weekLabel: "Uke",
- allDayText: "Hele dagen",
- eventLimitText: "til",
- noEventsMessage: "Ingen hendelser å vise"
- };
-
- return nb;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/nl.js b/library/fullcalendar/packages/core/locales/nl.js
deleted file mode 100644
index c91b5e55f..000000000
--- a/library/fullcalendar/packages/core/locales/nl.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nl = factory()));
-}(this, function () { 'use strict';
-
- var nl = {
- code: "nl",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Voorgaand",
- next: "Volgende",
- today: "Vandaag",
- year: "Jaar",
- month: "Maand",
- week: "Week",
- day: "Dag",
- list: "Agenda"
- },
- allDayText: "Hele dag",
- eventLimitText: "extra",
- noEventsMessage: "Geen evenementen om te laten zien"
- };
-
- return nl;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/nn.js b/library/fullcalendar/packages/core/locales/nn.js
deleted file mode 100644
index a5cdd1626..000000000
--- a/library/fullcalendar/packages/core/locales/nn.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nn = factory()));
-}(this, function () { 'use strict';
-
- var nn = {
- code: "nn",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Førre",
- next: "Neste",
- today: "I dag",
- month: "Månad",
- week: "Veke",
- day: "Dag",
- list: "Agenda"
- },
- weekLabel: "Veke",
- allDayText: "Heile dagen",
- eventLimitText: "til",
- noEventsMessage: "Ingen hendelser å vise"
- };
-
- return nn;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/pl.js b/library/fullcalendar/packages/core/locales/pl.js
deleted file mode 100644
index 0a22e69c4..000000000
--- a/library/fullcalendar/packages/core/locales/pl.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.pl = factory()));
-}(this, function () { 'use strict';
-
- var pl = {
- code: "pl",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Poprzedni",
- next: "Następny",
- today: "Dziś",
- month: "Miesiąc",
- week: "Tydzień",
- day: "Dzień",
- list: "Plan dnia"
- },
- weekLabel: "Tydz",
- allDayText: "Cały dzień",
- eventLimitText: "więcej",
- noEventsMessage: "Brak wydarzeń do wyświetlenia"
- };
-
- return pl;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/pt-br.js b/library/fullcalendar/packages/core/locales/pt-br.js
deleted file mode 100644
index bfa023dd6..000000000
--- a/library/fullcalendar/packages/core/locales/pt-br.js
+++ /dev/null
@@ -1,28 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['pt-br'] = factory()));
-}(this, function () { 'use strict';
-
- var ptBr = {
- code: "pt-br",
- buttonText: {
- prev: "Anterior",
- next: "Próximo",
- today: "Hoje",
- month: "Mês",
- week: "Semana",
- day: "Dia",
- list: "Lista"
- },
- weekLabel: "Sm",
- allDayText: "dia inteiro",
- eventLimitText: function (n) {
- return "mais +" + n;
- },
- noEventsMessage: "Não há eventos para mostrar"
- };
-
- return ptBr;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/pt.js b/library/fullcalendar/packages/core/locales/pt.js
deleted file mode 100644
index 5c54d8d40..000000000
--- a/library/fullcalendar/packages/core/locales/pt.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.pt = factory()));
-}(this, function () { 'use strict';
-
- var pt = {
- code: "pt",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Anterior",
- next: "Seguinte",
- today: "Hoje",
- month: "Mês",
- week: "Semana",
- day: "Dia",
- list: "Agenda"
- },
- weekLabel: "Sem",
- allDayText: "Todo o dia",
- eventLimitText: "mais",
- noEventsMessage: "Não há eventos para mostrar"
- };
-
- return pt;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ro.js b/library/fullcalendar/packages/core/locales/ro.js
deleted file mode 100644
index e8992f276..000000000
--- a/library/fullcalendar/packages/core/locales/ro.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ro = factory()));
-}(this, function () { 'use strict';
-
- var ro = {
- code: "ro",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "precedentă",
- next: "următoare",
- today: "Azi",
- month: "Lună",
- week: "Săptămână",
- day: "Zi",
- list: "Agendă"
- },
- weekLabel: "Săpt",
- allDayText: "Toată ziua",
- eventLimitText: function (n) {
- return "+alte " + n;
- },
- noEventsMessage: "Nu există evenimente de afișat"
- };
-
- return ro;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ru.js b/library/fullcalendar/packages/core/locales/ru.js
deleted file mode 100644
index 77e0308e2..000000000
--- a/library/fullcalendar/packages/core/locales/ru.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ru = factory()));
-}(this, function () { 'use strict';
-
- var ru = {
- code: "ru",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Пред",
- next: "След",
- today: "Сегодня",
- month: "Месяц",
- week: "Неделя",
- day: "День",
- list: "Повестка дня"
- },
- weekLabel: "Нед",
- allDayText: "Весь день",
- eventLimitText: function (n) {
- return "+ ещё " + n;
- },
- noEventsMessage: "Нет событий для отображения"
- };
-
- return ru;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/sk.js b/library/fullcalendar/packages/core/locales/sk.js
deleted file mode 100644
index 3513a64ad..000000000
--- a/library/fullcalendar/packages/core/locales/sk.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sk = factory()));
-}(this, function () { 'use strict';
-
- var sk = {
- code: "sk",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Predchádzajúci",
- next: "Nasledujúci",
- today: "Dnes",
- month: "Mesiac",
- week: "Týždeň",
- day: "Deň",
- list: "Rozvrh"
- },
- weekLabel: "Ty",
- allDayText: "Celý deň",
- eventLimitText: function (n) {
- return "+ďalšie: " + n;
- },
- noEventsMessage: "Žiadne akcie na zobrazenie"
- };
-
- return sk;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/sl.js b/library/fullcalendar/packages/core/locales/sl.js
deleted file mode 100644
index 323355359..000000000
--- a/library/fullcalendar/packages/core/locales/sl.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sl = factory()));
-}(this, function () { 'use strict';
-
- var sl = {
- code: "sl",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prejšnji",
- next: "Naslednji",
- today: "Trenutni",
- month: "Mesec",
- week: "Teden",
- day: "Dan",
- list: "Dnevni red"
- },
- weekLabel: "Teden",
- allDayText: "Ves dan",
- eventLimitText: "več",
- noEventsMessage: "Ni dogodkov za prikaz"
- };
-
- return sl;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/sq.js b/library/fullcalendar/packages/core/locales/sq.js
deleted file mode 100644
index 0d43a5220..000000000
--- a/library/fullcalendar/packages/core/locales/sq.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sq = factory()));
-}(this, function () { 'use strict';
-
- var sq = {
- code: "sq",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "mbrapa",
- next: "Përpara",
- today: "sot",
- month: "Muaj",
- week: "Javë",
- day: "Ditë",
- list: "Listë"
- },
- weekLabel: "Ja",
- allDayHtml: "Gjithë<br/>ditën",
- eventLimitText: function (n) {
- return "+më tepër " + n;
- },
- noEventsMessage: "Nuk ka evente për të shfaqur"
- };
-
- return sq;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/sr-cyrl.js b/library/fullcalendar/packages/core/locales/sr-cyrl.js
deleted file mode 100644
index ba0d0dfa3..000000000
--- a/library/fullcalendar/packages/core/locales/sr-cyrl.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['sr-cyrl'] = factory()));
-}(this, function () { 'use strict';
-
- var srCyrl = {
- code: "sr-cyrl",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Претходна",
- next: "следећи",
- today: "Данас",
- month: "Месец",
- week: "Недеља",
- day: "Дан",
- list: "Планер"
- },
- weekLabel: "Сед",
- allDayText: "Цео дан",
- eventLimitText: function (n) {
- return "+ још " + n;
- },
- noEventsMessage: "Нема догађаја за приказ"
- };
-
- return srCyrl;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/sr.js b/library/fullcalendar/packages/core/locales/sr.js
deleted file mode 100644
index 23e5c9b23..000000000
--- a/library/fullcalendar/packages/core/locales/sr.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sr = factory()));
-}(this, function () { 'use strict';
-
- var sr = {
- code: "sr",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prethodna",
- next: "Sledeći",
- today: "Danas",
- month: "Mеsеc",
- week: "Nеdеlja",
- day: "Dan",
- list: "Planеr"
- },
- weekLabel: "Sed",
- allDayText: "Cеo dan",
- eventLimitText: function (n) {
- return "+ još " + n;
- },
- noEventsMessage: "Nеma događaja za prikaz"
- };
-
- return sr;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/sv.js b/library/fullcalendar/packages/core/locales/sv.js
deleted file mode 100644
index a887060ba..000000000
--- a/library/fullcalendar/packages/core/locales/sv.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sv = factory()));
-}(this, function () { 'use strict';
-
- var sv = {
- code: "sv",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Förra",
- next: "Nästa",
- today: "Idag",
- month: "Månad",
- week: "Vecka",
- day: "Dag",
- list: "Program"
- },
- weekLabel: "v.",
- allDayText: "Heldag",
- eventLimitText: "till",
- noEventsMessage: "Inga händelser att visa"
- };
-
- return sv;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/th.js b/library/fullcalendar/packages/core/locales/th.js
deleted file mode 100644
index faeaee214..000000000
--- a/library/fullcalendar/packages/core/locales/th.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.th = factory()));
-}(this, function () { 'use strict';
-
- var th = {
- code: "th",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "ก่อนหน้า",
- next: "ถัดไป",
- prevYear: 'ปีก่อนหน้า',
- nextYear: 'ปีถัดไป',
- year: 'ปี',
- today: "วันนี้",
- month: "เดือน",
- week: "สัปดาห์",
- day: "วัน",
- list: "กำหนดการ"
- },
- weekLabel: "สัปดาห์",
- allDayText: "ตลอดวัน",
- eventLimitText: "เพิ่มเติม",
- noEventsMessage: "ไม่มีกิจกรรมที่จะแสดง"
- };
-
- return th;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/tr.js b/library/fullcalendar/packages/core/locales/tr.js
deleted file mode 100644
index 48458982f..000000000
--- a/library/fullcalendar/packages/core/locales/tr.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.tr = factory()));
-}(this, function () { 'use strict';
-
- var tr = {
- code: "tr",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "geri",
- next: "ileri",
- today: "bugün",
- month: "Ay",
- week: "Hafta",
- day: "Gün",
- list: "Ajanda"
- },
- weekLabel: "Hf",
- allDayText: "Tüm gün",
- eventLimitText: "daha fazla",
- noEventsMessage: "Gösterilecek etkinlik yok"
- };
-
- return tr;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ug.js b/library/fullcalendar/packages/core/locales/ug.js
deleted file mode 100644
index f13a5c286..000000000
--- a/library/fullcalendar/packages/core/locales/ug.js
+++ /dev/null
@@ -1,20 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ug = factory()));
-}(this, function () { 'use strict';
-
- var ug = {
- code: "ug",
- buttonText: {
- month: "ئاي",
- week: "ھەپتە",
- day: "كۈن",
- list: "كۈنتەرتىپ"
- },
- allDayText: "پۈتۈن كۈن"
- };
-
- return ug;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/uk.js b/library/fullcalendar/packages/core/locales/uk.js
deleted file mode 100644
index de33f250c..000000000
--- a/library/fullcalendar/packages/core/locales/uk.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.uk = factory()));
-}(this, function () { 'use strict';
-
- var uk = {
- code: "uk",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Попередній",
- next: "далі",
- today: "Сьогодні",
- month: "Місяць",
- week: "Тиждень",
- day: "День",
- list: "Порядок денний"
- },
- weekLabel: "Тиж",
- allDayText: "Увесь день",
- eventLimitText: function (n) {
- return "+ще " + n + "...";
- },
- noEventsMessage: "Немає подій для відображення"
- };
-
- return uk;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/uz.js b/library/fullcalendar/packages/core/locales/uz.js
deleted file mode 100644
index 24089756d..000000000
--- a/library/fullcalendar/packages/core/locales/uz.js
+++ /dev/null
@@ -1,24 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.uz = factory()));
-}(this, function () { 'use strict';
-
- var uz = {
- code: "uz",
- buttonText: {
- month: "Oy",
- week: "Xafta",
- day: "Kun",
- list: "Kun tartibi"
- },
- allDayText: "Kun bo'yi",
- eventLimitText: function (n) {
- return "+ yana " + n;
- },
- noEventsMessage: "Ko'rsatish uchun voqealar yo'q"
- };
-
- return uz;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/vi.js b/library/fullcalendar/packages/core/locales/vi.js
deleted file mode 100644
index 167ce11d7..000000000
--- a/library/fullcalendar/packages/core/locales/vi.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.vi = factory()));
-}(this, function () { 'use strict';
-
- var vi = {
- code: "vi",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Trước",
- next: "Tiếp",
- today: "Hôm nay",
- month: "Tháng",
- week: "Tuần",
- day: "Ngày",
- list: "Lịch biểu"
- },
- weekLabel: "Tu",
- allDayText: "Cả ngày",
- eventLimitText: function (n) {
- return "+ thêm " + n;
- },
- noEventsMessage: "Không có sự kiện để hiển thị"
- };
-
- return vi;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/zh-cn.js b/library/fullcalendar/packages/core/locales/zh-cn.js
deleted file mode 100644
index 4debbb9e6..000000000
--- a/library/fullcalendar/packages/core/locales/zh-cn.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['zh-cn'] = factory()));
-}(this, function () { 'use strict';
-
- var zhCn = {
- code: "zh-cn",
- week: {
- // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "上月",
- next: "下月",
- today: "今天",
- month: "月",
- week: "周",
- day: "日",
- list: "日程"
- },
- weekLabel: "周",
- allDayText: "全天",
- eventLimitText: function (n) {
- return "另外 " + n + " 个";
- },
- noEventsMessage: "没有事件显示"
- };
-
- return zhCn;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/zh-tw.js b/library/fullcalendar/packages/core/locales/zh-tw.js
deleted file mode 100644
index bc14dcd4b..000000000
--- a/library/fullcalendar/packages/core/locales/zh-tw.js
+++ /dev/null
@@ -1,26 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['zh-tw'] = factory()));
-}(this, function () { 'use strict';
-
- var zhTw = {
- code: "zh-tw",
- buttonText: {
- prev: "上月",
- next: "下月",
- today: "今天",
- month: "月",
- week: "週",
- day: "天",
- list: "活動列表"
- },
- weekLabel: "周",
- allDayText: "整天",
- eventLimitText: '顯示更多',
- noEventsMessage: "没有任何活動"
- };
-
- return zhTw;
-
-}));
diff --git a/library/fullcalendar/packages/core/main.css b/library/fullcalendar/packages/core/main.css
deleted file mode 100644
index 4412a1858..000000000
--- a/library/fullcalendar/packages/core/main.css
+++ /dev/null
@@ -1,1052 +0,0 @@
-@charset "UTF-8";
-.fc {
- direction: ltr;
- text-align: left;
-}
-
-.fc-rtl {
- text-align: right;
-}
-
-body .fc {
- /* extra precedence to overcome jqui */
- font-size: 1em;
-}
-
-/* Colors
---------------------------------------------------------------------------------------------------*/
-.fc-highlight {
- /* when user is selecting cells */
- background: #bce8f1;
- opacity: 0.3;
-}
-
-.fc-bgevent {
- /* default look for background events */
- background: #8fdf82;
- opacity: 0.3;
-}
-
-.fc-nonbusiness {
- /* default look for non-business-hours areas */
- /* will inherit .fc-bgevent's styles */
- background: #d7d7d7;
-}
-
-/* Popover
---------------------------------------------------------------------------------------------------*/
-.fc-popover {
- position: absolute;
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
-}
-
-.fc-popover .fc-header {
- /* TODO: be more consistent with fc-head/fc-body */
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- align-items: center;
- padding: 2px 4px;
-}
-
-.fc-rtl .fc-popover .fc-header {
- flex-direction: row-reverse;
-}
-
-.fc-popover .fc-header .fc-title {
- margin: 0 2px;
-}
-
-.fc-popover .fc-header .fc-close {
- cursor: pointer;
- opacity: 0.65;
- font-size: 1.1em;
-}
-
-/* Misc Reusable Components
---------------------------------------------------------------------------------------------------*/
-.fc-divider {
- border-style: solid;
- border-width: 1px;
-}
-
-hr.fc-divider {
- height: 0;
- margin: 0;
- padding: 0 0 2px;
- /* height is unreliable across browsers, so use padding */
- border-width: 1px 0;
-}
-
-.fc-bg,
-.fc-bgevent-skeleton,
-.fc-highlight-skeleton,
-.fc-mirror-skeleton {
- /* these element should always cling to top-left/right corners */
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
-}
-
-.fc-bg {
- bottom: 0;
- /* strech bg to bottom edge */
-}
-
-.fc-bg table {
- height: 100%;
- /* strech bg to bottom edge */
-}
-
-/* Tables
---------------------------------------------------------------------------------------------------*/
-.fc table {
- width: 100%;
- box-sizing: border-box;
- /* fix scrollbar issue in firefox */
- table-layout: fixed;
- border-collapse: collapse;
- border-spacing: 0;
- font-size: 1em;
- /* normalize cross-browser */
-}
-
-.fc th {
- text-align: center;
-}
-
-.fc th,
-.fc td {
- border-style: solid;
- border-width: 1px;
- padding: 0;
- vertical-align: top;
-}
-
-.fc td.fc-today {
- border-style: double;
- /* overcome neighboring borders */
-}
-
-/* Internal Nav Links
---------------------------------------------------------------------------------------------------*/
-a[data-goto] {
- cursor: pointer;
-}
-
-a[data-goto]:hover {
- text-decoration: underline;
-}
-
-/* Fake Table Rows
---------------------------------------------------------------------------------------------------*/
-.fc .fc-row {
- /* extra precedence to overcome themes forcing a 1px border */
- /* no visible border by default. but make available if need be (scrollbar width compensation) */
- border-style: solid;
- border-width: 0;
-}
-
-.fc-row table {
- /* don't put left/right border on anything within a fake row.
- the outer tbody will worry about this */
- border-left: 0 hidden transparent;
- border-right: 0 hidden transparent;
- /* no bottom borders on rows */
- border-bottom: 0 hidden transparent;
-}
-
-.fc-row:first-child table {
- border-top: 0 hidden transparent;
- /* no top border on first row */
-}
-
-/* Day Row (used within the header and the DayGrid)
---------------------------------------------------------------------------------------------------*/
-.fc-row {
- position: relative;
-}
-
-.fc-row .fc-bg {
- z-index: 1;
-}
-
-/* highlighting cells & background event skeleton */
-.fc-row .fc-bgevent-skeleton,
-.fc-row .fc-highlight-skeleton {
- bottom: 0;
- /* stretch skeleton to bottom of row */
-}
-
-.fc-row .fc-bgevent-skeleton table,
-.fc-row .fc-highlight-skeleton table {
- height: 100%;
- /* stretch skeleton to bottom of row */
-}
-
-.fc-row .fc-highlight-skeleton td,
-.fc-row .fc-bgevent-skeleton td {
- border-color: transparent;
-}
-
-.fc-row .fc-bgevent-skeleton {
- z-index: 2;
-}
-
-.fc-row .fc-highlight-skeleton {
- z-index: 3;
-}
-
-/*
-row content (which contains day/week numbers and events) as well as "mirror" (which contains
-temporary rendered events).
-*/
-.fc-row .fc-content-skeleton {
- position: relative;
- z-index: 4;
- padding-bottom: 2px;
- /* matches the space above the events */
-}
-
-.fc-row .fc-mirror-skeleton {
- z-index: 5;
-}
-
-.fc .fc-row .fc-content-skeleton table,
-.fc .fc-row .fc-content-skeleton td,
-.fc .fc-row .fc-mirror-skeleton td {
- /* see-through to the background below */
- /* extra precedence to prevent theme-provided backgrounds */
- background: none;
- /* in case <td>s are globally styled */
- border-color: transparent;
-}
-
-.fc-row .fc-content-skeleton td,
-.fc-row .fc-mirror-skeleton td {
- /* don't put a border between events and/or the day number */
- border-bottom: 0;
-}
-
-.fc-row .fc-content-skeleton tbody td,
-.fc-row .fc-mirror-skeleton tbody td {
- /* don't put a border between event cells */
- border-top: 0;
-}
-
-/* Scrolling Container
---------------------------------------------------------------------------------------------------*/
-.fc-scroller {
- -webkit-overflow-scrolling: touch;
-}
-
-/* TODO: move to timegrid/daygrid */
-.fc-scroller > .fc-day-grid,
-.fc-scroller > .fc-time-grid {
- position: relative;
- /* re-scope all positions */
- width: 100%;
- /* hack to force re-sizing this inner element when scrollbars appear/disappear */
-}
-
-/* Global Event Styles
---------------------------------------------------------------------------------------------------*/
-.fc-event {
- position: relative;
- /* for resize handle and other inner positioning */
- display: block;
- /* make the <a> tag block */
- font-size: 0.85em;
- line-height: 1.4;
- border-radius: 3px;
- border: 1px solid #3788d8;
-}
-
-.fc-event,
-.fc-event-dot {
- background-color: #3788d8;
- /* default BACKGROUND color */
-}
-
-.fc-event,
-.fc-event:hover {
- color: #fff;
- /* default TEXT color */
- text-decoration: none;
- /* if <a> has an href */
-}
-
-.fc-event[href],
-.fc-event.fc-draggable {
- cursor: pointer;
- /* give events with links and draggable events a hand mouse pointer */
-}
-
-.fc-not-allowed,
-.fc-not-allowed .fc-event {
- /* to override an event's custom cursor */
- cursor: not-allowed;
-}
-
-.fc-event .fc-content {
- position: relative;
- z-index: 2;
-}
-
-/* resizer (cursor AND touch devices) */
-.fc-event .fc-resizer {
- position: absolute;
- z-index: 4;
-}
-
-/* resizer (touch devices) */
-.fc-event .fc-resizer {
- display: none;
-}
-
-.fc-event.fc-allow-mouse-resize .fc-resizer,
-.fc-event.fc-selected .fc-resizer {
- /* only show when hovering or selected (with touch) */
- display: block;
-}
-
-/* hit area */
-.fc-event.fc-selected .fc-resizer:before {
- /* 40x40 touch area */
- content: "";
- position: absolute;
- z-index: 9999;
- /* user of this util can scope within a lower z-index */
- top: 50%;
- left: 50%;
- width: 40px;
- height: 40px;
- margin-left: -20px;
- margin-top: -20px;
-}
-
-/* Event Selection (only for touch devices)
---------------------------------------------------------------------------------------------------*/
-.fc-event.fc-selected {
- z-index: 9999 !important;
- /* overcomes inline z-index */
- box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
-}
-
-.fc-event.fc-selected:after {
- content: "";
- position: absolute;
- z-index: 1;
- /* same z-index as fc-bg, behind text */
- /* overcome the borders */
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px;
- /* darkening effect */
- background: #000;
- opacity: 0.25;
-}
-
-/* Event Dragging
---------------------------------------------------------------------------------------------------*/
-.fc-event.fc-dragging.fc-selected {
- box-shadow: 0 2px 7px rgba(0, 0, 0, 0.3);
-}
-
-.fc-event.fc-dragging:not(.fc-selected) {
- opacity: 0.75;
-}
-
-/* Horizontal Events
---------------------------------------------------------------------------------------------------*/
-/* bigger touch area when selected */
-.fc-h-event.fc-selected:before {
- content: "";
- position: absolute;
- z-index: 3;
- /* below resizers */
- top: -10px;
- bottom: -10px;
- left: 0;
- right: 0;
-}
-
-/* events that are continuing to/from another week. kill rounded corners and butt up against edge */
-.fc-ltr .fc-h-event.fc-not-start,
-.fc-rtl .fc-h-event.fc-not-end {
- margin-left: 0;
- border-left-width: 0;
- padding-left: 1px;
- /* replace the border with padding */
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-
-.fc-ltr .fc-h-event.fc-not-end,
-.fc-rtl .fc-h-event.fc-not-start {
- margin-right: 0;
- border-right-width: 0;
- padding-right: 1px;
- /* replace the border with padding */
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-
-/* resizer (cursor AND touch devices) */
-/* left resizer */
-.fc-ltr .fc-h-event .fc-start-resizer,
-.fc-rtl .fc-h-event .fc-end-resizer {
- cursor: w-resize;
- left: -1px;
- /* overcome border */
-}
-
-/* right resizer */
-.fc-ltr .fc-h-event .fc-end-resizer,
-.fc-rtl .fc-h-event .fc-start-resizer {
- cursor: e-resize;
- right: -1px;
- /* overcome border */
-}
-
-/* resizer (mouse devices) */
-.fc-h-event.fc-allow-mouse-resize .fc-resizer {
- width: 7px;
- top: -1px;
- /* overcome top border */
- bottom: -1px;
- /* overcome bottom border */
-}
-
-/* resizer (touch devices) */
-.fc-h-event.fc-selected .fc-resizer {
- /* 8x8 little dot */
- border-radius: 4px;
- border-width: 1px;
- width: 6px;
- height: 6px;
- border-style: solid;
- border-color: inherit;
- background: #fff;
- /* vertically center */
- top: 50%;
- margin-top: -4px;
-}
-
-/* left resizer */
-.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,
-.fc-rtl .fc-h-event.fc-selected .fc-end-resizer {
- margin-left: -4px;
- /* centers the 8x8 dot on the left edge */
-}
-
-/* right resizer */
-.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,
-.fc-rtl .fc-h-event.fc-selected .fc-start-resizer {
- margin-right: -4px;
- /* centers the 8x8 dot on the right edge */
-}
-
-/* DayGrid events
-----------------------------------------------------------------------------------------------------
-We use the full "fc-day-grid-event" class instead of using descendants because the event won't
-be a descendant of the grid when it is being dragged.
-*/
-.fc-day-grid-event {
- margin: 1px 2px 0;
- /* spacing between events and edges */
- padding: 0 1px;
-}
-
-tr:first-child > td > .fc-day-grid-event {
- margin-top: 2px;
- /* a little bit more space before the first event */
-}
-
-.fc-mirror-skeleton tr:first-child > td > .fc-day-grid-event {
- margin-top: 0;
- /* except for mirror skeleton */
-}
-
-.fc-day-grid-event .fc-content {
- /* force events to be one-line tall */
- white-space: nowrap;
- overflow: hidden;
-}
-
-.fc-day-grid-event .fc-time {
- font-weight: bold;
-}
-
-/* resizer (cursor devices) */
-/* left resizer */
-.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,
-.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer {
- margin-left: -2px;
- /* to the day cell's edge */
-}
-
-/* right resizer */
-.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,
-.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer {
- margin-right: -2px;
- /* to the day cell's edge */
-}
-
-/* Event Limiting
---------------------------------------------------------------------------------------------------*/
-/* "more" link that represents hidden events */
-a.fc-more {
- margin: 1px 3px;
- font-size: 0.85em;
- cursor: pointer;
- text-decoration: none;
-}
-
-a.fc-more:hover {
- text-decoration: underline;
-}
-
-.fc-limited {
- /* rows and cells that are hidden because of a "more" link */
- display: none;
-}
-
-/* popover that appears when "more" link is clicked */
-.fc-day-grid .fc-row {
- z-index: 1;
- /* make the "more" popover one higher than this */
-}
-
-.fc-more-popover {
- z-index: 2;
- width: 220px;
-}
-
-.fc-more-popover .fc-event-container {
- padding: 10px;
-}
-
-/* Now Indicator
---------------------------------------------------------------------------------------------------*/
-.fc-now-indicator {
- position: absolute;
- border: 0 solid red;
-}
-
-/* Utilities
---------------------------------------------------------------------------------------------------*/
-.fc-unselectable {
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-touch-callout: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-
-/*
-TODO: more distinction between this file and common.css
-*/
-/* Colors
---------------------------------------------------------------------------------------------------*/
-.fc-unthemed th,
-.fc-unthemed td,
-.fc-unthemed thead,
-.fc-unthemed tbody,
-.fc-unthemed .fc-divider,
-.fc-unthemed .fc-row,
-.fc-unthemed .fc-content,
-.fc-unthemed .fc-popover,
-.fc-unthemed .fc-list-view,
-.fc-unthemed .fc-list-heading td {
- border-color: #ddd;
-}
-
-.fc-unthemed .fc-popover {
- background-color: #fff;
-}
-
-.fc-unthemed .fc-divider,
-.fc-unthemed .fc-popover .fc-header,
-.fc-unthemed .fc-list-heading td {
- background: #eee;
-}
-
-.fc-unthemed td.fc-today {
- background: #fcf8e3;
-}
-
-.fc-unthemed .fc-disabled-day {
- background: #d7d7d7;
- opacity: 0.3;
-}
-
-/* Icons
---------------------------------------------------------------------------------------------------
-from https://feathericons.com/ and built with IcoMoon
-*/
-@font-face {
- font-family: "fcicons";
- 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");
- font-weight: normal;
- font-style: normal;
-}
-.fc-icon {
- /* use !important to prevent issues with browser extensions that change fonts */
- font-family: "fcicons" !important;
- speak: none;
- font-style: normal;
- font-weight: normal;
- font-variant: normal;
- text-transform: none;
- line-height: 1;
- /* Better Font Rendering =========== */
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-.fc-icon-chevron-left:before {
- content: "";
-}
-
-.fc-icon-chevron-right:before {
- content: "";
-}
-
-.fc-icon-chevrons-left:before {
- content: "";
-}
-
-.fc-icon-chevrons-right:before {
- content: "";
-}
-
-.fc-icon-minus-square:before {
- content: "";
-}
-
-.fc-icon-plus-square:before {
- content: "";
-}
-
-.fc-icon-x:before {
- content: "";
-}
-
-.fc-icon {
- display: inline-block;
- width: 1em;
- height: 1em;
- text-align: center;
-}
-
-/* Buttons
---------------------------------------------------------------------------------------------------
-Lots taken from Flatly (MIT): https://bootswatch.com/4/flatly/bootstrap.css
-*/
-/* reset */
-.fc-button {
- border-radius: 0;
- overflow: visible;
- text-transform: none;
- margin: 0;
- font-family: inherit;
- font-size: inherit;
- line-height: inherit;
-}
-
-.fc-button:focus {
- outline: 1px dotted;
- outline: 5px auto -webkit-focus-ring-color;
-}
-
-.fc-button {
- -webkit-appearance: button;
-}
-
-.fc-button:not(:disabled) {
- cursor: pointer;
-}
-
-.fc-button::-moz-focus-inner {
- padding: 0;
- border-style: none;
-}
-
-/* theme */
-.fc-button {
- display: inline-block;
- font-weight: 400;
- color: #212529;
- text-align: center;
- vertical-align: middle;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- background-color: transparent;
- border: 1px solid transparent;
- padding: 0.4em 0.65em;
- font-size: 1em;
- line-height: 1.5;
- border-radius: 0.25em;
-}
-
-.fc-button:hover {
- color: #212529;
- text-decoration: none;
-}
-
-.fc-button:focus {
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25);
-}
-
-.fc-button:disabled {
- opacity: 0.65;
-}
-
-/* "primary" coloring */
-.fc-button-primary {
- color: #fff;
- background-color: #2C3E50;
- border-color: #2C3E50;
-}
-
-.fc-button-primary:hover {
- color: #fff;
- background-color: #1e2b37;
- border-color: #1a252f;
-}
-
-.fc-button-primary:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
-}
-
-.fc-button-primary:disabled {
- color: #fff;
- background-color: #2C3E50;
- border-color: #2C3E50;
-}
-
-.fc-button-primary:not(:disabled):active,
-.fc-button-primary:not(:disabled).fc-button-active {
- color: #fff;
- background-color: #1a252f;
- border-color: #151e27;
-}
-
-.fc-button-primary:not(:disabled):active:focus,
-.fc-button-primary:not(:disabled).fc-button-active:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
-}
-
-/* icons within buttons */
-.fc-button .fc-icon {
- vertical-align: middle;
- font-size: 1.5em;
-}
-
-/* Buttons Groups
---------------------------------------------------------------------------------------------------*/
-.fc-button-group {
- position: relative;
- display: -webkit-inline-box;
- display: -ms-inline-flexbox;
- display: inline-flex;
- vertical-align: middle;
-}
-
-.fc-button-group > .fc-button {
- position: relative;
- -webkit-box-flex: 1;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
-}
-
-.fc-button-group > .fc-button:hover {
- z-index: 1;
-}
-
-.fc-button-group > .fc-button:focus,
-.fc-button-group > .fc-button:active,
-.fc-button-group > .fc-button.fc-button-active {
- z-index: 1;
-}
-
-.fc-button-group > .fc-button:not(:first-child) {
- margin-left: -1px;
-}
-
-.fc-button-group > .fc-button:not(:last-child) {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-
-.fc-button-group > .fc-button:not(:first-child) {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-
-/* Popover
---------------------------------------------------------------------------------------------------*/
-.fc-unthemed .fc-popover {
- border-width: 1px;
- border-style: solid;
-}
-
-/* List View
---------------------------------------------------------------------------------------------------*/
-.fc-unthemed .fc-list-item:hover td {
- background-color: #f5f5f5;
-}
-
-/* Toolbar
---------------------------------------------------------------------------------------------------*/
-.fc-toolbar {
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.fc-toolbar.fc-header-toolbar {
- margin-bottom: 1.5em;
-}
-
-.fc-toolbar.fc-footer-toolbar {
- margin-top: 1.5em;
-}
-
-/* inner content */
-.fc-toolbar > * > :not(:first-child) {
- margin-left: 0.75em;
-}
-
-.fc-toolbar h2 {
- font-size: 1.75em;
- margin: 0;
-}
-
-/* View Structure
---------------------------------------------------------------------------------------------------*/
-.fc-view-container {
- position: relative;
-}
-
-/* undo twitter bootstrap's box-sizing rules. normalizes positioning techniques */
-/* don't do this for the toolbar because we'll want bootstrap to style those buttons as some pt */
-.fc-view-container *,
-.fc-view-container *:before,
-.fc-view-container *:after {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
-}
-
-.fc-view,
-.fc-view > table {
- /* so dragged elements can be above the view's main element */
- position: relative;
- z-index: 1;
-}
-
-@media print {
- .fc {
- max-width: 100% !important;
- }
-
- /* Global Event Restyling
- --------------------------------------------------------------------------------------------------*/
- .fc-event {
- background: #fff !important;
- color: #000 !important;
- page-break-inside: avoid;
- }
-
- .fc-event .fc-resizer {
- display: none;
- }
-
- /* Table & Day-Row Restyling
- --------------------------------------------------------------------------------------------------*/
- .fc th,
-.fc td,
-.fc hr,
-.fc thead,
-.fc tbody,
-.fc-row {
- border-color: #ccc !important;
- background: #fff !important;
- }
-
- /* kill the overlaid, absolutely-positioned components */
- /* common... */
- .fc-bg,
-.fc-bgevent-skeleton,
-.fc-highlight-skeleton,
-.fc-mirror-skeleton,
-.fc-bgevent-container,
-.fc-business-container,
-.fc-highlight-container,
-.fc-mirror-container {
- display: none;
- }
-
- /* don't force a min-height on rows (for DayGrid) */
- .fc tbody .fc-row {
- height: auto !important;
- /* undo height that JS set in distributeHeight */
- min-height: 0 !important;
- /* undo the min-height from each view's specific stylesheet */
- }
-
- .fc tbody .fc-row .fc-content-skeleton {
- position: static;
- /* undo .fc-rigid */
- padding-bottom: 0 !important;
- /* use a more border-friendly method for this... */
- }
-
- .fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td {
- /* only works in newer browsers */
- padding-bottom: 1em;
- /* ...gives space within the skeleton. also ensures min height in a way */
- }
-
- .fc tbody .fc-row .fc-content-skeleton table {
- /* provides a min-height for the row, but only effective for IE, which exaggerates this value,
- making it look more like 3em. for other browers, it will already be this tall */
- height: 1em;
- }
-
- /* Undo month-view event limiting. Display all events and hide the "more" links
- --------------------------------------------------------------------------------------------------*/
- .fc-more-cell,
-.fc-more {
- display: none !important;
- }
-
- .fc tr.fc-limited {
- display: table-row !important;
- }
-
- .fc td.fc-limited {
- display: table-cell !important;
- }
-
- .fc-popover {
- display: none;
- /* never display the "more.." popover in print mode */
- }
-
- /* TimeGrid Restyling
- --------------------------------------------------------------------------------------------------*/
- /* undo the min-height 100% trick used to fill the container's height */
- .fc-time-grid {
- min-height: 0 !important;
- }
-
- /* don't display the side axis at all ("all-day" and time cells) */
- .fc-timeGrid-view .fc-axis {
- display: none;
- }
-
- /* don't display the horizontal lines */
- .fc-slats,
-.fc-time-grid hr {
- /* this hr is used when height is underused and needs to be filled */
- display: none !important;
- /* important overrides inline declaration */
- }
-
- /* let the container that holds the events be naturally positioned and create real height */
- .fc-time-grid .fc-content-skeleton {
- position: static;
- }
-
- /* in case there are no events, we still want some height */
- .fc-time-grid .fc-content-skeleton table {
- height: 4em;
- }
-
- /* kill the horizontal spacing made by the event container. event margins will be done below */
- .fc-time-grid .fc-event-container {
- margin: 0 !important;
- }
-
- /* TimeGrid *Event* Restyling
- --------------------------------------------------------------------------------------------------*/
- /* naturally position events, vertically stacking them */
- .fc-time-grid .fc-event {
- position: static !important;
- margin: 3px 2px !important;
- }
-
- /* for events that continue to a future day, give the bottom border back */
- .fc-time-grid .fc-event.fc-not-end {
- border-bottom-width: 1px !important;
- }
-
- /* indicate the event continues via "..." text */
- .fc-time-grid .fc-event.fc-not-end:after {
- content: "...";
- }
-
- /* for events that are continuations from previous days, give the top border back */
- .fc-time-grid .fc-event.fc-not-start {
- border-top-width: 1px !important;
- }
-
- /* indicate the event is a continuation via "..." text */
- .fc-time-grid .fc-event.fc-not-start:before {
- content: "...";
- }
-
- /* time */
- /* undo a previous declaration and let the time text span to a second line */
- .fc-time-grid .fc-event .fc-time {
- white-space: normal !important;
- }
-
- /* hide the the time that is normally displayed... */
- .fc-time-grid .fc-event .fc-time span {
- display: none;
- }
-
- /* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */
- .fc-time-grid .fc-event .fc-time:after {
- content: attr(data-full);
- }
-
- /* Vertical Scroller & Containers
- --------------------------------------------------------------------------------------------------*/
- /* kill the scrollbars and allow natural height */
- .fc-scroller,
-.fc-day-grid-container,
-.fc-time-grid-container {
- /* */
- overflow: visible !important;
- height: auto !important;
- }
-
- /* kill the horizontal border/padding used to compensate for scrollbars */
- .fc-row {
- border: 0 !important;
- margin: 0 !important;
- }
-
- /* Button Controls
- --------------------------------------------------------------------------------------------------*/
- .fc-button-group,
-.fc button {
- display: none;
- /* don't display any button-related controls */
- }
-}
diff --git a/library/fullcalendar/packages/core/main.d.ts b/library/fullcalendar/packages/core/main.d.ts
deleted file mode 100644
index b6459021c..000000000
--- a/library/fullcalendar/packages/core/main.d.ts
+++ /dev/null
@@ -1,2736 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-// ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/core' {
- export const version = "<%= version %>";
- export { OptionsInput } from '@fullcalendar/core/types/input-types';
- export { EventInput, EventDef, EventDefHash, EventInstance, EventInstanceHash, parseEventDef, createEventInstance, EventTuple } from '@fullcalendar/core/structs/event';
- export { BusinessHoursInput, parseBusinessHours } from '@fullcalendar/core/structs/business-hours';
- export { applyAll, debounce, padStart, isInt, capitaliseFirstLetter, parseFieldSpecs, compareByFieldSpecs, compareByFieldSpec, flexibleCompare, computeVisibleDayRange, refineProps, matchCellWidths, uncompensateScroll, compensateScroll, subtractInnerElHeight, isMultiDayRange, distributeHeight, undistributeHeight, preventSelection, allowSelection, preventContextMenu, allowContextMenu, compareNumbers, enableCursor, disableCursor, diffDates } from '@fullcalendar/core/util/misc';
- export { htmlEscape, cssToStr } from '@fullcalendar/core/util/html';
- export { removeExact, isArraysEqual } from '@fullcalendar/core/util/array';
- export { memoize, memoizeOutput } from '@fullcalendar/core/util/memoize';
- export { memoizeRendering, MemoizedRendering } from '@fullcalendar/core/component/memoized-rendering';
- export { intersectRects, Rect, pointInsideRect, constrainPoint, getRectCenter, diffPoints, Point, translateRect } from '@fullcalendar/core/util/geom';
- export { mapHash, filterHash, isPropsEqual } from '@fullcalendar/core/util/object';
- export { findElements, findChildren, htmlToElement, createElement, insertAfterElement, prependToElement, removeElement, appendToElement, applyStyle, applyStyleProp, elementMatches, elementClosest, forceClassName } from '@fullcalendar/core/util/dom-manip';
- export { EventStore, filterEventStoreDefs, createEmptyEventStore, mergeEventStores, getRelevantEvents, eventTupleToStore } from '@fullcalendar/core/structs/event-store';
- export { EventUiHash, EventUi, processScopedUiProps, combineEventUis } from '@fullcalendar/core/component/event-ui';
- export { default as Splitter, SplittableProps } from '@fullcalendar/core/component/event-splitting';
- export { buildGotoAnchorHtml, getAllDayHtml, getDayClasses } from '@fullcalendar/core/component/date-rendering';
- export { preventDefault, listenBySelector, whenTransitionDone } from '@fullcalendar/core/util/dom-event';
- export { computeInnerRect, computeEdges, computeHeightAndMargins, getClippingParents, computeClippingRect, computeRect } from '@fullcalendar/core/util/dom-geom';
- export { unpromisify } from '@fullcalendar/core/util/promise';
- export { default as EmitterMixin, EmitterInterface } from '@fullcalendar/core/common/EmitterMixin';
- export { DateRange, rangeContainsMarker, intersectRanges, rangesEqual, rangesIntersect, rangeContainsRange } from '@fullcalendar/core/datelib/date-range';
- export { default as Mixin } from '@fullcalendar/core/common/Mixin';
- export { default as PositionCache } from '@fullcalendar/core/common/PositionCache';
- export { default as ScrollComponent, ScrollbarWidths } from '@fullcalendar/core/common/ScrollComponent';
- export { ScrollController, ElementScrollController, WindowScrollController } from '@fullcalendar/core/common/scroll-controller';
- export { default as Theme } from '@fullcalendar/core/theme/Theme';
- export { default as Component, ComponentContext } from '@fullcalendar/core/component/Component';
- export { default as DateComponent, Seg, EventSegUiInteractionState } from '@fullcalendar/core/component/DateComponent';
- export { default as Calendar, DatePointTransform, DateSpanTransform, DateSelectionApi } from '@fullcalendar/core/Calendar';
- export { default as View, ViewProps } from '@fullcalendar/core/View';
- export { default as FgEventRenderer, buildSegCompareObj } from '@fullcalendar/core/component/renderers/FgEventRenderer';
- export { default as FillRenderer } from '@fullcalendar/core/component/renderers/FillRenderer';
- export { default as DateProfileGenerator, DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- export { ViewDef } from '@fullcalendar/core/structs/view-def';
- export { ViewSpec } from '@fullcalendar/core/structs/view-spec';
- export { DateSpan, DateSpanApi, DatePointApi, isDateSpansEqual } from '@fullcalendar/core/structs/date-span';
- export { DateMarker, addDays, startOfDay, addMs, addWeeks, diffWeeks, diffWholeWeeks, diffWholeDays, diffDayAndTime, diffDays, isValidDate } from '@fullcalendar/core/datelib/marker';
- export { Duration, createDuration, isSingleDay, multiplyDuration, addDurations, asRoughMinutes, asRoughSeconds, asRoughMs, wholeDivideDurations, greatestDurationDenominator } from '@fullcalendar/core/datelib/duration';
- export { DateEnv, DateMarkerMeta } from '@fullcalendar/core/datelib/env';
- export { DateFormatter, createFormatter, VerboseFormattingArg, formatIsoTimeString } from '@fullcalendar/core/datelib/formatting';
- export { NamedTimeZoneImpl } from '@fullcalendar/core/datelib/timezone';
- export { parse as parseMarker } from '@fullcalendar/core/datelib/parsing';
- export { EventSourceDef, EventSource, EventSourceHash } from '@fullcalendar/core/structs/event-source';
- export { Interaction, InteractionSettings, interactionSettingsToStore, interactionSettingsStore, InteractionSettingsStore } from '@fullcalendar/core/interactions/interaction';
- export { PointerDragEvent } from '@fullcalendar/core/interactions/pointer';
- export { Hit } from '@fullcalendar/core/interactions/hit';
- export { dateSelectionJoinTransformer } from '@fullcalendar/core/interactions/date-selecting';
- export { eventDragMutationMassager, EventDropTransformers } from '@fullcalendar/core/interactions/event-dragging';
- export { EventResizeJoinTransforms } from '@fullcalendar/core/interactions/event-resizing';
- export { default as ElementDragging } from '@fullcalendar/core/interactions/ElementDragging';
- export { formatDate, formatRange } from '@fullcalendar/core/formatting-api';
- export { globalDefaults, config } from '@fullcalendar/core/options';
- export { RecurringType, ParsedRecurring } from '@fullcalendar/core/structs/recurring-event';
- export { DragMetaInput, DragMeta, parseDragMeta } from '@fullcalendar/core/structs/drag-meta';
- export { createPlugin, PluginDef, PluginDefInput, ViewPropsTransformer, ViewContainerModifier } from '@fullcalendar/core/plugin-system';
- export { reducerFunc, Action, CalendarState } from '@fullcalendar/core/reducers/types';
- export { CalendarComponentProps } from '@fullcalendar/core/CalendarComponent';
- export { default as DayHeader } from '@fullcalendar/core/common/DayHeader';
- export { computeFallbackHeaderFormat, renderDateCell } from '@fullcalendar/core/common/table-utils';
- export { default as DaySeries } from '@fullcalendar/core/common/DaySeries';
- export { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
- export { EventRenderRange, sliceEventStore, hasBgRendering, getElSeg, computeEventDraggable, computeEventStartResizable, computeEventEndResizable } from '@fullcalendar/core/component/event-rendering';
- export { default as DayTable, DayTableSeg, DayTableCell } from '@fullcalendar/core/common/DayTable';
- export { default as Slicer, SlicedProps } from '@fullcalendar/core/common/slicing-utils';
- export { EventMutation, applyMutationToEventStore } from '@fullcalendar/core/structs/event-mutation';
- export { Constraint, ConstraintInput, AllowFunc, isPropsValid, isInteractionValid } from '@fullcalendar/core/validation';
- export { default as EventApi } from '@fullcalendar/core/api/EventApi';
- export { default as requestJson } from '@fullcalendar/core/util/requestJson';
-}
-
-declare module '@fullcalendar/core/types/input-types' {
- import View from '@fullcalendar/core/View';
- import { EventSourceInput, EventInputTransformer } from '@fullcalendar/core/structs/event-source';
- import { Duration, DurationInput } from '@fullcalendar/core/datelib/duration';
- import { DateInput } from '@fullcalendar/core/datelib/env';
- import { FormatterInput } from '@fullcalendar/core/datelib/formatting';
- import { DateRangeInput } from '@fullcalendar/core/datelib/date-range';
- import { BusinessHoursInput } from '@fullcalendar/core/structs/business-hours';
- import EventApi from '@fullcalendar/core/api/EventApi';
- import { AllowFunc, ConstraintInput, OverlapFunc } from '@fullcalendar/core/validation';
- import { PluginDef } from '@fullcalendar/core/plugin-system';
- import { LocaleSingularArg, RawLocale } from '@fullcalendar/core/datelib/locale';
- export interface ToolbarInput {
- left?: string;
- center?: string;
- right?: string;
- }
- export interface CustomButtonInput {
- text: string;
- icon?: string;
- themeIcon?: string;
- bootstrapFontAwesome?: string;
- click(element: HTMLElement): void;
- }
- export interface ButtonIconsInput {
- prev?: string;
- next?: string;
- prevYear?: string;
- nextYear?: string;
- }
- export interface ButtonTextCompoundInput {
- prev?: string;
- next?: string;
- prevYear?: string;
- nextYear?: string;
- today?: string;
- month?: string;
- week?: string;
- day?: string;
- [viewId: string]: string | undefined;
- }
- export interface EventSegment {
- event: EventApi;
- start: Date;
- end: Date;
- isStart: boolean;
- isEnd: boolean;
- }
- export interface CellInfo {
- date: Date;
- dayEl: HTMLElement;
- moreEl: HTMLElement;
- segs: EventSegment[];
- hiddenSegs: EventSegment[];
- }
- export interface DropInfo {
- start: Date;
- end: Date;
- }
- export type EventHandlerName = '_init' | 'selectAllow' | 'eventAllow' | 'eventDataTransform' | 'datesRender' | 'datesDestroy' | 'dayRender' | 'windowResize' | 'dateClick' | 'eventClick' | 'eventMouseEnter' | 'eventMouseLeave' | 'select' | 'unselect' | 'loading' | 'eventRender' | 'eventPositioned' | '_eventsPositioned' | 'eventDestroy' | 'eventDragStart' | 'eventDragStop' | 'eventDrop' | '_destroyed' | 'drop' | 'eventResizeStart' | 'eventResizeStop' | 'eventResize' | 'eventReceive' | 'eventLeave' | 'viewSkeletonRender' | 'viewSkeletonDestroy' | '_noEventDrop' | '_noEventResize' | 'eventLimitClick' | 'resourceRender';
- export type EventHandlerArgs<T extends EventHandlerName> = Parameters<Extract<OptionsInput[T], (...args: any[]) => any>>;
- export type EventHandlerArg<T extends EventHandlerName> = EventHandlerArgs<T>[0];
- export interface OptionsInputBase {
- header?: boolean | ToolbarInput;
- footer?: boolean | ToolbarInput;
- customButtons?: {
- [name: string]: CustomButtonInput;
- };
- buttonIcons?: boolean | ButtonIconsInput;
- themeSystem?: 'standard' | string;
- bootstrapFontAwesome?: boolean | ButtonIconsInput;
- firstDay?: number;
- dir?: 'ltr' | 'rtl' | 'auto';
- weekends?: boolean;
- hiddenDays?: number[];
- fixedWeekCount?: boolean;
- weekNumbers?: boolean;
- weekNumbersWithinDays?: boolean;
- weekNumberCalculation?: 'local' | 'ISO' | ((m: Date) => number);
- businessHours?: BusinessHoursInput;
- showNonCurrentDates?: boolean;
- height?: number | 'auto' | 'parent' | (() => number);
- contentHeight?: number | 'auto' | (() => number);
- aspectRatio?: number;
- handleWindowResize?: boolean;
- windowResizeDelay?: number;
- eventLimit?: boolean | number;
- eventLimitClick?: 'popover' | 'week' | 'day' | 'timeGridWeek' | 'timeGridDay' | string | ((arg: {
- date: Date;
- allDay: boolean;
- dayEl: HTMLElement;
- moreEl: HTMLElement;
- segs: any[];
- hiddenSegs: any[];
- jsEvent: MouseEvent;
- view: View;
- }) => void);
- timeZone?: string | boolean;
- now?: DateInput | (() => DateInput);
- defaultView?: string;
- allDaySlot?: boolean;
- allDayText?: string;
- slotDuration?: DurationInput;
- slotLabelFormat?: FormatterInput;
- slotLabelInterval?: DurationInput;
- snapDuration?: DurationInput;
- scrollTime?: DurationInput;
- minTime?: DurationInput;
- maxTime?: DurationInput;
- slotEventOverlap?: boolean;
- listDayFormat?: FormatterInput | boolean;
- listDayAltFormat?: FormatterInput | boolean;
- noEventsMessage?: string;
- defaultDate?: DateInput;
- nowIndicator?: boolean;
- visibleRange?: ((currentDate: Date) => DateRangeInput) | DateRangeInput;
- validRange?: DateRangeInput;
- dateIncrement?: DurationInput;
- dateAlignment?: string;
- duration?: DurationInput;
- dayCount?: number;
- locales?: RawLocale[];
- locale?: LocaleSingularArg;
- eventTimeFormat?: FormatterInput;
- columnHeader?: boolean;
- columnHeaderFormat?: FormatterInput;
- columnHeaderText?: string | ((date: DateInput) => string);
- columnHeaderHtml?: string | ((date: DateInput) => string);
- titleFormat?: FormatterInput;
- weekLabel?: string;
- displayEventTime?: boolean;
- displayEventEnd?: boolean;
- eventLimitText?: string | ((eventCnt: number) => string);
- dayPopoverFormat?: FormatterInput;
- navLinks?: boolean;
- navLinkDayClick?: string | ((date: Date, jsEvent: Event) => void);
- navLinkWeekClick?: string | ((weekStart: any, jsEvent: Event) => void);
- selectable?: boolean;
- selectMirror?: boolean;
- unselectAuto?: boolean;
- unselectCancel?: string;
- defaultAllDayEventDuration?: DurationInput;
- defaultTimedEventDuration?: DurationInput;
- cmdFormatter?: string;
- defaultRangeSeparator?: string;
- selectConstraint?: ConstraintInput;
- selectOverlap?: boolean | OverlapFunc;
- selectAllow?: AllowFunc;
- editable?: boolean;
- eventStartEditable?: boolean;
- eventDurationEditable?: boolean;
- eventConstraint?: ConstraintInput;
- eventOverlap?: boolean | OverlapFunc;
- eventAllow?: AllowFunc;
- eventClassName?: string[] | string;
- eventClassNames?: string[] | string;
- eventBackgroundColor?: string;
- eventBorderColor?: string;
- eventTextColor?: string;
- eventColor?: string;
- events?: EventSourceInput;
- eventSources?: EventSourceInput[];
- allDayDefault?: boolean;
- startParam?: string;
- endParam?: string;
- lazyFetching?: boolean;
- nextDayThreshold?: DurationInput;
- eventOrder?: string | Array<((a: EventApi, b: EventApi) => number) | (string | ((a: EventApi, b: EventApi) => number))>;
- rerenderDelay?: number | null;
- dragRevertDuration?: number;
- dragScroll?: boolean;
- longPressDelay?: number;
- eventLongPressDelay?: number;
- droppable?: boolean;
- dropAccept?: string | ((draggable: any) => boolean);
- eventDataTransform?: EventInputTransformer;
- allDayMaintainDuration?: boolean;
- eventResizableFromStart?: boolean;
- timeGridEventMinHeight?: number;
- allDayHtml?: string;
- eventDragMinDistance?: number;
- eventSourceFailure?: any;
- eventSourceSuccess?: any;
- forceEventDuration?: boolean;
- progressiveEventRendering?: boolean;
- selectLongPressDelay?: number;
- selectMinDistance?: number;
- timeZoneParam?: string;
- titleRangeSeparator?: string;
- datesRender?(arg: {
- view: View;
- el: HTMLElement;
- }): void;
- datesDestroy?(arg: {
- view: View;
- el: HTMLElement;
- }): void;
- dayRender?(arg: {
- view: View;
- date: Date;
- allDay?: boolean;
- el: HTMLElement;
- }): void;
- windowResize?(view: View): void;
- dateClick?(arg: {
- date: Date;
- dateStr: string;
- allDay: boolean;
- resource?: any;
- dayEl: HTMLElement;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- eventClick?(arg: {
- el: HTMLElement;
- event: EventApi;
- jsEvent: MouseEvent;
- view: View;
- }): boolean | void;
- eventMouseEnter?(arg: {
- el: HTMLElement;
- event: EventApi;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- eventMouseLeave?(arg: {
- el: HTMLElement;
- event: EventApi;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- select?(arg: {
- start: Date;
- end: Date;
- startStr: string;
- endStr: string;
- allDay: boolean;
- resource?: any;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- unselect?(arg: {
- view: View;
- jsEvent: Event;
- }): void;
- loading?(isLoading: boolean): void;
- eventRender?(arg: {
- isMirror: boolean;
- isStart: boolean;
- isEnd: boolean;
- event: EventApi;
- el: HTMLElement;
- view: View;
- }): void;
- eventPositioned?(arg: {
- isMirror: boolean;
- isStart: boolean;
- isEnd: boolean;
- event: EventApi;
- el: HTMLElement;
- view: View;
- }): void;
- _eventsPositioned?(arg: {
- view: View;
- }): void;
- eventDestroy?(arg: {
- isMirror: boolean;
- event: EventApi;
- el: HTMLElement;
- view: View;
- }): void;
- eventDragStart?(arg: {
- event: EventApi;
- el: HTMLElement;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- eventDragStop?(arg: {
- event: EventApi;
- el: HTMLElement;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- eventDrop?(arg: {
- el: HTMLElement;
- event: EventApi;
- oldEvent: EventApi;
- delta: Duration;
- revert: () => void;
- jsEvent: Event;
- view: View;
- }): void;
- eventResizeStart?(arg: {
- el: HTMLElement;
- event: EventApi;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- eventResizeStop?(arg: {
- el: HTMLElement;
- event: EventApi;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- eventResize?(arg: {
- el: HTMLElement;
- startDelta: Duration;
- endDelta: Duration;
- prevEvent: EventApi;
- event: EventApi;
- revert: () => void;
- jsEvent: Event;
- view: View;
- }): void;
- drop?(arg: {
- date: Date;
- dateStr: string;
- allDay: boolean;
- draggedEl: HTMLElement;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- eventReceive?(arg: {
- event: EventApi;
- draggedEl: HTMLElement;
- view: View;
- }): void;
- eventLeave?(arg: {
- draggedEl: HTMLElement;
- event: EventApi;
- view: View;
- }): void;
- viewSkeletonRender?(arg: {
- el: HTMLElement;
- view: View;
- }): void;
- viewSkeletonDestroy?(arg: {
- el: HTMLElement;
- view: View;
- }): void;
- _destroyed?(): void;
- _init?(): void;
- _noEventDrop?(): void;
- _noEventResize?(): void;
- resourceRender?(arg: {
- resource: any;
- el: HTMLElement;
- view: View;
- }): void;
- }
- export interface ViewOptionsInput extends OptionsInputBase {
- type?: string;
- buttonText?: string;
- }
- export interface OptionsInput extends OptionsInputBase {
- buttonText?: ButtonTextCompoundInput;
- views?: {
- [viewId: string]: ViewOptionsInput;
- };
- plugins?: (PluginDef | string)[];
- }
-}
-
-declare module '@fullcalendar/core/structs/event' {
- import { DateInput } from '@fullcalendar/core/datelib/env';
- import Calendar from '@fullcalendar/core/Calendar';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { UnscopedEventUiInput, EventUi } from '@fullcalendar/core/component/event-ui';
- export type EventRenderingChoice = '' | 'background' | 'inverse-background' | 'none';
- export interface EventNonDateInput extends UnscopedEventUiInput {
- id?: string | number;
- groupId?: string | number;
- title?: string;
- url?: string;
- rendering?: EventRenderingChoice;
- extendedProps?: object;
- [extendedProp: string]: any;
- }
- export interface EventDateInput {
- start?: DateInput;
- end?: DateInput;
- date?: DateInput;
- allDay?: boolean;
- }
- export type EventInput = EventNonDateInput & EventDateInput;
- export interface EventDef {
- defId: string;
- sourceId: string;
- publicId: string;
- groupId: string;
- allDay: boolean;
- hasEnd: boolean;
- recurringDef: {
- typeId: number;
- typeData: any;
- duration: Duration | null;
- } | null;
- title: string;
- url: string;
- rendering: EventRenderingChoice;
- ui: EventUi;
- extendedProps: any;
- }
- export interface EventInstance {
- instanceId: string;
- defId: string;
- range: DateRange;
- forcedStartTzo: number | null;
- forcedEndTzo: number | null;
- }
- export interface EventTuple {
- def: EventDef;
- instance: EventInstance | null;
- }
- export type EventInstanceHash = {
- [instanceId: string]: EventInstance;
- };
- export type EventDefHash = {
- [defId: string]: EventDef;
- };
- export const NON_DATE_PROPS: {
- id: StringConstructor;
- groupId: StringConstructor;
- title: StringConstructor;
- url: StringConstructor;
- rendering: StringConstructor;
- extendedProps: any;
- };
- export const DATE_PROPS: {
- start: any;
- date: any;
- end: any;
- allDay: any;
- };
- export function parseEvent(raw: EventInput, sourceId: string, calendar: Calendar, allowOpenRange?: boolean): EventTuple | null;
- export function parseEventDef(raw: EventNonDateInput, sourceId: string, allDay: boolean, hasEnd: boolean, calendar: Calendar): EventDef;
- export type eventDefParserFunc = (def: EventDef, props: any, leftovers: any) => void;
- export function createEventInstance(defId: string, range: DateRange, forcedStartTzo?: number, forcedEndTzo?: number): EventInstance;
-}
-
-declare module '@fullcalendar/core/structs/business-hours' {
- import Calendar from '@fullcalendar/core/Calendar';
- import { EventInput } from '@fullcalendar/core/structs/event';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- export type BusinessHoursInput = boolean | EventInput | EventInput[];
- export function parseBusinessHours(input: BusinessHoursInput, calendar: Calendar): EventStore;
-}
-
-declare module '@fullcalendar/core/util/misc' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { DateEnv } from '@fullcalendar/core/datelib/env';
- import { DateRange, OpenDateRange } from '@fullcalendar/core/datelib/date-range';
- export function compensateScroll(rowEl: HTMLElement, scrollbarWidths: any): void;
- export function uncompensateScroll(rowEl: HTMLElement): void;
- export function disableCursor(): void;
- export function enableCursor(): void;
- export function distributeHeight(els: HTMLElement[], availableHeight: any, shouldRedistribute: any): void;
- export function undistributeHeight(els: HTMLElement[]): void;
- export function matchCellWidths(els: HTMLElement[]): number;
- export function subtractInnerElHeight(outerEl: HTMLElement, innerEl: HTMLElement): number;
- export function preventSelection(el: HTMLElement): void;
- export function allowSelection(el: HTMLElement): void;
- export function preventContextMenu(el: HTMLElement): void;
- export function allowContextMenu(el: HTMLElement): void;
- export function parseFieldSpecs(input: any): any[];
- export function compareByFieldSpecs(obj0: any, obj1: any, fieldSpecs: any): any;
- export function compareByFieldSpec(obj0: any, obj1: any, fieldSpec: any): any;
- export function flexibleCompare(a: any, b: any): number;
- export function capitaliseFirstLetter(str: any): any;
- export function padStart(val: any, len: any): string;
- export function compareNumbers(a: any, b: any): number;
- export function isInt(n: any): boolean;
- export function applyAll(functions: any, thisObj: any, args: any): any;
- export function firstDefined(...args: any[]): any;
- export function debounce(func: any, wait: any): () => any;
- export type GenericHash = {
- [key: string]: any;
- };
- export function refineProps(rawProps: GenericHash, processors: GenericHash, defaults?: GenericHash, leftoverProps?: GenericHash): GenericHash;
- export function computeAlignedDayRange(timedRange: DateRange): DateRange;
- export function computeVisibleDayRange(timedRange: OpenDateRange, nextDayThreshold?: Duration): OpenDateRange;
- export function isMultiDayRange(range: DateRange): boolean;
- export function diffDates(date0: DateMarker, date1: DateMarker, dateEnv: DateEnv, largeUnit?: string): Duration;
-}
-
-declare module '@fullcalendar/core/util/html' {
- export function htmlEscape(s: any): string;
- export function cssToStr(cssProps: any): string;
- export function attrsToStr(attrs: any): string;
- export type ClassNameInput = string | string[];
- export function parseClassName(raw: ClassNameInput): string[];
-}
-
-declare module '@fullcalendar/core/util/array' {
- export function removeMatching(array: any, testFunc: any): number;
- export function removeExact(array: any, exactVal: any): number;
- export function isArraysEqual(a0: any, a1: any): boolean;
-}
-
-declare module '@fullcalendar/core/util/memoize' {
- export function memoize<T>(workerFunc: T): T;
- export function memoizeOutput<T>(workerFunc: T, equalityFunc: (output0: any, output1: any) => boolean): T;
-}
-
-declare module '@fullcalendar/core/component/memoized-rendering' {
- export interface MemoizedRendering<ArgsType extends any[]> {
- (...args: ArgsType): void;
- unrender: () => void;
- dependents: MemoizedRendering<any>[];
- }
- export function memoizeRendering<ArgsType extends any[]>(renderFunc: (...args: ArgsType) => void, unrenderFunc?: (...args: ArgsType) => void, dependencies?: MemoizedRendering<any>[]): MemoizedRendering<ArgsType>;
-}
-
-declare module '@fullcalendar/core/util/geom' {
- export interface Point {
- left: number;
- top: number;
- }
- export interface Rect {
- left: number;
- right: number;
- top: number;
- bottom: number;
- }
- export function pointInsideRect(point: Point, rect: Rect): boolean;
- export function intersectRects(rect1: Rect, rect2: Rect): Rect | false;
- export function translateRect(rect: Rect, deltaX: number, deltaY: number): Rect;
- export function constrainPoint(point: Point, rect: Rect): Point;
- export function getRectCenter(rect: Rect): Point;
- export function diffPoints(point1: Point, point2: Point): Point;
-}
-
-declare module '@fullcalendar/core/util/object' {
- export function mergeProps(propObjs: any, complexProps?: any): any;
- export function filterHash(hash: any, func: any): {};
- export function mapHash<InputItem, OutputItem>(hash: {
- [key: string]: InputItem;
- }, func: (input: InputItem, key: string) => OutputItem): {
- [key: string]: OutputItem;
- };
- export function arrayToHash(a: any): {
- [key: string]: true;
- };
- export function hashValuesToArray(obj: any): any[];
- export function isPropsEqual(obj0: any, obj1: any): boolean;
-}
-
-declare module '@fullcalendar/core/util/dom-manip' {
- export function createElement(tagName: string, attrs: object | null, content?: ElementContent): HTMLElement;
- export function htmlToElement(html: string): HTMLElement;
- export function htmlToElements(html: string): HTMLElement[];
- export type ElementContent = string | Node | Node[] | NodeList;
- export function appendToElement(el: HTMLElement, content: ElementContent): void;
- export function prependToElement(parent: HTMLElement, content: ElementContent): void;
- export function insertAfterElement(refEl: HTMLElement, content: ElementContent): void;
- export function removeElement(el: HTMLElement): void;
- export function elementClosest(el: HTMLElement, selector: string): HTMLElement;
- export function elementMatches(el: HTMLElement, selector: string): HTMLElement;
- export function findElements(container: HTMLElement[] | HTMLElement | NodeListOf<HTMLElement>, selector: string): HTMLElement[];
- export function findChildren(parent: HTMLElement[] | HTMLElement, selector?: string): HTMLElement[];
- export function forceClassName(el: HTMLElement, className: string, bool: any): void;
- export function applyStyle(el: HTMLElement, props: object): void;
- export function applyStyleProp(el: HTMLElement, name: string, val: any): void;
-}
-
-declare module '@fullcalendar/core/structs/event-store' {
- import { EventInput, EventDef, EventDefHash, EventInstanceHash, EventTuple } from '@fullcalendar/core/structs/event';
- import { EventSource } from '@fullcalendar/core/structs/event-source';
- import Calendar from '@fullcalendar/core/Calendar';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- export interface EventStore {
- defs: EventDefHash;
- instances: EventInstanceHash;
- }
- export function parseEvents(rawEvents: EventInput[], sourceId: string, calendar: Calendar, allowOpenRange?: boolean): EventStore;
- export function eventTupleToStore(tuple: EventTuple, eventStore?: EventStore): EventStore;
- export function expandRecurring(eventStore: EventStore, framingRange: DateRange, calendar: Calendar): EventStore;
- export function getRelevantEvents(eventStore: EventStore, instanceId: string): EventStore;
- export function transformRawEvents(rawEvents: any, eventSource: EventSource, calendar: Calendar): any;
- export function createEmptyEventStore(): EventStore;
- export function mergeEventStores(store0: EventStore, store1: EventStore): EventStore;
- export function filterEventStoreDefs(eventStore: EventStore, filterFunc: (eventDef: EventDef) => boolean): EventStore;
-}
-
-declare module '@fullcalendar/core/component/event-ui' {
- import { Constraint, AllowFunc, ConstraintInput } from '@fullcalendar/core/validation';
- import { parseClassName } from '@fullcalendar/core/util/html';
- import Calendar from '@fullcalendar/core/Calendar';
- export interface UnscopedEventUiInput {
- editable?: boolean;
- startEditable?: boolean;
- durationEditable?: boolean;
- constraint?: ConstraintInput;
- overlap?: boolean;
- allow?: AllowFunc;
- className?: string[] | string;
- classNames?: string[] | string;
- backgroundColor?: string;
- borderColor?: string;
- textColor?: string;
- color?: string;
- }
- export interface EventUi {
- startEditable: boolean | null;
- durationEditable: boolean | null;
- constraints: Constraint[];
- overlap: boolean | null;
- allows: AllowFunc[];
- backgroundColor: string;
- borderColor: string;
- textColor: string;
- classNames: string[];
- }
- export type EventUiHash = {
- [defId: string]: EventUi;
- };
- export const UNSCOPED_EVENT_UI_PROPS: {
- editable: BooleanConstructor;
- startEditable: BooleanConstructor;
- durationEditable: BooleanConstructor;
- constraint: any;
- overlap: any;
- allow: any;
- className: typeof parseClassName;
- classNames: typeof parseClassName;
- color: StringConstructor;
- backgroundColor: StringConstructor;
- borderColor: StringConstructor;
- textColor: StringConstructor;
- };
- export function processUnscopedUiProps(rawProps: UnscopedEventUiInput, calendar: Calendar, leftovers?: any): EventUi;
- export function processScopedUiProps(prefix: string, rawScoped: any, calendar: Calendar, leftovers?: any): EventUi;
- export function combineEventUis(uis: EventUi[]): EventUi;
-}
-
-declare module '@fullcalendar/core/component/event-splitting' {
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { EventDef } from '@fullcalendar/core/structs/event';
- import { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
- import { EventUiHash, EventUi } from '@fullcalendar/core/component/event-ui';
- import { DateSpan } from '@fullcalendar/core/structs/date-span';
- export interface SplittableProps {
- businessHours: EventStore | null;
- dateSelection: DateSpan | null;
- eventStore: EventStore;
- eventUiBases: EventUiHash;
- eventSelection: string;
- eventDrag: EventInteractionState | null;
- eventResize: EventInteractionState | null;
- }
- export { Splitter as default, Splitter };
- abstract class Splitter<PropsType extends SplittableProps = SplittableProps> {
- abstract getKeyInfo(props: PropsType): {
- [key: string]: {
- ui?: EventUi;
- businessHours?: EventStore;
- };
- };
- abstract getKeysForDateSpan(dateSpan: DateSpan): string[];
- abstract getKeysForEventDef(eventDef: EventDef): string[];
- splitProps(props: PropsType): {
- [key: string]: SplittableProps;
- };
- }
-}
-
-declare module '@fullcalendar/core/component/date-rendering' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { ComponentContext } from '@fullcalendar/core/component/Component';
- import { DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- import { DateEnv } from '@fullcalendar/core/datelib/env';
- export function buildGotoAnchorHtml(allOptions: any, dateEnv: DateEnv, gotoOptions: any, attrs: any, innerHtml?: any): string;
- export function getAllDayHtml(allOptions: any): any;
- export function getDayClasses(date: DateMarker, dateProfile: DateProfile, context: ComponentContext, noThemeHighlight?: any): any[];
-}
-
-declare module '@fullcalendar/core/util/dom-event' {
- export function preventDefault(ev: any): void;
- export function listenBySelector(container: HTMLElement, eventType: string, selector: string, handler: (ev: Event, matchedTarget: HTMLElement) => void): () => void;
- export function listenToHoverBySelector(container: HTMLElement, selector: string, onMouseEnter: (ev: Event, matchedTarget: HTMLElement) => void, onMouseLeave: (ev: Event, matchedTarget: HTMLElement) => void): () => void;
- export function whenTransitionDone(el: HTMLElement, callback: (ev: Event) => void): void;
-}
-
-declare module '@fullcalendar/core/util/dom-geom' {
- import { Rect } from '@fullcalendar/core/util/geom';
- export interface EdgeInfo {
- borderLeft: number;
- borderRight: number;
- borderTop: number;
- borderBottom: number;
- scrollbarLeft: number;
- scrollbarRight: number;
- scrollbarBottom: number;
- paddingLeft?: number;
- paddingRight?: number;
- paddingTop?: number;
- paddingBottom?: number;
- }
- export function computeEdges(el: any, getPadding?: boolean): EdgeInfo;
- export function computeInnerRect(el: any, goWithinPadding?: boolean): {
- left: number;
- right: number;
- top: number;
- bottom: number;
- };
- export function computeRect(el: any): Rect;
- export function computeHeightAndMargins(el: HTMLElement): number;
- export function computeVMargins(el: HTMLElement): number;
- export function getClippingParents(el: HTMLElement): HTMLElement[];
- export function computeClippingRect(el: HTMLElement): Rect;
-}
-
-declare module '@fullcalendar/core/util/promise' {
- export function unpromisify(func: any, success: any, failure?: any): void;
-}
-
-declare module '@fullcalendar/core/common/EmitterMixin' {
- import Mixin from '@fullcalendar/core/common/Mixin';
- export interface EmitterInterface {
- on(types: any, handler: any): any;
- one(types: any, handler: any): any;
- off(types: any, handler: any): any;
- trigger(type: any, ...args: any[]): any;
- triggerWith(type: any, context: any, args: any): any;
- hasHandlers(type: any): any;
- }
- export { EmitterMixin as default, EmitterMixin };
- class EmitterMixin extends Mixin implements EmitterInterface {
- _handlers: any;
- _oneHandlers: any;
- on(type: any, handler: any): this;
- one(type: any, handler: any): this;
- off(type: any, handler?: any): this;
- trigger(type: any, ...args: any[]): this;
- triggerWith(type: any, context: any, args: any): this;
- hasHandlers(type: any): any;
- }
-}
-
-declare module '@fullcalendar/core/datelib/date-range' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { DateEnv, DateInput } from '@fullcalendar/core/datelib/env';
- export interface DateRangeInput {
- start?: DateInput;
- end?: DateInput;
- }
- export interface OpenDateRange {
- start: DateMarker | null;
- end: DateMarker | null;
- }
- export interface DateRange {
- start: DateMarker;
- end: DateMarker;
- }
- export function parseRange(input: DateRangeInput, dateEnv: DateEnv): OpenDateRange;
- export function invertRanges(ranges: DateRange[], constraintRange: DateRange): DateRange[];
- export function intersectRanges(range0: OpenDateRange, range1: OpenDateRange): OpenDateRange;
- export function rangesEqual(range0: OpenDateRange, range1: OpenDateRange): boolean;
- export function rangesIntersect(range0: OpenDateRange, range1: OpenDateRange): boolean;
- export function rangeContainsRange(outerRange: OpenDateRange, innerRange: OpenDateRange): boolean;
- export function rangeContainsMarker(range: OpenDateRange, date: DateMarker | number): boolean;
- export function constrainMarkerToRange(date: DateMarker, range: DateRange): DateMarker;
-}
-
-declare module '@fullcalendar/core/common/Mixin' {
- export { Mixin as default, Mixin };
- class Mixin {
- static mixInto(destClass: any): void;
- static mixIntoObj(destObj: any): void;
- static mixOver(destClass: any): void;
- }
-}
-
-declare module '@fullcalendar/core/common/PositionCache' {
- export { PositionCache as default, PositionCache };
- class PositionCache {
- originClientRect: ClientRect;
- els: HTMLElement[];
- originEl: HTMLElement;
- isHorizontal: boolean;
- isVertical: boolean;
- lefts: any;
- rights: any;
- tops: any;
- bottoms: any;
- constructor(originEl: HTMLElement, els: HTMLElement[], isHorizontal: boolean, isVertical: boolean);
- build(): void;
- buildElHorizontals(originClientLeft: number): void;
- buildElVerticals(originClientTop: number): void;
- leftToIndex(leftPosition: number): any;
- topToIndex(topPosition: number): any;
- getWidth(leftIndex: number): number;
- getHeight(topIndex: number): number;
- }
-}
-
-declare module '@fullcalendar/core/common/ScrollComponent' {
- import { ElementScrollController } from '@fullcalendar/core/common/scroll-controller';
- export interface ScrollbarWidths {
- left: number;
- right: number;
- bottom: number;
- }
- export { ScrollComponent as default, ScrollComponent };
- class ScrollComponent extends ElementScrollController {
- overflowX: string;
- overflowY: string;
- constructor(overflowX: string, overflowY: string);
- clear(): void;
- destroy(): void;
- applyOverflow(): void;
- lockOverflow(scrollbarWidths: ScrollbarWidths): void;
- setHeight(height: number | string): void;
- getScrollbarWidths(): ScrollbarWidths;
- }
-}
-
-declare module '@fullcalendar/core/common/scroll-controller' {
- export abstract class ScrollController {
- abstract getScrollTop(): number;
- abstract getScrollLeft(): number;
- abstract setScrollTop(top: number): void;
- abstract setScrollLeft(left: number): void;
- abstract getClientWidth(): number;
- abstract getClientHeight(): number;
- abstract getScrollWidth(): number;
- abstract getScrollHeight(): number;
- getMaxScrollTop(): number;
- getMaxScrollLeft(): number;
- canScrollVertically(): boolean;
- canScrollHorizontally(): boolean;
- canScrollUp(): boolean;
- canScrollDown(): boolean;
- canScrollLeft(): boolean;
- canScrollRight(): boolean;
- }
- export class ElementScrollController extends ScrollController {
- el: HTMLElement;
- constructor(el: HTMLElement);
- getScrollTop(): number;
- getScrollLeft(): number;
- setScrollTop(top: number): void;
- setScrollLeft(left: number): void;
- getScrollWidth(): number;
- getScrollHeight(): number;
- getClientHeight(): number;
- getClientWidth(): number;
- }
- export class WindowScrollController extends ScrollController {
- getScrollTop(): number;
- getScrollLeft(): number;
- setScrollTop(n: number): void;
- setScrollLeft(n: number): void;
- getScrollWidth(): number;
- getScrollHeight(): number;
- getClientHeight(): number;
- getClientWidth(): number;
- }
-}
-
-declare module '@fullcalendar/core/theme/Theme' {
- export { Theme as default, Theme };
- class Theme {
- calendarOptions: any;
- classes: any;
- iconClasses: any;
- baseIconClass: string;
- iconOverrideOption: any;
- iconOverrideCustomButtonOption: any;
- iconOverridePrefix: string;
- constructor(calendarOptions: any);
- processIconOverride(): void;
- setIconOverride(iconOverrideHash: any): void;
- applyIconOverridePrefix(className: any): any;
- getClass(key: any): any;
- getIconClass(buttonName: any): string;
- getCustomButtonIconClass(customButtonProps: any): string;
- }
- export type ThemeClass = {
- new (calendarOptions: any): Theme;
- };
-}
-
-declare module '@fullcalendar/core/component/Component' {
- import Calendar from '@fullcalendar/core/Calendar';
- import View from '@fullcalendar/core/View';
- import Theme from '@fullcalendar/core/theme/Theme';
- import { DateEnv } from '@fullcalendar/core/datelib/env';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- export class ComponentContext {
- calendar: Calendar;
- theme: Theme;
- dateEnv: DateEnv;
- options: any;
- view?: View;
- isRtl: boolean;
- eventOrderSpecs: any;
- nextDayThreshold: Duration;
- constructor(calendar: Calendar, theme: Theme, dateEnv: DateEnv, options: any, view?: View);
- extend(options?: any, view?: View): ComponentContext;
- }
- export type EqualityFuncHash = {
- [propName: string]: (obj0: any, obj1: any) => boolean;
- };
- export { Component as default, Component };
- class Component<PropsType> {
- equalityFuncs: EqualityFuncHash;
- uid: string;
- props: PropsType | null;
- everRendered: boolean;
- context: ComponentContext;
- constructor();
- static addEqualityFuncs(newFuncs: EqualityFuncHash): void;
- receiveProps(props: PropsType, context: ComponentContext): void;
- receiveContext(context: ComponentContext): void;
- protected render(props: PropsType, context: ComponentContext): void;
- firstContext(context: ComponentContext): void;
- beforeUpdate(): void;
- afterUpdate(): void;
- destroy(): void;
- }
-}
-
-declare module '@fullcalendar/core/component/DateComponent' {
- import Component from '@fullcalendar/core/component/Component';
- import { EventRenderRange } from '@fullcalendar/core/component/event-rendering';
- import { DateSpan } from '@fullcalendar/core/structs/date-span';
- import { EventInstanceHash } from '@fullcalendar/core/structs/event';
- import { Hit } from '@fullcalendar/core/interactions/hit';
- import FgEventRenderer from '@fullcalendar/core/component/renderers/FgEventRenderer';
- import FillRenderer from '@fullcalendar/core/component/renderers/FillRenderer';
- import { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
- export type DateComponentHash = {
- [uid: string]: DateComponent<any>;
- };
- export interface Seg {
- component?: DateComponent<any>;
- isStart: boolean;
- isEnd: boolean;
- eventRange?: EventRenderRange;
- el?: HTMLElement;
- [otherProp: string]: any;
- }
- export interface EventSegUiInteractionState {
- affectedInstances: EventInstanceHash;
- segs: Seg[];
- isEvent: boolean;
- sourceSeg: any;
- }
- export { DateComponent as default, DateComponent };
- class DateComponent<PropsType> extends Component<PropsType> {
- fgSegSelector: string;
- bgSegSelector: string;
- largeUnit: any;
- eventRenderer: FgEventRenderer;
- mirrorRenderer: FgEventRenderer;
- fillRenderer: FillRenderer;
- el: HTMLElement;
- constructor(el: HTMLElement);
- destroy(): void;
- buildPositionCaches(): void;
- queryHit(positionLeft: number, positionTop: number, elWidth: number, elHeight: number): Hit | null;
- isInteractionValid(interaction: EventInteractionState): boolean;
- isDateSelectionValid(selection: DateSpan): boolean;
- isValidSegDownEl(el: HTMLElement): boolean;
- isValidDateDownEl(el: HTMLElement): boolean;
- isPopover(): boolean;
- isInPopover(el: HTMLElement): boolean;
- }
-}
-
-declare module '@fullcalendar/core/Calendar' {
- import { EmitterInterface } from '@fullcalendar/core/common/EmitterMixin';
- import OptionsManager from '@fullcalendar/core/OptionsManager';
- import View from '@fullcalendar/core/View';
- import Theme from '@fullcalendar/core/theme/Theme';
- import { OptionsInput, EventHandlerName, EventHandlerArgs } from '@fullcalendar/core/types/input-types';
- import { RawLocaleMap } from '@fullcalendar/core/datelib/locale';
- import { DateEnv, DateInput } from '@fullcalendar/core/datelib/env';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { Duration, DurationInput } from '@fullcalendar/core/datelib/duration';
- import { DateSpan, DateSpanApi, DatePointApi } from '@fullcalendar/core/structs/date-span';
- import { DateRangeInput } from '@fullcalendar/core/datelib/date-range';
- import DateProfileGenerator from '@fullcalendar/core/DateProfileGenerator';
- import { EventSourceInput } from '@fullcalendar/core/structs/event-source';
- import { EventInput } from '@fullcalendar/core/structs/event';
- import { CalendarState, Action } from '@fullcalendar/core/reducers/types';
- import EventSourceApi from '@fullcalendar/core/api/EventSourceApi';
- import EventApi from '@fullcalendar/core/api/EventApi';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { EventUiHash, EventUi } from '@fullcalendar/core/component/event-ui';
- import { ViewSpecHash, ViewSpec } from '@fullcalendar/core/structs/view-spec';
- import { PluginSystem } from '@fullcalendar/core/plugin-system';
- import CalendarComponent from '@fullcalendar/core/CalendarComponent';
- import DateComponent from '@fullcalendar/core/component/DateComponent';
- import { PointerDragEvent } from '@fullcalendar/core/interactions/pointer';
- import { InteractionSettingsInput, Interaction } from '@fullcalendar/core/interactions/interaction';
- export interface DateClickApi extends DatePointApi {
- dayEl: HTMLElement;
- jsEvent: UIEvent;
- view: View;
- }
- export interface DateSelectionApi extends DateSpanApi {
- jsEvent: UIEvent;
- view: View;
- }
- export type DatePointTransform = (dateSpan: DateSpan, calendar: Calendar) => any;
- export type DateSpanTransform = (dateSpan: DateSpan, calendar: Calendar) => any;
- export type CalendarInteraction = {
- destroy(): any;
- };
- export type CalendarInteractionClass = {
- new (calendar: Calendar): CalendarInteraction;
- };
- export type OptionChangeHandler = (propValue: any, calendar: Calendar, deepEqual: any) => void;
- export type OptionChangeHandlerMap = {
- [propName: string]: OptionChangeHandler;
- };
- export { Calendar as default, Calendar };
- class Calendar {
- static on: EmitterInterface['on'];
- static off: EmitterInterface['off'];
- static trigger: EmitterInterface['trigger'];
- on: EmitterInterface['on'];
- one: EmitterInterface['one'];
- off: EmitterInterface['off'];
- trigger: EmitterInterface['trigger'];
- triggerWith: EmitterInterface['triggerWith'];
- hasHandlers: EmitterInterface['hasHandlers'];
- eventUiBases: EventUiHash;
- selectionConfig: EventUi;
- optionsManager: OptionsManager;
- viewSpecs: ViewSpecHash;
- dateProfileGenerators: {
- [viewName: string]: DateProfileGenerator;
- };
- theme: Theme;
- dateEnv: DateEnv;
- availableRawLocales: RawLocaleMap;
- pluginSystem: PluginSystem;
- defaultAllDayEventDuration: Duration;
- defaultTimedEventDuration: Duration;
- calendarInteractions: CalendarInteraction[];
- interactionsStore: {
- [componentUid: string]: Interaction[];
- };
- removeNavLinkListener: any;
- windowResizeProxy: any;
- isHandlingWindowResize: boolean;
- state: CalendarState;
- actionQueue: any[];
- isReducing: boolean;
- needsRerender: boolean;
- isRendering: boolean;
- renderingPauseDepth: number;
- renderableEventStore: EventStore;
- buildDelayedRerender: typeof buildDelayedRerender;
- delayedRerender: any;
- afterSizingTriggers: any;
- isViewUpdated: boolean;
- isDatesUpdated: boolean;
- isEventsUpdated: boolean;
- el: HTMLElement;
- component: CalendarComponent;
- constructor(el: HTMLElement, overrides?: OptionsInput);
- addPluginInputs(pluginInputs: any): void;
- readonly view: View;
- render(): void;
- destroy(): void;
- bindHandlers(): void;
- unbindHandlers(): void;
- hydrate(): void;
- buildInitialState(): CalendarState;
- reduce(state: CalendarState, action: Action, calendar: Calendar): CalendarState;
- requestRerender(): void;
- tryRerender(): void;
- batchRendering(func: any): void;
- executeRender(): void;
- renderComponent(): void;
- setOption(name: string, val: any): void;
- getOption(name: string): any;
- opt(name: string): any;
- viewOpt(name: string): any;
- viewOpts(): any;
- mutateOptions(updates: any, removals: string[], isDynamic?: boolean, deepEqual?: any): void;
- handleOptions(options: any): void;
- getAvailableLocaleCodes(): string[];
- _buildSelectionConfig(rawOpts: any): EventUi;
- _buildEventUiSingleBase(rawOpts: any): EventUi;
- hasPublicHandlers<T extends EventHandlerName>(name: T): boolean;
- publiclyTrigger<T extends EventHandlerName>(name: T, args?: EventHandlerArgs<T>): any;
- publiclyTriggerAfterSizing<T extends EventHandlerName>(name: T, args: EventHandlerArgs<T>): void;
- releaseAfterSizingTriggers(): void;
- isValidViewType(viewType: string): boolean;
- changeView(viewType: string, dateOrRange?: DateRangeInput | DateInput): void;
- zoomTo(dateMarker: DateMarker, viewType?: string): void;
- getUnitViewSpec(unit: string): ViewSpec | null;
- getInitialDate(): Date;
- prev(): void;
- next(): void;
- prevYear(): void;
- nextYear(): void;
- today(): void;
- gotoDate(zonedDateInput: any): void;
- incrementDate(deltaInput: any): void;
- getDate(): Date;
- formatDate(d: DateInput, formatter: any): string;
- formatRange(d0: DateInput, d1: DateInput, settings: any): any;
- formatIso(d: DateInput, omitTime?: boolean): string;
- windowResize(ev: Event): void;
- updateSize(): void;
- registerInteractiveComponent(component: DateComponent<any>, settingsInput: InteractionSettingsInput): void;
- unregisterInteractiveComponent(component: DateComponent<any>): void;
- select(dateOrObj: DateInput | any, endDate?: DateInput): void;
- unselect(pev?: PointerDragEvent): void;
- triggerDateSelect(selection: DateSpan, pev?: PointerDragEvent): void;
- triggerDateUnselect(pev?: PointerDragEvent): void;
- triggerDateClick(dateSpan: DateSpan, dayEl: HTMLElement, view: View, ev: UIEvent): void;
- buildDatePointApi(dateSpan: DateSpan): import("@fullcalendar/core/structs/date-span").DatePointApi;
- buildDateSpanApi(dateSpan: DateSpan): import("@fullcalendar/core/structs/date-span").DateSpanApi;
- getNow(): DateMarker;
- getDefaultEventEnd(allDay: boolean, marker: DateMarker): DateMarker;
- addEvent(eventInput: EventInput, sourceInput?: EventSourceApi | string | number): EventApi | null;
- getEventById(id: string): EventApi | null;
- getEvents(): EventApi[];
- removeAllEvents(): void;
- rerenderEvents(): void;
- getEventSources(): EventSourceApi[];
- getEventSourceById(id: string | number): EventSourceApi | null;
- addEventSource(sourceInput: EventSourceInput): EventSourceApi;
- removeAllEventSources(): void;
- refetchEvents(): void;
- scrollToTime(timeInput: DurationInput): void;
- }
- function buildDelayedRerender(this: Calendar, wait: any): any;
- export {};
-}
-
-declare module '@fullcalendar/core/View' {
- import DateProfileGenerator, { DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { EmitterInterface } from '@fullcalendar/core/common/EmitterMixin';
- import { ViewSpec } from '@fullcalendar/core/structs/view-spec';
- import DateComponent from '@fullcalendar/core/component/DateComponent';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { EventUiHash } from '@fullcalendar/core/component/event-ui';
- import { EventRenderRange } from '@fullcalendar/core/component/event-rendering';
- import { DateSpan } from '@fullcalendar/core/structs/date-span';
- import { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
- import { ComponentContext } from '@fullcalendar/core/component/Component';
- export interface ViewProps {
- dateProfileGenerator: DateProfileGenerator;
- dateProfile: DateProfile;
- businessHours: EventStore;
- eventStore: EventStore;
- eventUiBases: EventUiHash;
- dateSelection: DateSpan | null;
- eventSelection: string;
- eventDrag: EventInteractionState | null;
- eventResize: EventInteractionState | null;
- }
- export { View as default, View };
- abstract class View extends DateComponent<ViewProps> {
- usesMinMaxTime: boolean;
- dateProfileGeneratorClass: any;
- on: EmitterInterface['on'];
- one: EmitterInterface['one'];
- off: EmitterInterface['off'];
- trigger: EmitterInterface['trigger'];
- triggerWith: EmitterInterface['triggerWith'];
- hasHandlers: EmitterInterface['hasHandlers'];
- viewSpec: ViewSpec;
- type: string;
- title: string;
- queuedScroll: any;
- isNowIndicatorRendered: boolean;
- initialNowDate: DateMarker;
- initialNowQueriedMs: number;
- nowIndicatorTimeoutID: any;
- nowIndicatorIntervalID: any;
- constructor(viewSpec: ViewSpec, parentEl: HTMLElement);
- initialize(): void;
- readonly activeStart: Date;
- readonly activeEnd: Date;
- readonly currentStart: Date;
- readonly currentEnd: Date;
- render(props: ViewProps, context: ComponentContext): void;
- beforeUpdate(): void;
- destroy(): void;
- updateSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
- updateBaseSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
- renderDatesWrap(dateProfile: DateProfile): void;
- unrenderDatesWrap(): void;
- renderDates(dateProfile: DateProfile): void;
- unrenderDates(): void;
- renderBusinessHours(businessHours: EventStore): void;
- unrenderBusinessHours(): void;
- renderDateSelectionWrap(selection: DateSpan): void;
- unrenderDateSelectionWrap(selection: DateSpan): void;
- renderDateSelection(selection: DateSpan): void;
- unrenderDateSelection(selection: DateSpan): void;
- renderEvents(eventStore: EventStore): void;
- unrenderEvents(): void;
- sliceEvents(eventStore: EventStore, allDay: boolean): EventRenderRange[];
- renderEventSelectionWrap(instanceId: string): void;
- unrenderEventSelectionWrap(instanceId: string): void;
- renderEventSelection(instanceId: string): void;
- unrenderEventSelection(instanceId: string): void;
- renderEventDragWrap(state: EventInteractionState): void;
- unrenderEventDragWrap(state: EventInteractionState): void;
- renderEventDrag(state: EventInteractionState): void;
- unrenderEventDrag(state: EventInteractionState): void;
- renderEventResizeWrap(state: EventInteractionState): void;
- unrenderEventResizeWrap(state: EventInteractionState): void;
- renderEventResize(state: EventInteractionState): void;
- unrenderEventResize(state: EventInteractionState): void;
- startNowIndicator(dateProfile: DateProfile, dateProfileGenerator: DateProfileGenerator): void;
- updateNowIndicator(): void;
- stopNowIndicator(): void;
- getNowIndicatorUnit(dateProfile: DateProfile, dateProfileGenerator: DateProfileGenerator): void;
- renderNowIndicator(date: any): void;
- unrenderNowIndicator(): void;
- addScroll(scroll: any, isForced?: boolean): void;
- popScroll(isResize: boolean): void;
- applyQueuedScroll(isResize: boolean): void;
- queryScroll(): any;
- applyScroll(scroll: any, isResize: boolean): void;
- computeDateScroll(duration: Duration): {};
- queryDateScroll(): {};
- applyDateScroll(scroll: any): void;
- scrollToDuration(duration: Duration): void;
- }
-}
-
-declare module '@fullcalendar/core/component/renderers/FgEventRenderer' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { DateFormatter } from '@fullcalendar/core/datelib/formatting';
- import { EventUi } from '@fullcalendar/core/component/event-ui';
- import { EventRenderRange } from '@fullcalendar/core/component/event-rendering';
- import { Seg } from '@fullcalendar/core/component/DateComponent';
- import { ComponentContext } from '@fullcalendar/core/component/Component';
- export { FgEventRenderer as default, FgEventRenderer };
- abstract class FgEventRenderer {
- context: ComponentContext;
- eventTimeFormat: DateFormatter;
- displayEventTime: boolean;
- displayEventEnd: boolean;
- segs: Seg[];
- isSizeDirty: boolean;
- renderSegs(context: ComponentContext, segs: Seg[], mirrorInfo?: any): void;
- unrender(context: ComponentContext, _segs: Seg[], mirrorInfo?: any): void;
- abstract renderSegHtml(seg: Seg, mirrorInfo: any): string;
- abstract attachSegs(segs: Seg[], mirrorInfo: any): any;
- abstract detachSegs(segs: Seg[]): any;
- rangeUpdated(): void;
- renderSegEls(segs: Seg[], mirrorInfo: any): Seg[];
- getSegClasses(seg: Seg, isDraggable: any, isResizable: any, mirrorInfo: any): string[];
- getTimeText(eventRange: EventRenderRange, formatter?: any, displayEnd?: any): any;
- _getTimeText(start: DateMarker, end: DateMarker, allDay: any, formatter?: any, displayEnd?: any, forcedStartTzo?: number, forcedEndTzo?: number): any;
- computeEventTimeFormat(): any;
- computeDisplayEventTime(): boolean;
- computeDisplayEventEnd(): boolean;
- getSkinCss(ui: EventUi): {
- 'background-color': string;
- 'border-color': string;
- color: string;
- };
- sortEventSegs(segs: any): Seg[];
- computeSizes(force: boolean): void;
- assignSizes(force: boolean): void;
- computeSegSizes(segs: Seg[]): void;
- assignSegSizes(segs: Seg[]): void;
- hideByHash(hash: any): void;
- showByHash(hash: any): void;
- selectByInstanceId(instanceId: string): void;
- unselectByInstanceId(instanceId: string): void;
- }
- export function buildSegCompareObj(seg: Seg): any;
-}
-
-declare module '@fullcalendar/core/component/renderers/FillRenderer' {
- import { Seg } from '@fullcalendar/core/component/DateComponent';
- import { ComponentContext } from '@fullcalendar/core/component/Component';
- export { FillRenderer as default, FillRenderer };
- abstract class FillRenderer {
- context: ComponentContext;
- fillSegTag: string;
- containerElsByType: any;
- segsByType: any;
- dirtySizeFlags: any;
- constructor();
- getSegsByType(type: string): any;
- renderSegs(type: string, context: ComponentContext, segs: Seg[]): void;
- unrender(type: string, context: ComponentContext): void;
- renderSegEls(type: any, segs: Seg[]): Seg[];
- renderSegHtml(type: any, seg: Seg): string;
- abstract attachSegs(type: any, segs: Seg[]): HTMLElement[] | void;
- detachSegs(type: any, segs: Seg[]): void;
- computeSizes(force: boolean): void;
- assignSizes(force: boolean): void;
- computeSegSizes(segs: Seg[]): void;
- assignSegSizes(segs: Seg[]): void;
- }
-}
-
-declare module '@fullcalendar/core/DateProfileGenerator' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { DateRange, OpenDateRange } from '@fullcalendar/core/datelib/date-range';
- import { ViewSpec } from '@fullcalendar/core/structs/view-spec';
- import { DateEnv } from '@fullcalendar/core/datelib/env';
- import Calendar from '@fullcalendar/core/Calendar';
- export interface DateProfile {
- currentRange: DateRange;
- currentRangeUnit: string;
- isRangeAllDay: boolean;
- validRange: OpenDateRange;
- activeRange: DateRange;
- renderRange: DateRange;
- minTime: Duration;
- maxTime: Duration;
- isValid: boolean;
- dateIncrement: Duration;
- }
- export { DateProfileGenerator as default, DateProfileGenerator };
- class DateProfileGenerator {
- viewSpec: ViewSpec;
- options: any;
- dateEnv: DateEnv;
- calendar: Calendar;
- isHiddenDayHash: boolean[];
- constructor(viewSpec: ViewSpec, calendar: Calendar);
- buildPrev(currentDateProfile: DateProfile, currentDate: DateMarker): DateProfile;
- buildNext(currentDateProfile: DateProfile, currentDate: DateMarker): DateProfile;
- build(currentDate: DateMarker, direction?: any, forceToValid?: boolean): DateProfile;
- buildValidRange(): OpenDateRange;
- buildCurrentRangeInfo(date: DateMarker, direction: any): {
- duration: any;
- unit: any;
- range: any;
- };
- getFallbackDuration(): Duration;
- adjustActiveRange(range: DateRange, minTime: Duration, maxTime: Duration): {
- start: Date;
- end: Date;
- };
- buildRangeFromDuration(date: DateMarker, direction: any, duration: Duration, unit: any): any;
- buildRangeFromDayCount(date: DateMarker, direction: any, dayCount: any): {
- start: Date;
- end: Date;
- };
- buildCustomVisibleRange(date: DateMarker): OpenDateRange;
- buildRenderRange(currentRange: DateRange, currentRangeUnit: any, isRangeAllDay: any): DateRange;
- buildDateIncrement(fallback: any): Duration;
- getRangeOption(name: any, ...otherArgs: any[]): OpenDateRange;
- initHiddenDays(): void;
- trimHiddenDays(range: DateRange): DateRange | null;
- isHiddenDay(day: any): boolean;
- skipHiddenDays(date: DateMarker, inc?: number, isExclusive?: boolean): Date;
- }
- export function isDateProfilesEqual(p0: DateProfile, p1: DateProfile): boolean;
-}
-
-declare module '@fullcalendar/core/structs/view-def' {
- import { ViewClass, ViewConfigHash } from '@fullcalendar/core/structs/view-config';
- export interface ViewDef {
- type: string;
- class: ViewClass;
- overrides: any;
- defaults: any;
- }
- export type ViewDefHash = {
- [viewType: string]: ViewDef;
- };
- export function compileViewDefs(defaultConfigs: ViewConfigHash, overrideConfigs: ViewConfigHash): ViewDefHash;
-}
-
-declare module '@fullcalendar/core/structs/view-spec' {
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import OptionsManager from '@fullcalendar/core/OptionsManager';
- import { ViewConfigInputHash, ViewClass } from '@fullcalendar/core/structs/view-config';
- export interface ViewSpec {
- type: string;
- class: ViewClass;
- duration: Duration;
- durationUnit: string;
- singleUnit: string;
- options: any;
- buttonTextOverride: string;
- buttonTextDefault: string;
- }
- export type ViewSpecHash = {
- [viewType: string]: ViewSpec;
- };
- export function buildViewSpecs(defaultInputs: ViewConfigInputHash, optionsManager: OptionsManager): ViewSpecHash;
-}
-
-declare module '@fullcalendar/core/structs/date-span' {
- import { DateRange, OpenDateRange } from '@fullcalendar/core/datelib/date-range';
- import { DateInput, DateEnv } from '@fullcalendar/core/datelib/env';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { EventRenderRange } from '@fullcalendar/core/component/event-rendering';
- import { EventUiHash } from '@fullcalendar/core/component/event-ui';
- import Calendar from '@fullcalendar/core/Calendar';
- export interface OpenDateSpanInput {
- start?: DateInput;
- end?: DateInput;
- allDay?: boolean;
- [otherProp: string]: any;
- }
- export interface DateSpanInput extends OpenDateSpanInput {
- start: DateInput;
- end: DateInput;
- }
- export interface OpenDateSpan {
- range: OpenDateRange;
- allDay: boolean;
- [otherProp: string]: any;
- }
- export interface DateSpan extends OpenDateSpan {
- range: DateRange;
- }
- export interface DateSpanApi {
- start: Date;
- end: Date;
- startStr: string;
- endStr: string;
- allDay: boolean;
- }
- export interface DatePointApi {
- date: Date;
- dateStr: string;
- allDay: boolean;
- }
- export function parseDateSpan(raw: DateSpanInput, dateEnv: DateEnv, defaultDuration?: Duration): DateSpan | null;
- export function parseOpenDateSpan(raw: OpenDateSpanInput, dateEnv: DateEnv): OpenDateSpan | null;
- export function isDateSpansEqual(span0: DateSpan, span1: DateSpan): boolean;
- export function buildDateSpanApi(span: DateSpan, dateEnv: DateEnv): DateSpanApi;
- export function buildDatePointApi(span: DateSpan, dateEnv: DateEnv): DatePointApi;
- export function fabricateEventRange(dateSpan: DateSpan, eventUiBases: EventUiHash, calendar: Calendar): EventRenderRange;
-}
-
-declare module '@fullcalendar/core/datelib/marker' {
- import { Duration } from '@fullcalendar/core/datelib/duration';
- export type DateMarker = Date;
- export const DAY_IDS: string[];
- export function addWeeks(m: DateMarker, n: number): Date;
- export function addDays(m: DateMarker, n: number): Date;
- export function addMs(m: DateMarker, n: number): Date;
- export function diffWeeks(m0: any, m1: any): number;
- export function diffDays(m0: any, m1: any): number;
- export function diffHours(m0: any, m1: any): number;
- export function diffMinutes(m0: any, m1: any): number;
- export function diffSeconds(m0: any, m1: any): number;
- export function diffDayAndTime(m0: DateMarker, m1: DateMarker): Duration;
- export function diffWholeWeeks(m0: DateMarker, m1: DateMarker): number;
- export function diffWholeDays(m0: DateMarker, m1: DateMarker): number;
- export function startOfDay(m: DateMarker): DateMarker;
- export function startOfHour(m: DateMarker): Date;
- export function startOfMinute(m: DateMarker): Date;
- export function startOfSecond(m: DateMarker): Date;
- export function weekOfYear(marker: any, dow: any, doy: any): number;
- export function dateToLocalArray(date: any): any[];
- export function arrayToLocalDate(a: any): Date;
- export function dateToUtcArray(date: any): any[];
- export function arrayToUtcDate(a: any): Date;
- export function isValidDate(m: DateMarker): boolean;
- export function timeAsMs(m: DateMarker): number;
-}
-
-declare module '@fullcalendar/core/datelib/duration' {
- export type DurationInput = DurationObjectInput | string | number;
- export interface DurationObjectInput {
- years?: number;
- year?: number;
- months?: number;
- month?: number;
- weeks?: number;
- week?: number;
- days?: number;
- day?: number;
- hours?: number;
- hour?: number;
- minutes?: number;
- minute?: number;
- seconds?: number;
- second?: number;
- milliseconds?: number;
- millisecond?: number;
- ms?: number;
- }
- export interface Duration {
- years: number;
- months: number;
- days: number;
- milliseconds: number;
- }
- export function createDuration(input: DurationInput, unit?: string): Duration | null;
- export function getWeeksFromInput(obj: DurationObjectInput): number;
- export function durationsEqual(d0: Duration, d1: Duration): boolean;
- export function isSingleDay(dur: Duration): boolean;
- export function addDurations(d0: Duration, d1: Duration): {
- years: number;
- months: number;
- days: number;
- milliseconds: number;
- };
- export function subtractDurations(d1: Duration, d0: Duration): Duration;
- export function multiplyDuration(d: Duration, n: number): {
- years: number;
- months: number;
- days: number;
- milliseconds: number;
- };
- export function asRoughYears(dur: Duration): number;
- export function asRoughMonths(dur: Duration): number;
- export function asRoughDays(dur: Duration): number;
- export function asRoughHours(dur: Duration): number;
- export function asRoughMinutes(dur: Duration): number;
- export function asRoughSeconds(dur: Duration): number;
- export function asRoughMs(dur: Duration): number;
- export function wholeDivideDurations(numerator: Duration, denominator: Duration): number;
- export function greatestDurationDenominator(dur: Duration, dontReturnWeeks?: boolean): {
- unit: string;
- value: number;
- };
-}
-
-declare module '@fullcalendar/core/datelib/env' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { CalendarSystem } from '@fullcalendar/core/datelib/calendar-system';
- import { Locale } from '@fullcalendar/core/datelib/locale';
- import { NamedTimeZoneImpl, NamedTimeZoneImplClass } from '@fullcalendar/core/datelib/timezone';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { DateFormatter } from '@fullcalendar/core/datelib/formatting';
- import { CmdFormatterFunc } from '@fullcalendar/core/datelib/formatting-cmd';
- export interface DateEnvSettings {
- timeZone: string;
- namedTimeZoneImpl?: NamedTimeZoneImplClass;
- calendarSystem: string;
- locale: Locale;
- weekNumberCalculation?: any;
- firstDay?: any;
- weekLabel?: string;
- cmdFormatter?: CmdFormatterFunc;
- }
- export type DateInput = Date | string | number | number[];
- export interface DateMarkerMeta {
- marker: DateMarker;
- isTimeUnspecified: boolean;
- forcedTzo: number | null;
- }
- export class DateEnv {
- timeZone: string;
- namedTimeZoneImpl: NamedTimeZoneImpl;
- canComputeOffset: boolean;
- calendarSystem: CalendarSystem;
- locale: Locale;
- weekDow: number;
- weekDoy: number;
- weekNumberFunc: any;
- weekLabel: string;
- cmdFormatter?: CmdFormatterFunc;
- constructor(settings: DateEnvSettings);
- createMarker(input: DateInput): DateMarker;
- createNowMarker(): DateMarker;
- createMarkerMeta(input: DateInput): DateMarkerMeta;
- parse(s: string): {
- marker: Date;
- isTimeUnspecified: boolean;
- forcedTzo: any;
- };
- getYear(marker: DateMarker): number;
- getMonth(marker: DateMarker): number;
- add(marker: DateMarker, dur: Duration): DateMarker;
- subtract(marker: DateMarker, dur: Duration): DateMarker;
- addYears(marker: DateMarker, n: number): Date;
- addMonths(marker: DateMarker, n: number): Date;
- diffWholeYears(m0: DateMarker, m1: DateMarker): number;
- diffWholeMonths(m0: DateMarker, m1: DateMarker): number;
- greatestWholeUnit(m0: DateMarker, m1: DateMarker): {
- unit: string;
- value: number;
- };
- countDurationsBetween(m0: DateMarker, m1: DateMarker, d: Duration): number;
- startOf(m: DateMarker, unit: string): Date;
- startOfYear(m: DateMarker): DateMarker;
- startOfMonth(m: DateMarker): DateMarker;
- startOfWeek(m: DateMarker): DateMarker;
- computeWeekNumber(marker: DateMarker): number;
- format(marker: DateMarker, formatter: DateFormatter, dateOptions?: {
- forcedTzo?: number;
- }): any;
- formatRange(start: DateMarker, end: DateMarker, formatter: DateFormatter, dateOptions?: {
- forcedStartTzo?: number;
- forcedEndTzo?: number;
- isEndExclusive?: boolean;
- }): any;
- formatIso(marker: DateMarker, extraOptions?: any): string;
- timestampToMarker(ms: number): Date;
- offsetForMarker(m: DateMarker): number;
- toDate(m: DateMarker, forcedTzo?: number): Date;
- }
-}
-
-declare module '@fullcalendar/core/datelib/formatting' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { CalendarSystem } from '@fullcalendar/core/datelib/calendar-system';
- import { Locale } from '@fullcalendar/core/datelib/locale';
- import { CmdFormatterFunc } from '@fullcalendar/core/datelib/formatting-cmd';
- import { FuncFormatterFunc } from '@fullcalendar/core/datelib/formatting-func';
- export interface ZonedMarker {
- marker: DateMarker;
- timeZoneOffset: number;
- }
- export interface ExpandedZonedMarker extends ZonedMarker {
- array: number[];
- year: number;
- month: number;
- day: number;
- hour: number;
- minute: number;
- second: number;
- millisecond: number;
- }
- export interface VerboseFormattingArg {
- date: ExpandedZonedMarker;
- start: ExpandedZonedMarker;
- end?: ExpandedZonedMarker;
- timeZone: string;
- localeCodes: string[];
- separator: string;
- }
- export interface DateFormattingContext {
- timeZone: string;
- locale: Locale;
- calendarSystem: CalendarSystem;
- computeWeekNumber: (d: DateMarker) => number;
- weekLabel: string;
- cmdFormatter?: CmdFormatterFunc;
- }
- export interface DateFormatter {
- format(date: ZonedMarker, context: DateFormattingContext): any;
- formatRange(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext): any;
- }
- export type FormatterInput = object | string | FuncFormatterFunc;
- export function createFormatter(input: FormatterInput, defaultSeparator?: string): DateFormatter;
- export function buildIsoString(marker: DateMarker, timeZoneOffset?: number, stripZeroTime?: boolean): string;
- export function formatIsoTimeString(marker: DateMarker): string;
- export function formatTimeZoneOffset(minutes: number, doIso?: boolean): string;
- export function createVerboseFormattingArg(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext, separator?: string): VerboseFormattingArg;
-}
-
-declare module '@fullcalendar/core/datelib/timezone' {
- export abstract class NamedTimeZoneImpl {
- timeZoneName: string;
- constructor(timeZoneName: string);
- abstract offsetForArray(a: number[]): number;
- abstract timestampToArray(ms: number): number[];
- }
- export type NamedTimeZoneImplClass = {
- new (timeZoneName: string): NamedTimeZoneImpl;
- };
-}
-
-declare module '@fullcalendar/core/datelib/parsing' {
- export function parse(str: any): {
- marker: Date;
- isTimeUnspecified: boolean;
- timeZoneOffset: any;
- };
-}
-
-declare module '@fullcalendar/core/structs/event-source' {
- import { EventInput } from '@fullcalendar/core/structs/event';
- import Calendar from '@fullcalendar/core/Calendar';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- import { EventSourceFunc } from '@fullcalendar/core/event-sources/func-event-source';
- import { EventUi } from '@fullcalendar/core/component/event-ui';
- import { ConstraintInput, AllowFunc } from '@fullcalendar/core/validation';
- export type EventSourceError = {
- message: string;
- response?: any;
- [otherProp: string]: any;
- };
- export type EventInputTransformer = (eventInput: EventInput) => EventInput | null;
- export type EventSourceSuccessResponseHandler = (rawData: any, response: any) => EventInput[] | void;
- export type EventSourceErrorResponseHandler = (error: EventSourceError) => void;
- export interface ExtendedEventSourceInput {
- id?: string | number;
- allDayDefault?: boolean;
- eventDataTransform?: EventInputTransformer;
- events?: EventInput[] | EventSourceFunc;
- url?: string;
- method?: string;
- extraParams?: object | (() => object);
- startParam?: string;
- endParam?: string;
- timeZoneParam?: string;
- success?: EventSourceSuccessResponseHandler;
- failure?: EventSourceErrorResponseHandler;
- editable?: boolean;
- startEditable?: boolean;
- durationEditable?: boolean;
- constraint?: ConstraintInput;
- overlap?: boolean;
- allow?: AllowFunc;
- className?: string[] | string;
- classNames?: string[] | string;
- backgroundColor?: string;
- borderColor?: string;
- textColor?: string;
- color?: string;
- [otherProp: string]: any;
- }
- export type EventSourceInput = ExtendedEventSourceInput | // object in extended form
- EventSourceFunc | // just a function
- string;
- export interface EventSource {
- _raw: any;
- sourceId: string;
- sourceDefId: number;
- meta: any;
- publicId: string;
- isFetching: boolean;
- latestFetchId: string;
- fetchRange: DateRange | null;
- allDayDefault: boolean | null;
- eventDataTransform: EventInputTransformer;
- ui: EventUi;
- success: EventSourceSuccessResponseHandler | null;
- failure: EventSourceErrorResponseHandler | null;
- extendedProps: any;
- }
- export type EventSourceHash = {
- [sourceId: string]: EventSource;
- };
- export type EventSourceFetcher = (arg: {
- eventSource: EventSource;
- calendar: Calendar;
- range: DateRange;
- }, success: (res: {
- rawEvents: EventInput[];
- xhr?: XMLHttpRequest;
- }) => void, failure: (error: EventSourceError) => void) => (void | PromiseLike<EventInput[]>);
- export interface EventSourceDef {
- ignoreRange?: boolean;
- parseMeta: (raw: EventSourceInput) => object | null;
- fetch: EventSourceFetcher;
- }
- export function doesSourceNeedRange(eventSource: EventSource, calendar: Calendar): boolean;
- export function parseEventSource(raw: EventSourceInput, calendar: Calendar): EventSource | null;
-}
-
-declare module '@fullcalendar/core/interactions/interaction' {
- import DateComponent from '@fullcalendar/core/component/DateComponent';
- export abstract class Interaction {
- component: DateComponent<any>;
- constructor(settings: InteractionSettings);
- destroy(): void;
- }
- export type InteractionClass = {
- new (settings: InteractionSettings): Interaction;
- };
- export interface InteractionSettingsInput {
- el: HTMLElement;
- useEventCenter?: boolean;
- }
- export interface InteractionSettings {
- component: DateComponent<any>;
- el: HTMLElement;
- useEventCenter: boolean;
- }
- export type InteractionSettingsStore = {
- [componenUid: string]: InteractionSettings;
- };
- export function parseInteractionSettings(component: DateComponent<any>, input: InteractionSettingsInput): InteractionSettings;
- export function interactionSettingsToStore(settings: InteractionSettings): {
- [x: string]: InteractionSettings;
- };
- export let interactionSettingsStore: InteractionSettingsStore;
-}
-
-declare module '@fullcalendar/core/interactions/pointer' {
- export interface PointerDragEvent {
- origEvent: UIEvent;
- isTouch: boolean;
- subjectEl: EventTarget;
- pageX: number;
- pageY: number;
- deltaX: number;
- deltaY: number;
- }
-}
-
-declare module '@fullcalendar/core/interactions/hit' {
- import DateComponent from '@fullcalendar/core/component/DateComponent';
- import { DateSpan } from '@fullcalendar/core/structs/date-span';
- import { Rect } from '@fullcalendar/core/util/geom';
- export interface Hit {
- component: DateComponent<any>;
- dateSpan: DateSpan;
- dayEl: HTMLElement;
- rect: Rect;
- layer: number;
- }
-}
-
-declare module '@fullcalendar/core/interactions/date-selecting' {
- import { Hit } from '@fullcalendar/core/interactions/hit';
- export type dateSelectionJoinTransformer = (hit0: Hit, hit1: Hit) => any;
-}
-
-declare module '@fullcalendar/core/interactions/event-dragging' {
- import Calendar from '@fullcalendar/core/Calendar';
- import { EventMutation } from '@fullcalendar/core/structs/event-mutation';
- import { Hit } from '@fullcalendar/core/interactions/hit';
- import { EventDef } from '@fullcalendar/core/structs/event';
- import { EventUi } from '@fullcalendar/core/component/event-ui';
- import { View } from '@fullcalendar/core';
- export type eventDragMutationMassager = (mutation: EventMutation, hit0: Hit, hit1: Hit) => void;
- export type EventDropTransformers = (mutation: EventMutation, calendar: Calendar) => any;
- export type eventIsDraggableTransformer = (val: boolean, eventDef: EventDef, eventUi: EventUi, view: View) => boolean;
-}
-
-declare module '@fullcalendar/core/interactions/event-resizing' {
- import { Hit } from '@fullcalendar/core/interactions/hit';
- export type EventResizeJoinTransforms = (hit0: Hit, hit1: Hit) => false | object;
-}
-
-declare module '@fullcalendar/core/interactions/ElementDragging' {
- import EmitterMixin from '@fullcalendar/core/common/EmitterMixin';
- export { ElementDragging as default, ElementDragging };
- abstract class ElementDragging {
- emitter: EmitterMixin;
- constructor(el: HTMLElement);
- destroy(): void;
- abstract setIgnoreMove(bool: boolean): void;
- setMirrorIsVisible(bool: boolean): void;
- setMirrorNeedsRevert(bool: boolean): void;
- setAutoScrollEnabled(bool: boolean): void;
- }
- export type ElementDraggingClass = {
- new (el: HTMLElement): ElementDragging;
- };
-}
-
-declare module '@fullcalendar/core/formatting-api' {
- import { DateInput } from '@fullcalendar/core/datelib/env';
- export function formatDate(dateInput: DateInput, settings?: {}): any;
- export function formatRange(startInput: DateInput, endInput: DateInput, settings: any): any;
-}
-
-declare module '@fullcalendar/core/options' {
- import { PluginDef } from '@fullcalendar/core/plugin-system';
- export const config: any;
- export const globalDefaults: {
- defaultRangeSeparator: string;
- titleRangeSeparator: string;
- defaultTimedEventDuration: string;
- defaultAllDayEventDuration: {
- day: number;
- };
- forceEventDuration: boolean;
- nextDayThreshold: string;
- columnHeader: boolean;
- defaultView: string;
- aspectRatio: number;
- header: {
- left: string;
- center: string;
- right: string;
- };
- weekends: boolean;
- weekNumbers: boolean;
- weekNumberCalculation: string;
- editable: boolean;
- scrollTime: string;
- minTime: string;
- maxTime: string;
- showNonCurrentDates: boolean;
- lazyFetching: boolean;
- startParam: string;
- endParam: string;
- timeZoneParam: string;
- timeZone: string;
- locales: any[];
- locale: string;
- timeGridEventMinHeight: number;
- themeSystem: string;
- dragRevertDuration: number;
- dragScroll: boolean;
- allDayMaintainDuration: boolean;
- unselectAuto: boolean;
- dropAccept: string;
- eventOrder: string;
- eventLimit: boolean;
- eventLimitClick: string;
- dayPopoverFormat: {
- month: string;
- day: string;
- year: string;
- };
- handleWindowResize: boolean;
- windowResizeDelay: number;
- longPressDelay: number;
- eventDragMinDistance: number;
- };
- export const rtlDefaults: {
- header: {
- left: string;
- center: string;
- right: string;
- };
- buttonIcons: {
- prev: string;
- next: string;
- prevYear: string;
- nextYear: string;
- };
- };
- export function mergeOptions(optionObjs: any): any;
- export function refinePluginDefs(pluginInputs: any[]): PluginDef[];
-}
-
-declare module '@fullcalendar/core/structs/recurring-event' {
- import { EventInput, EventDef } from '@fullcalendar/core/structs/event';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- import { DateEnv } from '@fullcalendar/core/datelib/env';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- export interface ParsedRecurring {
- typeData: any;
- allDayGuess: boolean | null;
- duration: Duration | null;
- }
- export interface RecurringType {
- parse: (rawEvent: EventInput, leftoverProps: any, dateEnv: DateEnv) => ParsedRecurring | null;
- expand: (typeData: any, framingRange: DateRange, dateEnv: DateEnv) => DateMarker[];
- }
- export function parseRecurring(eventInput: EventInput, allDayDefault: boolean | null, dateEnv: DateEnv, recurringTypes: RecurringType[], leftovers: any): {
- allDay: any;
- duration: Duration;
- typeData: any;
- typeId: number;
- };
- export function expandRecurringRanges(eventDef: EventDef, duration: Duration, framingRange: DateRange, dateEnv: DateEnv, recurringTypes: RecurringType[]): DateMarker[];
-}
-
-declare module '@fullcalendar/core/structs/drag-meta' {
- import { Duration, DurationInput } from '@fullcalendar/core/datelib/duration';
- import { EventNonDateInput } from '@fullcalendar/core/structs/event';
- export interface DragMetaInput extends EventNonDateInput {
- startTime?: DurationInput;
- duration?: DurationInput;
- create?: boolean;
- sourceId?: string;
- }
- export interface DragMeta {
- startTime: Duration | null;
- duration: Duration | null;
- create: boolean;
- sourceId: string;
- leftoverProps: object;
- }
- export function parseDragMeta(raw: DragMetaInput): DragMeta;
-}
-
-declare module '@fullcalendar/core/plugin-system' {
- import { reducerFunc } from '@fullcalendar/core/reducers/types';
- import { eventDefParserFunc } from '@fullcalendar/core/structs/event';
- import { eventDefMutationApplier } from '@fullcalendar/core/structs/event-mutation';
- import Calendar, { DatePointTransform, DateSpanTransform, CalendarInteractionClass, OptionChangeHandlerMap } from '@fullcalendar/core/Calendar';
- import { ViewConfigInputHash } from '@fullcalendar/core/structs/view-config';
- import { ViewSpec } from '@fullcalendar/core/structs/view-spec';
- import { ViewProps } from '@fullcalendar/core/View';
- import { CalendarComponentProps } from '@fullcalendar/core/CalendarComponent';
- import { isPropsValidTester } from '@fullcalendar/core/validation';
- import { eventDragMutationMassager, eventIsDraggableTransformer, EventDropTransformers } from '@fullcalendar/core/interactions/event-dragging';
- import { dateSelectionJoinTransformer } from '@fullcalendar/core/interactions/date-selecting';
- import { EventResizeJoinTransforms } from '@fullcalendar/core/interactions/event-resizing';
- import { ExternalDefTransform } from '@fullcalendar/core/interactions/external-element-dragging';
- import { InteractionClass } from '@fullcalendar/core/interactions/interaction';
- import { ThemeClass } from '@fullcalendar/core/theme/Theme';
- import { EventSourceDef } from '@fullcalendar/core/structs/event-source';
- import { CmdFormatterFunc } from '@fullcalendar/core/datelib/formatting-cmd';
- import { RecurringType } from '@fullcalendar/core/structs/recurring-event';
- import { NamedTimeZoneImplClass } from '@fullcalendar/core/datelib/timezone';
- import { ElementDraggingClass } from '@fullcalendar/core/interactions/ElementDragging';
- export interface PluginDefInput {
- deps?: PluginDef[];
- reducers?: reducerFunc[];
- eventDefParsers?: eventDefParserFunc[];
- isDraggableTransformers?: eventIsDraggableTransformer[];
- eventDragMutationMassagers?: eventDragMutationMassager[];
- eventDefMutationAppliers?: eventDefMutationApplier[];
- dateSelectionTransformers?: dateSelectionJoinTransformer[];
- datePointTransforms?: DatePointTransform[];
- dateSpanTransforms?: DateSpanTransform[];
- views?: ViewConfigInputHash;
- viewPropsTransformers?: ViewPropsTransformerClass[];
- isPropsValid?: isPropsValidTester;
- externalDefTransforms?: ExternalDefTransform[];
- eventResizeJoinTransforms?: EventResizeJoinTransforms[];
- viewContainerModifiers?: ViewContainerModifier[];
- eventDropTransformers?: EventDropTransformers[];
- componentInteractions?: InteractionClass[];
- calendarInteractions?: CalendarInteractionClass[];
- themeClasses?: {
- [themeSystemName: string]: ThemeClass;
- };
- eventSourceDefs?: EventSourceDef[];
- cmdFormatter?: CmdFormatterFunc;
- recurringTypes?: RecurringType[];
- namedTimeZonedImpl?: NamedTimeZoneImplClass;
- defaultView?: string;
- elementDraggingImpl?: ElementDraggingClass;
- optionChangeHandlers?: OptionChangeHandlerMap;
- }
- export interface PluginHooks {
- reducers: reducerFunc[];
- eventDefParsers: eventDefParserFunc[];
- isDraggableTransformers: eventIsDraggableTransformer[];
- eventDragMutationMassagers: eventDragMutationMassager[];
- eventDefMutationAppliers: eventDefMutationApplier[];
- dateSelectionTransformers: dateSelectionJoinTransformer[];
- datePointTransforms: DatePointTransform[];
- dateSpanTransforms: DateSpanTransform[];
- views: ViewConfigInputHash;
- viewPropsTransformers: ViewPropsTransformerClass[];
- isPropsValid: isPropsValidTester | null;
- externalDefTransforms: ExternalDefTransform[];
- eventResizeJoinTransforms: EventResizeJoinTransforms[];
- viewContainerModifiers: ViewContainerModifier[];
- eventDropTransformers: EventDropTransformers[];
- componentInteractions: InteractionClass[];
- calendarInteractions: CalendarInteractionClass[];
- themeClasses: {
- [themeSystemName: string]: ThemeClass;
- };
- eventSourceDefs: EventSourceDef[];
- cmdFormatter?: CmdFormatterFunc;
- recurringTypes: RecurringType[];
- namedTimeZonedImpl?: NamedTimeZoneImplClass;
- defaultView: string;
- elementDraggingImpl?: ElementDraggingClass;
- optionChangeHandlers: OptionChangeHandlerMap;
- }
- export interface PluginDef extends PluginHooks {
- id: string;
- deps: PluginDef[];
- }
- export type ViewPropsTransformerClass = new () => ViewPropsTransformer;
- export interface ViewPropsTransformer {
- transform(viewProps: ViewProps, viewSpec: ViewSpec, calendarProps: CalendarComponentProps, allOptions: any): any;
- }
- export type ViewContainerModifier = (contentEl: HTMLElement, calendar: Calendar) => void;
- export function createPlugin(input: PluginDefInput): PluginDef;
- export class PluginSystem {
- hooks: PluginHooks;
- addedHash: {
- [pluginId: string]: true;
- };
- constructor();
- add(plugin: PluginDef): void;
- }
-}
-
-declare module '@fullcalendar/core/reducers/types' {
- import { EventInput, EventInstanceHash } from '@fullcalendar/core/structs/event';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { EventMutation } from '@fullcalendar/core/structs/event-mutation';
- import { EventSource, EventSourceHash, EventSourceError } from '@fullcalendar/core/structs/event-source';
- import { DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- import { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
- import { DateSpan } from '@fullcalendar/core/structs/date-span';
- import { DateEnv } from '@fullcalendar/core/datelib/env';
- import Calendar from '@fullcalendar/core/Calendar';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- export interface CalendarState {
- eventSources: EventSourceHash;
- eventSourceLoadingLevel: number;
- loadingLevel: number;
- viewType: string;
- currentDate: DateMarker;
- dateProfile: DateProfile | null;
- eventStore: EventStore;
- dateSelection: DateSpan | null;
- eventSelection: string;
- eventDrag: EventInteractionState | null;
- eventResize: EventInteractionState | null;
- }
- export type reducerFunc = (state: CalendarState, action: Action, calendar: Calendar) => CalendarState;
- export type Action = {
- type: 'INIT';
- } | // wont it create another rerender?
- {
- type: 'PREV';
- } | {
- type: 'NEXT';
- } | {
- type: 'SET_DATE';
- dateMarker: DateMarker;
- } | {
- type: 'SET_VIEW_TYPE';
- viewType: string;
- dateMarker?: DateMarker;
- } | {
- type: 'SELECT_DATES';
- selection: DateSpan;
- } | {
- type: 'UNSELECT_DATES';
- } | {
- type: 'SELECT_EVENT';
- eventInstanceId: string;
- } | {
- type: 'UNSELECT_EVENT';
- } | {
- type: 'SET_EVENT_DRAG';
- state: EventInteractionState;
- } | {
- type: 'UNSET_EVENT_DRAG';
- } | {
- type: 'SET_EVENT_RESIZE';
- state: EventInteractionState;
- } | {
- type: 'UNSET_EVENT_RESIZE';
- } | {
- type: 'ADD_EVENT_SOURCES';
- sources: EventSource[];
- } | {
- type: 'REMOVE_EVENT_SOURCE';
- sourceId: string;
- } | {
- type: 'REMOVE_ALL_EVENT_SOURCES';
- } | {
- type: 'FETCH_EVENT_SOURCES';
- sourceIds?: string[];
- } | // if no sourceIds, fetch all
- {
- type: 'CHANGE_TIMEZONE';
- oldDateEnv: DateEnv;
- } | {
- type: 'RECEIVE_EVENTS';
- sourceId: string;
- fetchId: string;
- fetchRange: DateRange | null;
- rawEvents: EventInput[];
- } | {
- type: 'RECEIVE_EVENT_ERROR';
- sourceId: string;
- fetchId: string;
- fetchRange: DateRange | null;
- error: EventSourceError;
- } | // need all these?
- {
- type: 'ADD_EVENTS';
- eventStore: EventStore;
- } | {
- type: 'MERGE_EVENTS';
- eventStore: EventStore;
- } | {
- type: 'MUTATE_EVENTS';
- instanceId: string;
- mutation: EventMutation;
- fromApi?: boolean;
- } | {
- type: 'REMOVE_EVENT_DEF';
- defId: string;
- } | {
- type: 'REMOVE_EVENT_INSTANCES';
- instances: EventInstanceHash;
- } | {
- type: 'REMOVE_ALL_EVENTS';
- } | {
- type: 'RESET_EVENTS';
- };
-}
-
-declare module '@fullcalendar/core/CalendarComponent' {
- import Component, { ComponentContext } from '@fullcalendar/core/component/Component';
- import { ViewSpec } from '@fullcalendar/core/structs/view-spec';
- import View from '@fullcalendar/core/View';
- import Toolbar from '@fullcalendar/core/Toolbar';
- import DateProfileGenerator, { DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { EventUiHash } from '@fullcalendar/core/component/event-ui';
- import { BusinessHoursInput } from '@fullcalendar/core/structs/business-hours';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { CalendarState } from '@fullcalendar/core/reducers/types';
- export interface CalendarComponentProps extends CalendarState {
- viewSpec: ViewSpec;
- dateProfileGenerator: DateProfileGenerator;
- eventUiBases: EventUiHash;
- }
- export { CalendarComponent as default, CalendarComponent };
- class CalendarComponent extends Component<CalendarComponentProps> {
- view: View;
- header: Toolbar;
- footer: Toolbar;
- computeTitle: (dateProfile: any, viewOptions: any) => string;
- parseBusinessHours: (input: BusinessHoursInput) => EventStore;
- el: HTMLElement;
- contentEl: HTMLElement;
- elClassNames: string[];
- savedScroll: any;
- isHeightAuto: boolean;
- viewHeight: number;
- constructor(el: HTMLElement);
- render(props: CalendarComponentProps, context: ComponentContext): void;
- destroy(): void;
- _renderSkeleton(context: ComponentContext): void;
- _unrenderSkeleton(): void;
- removeElClassNames(): void;
- updateElClassNames(context: ComponentContext): void;
- _renderToolbars(viewSpec: ViewSpec, dateProfile: DateProfile, currentDate: DateMarker, title: string): void;
- _unrenderToolbars(): void;
- renderView(props: CalendarComponentProps, title: string): void;
- updateSize(isResize?: boolean): void;
- computeHeightVars(): void;
- queryToolbarsHeight(): number;
- freezeHeight(): void;
- thawHeight(): void;
- }
-}
-
-declare module '@fullcalendar/core/common/DayHeader' {
- import Component, { ComponentContext } from '@fullcalendar/core/component/Component';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- export interface DayTableHeaderProps {
- dates: DateMarker[];
- dateProfile: DateProfile;
- datesRepDistinctDays: boolean;
- renderIntroHtml?: () => string;
- }
- export { DayHeader as default, DayHeader };
- class DayHeader extends Component<DayTableHeaderProps> {
- parentEl: HTMLElement;
- el: HTMLElement;
- thead: HTMLElement;
- constructor(parentEl: HTMLElement);
- render(props: DayTableHeaderProps, context: ComponentContext): void;
- destroy(): void;
- _renderSkeleton(context: ComponentContext): void;
- _unrenderSkeleton(): void;
- }
-}
-
-declare module '@fullcalendar/core/common/table-utils' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- import { ComponentContext } from '@fullcalendar/core/component/Component';
- export function computeFallbackHeaderFormat(datesRepDistinctDays: boolean, dayCnt: number): {
- weekday: string;
- month?: undefined;
- day?: undefined;
- omitCommas?: undefined;
- } | {
- weekday: string;
- month: string;
- day: string;
- omitCommas: boolean;
- };
- export function renderDateCell(dateMarker: DateMarker, dateProfile: DateProfile, datesRepDistinctDays: any, colCnt: any, colHeadFormat: any, context: ComponentContext, colspan?: any, otherAttrs?: any): string;
-}
-
-declare module '@fullcalendar/core/common/DaySeries' {
- import DateProfileGenerator from '@fullcalendar/core/DateProfileGenerator';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- export interface DaySeriesSeg {
- firstIndex: number;
- lastIndex: number;
- isStart: boolean;
- isEnd: boolean;
- }
- export { DaySeries as default, DaySeries };
- class DaySeries {
- cnt: number;
- dates: DateMarker[];
- indices: number[];
- constructor(range: DateRange, dateProfileGenerator: DateProfileGenerator);
- sliceRange(range: DateRange): DaySeriesSeg | null;
- }
-}
-
-declare module '@fullcalendar/core/interactions/event-interaction-state' {
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { Seg } from '@fullcalendar/core/component/DateComponent';
- export interface EventInteractionState {
- affectedEvents: EventStore;
- mutatedEvents: EventStore;
- isEvent: boolean;
- origSeg: Seg | null;
- }
-}
-
-declare module '@fullcalendar/core/component/event-rendering' {
- import { EventDef, EventTuple, EventDefHash } from '@fullcalendar/core/structs/event';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { Seg } from '@fullcalendar/core/component/DateComponent';
- import { EventUi, EventUiHash } from '@fullcalendar/core/component/event-ui';
- import { ComponentContext } from '@fullcalendar/core/component/Component';
- export interface EventRenderRange extends EventTuple {
- ui: EventUi;
- range: DateRange;
- isStart: boolean;
- isEnd: boolean;
- }
- export function sliceEventStore(eventStore: EventStore, eventUiBases: EventUiHash, framingRange: DateRange, nextDayThreshold?: Duration): {
- bg: EventRenderRange[];
- fg: EventRenderRange[];
- };
- export function hasBgRendering(def: EventDef): boolean;
- export function filterSegsViaEls(context: ComponentContext, segs: Seg[], isMirror: boolean): Seg[];
- export function getElSeg(el: HTMLElement): Seg | null;
- export function compileEventUis(eventDefs: EventDefHash, eventUiBases: EventUiHash): {
- [key: string]: EventUi;
- };
- export function compileEventUi(eventDef: EventDef, eventUiBases: EventUiHash): EventUi;
- export function triggerRenderedSegs(context: ComponentContext, segs: Seg[], isMirrors: boolean): void;
- export function triggerWillRemoveSegs(context: ComponentContext, segs: Seg[], isMirrors: boolean): void;
- export function computeEventDraggable(context: ComponentContext, eventDef: EventDef, eventUi: EventUi): boolean;
- export function computeEventStartResizable(context: ComponentContext, eventDef: EventDef, eventUi: EventUi): any;
- export function computeEventEndResizable(context: ComponentContext, eventDef: EventDef, eventUi: EventUi): boolean;
-}
-
-declare module '@fullcalendar/core/common/DayTable' {
- import DaySeries from '@fullcalendar/core/common/DaySeries';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { Seg } from '@fullcalendar/core/component/DateComponent';
- export interface DayTableSeg extends Seg {
- row: number;
- firstCol: number;
- lastCol: number;
- }
- export interface DayTableCell {
- date: DateMarker;
- htmlAttrs?: string;
- }
- export { DayTable as default, DayTable };
- class DayTable {
- rowCnt: number;
- colCnt: number;
- cells: DayTableCell[][];
- headerDates: DateMarker[];
- constructor(daySeries: DaySeries, breakOnWeeks: boolean);
- sliceRange(range: DateRange): DayTableSeg[];
- }
-}
-
-declare module '@fullcalendar/core/common/slicing-utils' {
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { EventUiHash } from '@fullcalendar/core/component/event-ui';
- import { DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- import DateComponent, { Seg, EventSegUiInteractionState } from '@fullcalendar/core/component/DateComponent';
- import { DateSpan } from '@fullcalendar/core/structs/date-span';
- import { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import Calendar from '@fullcalendar/core/Calendar';
- export interface SliceableProps {
- dateSelection: DateSpan;
- businessHours: EventStore;
- eventStore: EventStore;
- eventDrag: EventInteractionState | null;
- eventResize: EventInteractionState | null;
- eventSelection: string;
- eventUiBases: EventUiHash;
- }
- export interface SlicedProps<SegType extends Seg> {
- dateSelectionSegs: SegType[];
- businessHourSegs: SegType[];
- fgEventSegs: SegType[];
- bgEventSegs: SegType[];
- eventDrag: EventSegUiInteractionState | null;
- eventResize: EventSegUiInteractionState | null;
- eventSelection: string;
- }
- export { Slicer as default, Slicer };
- abstract class Slicer<SegType extends Seg, ExtraArgs extends any[] = []> {
- abstract sliceRange(dateRange: DateRange, ...extraArgs: ExtraArgs): SegType[];
- sliceProps(props: SliceableProps, dateProfile: DateProfile, nextDayThreshold: Duration | null, calendar: Calendar, component: DateComponent<any>, // TODO: kill
- ...extraArgs: ExtraArgs): SlicedProps<SegType>;
- sliceNowDate(// does not memoize
- date: DateMarker, component: DateComponent<any>, // TODO: kill
- ...extraArgs: ExtraArgs): SegType[];
- }
-}
-
-declare module '@fullcalendar/core/structs/event-mutation' {
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { EventDef } from '@fullcalendar/core/structs/event';
- import Calendar from '@fullcalendar/core/Calendar';
- import { EventUiHash } from '@fullcalendar/core/component/event-ui';
- export interface EventMutation {
- datesDelta?: Duration;
- startDelta?: Duration;
- endDelta?: Duration;
- standardProps?: any;
- extendedProps?: any;
- }
- export function applyMutationToEventStore(eventStore: EventStore, eventConfigBase: EventUiHash, mutation: EventMutation, calendar: Calendar): EventStore;
- export type eventDefMutationApplier = (eventDef: EventDef, mutation: EventMutation, calendar: Calendar) => void;
-}
-
-declare module '@fullcalendar/core/validation' {
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import Calendar from '@fullcalendar/core/Calendar';
- import { DateSpan, DateSpanApi } from '@fullcalendar/core/structs/date-span';
- import EventApi from '@fullcalendar/core/api/EventApi';
- import { EventInput } from '@fullcalendar/core/structs/event';
- import { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
- import { SplittableProps } from '@fullcalendar/core/component/event-splitting';
- export type ConstraintInput = 'businessHours' | string | EventInput | EventInput[];
- export type Constraint = 'businessHours' | string | EventStore | false;
- export type OverlapFunc = ((stillEvent: EventApi, movingEvent: EventApi | null) => boolean);
- export type AllowFunc = (span: DateSpanApi, movingEvent: EventApi | null) => boolean;
- export type isPropsValidTester = (props: SplittableProps, calendar: Calendar) => boolean;
- export function isInteractionValid(interaction: EventInteractionState, calendar: Calendar): boolean;
- export function isDateSelectionValid(dateSelection: DateSpan, calendar: Calendar): boolean;
- export function isPropsValid(state: SplittableProps, calendar: Calendar, dateSpanMeta?: {}, filterConfig?: any): boolean;
- export function normalizeConstraint(input: ConstraintInput, calendar: Calendar): Constraint | null;
-}
-
-declare module '@fullcalendar/core/api/EventApi' {
- import Calendar from '@fullcalendar/core/Calendar';
- import { EventDef, EventInstance } from '@fullcalendar/core/structs/event';
- import { EventMutation } from '@fullcalendar/core/structs/event-mutation';
- import { DateInput } from '@fullcalendar/core/datelib/env';
- import { DurationInput } from '@fullcalendar/core/datelib/duration';
- import { FormatterInput } from '@fullcalendar/core/datelib/formatting';
- import EventSourceApi from '@fullcalendar/core/api/EventSourceApi';
- export { EventApi as default, EventApi };
- class EventApi {
- _calendar: Calendar;
- _def: EventDef;
- _instance: EventInstance | null;
- constructor(calendar: Calendar, def: EventDef, instance?: EventInstance);
- setProp(name: string, val: string): void;
- setExtendedProp(name: string, val: any): void;
- setStart(startInput: DateInput, options?: {
- granularity?: string;
- maintainDuration?: boolean;
- }): void;
- setEnd(endInput: DateInput | null, options?: {
- granularity?: string;
- }): void;
- setDates(startInput: DateInput, endInput: DateInput | null, options?: {
- allDay?: boolean;
- granularity?: string;
- }): void;
- moveStart(deltaInput: DurationInput): void;
- moveEnd(deltaInput: DurationInput): void;
- moveDates(deltaInput: DurationInput): void;
- setAllDay(allDay: boolean, options?: {
- maintainDuration?: boolean;
- }): void;
- formatRange(formatInput: FormatterInput): any;
- mutate(mutation: EventMutation): void;
- remove(): void;
- readonly source: EventSourceApi | null;
- readonly start: Date | null;
- readonly end: Date | null;
- readonly id: string;
- readonly groupId: string;
- readonly allDay: boolean;
- readonly title: string;
- readonly url: string;
- readonly rendering: string;
- readonly startEditable: boolean;
- readonly durationEditable: boolean;
- readonly constraint: any;
- readonly overlap: any;
- readonly allow: any;
- readonly backgroundColor: string;
- readonly borderColor: string;
- readonly textColor: string;
- readonly classNames: string[];
- readonly extendedProps: any;
- }
-}
-
-declare module '@fullcalendar/core/util/requestJson' {
- export default function requestJson(method: string, url: string, params: object, successCallback: any, failureCallback: any): void;
-}
-
-declare module '@fullcalendar/core/datelib/locale' {
- export type LocaleCodeArg = string | string[];
- export type LocaleSingularArg = LocaleCodeArg | RawLocale;
- export interface Locale {
- codeArg: LocaleCodeArg;
- codes: string[];
- week: {
- dow: number;
- doy: number;
- };
- simpleNumberFormat: Intl.NumberFormat;
- options: any;
- }
- export interface RawLocale {
- code: string;
- [otherProp: string]: any;
- }
- export type RawLocaleMap = {
- [code: string]: RawLocale;
- };
- export interface RawLocaleInfo {
- map: RawLocaleMap;
- defaultCode: string;
- }
- export function parseRawLocales(explicitRawLocales: RawLocale[]): RawLocaleInfo;
- export function buildLocale(inputSingular: LocaleSingularArg, available: RawLocaleMap): Locale;
-}
-
-declare module '@fullcalendar/core/OptionsManager' {
- export { OptionsManager as default, OptionsManager };
- class OptionsManager {
- dirDefaults: any;
- localeDefaults: any;
- overrides: any;
- dynamicOverrides: any;
- computed: any;
- constructor(overrides: any);
- mutate(updates: any, removals: string[], isDynamic?: boolean): void;
- compute(): void;
- }
-}
-
-declare module '@fullcalendar/core/api/EventSourceApi' {
- import Calendar from '@fullcalendar/core/Calendar';
- import { EventSource } from '@fullcalendar/core/structs/event-source';
- export { EventSourceApi as default, EventSourceApi };
- class EventSourceApi {
- calendar: Calendar;
- internalEventSource: EventSource;
- constructor(calendar: Calendar, internalEventSource: EventSource);
- remove(): void;
- refetch(): void;
- readonly id: string;
- readonly url: string;
- }
-}
-
-declare module '@fullcalendar/core/structs/view-config' {
- import View from '@fullcalendar/core/View';
- import { ViewSpec } from '@fullcalendar/core/structs/view-spec';
- export type ViewClass = new (viewSpec: ViewSpec, parentEl: HTMLElement) => View;
- export interface ViewConfigObjectInput {
- type?: string;
- class?: ViewClass;
- [optionName: string]: any;
- }
- export type ViewConfigInput = ViewClass | ViewConfigObjectInput;
- export type ViewConfigInputHash = {
- [viewType: string]: ViewConfigInput;
- };
- export interface ViewConfig {
- superType: string;
- class: ViewClass | null;
- options: any;
- }
- export type ViewConfigHash = {
- [viewType: string]: ViewConfig;
- };
- export function parseViewConfigs(inputs: ViewConfigInputHash): ViewConfigHash;
-}
-
-declare module '@fullcalendar/core/datelib/calendar-system' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- export interface CalendarSystem {
- getMarkerYear(d: DateMarker): number;
- getMarkerMonth(d: DateMarker): number;
- getMarkerDay(d: DateMarker): number;
- arrayToMarker(arr: number[]): DateMarker;
- markerToArray(d: DateMarker): number[];
- }
- export function registerCalendarSystem(name: any, theClass: any): void;
- export function createCalendarSystem(name: any): any;
-}
-
-declare module '@fullcalendar/core/datelib/formatting-cmd' {
- import { DateFormatter, DateFormattingContext, ZonedMarker, VerboseFormattingArg } from '@fullcalendar/core/datelib/formatting';
- export type CmdFormatterFunc = (cmd: string, arg: VerboseFormattingArg) => string;
- export class CmdFormatter implements DateFormatter {
- cmdStr: string;
- separator: string;
- constructor(cmdStr: string, separator?: string);
- format(date: ZonedMarker, context: DateFormattingContext): string;
- formatRange(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext): string;
- }
-}
-
-declare module '@fullcalendar/core/datelib/formatting-func' {
- import { DateFormatter, DateFormattingContext, ZonedMarker, VerboseFormattingArg } from '@fullcalendar/core/datelib/formatting';
- export type FuncFormatterFunc = (arg: VerboseFormattingArg) => string;
- export class FuncFormatter implements DateFormatter {
- func: FuncFormatterFunc;
- constructor(func: FuncFormatterFunc);
- format(date: ZonedMarker, context: DateFormattingContext): string;
- formatRange(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext): string;
- }
-}
-
-declare module '@fullcalendar/core/event-sources/func-event-source' {
- import { EventSourceError } from '@fullcalendar/core/structs/event-source';
- import { EventInput } from '@fullcalendar/core/structs/event';
- export type EventSourceFunc = (arg: {
- start: Date;
- end: Date;
- timeZone: string;
- }, successCallback: (events: EventInput[]) => void, failureCallback: (error: EventSourceError) => void) => (void | PromiseLike<EventInput[]>);
- const _default: import("@fullcalendar/core/plugin-system").PluginDef;
- export default _default;
-}
-
-declare module '@fullcalendar/core/interactions/external-element-dragging' {
- import { DateSpan } from '@fullcalendar/core/structs/date-span';
- import { DragMeta } from '@fullcalendar/core/structs/drag-meta';
- export type ExternalDefTransform = (dateSpan: DateSpan, dragMeta: DragMeta) => any;
-}
-
-declare module '@fullcalendar/core/Toolbar' {
- import Component from '@fullcalendar/core/component/Component';
- export interface ToolbarRenderProps {
- layout: any;
- title: string;
- activeButton: string;
- isTodayEnabled: boolean;
- isPrevEnabled: boolean;
- isNextEnabled: boolean;
- }
- export { Toolbar as default, Toolbar };
- class Toolbar extends Component<ToolbarRenderProps> {
- el: HTMLElement;
- viewsWithButtons: any;
- constructor(extraClassName: any);
- destroy(): void;
- render(props: ToolbarRenderProps): void;
- renderLayout(layout: any): void;
- unrenderLayout(): void;
- renderSection(position: any, buttonStr: any): HTMLElement;
- updateToday(isTodayEnabled: any): void;
- updatePrev(isPrevEnabled: any): void;
- updateNext(isNextEnabled: any): void;
- updateTitle(text: any): void;
- updateActiveButton(buttonName?: any): void;
- toggleButtonEnabled(buttonName: any, bool: any): void;
- }
-}
-
diff --git a/library/fullcalendar/packages/core/main.esm.js b/library/fullcalendar/packages/core/main.esm.js
deleted file mode 100644
index a9cb1b462..000000000
--- a/library/fullcalendar/packages/core/main.esm.js
+++ /dev/null
@@ -1,8582 +0,0 @@
-/*!
-FullCalendar Core Package v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-// Creating
-// ----------------------------------------------------------------------------------------------------------------
-var elementPropHash = {
- className: true,
- colSpan: true,
- rowSpan: true
-};
-var containerTagHash = {
- '<tr': 'tbody',
- '<td': 'tr'
-};
-function createElement(tagName, attrs, content) {
- var el = document.createElement(tagName);
- if (attrs) {
- for (var attrName in attrs) {
- if (attrName === 'style') {
- applyStyle(el, attrs[attrName]);
- }
- else if (elementPropHash[attrName]) {
- el[attrName] = attrs[attrName];
- }
- else {
- el.setAttribute(attrName, attrs[attrName]);
- }
- }
- }
- if (typeof content === 'string') {
- el.innerHTML = content; // shortcut. no need to process HTML in any way
- }
- else if (content != null) {
- appendToElement(el, content);
- }
- return el;
-}
-function htmlToElement(html) {
- html = html.trim();
- var container = document.createElement(computeContainerTag(html));
- container.innerHTML = html;
- return container.firstChild;
-}
-function htmlToElements(html) {
- return Array.prototype.slice.call(htmlToNodeList(html));
-}
-function htmlToNodeList(html) {
- html = html.trim();
- var container = document.createElement(computeContainerTag(html));
- container.innerHTML = html;
- return container.childNodes;
-}
-// assumes html already trimmed and tag names are lowercase
-function computeContainerTag(html) {
- return containerTagHash[html.substr(0, 3) // faster than using regex
- ] || 'div';
-}
-function appendToElement(el, content) {
- var childNodes = normalizeContent(content);
- for (var i = 0; i < childNodes.length; i++) {
- el.appendChild(childNodes[i]);
- }
-}
-function prependToElement(parent, content) {
- var newEls = normalizeContent(content);
- var afterEl = parent.firstChild || null; // if no firstChild, will append to end, but that's okay, b/c there were no children
- for (var i = 0; i < newEls.length; i++) {
- parent.insertBefore(newEls[i], afterEl);
- }
-}
-function insertAfterElement(refEl, content) {
- var newEls = normalizeContent(content);
- var afterEl = refEl.nextSibling || null;
- for (var i = 0; i < newEls.length; i++) {
- refEl.parentNode.insertBefore(newEls[i], afterEl);
- }
-}
-function normalizeContent(content) {
- var els;
- if (typeof content === 'string') {
- els = htmlToElements(content);
- }
- else if (content instanceof Node) {
- els = [content];
- }
- else { // Node[] or NodeList
- els = Array.prototype.slice.call(content);
- }
- return els;
-}
-function removeElement(el) {
- if (el.parentNode) {
- el.parentNode.removeChild(el);
- }
-}
-// Querying
-// ----------------------------------------------------------------------------------------------------------------
-// from https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
-var matchesMethod = Element.prototype.matches ||
- Element.prototype.matchesSelector ||
- Element.prototype.msMatchesSelector;
-var closestMethod = Element.prototype.closest || function (selector) {
- // polyfill
- var el = this;
- if (!document.documentElement.contains(el)) {
- return null;
- }
- do {
- if (elementMatches(el, selector)) {
- return el;
- }
- el = el.parentElement || el.parentNode;
- } while (el !== null && el.nodeType === 1);
- return null;
-};
-function elementClosest(el, selector) {
- return closestMethod.call(el, selector);
-}
-function elementMatches(el, selector) {
- return matchesMethod.call(el, selector);
-}
-// accepts multiple subject els
-// returns a real array. good for methods like forEach
-function findElements(container, selector) {
- var containers = container instanceof HTMLElement ? [container] : container;
- var allMatches = [];
- for (var i = 0; i < containers.length; i++) {
- var matches = containers[i].querySelectorAll(selector);
- for (var j = 0; j < matches.length; j++) {
- allMatches.push(matches[j]);
- }
- }
- return allMatches;
-}
-// accepts multiple subject els
-// only queries direct child elements
-function findChildren(parent, selector) {
- var parents = parent instanceof HTMLElement ? [parent] : parent;
- var allMatches = [];
- for (var i = 0; i < parents.length; i++) {
- var childNodes = parents[i].children; // only ever elements
- for (var j = 0; j < childNodes.length; j++) {
- var childNode = childNodes[j];
- if (!selector || elementMatches(childNode, selector)) {
- allMatches.push(childNode);
- }
- }
- }
- return allMatches;
-}
-// Attributes
-// ----------------------------------------------------------------------------------------------------------------
-function forceClassName(el, className, bool) {
- if (bool) {
- el.classList.add(className);
- }
- else {
- el.classList.remove(className);
- }
-}
-// Style
-// ----------------------------------------------------------------------------------------------------------------
-var PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i;
-function applyStyle(el, props) {
- for (var propName in props) {
- applyStyleProp(el, propName, props[propName]);
- }
-}
-function applyStyleProp(el, name, val) {
- if (val == null) {
- el.style[name] = '';
- }
- else if (typeof val === 'number' && PIXEL_PROP_RE.test(name)) {
- el.style[name] = val + 'px';
- }
- else {
- el.style[name] = val;
- }
-}
-
-function pointInsideRect(point, rect) {
- return point.left >= rect.left &&
- point.left < rect.right &&
- point.top >= rect.top &&
- point.top < rect.bottom;
-}
-// Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false
-function intersectRects(rect1, rect2) {
- var res = {
- left: Math.max(rect1.left, rect2.left),
- right: Math.min(rect1.right, rect2.right),
- top: Math.max(rect1.top, rect2.top),
- bottom: Math.min(rect1.bottom, rect2.bottom)
- };
- if (res.left < res.right && res.top < res.bottom) {
- return res;
- }
- return false;
-}
-function translateRect(rect, deltaX, deltaY) {
- return {
- left: rect.left + deltaX,
- right: rect.right + deltaX,
- top: rect.top + deltaY,
- bottom: rect.bottom + deltaY
- };
-}
-// Returns a new point that will have been moved to reside within the given rectangle
-function constrainPoint(point, rect) {
- return {
- left: Math.min(Math.max(point.left, rect.left), rect.right),
- top: Math.min(Math.max(point.top, rect.top), rect.bottom)
- };
-}
-// Returns a point that is the center of the given rectangle
-function getRectCenter(rect) {
- return {
- left: (rect.left + rect.right) / 2,
- top: (rect.top + rect.bottom) / 2
- };
-}
-// Subtracts point2's coordinates from point1's coordinates, returning a delta
-function diffPoints(point1, point2) {
- return {
- left: point1.left - point2.left,
- top: point1.top - point2.top
- };
-}
-
-// Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side
-var isRtlScrollbarOnLeft = null;
-function getIsRtlScrollbarOnLeft() {
- if (isRtlScrollbarOnLeft === null) {
- isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft();
- }
- return isRtlScrollbarOnLeft;
-}
-function computeIsRtlScrollbarOnLeft() {
- var outerEl = createElement('div', {
- style: {
- position: 'absolute',
- top: -1000,
- left: 0,
- border: 0,
- padding: 0,
- overflow: 'scroll',
- direction: 'rtl'
- }
- }, '<div></div>');
- document.body.appendChild(outerEl);
- var innerEl = outerEl.firstChild;
- var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left;
- removeElement(outerEl);
- return res;
-}
-// The scrollbar width computations in computeEdges are sometimes flawed when it comes to
-// retina displays, rounding, and IE11. Massage them into a usable value.
-function sanitizeScrollbarWidth(width) {
- width = Math.max(0, width); // no negatives
- width = Math.round(width);
- return width;
-}
-
-function computeEdges(el, getPadding) {
- if (getPadding === void 0) { getPadding = false; }
- var computedStyle = window.getComputedStyle(el);
- var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0;
- var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0;
- var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0;
- var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;
- // must use offset(Width|Height) because compatible with client(Width|Height)
- var scrollbarLeftRight = sanitizeScrollbarWidth(el.offsetWidth - el.clientWidth - borderLeft - borderRight);
- var scrollbarBottom = sanitizeScrollbarWidth(el.offsetHeight - el.clientHeight - borderTop - borderBottom);
- var res = {
- borderLeft: borderLeft,
- borderRight: borderRight,
- borderTop: borderTop,
- borderBottom: borderBottom,
- scrollbarBottom: scrollbarBottom,
- scrollbarLeft: 0,
- scrollbarRight: 0
- };
- if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side?
- res.scrollbarLeft = scrollbarLeftRight;
- }
- else {
- res.scrollbarRight = scrollbarLeftRight;
- }
- if (getPadding) {
- res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
- res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
- res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;
- res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0;
- }
- return res;
-}
-function computeInnerRect(el, goWithinPadding) {
- if (goWithinPadding === void 0) { goWithinPadding = false; }
- var outerRect = computeRect(el);
- var edges = computeEdges(el, goWithinPadding);
- var res = {
- left: outerRect.left + edges.borderLeft + edges.scrollbarLeft,
- right: outerRect.right - edges.borderRight - edges.scrollbarRight,
- top: outerRect.top + edges.borderTop,
- bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom
- };
- if (goWithinPadding) {
- res.left += edges.paddingLeft;
- res.right -= edges.paddingRight;
- res.top += edges.paddingTop;
- res.bottom -= edges.paddingBottom;
- }
- return res;
-}
-function computeRect(el) {
- var rect = el.getBoundingClientRect();
- return {
- left: rect.left + window.pageXOffset,
- top: rect.top + window.pageYOffset,
- right: rect.right + window.pageXOffset,
- bottom: rect.bottom + window.pageYOffset
- };
-}
-function computeViewportRect() {
- return {
- left: window.pageXOffset,
- right: window.pageXOffset + document.documentElement.clientWidth,
- top: window.pageYOffset,
- bottom: window.pageYOffset + document.documentElement.clientHeight
- };
-}
-function computeHeightAndMargins(el) {
- return el.getBoundingClientRect().height + computeVMargins(el);
-}
-function computeVMargins(el) {
- var computed = window.getComputedStyle(el);
- return parseInt(computed.marginTop, 10) +
- parseInt(computed.marginBottom, 10);
-}
-// does not return window
-function getClippingParents(el) {
- var parents = [];
- while (el instanceof HTMLElement) { // will stop when gets to document or null
- var computedStyle = window.getComputedStyle(el);
- if (computedStyle.position === 'fixed') {
- break;
- }
- if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) {
- parents.push(el);
- }
- el = el.parentNode;
- }
- return parents;
-}
-function computeClippingRect(el) {
- return getClippingParents(el)
- .map(function (el) {
- return computeInnerRect(el);
- })
- .concat(computeViewportRect())
- .reduce(function (rect0, rect1) {
- return intersectRects(rect0, rect1) || rect1; // should always intersect
- });
-}
-
-// Stops a mouse/touch event from doing it's native browser action
-function preventDefault(ev) {
- ev.preventDefault();
-}
-// Event Delegation
-// ----------------------------------------------------------------------------------------------------------------
-function listenBySelector(container, eventType, selector, handler) {
- function realHandler(ev) {
- var matchedChild = elementClosest(ev.target, selector);
- if (matchedChild) {
- handler.call(matchedChild, ev, matchedChild);
- }
- }
- container.addEventListener(eventType, realHandler);
- return function () {
- container.removeEventListener(eventType, realHandler);
- };
-}
-function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) {
- var currentMatchedChild;
- return listenBySelector(container, 'mouseover', selector, function (ev, matchedChild) {
- if (matchedChild !== currentMatchedChild) {
- currentMatchedChild = matchedChild;
- onMouseEnter(ev, matchedChild);
- var realOnMouseLeave_1 = function (ev) {
- currentMatchedChild = null;
- onMouseLeave(ev, matchedChild);
- matchedChild.removeEventListener('mouseleave', realOnMouseLeave_1);
- };
- // listen to the next mouseleave, and then unattach
- matchedChild.addEventListener('mouseleave', realOnMouseLeave_1);
- }
- });
-}
-// Animation
-// ----------------------------------------------------------------------------------------------------------------
-var transitionEventNames = [
- 'webkitTransitionEnd',
- 'otransitionend',
- 'oTransitionEnd',
- 'msTransitionEnd',
- 'transitionend'
-];
-// triggered only when the next single subsequent transition finishes
-function whenTransitionDone(el, callback) {
- var realCallback = function (ev) {
- callback(ev);
- transitionEventNames.forEach(function (eventName) {
- el.removeEventListener(eventName, realCallback);
- });
- };
- transitionEventNames.forEach(function (eventName) {
- el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes
- });
-}
-
-var DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
-// Adding
-function addWeeks(m, n) {
- var a = dateToUtcArray(m);
- a[2] += n * 7;
- return arrayToUtcDate(a);
-}
-function addDays(m, n) {
- var a = dateToUtcArray(m);
- a[2] += n;
- return arrayToUtcDate(a);
-}
-function addMs(m, n) {
- var a = dateToUtcArray(m);
- a[6] += n;
- return arrayToUtcDate(a);
-}
-// Diffing (all return floats)
-function diffWeeks(m0, m1) {
- return diffDays(m0, m1) / 7;
-}
-function diffDays(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24);
-}
-function diffHours(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60);
-}
-function diffMinutes(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60);
-}
-function diffSeconds(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / 1000;
-}
-function diffDayAndTime(m0, m1) {
- var m0day = startOfDay(m0);
- var m1day = startOfDay(m1);
- return {
- years: 0,
- months: 0,
- days: Math.round(diffDays(m0day, m1day)),
- milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf())
- };
-}
-// Diffing Whole Units
-function diffWholeWeeks(m0, m1) {
- var d = diffWholeDays(m0, m1);
- if (d !== null && d % 7 === 0) {
- return d / 7;
- }
- return null;
-}
-function diffWholeDays(m0, m1) {
- if (timeAsMs(m0) === timeAsMs(m1)) {
- return Math.round(diffDays(m0, m1));
- }
- return null;
-}
-// Start-Of
-function startOfDay(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate()
- ]);
-}
-function startOfHour(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate(),
- m.getUTCHours()
- ]);
-}
-function startOfMinute(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate(),
- m.getUTCHours(),
- m.getUTCMinutes()
- ]);
-}
-function startOfSecond(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate(),
- m.getUTCHours(),
- m.getUTCMinutes(),
- m.getUTCSeconds()
- ]);
-}
-// Week Computation
-function weekOfYear(marker, dow, doy) {
- var y = marker.getUTCFullYear();
- var w = weekOfGivenYear(marker, y, dow, doy);
- if (w < 1) {
- return weekOfGivenYear(marker, y - 1, dow, doy);
- }
- var nextW = weekOfGivenYear(marker, y + 1, dow, doy);
- if (nextW >= 1) {
- return Math.min(w, nextW);
- }
- return w;
-}
-function weekOfGivenYear(marker, year, dow, doy) {
- var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]);
- var dayStart = startOfDay(marker);
- var days = Math.round(diffDays(firstWeekStart, dayStart));
- return Math.floor(days / 7) + 1; // zero-indexed
-}
-// start-of-first-week - start-of-year
-function firstWeekOffset(year, dow, doy) {
- // first-week day -- which january is always in the first week (4 for iso, 1 for other)
- var fwd = 7 + dow - doy;
- // first-week day local weekday -- which local weekday is fwd
- var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7;
- return -fwdlw + fwd - 1;
-}
-// Array Conversion
-function dateToLocalArray(date) {
- return [
- date.getFullYear(),
- date.getMonth(),
- date.getDate(),
- date.getHours(),
- date.getMinutes(),
- date.getSeconds(),
- date.getMilliseconds()
- ];
-}
-function arrayToLocalDate(a) {
- return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month
- a[3] || 0, a[4] || 0, a[5] || 0);
-}
-function dateToUtcArray(date) {
- return [
- date.getUTCFullYear(),
- date.getUTCMonth(),
- date.getUTCDate(),
- date.getUTCHours(),
- date.getUTCMinutes(),
- date.getUTCSeconds(),
- date.getUTCMilliseconds()
- ];
-}
-function arrayToUtcDate(a) {
- // according to web standards (and Safari), a month index is required.
- // massage if only given a year.
- if (a.length === 1) {
- a = a.concat([0]);
- }
- return new Date(Date.UTC.apply(Date, a));
-}
-// Other Utils
-function isValidDate(m) {
- return !isNaN(m.valueOf());
-}
-function timeAsMs(m) {
- return m.getUTCHours() * 1000 * 60 * 60 +
- m.getUTCMinutes() * 1000 * 60 +
- m.getUTCSeconds() * 1000 +
- m.getUTCMilliseconds();
-}
-
-var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds'];
-var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;
-// Parsing and Creation
-function createDuration(input, unit) {
- var _a;
- if (typeof input === 'string') {
- return parseString(input);
- }
- else if (typeof input === 'object' && input) { // non-null object
- return normalizeObject(input);
- }
- else if (typeof input === 'number') {
- return normalizeObject((_a = {}, _a[unit || 'milliseconds'] = input, _a));
- }
- else {
- return null;
- }
-}
-function parseString(s) {
- var m = PARSE_RE.exec(s);
- if (m) {
- var sign = m[1] ? -1 : 1;
- return {
- years: 0,
- months: 0,
- days: sign * (m[2] ? parseInt(m[2], 10) : 0),
- milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours
- (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes
- (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds
- (m[6] ? parseInt(m[6], 10) : 0) // ms
- )
- };
- }
- return null;
-}
-function normalizeObject(obj) {
- return {
- years: obj.years || obj.year || 0,
- months: obj.months || obj.month || 0,
- days: (obj.days || obj.day || 0) +
- getWeeksFromInput(obj) * 7,
- milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours
- (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes
- (obj.seconds || obj.second || 0) * 1000 + // seconds
- (obj.milliseconds || obj.millisecond || obj.ms || 0) // ms
- };
-}
-function getWeeksFromInput(obj) {
- return obj.weeks || obj.week || 0;
-}
-// Equality
-function durationsEqual(d0, d1) {
- return d0.years === d1.years &&
- d0.months === d1.months &&
- d0.days === d1.days &&
- d0.milliseconds === d1.milliseconds;
-}
-function isSingleDay(dur) {
- return dur.years === 0 && dur.months === 0 && dur.days === 1 && dur.milliseconds === 0;
-}
-// Simple Math
-function addDurations(d0, d1) {
- return {
- years: d0.years + d1.years,
- months: d0.months + d1.months,
- days: d0.days + d1.days,
- milliseconds: d0.milliseconds + d1.milliseconds
- };
-}
-function subtractDurations(d1, d0) {
- return {
- years: d1.years - d0.years,
- months: d1.months - d0.months,
- days: d1.days - d0.days,
- milliseconds: d1.milliseconds - d0.milliseconds
- };
-}
-function multiplyDuration(d, n) {
- return {
- years: d.years * n,
- months: d.months * n,
- days: d.days * n,
- milliseconds: d.milliseconds * n
- };
-}
-// Conversions
-// "Rough" because they are based on average-case Gregorian months/years
-function asRoughYears(dur) {
- return asRoughDays(dur) / 365;
-}
-function asRoughMonths(dur) {
- return asRoughDays(dur) / 30;
-}
-function asRoughDays(dur) {
- return asRoughMs(dur) / 864e5;
-}
-function asRoughMinutes(dur) {
- return asRoughMs(dur) / (1000 * 60);
-}
-function asRoughSeconds(dur) {
- return asRoughMs(dur) / 1000;
-}
-function asRoughMs(dur) {
- return dur.years * (365 * 864e5) +
- dur.months * (30 * 864e5) +
- dur.days * 864e5 +
- dur.milliseconds;
-}
-// Advanced Math
-function wholeDivideDurations(numerator, denominator) {
- var res = null;
- for (var i = 0; i < INTERNAL_UNITS.length; i++) {
- var unit = INTERNAL_UNITS[i];
- if (denominator[unit]) {
- var localRes = numerator[unit] / denominator[unit];
- if (!isInt(localRes) || (res !== null && res !== localRes)) {
- return null;
- }
- res = localRes;
- }
- else if (numerator[unit]) {
- // needs to divide by something but can't!
- return null;
- }
- }
- return res;
-}
-function greatestDurationDenominator(dur, dontReturnWeeks) {
- var ms = dur.milliseconds;
- if (ms) {
- if (ms % 1000 !== 0) {
- return { unit: 'millisecond', value: ms };
- }
- if (ms % (1000 * 60) !== 0) {
- return { unit: 'second', value: ms / 1000 };
- }
- if (ms % (1000 * 60 * 60) !== 0) {
- return { unit: 'minute', value: ms / (1000 * 60) };
- }
- if (ms) {
- return { unit: 'hour', value: ms / (1000 * 60 * 60) };
- }
- }
- if (dur.days) {
- if (!dontReturnWeeks && dur.days % 7 === 0) {
- return { unit: 'week', value: dur.days / 7 };
- }
- return { unit: 'day', value: dur.days };
- }
- if (dur.months) {
- return { unit: 'month', value: dur.months };
- }
- if (dur.years) {
- return { unit: 'year', value: dur.years };
- }
- return { unit: 'millisecond', value: 0 };
-}
-
-/* FullCalendar-specific DOM Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-// Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left
-// and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.
-function compensateScroll(rowEl, scrollbarWidths) {
- if (scrollbarWidths.left) {
- applyStyle(rowEl, {
- borderLeftWidth: 1,
- marginLeft: scrollbarWidths.left - 1
- });
- }
- if (scrollbarWidths.right) {
- applyStyle(rowEl, {
- borderRightWidth: 1,
- marginRight: scrollbarWidths.right - 1
- });
- }
-}
-// Undoes compensateScroll and restores all borders/margins
-function uncompensateScroll(rowEl) {
- applyStyle(rowEl, {
- marginLeft: '',
- marginRight: '',
- borderLeftWidth: '',
- borderRightWidth: ''
- });
-}
-// Make the mouse cursor express that an event is not allowed in the current area
-function disableCursor() {
- document.body.classList.add('fc-not-allowed');
-}
-// Returns the mouse cursor to its original look
-function enableCursor() {
- document.body.classList.remove('fc-not-allowed');
-}
-// Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.
-// By default, all elements that are shorter than the recommended height are expanded uniformly, not considering
-// any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and
-// reduces the available height.
-function distributeHeight(els, availableHeight, shouldRedistribute) {
- // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,
- // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.
- var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element
- var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*
- var flexEls = []; // elements that are allowed to expand. array of DOM nodes
- var flexOffsets = []; // amount of vertical space it takes up
- var flexHeights = []; // actual css height
- var usedHeight = 0;
- undistributeHeight(els); // give all elements their natural height
- // find elements that are below the recommended height (expandable).
- // important to query for heights in a single first pass (to avoid reflow oscillation).
- els.forEach(function (el, i) {
- var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;
- var naturalHeight = el.getBoundingClientRect().height;
- var naturalOffset = naturalHeight + computeVMargins(el);
- if (naturalOffset < minOffset) {
- flexEls.push(el);
- flexOffsets.push(naturalOffset);
- flexHeights.push(naturalHeight);
- }
- else {
- // this element stretches past recommended height (non-expandable). mark the space as occupied.
- usedHeight += naturalOffset;
- }
- });
- // readjust the recommended height to only consider the height available to non-maxed-out rows.
- if (shouldRedistribute) {
- availableHeight -= usedHeight;
- minOffset1 = Math.floor(availableHeight / flexEls.length);
- minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*
- }
- // assign heights to all expandable elements
- flexEls.forEach(function (el, i) {
- var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;
- var naturalOffset = flexOffsets[i];
- var naturalHeight = flexHeights[i];
- var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding
- if (naturalOffset < minOffset) { // we check this again because redistribution might have changed things
- el.style.height = newHeight + 'px';
- }
- });
-}
-// Undoes distrubuteHeight, restoring all els to their natural height
-function undistributeHeight(els) {
- els.forEach(function (el) {
- el.style.height = '';
- });
-}
-// Given `els`, a set of <td> cells, find the cell with the largest natural width and set the widths of all the
-// cells to be that width.
-// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline
-function matchCellWidths(els) {
- var maxInnerWidth = 0;
- els.forEach(function (el) {
- var innerEl = el.firstChild; // hopefully an element
- if (innerEl instanceof HTMLElement) {
- var innerWidth_1 = innerEl.getBoundingClientRect().width;
- if (innerWidth_1 > maxInnerWidth) {
- maxInnerWidth = innerWidth_1;
- }
- }
- });
- maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance
- els.forEach(function (el) {
- el.style.width = maxInnerWidth + 'px';
- });
- return maxInnerWidth;
-}
-// Given one element that resides inside another,
-// Subtracts the height of the inner element from the outer element.
-function subtractInnerElHeight(outerEl, innerEl) {
- // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked
- var reflowStyleProps = {
- position: 'relative',
- left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll
- };
- applyStyle(outerEl, reflowStyleProps);
- applyStyle(innerEl, reflowStyleProps);
- var diff = // grab the dimensions
- outerEl.getBoundingClientRect().height -
- innerEl.getBoundingClientRect().height;
- // undo hack
- var resetStyleProps = { position: '', left: '' };
- applyStyle(outerEl, resetStyleProps);
- applyStyle(innerEl, resetStyleProps);
- return diff;
-}
-/* Selection
-----------------------------------------------------------------------------------------------------------------------*/
-function preventSelection(el) {
- el.classList.add('fc-unselectable');
- el.addEventListener('selectstart', preventDefault);
-}
-function allowSelection(el) {
- el.classList.remove('fc-unselectable');
- el.removeEventListener('selectstart', preventDefault);
-}
-/* Context Menu
-----------------------------------------------------------------------------------------------------------------------*/
-function preventContextMenu(el) {
- el.addEventListener('contextmenu', preventDefault);
-}
-function allowContextMenu(el) {
- el.removeEventListener('contextmenu', preventDefault);
-}
-/* Object Ordering by Field
-----------------------------------------------------------------------------------------------------------------------*/
-function parseFieldSpecs(input) {
- var specs = [];
- var tokens = [];
- var i;
- var token;
- if (typeof input === 'string') {
- tokens = input.split(/\s*,\s*/);
- }
- else if (typeof input === 'function') {
- tokens = [input];
- }
- else if (Array.isArray(input)) {
- tokens = input;
- }
- for (i = 0; i < tokens.length; i++) {
- token = tokens[i];
- if (typeof token === 'string') {
- specs.push(token.charAt(0) === '-' ?
- { field: token.substring(1), order: -1 } :
- { field: token, order: 1 });
- }
- else if (typeof token === 'function') {
- specs.push({ func: token });
- }
- }
- return specs;
-}
-function compareByFieldSpecs(obj0, obj1, fieldSpecs) {
- var i;
- var cmp;
- for (i = 0; i < fieldSpecs.length; i++) {
- cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]);
- if (cmp) {
- return cmp;
- }
- }
- return 0;
-}
-function compareByFieldSpec(obj0, obj1, fieldSpec) {
- if (fieldSpec.func) {
- return fieldSpec.func(obj0, obj1);
- }
- return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field])
- * (fieldSpec.order || 1);
-}
-function flexibleCompare(a, b) {
- if (!a && !b) {
- return 0;
- }
- if (b == null) {
- return -1;
- }
- if (a == null) {
- return 1;
- }
- if (typeof a === 'string' || typeof b === 'string') {
- return String(a).localeCompare(String(b));
- }
- return a - b;
-}
-/* String Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-function capitaliseFirstLetter(str) {
- return str.charAt(0).toUpperCase() + str.slice(1);
-}
-function padStart(val, len) {
- var s = String(val);
- return '000'.substr(0, len - s.length) + s;
-}
-/* Number Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-function compareNumbers(a, b) {
- return a - b;
-}
-function isInt(n) {
- return n % 1 === 0;
-}
-/* Weird Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-function applyAll(functions, thisObj, args) {
- if (typeof functions === 'function') { // supplied a single function
- functions = [functions];
- }
- if (functions) {
- var i = void 0;
- var ret = void 0;
- for (i = 0; i < functions.length; i++) {
- ret = functions[i].apply(thisObj, args) || ret;
- }
- return ret;
- }
-}
-function firstDefined() {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- for (var i = 0; i < args.length; i++) {
- if (args[i] !== undefined) {
- return args[i];
- }
- }
-}
-// Returns a function, that, as long as it continues to be invoked, will not
-// be triggered. The function will be called after it stops being called for
-// N milliseconds. If `immediate` is passed, trigger the function on the
-// leading edge, instead of the trailing.
-// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714
-function debounce(func, wait) {
- var timeout;
- var args;
- var context;
- var timestamp;
- var result;
- var later = function () {
- var last = new Date().valueOf() - timestamp;
- if (last < wait) {
- timeout = setTimeout(later, wait - last);
- }
- else {
- timeout = null;
- result = func.apply(context, args);
- context = args = null;
- }
- };
- return function () {
- context = this;
- args = arguments;
- timestamp = new Date().valueOf();
- if (!timeout) {
- timeout = setTimeout(later, wait);
- }
- return result;
- };
-}
-// Number and Boolean are only types that defaults or not computed for
-// TODO: write more comments
-function refineProps(rawProps, processors, defaults, leftoverProps) {
- if (defaults === void 0) { defaults = {}; }
- var refined = {};
- for (var key in processors) {
- var processor = processors[key];
- if (rawProps[key] !== undefined) {
- // found
- if (processor === Function) {
- refined[key] = typeof rawProps[key] === 'function' ? rawProps[key] : null;
- }
- else if (processor) { // a refining function?
- refined[key] = processor(rawProps[key]);
- }
- else {
- refined[key] = rawProps[key];
- }
- }
- else if (defaults[key] !== undefined) {
- // there's an explicit default
- refined[key] = defaults[key];
- }
- else {
- // must compute a default
- if (processor === String) {
- refined[key] = ''; // empty string is default for String
- }
- else if (!processor || processor === Number || processor === Boolean || processor === Function) {
- refined[key] = null; // assign null for other non-custom processor funcs
- }
- else {
- refined[key] = processor(null); // run the custom processor func
- }
- }
- }
- if (leftoverProps) {
- for (var key in rawProps) {
- if (processors[key] === undefined) {
- leftoverProps[key] = rawProps[key];
- }
- }
- }
- return refined;
-}
-/* Date stuff that doesn't belong in datelib core
-----------------------------------------------------------------------------------------------------------------------*/
-// given a timed range, computes an all-day range that has the same exact duration,
-// but whose start time is aligned with the start of the day.
-function computeAlignedDayRange(timedRange) {
- var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1;
- var start = startOfDay(timedRange.start);
- var end = addDays(start, dayCnt);
- return { start: start, end: end };
-}
-// given a timed range, computes an all-day range based on how for the end date bleeds into the next day
-// TODO: give nextDayThreshold a default arg
-function computeVisibleDayRange(timedRange, nextDayThreshold) {
- if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); }
- var startDay = null;
- var endDay = null;
- if (timedRange.end) {
- endDay = startOfDay(timedRange.end);
- var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay`
- // If the end time is actually inclusively part of the next day and is equal to or
- // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.
- // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.
- if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) {
- endDay = addDays(endDay, 1);
- }
- }
- if (timedRange.start) {
- startDay = startOfDay(timedRange.start); // the beginning of the day the range starts
- // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.
- if (endDay && endDay <= startDay) {
- endDay = addDays(startDay, 1);
- }
- }
- return { start: startDay, end: endDay };
-}
-// spans from one day into another?
-function isMultiDayRange(range) {
- var visibleRange = computeVisibleDayRange(range);
- return diffDays(visibleRange.start, visibleRange.end) > 1;
-}
-function diffDates(date0, date1, dateEnv, largeUnit) {
- if (largeUnit === 'year') {
- return createDuration(dateEnv.diffWholeYears(date0, date1), 'year');
- }
- else if (largeUnit === 'month') {
- return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month');
- }
- else {
- return diffDayAndTime(date0, date1); // returns a duration
- }
-}
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
-};
-
-function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
-};
-
-function parseRecurring(eventInput, allDayDefault, dateEnv, recurringTypes, leftovers) {
- for (var i = 0; i < recurringTypes.length; i++) {
- var localLeftovers = {};
- var parsed = recurringTypes[i].parse(eventInput, localLeftovers, dateEnv);
- if (parsed) {
- var allDay = localLeftovers.allDay;
- delete localLeftovers.allDay; // remove from leftovers
- if (allDay == null) {
- allDay = allDayDefault;
- if (allDay == null) {
- allDay = parsed.allDayGuess;
- if (allDay == null) {
- allDay = false;
- }
- }
- }
- __assign(leftovers, localLeftovers);
- return {
- allDay: allDay,
- duration: parsed.duration,
- typeData: parsed.typeData,
- typeId: i
- };
- }
- }
- return null;
-}
-/*
-Event MUST have a recurringDef
-*/
-function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) {
- var typeDef = recurringTypes[eventDef.recurringDef.typeId];
- var markers = typeDef.expand(eventDef.recurringDef.typeData, {
- start: dateEnv.subtract(framingRange.start, duration),
- end: framingRange.end
- }, dateEnv);
- // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to
- if (eventDef.allDay) {
- markers = markers.map(startOfDay);
- }
- return markers;
-}
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-// Merges an array of objects into a single object.
-// The second argument allows for an array of property names who's object values will be merged together.
-function mergeProps(propObjs, complexProps) {
- var dest = {};
- var i;
- var name;
- var complexObjs;
- var j;
- var val;
- var props;
- if (complexProps) {
- for (i = 0; i < complexProps.length; i++) {
- name = complexProps[i];
- complexObjs = [];
- // collect the trailing object values, stopping when a non-object is discovered
- for (j = propObjs.length - 1; j >= 0; j--) {
- val = propObjs[j][name];
- if (typeof val === 'object' && val) { // non-null object
- complexObjs.unshift(val);
- }
- else if (val !== undefined) {
- dest[name] = val; // if there were no objects, this value will be used
- break;
- }
- }
- // if the trailing values were objects, use the merged value
- if (complexObjs.length) {
- dest[name] = mergeProps(complexObjs);
- }
- }
- }
- // copy values into the destination, going from last to first
- for (i = propObjs.length - 1; i >= 0; i--) {
- props = propObjs[i];
- for (name in props) {
- if (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign
- dest[name] = props[name];
- }
- }
- }
- return dest;
-}
-function filterHash(hash, func) {
- var filtered = {};
- for (var key in hash) {
- if (func(hash[key], key)) {
- filtered[key] = hash[key];
- }
- }
- return filtered;
-}
-function mapHash(hash, func) {
- var newHash = {};
- for (var key in hash) {
- newHash[key] = func(hash[key], key);
- }
- return newHash;
-}
-function arrayToHash(a) {
- var hash = {};
- for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {
- var item = a_1[_i];
- hash[item] = true;
- }
- return hash;
-}
-function hashValuesToArray(obj) {
- var a = [];
- for (var key in obj) {
- a.push(obj[key]);
- }
- return a;
-}
-function isPropsEqual(obj0, obj1) {
- for (var key in obj0) {
- if (hasOwnProperty.call(obj0, key)) {
- if (!(key in obj1)) {
- return false;
- }
- }
- }
- for (var key in obj1) {
- if (hasOwnProperty.call(obj1, key)) {
- if (obj0[key] !== obj1[key]) {
- return false;
- }
- }
- }
- return true;
-}
-
-function parseEvents(rawEvents, sourceId, calendar, allowOpenRange) {
- var eventStore = createEmptyEventStore();
- for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) {
- var rawEvent = rawEvents_1[_i];
- var tuple = parseEvent(rawEvent, sourceId, calendar, allowOpenRange);
- if (tuple) {
- eventTupleToStore(tuple, eventStore);
- }
- }
- return eventStore;
-}
-function eventTupleToStore(tuple, eventStore) {
- if (eventStore === void 0) { eventStore = createEmptyEventStore(); }
- eventStore.defs[tuple.def.defId] = tuple.def;
- if (tuple.instance) {
- eventStore.instances[tuple.instance.instanceId] = tuple.instance;
- }
- return eventStore;
-}
-function expandRecurring(eventStore, framingRange, calendar) {
- var dateEnv = calendar.dateEnv;
- var defs = eventStore.defs, instances = eventStore.instances;
- // remove existing recurring instances
- instances = filterHash(instances, function (instance) {
- return !defs[instance.defId].recurringDef;
- });
- for (var defId in defs) {
- var def = defs[defId];
- if (def.recurringDef) {
- var duration = def.recurringDef.duration;
- if (!duration) {
- duration = def.allDay ?
- calendar.defaultAllDayEventDuration :
- calendar.defaultTimedEventDuration;
- }
- var starts = expandRecurringRanges(def, duration, framingRange, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes);
- for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) {
- var start = starts_1[_i];
- var instance = createEventInstance(defId, {
- start: start,
- end: dateEnv.add(start, duration)
- });
- instances[instance.instanceId] = instance;
- }
- }
- }
- return { defs: defs, instances: instances };
-}
-// retrieves events that have the same groupId as the instance specified by `instanceId`
-// or they are the same as the instance.
-// why might instanceId not be in the store? an event from another calendar?
-function getRelevantEvents(eventStore, instanceId) {
- var instance = eventStore.instances[instanceId];
- if (instance) {
- var def_1 = eventStore.defs[instance.defId];
- // get events/instances with same group
- var newStore = filterEventStoreDefs(eventStore, function (lookDef) {
- return isEventDefsGrouped(def_1, lookDef);
- });
- // add the original
- // TODO: wish we could use eventTupleToStore or something like it
- newStore.defs[def_1.defId] = def_1;
- newStore.instances[instance.instanceId] = instance;
- return newStore;
- }
- return createEmptyEventStore();
-}
-function isEventDefsGrouped(def0, def1) {
- return Boolean(def0.groupId && def0.groupId === def1.groupId);
-}
-function transformRawEvents(rawEvents, eventSource, calendar) {
- var calEachTransform = calendar.opt('eventDataTransform');
- var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
- if (sourceEachTransform) {
- rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
- }
- if (calEachTransform) {
- rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
- }
- return rawEvents;
-}
-function transformEachRawEvent(rawEvents, func) {
- var refinedEvents;
- if (!func) {
- refinedEvents = rawEvents;
- }
- else {
- refinedEvents = [];
- for (var _i = 0, rawEvents_2 = rawEvents; _i < rawEvents_2.length; _i++) {
- var rawEvent = rawEvents_2[_i];
- var refinedEvent = func(rawEvent);
- if (refinedEvent) {
- refinedEvents.push(refinedEvent);
- }
- else if (refinedEvent == null) {
- refinedEvents.push(rawEvent);
- } // if a different falsy value, do nothing
- }
- }
- return refinedEvents;
-}
-function createEmptyEventStore() {
- return { defs: {}, instances: {} };
-}
-function mergeEventStores(store0, store1) {
- return {
- defs: __assign({}, store0.defs, store1.defs),
- instances: __assign({}, store0.instances, store1.instances)
- };
-}
-function filterEventStoreDefs(eventStore, filterFunc) {
- var defs = filterHash(eventStore.defs, filterFunc);
- var instances = filterHash(eventStore.instances, function (instance) {
- return defs[instance.defId]; // still exists?
- });
- return { defs: defs, instances: instances };
-}
-
-function parseRange(input, dateEnv) {
- var start = null;
- var end = null;
- if (input.start) {
- start = dateEnv.createMarker(input.start);
- }
- if (input.end) {
- end = dateEnv.createMarker(input.end);
- }
- if (!start && !end) {
- return null;
- }
- if (start && end && end < start) {
- return null;
- }
- return { start: start, end: end };
-}
-// SIDE-EFFECT: will mutate ranges.
-// Will return a new array result.
-function invertRanges(ranges, constraintRange) {
- var invertedRanges = [];
- var start = constraintRange.start; // the end of the previous range. the start of the new range
- var i;
- var dateRange;
- // ranges need to be in order. required for our date-walking algorithm
- ranges.sort(compareRanges);
- for (i = 0; i < ranges.length; i++) {
- dateRange = ranges[i];
- // add the span of time before the event (if there is any)
- if (dateRange.start > start) { // compare millisecond time (skip any ambig logic)
- invertedRanges.push({ start: start, end: dateRange.start });
- }
- if (dateRange.end > start) {
- start = dateRange.end;
- }
- }
- // add the span of time after the last event (if there is any)
- if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic)
- invertedRanges.push({ start: start, end: constraintRange.end });
- }
- return invertedRanges;
-}
-function compareRanges(range0, range1) {
- return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first
-}
-function intersectRanges(range0, range1) {
- var start = range0.start;
- var end = range0.end;
- var newRange = null;
- if (range1.start !== null) {
- if (start === null) {
- start = range1.start;
- }
- else {
- start = new Date(Math.max(start.valueOf(), range1.start.valueOf()));
- }
- }
- if (range1.end != null) {
- if (end === null) {
- end = range1.end;
- }
- else {
- end = new Date(Math.min(end.valueOf(), range1.end.valueOf()));
- }
- }
- if (start === null || end === null || start < end) {
- newRange = { start: start, end: end };
- }
- return newRange;
-}
-function rangesEqual(range0, range1) {
- return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) &&
- (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf());
-}
-function rangesIntersect(range0, range1) {
- return (range0.end === null || range1.start === null || range0.end > range1.start) &&
- (range0.start === null || range1.end === null || range0.start < range1.end);
-}
-function rangeContainsRange(outerRange, innerRange) {
- return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) &&
- (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end));
-}
-function rangeContainsMarker(range, date) {
- return (range.start === null || date >= range.start) &&
- (range.end === null || date < range.end);
-}
-// If the given date is not within the given range, move it inside.
-// (If it's past the end, make it one millisecond before the end).
-function constrainMarkerToRange(date, range) {
- if (range.start != null && date < range.start) {
- return range.start;
- }
- if (range.end != null && date >= range.end) {
- return new Date(range.end.valueOf() - 1);
- }
- return date;
-}
-
-function removeExact(array, exactVal) {
- var removeCnt = 0;
- var i = 0;
- while (i < array.length) {
- if (array[i] === exactVal) {
- array.splice(i, 1);
- removeCnt++;
- }
- else {
- i++;
- }
- }
- return removeCnt;
-}
-function isArraysEqual(a0, a1) {
- var len = a0.length;
- var i;
- if (len !== a1.length) { // not array? or not same length?
- return false;
- }
- for (i = 0; i < len; i++) {
- if (a0[i] !== a1[i]) {
- return false;
- }
- }
- return true;
-}
-
-function memoize(workerFunc) {
- var args;
- var res;
- return function () {
- if (!args || !isArraysEqual(args, arguments)) {
- args = arguments;
- res = workerFunc.apply(this, arguments);
- }
- return res;
- };
-}
-/*
-always executes the workerFunc, but if the result is equal to the previous result,
-return the previous result instead.
-*/
-function memoizeOutput(workerFunc, equalityFunc) {
- var cachedRes = null;
- return function () {
- var newRes = workerFunc.apply(this, arguments);
- if (cachedRes === null || !(cachedRes === newRes || equalityFunc(cachedRes, newRes))) {
- cachedRes = newRes;
- }
- return cachedRes;
- };
-}
-
-var EXTENDED_SETTINGS_AND_SEVERITIES = {
- week: 3,
- separator: 0,
- omitZeroMinute: 0,
- meridiem: 0,
- omitCommas: 0
-};
-var STANDARD_DATE_PROP_SEVERITIES = {
- timeZoneName: 7,
- era: 6,
- year: 5,
- month: 4,
- day: 2,
- weekday: 2,
- hour: 1,
- minute: 1,
- second: 1
-};
-var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too
-var COMMA_RE = /,/g; // we need re for globalness
-var MULTI_SPACE_RE = /\s+/g;
-var LTR_RE = /\u200e/g; // control character
-var UTC_RE = /UTC|GMT/;
-var NativeFormatter = /** @class */ (function () {
- function NativeFormatter(formatSettings) {
- var standardDateProps = {};
- var extendedSettings = {};
- var severity = 0;
- for (var name_1 in formatSettings) {
- if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) {
- extendedSettings[name_1] = formatSettings[name_1];
- severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity);
- }
- else {
- standardDateProps[name_1] = formatSettings[name_1];
- if (name_1 in STANDARD_DATE_PROP_SEVERITIES) {
- severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity);
- }
- }
- }
- this.standardDateProps = standardDateProps;
- this.extendedSettings = extendedSettings;
- this.severity = severity;
- this.buildFormattingFunc = memoize(buildFormattingFunc);
- }
- NativeFormatter.prototype.format = function (date, context) {
- return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date);
- };
- NativeFormatter.prototype.formatRange = function (start, end, context) {
- var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings;
- var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem);
- if (!diffSeverity) {
- return this.format(start, context);
- }
- var biggestUnitForPartial = diffSeverity;
- if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time
- (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') &&
- (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') &&
- (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) {
- biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time
- }
- var full0 = this.format(start, context);
- var full1 = this.format(end, context);
- if (full0 === full1) {
- return full0;
- }
- var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial);
- var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context);
- var partial0 = partialFormattingFunc(start);
- var partial1 = partialFormattingFunc(end);
- var insertion = findCommonInsertion(full0, partial0, full1, partial1);
- var separator = extendedSettings.separator || '';
- if (insertion) {
- return insertion.before + partial0 + separator + partial1 + insertion.after;
- }
- return full0 + separator + full1;
- };
- NativeFormatter.prototype.getLargestUnit = function () {
- switch (this.severity) {
- case 7:
- case 6:
- case 5:
- return 'year';
- case 4:
- return 'month';
- case 3:
- return 'week';
- default:
- return 'day';
- }
- };
- return NativeFormatter;
-}());
-function buildFormattingFunc(standardDateProps, extendedSettings, context) {
- var standardDatePropCnt = Object.keys(standardDateProps).length;
- if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') {
- return function (date) {
- return formatTimeZoneOffset(date.timeZoneOffset);
- };
- }
- if (standardDatePropCnt === 0 && extendedSettings.week) {
- return function (date) {
- return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekLabel, context.locale, extendedSettings.week);
- };
- }
- return buildNativeFormattingFunc(standardDateProps, extendedSettings, context);
-}
-function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) {
- standardDateProps = __assign({}, standardDateProps); // copy
- extendedSettings = __assign({}, extendedSettings); // copy
- sanitizeSettings(standardDateProps, extendedSettings);
- standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers
- var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps);
- var zeroFormat; // needed?
- if (extendedSettings.omitZeroMinute) {
- var zeroProps = __assign({}, standardDateProps);
- delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings
- zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps);
- }
- return function (date) {
- var marker = date.marker;
- var format;
- if (zeroFormat && !marker.getUTCMinutes()) {
- format = zeroFormat;
- }
- else {
- format = normalFormat;
- }
- var s = format.format(marker);
- return postProcess(s, date, standardDateProps, extendedSettings, context);
- };
-}
-function sanitizeSettings(standardDateProps, extendedSettings) {
- // deal with a browser inconsistency where formatting the timezone
- // requires that the hour/minute be present.
- if (standardDateProps.timeZoneName) {
- if (!standardDateProps.hour) {
- standardDateProps.hour = '2-digit';
- }
- if (!standardDateProps.minute) {
- standardDateProps.minute = '2-digit';
- }
- }
- // only support short timezone names
- if (standardDateProps.timeZoneName === 'long') {
- standardDateProps.timeZoneName = 'short';
- }
- // if requesting to display seconds, MUST display minutes
- if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) {
- delete extendedSettings.omitZeroMinute;
- }
-}
-function postProcess(s, date, standardDateProps, extendedSettings, context) {
- s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes
- if (standardDateProps.timeZoneName === 'short') {
- s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ?
- 'UTC' : // important to normalize for IE, which does "GMT"
- formatTimeZoneOffset(date.timeZoneOffset));
- }
- if (extendedSettings.omitCommas) {
- s = s.replace(COMMA_RE, '').trim();
- }
- if (extendedSettings.omitZeroMinute) {
- s = s.replace(':00', ''); // zeroFormat doesn't always achieve this
- }
- // ^ do anything that might create adjacent spaces before this point,
- // because MERIDIEM_RE likes to eat up loading spaces
- if (extendedSettings.meridiem === false) {
- s = s.replace(MERIDIEM_RE, '').trim();
- }
- else if (extendedSettings.meridiem === 'narrow') { // a/p
- s = s.replace(MERIDIEM_RE, function (m0, m1) {
- return m1.toLocaleLowerCase();
- });
- }
- else if (extendedSettings.meridiem === 'short') { // am/pm
- s = s.replace(MERIDIEM_RE, function (m0, m1) {
- return m1.toLocaleLowerCase() + 'm';
- });
- }
- else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase
- s = s.replace(MERIDIEM_RE, function (m0) {
- return m0.toLocaleLowerCase();
- });
- }
- s = s.replace(MULTI_SPACE_RE, ' ');
- s = s.trim();
- return s;
-}
-function injectTzoStr(s, tzoStr) {
- var replaced = false;
- s = s.replace(UTC_RE, function () {
- replaced = true;
- return tzoStr;
- });
- // IE11 doesn't include UTC/GMT in the original string, so append to end
- if (!replaced) {
- s += ' ' + tzoStr;
- }
- return s;
-}
-function formatWeekNumber(num, weekLabel, locale, display) {
- var parts = [];
- if (display === 'narrow') {
- parts.push(weekLabel);
- }
- else if (display === 'short') {
- parts.push(weekLabel, ' ');
- }
- // otherwise, considered 'numeric'
- parts.push(locale.simpleNumberFormat.format(num));
- if (locale.options.isRtl) { // TODO: use control characters instead?
- parts.reverse();
- }
- return parts.join('');
-}
-// Range Formatting Utils
-// 0 = exactly the same
-// 1 = different by time
-// and bigger
-function computeMarkerDiffSeverity(d0, d1, ca) {
- if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) {
- return 5;
- }
- if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) {
- return 4;
- }
- if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) {
- return 2;
- }
- if (timeAsMs(d0) !== timeAsMs(d1)) {
- return 1;
- }
- return 0;
-}
-function computePartialFormattingOptions(options, biggestUnit) {
- var partialOptions = {};
- for (var name_2 in options) {
- if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone)
- STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) {
- partialOptions[name_2] = options[name_2];
- }
- }
- return partialOptions;
-}
-function findCommonInsertion(full0, partial0, full1, partial1) {
- var i0 = 0;
- while (i0 < full0.length) {
- var found0 = full0.indexOf(partial0, i0);
- if (found0 === -1) {
- break;
- }
- var before0 = full0.substr(0, found0);
- i0 = found0 + partial0.length;
- var after0 = full0.substr(i0);
- var i1 = 0;
- while (i1 < full1.length) {
- var found1 = full1.indexOf(partial1, i1);
- if (found1 === -1) {
- break;
- }
- var before1 = full1.substr(0, found1);
- i1 = found1 + partial1.length;
- var after1 = full1.substr(i1);
- if (before0 === before1 && after0 === after1) {
- return {
- before: before0,
- after: after0
- };
- }
- }
- }
- return null;
-}
-
-/*
-TODO: fix the terminology of "formatter" vs "formatting func"
-*/
-/*
-At the time of instantiation, this object does not know which cmd-formatting system it will use.
-It receives this at the time of formatting, as a setting.
-*/
-var CmdFormatter = /** @class */ (function () {
- function CmdFormatter(cmdStr, separator) {
- this.cmdStr = cmdStr;
- this.separator = separator;
- }
- CmdFormatter.prototype.format = function (date, context) {
- return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, this.separator));
- };
- CmdFormatter.prototype.formatRange = function (start, end, context) {
- return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, this.separator));
- };
- return CmdFormatter;
-}());
-
-var FuncFormatter = /** @class */ (function () {
- function FuncFormatter(func) {
- this.func = func;
- }
- FuncFormatter.prototype.format = function (date, context) {
- return this.func(createVerboseFormattingArg(date, null, context));
- };
- FuncFormatter.prototype.formatRange = function (start, end, context) {
- return this.func(createVerboseFormattingArg(start, end, context));
- };
- return FuncFormatter;
-}());
-
-// Formatter Object Creation
-function createFormatter(input, defaultSeparator) {
- if (typeof input === 'object' && input) { // non-null object
- if (typeof defaultSeparator === 'string') {
- input = __assign({ separator: defaultSeparator }, input);
- }
- return new NativeFormatter(input);
- }
- else if (typeof input === 'string') {
- return new CmdFormatter(input, defaultSeparator);
- }
- else if (typeof input === 'function') {
- return new FuncFormatter(input);
- }
-}
-// String Utils
-// timeZoneOffset is in minutes
-function buildIsoString(marker, timeZoneOffset, stripZeroTime) {
- if (stripZeroTime === void 0) { stripZeroTime = false; }
- var s = marker.toISOString();
- s = s.replace('.000', '');
- if (stripZeroTime) {
- s = s.replace('T00:00:00Z', '');
- }
- if (s.length > 10) { // time part wasn't stripped, can add timezone info
- if (timeZoneOffset == null) {
- s = s.replace('Z', '');
- }
- else if (timeZoneOffset !== 0) {
- s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true));
- }
- // otherwise, its UTC-0 and we want to keep the Z
- }
- return s;
-}
-function formatIsoTimeString(marker) {
- return padStart(marker.getUTCHours(), 2) + ':' +
- padStart(marker.getUTCMinutes(), 2) + ':' +
- padStart(marker.getUTCSeconds(), 2);
-}
-function formatTimeZoneOffset(minutes, doIso) {
- if (doIso === void 0) { doIso = false; }
- var sign = minutes < 0 ? '-' : '+';
- var abs = Math.abs(minutes);
- var hours = Math.floor(abs / 60);
- var mins = Math.round(abs % 60);
- if (doIso) {
- return sign + padStart(hours, 2) + ':' + padStart(mins, 2);
- }
- else {
- return 'GMT' + sign + hours + (mins ? ':' + padStart(mins, 2) : '');
- }
-}
-// Arg Utils
-function createVerboseFormattingArg(start, end, context, separator) {
- var startInfo = expandZonedMarker(start, context.calendarSystem);
- var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null;
- return {
- date: startInfo,
- start: startInfo,
- end: endInfo,
- timeZone: context.timeZone,
- localeCodes: context.locale.codes,
- separator: separator
- };
-}
-function expandZonedMarker(dateInfo, calendarSystem) {
- var a = calendarSystem.markerToArray(dateInfo.marker);
- return {
- marker: dateInfo.marker,
- timeZoneOffset: dateInfo.timeZoneOffset,
- array: a,
- year: a[0],
- month: a[1],
- day: a[2],
- hour: a[3],
- minute: a[4],
- second: a[5],
- millisecond: a[6]
- };
-}
-
-var EventSourceApi = /** @class */ (function () {
- function EventSourceApi(calendar, internalEventSource) {
- this.calendar = calendar;
- this.internalEventSource = internalEventSource;
- }
- EventSourceApi.prototype.remove = function () {
- this.calendar.dispatch({
- type: 'REMOVE_EVENT_SOURCE',
- sourceId: this.internalEventSource.sourceId
- });
- };
- EventSourceApi.prototype.refetch = function () {
- this.calendar.dispatch({
- type: 'FETCH_EVENT_SOURCES',
- sourceIds: [this.internalEventSource.sourceId]
- });
- };
- Object.defineProperty(EventSourceApi.prototype, "id", {
- get: function () {
- return this.internalEventSource.publicId;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventSourceApi.prototype, "url", {
- // only relevant to json-feed event sources
- get: function () {
- return this.internalEventSource.meta.url;
- },
- enumerable: true,
- configurable: true
- });
- return EventSourceApi;
-}());
-
-var EventApi = /** @class */ (function () {
- function EventApi(calendar, def, instance) {
- this._calendar = calendar;
- this._def = def;
- this._instance = instance || null;
- }
- /*
- TODO: make event struct more responsible for this
- */
- EventApi.prototype.setProp = function (name, val) {
- var _a, _b;
- if (name in DATE_PROPS) ;
- else if (name in NON_DATE_PROPS) {
- if (typeof NON_DATE_PROPS[name] === 'function') {
- val = NON_DATE_PROPS[name](val);
- }
- this.mutate({
- standardProps: (_a = {}, _a[name] = val, _a)
- });
- }
- else if (name in UNSCOPED_EVENT_UI_PROPS) {
- var ui = void 0;
- if (typeof UNSCOPED_EVENT_UI_PROPS[name] === 'function') {
- val = UNSCOPED_EVENT_UI_PROPS[name](val);
- }
- if (name === 'color') {
- ui = { backgroundColor: val, borderColor: val };
- }
- else if (name === 'editable') {
- ui = { startEditable: val, durationEditable: val };
- }
- else {
- ui = (_b = {}, _b[name] = val, _b);
- }
- this.mutate({
- standardProps: { ui: ui }
- });
- }
- };
- EventApi.prototype.setExtendedProp = function (name, val) {
- var _a;
- this.mutate({
- extendedProps: (_a = {}, _a[name] = val, _a)
- });
- };
- EventApi.prototype.setStart = function (startInput, options) {
- if (options === void 0) { options = {}; }
- var dateEnv = this._calendar.dateEnv;
- var start = dateEnv.createMarker(startInput);
- if (start && this._instance) { // TODO: warning if parsed bad
- var instanceRange = this._instance.range;
- var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!?
- if (options.maintainDuration) {
- this.mutate({ datesDelta: startDelta });
- }
- else {
- this.mutate({ startDelta: startDelta });
- }
- }
- };
- EventApi.prototype.setEnd = function (endInput, options) {
- if (options === void 0) { options = {}; }
- var dateEnv = this._calendar.dateEnv;
- var end;
- if (endInput != null) {
- end = dateEnv.createMarker(endInput);
- if (!end) {
- return; // TODO: warning if parsed bad
- }
- }
- if (this._instance) {
- if (end) {
- var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity);
- this.mutate({ endDelta: endDelta });
- }
- else {
- this.mutate({ standardProps: { hasEnd: false } });
- }
- }
- };
- EventApi.prototype.setDates = function (startInput, endInput, options) {
- if (options === void 0) { options = {}; }
- var dateEnv = this._calendar.dateEnv;
- var standardProps = { allDay: options.allDay };
- var start = dateEnv.createMarker(startInput);
- var end;
- if (!start) {
- return; // TODO: warning if parsed bad
- }
- if (endInput != null) {
- end = dateEnv.createMarker(endInput);
- if (!end) { // TODO: warning if parsed bad
- return;
- }
- }
- if (this._instance) {
- var instanceRange = this._instance.range;
- // when computing the diff for an event being converted to all-day,
- // compute diff off of the all-day values the way event-mutation does.
- if (options.allDay === true) {
- instanceRange = computeAlignedDayRange(instanceRange);
- }
- var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);
- if (end) {
- var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity);
- if (durationsEqual(startDelta, endDelta)) {
- this.mutate({ datesDelta: startDelta, standardProps: standardProps });
- }
- else {
- this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps });
- }
- }
- else { // means "clear the end"
- standardProps.hasEnd = false;
- this.mutate({ datesDelta: startDelta, standardProps: standardProps });
- }
- }
- };
- EventApi.prototype.moveStart = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // TODO: warning if parsed bad
- this.mutate({ startDelta: delta });
- }
- };
- EventApi.prototype.moveEnd = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // TODO: warning if parsed bad
- this.mutate({ endDelta: delta });
- }
- };
- EventApi.prototype.moveDates = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // TODO: warning if parsed bad
- this.mutate({ datesDelta: delta });
- }
- };
- EventApi.prototype.setAllDay = function (allDay, options) {
- if (options === void 0) { options = {}; }
- var standardProps = { allDay: allDay };
- var maintainDuration = options.maintainDuration;
- if (maintainDuration == null) {
- maintainDuration = this._calendar.opt('allDayMaintainDuration');
- }
- if (this._def.allDay !== allDay) {
- standardProps.hasEnd = maintainDuration;
- }
- this.mutate({ standardProps: standardProps });
- };
- EventApi.prototype.formatRange = function (formatInput) {
- var dateEnv = this._calendar.dateEnv;
- var instance = this._instance;
- var formatter = createFormatter(formatInput, this._calendar.opt('defaultRangeSeparator'));
- if (this._def.hasEnd) {
- return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, {
- forcedStartTzo: instance.forcedStartTzo,
- forcedEndTzo: instance.forcedEndTzo
- });
- }
- else {
- return dateEnv.format(instance.range.start, formatter, {
- forcedTzo: instance.forcedStartTzo
- });
- }
- };
- EventApi.prototype.mutate = function (mutation) {
- var def = this._def;
- var instance = this._instance;
- if (instance) {
- this._calendar.dispatch({
- type: 'MUTATE_EVENTS',
- instanceId: instance.instanceId,
- mutation: mutation,
- fromApi: true
- });
- var eventStore = this._calendar.state.eventStore;
- this._def = eventStore.defs[def.defId];
- this._instance = eventStore.instances[instance.instanceId];
- }
- };
- EventApi.prototype.remove = function () {
- this._calendar.dispatch({
- type: 'REMOVE_EVENT_DEF',
- defId: this._def.defId
- });
- };
- Object.defineProperty(EventApi.prototype, "source", {
- get: function () {
- var sourceId = this._def.sourceId;
- if (sourceId) {
- return new EventSourceApi(this._calendar, this._calendar.state.eventSources[sourceId]);
- }
- return null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "start", {
- get: function () {
- return this._instance ?
- this._calendar.dateEnv.toDate(this._instance.range.start) :
- null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "end", {
- get: function () {
- return (this._instance && this._def.hasEnd) ?
- this._calendar.dateEnv.toDate(this._instance.range.end) :
- null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "id", {
- // computable props that all access the def
- // TODO: find a TypeScript-compatible way to do this at scale
- get: function () { return this._def.publicId; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "groupId", {
- get: function () { return this._def.groupId; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "allDay", {
- get: function () { return this._def.allDay; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "title", {
- get: function () { return this._def.title; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "url", {
- get: function () { return this._def.url; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "rendering", {
- get: function () { return this._def.rendering; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "startEditable", {
- get: function () { return this._def.ui.startEditable; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "durationEditable", {
- get: function () { return this._def.ui.durationEditable; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "constraint", {
- get: function () { return this._def.ui.constraints[0] || null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "overlap", {
- get: function () { return this._def.ui.overlap; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "allow", {
- get: function () { return this._def.ui.allows[0] || null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "backgroundColor", {
- get: function () { return this._def.ui.backgroundColor; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "borderColor", {
- get: function () { return this._def.ui.borderColor; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "textColor", {
- get: function () { return this._def.ui.textColor; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "classNames", {
- // NOTE: user can't modify these because Object.freeze was called in event-def parsing
- get: function () { return this._def.ui.classNames; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "extendedProps", {
- get: function () { return this._def.extendedProps; },
- enumerable: true,
- configurable: true
- });
- return EventApi;
-}());
-
-/*
-Specifying nextDayThreshold signals that all-day ranges should be sliced.
-*/
-function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) {
- var inverseBgByGroupId = {};
- var inverseBgByDefId = {};
- var defByGroupId = {};
- var bgRanges = [];
- var fgRanges = [];
- var eventUis = compileEventUis(eventStore.defs, eventUiBases);
- for (var defId in eventStore.defs) {
- var def = eventStore.defs[defId];
- if (def.rendering === 'inverse-background') {
- if (def.groupId) {
- inverseBgByGroupId[def.groupId] = [];
- if (!defByGroupId[def.groupId]) {
- defByGroupId[def.groupId] = def;
- }
- }
- else {
- inverseBgByDefId[defId] = [];
- }
- }
- }
- for (var instanceId in eventStore.instances) {
- var instance = eventStore.instances[instanceId];
- var def = eventStore.defs[instance.defId];
- var ui = eventUis[def.defId];
- var origRange = instance.range;
- var normalRange = (!def.allDay && nextDayThreshold) ?
- computeVisibleDayRange(origRange, nextDayThreshold) :
- origRange;
- var slicedRange = intersectRanges(normalRange, framingRange);
- if (slicedRange) {
- if (def.rendering === 'inverse-background') {
- if (def.groupId) {
- inverseBgByGroupId[def.groupId].push(slicedRange);
- }
- else {
- inverseBgByDefId[instance.defId].push(slicedRange);
- }
- }
- else {
- (def.rendering === 'background' ? bgRanges : fgRanges).push({
- def: def,
- ui: ui,
- instance: instance,
- range: slicedRange,
- isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(),
- isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf()
- });
- }
- }
- }
- for (var groupId in inverseBgByGroupId) { // BY GROUP
- var ranges = inverseBgByGroupId[groupId];
- var invertedRanges = invertRanges(ranges, framingRange);
- for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) {
- var invertedRange = invertedRanges_1[_i];
- var def = defByGroupId[groupId];
- var ui = eventUis[def.defId];
- bgRanges.push({
- def: def,
- ui: ui,
- instance: null,
- range: invertedRange,
- isStart: false,
- isEnd: false
- });
- }
- }
- for (var defId in inverseBgByDefId) {
- var ranges = inverseBgByDefId[defId];
- var invertedRanges = invertRanges(ranges, framingRange);
- for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) {
- var invertedRange = invertedRanges_2[_a];
- bgRanges.push({
- def: eventStore.defs[defId],
- ui: eventUis[defId],
- instance: null,
- range: invertedRange,
- isStart: false,
- isEnd: false
- });
- }
- }
- return { bg: bgRanges, fg: fgRanges };
-}
-function hasBgRendering(def) {
- return def.rendering === 'background' || def.rendering === 'inverse-background';
-}
-function filterSegsViaEls(context, segs, isMirror) {
- var calendar = context.calendar, view = context.view;
- if (calendar.hasPublicHandlers('eventRender')) {
- segs = segs.filter(function (seg) {
- var custom = calendar.publiclyTrigger('eventRender', [
- {
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- isMirror: isMirror,
- isStart: seg.isStart,
- isEnd: seg.isEnd,
- // TODO: include seg.range once all components consistently generate it
- el: seg.el,
- view: view
- }
- ]);
- if (custom === false) { // means don't render at all
- return false;
- }
- else if (custom && custom !== true) {
- seg.el = custom;
- }
- return true;
- });
- }
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
- var seg = segs_1[_i];
- setElSeg(seg.el, seg);
- }
- return segs;
-}
-function setElSeg(el, seg) {
- el.fcSeg = seg;
-}
-function getElSeg(el) {
- return el.fcSeg || null;
-}
-// event ui computation
-function compileEventUis(eventDefs, eventUiBases) {
- return mapHash(eventDefs, function (eventDef) {
- return compileEventUi(eventDef, eventUiBases);
- });
-}
-function compileEventUi(eventDef, eventUiBases) {
- var uis = [];
- if (eventUiBases['']) {
- uis.push(eventUiBases['']);
- }
- if (eventUiBases[eventDef.defId]) {
- uis.push(eventUiBases[eventDef.defId]);
- }
- uis.push(eventDef.ui);
- return combineEventUis(uis);
-}
-// triggers
-function triggerRenderedSegs(context, segs, isMirrors) {
- var calendar = context.calendar, view = context.view;
- if (calendar.hasPublicHandlers('eventPositioned')) {
- for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
- var seg = segs_2[_i];
- calendar.publiclyTriggerAfterSizing('eventPositioned', [
- {
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- isMirror: isMirrors,
- isStart: seg.isStart,
- isEnd: seg.isEnd,
- el: seg.el,
- view: view
- }
- ]);
- }
- }
- if (!calendar.state.eventSourceLoadingLevel) { // avoid initial empty state while pending
- calendar.afterSizingTriggers._eventsPositioned = [null]; // fire once
- }
-}
-function triggerWillRemoveSegs(context, segs, isMirrors) {
- var calendar = context.calendar, view = context.view;
- for (var _i = 0, segs_3 = segs; _i < segs_3.length; _i++) {
- var seg = segs_3[_i];
- calendar.trigger('eventElRemove', seg.el);
- }
- if (calendar.hasPublicHandlers('eventDestroy')) {
- for (var _a = 0, segs_4 = segs; _a < segs_4.length; _a++) {
- var seg = segs_4[_a];
- calendar.publiclyTrigger('eventDestroy', [
- {
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- isMirror: isMirrors,
- el: seg.el,
- view: view
- }
- ]);
- }
- }
-}
-// is-interactable
-function computeEventDraggable(context, eventDef, eventUi) {
- var calendar = context.calendar, view = context.view;
- var transformers = calendar.pluginSystem.hooks.isDraggableTransformers;
- var val = eventUi.startEditable;
- for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
- var transformer = transformers_1[_i];
- val = transformer(val, eventDef, eventUi, view);
- }
- return val;
-}
-function computeEventStartResizable(context, eventDef, eventUi) {
- return eventUi.durationEditable && context.options.eventResizableFromStart;
-}
-function computeEventEndResizable(context, eventDef, eventUi) {
- return eventUi.durationEditable;
-}
-
-// applies the mutation to ALL defs/instances within the event store
-function applyMutationToEventStore(eventStore, eventConfigBase, mutation, calendar) {
- var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase);
- var dest = createEmptyEventStore();
- for (var defId in eventStore.defs) {
- var def = eventStore.defs[defId];
- dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, calendar.pluginSystem.hooks.eventDefMutationAppliers, calendar);
- }
- for (var instanceId in eventStore.instances) {
- var instance = eventStore.instances[instanceId];
- var def = dest.defs[instance.defId]; // important to grab the newly modified def
- dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, calendar);
- }
- return dest;
-}
-function applyMutationToEventDef(eventDef, eventConfig, mutation, appliers, calendar) {
- var standardProps = mutation.standardProps || {};
- // if hasEnd has not been specified, guess a good value based on deltas.
- // if duration will change, there's no way the default duration will persist,
- // and thus, we need to mark the event as having a real end
- if (standardProps.hasEnd == null &&
- eventConfig.durationEditable &&
- (mutation.startDelta || mutation.endDelta)) {
- standardProps.hasEnd = true; // TODO: is this mutation okay?
- }
- var copy = __assign({}, eventDef, standardProps, { ui: __assign({}, eventDef.ui, standardProps.ui) });
- if (mutation.extendedProps) {
- copy.extendedProps = __assign({}, copy.extendedProps, mutation.extendedProps);
- }
- for (var _i = 0, appliers_1 = appliers; _i < appliers_1.length; _i++) {
- var applier = appliers_1[_i];
- applier(copy, mutation, calendar);
- }
- if (!copy.hasEnd && calendar.opt('forceEventDuration')) {
- copy.hasEnd = true;
- }
- return copy;
-}
-function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef
-eventConfig, mutation, calendar) {
- var dateEnv = calendar.dateEnv;
- var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true;
- var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false;
- var copy = __assign({}, eventInstance);
- if (forceAllDay) {
- copy.range = computeAlignedDayRange(copy.range);
- }
- if (mutation.datesDelta && eventConfig.startEditable) {
- copy.range = {
- start: dateEnv.add(copy.range.start, mutation.datesDelta),
- end: dateEnv.add(copy.range.end, mutation.datesDelta)
- };
- }
- if (mutation.startDelta && eventConfig.durationEditable) {
- copy.range = {
- start: dateEnv.add(copy.range.start, mutation.startDelta),
- end: copy.range.end
- };
- }
- if (mutation.endDelta && eventConfig.durationEditable) {
- copy.range = {
- start: copy.range.start,
- end: dateEnv.add(copy.range.end, mutation.endDelta)
- };
- }
- if (clearEnd) {
- copy.range = {
- start: copy.range.start,
- end: calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start)
- };
- }
- // in case event was all-day but the supplied deltas were not
- // better util for this?
- if (eventDef.allDay) {
- copy.range = {
- start: startOfDay(copy.range.start),
- end: startOfDay(copy.range.end)
- };
- }
- // handle invalid durations
- if (copy.range.end < copy.range.start) {
- copy.range.end = calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start);
- }
- return copy;
-}
-
-function reduceEventStore (eventStore, action, eventSources, dateProfile, calendar) {
- switch (action.type) {
- case 'RECEIVE_EVENTS': // raw
- return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, calendar);
- case 'ADD_EVENTS': // already parsed, but not expanded
- return addEvent(eventStore, action.eventStore, // new ones
- dateProfile ? dateProfile.activeRange : null, calendar);
- case 'MERGE_EVENTS': // already parsed and expanded
- return mergeEventStores(eventStore, action.eventStore);
- case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
- case 'NEXT':
- case 'SET_DATE':
- case 'SET_VIEW_TYPE':
- if (dateProfile) {
- return expandRecurring(eventStore, dateProfile.activeRange, calendar);
- }
- else {
- return eventStore;
- }
- case 'CHANGE_TIMEZONE':
- return rezoneDates(eventStore, action.oldDateEnv, calendar.dateEnv);
- case 'MUTATE_EVENTS':
- return applyMutationToRelated(eventStore, action.instanceId, action.mutation, action.fromApi, calendar);
- case 'REMOVE_EVENT_INSTANCES':
- return excludeInstances(eventStore, action.instances);
- case 'REMOVE_EVENT_DEF':
- return filterEventStoreDefs(eventStore, function (eventDef) {
- return eventDef.defId !== action.defId;
- });
- case 'REMOVE_EVENT_SOURCE':
- return excludeEventsBySourceId(eventStore, action.sourceId);
- case 'REMOVE_ALL_EVENT_SOURCES':
- return filterEventStoreDefs(eventStore, function (eventDef) {
- return !eventDef.sourceId; // only keep events with no source id
- });
- case 'REMOVE_ALL_EVENTS':
- return createEmptyEventStore();
- case 'RESET_EVENTS':
- return {
- defs: eventStore.defs,
- instances: eventStore.instances
- };
- default:
- return eventStore;
- }
-}
-function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, calendar) {
- if (eventSource && // not already removed
- fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
- ) {
- var subset = parseEvents(transformRawEvents(rawEvents, eventSource, calendar), eventSource.sourceId, calendar);
- if (fetchRange) {
- subset = expandRecurring(subset, fetchRange, calendar);
- }
- return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
- }
- return eventStore;
-}
-function addEvent(eventStore, subset, expandRange, calendar) {
- if (expandRange) {
- subset = expandRecurring(subset, expandRange, calendar);
- }
- return mergeEventStores(eventStore, subset);
-}
-function rezoneDates(eventStore, oldDateEnv, newDateEnv) {
- var defs = eventStore.defs;
- var instances = mapHash(eventStore.instances, function (instance) {
- var def = defs[instance.defId];
- if (def.allDay || def.recurringDef) {
- return instance; // isn't dependent on timezone
- }
- else {
- return __assign({}, instance, { range: {
- start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)),
- end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo))
- }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo });
- }
- });
- return { defs: defs, instances: instances };
-}
-function applyMutationToRelated(eventStore, instanceId, mutation, fromApi, calendar) {
- var relevant = getRelevantEvents(eventStore, instanceId);
- var eventConfigBase = fromApi ?
- { '': {
- startEditable: true,
- durationEditable: true,
- constraints: [],
- overlap: null,
- allows: [],
- backgroundColor: '',
- borderColor: '',
- textColor: '',
- classNames: []
- } } :
- calendar.eventUiBases;
- relevant = applyMutationToEventStore(relevant, eventConfigBase, mutation, calendar);
- return mergeEventStores(eventStore, relevant);
-}
-function excludeEventsBySourceId(eventStore, sourceId) {
- return filterEventStoreDefs(eventStore, function (eventDef) {
- return eventDef.sourceId !== sourceId;
- });
-}
-// QUESTION: why not just return instances? do a general object-property-exclusion util
-function excludeInstances(eventStore, removals) {
- return {
- defs: eventStore.defs,
- instances: filterHash(eventStore.instances, function (instance) {
- return !removals[instance.instanceId];
- })
- };
-}
-
-// high-level segmenting-aware tester functions
-// ------------------------------------------------------------------------------------------------------------------------
-function isInteractionValid(interaction, calendar) {
- return isNewPropsValid({ eventDrag: interaction }, calendar); // HACK: the eventDrag props is used for ALL interactions
-}
-function isDateSelectionValid(dateSelection, calendar) {
- return isNewPropsValid({ dateSelection: dateSelection }, calendar);
-}
-function isNewPropsValid(newProps, calendar) {
- var view = calendar.view;
- var props = __assign({ businessHours: view ? view.props.businessHours : createEmptyEventStore(), dateSelection: '', eventStore: calendar.state.eventStore, eventUiBases: calendar.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps);
- return (calendar.pluginSystem.hooks.isPropsValid || isPropsValid)(props, calendar);
-}
-function isPropsValid(state, calendar, dateSpanMeta, filterConfig) {
- if (dateSpanMeta === void 0) { dateSpanMeta = {}; }
- if (state.eventDrag && !isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
- return false;
- }
- if (state.dateSelection && !isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
- return false;
- }
- return true;
-}
-// Moving Event Validation
-// ------------------------------------------------------------------------------------------------------------------------
-function isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
- var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions
- var subjectEventStore = interaction.mutatedEvents;
- var subjectDefs = subjectEventStore.defs;
- var subjectInstances = subjectEventStore.instances;
- var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ?
- state.eventUiBases :
- { '': calendar.selectionConfig } // if not a real event, validate as a selection
- );
- if (filterConfig) {
- subjectConfigs = mapHash(subjectConfigs, filterConfig);
- }
- var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); // exclude the subject events. TODO: exclude defs too?
- var otherDefs = otherEventStore.defs;
- var otherInstances = otherEventStore.instances;
- var otherConfigs = compileEventUis(otherDefs, state.eventUiBases);
- for (var subjectInstanceId in subjectInstances) {
- var subjectInstance = subjectInstances[subjectInstanceId];
- var subjectRange = subjectInstance.range;
- var subjectConfig = subjectConfigs[subjectInstance.defId];
- var subjectDef = subjectDefs[subjectInstance.defId];
- // constraint
- if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, calendar)) {
- return false;
- }
- // overlap
- var overlapFunc = calendar.opt('eventOverlap');
- if (typeof overlapFunc !== 'function') {
- overlapFunc = null;
- }
- for (var otherInstanceId in otherInstances) {
- var otherInstance = otherInstances[otherInstanceId];
- // intersect! evaluate
- if (rangesIntersect(subjectRange, otherInstance.range)) {
- var otherOverlap = otherConfigs[otherInstance.defId].overlap;
- // consider the other event's overlap. only do this if the subject event is a "real" event
- if (otherOverlap === false && interaction.isEvent) {
- return false;
- }
- if (subjectConfig.overlap === false) {
- return false;
- }
- if (overlapFunc && !overlapFunc(new EventApi(calendar, otherDefs[otherInstance.defId], otherInstance), // still event
- new EventApi(calendar, subjectDef, subjectInstance) // moving event
- )) {
- return false;
- }
- }
- }
- // allow (a function)
- var calendarEventStore = calendar.state.eventStore; // need global-to-calendar, not local to component (splittable)state
- for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) {
- var subjectAllow = _a[_i];
- var subjectDateSpan = __assign({}, dateSpanMeta, { range: subjectInstance.range, allDay: subjectDef.allDay });
- var origDef = calendarEventStore.defs[subjectDef.defId];
- var origInstance = calendarEventStore.instances[subjectInstanceId];
- var eventApi = void 0;
- if (origDef) { // was previously in the calendar
- eventApi = new EventApi(calendar, origDef, origInstance);
- }
- else { // was an external event
- eventApi = new EventApi(calendar, subjectDef); // no instance, because had no dates
- }
- if (!subjectAllow(calendar.buildDateSpanApi(subjectDateSpan), eventApi)) {
- return false;
- }
- }
- }
- return true;
-}
-// Date Selection Validation
-// ------------------------------------------------------------------------------------------------------------------------
-function isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
- var relevantEventStore = state.eventStore;
- var relevantDefs = relevantEventStore.defs;
- var relevantInstances = relevantEventStore.instances;
- var selection = state.dateSelection;
- var selectionRange = selection.range;
- var selectionConfig = calendar.selectionConfig;
- if (filterConfig) {
- selectionConfig = filterConfig(selectionConfig);
- }
- // constraint
- if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, calendar)) {
- return false;
- }
- // overlap
- var overlapFunc = calendar.opt('selectOverlap');
- if (typeof overlapFunc !== 'function') {
- overlapFunc = null;
- }
- for (var relevantInstanceId in relevantInstances) {
- var relevantInstance = relevantInstances[relevantInstanceId];
- // intersect! evaluate
- if (rangesIntersect(selectionRange, relevantInstance.range)) {
- if (selectionConfig.overlap === false) {
- return false;
- }
- if (overlapFunc && !overlapFunc(new EventApi(calendar, relevantDefs[relevantInstance.defId], relevantInstance))) {
- return false;
- }
- }
- }
- // allow (a function)
- for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) {
- var selectionAllow = _a[_i];
- var fullDateSpan = __assign({}, dateSpanMeta, selection);
- if (!selectionAllow(calendar.buildDateSpanApi(fullDateSpan), null)) {
- return false;
- }
- }
- return true;
-}
-// Constraint Utils
-// ------------------------------------------------------------------------------------------------------------------------
-function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, calendar) {
- for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) {
- var constraint = constraints_1[_i];
- if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, calendar), subjectRange)) {
- return false;
- }
- }
- return true;
-}
-function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours
-otherEventStore, // for if constraint is an even group ID
-businessHoursUnexpanded, // for if constraint is 'businessHours'
-calendar // for expanding businesshours
-) {
- if (constraint === 'businessHours') {
- return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, calendar));
- }
- else if (typeof constraint === 'string') { // an group ID
- return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) {
- return eventDef.groupId === constraint;
- }));
- }
- else if (typeof constraint === 'object' && constraint) { // non-null object
- return eventStoreToRanges(expandRecurring(constraint, subjectRange, calendar));
- }
- return []; // if it's false
-}
-// TODO: move to event-store file?
-function eventStoreToRanges(eventStore) {
- var instances = eventStore.instances;
- var ranges = [];
- for (var instanceId in instances) {
- ranges.push(instances[instanceId].range);
- }
- return ranges;
-}
-// TODO: move to geom file?
-function anyRangesContainRange(outerRanges, innerRange) {
- for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) {
- var outerRange = outerRanges_1[_i];
- if (rangeContainsRange(outerRange, innerRange)) {
- return true;
- }
- }
- return false;
-}
-// Parsing
-// ------------------------------------------------------------------------------------------------------------------------
-function normalizeConstraint(input, calendar) {
- if (Array.isArray(input)) {
- return parseEvents(input, '', calendar, true); // allowOpenRange=true
- }
- else if (typeof input === 'object' && input) { // non-null object
- return parseEvents([input], '', calendar, true); // allowOpenRange=true
- }
- else if (input != null) {
- return String(input);
- }
- else {
- return null;
- }
-}
-
-function htmlEscape(s) {
- return (s + '').replace(/&/g, '&amp;')
- .replace(/</g, '&lt;')
- .replace(/>/g, '&gt;')
- .replace(/'/g, '&#039;')
- .replace(/"/g, '&quot;')
- .replace(/\n/g, '<br />');
-}
-// Given a hash of CSS properties, returns a string of CSS.
-// Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.
-function cssToStr(cssProps) {
- var statements = [];
- for (var name_1 in cssProps) {
- var val = cssProps[name_1];
- if (val != null && val !== '') {
- statements.push(name_1 + ':' + val);
- }
- }
- return statements.join(';');
-}
-// Given an object hash of HTML attribute names to values,
-// generates a string that can be injected between < > in HTML
-function attrsToStr(attrs) {
- var parts = [];
- for (var name_2 in attrs) {
- var val = attrs[name_2];
- if (val != null) {
- parts.push(name_2 + '="' + htmlEscape(val) + '"');
- }
- }
- return parts.join(' ');
-}
-function parseClassName(raw) {
- if (Array.isArray(raw)) {
- return raw;
- }
- else if (typeof raw === 'string') {
- return raw.split(/\s+/);
- }
- else {
- return [];
- }
-}
-
-var UNSCOPED_EVENT_UI_PROPS = {
- editable: Boolean,
- startEditable: Boolean,
- durationEditable: Boolean,
- constraint: null,
- overlap: null,
- allow: null,
- className: parseClassName,
- classNames: parseClassName,
- color: String,
- backgroundColor: String,
- borderColor: String,
- textColor: String
-};
-function processUnscopedUiProps(rawProps, calendar, leftovers) {
- var props = refineProps(rawProps, UNSCOPED_EVENT_UI_PROPS, {}, leftovers);
- var constraint = normalizeConstraint(props.constraint, calendar);
- return {
- startEditable: props.startEditable != null ? props.startEditable : props.editable,
- durationEditable: props.durationEditable != null ? props.durationEditable : props.editable,
- constraints: constraint != null ? [constraint] : [],
- overlap: props.overlap,
- allows: props.allow != null ? [props.allow] : [],
- backgroundColor: props.backgroundColor || props.color,
- borderColor: props.borderColor || props.color,
- textColor: props.textColor,
- classNames: props.classNames.concat(props.className)
- };
-}
-function processScopedUiProps(prefix, rawScoped, calendar, leftovers) {
- var rawUnscoped = {};
- var wasFound = {};
- for (var key in UNSCOPED_EVENT_UI_PROPS) {
- var scopedKey = prefix + capitaliseFirstLetter(key);
- rawUnscoped[key] = rawScoped[scopedKey];
- wasFound[scopedKey] = true;
- }
- if (prefix === 'event') {
- rawUnscoped.editable = rawScoped.editable; // special case. there is no 'eventEditable', just 'editable'
- }
- if (leftovers) {
- for (var key in rawScoped) {
- if (!wasFound[key]) {
- leftovers[key] = rawScoped[key];
- }
- }
- }
- return processUnscopedUiProps(rawUnscoped, calendar);
-}
-var EMPTY_EVENT_UI = {
- startEditable: null,
- durationEditable: null,
- constraints: [],
- overlap: null,
- allows: [],
- backgroundColor: '',
- borderColor: '',
- textColor: '',
- classNames: []
-};
-// prevent against problems with <2 args!
-function combineEventUis(uis) {
- return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI);
-}
-function combineTwoEventUis(item0, item1) {
- return {
- startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable,
- durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable,
- constraints: item0.constraints.concat(item1.constraints),
- overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap,
- allows: item0.allows.concat(item1.allows),
- backgroundColor: item1.backgroundColor || item0.backgroundColor,
- borderColor: item1.borderColor || item0.borderColor,
- textColor: item1.textColor || item0.textColor,
- classNames: item0.classNames.concat(item1.classNames)
- };
-}
-
-var NON_DATE_PROPS = {
- id: String,
- groupId: String,
- title: String,
- url: String,
- rendering: String,
- extendedProps: null
-};
-var DATE_PROPS = {
- start: null,
- date: null,
- end: null,
- allDay: null
-};
-var uid = 0;
-function parseEvent(raw, sourceId, calendar, allowOpenRange) {
- var allDayDefault = computeIsAllDayDefault(sourceId, calendar);
- var leftovers0 = {};
- var recurringRes = parseRecurring(raw, // raw, but with single-event stuff stripped out
- allDayDefault, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes, leftovers0 // will populate with non-recurring props
- );
- if (recurringRes) {
- var def = parseEventDef(leftovers0, sourceId, recurringRes.allDay, Boolean(recurringRes.duration), calendar);
- def.recurringDef = {
- typeId: recurringRes.typeId,
- typeData: recurringRes.typeData,
- duration: recurringRes.duration
- };
- return { def: def, instance: null };
- }
- else {
- var leftovers1 = {};
- var singleRes = parseSingle(raw, allDayDefault, calendar, leftovers1, allowOpenRange);
- if (singleRes) {
- var def = parseEventDef(leftovers1, sourceId, singleRes.allDay, singleRes.hasEnd, calendar);
- var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo);
- return { def: def, instance: instance };
- }
- }
- return null;
-}
-/*
-Will NOT populate extendedProps with the leftover properties.
-Will NOT populate date-related props.
-The EventNonDateInput has been normalized (id => publicId, etc).
-*/
-function parseEventDef(raw, sourceId, allDay, hasEnd, calendar) {
- var leftovers = {};
- var def = pluckNonDateProps(raw, calendar, leftovers);
- def.defId = String(uid++);
- def.sourceId = sourceId;
- def.allDay = allDay;
- def.hasEnd = hasEnd;
- for (var _i = 0, _a = calendar.pluginSystem.hooks.eventDefParsers; _i < _a.length; _i++) {
- var eventDefParser = _a[_i];
- var newLeftovers = {};
- eventDefParser(def, leftovers, newLeftovers);
- leftovers = newLeftovers;
- }
- def.extendedProps = __assign(leftovers, def.extendedProps || {});
- // help out EventApi from having user modify props
- Object.freeze(def.ui.classNames);
- Object.freeze(def.extendedProps);
- return def;
-}
-function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) {
- return {
- instanceId: String(uid++),
- defId: defId,
- range: range,
- forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo,
- forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo
- };
-}
-function parseSingle(raw, allDayDefault, calendar, leftovers, allowOpenRange) {
- var props = pluckDateProps(raw, leftovers);
- var allDay = props.allDay;
- var startMeta;
- var startMarker = null;
- var hasEnd = false;
- var endMeta;
- var endMarker = null;
- startMeta = calendar.dateEnv.createMarkerMeta(props.start);
- if (startMeta) {
- startMarker = startMeta.marker;
- }
- else if (!allowOpenRange) {
- return null;
- }
- if (props.end != null) {
- endMeta = calendar.dateEnv.createMarkerMeta(props.end);
- }
- if (allDay == null) {
- if (allDayDefault != null) {
- allDay = allDayDefault;
- }
- else {
- // fall back to the date props LAST
- allDay = (!startMeta || startMeta.isTimeUnspecified) &&
- (!endMeta || endMeta.isTimeUnspecified);
- }
- }
- if (allDay && startMarker) {
- startMarker = startOfDay(startMarker);
- }
- if (endMeta) {
- endMarker = endMeta.marker;
- if (allDay) {
- endMarker = startOfDay(endMarker);
- }
- if (startMarker && endMarker <= startMarker) {
- endMarker = null;
- }
- }
- if (endMarker) {
- hasEnd = true;
- }
- else if (!allowOpenRange) {
- hasEnd = calendar.opt('forceEventDuration') || false;
- endMarker = calendar.dateEnv.add(startMarker, allDay ?
- calendar.defaultAllDayEventDuration :
- calendar.defaultTimedEventDuration);
- }
- return {
- allDay: allDay,
- hasEnd: hasEnd,
- range: { start: startMarker, end: endMarker },
- forcedStartTzo: startMeta ? startMeta.forcedTzo : null,
- forcedEndTzo: endMeta ? endMeta.forcedTzo : null
- };
-}
-function pluckDateProps(raw, leftovers) {
- var props = refineProps(raw, DATE_PROPS, {}, leftovers);
- props.start = (props.start !== null) ? props.start : props.date;
- delete props.date;
- return props;
-}
-function pluckNonDateProps(raw, calendar, leftovers) {
- var preLeftovers = {};
- var props = refineProps(raw, NON_DATE_PROPS, {}, preLeftovers);
- var ui = processUnscopedUiProps(preLeftovers, calendar, leftovers);
- props.publicId = props.id;
- delete props.id;
- props.ui = ui;
- return props;
-}
-function computeIsAllDayDefault(sourceId, calendar) {
- var res = null;
- if (sourceId) {
- var source = calendar.state.eventSources[sourceId];
- res = source.allDayDefault;
- }
- if (res == null) {
- res = calendar.opt('allDayDefault');
- }
- return res;
-}
-
-var DEF_DEFAULTS = {
- startTime: '09:00',
- endTime: '17:00',
- daysOfWeek: [1, 2, 3, 4, 5],
- rendering: 'inverse-background',
- classNames: 'fc-nonbusiness',
- groupId: '_businessHours' // so multiple defs get grouped
-};
-/*
-TODO: pass around as EventDefHash!!!
-*/
-function parseBusinessHours(input, calendar) {
- return parseEvents(refineInputs(input), '', calendar);
-}
-function refineInputs(input) {
- var rawDefs;
- if (input === true) {
- rawDefs = [{}]; // will get DEF_DEFAULTS verbatim
- }
- else if (Array.isArray(input)) {
- // if specifying an array, every sub-definition NEEDS a day-of-week
- rawDefs = input.filter(function (rawDef) {
- return rawDef.daysOfWeek;
- });
- }
- else if (typeof input === 'object' && input) { // non-null object
- rawDefs = [input];
- }
- else { // is probably false
- rawDefs = [];
- }
- rawDefs = rawDefs.map(function (rawDef) {
- return __assign({}, DEF_DEFAULTS, rawDef);
- });
- return rawDefs;
-}
-
-function memoizeRendering(renderFunc, unrenderFunc, dependencies) {
- if (dependencies === void 0) { dependencies = []; }
- var dependents = [];
- var thisContext;
- var prevArgs;
- function unrender() {
- if (prevArgs) {
- for (var _i = 0, dependents_1 = dependents; _i < dependents_1.length; _i++) {
- var dependent = dependents_1[_i];
- dependent.unrender();
- }
- if (unrenderFunc) {
- unrenderFunc.apply(thisContext, prevArgs);
- }
- prevArgs = null;
- }
- }
- function res() {
- if (!prevArgs || !isArraysEqual(prevArgs, arguments)) {
- unrender();
- thisContext = this;
- prevArgs = arguments;
- renderFunc.apply(this, arguments);
- }
- }
- res.dependents = dependents;
- res.unrender = unrender;
- for (var _i = 0, dependencies_1 = dependencies; _i < dependencies_1.length; _i++) {
- var dependency = dependencies_1[_i];
- dependency.dependents.push(res);
- }
- return res;
-}
-
-var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere
-var Splitter = /** @class */ (function () {
- function Splitter() {
- this.getKeysForEventDefs = memoize(this._getKeysForEventDefs);
- this.splitDateSelection = memoize(this._splitDateSpan);
- this.splitEventStore = memoize(this._splitEventStore);
- this.splitIndividualUi = memoize(this._splitIndividualUi);
- this.splitEventDrag = memoize(this._splitInteraction);
- this.splitEventResize = memoize(this._splitInteraction);
- this.eventUiBuilders = {}; // TODO: typescript protection
- }
- Splitter.prototype.splitProps = function (props) {
- var _this = this;
- var keyInfos = this.getKeyInfo(props);
- var defKeys = this.getKeysForEventDefs(props.eventStore);
- var dateSelections = this.splitDateSelection(props.dateSelection);
- var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases*
- var eventStores = this.splitEventStore(props.eventStore, defKeys);
- var eventDrags = this.splitEventDrag(props.eventDrag);
- var eventResizes = this.splitEventResize(props.eventResize);
- var splitProps = {};
- this.eventUiBuilders = mapHash(keyInfos, function (info, key) {
- return _this.eventUiBuilders[key] || memoize(buildEventUiForKey);
- });
- for (var key in keyInfos) {
- var keyInfo = keyInfos[key];
- var eventStore = eventStores[key] || EMPTY_EVENT_STORE;
- var buildEventUi = this.eventUiBuilders[key];
- splitProps[key] = {
- businessHours: keyInfo.businessHours || props.businessHours,
- dateSelection: dateSelections[key] || null,
- eventStore: eventStore,
- eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]),
- eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '',
- eventDrag: eventDrags[key] || null,
- eventResize: eventResizes[key] || null
- };
- }
- return splitProps;
- };
- Splitter.prototype._splitDateSpan = function (dateSpan) {
- var dateSpans = {};
- if (dateSpan) {
- var keys = this.getKeysForDateSpan(dateSpan);
- for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
- var key = keys_1[_i];
- dateSpans[key] = dateSpan;
- }
- }
- return dateSpans;
- };
- Splitter.prototype._getKeysForEventDefs = function (eventStore) {
- var _this = this;
- return mapHash(eventStore.defs, function (eventDef) {
- return _this.getKeysForEventDef(eventDef);
- });
- };
- Splitter.prototype._splitEventStore = function (eventStore, defKeys) {
- var defs = eventStore.defs, instances = eventStore.instances;
- var splitStores = {};
- for (var defId in defs) {
- for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
- var key = _a[_i];
- if (!splitStores[key]) {
- splitStores[key] = createEmptyEventStore();
- }
- splitStores[key].defs[defId] = defs[defId];
- }
- }
- for (var instanceId in instances) {
- var instance = instances[instanceId];
- for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) {
- var key = _c[_b];
- if (splitStores[key]) { // must have already been created
- splitStores[key].instances[instanceId] = instance;
- }
- }
- }
- return splitStores;
- };
- Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) {
- var splitHashes = {};
- for (var defId in eventUiBases) {
- if (defId) { // not the '' key
- for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
- var key = _a[_i];
- if (!splitHashes[key]) {
- splitHashes[key] = {};
- }
- splitHashes[key][defId] = eventUiBases[defId];
- }
- }
- }
- return splitHashes;
- };
- Splitter.prototype._splitInteraction = function (interaction) {
- var splitStates = {};
- if (interaction) {
- var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents) // can't use cached. might be events from other calendar
- );
- // can't rely on defKeys because event data is mutated
- var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents);
- var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId);
- var populate = function (key) {
- if (!splitStates[key]) {
- splitStates[key] = {
- affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE,
- mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE,
- isEvent: interaction.isEvent,
- origSeg: interaction.origSeg
- };
- }
- };
- for (var key in affectedStores_1) {
- populate(key);
- }
- for (var key in mutatedStores_1) {
- populate(key);
- }
- }
- return splitStates;
- };
- return Splitter;
-}());
-function buildEventUiForKey(allUi, eventUiForKey, individualUi) {
- var baseParts = [];
- if (allUi) {
- baseParts.push(allUi);
- }
- if (eventUiForKey) {
- baseParts.push(eventUiForKey);
- }
- var stuff = {
- '': combineEventUis(baseParts)
- };
- if (individualUi) {
- __assign(stuff, individualUi);
- }
- return stuff;
-}
-
-// Generates HTML for an anchor to another view into the calendar.
-// Will either generate an <a> tag or a non-clickable <span> tag, depending on enabled settings.
-// `gotoOptions` can either be a DateMarker, or an object with the form:
-// { date, type, forceOff }
-// `type` is a view-type like "day" or "week". default value is "day".
-// `attrs` and `innerHtml` are use to generate the rest of the HTML tag.
-function buildGotoAnchorHtml(allOptions, dateEnv, gotoOptions, attrs, innerHtml) {
- var date;
- var type;
- var forceOff;
- var finalOptions;
- if (gotoOptions instanceof Date) {
- date = gotoOptions; // a single date-like input
- }
- else {
- date = gotoOptions.date;
- type = gotoOptions.type;
- forceOff = gotoOptions.forceOff;
- }
- finalOptions = {
- date: dateEnv.formatIso(date, { omitTime: true }),
- type: type || 'day'
- };
- if (typeof attrs === 'string') {
- innerHtml = attrs;
- attrs = null;
- }
- attrs = attrs ? ' ' + attrsToStr(attrs) : ''; // will have a leading space
- innerHtml = innerHtml || '';
- if (!forceOff && allOptions.navLinks) {
- return '<a' + attrs +
- ' data-goto="' + htmlEscape(JSON.stringify(finalOptions)) + '">' +
- innerHtml +
- '</a>';
- }
- else {
- return '<span' + attrs + '>' +
- innerHtml +
- '</span>';
- }
-}
-function getAllDayHtml(allOptions) {
- return allOptions.allDayHtml || htmlEscape(allOptions.allDayText);
-}
-// Computes HTML classNames for a single-day element
-function getDayClasses(date, dateProfile, context, noThemeHighlight) {
- var calendar = context.calendar, options = context.options, theme = context.theme, dateEnv = context.dateEnv;
- var classes = [];
- var todayStart;
- var todayEnd;
- if (!rangeContainsMarker(dateProfile.activeRange, date)) {
- classes.push('fc-disabled-day');
- }
- else {
- classes.push('fc-' + DAY_IDS[date.getUTCDay()]);
- if (options.monthMode &&
- dateEnv.getMonth(date) !== dateEnv.getMonth(dateProfile.currentRange.start)) {
- classes.push('fc-other-month');
- }
- todayStart = startOfDay(calendar.getNow());
- todayEnd = addDays(todayStart, 1);
- if (date < todayStart) {
- classes.push('fc-past');
- }
- else if (date >= todayEnd) {
- classes.push('fc-future');
- }
- else {
- classes.push('fc-today');
- if (noThemeHighlight !== true) {
- classes.push(theme.getClass('today'));
- }
- }
- }
- return classes;
-}
-
-// given a function that resolves a result asynchronously.
-// the function can either call passed-in success and failure callbacks,
-// or it can return a promise.
-// if you need to pass additional params to func, bind them first.
-function unpromisify(func, success, failure) {
- // guard against success/failure callbacks being called more than once
- // and guard against a promise AND callback being used together.
- var isResolved = false;
- var wrappedSuccess = function () {
- if (!isResolved) {
- isResolved = true;
- success.apply(this, arguments);
- }
- };
- var wrappedFailure = function () {
- if (!isResolved) {
- isResolved = true;
- if (failure) {
- failure.apply(this, arguments);
- }
- }
- };
- var res = func(wrappedSuccess, wrappedFailure);
- if (res && typeof res.then === 'function') {
- res.then(wrappedSuccess, wrappedFailure);
- }
-}
-
-var Mixin = /** @class */ (function () {
- function Mixin() {
- }
- // mix into a CLASS
- Mixin.mixInto = function (destClass) {
- this.mixIntoObj(destClass.prototype);
- };
- // mix into ANY object
- Mixin.mixIntoObj = function (destObj) {
- var _this = this;
- Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
- if (!destObj[name]) { // if destination doesn't already define it
- destObj[name] = _this.prototype[name];
- }
- });
- };
- /*
- will override existing methods
- TODO: remove! not used anymore
- */
- Mixin.mixOver = function (destClass) {
- var _this = this;
- Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
- destClass.prototype[name] = _this.prototype[name];
- });
- };
- return Mixin;
-}());
-
-/*
-USAGE:
- import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'
-in class:
- on: EmitterInterface['on']
- one: EmitterInterface['one']
- off: EmitterInterface['off']
- trigger: EmitterInterface['trigger']
- triggerWith: EmitterInterface['triggerWith']
- hasHandlers: EmitterInterface['hasHandlers']
-after class:
- EmitterMixin.mixInto(TheClass)
-*/
-var EmitterMixin = /** @class */ (function (_super) {
- __extends(EmitterMixin, _super);
- function EmitterMixin() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- EmitterMixin.prototype.on = function (type, handler) {
- addToHash(this._handlers || (this._handlers = {}), type, handler);
- return this; // for chaining
- };
- // todo: add comments
- EmitterMixin.prototype.one = function (type, handler) {
- addToHash(this._oneHandlers || (this._oneHandlers = {}), type, handler);
- return this; // for chaining
- };
- EmitterMixin.prototype.off = function (type, handler) {
- if (this._handlers) {
- removeFromHash(this._handlers, type, handler);
- }
- if (this._oneHandlers) {
- removeFromHash(this._oneHandlers, type, handler);
- }
- return this; // for chaining
- };
- EmitterMixin.prototype.trigger = function (type) {
- var args = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- args[_i - 1] = arguments[_i];
- }
- this.triggerWith(type, this, args);
- return this; // for chaining
- };
- EmitterMixin.prototype.triggerWith = function (type, context, args) {
- if (this._handlers) {
- applyAll(this._handlers[type], context, args);
- }
- if (this._oneHandlers) {
- applyAll(this._oneHandlers[type], context, args);
- delete this._oneHandlers[type]; // will never fire again
- }
- return this; // for chaining
- };
- EmitterMixin.prototype.hasHandlers = function (type) {
- return (this._handlers && this._handlers[type] && this._handlers[type].length) ||
- (this._oneHandlers && this._oneHandlers[type] && this._oneHandlers[type].length);
- };
- return EmitterMixin;
-}(Mixin));
-function addToHash(hash, type, handler) {
- (hash[type] || (hash[type] = []))
- .push(handler);
-}
-function removeFromHash(hash, type, handler) {
- if (handler) {
- if (hash[type]) {
- hash[type] = hash[type].filter(function (func) {
- return func !== handler;
- });
- }
- }
- else {
- delete hash[type]; // remove all handler funcs for this type
- }
-}
-
-/*
-Records offset information for a set of elements, relative to an origin element.
-Can record the left/right OR the top/bottom OR both.
-Provides methods for querying the cache by position.
-*/
-var PositionCache = /** @class */ (function () {
- function PositionCache(originEl, els, isHorizontal, isVertical) {
- this.originEl = originEl;
- this.els = els;
- this.isHorizontal = isHorizontal;
- this.isVertical = isVertical;
- }
- // Queries the els for coordinates and stores them.
- // Call this method before using and of the get* methods below.
- PositionCache.prototype.build = function () {
- var originEl = this.originEl;
- var originClientRect = this.originClientRect =
- originEl.getBoundingClientRect(); // relative to viewport top-left
- if (this.isHorizontal) {
- this.buildElHorizontals(originClientRect.left);
- }
- if (this.isVertical) {
- this.buildElVerticals(originClientRect.top);
- }
- };
- // Populates the left/right internal coordinate arrays
- PositionCache.prototype.buildElHorizontals = function (originClientLeft) {
- var lefts = [];
- var rights = [];
- for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
- var el = _a[_i];
- var rect = el.getBoundingClientRect();
- lefts.push(rect.left - originClientLeft);
- rights.push(rect.right - originClientLeft);
- }
- this.lefts = lefts;
- this.rights = rights;
- };
- // Populates the top/bottom internal coordinate arrays
- PositionCache.prototype.buildElVerticals = function (originClientTop) {
- var tops = [];
- var bottoms = [];
- for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
- var el = _a[_i];
- var rect = el.getBoundingClientRect();
- tops.push(rect.top - originClientTop);
- bottoms.push(rect.bottom - originClientTop);
- }
- this.tops = tops;
- this.bottoms = bottoms;
- };
- // Given a left offset (from document left), returns the index of the el that it horizontally intersects.
- // If no intersection is made, returns undefined.
- PositionCache.prototype.leftToIndex = function (leftPosition) {
- var lefts = this.lefts;
- var rights = this.rights;
- var len = lefts.length;
- var i;
- for (i = 0; i < len; i++) {
- if (leftPosition >= lefts[i] && leftPosition < rights[i]) {
- return i;
- }
- }
- };
- // Given a top offset (from document top), returns the index of the el that it vertically intersects.
- // If no intersection is made, returns undefined.
- PositionCache.prototype.topToIndex = function (topPosition) {
- var tops = this.tops;
- var bottoms = this.bottoms;
- var len = tops.length;
- var i;
- for (i = 0; i < len; i++) {
- if (topPosition >= tops[i] && topPosition < bottoms[i]) {
- return i;
- }
- }
- };
- // Gets the width of the element at the given index
- PositionCache.prototype.getWidth = function (leftIndex) {
- return this.rights[leftIndex] - this.lefts[leftIndex];
- };
- // Gets the height of the element at the given index
- PositionCache.prototype.getHeight = function (topIndex) {
- return this.bottoms[topIndex] - this.tops[topIndex];
- };
- return PositionCache;
-}());
-
-/*
-An object for getting/setting scroll-related information for an element.
-Internally, this is done very differently for window versus DOM element,
-so this object serves as a common interface.
-*/
-var ScrollController = /** @class */ (function () {
- function ScrollController() {
- }
- ScrollController.prototype.getMaxScrollTop = function () {
- return this.getScrollHeight() - this.getClientHeight();
- };
- ScrollController.prototype.getMaxScrollLeft = function () {
- return this.getScrollWidth() - this.getClientWidth();
- };
- ScrollController.prototype.canScrollVertically = function () {
- return this.getMaxScrollTop() > 0;
- };
- ScrollController.prototype.canScrollHorizontally = function () {
- return this.getMaxScrollLeft() > 0;
- };
- ScrollController.prototype.canScrollUp = function () {
- return this.getScrollTop() > 0;
- };
- ScrollController.prototype.canScrollDown = function () {
- return this.getScrollTop() < this.getMaxScrollTop();
- };
- ScrollController.prototype.canScrollLeft = function () {
- return this.getScrollLeft() > 0;
- };
- ScrollController.prototype.canScrollRight = function () {
- return this.getScrollLeft() < this.getMaxScrollLeft();
- };
- return ScrollController;
-}());
-var ElementScrollController = /** @class */ (function (_super) {
- __extends(ElementScrollController, _super);
- function ElementScrollController(el) {
- var _this = _super.call(this) || this;
- _this.el = el;
- return _this;
- }
- ElementScrollController.prototype.getScrollTop = function () {
- return this.el.scrollTop;
- };
- ElementScrollController.prototype.getScrollLeft = function () {
- return this.el.scrollLeft;
- };
- ElementScrollController.prototype.setScrollTop = function (top) {
- this.el.scrollTop = top;
- };
- ElementScrollController.prototype.setScrollLeft = function (left) {
- this.el.scrollLeft = left;
- };
- ElementScrollController.prototype.getScrollWidth = function () {
- return this.el.scrollWidth;
- };
- ElementScrollController.prototype.getScrollHeight = function () {
- return this.el.scrollHeight;
- };
- ElementScrollController.prototype.getClientHeight = function () {
- return this.el.clientHeight;
- };
- ElementScrollController.prototype.getClientWidth = function () {
- return this.el.clientWidth;
- };
- return ElementScrollController;
-}(ScrollController));
-var WindowScrollController = /** @class */ (function (_super) {
- __extends(WindowScrollController, _super);
- function WindowScrollController() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- WindowScrollController.prototype.getScrollTop = function () {
- return window.pageYOffset;
- };
- WindowScrollController.prototype.getScrollLeft = function () {
- return window.pageXOffset;
- };
- WindowScrollController.prototype.setScrollTop = function (n) {
- window.scroll(window.pageXOffset, n);
- };
- WindowScrollController.prototype.setScrollLeft = function (n) {
- window.scroll(n, window.pageYOffset);
- };
- WindowScrollController.prototype.getScrollWidth = function () {
- return document.documentElement.scrollWidth;
- };
- WindowScrollController.prototype.getScrollHeight = function () {
- return document.documentElement.scrollHeight;
- };
- WindowScrollController.prototype.getClientHeight = function () {
- return document.documentElement.clientHeight;
- };
- WindowScrollController.prototype.getClientWidth = function () {
- return document.documentElement.clientWidth;
- };
- return WindowScrollController;
-}(ScrollController));
-
-/*
-Embodies a div that has potential scrollbars
-*/
-var ScrollComponent = /** @class */ (function (_super) {
- __extends(ScrollComponent, _super);
- function ScrollComponent(overflowX, overflowY) {
- var _this = _super.call(this, createElement('div', {
- className: 'fc-scroller'
- })) || this;
- _this.overflowX = overflowX;
- _this.overflowY = overflowY;
- _this.applyOverflow();
- return _this;
- }
- // sets to natural height, unlocks overflow
- ScrollComponent.prototype.clear = function () {
- this.setHeight('auto');
- this.applyOverflow();
- };
- ScrollComponent.prototype.destroy = function () {
- removeElement(this.el);
- };
- // Overflow
- // -----------------------------------------------------------------------------------------------------------------
- ScrollComponent.prototype.applyOverflow = function () {
- applyStyle(this.el, {
- overflowX: this.overflowX,
- overflowY: this.overflowY
- });
- };
- // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.
- // Useful for preserving scrollbar widths regardless of future resizes.
- // Can pass in scrollbarWidths for optimization.
- ScrollComponent.prototype.lockOverflow = function (scrollbarWidths) {
- var overflowX = this.overflowX;
- var overflowY = this.overflowY;
- scrollbarWidths = scrollbarWidths || this.getScrollbarWidths();
- if (overflowX === 'auto') {
- overflowX = (scrollbarWidths.bottom || // horizontal scrollbars?
- this.canScrollHorizontally() // OR scrolling pane with massless scrollbars?
- ) ? 'scroll' : 'hidden';
- }
- if (overflowY === 'auto') {
- overflowY = (scrollbarWidths.left || scrollbarWidths.right || // horizontal scrollbars?
- this.canScrollVertically() // OR scrolling pane with massless scrollbars?
- ) ? 'scroll' : 'hidden';
- }
- applyStyle(this.el, { overflowX: overflowX, overflowY: overflowY });
- };
- ScrollComponent.prototype.setHeight = function (height) {
- applyStyleProp(this.el, 'height', height);
- };
- ScrollComponent.prototype.getScrollbarWidths = function () {
- var edges = computeEdges(this.el);
- return {
- left: edges.scrollbarLeft,
- right: edges.scrollbarRight,
- bottom: edges.scrollbarBottom
- };
- };
- return ScrollComponent;
-}(ElementScrollController));
-
-var Theme = /** @class */ (function () {
- function Theme(calendarOptions) {
- this.calendarOptions = calendarOptions;
- this.processIconOverride();
- }
- Theme.prototype.processIconOverride = function () {
- if (this.iconOverrideOption) {
- this.setIconOverride(this.calendarOptions[this.iconOverrideOption]);
- }
- };
- Theme.prototype.setIconOverride = function (iconOverrideHash) {
- var iconClassesCopy;
- var buttonName;
- if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object
- iconClassesCopy = __assign({}, this.iconClasses);
- for (buttonName in iconOverrideHash) {
- iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);
- }
- this.iconClasses = iconClassesCopy;
- }
- else if (iconOverrideHash === false) {
- this.iconClasses = {};
- }
- };
- Theme.prototype.applyIconOverridePrefix = function (className) {
- var prefix = this.iconOverridePrefix;
- if (prefix && className.indexOf(prefix) !== 0) { // if not already present
- className = prefix + className;
- }
- return className;
- };
- Theme.prototype.getClass = function (key) {
- return this.classes[key] || '';
- };
- Theme.prototype.getIconClass = function (buttonName) {
- var className = this.iconClasses[buttonName];
- if (className) {
- return this.baseIconClass + ' ' + className;
- }
- return '';
- };
- Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {
- var className;
- if (this.iconOverrideCustomButtonOption) {
- className = customButtonProps[this.iconOverrideCustomButtonOption];
- if (className) {
- return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);
- }
- }
- return '';
- };
- return Theme;
-}());
-Theme.prototype.classes = {};
-Theme.prototype.iconClasses = {};
-Theme.prototype.baseIconClass = '';
-Theme.prototype.iconOverridePrefix = '';
-
-var guid = 0;
-var ComponentContext = /** @class */ (function () {
- function ComponentContext(calendar, theme, dateEnv, options, view) {
- this.calendar = calendar;
- this.theme = theme;
- this.dateEnv = dateEnv;
- this.options = options;
- this.view = view;
- this.isRtl = options.dir === 'rtl';
- this.eventOrderSpecs = parseFieldSpecs(options.eventOrder);
- this.nextDayThreshold = createDuration(options.nextDayThreshold);
- }
- ComponentContext.prototype.extend = function (options, view) {
- return new ComponentContext(this.calendar, this.theme, this.dateEnv, options || this.options, view || this.view);
- };
- return ComponentContext;
-}());
-var Component = /** @class */ (function () {
- function Component() {
- this.everRendered = false;
- this.uid = String(guid++);
- }
- Component.addEqualityFuncs = function (newFuncs) {
- this.prototype.equalityFuncs = __assign({}, this.prototype.equalityFuncs, newFuncs);
- };
- Component.prototype.receiveProps = function (props, context) {
- this.receiveContext(context);
- var _a = recycleProps(this.props || {}, props, this.equalityFuncs), anyChanges = _a.anyChanges, comboProps = _a.comboProps;
- this.props = comboProps;
- if (anyChanges) {
- if (this.everRendered) {
- this.beforeUpdate();
- }
- this.render(comboProps, context);
- if (this.everRendered) {
- this.afterUpdate();
- }
- }
- this.everRendered = true;
- };
- Component.prototype.receiveContext = function (context) {
- var oldContext = this.context;
- this.context = context;
- if (!oldContext) {
- this.firstContext(context);
- }
- };
- Component.prototype.render = function (props, context) {
- };
- Component.prototype.firstContext = function (context) {
- };
- Component.prototype.beforeUpdate = function () {
- };
- Component.prototype.afterUpdate = function () {
- };
- // after destroy is called, this component won't ever be used again
- Component.prototype.destroy = function () {
- };
- return Component;
-}());
-Component.prototype.equalityFuncs = {};
-/*
-Reuses old values when equal. If anything is unequal, returns newProps as-is.
-Great for PureComponent, but won't be feasible with React, so just eliminate and use React's DOM diffing.
-*/
-function recycleProps(oldProps, newProps, equalityFuncs) {
- var comboProps = {}; // some old, some new
- var anyChanges = false;
- for (var key in newProps) {
- if (key in oldProps && (oldProps[key] === newProps[key] ||
- (equalityFuncs[key] && equalityFuncs[key](oldProps[key], newProps[key])))) {
- // equal to old? use old prop
- comboProps[key] = oldProps[key];
- }
- else {
- comboProps[key] = newProps[key];
- anyChanges = true;
- }
- }
- for (var key in oldProps) {
- if (!(key in newProps)) {
- anyChanges = true;
- break;
- }
- }
- return { anyChanges: anyChanges, comboProps: comboProps };
-}
-
-/*
-PURPOSES:
-- hook up to fg, fill, and mirror renderers
-- interface for dragging and hits
-*/
-var DateComponent = /** @class */ (function (_super) {
- __extends(DateComponent, _super);
- function DateComponent(el) {
- var _this = _super.call(this) || this;
- _this.el = el;
- return _this;
- }
- DateComponent.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- removeElement(this.el);
- };
- // Hit System
- // -----------------------------------------------------------------------------------------------------------------
- DateComponent.prototype.buildPositionCaches = function () {
- };
- DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
- return null; // this should be abstract
- };
- // Validation
- // -----------------------------------------------------------------------------------------------------------------
- DateComponent.prototype.isInteractionValid = function (interaction) {
- var calendar = this.context.calendar;
- var dateProfile = this.props.dateProfile; // HACK
- var instances = interaction.mutatedEvents.instances;
- if (dateProfile) { // HACK for DayTile
- for (var instanceId in instances) {
- if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) {
- return false;
- }
- }
- }
- return isInteractionValid(interaction, calendar);
- };
- DateComponent.prototype.isDateSelectionValid = function (selection) {
- var calendar = this.context.calendar;
- var dateProfile = this.props.dateProfile; // HACK
- if (dateProfile && // HACK for DayTile
- !rangeContainsRange(dateProfile.validRange, selection.range)) {
- return false;
- }
- return isDateSelectionValid(selection, calendar);
- };
- // Pointer Interaction Utils
- // -----------------------------------------------------------------------------------------------------------------
- DateComponent.prototype.isValidSegDownEl = function (el) {
- return !this.props.eventDrag && // HACK
- !this.props.eventResize && // HACK
- !elementClosest(el, '.fc-mirror') &&
- (this.isPopover() || !this.isInPopover(el));
- // ^above line ensures we don't detect a seg interaction within a nested component.
- // it's a HACK because it only supports a popover as the nested component.
- };
- DateComponent.prototype.isValidDateDownEl = function (el) {
- var segEl = elementClosest(el, this.fgSegSelector);
- return (!segEl || segEl.classList.contains('fc-mirror')) &&
- !elementClosest(el, '.fc-more') && // a "more.." link
- !elementClosest(el, 'a[data-goto]') && // a clickable nav link
- !this.isInPopover(el);
- };
- DateComponent.prototype.isPopover = function () {
- return this.el.classList.contains('fc-popover');
- };
- DateComponent.prototype.isInPopover = function (el) {
- return Boolean(elementClosest(el, '.fc-popover'));
- };
- return DateComponent;
-}(Component));
-DateComponent.prototype.fgSegSelector = '.fc-event-container > *';
-DateComponent.prototype.bgSegSelector = '.fc-bgevent:not(.fc-nonbusiness)';
-
-var uid$1 = 0;
-function createPlugin(input) {
- return {
- id: String(uid$1++),
- deps: input.deps || [],
- reducers: input.reducers || [],
- eventDefParsers: input.eventDefParsers || [],
- isDraggableTransformers: input.isDraggableTransformers || [],
- eventDragMutationMassagers: input.eventDragMutationMassagers || [],
- eventDefMutationAppliers: input.eventDefMutationAppliers || [],
- dateSelectionTransformers: input.dateSelectionTransformers || [],
- datePointTransforms: input.datePointTransforms || [],
- dateSpanTransforms: input.dateSpanTransforms || [],
- views: input.views || {},
- viewPropsTransformers: input.viewPropsTransformers || [],
- isPropsValid: input.isPropsValid || null,
- externalDefTransforms: input.externalDefTransforms || [],
- eventResizeJoinTransforms: input.eventResizeJoinTransforms || [],
- viewContainerModifiers: input.viewContainerModifiers || [],
- eventDropTransformers: input.eventDropTransformers || [],
- componentInteractions: input.componentInteractions || [],
- calendarInteractions: input.calendarInteractions || [],
- themeClasses: input.themeClasses || {},
- eventSourceDefs: input.eventSourceDefs || [],
- cmdFormatter: input.cmdFormatter,
- recurringTypes: input.recurringTypes || [],
- namedTimeZonedImpl: input.namedTimeZonedImpl,
- defaultView: input.defaultView || '',
- elementDraggingImpl: input.elementDraggingImpl,
- optionChangeHandlers: input.optionChangeHandlers || {}
- };
-}
-var PluginSystem = /** @class */ (function () {
- function PluginSystem() {
- this.hooks = {
- reducers: [],
- eventDefParsers: [],
- isDraggableTransformers: [],
- eventDragMutationMassagers: [],
- eventDefMutationAppliers: [],
- dateSelectionTransformers: [],
- datePointTransforms: [],
- dateSpanTransforms: [],
- views: {},
- viewPropsTransformers: [],
- isPropsValid: null,
- externalDefTransforms: [],
- eventResizeJoinTransforms: [],
- viewContainerModifiers: [],
- eventDropTransformers: [],
- componentInteractions: [],
- calendarInteractions: [],
- themeClasses: {},
- eventSourceDefs: [],
- cmdFormatter: null,
- recurringTypes: [],
- namedTimeZonedImpl: null,
- defaultView: '',
- elementDraggingImpl: null,
- optionChangeHandlers: {}
- };
- this.addedHash = {};
- }
- PluginSystem.prototype.add = function (plugin) {
- if (!this.addedHash[plugin.id]) {
- this.addedHash[plugin.id] = true;
- for (var _i = 0, _a = plugin.deps; _i < _a.length; _i++) {
- var dep = _a[_i];
- this.add(dep);
- }
- this.hooks = combineHooks(this.hooks, plugin);
- }
- };
- return PluginSystem;
-}());
-function combineHooks(hooks0, hooks1) {
- return {
- reducers: hooks0.reducers.concat(hooks1.reducers),
- eventDefParsers: hooks0.eventDefParsers.concat(hooks1.eventDefParsers),
- isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
- eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
- eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
- dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
- datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
- dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
- views: __assign({}, hooks0.views, hooks1.views),
- viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
- isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
- externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
- eventResizeJoinTransforms: hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms),
- viewContainerModifiers: hooks0.viewContainerModifiers.concat(hooks1.viewContainerModifiers),
- eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
- calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
- componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
- themeClasses: __assign({}, hooks0.themeClasses, hooks1.themeClasses),
- eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
- cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
- recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
- namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
- defaultView: hooks0.defaultView || hooks1.defaultView,
- elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
- optionChangeHandlers: __assign({}, hooks0.optionChangeHandlers, hooks1.optionChangeHandlers)
- };
-}
-
-var eventSourceDef = {
- ignoreRange: true,
- parseMeta: function (raw) {
- if (Array.isArray(raw)) { // short form
- return raw;
- }
- else if (Array.isArray(raw.events)) {
- return raw.events;
- }
- return null;
- },
- fetch: function (arg, success) {
- success({
- rawEvents: arg.eventSource.meta
- });
- }
-};
-var ArrayEventSourcePlugin = createPlugin({
- eventSourceDefs: [eventSourceDef]
-});
-
-var eventSourceDef$1 = {
- parseMeta: function (raw) {
- if (typeof raw === 'function') { // short form
- return raw;
- }
- else if (typeof raw.events === 'function') {
- return raw.events;
- }
- return null;
- },
- fetch: function (arg, success, failure) {
- var dateEnv = arg.calendar.dateEnv;
- var func = arg.eventSource.meta;
- unpromisify(func.bind(null, {
- start: dateEnv.toDate(arg.range.start),
- end: dateEnv.toDate(arg.range.end),
- startStr: dateEnv.formatIso(arg.range.start),
- endStr: dateEnv.formatIso(arg.range.end),
- timeZone: dateEnv.timeZone
- }), function (rawEvents) {
- success({ rawEvents: rawEvents }); // needs an object response
- }, failure // send errorObj directly to failure callback
- );
- }
-};
-var FuncEventSourcePlugin = createPlugin({
- eventSourceDefs: [eventSourceDef$1]
-});
-
-function requestJson(method, url, params, successCallback, failureCallback) {
- method = method.toUpperCase();
- var body = null;
- if (method === 'GET') {
- url = injectQueryStringParams(url, params);
- }
- else {
- body = encodeParams(params);
- }
- var xhr = new XMLHttpRequest();
- xhr.open(method, url, true);
- if (method !== 'GET') {
- xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
- }
- xhr.onload = function () {
- if (xhr.status >= 200 && xhr.status < 400) {
- try {
- var res = JSON.parse(xhr.responseText);
- successCallback(res, xhr);
- }
- catch (err) {
- failureCallback('Failure parsing JSON', xhr);
- }
- }
- else {
- failureCallback('Request failed', xhr);
- }
- };
- xhr.onerror = function () {
- failureCallback('Request failed', xhr);
- };
- xhr.send(body);
-}
-function injectQueryStringParams(url, params) {
- return url +
- (url.indexOf('?') === -1 ? '?' : '&') +
- encodeParams(params);
-}
-function encodeParams(params) {
- var parts = [];
- for (var key in params) {
- parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));
- }
- return parts.join('&');
-}
-
-var eventSourceDef$2 = {
- parseMeta: function (raw) {
- if (typeof raw === 'string') { // short form
- raw = { url: raw };
- }
- else if (!raw || typeof raw !== 'object' || !raw.url) {
- return null;
- }
- return {
- url: raw.url,
- method: (raw.method || 'GET').toUpperCase(),
- extraParams: raw.extraParams,
- startParam: raw.startParam,
- endParam: raw.endParam,
- timeZoneParam: raw.timeZoneParam
- };
- },
- fetch: function (arg, success, failure) {
- var meta = arg.eventSource.meta;
- var requestParams = buildRequestParams(meta, arg.range, arg.calendar);
- requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) {
- success({ rawEvents: rawEvents, xhr: xhr });
- }, function (errorMessage, xhr) {
- failure({ message: errorMessage, xhr: xhr });
- });
- }
-};
-var JsonFeedEventSourcePlugin = createPlugin({
- eventSourceDefs: [eventSourceDef$2]
-});
-function buildRequestParams(meta, range, calendar) {
- var dateEnv = calendar.dateEnv;
- var startParam;
- var endParam;
- var timeZoneParam;
- var customRequestParams;
- var params = {};
- startParam = meta.startParam;
- if (startParam == null) {
- startParam = calendar.opt('startParam');
- }
- endParam = meta.endParam;
- if (endParam == null) {
- endParam = calendar.opt('endParam');
- }
- timeZoneParam = meta.timeZoneParam;
- if (timeZoneParam == null) {
- timeZoneParam = calendar.opt('timeZoneParam');
- }
- // retrieve any outbound GET/POST data from the options
- if (typeof meta.extraParams === 'function') {
- // supplied as a function that returns a key/value object
- customRequestParams = meta.extraParams();
- }
- else {
- // probably supplied as a straight key/value object
- customRequestParams = meta.extraParams || {};
- }
- __assign(params, customRequestParams);
- params[startParam] = dateEnv.formatIso(range.start);
- params[endParam] = dateEnv.formatIso(range.end);
- if (dateEnv.timeZone !== 'local') {
- params[timeZoneParam] = dateEnv.timeZone;
- }
- return params;
-}
-
-var recurring = {
- parse: function (rawEvent, leftoverProps, dateEnv) {
- var createMarker = dateEnv.createMarker.bind(dateEnv);
- var processors = {
- daysOfWeek: null,
- startTime: createDuration,
- endTime: createDuration,
- startRecur: createMarker,
- endRecur: createMarker
- };
- var props = refineProps(rawEvent, processors, {}, leftoverProps);
- var anyValid = false;
- for (var propName in props) {
- if (props[propName] != null) {
- anyValid = true;
- break;
- }
- }
- if (anyValid) {
- var duration = null;
- if ('duration' in leftoverProps) {
- duration = createDuration(leftoverProps.duration);
- delete leftoverProps.duration;
- }
- if (!duration && props.startTime && props.endTime) {
- duration = subtractDurations(props.endTime, props.startTime);
- }
- return {
- allDayGuess: Boolean(!props.startTime && !props.endTime),
- duration: duration,
- typeData: props // doesn't need endTime anymore but oh well
- };
- }
- return null;
- },
- expand: function (typeData, framingRange, dateEnv) {
- var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
- if (clippedFramingRange) {
- return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
- }
- else {
- return [];
- }
- }
-};
-var SimpleRecurrencePlugin = createPlugin({
- recurringTypes: [recurring]
-});
-function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
- var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
- var dayMarker = startOfDay(framingRange.start);
- var endMarker = framingRange.end;
- var instanceStarts = [];
- while (dayMarker < endMarker) {
- var instanceStart
- // if everyday, or this particular day-of-week
- = void 0;
- // if everyday, or this particular day-of-week
- if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
- if (startTime) {
- instanceStart = dateEnv.add(dayMarker, startTime);
- }
- else {
- instanceStart = dayMarker;
- }
- instanceStarts.push(instanceStart);
- }
- dayMarker = addDays(dayMarker, 1);
- }
- return instanceStarts;
-}
-
-var DefaultOptionChangeHandlers = createPlugin({
- optionChangeHandlers: {
- events: function (events, calendar, deepEqual) {
- handleEventSources([events], calendar, deepEqual);
- },
- eventSources: handleEventSources,
- plugins: handlePlugins
- }
-});
-function handleEventSources(inputs, calendar, deepEqual) {
- var unfoundSources = hashValuesToArray(calendar.state.eventSources);
- var newInputs = [];
- for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
- var input = inputs_1[_i];
- var inputFound = false;
- for (var i = 0; i < unfoundSources.length; i++) {
- if (deepEqual(unfoundSources[i]._raw, input)) {
- unfoundSources.splice(i, 1); // delete
- inputFound = true;
- break;
- }
- }
- if (!inputFound) {
- newInputs.push(input);
- }
- }
- for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) {
- var unfoundSource = unfoundSources_1[_a];
- calendar.dispatch({
- type: 'REMOVE_EVENT_SOURCE',
- sourceId: unfoundSource.sourceId
- });
- }
- for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) {
- var newInput = newInputs_1[_b];
- calendar.addEventSource(newInput);
- }
-}
-// shortcoming: won't remove plugins
-function handlePlugins(inputs, calendar) {
- calendar.addPluginInputs(inputs); // will gracefully handle duplicates
-}
-
-var config = {}; // TODO: make these options
-var globalDefaults = {
- defaultRangeSeparator: ' - ',
- titleRangeSeparator: ' \u2013 ',
- defaultTimedEventDuration: '01:00:00',
- defaultAllDayEventDuration: { day: 1 },
- forceEventDuration: false,
- nextDayThreshold: '00:00:00',
- // display
- columnHeader: true,
- defaultView: '',
- aspectRatio: 1.35,
- header: {
- left: 'title',
- center: '',
- right: 'today prev,next'
- },
- weekends: true,
- weekNumbers: false,
- weekNumberCalculation: 'local',
- editable: false,
- // nowIndicator: false,
- scrollTime: '06:00:00',
- minTime: '00:00:00',
- maxTime: '24:00:00',
- showNonCurrentDates: true,
- // event ajax
- lazyFetching: true,
- startParam: 'start',
- endParam: 'end',
- timeZoneParam: 'timeZone',
- timeZone: 'local',
- // allDayDefault: undefined,
- // locale
- locales: [],
- locale: '',
- // dir: will get this from the default locale
- // buttonIcons: null,
- // allows setting a min-height to the event segment to prevent short events overlapping each other
- timeGridEventMinHeight: 0,
- themeSystem: 'standard',
- // eventResizableFromStart: false,
- dragRevertDuration: 500,
- dragScroll: true,
- allDayMaintainDuration: false,
- // selectable: false,
- unselectAuto: true,
- // selectMinDistance: 0,
- dropAccept: '*',
- eventOrder: 'start,-duration,allDay,title',
- // ^ if start tie, longer events go before shorter. final tie-breaker is title text
- // rerenderDelay: null,
- eventLimit: false,
- eventLimitClick: 'popover',
- dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' },
- handleWindowResize: true,
- windowResizeDelay: 100,
- longPressDelay: 1000,
- eventDragMinDistance: 5 // only applies to mouse
-};
-var rtlDefaults = {
- header: {
- left: 'next,prev today',
- center: '',
- right: 'title'
- },
- buttonIcons: {
- // TODO: make RTL support the responibility of the theme
- prev: 'fc-icon-chevron-right',
- next: 'fc-icon-chevron-left',
- prevYear: 'fc-icon-chevrons-right',
- nextYear: 'fc-icon-chevrons-left'
- }
-};
-var complexOptions = [
- 'header',
- 'footer',
- 'buttonText',
- 'buttonIcons'
-];
-// Merges an array of option objects into a single object
-function mergeOptions(optionObjs) {
- return mergeProps(optionObjs, complexOptions);
-}
-// TODO: move this stuff to a "plugin"-related file...
-var INTERNAL_PLUGINS = [
- ArrayEventSourcePlugin,
- FuncEventSourcePlugin,
- JsonFeedEventSourcePlugin,
- SimpleRecurrencePlugin,
- DefaultOptionChangeHandlers
-];
-function refinePluginDefs(pluginInputs) {
- var plugins = [];
- for (var _i = 0, pluginInputs_1 = pluginInputs; _i < pluginInputs_1.length; _i++) {
- var pluginInput = pluginInputs_1[_i];
- if (typeof pluginInput === 'string') {
- var globalName = 'FullCalendar' + capitaliseFirstLetter(pluginInput);
- if (!window[globalName]) {
- console.warn('Plugin file not loaded for ' + pluginInput);
- }
- else {
- plugins.push(window[globalName].default); // is an ES6 module
- }
- }
- else {
- plugins.push(pluginInput);
- }
- }
- return INTERNAL_PLUGINS.concat(plugins);
-}
-
-var RAW_EN_LOCALE = {
- code: 'en',
- week: {
- dow: 0,
- doy: 4 // 4 days need to be within the year to be considered the first week
- },
- dir: 'ltr',
- buttonText: {
- prev: 'prev',
- next: 'next',
- prevYear: 'prev year',
- nextYear: 'next year',
- year: 'year',
- today: 'today',
- month: 'month',
- week: 'week',
- day: 'day',
- list: 'list'
- },
- weekLabel: 'W',
- allDayText: 'all-day',
- eventLimitText: 'more',
- noEventsMessage: 'No events to display'
-};
-function parseRawLocales(explicitRawLocales) {
- var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en';
- var globalArray = window['FullCalendarLocalesAll'] || []; // from locales-all.js
- var globalObject = window['FullCalendarLocales'] || {}; // from locales/*.js. keys are meaningless
- var allRawLocales = globalArray.concat(// globalArray is low prio
- hashValuesToArray(globalObject), // medium prio
- explicitRawLocales // highest prio
- );
- var rawLocaleMap = {
- en: RAW_EN_LOCALE // necessary?
- };
- for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) {
- var rawLocale = allRawLocales_1[_i];
- rawLocaleMap[rawLocale.code] = rawLocale;
- }
- return {
- map: rawLocaleMap,
- defaultCode: defaultCode
- };
-}
-function buildLocale(inputSingular, available) {
- if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) {
- return parseLocale(inputSingular.code, [inputSingular.code], inputSingular);
- }
- else {
- return queryLocale(inputSingular, available);
- }
-}
-function queryLocale(codeArg, available) {
- var codes = [].concat(codeArg || []); // will convert to array
- var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE;
- return parseLocale(codeArg, codes, raw);
-}
-function queryRawLocale(codes, available) {
- for (var i = 0; i < codes.length; i++) {
- var parts = codes[i].toLocaleLowerCase().split('-');
- for (var j = parts.length; j > 0; j--) {
- var simpleId = parts.slice(0, j).join('-');
- if (available[simpleId]) {
- return available[simpleId];
- }
- }
- }
- return null;
-}
-function parseLocale(codeArg, codes, raw) {
- var merged = mergeProps([RAW_EN_LOCALE, raw], ['buttonText']);
- delete merged.code; // don't want this part of the options
- var week = merged.week;
- delete merged.week;
- return {
- codeArg: codeArg,
- codes: codes,
- week: week,
- simpleNumberFormat: new Intl.NumberFormat(codeArg),
- options: merged
- };
-}
-
-var OptionsManager = /** @class */ (function () {
- function OptionsManager(overrides) {
- this.overrides = __assign({}, overrides); // make a copy
- this.dynamicOverrides = {};
- this.compute();
- }
- OptionsManager.prototype.mutate = function (updates, removals, isDynamic) {
- if (!Object.keys(updates).length && !removals.length) {
- return;
- }
- var overrideHash = isDynamic ? this.dynamicOverrides : this.overrides;
- __assign(overrideHash, updates);
- for (var _i = 0, removals_1 = removals; _i < removals_1.length; _i++) {
- var propName = removals_1[_i];
- delete overrideHash[propName];
- }
- this.compute();
- };
- // Computes the flattened options hash for the calendar and assigns to `this.options`.
- // Assumes this.overrides and this.dynamicOverrides have already been initialized.
- OptionsManager.prototype.compute = function () {
- // TODO: not a very efficient system
- var locales = firstDefined(// explicit locale option given?
- this.dynamicOverrides.locales, this.overrides.locales, globalDefaults.locales);
- var locale = firstDefined(// explicit locales option given?
- this.dynamicOverrides.locale, this.overrides.locale, globalDefaults.locale);
- var available = parseRawLocales(locales);
- var localeDefaults = buildLocale(locale || available.defaultCode, available.map).options;
- var dir = firstDefined(// based on options computed so far, is direction RTL?
- this.dynamicOverrides.dir, this.overrides.dir, localeDefaults.dir);
- var dirDefaults = dir === 'rtl' ? rtlDefaults : {};
- this.dirDefaults = dirDefaults;
- this.localeDefaults = localeDefaults;
- this.computed = mergeOptions([
- globalDefaults,
- dirDefaults,
- localeDefaults,
- this.overrides,
- this.dynamicOverrides
- ]);
- };
- return OptionsManager;
-}());
-
-var calendarSystemClassMap = {};
-function registerCalendarSystem(name, theClass) {
- calendarSystemClassMap[name] = theClass;
-}
-function createCalendarSystem(name) {
- return new calendarSystemClassMap[name]();
-}
-var GregorianCalendarSystem = /** @class */ (function () {
- function GregorianCalendarSystem() {
- }
- GregorianCalendarSystem.prototype.getMarkerYear = function (d) {
- return d.getUTCFullYear();
- };
- GregorianCalendarSystem.prototype.getMarkerMonth = function (d) {
- return d.getUTCMonth();
- };
- GregorianCalendarSystem.prototype.getMarkerDay = function (d) {
- return d.getUTCDate();
- };
- GregorianCalendarSystem.prototype.arrayToMarker = function (arr) {
- return arrayToUtcDate(arr);
- };
- GregorianCalendarSystem.prototype.markerToArray = function (marker) {
- return dateToUtcArray(marker);
- };
- return GregorianCalendarSystem;
-}());
-registerCalendarSystem('gregory', GregorianCalendarSystem);
-
-var ISO_RE = /^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;
-function parse(str) {
- var m = ISO_RE.exec(str);
- if (m) {
- var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number('0.' + m[12]) * 1000 : 0));
- if (isValidDate(marker)) {
- var timeZoneOffset = null;
- if (m[13]) {
- timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 +
- Number(m[18] || 0));
- }
- return {
- marker: marker,
- isTimeUnspecified: !m[6],
- timeZoneOffset: timeZoneOffset
- };
- }
- }
- return null;
-}
-
-var DateEnv = /** @class */ (function () {
- function DateEnv(settings) {
- var timeZone = this.timeZone = settings.timeZone;
- var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC';
- if (settings.namedTimeZoneImpl && isNamedTimeZone) {
- this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone);
- }
- this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl);
- this.calendarSystem = createCalendarSystem(settings.calendarSystem);
- this.locale = settings.locale;
- this.weekDow = settings.locale.week.dow;
- this.weekDoy = settings.locale.week.doy;
- if (settings.weekNumberCalculation === 'ISO') {
- this.weekDow = 1;
- this.weekDoy = 4;
- }
- if (typeof settings.firstDay === 'number') {
- this.weekDow = settings.firstDay;
- }
- if (typeof settings.weekNumberCalculation === 'function') {
- this.weekNumberFunc = settings.weekNumberCalculation;
- }
- this.weekLabel = settings.weekLabel != null ? settings.weekLabel : settings.locale.options.weekLabel;
- this.cmdFormatter = settings.cmdFormatter;
- }
- // Creating / Parsing
- DateEnv.prototype.createMarker = function (input) {
- var meta = this.createMarkerMeta(input);
- if (meta === null) {
- return null;
- }
- return meta.marker;
- };
- DateEnv.prototype.createNowMarker = function () {
- if (this.canComputeOffset) {
- return this.timestampToMarker(new Date().valueOf());
- }
- else {
- // if we can't compute the current date val for a timezone,
- // better to give the current local date vals than UTC
- return arrayToUtcDate(dateToLocalArray(new Date()));
- }
- };
- DateEnv.prototype.createMarkerMeta = function (input) {
- if (typeof input === 'string') {
- return this.parse(input);
- }
- var marker = null;
- if (typeof input === 'number') {
- marker = this.timestampToMarker(input);
- }
- else if (input instanceof Date) {
- input = input.valueOf();
- if (!isNaN(input)) {
- marker = this.timestampToMarker(input);
- }
- }
- else if (Array.isArray(input)) {
- marker = arrayToUtcDate(input);
- }
- if (marker === null || !isValidDate(marker)) {
- return null;
- }
- return { marker: marker, isTimeUnspecified: false, forcedTzo: null };
- };
- DateEnv.prototype.parse = function (s) {
- var parts = parse(s);
- if (parts === null) {
- return null;
- }
- var marker = parts.marker;
- var forcedTzo = null;
- if (parts.timeZoneOffset !== null) {
- if (this.canComputeOffset) {
- marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000);
- }
- else {
- forcedTzo = parts.timeZoneOffset;
- }
- }
- return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo };
- };
- // Accessors
- DateEnv.prototype.getYear = function (marker) {
- return this.calendarSystem.getMarkerYear(marker);
- };
- DateEnv.prototype.getMonth = function (marker) {
- return this.calendarSystem.getMarkerMonth(marker);
- };
- // Adding / Subtracting
- DateEnv.prototype.add = function (marker, dur) {
- var a = this.calendarSystem.markerToArray(marker);
- a[0] += dur.years;
- a[1] += dur.months;
- a[2] += dur.days;
- a[6] += dur.milliseconds;
- return this.calendarSystem.arrayToMarker(a);
- };
- DateEnv.prototype.subtract = function (marker, dur) {
- var a = this.calendarSystem.markerToArray(marker);
- a[0] -= dur.years;
- a[1] -= dur.months;
- a[2] -= dur.days;
- a[6] -= dur.milliseconds;
- return this.calendarSystem.arrayToMarker(a);
- };
- DateEnv.prototype.addYears = function (marker, n) {
- var a = this.calendarSystem.markerToArray(marker);
- a[0] += n;
- return this.calendarSystem.arrayToMarker(a);
- };
- DateEnv.prototype.addMonths = function (marker, n) {
- var a = this.calendarSystem.markerToArray(marker);
- a[1] += n;
- return this.calendarSystem.arrayToMarker(a);
- };
- // Diffing Whole Units
- DateEnv.prototype.diffWholeYears = function (m0, m1) {
- var calendarSystem = this.calendarSystem;
- if (timeAsMs(m0) === timeAsMs(m1) &&
- calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) &&
- calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) {
- return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0);
- }
- return null;
- };
- DateEnv.prototype.diffWholeMonths = function (m0, m1) {
- var calendarSystem = this.calendarSystem;
- if (timeAsMs(m0) === timeAsMs(m1) &&
- calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) {
- return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) +
- (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12;
- }
- return null;
- };
- // Range / Duration
- DateEnv.prototype.greatestWholeUnit = function (m0, m1) {
- var n = this.diffWholeYears(m0, m1);
- if (n !== null) {
- return { unit: 'year', value: n };
- }
- n = this.diffWholeMonths(m0, m1);
- if (n !== null) {
- return { unit: 'month', value: n };
- }
- n = diffWholeWeeks(m0, m1);
- if (n !== null) {
- return { unit: 'week', value: n };
- }
- n = diffWholeDays(m0, m1);
- if (n !== null) {
- return { unit: 'day', value: n };
- }
- n = diffHours(m0, m1);
- if (isInt(n)) {
- return { unit: 'hour', value: n };
- }
- n = diffMinutes(m0, m1);
- if (isInt(n)) {
- return { unit: 'minute', value: n };
- }
- n = diffSeconds(m0, m1);
- if (isInt(n)) {
- return { unit: 'second', value: n };
- }
- return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() };
- };
- DateEnv.prototype.countDurationsBetween = function (m0, m1, d) {
- // TODO: can use greatestWholeUnit
- var diff;
- if (d.years) {
- diff = this.diffWholeYears(m0, m1);
- if (diff !== null) {
- return diff / asRoughYears(d);
- }
- }
- if (d.months) {
- diff = this.diffWholeMonths(m0, m1);
- if (diff !== null) {
- return diff / asRoughMonths(d);
- }
- }
- if (d.days) {
- diff = diffWholeDays(m0, m1);
- if (diff !== null) {
- return diff / asRoughDays(d);
- }
- }
- return (m1.valueOf() - m0.valueOf()) / asRoughMs(d);
- };
- // Start-Of
- DateEnv.prototype.startOf = function (m, unit) {
- if (unit === 'year') {
- return this.startOfYear(m);
- }
- else if (unit === 'month') {
- return this.startOfMonth(m);
- }
- else if (unit === 'week') {
- return this.startOfWeek(m);
- }
- else if (unit === 'day') {
- return startOfDay(m);
- }
- else if (unit === 'hour') {
- return startOfHour(m);
- }
- else if (unit === 'minute') {
- return startOfMinute(m);
- }
- else if (unit === 'second') {
- return startOfSecond(m);
- }
- };
- DateEnv.prototype.startOfYear = function (m) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m)
- ]);
- };
- DateEnv.prototype.startOfMonth = function (m) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m),
- this.calendarSystem.getMarkerMonth(m)
- ]);
- };
- DateEnv.prototype.startOfWeek = function (m) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m),
- this.calendarSystem.getMarkerMonth(m),
- m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7)
- ]);
- };
- // Week Number
- DateEnv.prototype.computeWeekNumber = function (marker) {
- if (this.weekNumberFunc) {
- return this.weekNumberFunc(this.toDate(marker));
- }
- else {
- return weekOfYear(marker, this.weekDow, this.weekDoy);
- }
- };
- // TODO: choke on timeZoneName: long
- DateEnv.prototype.format = function (marker, formatter, dateOptions) {
- if (dateOptions === void 0) { dateOptions = {}; }
- return formatter.format({
- marker: marker,
- timeZoneOffset: dateOptions.forcedTzo != null ?
- dateOptions.forcedTzo :
- this.offsetForMarker(marker)
- }, this);
- };
- DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) {
- if (dateOptions === void 0) { dateOptions = {}; }
- if (dateOptions.isEndExclusive) {
- end = addMs(end, -1);
- }
- return formatter.formatRange({
- marker: start,
- timeZoneOffset: dateOptions.forcedStartTzo != null ?
- dateOptions.forcedStartTzo :
- this.offsetForMarker(start)
- }, {
- marker: end,
- timeZoneOffset: dateOptions.forcedEndTzo != null ?
- dateOptions.forcedEndTzo :
- this.offsetForMarker(end)
- }, this);
- };
- DateEnv.prototype.formatIso = function (marker, extraOptions) {
- if (extraOptions === void 0) { extraOptions = {}; }
- var timeZoneOffset = null;
- if (!extraOptions.omitTimeZoneOffset) {
- if (extraOptions.forcedTzo != null) {
- timeZoneOffset = extraOptions.forcedTzo;
- }
- else {
- timeZoneOffset = this.offsetForMarker(marker);
- }
- }
- return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime);
- };
- // TimeZone
- DateEnv.prototype.timestampToMarker = function (ms) {
- if (this.timeZone === 'local') {
- return arrayToUtcDate(dateToLocalArray(new Date(ms)));
- }
- else if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) {
- return new Date(ms);
- }
- else {
- return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));
- }
- };
- DateEnv.prototype.offsetForMarker = function (m) {
- if (this.timeZone === 'local') {
- return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset
- }
- else if (this.timeZone === 'UTC') {
- return 0;
- }
- else if (this.namedTimeZoneImpl) {
- return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m));
- }
- return null;
- };
- // Conversion
- DateEnv.prototype.toDate = function (m, forcedTzo) {
- if (this.timeZone === 'local') {
- return arrayToLocalDate(dateToUtcArray(m));
- }
- else if (this.timeZone === 'UTC') {
- return new Date(m.valueOf()); // make sure it's a copy
- }
- else if (!this.namedTimeZoneImpl) {
- return new Date(m.valueOf() - (forcedTzo || 0));
- }
- else {
- return new Date(m.valueOf() -
- this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60 // convert minutes -> ms
- );
- }
- };
- return DateEnv;
-}());
-
-var SIMPLE_SOURCE_PROPS = {
- id: String,
- allDayDefault: Boolean,
- eventDataTransform: Function,
- success: Function,
- failure: Function
-};
-var uid$2 = 0;
-function doesSourceNeedRange(eventSource, calendar) {
- var defs = calendar.pluginSystem.hooks.eventSourceDefs;
- return !defs[eventSource.sourceDefId].ignoreRange;
-}
-function parseEventSource(raw, calendar) {
- var defs = calendar.pluginSystem.hooks.eventSourceDefs;
- for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
- var def = defs[i];
- var meta = def.parseMeta(raw);
- if (meta) {
- var res = parseEventSourceProps(typeof raw === 'object' ? raw : {}, meta, i, calendar);
- res._raw = raw;
- return res;
- }
- }
- return null;
-}
-function parseEventSourceProps(raw, meta, sourceDefId, calendar) {
- var leftovers0 = {};
- var props = refineProps(raw, SIMPLE_SOURCE_PROPS, {}, leftovers0);
- var leftovers1 = {};
- var ui = processUnscopedUiProps(leftovers0, calendar, leftovers1);
- props.isFetching = false;
- props.latestFetchId = '';
- props.fetchRange = null;
- props.publicId = String(raw.id || '');
- props.sourceId = String(uid$2++);
- props.sourceDefId = sourceDefId;
- props.meta = meta;
- props.ui = ui;
- props.extendedProps = leftovers1;
- return props;
-}
-
-function reduceEventSources (eventSources, action, dateProfile, calendar) {
- switch (action.type) {
- case 'ADD_EVENT_SOURCES': // already parsed
- return addSources(eventSources, action.sources, dateProfile ? dateProfile.activeRange : null, calendar);
- case 'REMOVE_EVENT_SOURCE':
- return removeSource(eventSources, action.sourceId);
- case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
- case 'NEXT':
- case 'SET_DATE':
- case 'SET_VIEW_TYPE':
- if (dateProfile) {
- return fetchDirtySources(eventSources, dateProfile.activeRange, calendar);
- }
- else {
- return eventSources;
- }
- case 'FETCH_EVENT_SOURCES':
- case 'CHANGE_TIMEZONE':
- return fetchSourcesByIds(eventSources, action.sourceIds ?
- arrayToHash(action.sourceIds) :
- excludeStaticSources(eventSources, calendar), dateProfile ? dateProfile.activeRange : null, calendar);
- case 'RECEIVE_EVENTS':
- case 'RECEIVE_EVENT_ERROR':
- return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
- case 'REMOVE_ALL_EVENT_SOURCES':
- return {};
- default:
- return eventSources;
- }
-}
-var uid$3 = 0;
-function addSources(eventSourceHash, sources, fetchRange, calendar) {
- var hash = {};
- for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) {
- var source = sources_1[_i];
- hash[source.sourceId] = source;
- }
- if (fetchRange) {
- hash = fetchDirtySources(hash, fetchRange, calendar);
- }
- return __assign({}, eventSourceHash, hash);
-}
-function removeSource(eventSourceHash, sourceId) {
- return filterHash(eventSourceHash, function (eventSource) {
- return eventSource.sourceId !== sourceId;
- });
-}
-function fetchDirtySources(sourceHash, fetchRange, calendar) {
- return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) {
- return isSourceDirty(eventSource, fetchRange, calendar);
- }), fetchRange, calendar);
-}
-function isSourceDirty(eventSource, fetchRange, calendar) {
- if (!doesSourceNeedRange(eventSource, calendar)) {
- return !eventSource.latestFetchId;
- }
- else {
- return !calendar.opt('lazyFetching') ||
- !eventSource.fetchRange ||
- eventSource.isFetching || // always cancel outdated in-progress fetches
- fetchRange.start < eventSource.fetchRange.start ||
- fetchRange.end > eventSource.fetchRange.end;
- }
-}
-function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, calendar) {
- var nextSources = {};
- for (var sourceId in prevSources) {
- var source = prevSources[sourceId];
- if (sourceIdHash[sourceId]) {
- nextSources[sourceId] = fetchSource(source, fetchRange, calendar);
- }
- else {
- nextSources[sourceId] = source;
- }
- }
- return nextSources;
-}
-function fetchSource(eventSource, fetchRange, calendar) {
- var sourceDef = calendar.pluginSystem.hooks.eventSourceDefs[eventSource.sourceDefId];
- var fetchId = String(uid$3++);
- sourceDef.fetch({
- eventSource: eventSource,
- calendar: calendar,
- range: fetchRange
- }, function (res) {
- var rawEvents = res.rawEvents;
- var calSuccess = calendar.opt('eventSourceSuccess');
- var calSuccessRes;
- var sourceSuccessRes;
- if (eventSource.success) {
- sourceSuccessRes = eventSource.success(rawEvents, res.xhr);
- }
- if (calSuccess) {
- calSuccessRes = calSuccess(rawEvents, res.xhr);
- }
- rawEvents = sourceSuccessRes || calSuccessRes || rawEvents;
- calendar.dispatch({
- type: 'RECEIVE_EVENTS',
- sourceId: eventSource.sourceId,
- fetchId: fetchId,
- fetchRange: fetchRange,
- rawEvents: rawEvents
- });
- }, function (error) {
- var callFailure = calendar.opt('eventSourceFailure');
- console.warn(error.message, error);
- if (eventSource.failure) {
- eventSource.failure(error);
- }
- if (callFailure) {
- callFailure(error);
- }
- calendar.dispatch({
- type: 'RECEIVE_EVENT_ERROR',
- sourceId: eventSource.sourceId,
- fetchId: fetchId,
- fetchRange: fetchRange,
- error: error
- });
- });
- return __assign({}, eventSource, { isFetching: true, latestFetchId: fetchId });
-}
-function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
- var _a;
- var eventSource = sourceHash[sourceId];
- if (eventSource && // not already removed
- fetchId === eventSource.latestFetchId) {
- return __assign({}, sourceHash, (_a = {}, _a[sourceId] = __assign({}, eventSource, { isFetching: false, fetchRange: fetchRange // also serves as a marker that at least one fetch has completed
- }), _a));
- }
- return sourceHash;
-}
-function excludeStaticSources(eventSources, calendar) {
- return filterHash(eventSources, function (eventSource) {
- return doesSourceNeedRange(eventSource, calendar);
- });
-}
-
-var DateProfileGenerator = /** @class */ (function () {
- function DateProfileGenerator(viewSpec, calendar) {
- this.viewSpec = viewSpec;
- this.options = viewSpec.options;
- this.dateEnv = calendar.dateEnv;
- this.calendar = calendar;
- this.initHiddenDays();
- }
- /* Date Range Computation
- ------------------------------------------------------------------------------------------------------------------*/
- // Builds a structure with info about what the dates/ranges will be for the "prev" view.
- DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate) {
- var dateEnv = this.dateEnv;
- var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
- currentDateProfile.dateIncrement);
- return this.build(prevDate, -1);
- };
- // Builds a structure with info about what the dates/ranges will be for the "next" view.
- DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate) {
- var dateEnv = this.dateEnv;
- var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
- currentDateProfile.dateIncrement);
- return this.build(nextDate, 1);
- };
- // Builds a structure holding dates/ranges for rendering around the given date.
- // Optional direction param indicates whether the date is being incremented/decremented
- // from its previous value. decremented = -1, incremented = 1 (default).
- DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) {
- if (forceToValid === void 0) { forceToValid = false; }
- var validRange;
- var minTime = null;
- var maxTime = null;
- var currentInfo;
- var isRangeAllDay;
- var renderRange;
- var activeRange;
- var isValid;
- validRange = this.buildValidRange();
- validRange = this.trimHiddenDays(validRange);
- if (forceToValid) {
- currentDate = constrainMarkerToRange(currentDate, validRange);
- }
- currentInfo = this.buildCurrentRangeInfo(currentDate, direction);
- isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);
- renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay);
- renderRange = this.trimHiddenDays(renderRange);
- activeRange = renderRange;
- if (!this.options.showNonCurrentDates) {
- activeRange = intersectRanges(activeRange, currentInfo.range);
- }
- minTime = createDuration(this.options.minTime);
- maxTime = createDuration(this.options.maxTime);
- activeRange = this.adjustActiveRange(activeRange, minTime, maxTime);
- activeRange = intersectRanges(activeRange, validRange); // might return null
- // it's invalid if the originally requested date is not contained,
- // or if the range is completely outside of the valid range.
- isValid = rangesIntersect(currentInfo.range, validRange);
- return {
- // constraint for where prev/next operations can go and where events can be dragged/resized to.
- // an object with optional start and end properties.
- validRange: validRange,
- // range the view is formally responsible for.
- // for example, a month view might have 1st-31st, excluding padded dates
- currentRange: currentInfo.range,
- // name of largest unit being displayed, like "month" or "week"
- currentRangeUnit: currentInfo.unit,
- isRangeAllDay: isRangeAllDay,
- // dates that display events and accept drag-n-drop
- // will be `null` if no dates accept events
- activeRange: activeRange,
- // date range with a rendered skeleton
- // includes not-active days that need some sort of DOM
- renderRange: renderRange,
- // Duration object that denotes the first visible time of any given day
- minTime: minTime,
- // Duration object that denotes the exclusive visible end time of any given day
- maxTime: maxTime,
- isValid: isValid,
- // how far the current date will move for a prev/next operation
- dateIncrement: this.buildDateIncrement(currentInfo.duration)
- // pass a fallback (might be null) ^
- };
- };
- // Builds an object with optional start/end properties.
- // Indicates the minimum/maximum dates to display.
- // not responsible for trimming hidden days.
- DateProfileGenerator.prototype.buildValidRange = function () {
- return this.getRangeOption('validRange', this.calendar.getNow()) ||
- { start: null, end: null }; // completely open-ended
- };
- // Builds a structure with info about the "current" range, the range that is
- // highlighted as being the current month for example.
- // See build() for a description of `direction`.
- // Guaranteed to have `range` and `unit` properties. `duration` is optional.
- DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {
- var _a = this, viewSpec = _a.viewSpec, dateEnv = _a.dateEnv;
- var duration = null;
- var unit = null;
- var range = null;
- var dayCount;
- if (viewSpec.duration) {
- duration = viewSpec.duration;
- unit = viewSpec.durationUnit;
- range = this.buildRangeFromDuration(date, direction, duration, unit);
- }
- else if ((dayCount = this.options.dayCount)) {
- unit = 'day';
- range = this.buildRangeFromDayCount(date, direction, dayCount);
- }
- else if ((range = this.buildCustomVisibleRange(date))) {
- unit = dateEnv.greatestWholeUnit(range.start, range.end).unit;
- }
- else {
- duration = this.getFallbackDuration();
- unit = greatestDurationDenominator(duration).unit;
- range = this.buildRangeFromDuration(date, direction, duration, unit);
- }
- return { duration: duration, unit: unit, range: range };
- };
- DateProfileGenerator.prototype.getFallbackDuration = function () {
- return createDuration({ day: 1 });
- };
- // Returns a new activeRange to have time values (un-ambiguate)
- // minTime or maxTime causes the range to expand.
- DateProfileGenerator.prototype.adjustActiveRange = function (range, minTime, maxTime) {
- var dateEnv = this.dateEnv;
- var start = range.start;
- var end = range.end;
- if (this.viewSpec.class.prototype.usesMinMaxTime) {
- // expand active range if minTime is negative (why not when positive?)
- if (asRoughDays(minTime) < 0) {
- start = startOfDay(start); // necessary?
- start = dateEnv.add(start, minTime);
- }
- // expand active range if maxTime is beyond one day (why not when positive?)
- if (asRoughDays(maxTime) > 1) {
- end = startOfDay(end); // necessary?
- end = addDays(end, -1);
- end = dateEnv.add(end, maxTime);
- }
- }
- return { start: start, end: end };
- };
- // Builds the "current" range when it is specified as an explicit duration.
- // `unit` is the already-computed greatestDurationDenominator unit of duration.
- DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {
- var dateEnv = this.dateEnv;
- var alignment = this.options.dateAlignment;
- var dateIncrementInput;
- var dateIncrementDuration;
- var start;
- var end;
- var res;
- // compute what the alignment should be
- if (!alignment) {
- dateIncrementInput = this.options.dateIncrement;
- if (dateIncrementInput) {
- dateIncrementDuration = createDuration(dateIncrementInput);
- // use the smaller of the two units
- if (asRoughMs(dateIncrementDuration) < asRoughMs(duration)) {
- alignment = greatestDurationDenominator(dateIncrementDuration, !getWeeksFromInput(dateIncrementInput)).unit;
- }
- else {
- alignment = unit;
- }
- }
- else {
- alignment = unit;
- }
- }
- // if the view displays a single day or smaller
- if (asRoughDays(duration) <= 1) {
- if (this.isHiddenDay(start)) {
- start = this.skipHiddenDays(start, direction);
- start = startOfDay(start);
- }
- }
- function computeRes() {
- start = dateEnv.startOf(date, alignment);
- end = dateEnv.add(start, duration);
- res = { start: start, end: end };
- }
- computeRes();
- // if range is completely enveloped by hidden days, go past the hidden days
- if (!this.trimHiddenDays(res)) {
- date = this.skipHiddenDays(date, direction);
- computeRes();
- }
- return res;
- };
- // Builds the "current" range when a dayCount is specified.
- DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {
- var dateEnv = this.dateEnv;
- var customAlignment = this.options.dateAlignment;
- var runningCount = 0;
- var start = date;
- var end;
- if (customAlignment) {
- start = dateEnv.startOf(start, customAlignment);
- }
- start = startOfDay(start);
- start = this.skipHiddenDays(start, direction);
- end = start;
- do {
- end = addDays(end, 1);
- if (!this.isHiddenDay(end)) {
- runningCount++;
- }
- } while (runningCount < dayCount);
- return { start: start, end: end };
- };
- // Builds a normalized range object for the "visible" range,
- // which is a way to define the currentRange and activeRange at the same time.
- DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {
- var dateEnv = this.dateEnv;
- var visibleRange = this.getRangeOption('visibleRange', dateEnv.toDate(date));
- if (visibleRange && (visibleRange.start == null || visibleRange.end == null)) {
- return null;
- }
- return visibleRange;
- };
- // Computes the range that will represent the element/cells for *rendering*,
- // but which may have voided days/times.
- // not responsible for trimming hidden days.
- DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
- return currentRange;
- };
- // Compute the duration value that should be added/substracted to the current date
- // when a prev/next operation happens.
- DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {
- var dateIncrementInput = this.options.dateIncrement;
- var customAlignment;
- if (dateIncrementInput) {
- return createDuration(dateIncrementInput);
- }
- else if ((customAlignment = this.options.dateAlignment)) {
- return createDuration(1, customAlignment);
- }
- else if (fallback) {
- return fallback;
- }
- else {
- return createDuration({ days: 1 });
- }
- };
- // Arguments after name will be forwarded to a hypothetical function value
- // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.
- // Always clone your objects if you fear mutation.
- DateProfileGenerator.prototype.getRangeOption = function (name) {
- var otherArgs = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- otherArgs[_i - 1] = arguments[_i];
- }
- var val = this.options[name];
- if (typeof val === 'function') {
- val = val.apply(null, otherArgs);
- }
- if (val) {
- val = parseRange(val, this.dateEnv);
- }
- if (val) {
- val = computeVisibleDayRange(val);
- }
- return val;
- };
- /* Hidden Days
- ------------------------------------------------------------------------------------------------------------------*/
- // Initializes internal variables related to calculating hidden days-of-week
- DateProfileGenerator.prototype.initHiddenDays = function () {
- var hiddenDays = this.options.hiddenDays || []; // array of day-of-week indices that are hidden
- var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)
- var dayCnt = 0;
- var i;
- if (this.options.weekends === false) {
- hiddenDays.push(0, 6); // 0=sunday, 6=saturday
- }
- for (i = 0; i < 7; i++) {
- if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) {
- dayCnt++;
- }
- }
- if (!dayCnt) {
- throw new Error('invalid hiddenDays'); // all days were hidden? bad.
- }
- this.isHiddenDayHash = isHiddenDayHash;
- };
- // Remove days from the beginning and end of the range that are computed as hidden.
- // If the whole range is trimmed off, returns null
- DateProfileGenerator.prototype.trimHiddenDays = function (range) {
- var start = range.start;
- var end = range.end;
- if (start) {
- start = this.skipHiddenDays(start);
- }
- if (end) {
- end = this.skipHiddenDays(end, -1, true);
- }
- if (start == null || end == null || start < end) {
- return { start: start, end: end };
- }
- return null;
- };
- // Is the current day hidden?
- // `day` is a day-of-week index (0-6), or a Date (used for UTC)
- DateProfileGenerator.prototype.isHiddenDay = function (day) {
- if (day instanceof Date) {
- day = day.getUTCDay();
- }
- return this.isHiddenDayHash[day];
- };
- // Incrementing the current day until it is no longer a hidden day, returning a copy.
- // DOES NOT CONSIDER validRange!
- // If the initial value of `date` is not a hidden day, don't do anything.
- // Pass `isExclusive` as `true` if you are dealing with an end date.
- // `inc` defaults to `1` (increment one day forward each time)
- DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) {
- if (inc === void 0) { inc = 1; }
- if (isExclusive === void 0) { isExclusive = false; }
- while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) {
- date = addDays(date, inc);
- }
- return date;
- };
- return DateProfileGenerator;
-}());
-// TODO: find a way to avoid comparing DateProfiles. it's tedious
-function isDateProfilesEqual(p0, p1) {
- return rangesEqual(p0.validRange, p1.validRange) &&
- rangesEqual(p0.activeRange, p1.activeRange) &&
- rangesEqual(p0.renderRange, p1.renderRange) &&
- durationsEqual(p0.minTime, p1.minTime) &&
- durationsEqual(p0.maxTime, p1.maxTime);
- /*
- TODO: compare more?
- currentRange: DateRange
- currentRangeUnit: string
- isRangeAllDay: boolean
- isValid: boolean
- dateIncrement: Duration
- */
-}
-
-function reduce (state, action, calendar) {
- var viewType = reduceViewType(state.viewType, action);
- var dateProfile = reduceDateProfile(state.dateProfile, action, state.currentDate, viewType, calendar);
- var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendar);
- var nextState = __assign({}, state, { viewType: viewType,
- dateProfile: dateProfile, currentDate: reduceCurrentDate(state.currentDate, action, dateProfile), eventSources: eventSources, eventStore: reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendar), dateSelection: reduceDateSelection(state.dateSelection, action, calendar), eventSelection: reduceSelectedEvent(state.eventSelection, action), eventDrag: reduceEventDrag(state.eventDrag, action, eventSources, calendar), eventResize: reduceEventResize(state.eventResize, action, eventSources, calendar), eventSourceLoadingLevel: computeLoadingLevel(eventSources), loadingLevel: computeLoadingLevel(eventSources) });
- for (var _i = 0, _a = calendar.pluginSystem.hooks.reducers; _i < _a.length; _i++) {
- var reducerFunc = _a[_i];
- nextState = reducerFunc(nextState, action, calendar);
- }
- // console.log(action.type, nextState)
- return nextState;
-}
-function reduceViewType(currentViewType, action) {
- switch (action.type) {
- case 'SET_VIEW_TYPE':
- return action.viewType;
- default:
- return currentViewType;
- }
-}
-function reduceDateProfile(currentDateProfile, action, currentDate, viewType, calendar) {
- var newDateProfile;
- switch (action.type) {
- case 'PREV':
- newDateProfile = calendar.dateProfileGenerators[viewType].buildPrev(currentDateProfile, currentDate);
- break;
- case 'NEXT':
- newDateProfile = calendar.dateProfileGenerators[viewType].buildNext(currentDateProfile, currentDate);
- break;
- case 'SET_DATE':
- if (!currentDateProfile.activeRange ||
- !rangeContainsMarker(currentDateProfile.currentRange, action.dateMarker)) {
- newDateProfile = calendar.dateProfileGenerators[viewType].build(action.dateMarker, undefined, true // forceToValid
- );
- }
- break;
- case 'SET_VIEW_TYPE':
- var generator = calendar.dateProfileGenerators[viewType];
- if (!generator) {
- throw new Error(viewType ?
- 'The FullCalendar view "' + viewType + '" does not exist. Make sure your plugins are loaded correctly.' :
- 'No available FullCalendar view plugins.');
- }
- newDateProfile = generator.build(action.dateMarker || currentDate, undefined, true // forceToValid
- );
- break;
- }
- if (newDateProfile &&
- newDateProfile.isValid &&
- !(currentDateProfile && isDateProfilesEqual(currentDateProfile, newDateProfile))) {
- return newDateProfile;
- }
- else {
- return currentDateProfile;
- }
-}
-function reduceCurrentDate(currentDate, action, dateProfile) {
- switch (action.type) {
- case 'PREV':
- case 'NEXT':
- if (!rangeContainsMarker(dateProfile.currentRange, currentDate)) {
- return dateProfile.currentRange.start;
- }
- else {
- return currentDate;
- }
- case 'SET_DATE':
- case 'SET_VIEW_TYPE':
- var newDate = action.dateMarker || currentDate;
- if (dateProfile.activeRange && !rangeContainsMarker(dateProfile.activeRange, newDate)) {
- return dateProfile.currentRange.start;
- }
- else {
- return newDate;
- }
- default:
- return currentDate;
- }
-}
-function reduceDateSelection(currentSelection, action, calendar) {
- switch (action.type) {
- case 'SELECT_DATES':
- return action.selection;
- case 'UNSELECT_DATES':
- return null;
- default:
- return currentSelection;
- }
-}
-function reduceSelectedEvent(currentInstanceId, action) {
- switch (action.type) {
- case 'SELECT_EVENT':
- return action.eventInstanceId;
- case 'UNSELECT_EVENT':
- return '';
- default:
- return currentInstanceId;
- }
-}
-function reduceEventDrag(currentDrag, action, sources, calendar) {
- switch (action.type) {
- case 'SET_EVENT_DRAG':
- var newDrag = action.state;
- return {
- affectedEvents: newDrag.affectedEvents,
- mutatedEvents: newDrag.mutatedEvents,
- isEvent: newDrag.isEvent,
- origSeg: newDrag.origSeg
- };
- case 'UNSET_EVENT_DRAG':
- return null;
- default:
- return currentDrag;
- }
-}
-function reduceEventResize(currentResize, action, sources, calendar) {
- switch (action.type) {
- case 'SET_EVENT_RESIZE':
- var newResize = action.state;
- return {
- affectedEvents: newResize.affectedEvents,
- mutatedEvents: newResize.mutatedEvents,
- isEvent: newResize.isEvent,
- origSeg: newResize.origSeg
- };
- case 'UNSET_EVENT_RESIZE':
- return null;
- default:
- return currentResize;
- }
-}
-function computeLoadingLevel(eventSources) {
- var cnt = 0;
- for (var sourceId in eventSources) {
- if (eventSources[sourceId].isFetching) {
- cnt++;
- }
- }
- return cnt;
-}
-
-var STANDARD_PROPS = {
- start: null,
- end: null,
- allDay: Boolean
-};
-function parseDateSpan(raw, dateEnv, defaultDuration) {
- var span = parseOpenDateSpan(raw, dateEnv);
- var range = span.range;
- if (!range.start) {
- return null;
- }
- if (!range.end) {
- if (defaultDuration == null) {
- return null;
- }
- else {
- range.end = dateEnv.add(range.start, defaultDuration);
- }
- }
- return span;
-}
-/*
-TODO: somehow combine with parseRange?
-Will return null if the start/end props were present but parsed invalidly.
-*/
-function parseOpenDateSpan(raw, dateEnv) {
- var leftovers = {};
- var standardProps = refineProps(raw, STANDARD_PROPS, {}, leftovers);
- var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null;
- var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null;
- var allDay = standardProps.allDay;
- if (allDay == null) {
- allDay = (startMeta && startMeta.isTimeUnspecified) &&
- (!endMeta || endMeta.isTimeUnspecified);
- }
- // use this leftover object as the selection object
- leftovers.range = {
- start: startMeta ? startMeta.marker : null,
- end: endMeta ? endMeta.marker : null
- };
- leftovers.allDay = allDay;
- return leftovers;
-}
-function isDateSpansEqual(span0, span1) {
- return rangesEqual(span0.range, span1.range) &&
- span0.allDay === span1.allDay &&
- isSpanPropsEqual(span0, span1);
-}
-// the NON-DATE-RELATED props
-function isSpanPropsEqual(span0, span1) {
- for (var propName in span1) {
- if (propName !== 'range' && propName !== 'allDay') {
- if (span0[propName] !== span1[propName]) {
- return false;
- }
- }
- }
- // are there any props that span0 has that span1 DOESN'T have?
- // both have range/allDay, so no need to special-case.
- for (var propName in span0) {
- if (!(propName in span1)) {
- return false;
- }
- }
- return true;
-}
-function buildDateSpanApi(span, dateEnv) {
- return {
- start: dateEnv.toDate(span.range.start),
- end: dateEnv.toDate(span.range.end),
- startStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
- endStr: dateEnv.formatIso(span.range.end, { omitTime: span.allDay }),
- allDay: span.allDay
- };
-}
-function buildDatePointApi(span, dateEnv) {
- return {
- date: dateEnv.toDate(span.range.start),
- dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
- allDay: span.allDay
- };
-}
-function fabricateEventRange(dateSpan, eventUiBases, calendar) {
- var def = parseEventDef({ editable: false }, '', // sourceId
- dateSpan.allDay, true, // hasEnd
- calendar);
- return {
- def: def,
- ui: compileEventUi(def, eventUiBases),
- instance: createEventInstance(def.defId, dateSpan.range),
- range: dateSpan.range,
- isStart: true,
- isEnd: true
- };
-}
-
-function compileViewDefs(defaultConfigs, overrideConfigs) {
- var hash = {};
- var viewType;
- for (viewType in defaultConfigs) {
- ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- }
- for (viewType in overrideConfigs) {
- ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- }
- return hash;
-}
-function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
- if (hash[viewType]) {
- return hash[viewType];
- }
- var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- if (viewDef) {
- hash[viewType] = viewDef;
- }
- return viewDef;
-}
-function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
- var defaultConfig = defaultConfigs[viewType];
- var overrideConfig = overrideConfigs[viewType];
- var queryProp = function (name) {
- return (defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :
- ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null);
- };
- var theClass = queryProp('class');
- var superType = queryProp('superType');
- if (!superType && theClass) {
- superType =
- findViewNameBySubclass(theClass, overrideConfigs) ||
- findViewNameBySubclass(theClass, defaultConfigs);
- }
- var superDef = null;
- if (superType) {
- if (superType === viewType) {
- throw new Error('Can\'t have a custom view type that references itself');
- }
- superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
- }
- if (!theClass && superDef) {
- theClass = superDef.class;
- }
- if (!theClass) {
- return null; // don't throw a warning, might be settings for a single-unit view
- }
- return {
- type: viewType,
- class: theClass,
- defaults: __assign({}, (superDef ? superDef.defaults : {}), (defaultConfig ? defaultConfig.options : {})),
- overrides: __assign({}, (superDef ? superDef.overrides : {}), (overrideConfig ? overrideConfig.options : {}))
- };
-}
-function findViewNameBySubclass(viewSubclass, configs) {
- var superProto = Object.getPrototypeOf(viewSubclass.prototype);
- for (var viewType in configs) {
- var parsed = configs[viewType];
- // need DIRECT subclass, so instanceof won't do it
- if (parsed.class && parsed.class.prototype === superProto) {
- return viewType;
- }
- }
- return '';
-}
-
-function parseViewConfigs(inputs) {
- return mapHash(inputs, parseViewConfig);
-}
-var VIEW_DEF_PROPS = {
- type: String,
- class: null
-};
-function parseViewConfig(input) {
- if (typeof input === 'function') {
- input = { class: input };
- }
- var options = {};
- var props = refineProps(input, VIEW_DEF_PROPS, {}, options);
- return {
- superType: props.type,
- class: props.class,
- options: options
- };
-}
-
-function buildViewSpecs(defaultInputs, optionsManager) {
- var defaultConfigs = parseViewConfigs(defaultInputs);
- var overrideConfigs = parseViewConfigs(optionsManager.overrides.views);
- var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs);
- return mapHash(viewDefs, function (viewDef) {
- return buildViewSpec(viewDef, overrideConfigs, optionsManager);
- });
-}
-function buildViewSpec(viewDef, overrideConfigs, optionsManager) {
- var durationInput = viewDef.overrides.duration ||
- viewDef.defaults.duration ||
- optionsManager.dynamicOverrides.duration ||
- optionsManager.overrides.duration;
- var duration = null;
- var durationUnit = '';
- var singleUnit = '';
- var singleUnitOverrides = {};
- if (durationInput) {
- duration = createDuration(durationInput);
- if (duration) { // valid?
- var denom = greatestDurationDenominator(duration, !getWeeksFromInput(durationInput));
- durationUnit = denom.unit;
- if (denom.value === 1) {
- singleUnit = durationUnit;
- singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].options : {};
- }
- }
- }
- var queryButtonText = function (options) {
- var buttonTextMap = options.buttonText || {};
- var buttonTextKey = viewDef.defaults.buttonTextKey;
- if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) {
- return buttonTextMap[buttonTextKey];
- }
- if (buttonTextMap[viewDef.type] != null) {
- return buttonTextMap[viewDef.type];
- }
- if (buttonTextMap[singleUnit] != null) {
- return buttonTextMap[singleUnit];
- }
- };
- return {
- type: viewDef.type,
- class: viewDef.class,
- duration: duration,
- durationUnit: durationUnit,
- singleUnit: singleUnit,
- options: __assign({}, globalDefaults, viewDef.defaults, optionsManager.dirDefaults, optionsManager.localeDefaults, optionsManager.overrides, singleUnitOverrides, viewDef.overrides, optionsManager.dynamicOverrides),
- buttonTextOverride: queryButtonText(optionsManager.dynamicOverrides) ||
- queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence
- viewDef.overrides.buttonText,
- buttonTextDefault: queryButtonText(optionsManager.localeDefaults) ||
- queryButtonText(optionsManager.dirDefaults) ||
- viewDef.defaults.buttonText ||
- queryButtonText(globalDefaults) ||
- viewDef.type // fall back to given view name
- };
-}
-
-var Toolbar = /** @class */ (function (_super) {
- __extends(Toolbar, _super);
- function Toolbar(extraClassName) {
- var _this = _super.call(this) || this;
- _this._renderLayout = memoizeRendering(_this.renderLayout, _this.unrenderLayout);
- _this._updateTitle = memoizeRendering(_this.updateTitle, null, [_this._renderLayout]);
- _this._updateActiveButton = memoizeRendering(_this.updateActiveButton, null, [_this._renderLayout]);
- _this._updateToday = memoizeRendering(_this.updateToday, null, [_this._renderLayout]);
- _this._updatePrev = memoizeRendering(_this.updatePrev, null, [_this._renderLayout]);
- _this._updateNext = memoizeRendering(_this.updateNext, null, [_this._renderLayout]);
- _this.el = createElement('div', { className: 'fc-toolbar ' + extraClassName });
- return _this;
- }
- Toolbar.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this._renderLayout.unrender(); // should unrender everything else
- removeElement(this.el);
- };
- Toolbar.prototype.render = function (props) {
- this._renderLayout(props.layout);
- this._updateTitle(props.title);
- this._updateActiveButton(props.activeButton);
- this._updateToday(props.isTodayEnabled);
- this._updatePrev(props.isPrevEnabled);
- this._updateNext(props.isNextEnabled);
- };
- Toolbar.prototype.renderLayout = function (layout) {
- var el = this.el;
- this.viewsWithButtons = [];
- appendToElement(el, this.renderSection('left', layout.left));
- appendToElement(el, this.renderSection('center', layout.center));
- appendToElement(el, this.renderSection('right', layout.right));
- };
- Toolbar.prototype.unrenderLayout = function () {
- this.el.innerHTML = '';
- };
- Toolbar.prototype.renderSection = function (position, buttonStr) {
- var _this = this;
- var _a = this.context, theme = _a.theme, calendar = _a.calendar;
- var optionsManager = calendar.optionsManager;
- var viewSpecs = calendar.viewSpecs;
- var sectionEl = createElement('div', { className: 'fc-' + position });
- var calendarCustomButtons = optionsManager.computed.customButtons || {};
- var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {};
- var calendarButtonText = optionsManager.computed.buttonText || {};
- if (buttonStr) {
- buttonStr.split(' ').forEach(function (buttonGroupStr, i) {
- var groupChildren = [];
- var isOnlyButtons = true;
- var groupEl;
- buttonGroupStr.split(',').forEach(function (buttonName, j) {
- var customButtonProps;
- var viewSpec;
- var buttonClick;
- var buttonIcon; // only one of these will be set
- var buttonText; // "
- var buttonInnerHtml;
- var buttonClasses;
- var buttonEl;
- var buttonAriaAttr;
- if (buttonName === 'title') {
- groupChildren.push(htmlToElement('<h2>&nbsp;</h2>')); // we always want it to take up height
- isOnlyButtons = false;
- }
- else {
- if ((customButtonProps = calendarCustomButtons[buttonName])) {
- buttonClick = function (ev) {
- if (customButtonProps.click) {
- customButtonProps.click.call(buttonEl, ev);
- }
- };
- (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||
- (buttonIcon = theme.getIconClass(buttonName)) ||
- (buttonText = customButtonProps.text);
- }
- else if ((viewSpec = viewSpecs[buttonName])) {
- _this.viewsWithButtons.push(buttonName);
- buttonClick = function () {
- calendar.changeView(buttonName);
- };
- (buttonText = viewSpec.buttonTextOverride) ||
- (buttonIcon = theme.getIconClass(buttonName)) ||
- (buttonText = viewSpec.buttonTextDefault);
- }
- else if (calendar[buttonName]) { // a calendar method
- buttonClick = function () {
- calendar[buttonName]();
- };
- (buttonText = calendarButtonTextOverrides[buttonName]) ||
- (buttonIcon = theme.getIconClass(buttonName)) ||
- (buttonText = calendarButtonText[buttonName]);
- // ^ everything else is considered default
- }
- if (buttonClick) {
- buttonClasses = [
- 'fc-' + buttonName + '-button',
- theme.getClass('button')
- ];
- if (buttonText) {
- buttonInnerHtml = htmlEscape(buttonText);
- buttonAriaAttr = '';
- }
- else if (buttonIcon) {
- buttonInnerHtml = "<span class='" + buttonIcon + "'></span>";
- buttonAriaAttr = ' aria-label="' + buttonName + '"';
- }
- buttonEl = htmlToElement(// type="button" so that it doesn't submit a form
- '<button type="button" class="' + buttonClasses.join(' ') + '"' +
- buttonAriaAttr +
- '>' + buttonInnerHtml + '</button>');
- buttonEl.addEventListener('click', buttonClick);
- groupChildren.push(buttonEl);
- }
- }
- });
- if (groupChildren.length > 1) {
- groupEl = document.createElement('div');
- var buttonGroupClassName = theme.getClass('buttonGroup');
- if (isOnlyButtons && buttonGroupClassName) {
- groupEl.classList.add(buttonGroupClassName);
- }
- appendToElement(groupEl, groupChildren);
- sectionEl.appendChild(groupEl);
- }
- else {
- appendToElement(sectionEl, groupChildren); // 1 or 0 children
- }
- });
- }
- return sectionEl;
- };
- Toolbar.prototype.updateToday = function (isTodayEnabled) {
- this.toggleButtonEnabled('today', isTodayEnabled);
- };
- Toolbar.prototype.updatePrev = function (isPrevEnabled) {
- this.toggleButtonEnabled('prev', isPrevEnabled);
- };
- Toolbar.prototype.updateNext = function (isNextEnabled) {
- this.toggleButtonEnabled('next', isNextEnabled);
- };
- Toolbar.prototype.updateTitle = function (text) {
- findElements(this.el, 'h2').forEach(function (titleEl) {
- titleEl.innerText = text;
- });
- };
- Toolbar.prototype.updateActiveButton = function (buttonName) {
- var theme = this.context.theme;
- var className = theme.getClass('buttonActive');
- findElements(this.el, 'button').forEach(function (buttonEl) {
- if (buttonName && buttonEl.classList.contains('fc-' + buttonName + '-button')) {
- buttonEl.classList.add(className);
- }
- else {
- buttonEl.classList.remove(className);
- }
- });
- };
- Toolbar.prototype.toggleButtonEnabled = function (buttonName, bool) {
- findElements(this.el, '.fc-' + buttonName + '-button').forEach(function (buttonEl) {
- buttonEl.disabled = !bool;
- });
- };
- return Toolbar;
-}(Component));
-
-var CalendarComponent = /** @class */ (function (_super) {
- __extends(CalendarComponent, _super);
- function CalendarComponent(el) {
- var _this = _super.call(this) || this;
- _this.elClassNames = [];
- _this.renderSkeleton = memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
- _this.renderToolbars = memoizeRendering(_this._renderToolbars, _this._unrenderToolbars, [_this.renderSkeleton]);
- _this.buildComponentContext = memoize(buildComponentContext);
- _this.buildViewPropTransformers = memoize(buildViewPropTransformers);
- _this.el = el;
- _this.computeTitle = memoize(computeTitle);
- _this.parseBusinessHours = memoize(function (input) {
- return parseBusinessHours(input, _this.context.calendar);
- });
- return _this;
- }
- CalendarComponent.prototype.render = function (props, context) {
- this.freezeHeight();
- var title = this.computeTitle(props.dateProfile, props.viewSpec.options);
- this.renderSkeleton(context);
- this.renderToolbars(props.viewSpec, props.dateProfile, props.currentDate, title);
- this.renderView(props, title);
- this.updateSize();
- this.thawHeight();
- };
- CalendarComponent.prototype.destroy = function () {
- if (this.header) {
- this.header.destroy();
- }
- if (this.footer) {
- this.footer.destroy();
- }
- this.renderSkeleton.unrender(); // will call destroyView
- _super.prototype.destroy.call(this);
- };
- CalendarComponent.prototype._renderSkeleton = function (context) {
- this.updateElClassNames(context);
- prependToElement(this.el, this.contentEl = createElement('div', { className: 'fc-view-container' }));
- var calendar = context.calendar;
- for (var _i = 0, _a = calendar.pluginSystem.hooks.viewContainerModifiers; _i < _a.length; _i++) {
- var modifyViewContainer = _a[_i];
- modifyViewContainer(this.contentEl, calendar);
- }
- };
- CalendarComponent.prototype._unrenderSkeleton = function () {
- // weird to have this here
- if (this.view) {
- this.savedScroll = this.view.queryScroll();
- this.view.destroy();
- this.view = null;
- }
- removeElement(this.contentEl);
- this.removeElClassNames();
- };
- CalendarComponent.prototype.removeElClassNames = function () {
- var classList = this.el.classList;
- for (var _i = 0, _a = this.elClassNames; _i < _a.length; _i++) {
- var className = _a[_i];
- classList.remove(className);
- }
- this.elClassNames = [];
- };
- CalendarComponent.prototype.updateElClassNames = function (context) {
- this.removeElClassNames();
- var theme = context.theme, options = context.options;
- this.elClassNames = [
- 'fc',
- 'fc-' + options.dir,
- theme.getClass('widget')
- ];
- var classList = this.el.classList;
- for (var _i = 0, _a = this.elClassNames; _i < _a.length; _i++) {
- var className = _a[_i];
- classList.add(className);
- }
- };
- CalendarComponent.prototype._renderToolbars = function (viewSpec, dateProfile, currentDate, title) {
- var _a = this, context = _a.context, header = _a.header, footer = _a.footer;
- var options = context.options, calendar = context.calendar;
- var headerLayout = options.header;
- var footerLayout = options.footer;
- var dateProfileGenerator = this.props.dateProfileGenerator;
- var now = calendar.getNow();
- var todayInfo = dateProfileGenerator.build(now);
- var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate);
- var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate);
- var toolbarProps = {
- title: title,
- activeButton: viewSpec.type,
- isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now),
- isPrevEnabled: prevInfo.isValid,
- isNextEnabled: nextInfo.isValid
- };
- if (headerLayout) {
- if (!header) {
- header = this.header = new Toolbar('fc-header-toolbar');
- prependToElement(this.el, header.el);
- }
- header.receiveProps(__assign({ layout: headerLayout }, toolbarProps), context);
- }
- else if (header) {
- header.destroy();
- header = this.header = null;
- }
- if (footerLayout) {
- if (!footer) {
- footer = this.footer = new Toolbar('fc-footer-toolbar');
- appendToElement(this.el, footer.el);
- }
- footer.receiveProps(__assign({ layout: footerLayout }, toolbarProps), context);
- }
- else if (footer) {
- footer.destroy();
- footer = this.footer = null;
- }
- };
- CalendarComponent.prototype._unrenderToolbars = function () {
- if (this.header) {
- this.header.destroy();
- this.header = null;
- }
- if (this.footer) {
- this.footer.destroy();
- this.footer = null;
- }
- };
- CalendarComponent.prototype.renderView = function (props, title) {
- var view = this.view;
- var _a = this.context, calendar = _a.calendar, options = _a.options;
- var viewSpec = props.viewSpec, dateProfileGenerator = props.dateProfileGenerator;
- if (!view || view.viewSpec !== viewSpec) {
- if (view) {
- view.destroy();
- }
- view = this.view = new viewSpec['class'](viewSpec, this.contentEl);
- if (this.savedScroll) {
- view.addScroll(this.savedScroll, true);
- this.savedScroll = null;
- }
- }
- view.title = title; // for the API
- var viewProps = {
- dateProfileGenerator: dateProfileGenerator,
- dateProfile: props.dateProfile,
- businessHours: this.parseBusinessHours(viewSpec.options.businessHours),
- eventStore: props.eventStore,
- eventUiBases: props.eventUiBases,
- dateSelection: props.dateSelection,
- eventSelection: props.eventSelection,
- eventDrag: props.eventDrag,
- eventResize: props.eventResize
- };
- var transformers = this.buildViewPropTransformers(calendar.pluginSystem.hooks.viewPropsTransformers);
- for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
- var transformer = transformers_1[_i];
- __assign(viewProps, transformer.transform(viewProps, viewSpec, props, options));
- }
- view.receiveProps(viewProps, this.buildComponentContext(this.context, viewSpec, view));
- };
- // Sizing
- // -----------------------------------------------------------------------------------------------------------------
- CalendarComponent.prototype.updateSize = function (isResize) {
- if (isResize === void 0) { isResize = false; }
- var view = this.view;
- if (!view) {
- return; // why?
- }
- if (isResize || this.isHeightAuto == null) {
- this.computeHeightVars();
- }
- view.updateSize(isResize, this.viewHeight, this.isHeightAuto);
- view.updateNowIndicator(); // we need to guarantee this will run after updateSize
- view.popScroll(isResize);
- };
- CalendarComponent.prototype.computeHeightVars = function () {
- var calendar = this.context.calendar; // yuck. need to handle dynamic options
- var heightInput = calendar.opt('height');
- var contentHeightInput = calendar.opt('contentHeight');
- this.isHeightAuto = heightInput === 'auto' || contentHeightInput === 'auto';
- if (typeof contentHeightInput === 'number') { // exists and not 'auto'
- this.viewHeight = contentHeightInput;
- }
- else if (typeof contentHeightInput === 'function') { // exists and is a function
- this.viewHeight = contentHeightInput();
- }
- else if (typeof heightInput === 'number') { // exists and not 'auto'
- this.viewHeight = heightInput - this.queryToolbarsHeight();
- }
- else if (typeof heightInput === 'function') { // exists and is a function
- this.viewHeight = heightInput() - this.queryToolbarsHeight();
- }
- else if (heightInput === 'parent') { // set to height of parent element
- var parentEl = this.el.parentNode;
- this.viewHeight = parentEl.getBoundingClientRect().height - this.queryToolbarsHeight();
- }
- else {
- this.viewHeight = Math.round(this.contentEl.getBoundingClientRect().width /
- Math.max(calendar.opt('aspectRatio'), .5));
- }
- };
- CalendarComponent.prototype.queryToolbarsHeight = function () {
- var height = 0;
- if (this.header) {
- height += computeHeightAndMargins(this.header.el);
- }
- if (this.footer) {
- height += computeHeightAndMargins(this.footer.el);
- }
- return height;
- };
- // Height "Freezing"
- // -----------------------------------------------------------------------------------------------------------------
- CalendarComponent.prototype.freezeHeight = function () {
- applyStyle(this.el, {
- height: this.el.getBoundingClientRect().height,
- overflow: 'hidden'
- });
- };
- CalendarComponent.prototype.thawHeight = function () {
- applyStyle(this.el, {
- height: '',
- overflow: ''
- });
- };
- return CalendarComponent;
-}(Component));
-// Title and Date Formatting
-// -----------------------------------------------------------------------------------------------------------------
-// Computes what the title at the top of the calendar should be for this view
-function computeTitle(dateProfile, viewOptions) {
- var range;
- // for views that span a large unit of time, show the proper interval, ignoring stray days before and after
- if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {
- range = dateProfile.currentRange;
- }
- else { // for day units or smaller, use the actual day range
- range = dateProfile.activeRange;
- }
- return this.context.dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || computeTitleFormat(dateProfile), viewOptions.titleRangeSeparator), { isEndExclusive: dateProfile.isRangeAllDay });
-}
-// Generates the format string that should be used to generate the title for the current date range.
-// Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.
-function computeTitleFormat(dateProfile) {
- var currentRangeUnit = dateProfile.currentRangeUnit;
- if (currentRangeUnit === 'year') {
- return { year: 'numeric' };
- }
- else if (currentRangeUnit === 'month') {
- return { year: 'numeric', month: 'long' }; // like "September 2014"
- }
- else {
- var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end);
- if (days !== null && days > 1) {
- // multi-day range. shorter, like "Sep 9 - 10 2014"
- return { year: 'numeric', month: 'short', day: 'numeric' };
- }
- else {
- // one day. longer, like "September 9 2014"
- return { year: 'numeric', month: 'long', day: 'numeric' };
- }
- }
-}
-// build a context scoped to the view
-function buildComponentContext(context, viewSpec, view) {
- return context.extend(viewSpec.options, view);
-}
-// Plugin
-// -----------------------------------------------------------------------------------------------------------------
-function buildViewPropTransformers(theClasses) {
- return theClasses.map(function (theClass) {
- return new theClass();
- });
-}
-
-var Interaction = /** @class */ (function () {
- function Interaction(settings) {
- this.component = settings.component;
- }
- Interaction.prototype.destroy = function () {
- };
- return Interaction;
-}());
-function parseInteractionSettings(component, input) {
- return {
- component: component,
- el: input.el,
- useEventCenter: input.useEventCenter != null ? input.useEventCenter : true
- };
-}
-function interactionSettingsToStore(settings) {
- var _a;
- return _a = {},
- _a[settings.component.uid] = settings,
- _a;
-}
-// global state
-var interactionSettingsStore = {};
-
-/*
-Detects when the user clicks on an event within a DateComponent
-*/
-var EventClicking = /** @class */ (function (_super) {
- __extends(EventClicking, _super);
- function EventClicking(settings) {
- var _this = _super.call(this, settings) || this;
- _this.handleSegClick = function (ev, segEl) {
- var component = _this.component;
- var _a = component.context, calendar = _a.calendar, view = _a.view;
- var seg = getElSeg(segEl);
- if (seg && // might be the <div> surrounding the more link
- component.isValidSegDownEl(ev.target)) {
- // our way to simulate a link click for elements that can't be <a> tags
- // grab before trigger fired in case trigger trashes DOM thru rerendering
- var hasUrlContainer = elementClosest(ev.target, '.fc-has-url');
- var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : '';
- calendar.publiclyTrigger('eventClick', [
- {
- el: segEl,
- event: new EventApi(component.context.calendar, seg.eventRange.def, seg.eventRange.instance),
- jsEvent: ev,
- view: view
- }
- ]);
- if (url && !ev.defaultPrevented) {
- window.location.href = url;
- }
- }
- };
- var component = settings.component;
- _this.destroy = listenBySelector(component.el, 'click', component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegClick);
- return _this;
- }
- return EventClicking;
-}(Interaction));
-
-/*
-Triggers events and adds/removes core classNames when the user's pointer
-enters/leaves event-elements of a component.
-*/
-var EventHovering = /** @class */ (function (_super) {
- __extends(EventHovering, _super);
- function EventHovering(settings) {
- var _this = _super.call(this, settings) || this;
- // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it
- _this.handleEventElRemove = function (el) {
- if (el === _this.currentSegEl) {
- _this.handleSegLeave(null, _this.currentSegEl);
- }
- };
- _this.handleSegEnter = function (ev, segEl) {
- if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper
- segEl.classList.add('fc-allow-mouse-resize');
- _this.currentSegEl = segEl;
- _this.triggerEvent('eventMouseEnter', ev, segEl);
- }
- };
- _this.handleSegLeave = function (ev, segEl) {
- if (_this.currentSegEl) {
- segEl.classList.remove('fc-allow-mouse-resize');
- _this.currentSegEl = null;
- _this.triggerEvent('eventMouseLeave', ev, segEl);
- }
- };
- var component = settings.component;
- _this.removeHoverListeners = listenToHoverBySelector(component.el, component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegEnter, _this.handleSegLeave);
- // how to make sure component already has context?
- component.context.calendar.on('eventElRemove', _this.handleEventElRemove);
- return _this;
- }
- EventHovering.prototype.destroy = function () {
- this.removeHoverListeners();
- this.component.context.calendar.off('eventElRemove', this.handleEventElRemove);
- };
- EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) {
- var component = this.component;
- var _a = component.context, calendar = _a.calendar, view = _a.view;
- var seg = getElSeg(segEl);
- if (!ev || component.isValidSegDownEl(ev.target)) {
- calendar.publiclyTrigger(publicEvName, [
- {
- el: segEl,
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- jsEvent: ev,
- view: view
- }
- ]);
- }
- };
- return EventHovering;
-}(Interaction));
-
-var StandardTheme = /** @class */ (function (_super) {
- __extends(StandardTheme, _super);
- function StandardTheme() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- return StandardTheme;
-}(Theme));
-StandardTheme.prototype.classes = {
- widget: 'fc-unthemed',
- widgetHeader: 'fc-widget-header',
- widgetContent: 'fc-widget-content',
- buttonGroup: 'fc-button-group',
- button: 'fc-button fc-button-primary',
- buttonActive: 'fc-button-active',
- popoverHeader: 'fc-widget-header',
- popoverContent: 'fc-widget-content',
- // day grid
- headerRow: 'fc-widget-header',
- dayRow: 'fc-widget-content',
- // list view
- listView: 'fc-widget-content'
-};
-StandardTheme.prototype.baseIconClass = 'fc-icon';
-StandardTheme.prototype.iconClasses = {
- close: 'fc-icon-x',
- prev: 'fc-icon-chevron-left',
- next: 'fc-icon-chevron-right',
- prevYear: 'fc-icon-chevrons-left',
- nextYear: 'fc-icon-chevrons-right'
-};
-StandardTheme.prototype.iconOverrideOption = 'buttonIcons';
-StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
-StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
-
-var Calendar = /** @class */ (function () {
- function Calendar(el, overrides) {
- var _this = this;
- this.buildComponentContext = memoize(buildComponentContext$1);
- this.parseRawLocales = memoize(parseRawLocales);
- this.buildLocale = memoize(buildLocale);
- this.buildDateEnv = memoize(buildDateEnv);
- this.buildTheme = memoize(buildTheme);
- this.buildEventUiSingleBase = memoize(this._buildEventUiSingleBase);
- this.buildSelectionConfig = memoize(this._buildSelectionConfig);
- this.buildEventUiBySource = memoizeOutput(buildEventUiBySource, isPropsEqual);
- this.buildEventUiBases = memoize(buildEventUiBases);
- this.interactionsStore = {};
- this.actionQueue = [];
- this.isReducing = false;
- // isDisplaying: boolean = false // installed in DOM? accepting renders?
- this.needsRerender = false; // needs a render?
- this.isRendering = false; // currently in the executeRender function?
- this.renderingPauseDepth = 0;
- this.buildDelayedRerender = memoize(buildDelayedRerender);
- this.afterSizingTriggers = {};
- this.isViewUpdated = false;
- this.isDatesUpdated = false;
- this.isEventsUpdated = false;
- this.el = el;
- this.optionsManager = new OptionsManager(overrides || {});
- this.pluginSystem = new PluginSystem();
- // only do once. don't do in handleOptions. because can't remove plugins
- this.addPluginInputs(this.optionsManager.computed.plugins || []);
- this.handleOptions(this.optionsManager.computed);
- this.publiclyTrigger('_init'); // for tests
- this.hydrate();
- this.calendarInteractions = this.pluginSystem.hooks.calendarInteractions
- .map(function (calendarInteractionClass) {
- return new calendarInteractionClass(_this);
- });
- }
- Calendar.prototype.addPluginInputs = function (pluginInputs) {
- var pluginDefs = refinePluginDefs(pluginInputs);
- for (var _i = 0, pluginDefs_1 = pluginDefs; _i < pluginDefs_1.length; _i++) {
- var pluginDef = pluginDefs_1[_i];
- this.pluginSystem.add(pluginDef);
- }
- };
- Object.defineProperty(Calendar.prototype, "view", {
- // public API
- get: function () {
- return this.component ? this.component.view : null;
- },
- enumerable: true,
- configurable: true
- });
- // Public API for rendering
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.render = function () {
- if (!this.component) {
- this.component = new CalendarComponent(this.el);
- this.renderableEventStore = createEmptyEventStore();
- this.bindHandlers();
- this.executeRender();
- }
- else {
- this.requestRerender();
- }
- };
- Calendar.prototype.destroy = function () {
- if (this.component) {
- this.unbindHandlers();
- this.component.destroy(); // don't null-out. in case API needs access
- this.component = null; // umm ???
- for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) {
- var interaction = _a[_i];
- interaction.destroy();
- }
- this.publiclyTrigger('_destroyed');
- }
- };
- // Handlers
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.bindHandlers = function () {
- var _this = this;
- // event delegation for nav links
- this.removeNavLinkListener = listenBySelector(this.el, 'click', 'a[data-goto]', function (ev, anchorEl) {
- var gotoOptions = anchorEl.getAttribute('data-goto');
- gotoOptions = gotoOptions ? JSON.parse(gotoOptions) : {};
- var dateEnv = _this.dateEnv;
- var dateMarker = dateEnv.createMarker(gotoOptions.date);
- var viewType = gotoOptions.type;
- // property like "navLinkDayClick". might be a string or a function
- var customAction = _this.viewOpt('navLink' + capitaliseFirstLetter(viewType) + 'Click');
- if (typeof customAction === 'function') {
- customAction(dateEnv.toDate(dateMarker), ev);
- }
- else {
- if (typeof customAction === 'string') {
- viewType = customAction;
- }
- _this.zoomTo(dateMarker, viewType);
- }
- });
- if (this.opt('handleWindowResize')) {
- window.addEventListener('resize', this.windowResizeProxy = debounce(// prevents rapid calls
- this.windowResize.bind(this), this.opt('windowResizeDelay')));
- }
- };
- Calendar.prototype.unbindHandlers = function () {
- this.removeNavLinkListener();
- if (this.windowResizeProxy) {
- window.removeEventListener('resize', this.windowResizeProxy);
- this.windowResizeProxy = null;
- }
- };
- // Dispatcher
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.hydrate = function () {
- var _this = this;
- this.state = this.buildInitialState();
- var rawSources = this.opt('eventSources') || [];
- var singleRawSource = this.opt('events');
- var sources = []; // parsed
- if (singleRawSource) {
- rawSources.unshift(singleRawSource);
- }
- for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) {
- var rawSource = rawSources_1[_i];
- var source = parseEventSource(rawSource, this);
- if (source) {
- sources.push(source);
- }
- }
- this.batchRendering(function () {
- _this.dispatch({ type: 'INIT' }); // pass in sources here?
- _this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: sources });
- _this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: _this.opt('defaultView') || _this.pluginSystem.hooks.defaultView
- });
- });
- };
- Calendar.prototype.buildInitialState = function () {
- return {
- viewType: null,
- loadingLevel: 0,
- eventSourceLoadingLevel: 0,
- currentDate: this.getInitialDate(),
- dateProfile: null,
- eventSources: {},
- eventStore: createEmptyEventStore(),
- dateSelection: null,
- eventSelection: '',
- eventDrag: null,
- eventResize: null
- };
- };
- Calendar.prototype.dispatch = function (action) {
- this.actionQueue.push(action);
- if (!this.isReducing) {
- this.isReducing = true;
- var oldState = this.state;
- while (this.actionQueue.length) {
- this.state = this.reduce(this.state, this.actionQueue.shift(), this);
- }
- var newState = this.state;
- this.isReducing = false;
- if (!oldState.loadingLevel && newState.loadingLevel) {
- this.publiclyTrigger('loading', [true]);
- }
- else if (oldState.loadingLevel && !newState.loadingLevel) {
- this.publiclyTrigger('loading', [false]);
- }
- var view = this.component && this.component.view;
- if (oldState.eventStore !== newState.eventStore) {
- if (oldState.eventStore) {
- this.isEventsUpdated = true;
- }
- }
- if (oldState.dateProfile !== newState.dateProfile) {
- if (oldState.dateProfile && view) { // why would view be null!?
- this.publiclyTrigger('datesDestroy', [
- {
- view: view,
- el: view.el
- }
- ]);
- }
- this.isDatesUpdated = true;
- }
- if (oldState.viewType !== newState.viewType) {
- if (oldState.viewType && view) { // why would view be null!?
- this.publiclyTrigger('viewSkeletonDestroy', [
- {
- view: view,
- el: view.el
- }
- ]);
- }
- this.isViewUpdated = true;
- }
- this.requestRerender();
- }
- };
- Calendar.prototype.reduce = function (state, action, calendar) {
- return reduce(state, action, calendar);
- };
- // Render Queue
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.requestRerender = function () {
- this.needsRerender = true;
- this.delayedRerender(); // will call a debounced-version of tryRerender
- };
- Calendar.prototype.tryRerender = function () {
- if (this.component && // must be accepting renders
- this.needsRerender && // indicates that a rerender was requested
- !this.renderingPauseDepth && // not paused
- !this.isRendering // not currently in the render loop
- ) {
- this.executeRender();
- }
- };
- Calendar.prototype.batchRendering = function (func) {
- this.renderingPauseDepth++;
- func();
- this.renderingPauseDepth--;
- if (this.needsRerender) {
- this.requestRerender();
- }
- };
- // Rendering
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.executeRender = function () {
- // clear these BEFORE the render so that new values will accumulate during render
- this.needsRerender = false;
- this.isRendering = true;
- this.renderComponent();
- this.isRendering = false;
- // received a rerender request while rendering
- if (this.needsRerender) {
- this.delayedRerender();
- }
- };
- /*
- don't call this directly. use executeRender instead
- */
- Calendar.prototype.renderComponent = function () {
- var _a = this, state = _a.state, component = _a.component;
- var viewType = state.viewType;
- var viewSpec = this.viewSpecs[viewType];
- if (!viewSpec) {
- throw new Error("View type \"" + viewType + "\" is not valid");
- }
- // if event sources are still loading and progressive rendering hasn't been enabled,
- // keep rendering the last fully loaded set of events
- var renderableEventStore = this.renderableEventStore =
- (state.eventSourceLoadingLevel && !this.opt('progressiveEventRendering')) ?
- this.renderableEventStore :
- state.eventStore;
- var eventUiSingleBase = this.buildEventUiSingleBase(viewSpec.options);
- var eventUiBySource = this.buildEventUiBySource(state.eventSources);
- var eventUiBases = this.eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource);
- component.receiveProps(__assign({}, state, { viewSpec: viewSpec, dateProfileGenerator: this.dateProfileGenerators[viewType], dateProfile: state.dateProfile, eventStore: renderableEventStore, eventUiBases: eventUiBases, dateSelection: state.dateSelection, eventSelection: state.eventSelection, eventDrag: state.eventDrag, eventResize: state.eventResize }), this.buildComponentContext(this.theme, this.dateEnv, this.optionsManager.computed));
- if (this.isViewUpdated) {
- this.isViewUpdated = false;
- this.publiclyTrigger('viewSkeletonRender', [
- {
- view: component.view,
- el: component.view.el
- }
- ]);
- }
- if (this.isDatesUpdated) {
- this.isDatesUpdated = false;
- this.publiclyTrigger('datesRender', [
- {
- view: component.view,
- el: component.view.el
- }
- ]);
- }
- if (this.isEventsUpdated) {
- this.isEventsUpdated = false;
- }
- this.releaseAfterSizingTriggers();
- };
- // Options
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.setOption = function (name, val) {
- var _a;
- this.mutateOptions((_a = {}, _a[name] = val, _a), [], true);
- };
- Calendar.prototype.getOption = function (name) {
- return this.optionsManager.computed[name];
- };
- Calendar.prototype.opt = function (name) {
- return this.optionsManager.computed[name];
- };
- Calendar.prototype.viewOpt = function (name) {
- return this.viewOpts()[name];
- };
- Calendar.prototype.viewOpts = function () {
- return this.viewSpecs[this.state.viewType].options;
- };
- /*
- handles option changes (like a diff)
- */
- Calendar.prototype.mutateOptions = function (updates, removals, isDynamic, deepEqual) {
- var _this = this;
- var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers;
- var normalUpdates = {};
- var specialUpdates = {};
- var oldDateEnv = this.dateEnv; // do this before handleOptions
- var isTimeZoneDirty = false;
- var isSizeDirty = false;
- var anyDifficultOptions = Boolean(removals.length);
- for (var name_1 in updates) {
- if (changeHandlers[name_1]) {
- specialUpdates[name_1] = updates[name_1];
- }
- else {
- normalUpdates[name_1] = updates[name_1];
- }
- }
- for (var name_2 in normalUpdates) {
- if (/^(height|contentHeight|aspectRatio)$/.test(name_2)) {
- isSizeDirty = true;
- }
- else if (/^(defaultDate|defaultView)$/.test(name_2)) ;
- else {
- anyDifficultOptions = true;
- if (name_2 === 'timeZone') {
- isTimeZoneDirty = true;
- }
- }
- }
- this.optionsManager.mutate(normalUpdates, removals, isDynamic);
- if (anyDifficultOptions) {
- this.handleOptions(this.optionsManager.computed);
- }
- this.batchRendering(function () {
- if (anyDifficultOptions) {
- if (isTimeZoneDirty) {
- _this.dispatch({
- type: 'CHANGE_TIMEZONE',
- oldDateEnv: oldDateEnv
- });
- }
- /* HACK
- has the same effect as calling this.requestRerender()
- but recomputes the state's dateProfile
- */
- _this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: _this.state.viewType
- });
- }
- else if (isSizeDirty) {
- _this.updateSize();
- }
- // special updates
- if (deepEqual) {
- for (var name_3 in specialUpdates) {
- changeHandlers[name_3](specialUpdates[name_3], _this, deepEqual);
- }
- }
- });
- };
- /*
- rebuilds things based off of a complete set of refined options
- */
- Calendar.prototype.handleOptions = function (options) {
- var _this = this;
- var pluginHooks = this.pluginSystem.hooks;
- this.defaultAllDayEventDuration = createDuration(options.defaultAllDayEventDuration);
- this.defaultTimedEventDuration = createDuration(options.defaultTimedEventDuration);
- this.delayedRerender = this.buildDelayedRerender(options.rerenderDelay);
- this.theme = this.buildTheme(options);
- var available = this.parseRawLocales(options.locales);
- this.availableRawLocales = available.map;
- var locale = this.buildLocale(options.locale || available.defaultCode, available.map);
- this.dateEnv = this.buildDateEnv(locale, options.timeZone, pluginHooks.namedTimeZonedImpl, options.firstDay, options.weekNumberCalculation, options.weekLabel, pluginHooks.cmdFormatter);
- this.selectionConfig = this.buildSelectionConfig(options); // needs dateEnv. do after :(
- // ineffecient to do every time?
- this.viewSpecs = buildViewSpecs(pluginHooks.views, this.optionsManager);
- // ineffecient to do every time?
- this.dateProfileGenerators = mapHash(this.viewSpecs, function (viewSpec) {
- return new viewSpec.class.prototype.dateProfileGeneratorClass(viewSpec, _this);
- });
- };
- Calendar.prototype.getAvailableLocaleCodes = function () {
- return Object.keys(this.availableRawLocales);
- };
- Calendar.prototype._buildSelectionConfig = function (rawOpts) {
- return processScopedUiProps('select', rawOpts, this);
- };
- Calendar.prototype._buildEventUiSingleBase = function (rawOpts) {
- if (rawOpts.editable) { // so 'editable' affected events
- rawOpts = __assign({}, rawOpts, { eventEditable: true });
- }
- return processScopedUiProps('event', rawOpts, this);
- };
- // Trigger
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.hasPublicHandlers = function (name) {
- return this.hasHandlers(name) ||
- this.opt(name); // handler specified in options
- };
- Calendar.prototype.publiclyTrigger = function (name, args) {
- var optHandler = this.opt(name);
- this.triggerWith(name, this, args);
- if (optHandler) {
- return optHandler.apply(this, args);
- }
- };
- Calendar.prototype.publiclyTriggerAfterSizing = function (name, args) {
- var afterSizingTriggers = this.afterSizingTriggers;
- (afterSizingTriggers[name] || (afterSizingTriggers[name] = [])).push(args);
- };
- Calendar.prototype.releaseAfterSizingTriggers = function () {
- var afterSizingTriggers = this.afterSizingTriggers;
- for (var name_4 in afterSizingTriggers) {
- for (var _i = 0, _a = afterSizingTriggers[name_4]; _i < _a.length; _i++) {
- var args = _a[_i];
- this.publiclyTrigger(name_4, args);
- }
- }
- this.afterSizingTriggers = {};
- };
- // View
- // -----------------------------------------------------------------------------------------------------------------
- // Returns a boolean about whether the view is okay to instantiate at some point
- Calendar.prototype.isValidViewType = function (viewType) {
- return Boolean(this.viewSpecs[viewType]);
- };
- Calendar.prototype.changeView = function (viewType, dateOrRange) {
- var dateMarker = null;
- if (dateOrRange) {
- if (dateOrRange.start && dateOrRange.end) { // a range
- this.optionsManager.mutate({ visibleRange: dateOrRange }, []); // will not rerender
- this.handleOptions(this.optionsManager.computed); // ...but yuck
- }
- else { // a date
- dateMarker = this.dateEnv.createMarker(dateOrRange); // just like gotoDate
- }
- }
- this.unselect();
- this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: viewType,
- dateMarker: dateMarker
- });
- };
- // Forces navigation to a view for the given date.
- // `viewType` can be a specific view name or a generic one like "week" or "day".
- // needs to change
- Calendar.prototype.zoomTo = function (dateMarker, viewType) {
- var spec;
- viewType = viewType || 'day'; // day is default zoom
- spec = this.viewSpecs[viewType] ||
- this.getUnitViewSpec(viewType);
- this.unselect();
- if (spec) {
- this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: spec.type,
- dateMarker: dateMarker
- });
- }
- else {
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: dateMarker
- });
- }
- };
- // Given a duration singular unit, like "week" or "day", finds a matching view spec.
- // Preference is given to views that have corresponding buttons.
- Calendar.prototype.getUnitViewSpec = function (unit) {
- var component = this.component;
- var viewTypes = [];
- var i;
- var spec;
- // put views that have buttons first. there will be duplicates, but oh
- if (component.header) {
- viewTypes.push.apply(viewTypes, component.header.viewsWithButtons);
- }
- if (component.footer) {
- viewTypes.push.apply(viewTypes, component.footer.viewsWithButtons);
- }
- for (var viewType in this.viewSpecs) {
- viewTypes.push(viewType);
- }
- for (i = 0; i < viewTypes.length; i++) {
- spec = this.viewSpecs[viewTypes[i]];
- if (spec) {
- if (spec.singleUnit === unit) {
- return spec;
- }
- }
- }
- };
- // Current Date
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.getInitialDate = function () {
- var defaultDateInput = this.opt('defaultDate');
- // compute the initial ambig-timezone date
- if (defaultDateInput != null) {
- return this.dateEnv.createMarker(defaultDateInput);
- }
- else {
- return this.getNow(); // getNow already returns unzoned
- }
- };
- Calendar.prototype.prev = function () {
- this.unselect();
- this.dispatch({ type: 'PREV' });
- };
- Calendar.prototype.next = function () {
- this.unselect();
- this.dispatch({ type: 'NEXT' });
- };
- Calendar.prototype.prevYear = function () {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.addYears(this.state.currentDate, -1)
- });
- };
- Calendar.prototype.nextYear = function () {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.addYears(this.state.currentDate, 1)
- });
- };
- Calendar.prototype.today = function () {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.getNow()
- });
- };
- Calendar.prototype.gotoDate = function (zonedDateInput) {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.createMarker(zonedDateInput)
- });
- };
- Calendar.prototype.incrementDate = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // else, warn about invalid input?
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.add(this.state.currentDate, delta)
- });
- }
- };
- // for external API
- Calendar.prototype.getDate = function () {
- return this.dateEnv.toDate(this.state.currentDate);
- };
- // Date Formatting Utils
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.formatDate = function (d, formatter) {
- var dateEnv = this.dateEnv;
- return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter));
- };
- // `settings` is for formatter AND isEndExclusive
- Calendar.prototype.formatRange = function (d0, d1, settings) {
- var dateEnv = this.dateEnv;
- return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings, this.opt('defaultRangeSeparator')), settings);
- };
- Calendar.prototype.formatIso = function (d, omitTime) {
- var dateEnv = this.dateEnv;
- return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime });
- };
- // Sizing
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.windowResize = function (ev) {
- if (!this.isHandlingWindowResize &&
- this.component && // why?
- ev.target === window // not a jqui resize event
- ) {
- this.isHandlingWindowResize = true;
- this.updateSize();
- this.publiclyTrigger('windowResize', [this.view]);
- this.isHandlingWindowResize = false;
- }
- };
- Calendar.prototype.updateSize = function () {
- if (this.component) { // when?
- this.component.updateSize(true);
- }
- };
- // Component Registration
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.registerInteractiveComponent = function (component, settingsInput) {
- var settings = parseInteractionSettings(component, settingsInput);
- var DEFAULT_INTERACTIONS = [
- EventClicking,
- EventHovering
- ];
- var interactionClasses = DEFAULT_INTERACTIONS.concat(this.pluginSystem.hooks.componentInteractions);
- var interactions = interactionClasses.map(function (interactionClass) {
- return new interactionClass(settings);
- });
- this.interactionsStore[component.uid] = interactions;
- interactionSettingsStore[component.uid] = settings;
- };
- Calendar.prototype.unregisterInteractiveComponent = function (component) {
- for (var _i = 0, _a = this.interactionsStore[component.uid]; _i < _a.length; _i++) {
- var listener = _a[_i];
- listener.destroy();
- }
- delete this.interactionsStore[component.uid];
- delete interactionSettingsStore[component.uid];
- };
- // Date Selection / Event Selection / DayClick
- // -----------------------------------------------------------------------------------------------------------------
- // this public method receives start/end dates in any format, with any timezone
- // NOTE: args were changed from v3
- Calendar.prototype.select = function (dateOrObj, endDate) {
- var selectionInput;
- if (endDate == null) {
- if (dateOrObj.start != null) {
- selectionInput = dateOrObj;
- }
- else {
- selectionInput = {
- start: dateOrObj,
- end: null
- };
- }
- }
- else {
- selectionInput = {
- start: dateOrObj,
- end: endDate
- };
- }
- var selection = parseDateSpan(selectionInput, this.dateEnv, createDuration({ days: 1 }) // TODO: cache this?
- );
- if (selection) { // throw parse error otherwise?
- this.dispatch({ type: 'SELECT_DATES', selection: selection });
- this.triggerDateSelect(selection);
- }
- };
- // public method
- Calendar.prototype.unselect = function (pev) {
- if (this.state.dateSelection) {
- this.dispatch({ type: 'UNSELECT_DATES' });
- this.triggerDateUnselect(pev);
- }
- };
- Calendar.prototype.triggerDateSelect = function (selection, pev) {
- var arg = __assign({}, this.buildDateSpanApi(selection), { jsEvent: pev ? pev.origEvent : null, view: this.view });
- this.publiclyTrigger('select', [arg]);
- };
- Calendar.prototype.triggerDateUnselect = function (pev) {
- this.publiclyTrigger('unselect', [
- {
- jsEvent: pev ? pev.origEvent : null,
- view: this.view
- }
- ]);
- };
- // TODO: receive pev?
- Calendar.prototype.triggerDateClick = function (dateSpan, dayEl, view, ev) {
- var arg = __assign({}, this.buildDatePointApi(dateSpan), { dayEl: dayEl, jsEvent: ev, // Is this always a mouse event? See #4655
- view: view });
- this.publiclyTrigger('dateClick', [arg]);
- };
- Calendar.prototype.buildDatePointApi = function (dateSpan) {
- var props = {};
- for (var _i = 0, _a = this.pluginSystem.hooks.datePointTransforms; _i < _a.length; _i++) {
- var transform = _a[_i];
- __assign(props, transform(dateSpan, this));
- }
- __assign(props, buildDatePointApi(dateSpan, this.dateEnv));
- return props;
- };
- Calendar.prototype.buildDateSpanApi = function (dateSpan) {
- var props = {};
- for (var _i = 0, _a = this.pluginSystem.hooks.dateSpanTransforms; _i < _a.length; _i++) {
- var transform = _a[_i];
- __assign(props, transform(dateSpan, this));
- }
- __assign(props, buildDateSpanApi(dateSpan, this.dateEnv));
- return props;
- };
- // Date Utils
- // -----------------------------------------------------------------------------------------------------------------
- // Returns a DateMarker for the current date, as defined by the client's computer or from the `now` option
- Calendar.prototype.getNow = function () {
- var now = this.opt('now');
- if (typeof now === 'function') {
- now = now();
- }
- if (now == null) {
- return this.dateEnv.createNowMarker();
- }
- return this.dateEnv.createMarker(now);
- };
- // Event-Date Utilities
- // -----------------------------------------------------------------------------------------------------------------
- // Given an event's allDay status and start date, return what its fallback end date should be.
- // TODO: rename to computeDefaultEventEnd
- Calendar.prototype.getDefaultEventEnd = function (allDay, marker) {
- var end = marker;
- if (allDay) {
- end = startOfDay(end);
- end = this.dateEnv.add(end, this.defaultAllDayEventDuration);
- }
- else {
- end = this.dateEnv.add(end, this.defaultTimedEventDuration);
- }
- return end;
- };
- // Public Events API
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.addEvent = function (eventInput, sourceInput) {
- if (eventInput instanceof EventApi) {
- var def = eventInput._def;
- var instance = eventInput._instance;
- // not already present? don't want to add an old snapshot
- if (!this.state.eventStore.defs[def.defId]) {
- this.dispatch({
- type: 'ADD_EVENTS',
- eventStore: eventTupleToStore({ def: def, instance: instance }) // TODO: better util for two args?
- });
- }
- return eventInput;
- }
- var sourceId;
- if (sourceInput instanceof EventSourceApi) {
- sourceId = sourceInput.internalEventSource.sourceId;
- }
- else if (sourceInput != null) {
- var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function
- if (!sourceApi) {
- console.warn('Could not find an event source with ID "' + sourceInput + '"'); // TODO: test
- return null;
- }
- else {
- sourceId = sourceApi.internalEventSource.sourceId;
- }
- }
- var tuple = parseEvent(eventInput, sourceId, this);
- if (tuple) {
- this.dispatch({
- type: 'ADD_EVENTS',
- eventStore: eventTupleToStore(tuple)
- });
- return new EventApi(this, tuple.def, tuple.def.recurringDef ? null : tuple.instance);
- }
- return null;
- };
- // TODO: optimize
- Calendar.prototype.getEventById = function (id) {
- var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
- id = String(id);
- for (var defId in defs) {
- var def = defs[defId];
- if (def.publicId === id) {
- if (def.recurringDef) {
- return new EventApi(this, def, null);
- }
- else {
- for (var instanceId in instances) {
- var instance = instances[instanceId];
- if (instance.defId === def.defId) {
- return new EventApi(this, def, instance);
- }
- }
- }
- }
- }
- return null;
- };
- Calendar.prototype.getEvents = function () {
- var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
- var eventApis = [];
- for (var id in instances) {
- var instance = instances[id];
- var def = defs[instance.defId];
- eventApis.push(new EventApi(this, def, instance));
- }
- return eventApis;
- };
- Calendar.prototype.removeAllEvents = function () {
- this.dispatch({ type: 'REMOVE_ALL_EVENTS' });
- };
- Calendar.prototype.rerenderEvents = function () {
- this.dispatch({ type: 'RESET_EVENTS' });
- };
- // Public Event Sources API
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.getEventSources = function () {
- var sourceHash = this.state.eventSources;
- var sourceApis = [];
- for (var internalId in sourceHash) {
- sourceApis.push(new EventSourceApi(this, sourceHash[internalId]));
- }
- return sourceApis;
- };
- Calendar.prototype.getEventSourceById = function (id) {
- var sourceHash = this.state.eventSources;
- id = String(id);
- for (var sourceId in sourceHash) {
- if (sourceHash[sourceId].publicId === id) {
- return new EventSourceApi(this, sourceHash[sourceId]);
- }
- }
- return null;
- };
- Calendar.prototype.addEventSource = function (sourceInput) {
- if (sourceInput instanceof EventSourceApi) {
- // not already present? don't want to add an old snapshot
- if (!this.state.eventSources[sourceInput.internalEventSource.sourceId]) {
- this.dispatch({
- type: 'ADD_EVENT_SOURCES',
- sources: [sourceInput.internalEventSource]
- });
- }
- return sourceInput;
- }
- var eventSource = parseEventSource(sourceInput, this);
- if (eventSource) { // TODO: error otherwise?
- this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] });
- return new EventSourceApi(this, eventSource);
- }
- return null;
- };
- Calendar.prototype.removeAllEventSources = function () {
- this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' });
- };
- Calendar.prototype.refetchEvents = function () {
- this.dispatch({ type: 'FETCH_EVENT_SOURCES' });
- };
- // Scroll
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.scrollToTime = function (timeInput) {
- var duration = createDuration(timeInput);
- if (duration) {
- this.component.view.scrollToDuration(duration);
- }
- };
- return Calendar;
-}());
-EmitterMixin.mixInto(Calendar);
-// for memoizers
-// -----------------------------------------------------------------------------------------------------------------
-function buildComponentContext$1(theme, dateEnv, options) {
- return new ComponentContext(this, theme, dateEnv, options, null);
-}
-function buildDateEnv(locale, timeZone, namedTimeZoneImpl, firstDay, weekNumberCalculation, weekLabel, cmdFormatter) {
- return new DateEnv({
- calendarSystem: 'gregory',
- timeZone: timeZone,
- namedTimeZoneImpl: namedTimeZoneImpl,
- locale: locale,
- weekNumberCalculation: weekNumberCalculation,
- firstDay: firstDay,
- weekLabel: weekLabel,
- cmdFormatter: cmdFormatter
- });
-}
-function buildTheme(calendarOptions) {
- var themeClass = this.pluginSystem.hooks.themeClasses[calendarOptions.themeSystem] || StandardTheme;
- return new themeClass(calendarOptions);
-}
-function buildDelayedRerender(wait) {
- var func = this.tryRerender.bind(this);
- if (wait != null) {
- func = debounce(func, wait);
- }
- return func;
-}
-function buildEventUiBySource(eventSources) {
- return mapHash(eventSources, function (eventSource) {
- return eventSource.ui;
- });
-}
-function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) {
- var eventUiBases = { '': eventUiSingleBase };
- for (var defId in eventDefs) {
- var def = eventDefs[defId];
- if (def.sourceId && eventUiBySource[def.sourceId]) {
- eventUiBases[defId] = eventUiBySource[def.sourceId];
- }
- }
- return eventUiBases;
-}
-
-var View = /** @class */ (function (_super) {
- __extends(View, _super);
- function View(viewSpec, parentEl) {
- var _this = _super.call(this, createElement('div', { className: 'fc-view fc-' + viewSpec.type + '-view' })) || this;
- _this.renderDatesMem = memoizeRendering(_this.renderDatesWrap, _this.unrenderDatesWrap);
- _this.renderBusinessHoursMem = memoizeRendering(_this.renderBusinessHours, _this.unrenderBusinessHours, [_this.renderDatesMem]);
- _this.renderDateSelectionMem = memoizeRendering(_this.renderDateSelectionWrap, _this.unrenderDateSelectionWrap, [_this.renderDatesMem]);
- _this.renderEventsMem = memoizeRendering(_this.renderEvents, _this.unrenderEvents, [_this.renderDatesMem]);
- _this.renderEventSelectionMem = memoizeRendering(_this.renderEventSelectionWrap, _this.unrenderEventSelectionWrap, [_this.renderEventsMem]);
- _this.renderEventDragMem = memoizeRendering(_this.renderEventDragWrap, _this.unrenderEventDragWrap, [_this.renderDatesMem]);
- _this.renderEventResizeMem = memoizeRendering(_this.renderEventResizeWrap, _this.unrenderEventResizeWrap, [_this.renderDatesMem]);
- _this.viewSpec = viewSpec;
- _this.type = viewSpec.type;
- parentEl.appendChild(_this.el);
- _this.initialize();
- return _this;
- }
- View.prototype.initialize = function () {
- };
- Object.defineProperty(View.prototype, "activeStart", {
- // Date Setting/Unsetting
- // -----------------------------------------------------------------------------------------------------------------
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.activeRange.start);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(View.prototype, "activeEnd", {
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.activeRange.end);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(View.prototype, "currentStart", {
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.currentRange.start);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(View.prototype, "currentEnd", {
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.currentRange.end);
- },
- enumerable: true,
- configurable: true
- });
- // General Rendering
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.render = function (props, context) {
- this.renderDatesMem(props.dateProfile);
- this.renderBusinessHoursMem(props.businessHours);
- this.renderDateSelectionMem(props.dateSelection);
- this.renderEventsMem(props.eventStore);
- this.renderEventSelectionMem(props.eventSelection);
- this.renderEventDragMem(props.eventDrag);
- this.renderEventResizeMem(props.eventResize);
- };
- View.prototype.beforeUpdate = function () {
- this.addScroll(this.queryScroll());
- };
- View.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderDatesMem.unrender(); // should unrender everything else
- };
- // Sizing
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.updateSize = function (isResize, viewHeight, isAuto) {
- var calendar = this.context.calendar;
- if (isResize) {
- this.addScroll(this.queryScroll()); // NOTE: same code as in beforeUpdate
- }
- if (isResize || // HACKS...
- calendar.isViewUpdated ||
- calendar.isDatesUpdated ||
- calendar.isEventsUpdated) {
- // sort of the catch-all sizing
- // anything that might cause dimension changes
- this.updateBaseSize(isResize, viewHeight, isAuto);
- }
- // NOTE: popScroll is called by CalendarComponent
- };
- View.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
- };
- // Date Rendering
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderDatesWrap = function (dateProfile) {
- this.renderDates(dateProfile);
- this.addScroll({
- duration: createDuration(this.context.options.scrollTime)
- });
- };
- View.prototype.unrenderDatesWrap = function () {
- this.stopNowIndicator();
- this.unrenderDates();
- };
- View.prototype.renderDates = function (dateProfile) { };
- View.prototype.unrenderDates = function () { };
- // Business Hours
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderBusinessHours = function (businessHours) { };
- View.prototype.unrenderBusinessHours = function () { };
- // Date Selection
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderDateSelectionWrap = function (selection) {
- if (selection) {
- this.renderDateSelection(selection);
- }
- };
- View.prototype.unrenderDateSelectionWrap = function (selection) {
- if (selection) {
- this.unrenderDateSelection(selection);
- }
- };
- View.prototype.renderDateSelection = function (selection) { };
- View.prototype.unrenderDateSelection = function (selection) { };
- // Event Rendering
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEvents = function (eventStore) { };
- View.prototype.unrenderEvents = function () { };
- // util for subclasses
- View.prototype.sliceEvents = function (eventStore, allDay) {
- var props = this.props;
- return sliceEventStore(eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? this.context.nextDayThreshold : null).fg;
- };
- // Event Selection
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEventSelectionWrap = function (instanceId) {
- if (instanceId) {
- this.renderEventSelection(instanceId);
- }
- };
- View.prototype.unrenderEventSelectionWrap = function (instanceId) {
- if (instanceId) {
- this.unrenderEventSelection(instanceId);
- }
- };
- View.prototype.renderEventSelection = function (instanceId) { };
- View.prototype.unrenderEventSelection = function (instanceId) { };
- // Event Drag
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEventDragWrap = function (state) {
- if (state) {
- this.renderEventDrag(state);
- }
- };
- View.prototype.unrenderEventDragWrap = function (state) {
- if (state) {
- this.unrenderEventDrag(state);
- }
- };
- View.prototype.renderEventDrag = function (state) { };
- View.prototype.unrenderEventDrag = function (state) { };
- // Event Resize
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEventResizeWrap = function (state) {
- if (state) {
- this.renderEventResize(state);
- }
- };
- View.prototype.unrenderEventResizeWrap = function (state) {
- if (state) {
- this.unrenderEventResize(state);
- }
- };
- View.prototype.renderEventResize = function (state) { };
- View.prototype.unrenderEventResize = function (state) { };
- /* Now Indicator
- ------------------------------------------------------------------------------------------------------------------*/
- // Immediately render the current time indicator and begins re-rendering it at an interval,
- // which is defined by this.getNowIndicatorUnit().
- // TODO: somehow do this for the current whole day's background too
- // USAGE: must be called manually from subclasses' render methods! don't need to call stopNowIndicator tho
- View.prototype.startNowIndicator = function (dateProfile, dateProfileGenerator) {
- var _this = this;
- var _a = this.context, calendar = _a.calendar, dateEnv = _a.dateEnv, options = _a.options;
- var unit;
- var update;
- var delay; // ms wait value
- if (options.nowIndicator && !this.initialNowDate) {
- unit = this.getNowIndicatorUnit(dateProfile, dateProfileGenerator);
- if (unit) {
- update = this.updateNowIndicator.bind(this);
- this.initialNowDate = calendar.getNow();
- this.initialNowQueriedMs = new Date().valueOf();
- // wait until the beginning of the next interval
- delay = dateEnv.add(dateEnv.startOf(this.initialNowDate, unit), createDuration(1, unit)).valueOf() - this.initialNowDate.valueOf();
- // TODO: maybe always use setTimeout, waiting until start of next unit
- this.nowIndicatorTimeoutID = setTimeout(function () {
- _this.nowIndicatorTimeoutID = null;
- update();
- if (unit === 'second') {
- delay = 1000; // every second
- }
- else {
- delay = 1000 * 60; // otherwise, every minute
- }
- _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval
- }, delay);
- }
- // rendering will be initiated in updateSize
- }
- };
- // rerenders the now indicator, computing the new current time from the amount of time that has passed
- // since the initial getNow call.
- View.prototype.updateNowIndicator = function () {
- if (this.props.dateProfile && // a way to determine if dates were rendered yet
- this.initialNowDate // activated before?
- ) {
- this.unrenderNowIndicator(); // won't unrender if unnecessary
- this.renderNowIndicator(addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs));
- this.isNowIndicatorRendered = true;
- }
- };
- // Immediately unrenders the view's current time indicator and stops any re-rendering timers.
- // Won't cause side effects if indicator isn't rendered.
- View.prototype.stopNowIndicator = function () {
- if (this.nowIndicatorTimeoutID) {
- clearTimeout(this.nowIndicatorTimeoutID);
- this.nowIndicatorTimeoutID = null;
- }
- if (this.nowIndicatorIntervalID) {
- clearInterval(this.nowIndicatorIntervalID);
- this.nowIndicatorIntervalID = null;
- }
- if (this.isNowIndicatorRendered) {
- this.unrenderNowIndicator();
- this.isNowIndicatorRendered = false;
- }
- };
- View.prototype.getNowIndicatorUnit = function (dateProfile, dateProfileGenerator) {
- // subclasses should implement
- };
- // Renders a current time indicator at the given datetime
- View.prototype.renderNowIndicator = function (date) {
- // SUBCLASSES MUST PASS TO CHILDREN!
- };
- // Undoes the rendering actions from renderNowIndicator
- View.prototype.unrenderNowIndicator = function () {
- // SUBCLASSES MUST PASS TO CHILDREN!
- };
- /* Scroller
- ------------------------------------------------------------------------------------------------------------------*/
- View.prototype.addScroll = function (scroll, isForced) {
- if (isForced) {
- scroll.isForced = isForced;
- }
- __assign(this.queuedScroll || (this.queuedScroll = {}), scroll);
- };
- View.prototype.popScroll = function (isResize) {
- this.applyQueuedScroll(isResize);
- this.queuedScroll = null;
- };
- View.prototype.applyQueuedScroll = function (isResize) {
- if (this.queuedScroll) {
- this.applyScroll(this.queuedScroll, isResize);
- }
- };
- View.prototype.queryScroll = function () {
- var scroll = {};
- if (this.props.dateProfile) { // dates rendered yet?
- __assign(scroll, this.queryDateScroll());
- }
- return scroll;
- };
- View.prototype.applyScroll = function (scroll, isResize) {
- var duration = scroll.duration, isForced = scroll.isForced;
- if (duration != null && !isForced) {
- delete scroll.duration;
- if (this.props.dateProfile) { // dates rendered yet?
- __assign(scroll, this.computeDateScroll(duration));
- }
- }
- if (this.props.dateProfile) { // dates rendered yet?
- this.applyDateScroll(scroll);
- }
- };
- View.prototype.computeDateScroll = function (duration) {
- return {}; // subclasses must implement
- };
- View.prototype.queryDateScroll = function () {
- return {}; // subclasses must implement
- };
- View.prototype.applyDateScroll = function (scroll) {
- // subclasses must implement
- };
- // for API
- View.prototype.scrollToDuration = function (duration) {
- this.applyScroll({ duration: duration }, false);
- };
- return View;
-}(DateComponent));
-EmitterMixin.mixInto(View);
-View.prototype.usesMinMaxTime = false;
-View.prototype.dateProfileGeneratorClass = DateProfileGenerator;
-
-var FgEventRenderer = /** @class */ (function () {
- function FgEventRenderer() {
- this.segs = [];
- this.isSizeDirty = false;
- }
- FgEventRenderer.prototype.renderSegs = function (context, segs, mirrorInfo) {
- this.context = context;
- this.rangeUpdated(); // called too frequently :(
- // render an `.el` on each seg
- // returns a subset of the segs. segs that were actually rendered
- segs = this.renderSegEls(segs, mirrorInfo);
- this.segs = segs;
- this.attachSegs(segs, mirrorInfo);
- this.isSizeDirty = true;
- triggerRenderedSegs(this.context, this.segs, Boolean(mirrorInfo));
- };
- FgEventRenderer.prototype.unrender = function (context, _segs, mirrorInfo) {
- triggerWillRemoveSegs(this.context, this.segs, Boolean(mirrorInfo));
- this.detachSegs(this.segs);
- this.segs = [];
- };
- // Updates values that rely on options and also relate to range
- FgEventRenderer.prototype.rangeUpdated = function () {
- var options = this.context.options;
- var displayEventTime;
- var displayEventEnd;
- this.eventTimeFormat = createFormatter(options.eventTimeFormat || this.computeEventTimeFormat(), options.defaultRangeSeparator);
- displayEventTime = options.displayEventTime;
- if (displayEventTime == null) {
- displayEventTime = this.computeDisplayEventTime(); // might be based off of range
- }
- displayEventEnd = options.displayEventEnd;
- if (displayEventEnd == null) {
- displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range
- }
- this.displayEventTime = displayEventTime;
- this.displayEventEnd = displayEventEnd;
- };
- // Renders and assigns an `el` property for each foreground event segment.
- // Only returns segments that successfully rendered.
- FgEventRenderer.prototype.renderSegEls = function (segs, mirrorInfo) {
- var html = '';
- var i;
- if (segs.length) { // don't build an empty html string
- // build a large concatenation of event segment HTML
- for (i = 0; i < segs.length; i++) {
- html += this.renderSegHtml(segs[i], mirrorInfo);
- }
- // Grab individual elements from the combined HTML string. Use each as the default rendering.
- // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.
- htmlToElements(html).forEach(function (el, i) {
- var seg = segs[i];
- if (el) {
- seg.el = el;
- }
- });
- segs = filterSegsViaEls(this.context, segs, Boolean(mirrorInfo));
- }
- return segs;
- };
- // Generic utility for generating the HTML classNames for an event segment's element
- FgEventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable, mirrorInfo) {
- var classes = [
- 'fc-event',
- seg.isStart ? 'fc-start' : 'fc-not-start',
- seg.isEnd ? 'fc-end' : 'fc-not-end'
- ].concat(seg.eventRange.ui.classNames);
- if (isDraggable) {
- classes.push('fc-draggable');
- }
- if (isResizable) {
- classes.push('fc-resizable');
- }
- if (mirrorInfo) {
- classes.push('fc-mirror');
- if (mirrorInfo.isDragging) {
- classes.push('fc-dragging');
- }
- if (mirrorInfo.isResizing) {
- classes.push('fc-resizing');
- }
- }
- return classes;
- };
- // Compute the text that should be displayed on an event's element.
- // `range` can be the Event object itself, or something range-like, with at least a `start`.
- // If event times are disabled, or the event has no time, will return a blank string.
- // If not specified, formatter will default to the eventTimeFormat setting,
- // and displayEnd will default to the displayEventEnd setting.
- FgEventRenderer.prototype.getTimeText = function (eventRange, formatter, displayEnd) {
- var def = eventRange.def, instance = eventRange.instance;
- return this._getTimeText(instance.range.start, def.hasEnd ? instance.range.end : null, def.allDay, formatter, displayEnd, instance.forcedStartTzo, instance.forcedEndTzo);
- };
- FgEventRenderer.prototype._getTimeText = function (start, end, allDay, formatter, displayEnd, forcedStartTzo, forcedEndTzo) {
- var dateEnv = this.context.dateEnv;
- if (formatter == null) {
- formatter = this.eventTimeFormat;
- }
- if (displayEnd == null) {
- displayEnd = this.displayEventEnd;
- }
- if (this.displayEventTime && !allDay) {
- if (displayEnd && end) {
- return dateEnv.formatRange(start, end, formatter, {
- forcedStartTzo: forcedStartTzo,
- forcedEndTzo: forcedEndTzo
- });
- }
- else {
- return dateEnv.format(start, formatter, {
- forcedTzo: forcedStartTzo
- });
- }
- }
- return '';
- };
- FgEventRenderer.prototype.computeEventTimeFormat = function () {
- return {
- hour: 'numeric',
- minute: '2-digit',
- omitZeroMinute: true
- };
- };
- FgEventRenderer.prototype.computeDisplayEventTime = function () {
- return true;
- };
- FgEventRenderer.prototype.computeDisplayEventEnd = function () {
- return true;
- };
- // Utility for generating event skin-related CSS properties
- FgEventRenderer.prototype.getSkinCss = function (ui) {
- return {
- 'background-color': ui.backgroundColor,
- 'border-color': ui.borderColor,
- color: ui.textColor
- };
- };
- FgEventRenderer.prototype.sortEventSegs = function (segs) {
- var specs = this.context.eventOrderSpecs;
- var objs = segs.map(buildSegCompareObj);
- objs.sort(function (obj0, obj1) {
- return compareByFieldSpecs(obj0, obj1, specs);
- });
- return objs.map(function (c) {
- return c._seg;
- });
- };
- FgEventRenderer.prototype.computeSizes = function (force) {
- if (force || this.isSizeDirty) {
- this.computeSegSizes(this.segs);
- }
- };
- FgEventRenderer.prototype.assignSizes = function (force) {
- if (force || this.isSizeDirty) {
- this.assignSegSizes(this.segs);
- this.isSizeDirty = false;
- }
- };
- FgEventRenderer.prototype.computeSegSizes = function (segs) {
- };
- FgEventRenderer.prototype.assignSegSizes = function (segs) {
- };
- // Manipulation on rendered segs
- FgEventRenderer.prototype.hideByHash = function (hash) {
- if (hash) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- if (hash[seg.eventRange.instance.instanceId]) {
- seg.el.style.visibility = 'hidden';
- }
- }
- }
- };
- FgEventRenderer.prototype.showByHash = function (hash) {
- if (hash) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- if (hash[seg.eventRange.instance.instanceId]) {
- seg.el.style.visibility = '';
- }
- }
- }
- };
- FgEventRenderer.prototype.selectByInstanceId = function (instanceId) {
- if (instanceId) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- var eventInstance = seg.eventRange.instance;
- if (eventInstance && eventInstance.instanceId === instanceId &&
- seg.el // necessary?
- ) {
- seg.el.classList.add('fc-selected');
- }
- }
- }
- };
- FgEventRenderer.prototype.unselectByInstanceId = function (instanceId) {
- if (instanceId) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- if (seg.el) { // necessary?
- seg.el.classList.remove('fc-selected');
- }
- }
- }
- };
- return FgEventRenderer;
-}());
-// returns a object with all primitive props that can be compared
-function buildSegCompareObj(seg) {
- var eventDef = seg.eventRange.def;
- var range = seg.eventRange.instance.range;
- var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events
- var end = range.end ? range.end.valueOf() : 0; // "
- return __assign({}, eventDef.extendedProps, eventDef, { id: eventDef.publicId, start: start,
- end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg // for later retrieval
- });
-}
-
-/*
-TODO: when refactoring this class, make a new FillRenderer instance for each `type`
-*/
-var FillRenderer = /** @class */ (function () {
- function FillRenderer() {
- this.fillSegTag = 'div';
- this.dirtySizeFlags = {};
- this.containerElsByType = {};
- this.segsByType = {};
- }
- FillRenderer.prototype.getSegsByType = function (type) {
- return this.segsByType[type] || [];
- };
- FillRenderer.prototype.renderSegs = function (type, context, segs) {
- var _a;
- this.context = context;
- var renderedSegs = this.renderSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs
- var containerEls = this.attachSegs(type, renderedSegs);
- if (containerEls) {
- (_a = (this.containerElsByType[type] || (this.containerElsByType[type] = []))).push.apply(_a, containerEls);
- }
- this.segsByType[type] = renderedSegs;
- if (type === 'bgEvent') {
- triggerRenderedSegs(context, renderedSegs, false); // isMirror=false
- }
- this.dirtySizeFlags[type] = true;
- };
- // Unrenders a specific type of fill that is currently rendered on the grid
- FillRenderer.prototype.unrender = function (type, context) {
- var segs = this.segsByType[type];
- if (segs) {
- if (type === 'bgEvent') {
- triggerWillRemoveSegs(context, segs, false); // isMirror=false
- }
- this.detachSegs(type, segs);
- }
- };
- // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.
- // Only returns segments that successfully rendered.
- FillRenderer.prototype.renderSegEls = function (type, segs) {
- var _this = this;
- var html = '';
- var i;
- if (segs.length) {
- // build a large concatenation of segment HTML
- for (i = 0; i < segs.length; i++) {
- html += this.renderSegHtml(type, segs[i]);
- }
- // Grab individual elements from the combined HTML string. Use each as the default rendering.
- // Then, compute the 'el' for each segment.
- htmlToElements(html).forEach(function (el, i) {
- var seg = segs[i];
- if (el) {
- seg.el = el;
- }
- });
- if (type === 'bgEvent') {
- segs = filterSegsViaEls(this.context, segs, false // isMirror. background events can never be mirror elements
- );
- }
- // correct element type? (would be bad if a non-TD were inserted into a table for example)
- segs = segs.filter(function (seg) {
- return elementMatches(seg.el, _this.fillSegTag);
- });
- }
- return segs;
- };
- // Builds the HTML needed for one fill segment. Generic enough to work with different types.
- FillRenderer.prototype.renderSegHtml = function (type, seg) {
- var css = null;
- var classNames = [];
- if (type !== 'highlight' && type !== 'businessHours') {
- css = {
- 'background-color': seg.eventRange.ui.backgroundColor
- };
- }
- if (type !== 'highlight') {
- classNames = classNames.concat(seg.eventRange.ui.classNames);
- }
- if (type === 'businessHours') {
- classNames.push('fc-bgevent');
- }
- else {
- classNames.push('fc-' + type.toLowerCase());
- }
- return '<' + this.fillSegTag +
- (classNames.length ? ' class="' + classNames.join(' ') + '"' : '') +
- (css ? ' style="' + cssToStr(css) + '"' : '') +
- '></' + this.fillSegTag + '>';
- };
- FillRenderer.prototype.detachSegs = function (type, segs) {
- var containerEls = this.containerElsByType[type];
- if (containerEls) {
- containerEls.forEach(removeElement);
- delete this.containerElsByType[type];
- }
- };
- FillRenderer.prototype.computeSizes = function (force) {
- for (var type in this.segsByType) {
- if (force || this.dirtySizeFlags[type]) {
- this.computeSegSizes(this.segsByType[type]);
- }
- }
- };
- FillRenderer.prototype.assignSizes = function (force) {
- for (var type in this.segsByType) {
- if (force || this.dirtySizeFlags[type]) {
- this.assignSegSizes(this.segsByType[type]);
- }
- }
- this.dirtySizeFlags = {};
- };
- FillRenderer.prototype.computeSegSizes = function (segs) {
- };
- FillRenderer.prototype.assignSegSizes = function (segs) {
- };
- return FillRenderer;
-}());
-
-var NamedTimeZoneImpl = /** @class */ (function () {
- function NamedTimeZoneImpl(timeZoneName) {
- this.timeZoneName = timeZoneName;
- }
- return NamedTimeZoneImpl;
-}());
-
-/*
-An abstraction for a dragging interaction originating on an event.
-Does higher-level things than PointerDragger, such as possibly:
-- a "mirror" that moves with the pointer
-- a minimum number of pixels or other criteria for a true drag to begin
-
-subclasses must emit:
-- pointerdown
-- dragstart
-- dragmove
-- pointerup
-- dragend
-*/
-var ElementDragging = /** @class */ (function () {
- function ElementDragging(el) {
- this.emitter = new EmitterMixin();
- }
- ElementDragging.prototype.destroy = function () {
- };
- ElementDragging.prototype.setMirrorIsVisible = function (bool) {
- // optional if subclass doesn't want to support a mirror
- };
- ElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
- // optional if subclass doesn't want to support a mirror
- };
- ElementDragging.prototype.setAutoScrollEnabled = function (bool) {
- // optional
- };
- return ElementDragging;
-}());
-
-function formatDate(dateInput, settings) {
- if (settings === void 0) { settings = {}; }
- var dateEnv = buildDateEnv$1(settings);
- var formatter = createFormatter(settings);
- var dateMeta = dateEnv.createMarkerMeta(dateInput);
- if (!dateMeta) { // TODO: warning?
- return '';
- }
- return dateEnv.format(dateMeta.marker, formatter, {
- forcedTzo: dateMeta.forcedTzo
- });
-}
-function formatRange(startInput, endInput, settings // mixture of env and formatter settings
-) {
- var dateEnv = buildDateEnv$1(typeof settings === 'object' && settings ? settings : {}); // pass in if non-null object
- var formatter = createFormatter(settings, globalDefaults.defaultRangeSeparator);
- var startMeta = dateEnv.createMarkerMeta(startInput);
- var endMeta = dateEnv.createMarkerMeta(endInput);
- if (!startMeta || !endMeta) { // TODO: warning?
- return '';
- }
- return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, {
- forcedStartTzo: startMeta.forcedTzo,
- forcedEndTzo: endMeta.forcedTzo,
- isEndExclusive: settings.isEndExclusive
- });
-}
-// TODO: more DRY and optimized
-function buildDateEnv$1(settings) {
- var locale = buildLocale(settings.locale || 'en', parseRawLocales([]).map); // TODO: don't hardcode 'en' everywhere
- // ensure required settings
- settings = __assign({ timeZone: globalDefaults.timeZone, calendarSystem: 'gregory' }, settings, { locale: locale });
- return new DateEnv(settings);
-}
-
-var DRAG_META_PROPS = {
- startTime: createDuration,
- duration: createDuration,
- create: Boolean,
- sourceId: String
-};
-var DRAG_META_DEFAULTS = {
- create: true
-};
-function parseDragMeta(raw) {
- var leftoverProps = {};
- var refined = refineProps(raw, DRAG_META_PROPS, DRAG_META_DEFAULTS, leftoverProps);
- refined.leftoverProps = leftoverProps;
- return refined;
-}
-
-// Computes a default column header formatting string if `colFormat` is not explicitly defined
-function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) {
- // if more than one week row, or if there are a lot of columns with not much space,
- // put just the day numbers will be in each cell
- if (!datesRepDistinctDays || dayCnt > 10) {
- return { weekday: 'short' }; // "Sat"
- }
- else if (dayCnt > 1) {
- return { weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }; // "Sat 11/12"
- }
- else {
- return { weekday: 'long' }; // "Saturday"
- }
-}
-function renderDateCell(dateMarker, dateProfile, datesRepDistinctDays, colCnt, colHeadFormat, context, colspan, otherAttrs) {
- var dateEnv = context.dateEnv, theme = context.theme, options = context.options;
- var isDateValid = rangeContainsMarker(dateProfile.activeRange, dateMarker); // TODO: called too frequently. cache somehow.
- var classNames = [
- 'fc-day-header',
- theme.getClass('widgetHeader')
- ];
- var innerHtml;
- if (typeof options.columnHeaderHtml === 'function') {
- innerHtml = options.columnHeaderHtml(dateEnv.toDate(dateMarker));
- }
- else if (typeof options.columnHeaderText === 'function') {
- innerHtml = htmlEscape(options.columnHeaderText(dateEnv.toDate(dateMarker)));
- }
- else {
- innerHtml = htmlEscape(dateEnv.format(dateMarker, colHeadFormat));
- }
- // if only one row of days, the classNames on the header can represent the specific days beneath
- if (datesRepDistinctDays) {
- classNames = classNames.concat(
- // includes the day-of-week class
- // noThemeHighlight=true (don't highlight the header)
- getDayClasses(dateMarker, dateProfile, context, true));
- }
- else {
- classNames.push('fc-' + DAY_IDS[dateMarker.getUTCDay()]); // only add the day-of-week class
- }
- return '' +
- '<th class="' + classNames.join(' ') + '"' +
- ((isDateValid && datesRepDistinctDays) ?
- ' data-date="' + dateEnv.formatIso(dateMarker, { omitTime: true }) + '"' :
- '') +
- (colspan > 1 ?
- ' colspan="' + colspan + '"' :
- '') +
- (otherAttrs ?
- ' ' + otherAttrs :
- '') +
- '>' +
- (isDateValid ?
- // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)
- buildGotoAnchorHtml(options, dateEnv, { date: dateMarker, forceOff: !datesRepDistinctDays || colCnt === 1 }, innerHtml) :
- // if not valid, display text, but no link
- innerHtml) +
- '</th>';
-}
-
-var DayHeader = /** @class */ (function (_super) {
- __extends(DayHeader, _super);
- function DayHeader(parentEl) {
- var _this = _super.call(this) || this;
- _this.renderSkeleton = memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
- _this.parentEl = parentEl;
- return _this;
- }
- DayHeader.prototype.render = function (props, context) {
- var dates = props.dates, datesRepDistinctDays = props.datesRepDistinctDays;
- var parts = [];
- this.renderSkeleton(context);
- if (props.renderIntroHtml) {
- parts.push(props.renderIntroHtml());
- }
- var colHeadFormat = createFormatter(context.options.columnHeaderFormat ||
- computeFallbackHeaderFormat(datesRepDistinctDays, dates.length));
- for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
- var date = dates_1[_i];
- parts.push(renderDateCell(date, props.dateProfile, datesRepDistinctDays, dates.length, colHeadFormat, context));
- }
- if (context.isRtl) {
- parts.reverse();
- }
- this.thead.innerHTML = '<tr>' + parts.join('') + '</tr>';
- };
- DayHeader.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderSkeleton.unrender();
- };
- DayHeader.prototype._renderSkeleton = function (context) {
- var theme = context.theme;
- var parentEl = this.parentEl;
- parentEl.innerHTML = ''; // because might be nbsp
- parentEl.appendChild(this.el = htmlToElement('<div class="fc-row ' + theme.getClass('headerRow') + '">' +
- '<table class="' + theme.getClass('tableGrid') + '">' +
- '<thead></thead>' +
- '</table>' +
- '</div>'));
- this.thead = this.el.querySelector('thead');
- };
- DayHeader.prototype._unrenderSkeleton = function () {
- removeElement(this.el);
- };
- return DayHeader;
-}(Component));
-
-var DaySeries = /** @class */ (function () {
- function DaySeries(range, dateProfileGenerator) {
- var date = range.start;
- var end = range.end;
- var indices = [];
- var dates = [];
- var dayIndex = -1;
- while (date < end) { // loop each day from start to end
- if (dateProfileGenerator.isHiddenDay(date)) {
- indices.push(dayIndex + 0.5); // mark that it's between indices
- }
- else {
- dayIndex++;
- indices.push(dayIndex);
- dates.push(date);
- }
- date = addDays(date, 1);
- }
- this.dates = dates;
- this.indices = indices;
- this.cnt = dates.length;
- }
- DaySeries.prototype.sliceRange = function (range) {
- var firstIndex = this.getDateDayIndex(range.start); // inclusive first index
- var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index
- var clippedFirstIndex = Math.max(0, firstIndex);
- var clippedLastIndex = Math.min(this.cnt - 1, lastIndex);
- // deal with in-between indices
- clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell
- clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell
- if (clippedFirstIndex <= clippedLastIndex) {
- return {
- firstIndex: clippedFirstIndex,
- lastIndex: clippedLastIndex,
- isStart: firstIndex === clippedFirstIndex,
- isEnd: lastIndex === clippedLastIndex
- };
- }
- else {
- return null;
- }
- };
- // Given a date, returns its chronolocial cell-index from the first cell of the grid.
- // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.
- // If before the first offset, returns a negative number.
- // If after the last offset, returns an offset past the last cell offset.
- // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.
- DaySeries.prototype.getDateDayIndex = function (date) {
- var indices = this.indices;
- var dayOffset = Math.floor(diffDays(this.dates[0], date));
- if (dayOffset < 0) {
- return indices[0] - 1;
- }
- else if (dayOffset >= indices.length) {
- return indices[indices.length - 1] + 1;
- }
- else {
- return indices[dayOffset];
- }
- };
- return DaySeries;
-}());
-
-var DayTable = /** @class */ (function () {
- function DayTable(daySeries, breakOnWeeks) {
- var dates = daySeries.dates;
- var daysPerRow;
- var firstDay;
- var rowCnt;
- if (breakOnWeeks) {
- // count columns until the day-of-week repeats
- firstDay = dates[0].getUTCDay();
- for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow++) {
- if (dates[daysPerRow].getUTCDay() === firstDay) {
- break;
- }
- }
- rowCnt = Math.ceil(dates.length / daysPerRow);
- }
- else {
- rowCnt = 1;
- daysPerRow = dates.length;
- }
- this.rowCnt = rowCnt;
- this.colCnt = daysPerRow;
- this.daySeries = daySeries;
- this.cells = this.buildCells();
- this.headerDates = this.buildHeaderDates();
- }
- DayTable.prototype.buildCells = function () {
- var rows = [];
- for (var row = 0; row < this.rowCnt; row++) {
- var cells = [];
- for (var col = 0; col < this.colCnt; col++) {
- cells.push(this.buildCell(row, col));
- }
- rows.push(cells);
- }
- return rows;
- };
- DayTable.prototype.buildCell = function (row, col) {
- return {
- date: this.daySeries.dates[row * this.colCnt + col]
- };
- };
- DayTable.prototype.buildHeaderDates = function () {
- var dates = [];
- for (var col = 0; col < this.colCnt; col++) {
- dates.push(this.cells[0][col].date);
- }
- return dates;
- };
- DayTable.prototype.sliceRange = function (range) {
- var colCnt = this.colCnt;
- var seriesSeg = this.daySeries.sliceRange(range);
- var segs = [];
- if (seriesSeg) {
- var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex;
- var index = firstIndex;
- while (index <= lastIndex) {
- var row = Math.floor(index / colCnt);
- var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1);
- segs.push({
- row: row,
- firstCol: index % colCnt,
- lastCol: (nextIndex - 1) % colCnt,
- isStart: seriesSeg.isStart && index === firstIndex,
- isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex
- });
- index = nextIndex;
- }
- }
- return segs;
- };
- return DayTable;
-}());
-
-var Slicer = /** @class */ (function () {
- function Slicer() {
- this.sliceBusinessHours = memoize(this._sliceBusinessHours);
- this.sliceDateSelection = memoize(this._sliceDateSpan);
- this.sliceEventStore = memoize(this._sliceEventStore);
- this.sliceEventDrag = memoize(this._sliceInteraction);
- this.sliceEventResize = memoize(this._sliceInteraction);
- }
- Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, calendar, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- var eventUiBases = props.eventUiBases;
- var eventSegs = this.sliceEventStore.apply(this, [props.eventStore, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs));
- return {
- dateSelectionSegs: this.sliceDateSelection.apply(this, [props.dateSelection, eventUiBases, component].concat(extraArgs)),
- businessHourSegs: this.sliceBusinessHours.apply(this, [props.businessHours, dateProfile, nextDayThreshold, calendar, component].concat(extraArgs)),
- fgEventSegs: eventSegs.fg,
- bgEventSegs: eventSegs.bg,
- eventDrag: this.sliceEventDrag.apply(this, [props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
- eventResize: this.sliceEventResize.apply(this, [props.eventResize, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
- eventSelection: props.eventSelection
- }; // TODO: give interactionSegs?
- };
- Slicer.prototype.sliceNowDate = function (// does not memoize
- date, component) {
- var extraArgs = [];
- for (var _i = 2; _i < arguments.length; _i++) {
- extraArgs[_i - 2] = arguments[_i];
- }
- return this._sliceDateSpan.apply(this, [{ range: { start: date, end: addMs(date, 1) }, allDay: false },
- {},
- component].concat(extraArgs));
- };
- Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, calendar, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- if (!businessHours) {
- return [];
- }
- return this._sliceEventStore.apply(this, [expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), calendar),
- {},
- dateProfile,
- nextDayThreshold,
- component].concat(extraArgs)).bg;
- };
- Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- if (eventStore) {
- var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
- return {
- bg: this.sliceEventRanges(rangeRes.bg, component, extraArgs),
- fg: this.sliceEventRanges(rangeRes.fg, component, extraArgs)
- };
- }
- else {
- return { bg: [], fg: [] };
- }
- };
- Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- if (!interaction) {
- return null;
- }
- var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
- return {
- segs: this.sliceEventRanges(rangeRes.fg, component, extraArgs),
- affectedInstances: interaction.affectedEvents.instances,
- isEvent: interaction.isEvent,
- sourceSeg: interaction.origSeg
- };
- };
- Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, component) {
- var extraArgs = [];
- for (var _i = 3; _i < arguments.length; _i++) {
- extraArgs[_i - 3] = arguments[_i];
- }
- if (!dateSpan) {
- return [];
- }
- var eventRange = fabricateEventRange(dateSpan, eventUiBases, component.context.calendar);
- var segs = this.sliceRange.apply(this, [dateSpan.range].concat(extraArgs));
- for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) {
- var seg = segs_1[_a];
- seg.component = component;
- seg.eventRange = eventRange;
- }
- return segs;
- };
- /*
- "complete" seg means it has component and eventRange
- */
- Slicer.prototype.sliceEventRanges = function (eventRanges, component, // TODO: kill
- extraArgs) {
- var segs = [];
- for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
- var eventRange = eventRanges_1[_i];
- segs.push.apply(segs, this.sliceEventRange(eventRange, component, extraArgs));
- }
- return segs;
- };
- /*
- "complete" seg means it has component and eventRange
- */
- Slicer.prototype.sliceEventRange = function (eventRange, component, // TODO: kill
- extraArgs) {
- var segs = this.sliceRange.apply(this, [eventRange.range].concat(extraArgs));
- for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
- var seg = segs_2[_i];
- seg.component = component;
- seg.eventRange = eventRange;
- seg.isStart = eventRange.isStart && seg.isStart;
- seg.isEnd = eventRange.isEnd && seg.isEnd;
- }
- return segs;
- };
- return Slicer;
-}());
-/*
-for incorporating minTime/maxTime if appropriate
-TODO: should be part of DateProfile!
-TimelineDateProfile already does this btw
-*/
-function computeActiveRange(dateProfile, isComponentAllDay) {
- var range = dateProfile.activeRange;
- if (isComponentAllDay) {
- return range;
- }
- return {
- start: addMs(range.start, dateProfile.minTime.milliseconds),
- end: addMs(range.end, dateProfile.maxTime.milliseconds - 864e5) // 864e5 = ms in a day
- };
-}
-
-// exports
-// --------------------------------------------------------------------------------------------------
-var version = '4.4.2';
-
-export { Calendar, Component, ComponentContext, DateComponent, DateEnv, DateProfileGenerator, DayHeader, DaySeries, DayTable, ElementDragging, ElementScrollController, EmitterMixin, EventApi, FgEventRenderer, FillRenderer, Interaction, Mixin, NamedTimeZoneImpl, PositionCache, ScrollComponent, ScrollController, Slicer, Splitter, Theme, View, WindowScrollController, addDays, addDurations, addMs, addWeeks, allowContextMenu, allowSelection, appendToElement, applyAll, applyMutationToEventStore, applyStyle, applyStyleProp, asRoughMinutes, asRoughMs, asRoughSeconds, buildGotoAnchorHtml, buildSegCompareObj, capitaliseFirstLetter, combineEventUis, compareByFieldSpec, compareByFieldSpecs, compareNumbers, compensateScroll, computeClippingRect, computeEdges, computeEventDraggable, computeEventEndResizable, computeEventStartResizable, computeFallbackHeaderFormat, computeHeightAndMargins, computeInnerRect, computeRect, computeVisibleDayRange, config, constrainPoint, createDuration, createElement, createEmptyEventStore, createEventInstance, createFormatter, createPlugin, cssToStr, debounce, diffDates, diffDayAndTime, diffDays, diffPoints, diffWeeks, diffWholeDays, diffWholeWeeks, disableCursor, distributeHeight, elementClosest, elementMatches, enableCursor, eventTupleToStore, filterEventStoreDefs, filterHash, findChildren, findElements, flexibleCompare, forceClassName, formatDate, formatIsoTimeString, formatRange, getAllDayHtml, getClippingParents, getDayClasses, getElSeg, getRectCenter, getRelevantEvents, globalDefaults, greatestDurationDenominator, hasBgRendering, htmlEscape, htmlToElement, insertAfterElement, interactionSettingsStore, interactionSettingsToStore, intersectRanges, intersectRects, isArraysEqual, isDateSpansEqual, isInt, isInteractionValid, isMultiDayRange, isPropsEqual, isPropsValid, isSingleDay, isValidDate, listenBySelector, mapHash, matchCellWidths, memoize, memoizeOutput, memoizeRendering, mergeEventStores, multiplyDuration, padStart, parseBusinessHours, parseDragMeta, parseEventDef, parseFieldSpecs, parse as parseMarker, pointInsideRect, prependToElement, preventContextMenu, preventDefault, preventSelection, processScopedUiProps, rangeContainsMarker, rangeContainsRange, rangesEqual, rangesIntersect, refineProps, removeElement, removeExact, renderDateCell, requestJson, sliceEventStore, startOfDay, subtractInnerElHeight, translateRect, uncompensateScroll, undistributeHeight, unpromisify, version, whenTransitionDone, wholeDivideDurations };
diff --git a/library/fullcalendar/packages/core/main.js b/library/fullcalendar/packages/core/main.js
deleted file mode 100644
index 2cb657a60..000000000
--- a/library/fullcalendar/packages/core/main.js
+++ /dev/null
@@ -1,8745 +0,0 @@
-/*!
-FullCalendar Core Package v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
- typeof define === 'function' && define.amd ? define(['exports'], factory) :
- (global = global || self, factory(global.FullCalendar = {}));
-}(this, function (exports) { 'use strict';
-
- // Creating
- // ----------------------------------------------------------------------------------------------------------------
- var elementPropHash = {
- className: true,
- colSpan: true,
- rowSpan: true
- };
- var containerTagHash = {
- '<tr': 'tbody',
- '<td': 'tr'
- };
- function createElement(tagName, attrs, content) {
- var el = document.createElement(tagName);
- if (attrs) {
- for (var attrName in attrs) {
- if (attrName === 'style') {
- applyStyle(el, attrs[attrName]);
- }
- else if (elementPropHash[attrName]) {
- el[attrName] = attrs[attrName];
- }
- else {
- el.setAttribute(attrName, attrs[attrName]);
- }
- }
- }
- if (typeof content === 'string') {
- el.innerHTML = content; // shortcut. no need to process HTML in any way
- }
- else if (content != null) {
- appendToElement(el, content);
- }
- return el;
- }
- function htmlToElement(html) {
- html = html.trim();
- var container = document.createElement(computeContainerTag(html));
- container.innerHTML = html;
- return container.firstChild;
- }
- function htmlToElements(html) {
- return Array.prototype.slice.call(htmlToNodeList(html));
- }
- function htmlToNodeList(html) {
- html = html.trim();
- var container = document.createElement(computeContainerTag(html));
- container.innerHTML = html;
- return container.childNodes;
- }
- // assumes html already trimmed and tag names are lowercase
- function computeContainerTag(html) {
- return containerTagHash[html.substr(0, 3) // faster than using regex
- ] || 'div';
- }
- function appendToElement(el, content) {
- var childNodes = normalizeContent(content);
- for (var i = 0; i < childNodes.length; i++) {
- el.appendChild(childNodes[i]);
- }
- }
- function prependToElement(parent, content) {
- var newEls = normalizeContent(content);
- var afterEl = parent.firstChild || null; // if no firstChild, will append to end, but that's okay, b/c there were no children
- for (var i = 0; i < newEls.length; i++) {
- parent.insertBefore(newEls[i], afterEl);
- }
- }
- function insertAfterElement(refEl, content) {
- var newEls = normalizeContent(content);
- var afterEl = refEl.nextSibling || null;
- for (var i = 0; i < newEls.length; i++) {
- refEl.parentNode.insertBefore(newEls[i], afterEl);
- }
- }
- function normalizeContent(content) {
- var els;
- if (typeof content === 'string') {
- els = htmlToElements(content);
- }
- else if (content instanceof Node) {
- els = [content];
- }
- else { // Node[] or NodeList
- els = Array.prototype.slice.call(content);
- }
- return els;
- }
- function removeElement(el) {
- if (el.parentNode) {
- el.parentNode.removeChild(el);
- }
- }
- // Querying
- // ----------------------------------------------------------------------------------------------------------------
- // from https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
- var matchesMethod = Element.prototype.matches ||
- Element.prototype.matchesSelector ||
- Element.prototype.msMatchesSelector;
- var closestMethod = Element.prototype.closest || function (selector) {
- // polyfill
- var el = this;
- if (!document.documentElement.contains(el)) {
- return null;
- }
- do {
- if (elementMatches(el, selector)) {
- return el;
- }
- el = el.parentElement || el.parentNode;
- } while (el !== null && el.nodeType === 1);
- return null;
- };
- function elementClosest(el, selector) {
- return closestMethod.call(el, selector);
- }
- function elementMatches(el, selector) {
- return matchesMethod.call(el, selector);
- }
- // accepts multiple subject els
- // returns a real array. good for methods like forEach
- function findElements(container, selector) {
- var containers = container instanceof HTMLElement ? [container] : container;
- var allMatches = [];
- for (var i = 0; i < containers.length; i++) {
- var matches = containers[i].querySelectorAll(selector);
- for (var j = 0; j < matches.length; j++) {
- allMatches.push(matches[j]);
- }
- }
- return allMatches;
- }
- // accepts multiple subject els
- // only queries direct child elements
- function findChildren(parent, selector) {
- var parents = parent instanceof HTMLElement ? [parent] : parent;
- var allMatches = [];
- for (var i = 0; i < parents.length; i++) {
- var childNodes = parents[i].children; // only ever elements
- for (var j = 0; j < childNodes.length; j++) {
- var childNode = childNodes[j];
- if (!selector || elementMatches(childNode, selector)) {
- allMatches.push(childNode);
- }
- }
- }
- return allMatches;
- }
- // Attributes
- // ----------------------------------------------------------------------------------------------------------------
- function forceClassName(el, className, bool) {
- if (bool) {
- el.classList.add(className);
- }
- else {
- el.classList.remove(className);
- }
- }
- // Style
- // ----------------------------------------------------------------------------------------------------------------
- var PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i;
- function applyStyle(el, props) {
- for (var propName in props) {
- applyStyleProp(el, propName, props[propName]);
- }
- }
- function applyStyleProp(el, name, val) {
- if (val == null) {
- el.style[name] = '';
- }
- else if (typeof val === 'number' && PIXEL_PROP_RE.test(name)) {
- el.style[name] = val + 'px';
- }
- else {
- el.style[name] = val;
- }
- }
-
- function pointInsideRect(point, rect) {
- return point.left >= rect.left &&
- point.left < rect.right &&
- point.top >= rect.top &&
- point.top < rect.bottom;
- }
- // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false
- function intersectRects(rect1, rect2) {
- var res = {
- left: Math.max(rect1.left, rect2.left),
- right: Math.min(rect1.right, rect2.right),
- top: Math.max(rect1.top, rect2.top),
- bottom: Math.min(rect1.bottom, rect2.bottom)
- };
- if (res.left < res.right && res.top < res.bottom) {
- return res;
- }
- return false;
- }
- function translateRect(rect, deltaX, deltaY) {
- return {
- left: rect.left + deltaX,
- right: rect.right + deltaX,
- top: rect.top + deltaY,
- bottom: rect.bottom + deltaY
- };
- }
- // Returns a new point that will have been moved to reside within the given rectangle
- function constrainPoint(point, rect) {
- return {
- left: Math.min(Math.max(point.left, rect.left), rect.right),
- top: Math.min(Math.max(point.top, rect.top), rect.bottom)
- };
- }
- // Returns a point that is the center of the given rectangle
- function getRectCenter(rect) {
- return {
- left: (rect.left + rect.right) / 2,
- top: (rect.top + rect.bottom) / 2
- };
- }
- // Subtracts point2's coordinates from point1's coordinates, returning a delta
- function diffPoints(point1, point2) {
- return {
- left: point1.left - point2.left,
- top: point1.top - point2.top
- };
- }
-
- // Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side
- var isRtlScrollbarOnLeft = null;
- function getIsRtlScrollbarOnLeft() {
- if (isRtlScrollbarOnLeft === null) {
- isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft();
- }
- return isRtlScrollbarOnLeft;
- }
- function computeIsRtlScrollbarOnLeft() {
- var outerEl = createElement('div', {
- style: {
- position: 'absolute',
- top: -1000,
- left: 0,
- border: 0,
- padding: 0,
- overflow: 'scroll',
- direction: 'rtl'
- }
- }, '<div></div>');
- document.body.appendChild(outerEl);
- var innerEl = outerEl.firstChild;
- var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left;
- removeElement(outerEl);
- return res;
- }
- // The scrollbar width computations in computeEdges are sometimes flawed when it comes to
- // retina displays, rounding, and IE11. Massage them into a usable value.
- function sanitizeScrollbarWidth(width) {
- width = Math.max(0, width); // no negatives
- width = Math.round(width);
- return width;
- }
-
- function computeEdges(el, getPadding) {
- if (getPadding === void 0) { getPadding = false; }
- var computedStyle = window.getComputedStyle(el);
- var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0;
- var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0;
- var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0;
- var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;
- // must use offset(Width|Height) because compatible with client(Width|Height)
- var scrollbarLeftRight = sanitizeScrollbarWidth(el.offsetWidth - el.clientWidth - borderLeft - borderRight);
- var scrollbarBottom = sanitizeScrollbarWidth(el.offsetHeight - el.clientHeight - borderTop - borderBottom);
- var res = {
- borderLeft: borderLeft,
- borderRight: borderRight,
- borderTop: borderTop,
- borderBottom: borderBottom,
- scrollbarBottom: scrollbarBottom,
- scrollbarLeft: 0,
- scrollbarRight: 0
- };
- if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side?
- res.scrollbarLeft = scrollbarLeftRight;
- }
- else {
- res.scrollbarRight = scrollbarLeftRight;
- }
- if (getPadding) {
- res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
- res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
- res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;
- res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0;
- }
- return res;
- }
- function computeInnerRect(el, goWithinPadding) {
- if (goWithinPadding === void 0) { goWithinPadding = false; }
- var outerRect = computeRect(el);
- var edges = computeEdges(el, goWithinPadding);
- var res = {
- left: outerRect.left + edges.borderLeft + edges.scrollbarLeft,
- right: outerRect.right - edges.borderRight - edges.scrollbarRight,
- top: outerRect.top + edges.borderTop,
- bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom
- };
- if (goWithinPadding) {
- res.left += edges.paddingLeft;
- res.right -= edges.paddingRight;
- res.top += edges.paddingTop;
- res.bottom -= edges.paddingBottom;
- }
- return res;
- }
- function computeRect(el) {
- var rect = el.getBoundingClientRect();
- return {
- left: rect.left + window.pageXOffset,
- top: rect.top + window.pageYOffset,
- right: rect.right + window.pageXOffset,
- bottom: rect.bottom + window.pageYOffset
- };
- }
- function computeViewportRect() {
- return {
- left: window.pageXOffset,
- right: window.pageXOffset + document.documentElement.clientWidth,
- top: window.pageYOffset,
- bottom: window.pageYOffset + document.documentElement.clientHeight
- };
- }
- function computeHeightAndMargins(el) {
- return el.getBoundingClientRect().height + computeVMargins(el);
- }
- function computeVMargins(el) {
- var computed = window.getComputedStyle(el);
- return parseInt(computed.marginTop, 10) +
- parseInt(computed.marginBottom, 10);
- }
- // does not return window
- function getClippingParents(el) {
- var parents = [];
- while (el instanceof HTMLElement) { // will stop when gets to document or null
- var computedStyle = window.getComputedStyle(el);
- if (computedStyle.position === 'fixed') {
- break;
- }
- if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) {
- parents.push(el);
- }
- el = el.parentNode;
- }
- return parents;
- }
- function computeClippingRect(el) {
- return getClippingParents(el)
- .map(function (el) {
- return computeInnerRect(el);
- })
- .concat(computeViewportRect())
- .reduce(function (rect0, rect1) {
- return intersectRects(rect0, rect1) || rect1; // should always intersect
- });
- }
-
- // Stops a mouse/touch event from doing it's native browser action
- function preventDefault(ev) {
- ev.preventDefault();
- }
- // Event Delegation
- // ----------------------------------------------------------------------------------------------------------------
- function listenBySelector(container, eventType, selector, handler) {
- function realHandler(ev) {
- var matchedChild = elementClosest(ev.target, selector);
- if (matchedChild) {
- handler.call(matchedChild, ev, matchedChild);
- }
- }
- container.addEventListener(eventType, realHandler);
- return function () {
- container.removeEventListener(eventType, realHandler);
- };
- }
- function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) {
- var currentMatchedChild;
- return listenBySelector(container, 'mouseover', selector, function (ev, matchedChild) {
- if (matchedChild !== currentMatchedChild) {
- currentMatchedChild = matchedChild;
- onMouseEnter(ev, matchedChild);
- var realOnMouseLeave_1 = function (ev) {
- currentMatchedChild = null;
- onMouseLeave(ev, matchedChild);
- matchedChild.removeEventListener('mouseleave', realOnMouseLeave_1);
- };
- // listen to the next mouseleave, and then unattach
- matchedChild.addEventListener('mouseleave', realOnMouseLeave_1);
- }
- });
- }
- // Animation
- // ----------------------------------------------------------------------------------------------------------------
- var transitionEventNames = [
- 'webkitTransitionEnd',
- 'otransitionend',
- 'oTransitionEnd',
- 'msTransitionEnd',
- 'transitionend'
- ];
- // triggered only when the next single subsequent transition finishes
- function whenTransitionDone(el, callback) {
- var realCallback = function (ev) {
- callback(ev);
- transitionEventNames.forEach(function (eventName) {
- el.removeEventListener(eventName, realCallback);
- });
- };
- transitionEventNames.forEach(function (eventName) {
- el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes
- });
- }
-
- var DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
- // Adding
- function addWeeks(m, n) {
- var a = dateToUtcArray(m);
- a[2] += n * 7;
- return arrayToUtcDate(a);
- }
- function addDays(m, n) {
- var a = dateToUtcArray(m);
- a[2] += n;
- return arrayToUtcDate(a);
- }
- function addMs(m, n) {
- var a = dateToUtcArray(m);
- a[6] += n;
- return arrayToUtcDate(a);
- }
- // Diffing (all return floats)
- function diffWeeks(m0, m1) {
- return diffDays(m0, m1) / 7;
- }
- function diffDays(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24);
- }
- function diffHours(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60);
- }
- function diffMinutes(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60);
- }
- function diffSeconds(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / 1000;
- }
- function diffDayAndTime(m0, m1) {
- var m0day = startOfDay(m0);
- var m1day = startOfDay(m1);
- return {
- years: 0,
- months: 0,
- days: Math.round(diffDays(m0day, m1day)),
- milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf())
- };
- }
- // Diffing Whole Units
- function diffWholeWeeks(m0, m1) {
- var d = diffWholeDays(m0, m1);
- if (d !== null && d % 7 === 0) {
- return d / 7;
- }
- return null;
- }
- function diffWholeDays(m0, m1) {
- if (timeAsMs(m0) === timeAsMs(m1)) {
- return Math.round(diffDays(m0, m1));
- }
- return null;
- }
- // Start-Of
- function startOfDay(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate()
- ]);
- }
- function startOfHour(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate(),
- m.getUTCHours()
- ]);
- }
- function startOfMinute(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate(),
- m.getUTCHours(),
- m.getUTCMinutes()
- ]);
- }
- function startOfSecond(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate(),
- m.getUTCHours(),
- m.getUTCMinutes(),
- m.getUTCSeconds()
- ]);
- }
- // Week Computation
- function weekOfYear(marker, dow, doy) {
- var y = marker.getUTCFullYear();
- var w = weekOfGivenYear(marker, y, dow, doy);
- if (w < 1) {
- return weekOfGivenYear(marker, y - 1, dow, doy);
- }
- var nextW = weekOfGivenYear(marker, y + 1, dow, doy);
- if (nextW >= 1) {
- return Math.min(w, nextW);
- }
- return w;
- }
- function weekOfGivenYear(marker, year, dow, doy) {
- var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]);
- var dayStart = startOfDay(marker);
- var days = Math.round(diffDays(firstWeekStart, dayStart));
- return Math.floor(days / 7) + 1; // zero-indexed
- }
- // start-of-first-week - start-of-year
- function firstWeekOffset(year, dow, doy) {
- // first-week day -- which january is always in the first week (4 for iso, 1 for other)
- var fwd = 7 + dow - doy;
- // first-week day local weekday -- which local weekday is fwd
- var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7;
- return -fwdlw + fwd - 1;
- }
- // Array Conversion
- function dateToLocalArray(date) {
- return [
- date.getFullYear(),
- date.getMonth(),
- date.getDate(),
- date.getHours(),
- date.getMinutes(),
- date.getSeconds(),
- date.getMilliseconds()
- ];
- }
- function arrayToLocalDate(a) {
- return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month
- a[3] || 0, a[4] || 0, a[5] || 0);
- }
- function dateToUtcArray(date) {
- return [
- date.getUTCFullYear(),
- date.getUTCMonth(),
- date.getUTCDate(),
- date.getUTCHours(),
- date.getUTCMinutes(),
- date.getUTCSeconds(),
- date.getUTCMilliseconds()
- ];
- }
- function arrayToUtcDate(a) {
- // according to web standards (and Safari), a month index is required.
- // massage if only given a year.
- if (a.length === 1) {
- a = a.concat([0]);
- }
- return new Date(Date.UTC.apply(Date, a));
- }
- // Other Utils
- function isValidDate(m) {
- return !isNaN(m.valueOf());
- }
- function timeAsMs(m) {
- return m.getUTCHours() * 1000 * 60 * 60 +
- m.getUTCMinutes() * 1000 * 60 +
- m.getUTCSeconds() * 1000 +
- m.getUTCMilliseconds();
- }
-
- var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds'];
- var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;
- // Parsing and Creation
- function createDuration(input, unit) {
- var _a;
- if (typeof input === 'string') {
- return parseString(input);
- }
- else if (typeof input === 'object' && input) { // non-null object
- return normalizeObject(input);
- }
- else if (typeof input === 'number') {
- return normalizeObject((_a = {}, _a[unit || 'milliseconds'] = input, _a));
- }
- else {
- return null;
- }
- }
- function parseString(s) {
- var m = PARSE_RE.exec(s);
- if (m) {
- var sign = m[1] ? -1 : 1;
- return {
- years: 0,
- months: 0,
- days: sign * (m[2] ? parseInt(m[2], 10) : 0),
- milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours
- (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes
- (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds
- (m[6] ? parseInt(m[6], 10) : 0) // ms
- )
- };
- }
- return null;
- }
- function normalizeObject(obj) {
- return {
- years: obj.years || obj.year || 0,
- months: obj.months || obj.month || 0,
- days: (obj.days || obj.day || 0) +
- getWeeksFromInput(obj) * 7,
- milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours
- (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes
- (obj.seconds || obj.second || 0) * 1000 + // seconds
- (obj.milliseconds || obj.millisecond || obj.ms || 0) // ms
- };
- }
- function getWeeksFromInput(obj) {
- return obj.weeks || obj.week || 0;
- }
- // Equality
- function durationsEqual(d0, d1) {
- return d0.years === d1.years &&
- d0.months === d1.months &&
- d0.days === d1.days &&
- d0.milliseconds === d1.milliseconds;
- }
- function isSingleDay(dur) {
- return dur.years === 0 && dur.months === 0 && dur.days === 1 && dur.milliseconds === 0;
- }
- // Simple Math
- function addDurations(d0, d1) {
- return {
- years: d0.years + d1.years,
- months: d0.months + d1.months,
- days: d0.days + d1.days,
- milliseconds: d0.milliseconds + d1.milliseconds
- };
- }
- function subtractDurations(d1, d0) {
- return {
- years: d1.years - d0.years,
- months: d1.months - d0.months,
- days: d1.days - d0.days,
- milliseconds: d1.milliseconds - d0.milliseconds
- };
- }
- function multiplyDuration(d, n) {
- return {
- years: d.years * n,
- months: d.months * n,
- days: d.days * n,
- milliseconds: d.milliseconds * n
- };
- }
- // Conversions
- // "Rough" because they are based on average-case Gregorian months/years
- function asRoughYears(dur) {
- return asRoughDays(dur) / 365;
- }
- function asRoughMonths(dur) {
- return asRoughDays(dur) / 30;
- }
- function asRoughDays(dur) {
- return asRoughMs(dur) / 864e5;
- }
- function asRoughMinutes(dur) {
- return asRoughMs(dur) / (1000 * 60);
- }
- function asRoughSeconds(dur) {
- return asRoughMs(dur) / 1000;
- }
- function asRoughMs(dur) {
- return dur.years * (365 * 864e5) +
- dur.months * (30 * 864e5) +
- dur.days * 864e5 +
- dur.milliseconds;
- }
- // Advanced Math
- function wholeDivideDurations(numerator, denominator) {
- var res = null;
- for (var i = 0; i < INTERNAL_UNITS.length; i++) {
- var unit = INTERNAL_UNITS[i];
- if (denominator[unit]) {
- var localRes = numerator[unit] / denominator[unit];
- if (!isInt(localRes) || (res !== null && res !== localRes)) {
- return null;
- }
- res = localRes;
- }
- else if (numerator[unit]) {
- // needs to divide by something but can't!
- return null;
- }
- }
- return res;
- }
- function greatestDurationDenominator(dur, dontReturnWeeks) {
- var ms = dur.milliseconds;
- if (ms) {
- if (ms % 1000 !== 0) {
- return { unit: 'millisecond', value: ms };
- }
- if (ms % (1000 * 60) !== 0) {
- return { unit: 'second', value: ms / 1000 };
- }
- if (ms % (1000 * 60 * 60) !== 0) {
- return { unit: 'minute', value: ms / (1000 * 60) };
- }
- if (ms) {
- return { unit: 'hour', value: ms / (1000 * 60 * 60) };
- }
- }
- if (dur.days) {
- if (!dontReturnWeeks && dur.days % 7 === 0) {
- return { unit: 'week', value: dur.days / 7 };
- }
- return { unit: 'day', value: dur.days };
- }
- if (dur.months) {
- return { unit: 'month', value: dur.months };
- }
- if (dur.years) {
- return { unit: 'year', value: dur.years };
- }
- return { unit: 'millisecond', value: 0 };
- }
-
- /* FullCalendar-specific DOM Utilities
- ----------------------------------------------------------------------------------------------------------------------*/
- // Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left
- // and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.
- function compensateScroll(rowEl, scrollbarWidths) {
- if (scrollbarWidths.left) {
- applyStyle(rowEl, {
- borderLeftWidth: 1,
- marginLeft: scrollbarWidths.left - 1
- });
- }
- if (scrollbarWidths.right) {
- applyStyle(rowEl, {
- borderRightWidth: 1,
- marginRight: scrollbarWidths.right - 1
- });
- }
- }
- // Undoes compensateScroll and restores all borders/margins
- function uncompensateScroll(rowEl) {
- applyStyle(rowEl, {
- marginLeft: '',
- marginRight: '',
- borderLeftWidth: '',
- borderRightWidth: ''
- });
- }
- // Make the mouse cursor express that an event is not allowed in the current area
- function disableCursor() {
- document.body.classList.add('fc-not-allowed');
- }
- // Returns the mouse cursor to its original look
- function enableCursor() {
- document.body.classList.remove('fc-not-allowed');
- }
- // Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.
- // By default, all elements that are shorter than the recommended height are expanded uniformly, not considering
- // any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and
- // reduces the available height.
- function distributeHeight(els, availableHeight, shouldRedistribute) {
- // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,
- // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.
- var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element
- var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*
- var flexEls = []; // elements that are allowed to expand. array of DOM nodes
- var flexOffsets = []; // amount of vertical space it takes up
- var flexHeights = []; // actual css height
- var usedHeight = 0;
- undistributeHeight(els); // give all elements their natural height
- // find elements that are below the recommended height (expandable).
- // important to query for heights in a single first pass (to avoid reflow oscillation).
- els.forEach(function (el, i) {
- var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;
- var naturalHeight = el.getBoundingClientRect().height;
- var naturalOffset = naturalHeight + computeVMargins(el);
- if (naturalOffset < minOffset) {
- flexEls.push(el);
- flexOffsets.push(naturalOffset);
- flexHeights.push(naturalHeight);
- }
- else {
- // this element stretches past recommended height (non-expandable). mark the space as occupied.
- usedHeight += naturalOffset;
- }
- });
- // readjust the recommended height to only consider the height available to non-maxed-out rows.
- if (shouldRedistribute) {
- availableHeight -= usedHeight;
- minOffset1 = Math.floor(availableHeight / flexEls.length);
- minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*
- }
- // assign heights to all expandable elements
- flexEls.forEach(function (el, i) {
- var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;
- var naturalOffset = flexOffsets[i];
- var naturalHeight = flexHeights[i];
- var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding
- if (naturalOffset < minOffset) { // we check this again because redistribution might have changed things
- el.style.height = newHeight + 'px';
- }
- });
- }
- // Undoes distrubuteHeight, restoring all els to their natural height
- function undistributeHeight(els) {
- els.forEach(function (el) {
- el.style.height = '';
- });
- }
- // Given `els`, a set of <td> cells, find the cell with the largest natural width and set the widths of all the
- // cells to be that width.
- // PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline
- function matchCellWidths(els) {
- var maxInnerWidth = 0;
- els.forEach(function (el) {
- var innerEl = el.firstChild; // hopefully an element
- if (innerEl instanceof HTMLElement) {
- var innerWidth_1 = innerEl.getBoundingClientRect().width;
- if (innerWidth_1 > maxInnerWidth) {
- maxInnerWidth = innerWidth_1;
- }
- }
- });
- maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance
- els.forEach(function (el) {
- el.style.width = maxInnerWidth + 'px';
- });
- return maxInnerWidth;
- }
- // Given one element that resides inside another,
- // Subtracts the height of the inner element from the outer element.
- function subtractInnerElHeight(outerEl, innerEl) {
- // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked
- var reflowStyleProps = {
- position: 'relative',
- left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll
- };
- applyStyle(outerEl, reflowStyleProps);
- applyStyle(innerEl, reflowStyleProps);
- var diff = // grab the dimensions
- outerEl.getBoundingClientRect().height -
- innerEl.getBoundingClientRect().height;
- // undo hack
- var resetStyleProps = { position: '', left: '' };
- applyStyle(outerEl, resetStyleProps);
- applyStyle(innerEl, resetStyleProps);
- return diff;
- }
- /* Selection
- ----------------------------------------------------------------------------------------------------------------------*/
- function preventSelection(el) {
- el.classList.add('fc-unselectable');
- el.addEventListener('selectstart', preventDefault);
- }
- function allowSelection(el) {
- el.classList.remove('fc-unselectable');
- el.removeEventListener('selectstart', preventDefault);
- }
- /* Context Menu
- ----------------------------------------------------------------------------------------------------------------------*/
- function preventContextMenu(el) {
- el.addEventListener('contextmenu', preventDefault);
- }
- function allowContextMenu(el) {
- el.removeEventListener('contextmenu', preventDefault);
- }
- /* Object Ordering by Field
- ----------------------------------------------------------------------------------------------------------------------*/
- function parseFieldSpecs(input) {
- var specs = [];
- var tokens = [];
- var i;
- var token;
- if (typeof input === 'string') {
- tokens = input.split(/\s*,\s*/);
- }
- else if (typeof input === 'function') {
- tokens = [input];
- }
- else if (Array.isArray(input)) {
- tokens = input;
- }
- for (i = 0; i < tokens.length; i++) {
- token = tokens[i];
- if (typeof token === 'string') {
- specs.push(token.charAt(0) === '-' ?
- { field: token.substring(1), order: -1 } :
- { field: token, order: 1 });
- }
- else if (typeof token === 'function') {
- specs.push({ func: token });
- }
- }
- return specs;
- }
- function compareByFieldSpecs(obj0, obj1, fieldSpecs) {
- var i;
- var cmp;
- for (i = 0; i < fieldSpecs.length; i++) {
- cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]);
- if (cmp) {
- return cmp;
- }
- }
- return 0;
- }
- function compareByFieldSpec(obj0, obj1, fieldSpec) {
- if (fieldSpec.func) {
- return fieldSpec.func(obj0, obj1);
- }
- return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field])
- * (fieldSpec.order || 1);
- }
- function flexibleCompare(a, b) {
- if (!a && !b) {
- return 0;
- }
- if (b == null) {
- return -1;
- }
- if (a == null) {
- return 1;
- }
- if (typeof a === 'string' || typeof b === 'string') {
- return String(a).localeCompare(String(b));
- }
- return a - b;
- }
- /* String Utilities
- ----------------------------------------------------------------------------------------------------------------------*/
- function capitaliseFirstLetter(str) {
- return str.charAt(0).toUpperCase() + str.slice(1);
- }
- function padStart(val, len) {
- var s = String(val);
- return '000'.substr(0, len - s.length) + s;
- }
- /* Number Utilities
- ----------------------------------------------------------------------------------------------------------------------*/
- function compareNumbers(a, b) {
- return a - b;
- }
- function isInt(n) {
- return n % 1 === 0;
- }
- /* Weird Utilities
- ----------------------------------------------------------------------------------------------------------------------*/
- function applyAll(functions, thisObj, args) {
- if (typeof functions === 'function') { // supplied a single function
- functions = [functions];
- }
- if (functions) {
- var i = void 0;
- var ret = void 0;
- for (i = 0; i < functions.length; i++) {
- ret = functions[i].apply(thisObj, args) || ret;
- }
- return ret;
- }
- }
- function firstDefined() {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- for (var i = 0; i < args.length; i++) {
- if (args[i] !== undefined) {
- return args[i];
- }
- }
- }
- // Returns a function, that, as long as it continues to be invoked, will not
- // be triggered. The function will be called after it stops being called for
- // N milliseconds. If `immediate` is passed, trigger the function on the
- // leading edge, instead of the trailing.
- // https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714
- function debounce(func, wait) {
- var timeout;
- var args;
- var context;
- var timestamp;
- var result;
- var later = function () {
- var last = new Date().valueOf() - timestamp;
- if (last < wait) {
- timeout = setTimeout(later, wait - last);
- }
- else {
- timeout = null;
- result = func.apply(context, args);
- context = args = null;
- }
- };
- return function () {
- context = this;
- args = arguments;
- timestamp = new Date().valueOf();
- if (!timeout) {
- timeout = setTimeout(later, wait);
- }
- return result;
- };
- }
- // Number and Boolean are only types that defaults or not computed for
- // TODO: write more comments
- function refineProps(rawProps, processors, defaults, leftoverProps) {
- if (defaults === void 0) { defaults = {}; }
- var refined = {};
- for (var key in processors) {
- var processor = processors[key];
- if (rawProps[key] !== undefined) {
- // found
- if (processor === Function) {
- refined[key] = typeof rawProps[key] === 'function' ? rawProps[key] : null;
- }
- else if (processor) { // a refining function?
- refined[key] = processor(rawProps[key]);
- }
- else {
- refined[key] = rawProps[key];
- }
- }
- else if (defaults[key] !== undefined) {
- // there's an explicit default
- refined[key] = defaults[key];
- }
- else {
- // must compute a default
- if (processor === String) {
- refined[key] = ''; // empty string is default for String
- }
- else if (!processor || processor === Number || processor === Boolean || processor === Function) {
- refined[key] = null; // assign null for other non-custom processor funcs
- }
- else {
- refined[key] = processor(null); // run the custom processor func
- }
- }
- }
- if (leftoverProps) {
- for (var key in rawProps) {
- if (processors[key] === undefined) {
- leftoverProps[key] = rawProps[key];
- }
- }
- }
- return refined;
- }
- /* Date stuff that doesn't belong in datelib core
- ----------------------------------------------------------------------------------------------------------------------*/
- // given a timed range, computes an all-day range that has the same exact duration,
- // but whose start time is aligned with the start of the day.
- function computeAlignedDayRange(timedRange) {
- var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1;
- var start = startOfDay(timedRange.start);
- var end = addDays(start, dayCnt);
- return { start: start, end: end };
- }
- // given a timed range, computes an all-day range based on how for the end date bleeds into the next day
- // TODO: give nextDayThreshold a default arg
- function computeVisibleDayRange(timedRange, nextDayThreshold) {
- if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); }
- var startDay = null;
- var endDay = null;
- if (timedRange.end) {
- endDay = startOfDay(timedRange.end);
- var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay`
- // If the end time is actually inclusively part of the next day and is equal to or
- // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.
- // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.
- if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) {
- endDay = addDays(endDay, 1);
- }
- }
- if (timedRange.start) {
- startDay = startOfDay(timedRange.start); // the beginning of the day the range starts
- // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.
- if (endDay && endDay <= startDay) {
- endDay = addDays(startDay, 1);
- }
- }
- return { start: startDay, end: endDay };
- }
- // spans from one day into another?
- function isMultiDayRange(range) {
- var visibleRange = computeVisibleDayRange(range);
- return diffDays(visibleRange.start, visibleRange.end) > 1;
- }
- function diffDates(date0, date1, dateEnv, largeUnit) {
- if (largeUnit === 'year') {
- return createDuration(dateEnv.diffWholeYears(date0, date1), 'year');
- }
- else if (largeUnit === 'month') {
- return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month');
- }
- else {
- return diffDayAndTime(date0, date1); // returns a duration
- }
- }
-
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- /* global Reflect, Promise */
-
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
-
- function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
-
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
-
- function parseRecurring(eventInput, allDayDefault, dateEnv, recurringTypes, leftovers) {
- for (var i = 0; i < recurringTypes.length; i++) {
- var localLeftovers = {};
- var parsed = recurringTypes[i].parse(eventInput, localLeftovers, dateEnv);
- if (parsed) {
- var allDay = localLeftovers.allDay;
- delete localLeftovers.allDay; // remove from leftovers
- if (allDay == null) {
- allDay = allDayDefault;
- if (allDay == null) {
- allDay = parsed.allDayGuess;
- if (allDay == null) {
- allDay = false;
- }
- }
- }
- __assign(leftovers, localLeftovers);
- return {
- allDay: allDay,
- duration: parsed.duration,
- typeData: parsed.typeData,
- typeId: i
- };
- }
- }
- return null;
- }
- /*
- Event MUST have a recurringDef
- */
- function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) {
- var typeDef = recurringTypes[eventDef.recurringDef.typeId];
- var markers = typeDef.expand(eventDef.recurringDef.typeData, {
- start: dateEnv.subtract(framingRange.start, duration),
- end: framingRange.end
- }, dateEnv);
- // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to
- if (eventDef.allDay) {
- markers = markers.map(startOfDay);
- }
- return markers;
- }
-
- var hasOwnProperty = Object.prototype.hasOwnProperty;
- // Merges an array of objects into a single object.
- // The second argument allows for an array of property names who's object values will be merged together.
- function mergeProps(propObjs, complexProps) {
- var dest = {};
- var i;
- var name;
- var complexObjs;
- var j;
- var val;
- var props;
- if (complexProps) {
- for (i = 0; i < complexProps.length; i++) {
- name = complexProps[i];
- complexObjs = [];
- // collect the trailing object values, stopping when a non-object is discovered
- for (j = propObjs.length - 1; j >= 0; j--) {
- val = propObjs[j][name];
- if (typeof val === 'object' && val) { // non-null object
- complexObjs.unshift(val);
- }
- else if (val !== undefined) {
- dest[name] = val; // if there were no objects, this value will be used
- break;
- }
- }
- // if the trailing values were objects, use the merged value
- if (complexObjs.length) {
- dest[name] = mergeProps(complexObjs);
- }
- }
- }
- // copy values into the destination, going from last to first
- for (i = propObjs.length - 1; i >= 0; i--) {
- props = propObjs[i];
- for (name in props) {
- if (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign
- dest[name] = props[name];
- }
- }
- }
- return dest;
- }
- function filterHash(hash, func) {
- var filtered = {};
- for (var key in hash) {
- if (func(hash[key], key)) {
- filtered[key] = hash[key];
- }
- }
- return filtered;
- }
- function mapHash(hash, func) {
- var newHash = {};
- for (var key in hash) {
- newHash[key] = func(hash[key], key);
- }
- return newHash;
- }
- function arrayToHash(a) {
- var hash = {};
- for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {
- var item = a_1[_i];
- hash[item] = true;
- }
- return hash;
- }
- function hashValuesToArray(obj) {
- var a = [];
- for (var key in obj) {
- a.push(obj[key]);
- }
- return a;
- }
- function isPropsEqual(obj0, obj1) {
- for (var key in obj0) {
- if (hasOwnProperty.call(obj0, key)) {
- if (!(key in obj1)) {
- return false;
- }
- }
- }
- for (var key in obj1) {
- if (hasOwnProperty.call(obj1, key)) {
- if (obj0[key] !== obj1[key]) {
- return false;
- }
- }
- }
- return true;
- }
-
- function parseEvents(rawEvents, sourceId, calendar, allowOpenRange) {
- var eventStore = createEmptyEventStore();
- for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) {
- var rawEvent = rawEvents_1[_i];
- var tuple = parseEvent(rawEvent, sourceId, calendar, allowOpenRange);
- if (tuple) {
- eventTupleToStore(tuple, eventStore);
- }
- }
- return eventStore;
- }
- function eventTupleToStore(tuple, eventStore) {
- if (eventStore === void 0) { eventStore = createEmptyEventStore(); }
- eventStore.defs[tuple.def.defId] = tuple.def;
- if (tuple.instance) {
- eventStore.instances[tuple.instance.instanceId] = tuple.instance;
- }
- return eventStore;
- }
- function expandRecurring(eventStore, framingRange, calendar) {
- var dateEnv = calendar.dateEnv;
- var defs = eventStore.defs, instances = eventStore.instances;
- // remove existing recurring instances
- instances = filterHash(instances, function (instance) {
- return !defs[instance.defId].recurringDef;
- });
- for (var defId in defs) {
- var def = defs[defId];
- if (def.recurringDef) {
- var duration = def.recurringDef.duration;
- if (!duration) {
- duration = def.allDay ?
- calendar.defaultAllDayEventDuration :
- calendar.defaultTimedEventDuration;
- }
- var starts = expandRecurringRanges(def, duration, framingRange, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes);
- for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) {
- var start = starts_1[_i];
- var instance = createEventInstance(defId, {
- start: start,
- end: dateEnv.add(start, duration)
- });
- instances[instance.instanceId] = instance;
- }
- }
- }
- return { defs: defs, instances: instances };
- }
- // retrieves events that have the same groupId as the instance specified by `instanceId`
- // or they are the same as the instance.
- // why might instanceId not be in the store? an event from another calendar?
- function getRelevantEvents(eventStore, instanceId) {
- var instance = eventStore.instances[instanceId];
- if (instance) {
- var def_1 = eventStore.defs[instance.defId];
- // get events/instances with same group
- var newStore = filterEventStoreDefs(eventStore, function (lookDef) {
- return isEventDefsGrouped(def_1, lookDef);
- });
- // add the original
- // TODO: wish we could use eventTupleToStore or something like it
- newStore.defs[def_1.defId] = def_1;
- newStore.instances[instance.instanceId] = instance;
- return newStore;
- }
- return createEmptyEventStore();
- }
- function isEventDefsGrouped(def0, def1) {
- return Boolean(def0.groupId && def0.groupId === def1.groupId);
- }
- function transformRawEvents(rawEvents, eventSource, calendar) {
- var calEachTransform = calendar.opt('eventDataTransform');
- var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
- if (sourceEachTransform) {
- rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
- }
- if (calEachTransform) {
- rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
- }
- return rawEvents;
- }
- function transformEachRawEvent(rawEvents, func) {
- var refinedEvents;
- if (!func) {
- refinedEvents = rawEvents;
- }
- else {
- refinedEvents = [];
- for (var _i = 0, rawEvents_2 = rawEvents; _i < rawEvents_2.length; _i++) {
- var rawEvent = rawEvents_2[_i];
- var refinedEvent = func(rawEvent);
- if (refinedEvent) {
- refinedEvents.push(refinedEvent);
- }
- else if (refinedEvent == null) {
- refinedEvents.push(rawEvent);
- } // if a different falsy value, do nothing
- }
- }
- return refinedEvents;
- }
- function createEmptyEventStore() {
- return { defs: {}, instances: {} };
- }
- function mergeEventStores(store0, store1) {
- return {
- defs: __assign({}, store0.defs, store1.defs),
- instances: __assign({}, store0.instances, store1.instances)
- };
- }
- function filterEventStoreDefs(eventStore, filterFunc) {
- var defs = filterHash(eventStore.defs, filterFunc);
- var instances = filterHash(eventStore.instances, function (instance) {
- return defs[instance.defId]; // still exists?
- });
- return { defs: defs, instances: instances };
- }
-
- function parseRange(input, dateEnv) {
- var start = null;
- var end = null;
- if (input.start) {
- start = dateEnv.createMarker(input.start);
- }
- if (input.end) {
- end = dateEnv.createMarker(input.end);
- }
- if (!start && !end) {
- return null;
- }
- if (start && end && end < start) {
- return null;
- }
- return { start: start, end: end };
- }
- // SIDE-EFFECT: will mutate ranges.
- // Will return a new array result.
- function invertRanges(ranges, constraintRange) {
- var invertedRanges = [];
- var start = constraintRange.start; // the end of the previous range. the start of the new range
- var i;
- var dateRange;
- // ranges need to be in order. required for our date-walking algorithm
- ranges.sort(compareRanges);
- for (i = 0; i < ranges.length; i++) {
- dateRange = ranges[i];
- // add the span of time before the event (if there is any)
- if (dateRange.start > start) { // compare millisecond time (skip any ambig logic)
- invertedRanges.push({ start: start, end: dateRange.start });
- }
- if (dateRange.end > start) {
- start = dateRange.end;
- }
- }
- // add the span of time after the last event (if there is any)
- if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic)
- invertedRanges.push({ start: start, end: constraintRange.end });
- }
- return invertedRanges;
- }
- function compareRanges(range0, range1) {
- return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first
- }
- function intersectRanges(range0, range1) {
- var start = range0.start;
- var end = range0.end;
- var newRange = null;
- if (range1.start !== null) {
- if (start === null) {
- start = range1.start;
- }
- else {
- start = new Date(Math.max(start.valueOf(), range1.start.valueOf()));
- }
- }
- if (range1.end != null) {
- if (end === null) {
- end = range1.end;
- }
- else {
- end = new Date(Math.min(end.valueOf(), range1.end.valueOf()));
- }
- }
- if (start === null || end === null || start < end) {
- newRange = { start: start, end: end };
- }
- return newRange;
- }
- function rangesEqual(range0, range1) {
- return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) &&
- (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf());
- }
- function rangesIntersect(range0, range1) {
- return (range0.end === null || range1.start === null || range0.end > range1.start) &&
- (range0.start === null || range1.end === null || range0.start < range1.end);
- }
- function rangeContainsRange(outerRange, innerRange) {
- return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) &&
- (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end));
- }
- function rangeContainsMarker(range, date) {
- return (range.start === null || date >= range.start) &&
- (range.end === null || date < range.end);
- }
- // If the given date is not within the given range, move it inside.
- // (If it's past the end, make it one millisecond before the end).
- function constrainMarkerToRange(date, range) {
- if (range.start != null && date < range.start) {
- return range.start;
- }
- if (range.end != null && date >= range.end) {
- return new Date(range.end.valueOf() - 1);
- }
- return date;
- }
-
- function removeExact(array, exactVal) {
- var removeCnt = 0;
- var i = 0;
- while (i < array.length) {
- if (array[i] === exactVal) {
- array.splice(i, 1);
- removeCnt++;
- }
- else {
- i++;
- }
- }
- return removeCnt;
- }
- function isArraysEqual(a0, a1) {
- var len = a0.length;
- var i;
- if (len !== a1.length) { // not array? or not same length?
- return false;
- }
- for (i = 0; i < len; i++) {
- if (a0[i] !== a1[i]) {
- return false;
- }
- }
- return true;
- }
-
- function memoize(workerFunc) {
- var args;
- var res;
- return function () {
- if (!args || !isArraysEqual(args, arguments)) {
- args = arguments;
- res = workerFunc.apply(this, arguments);
- }
- return res;
- };
- }
- /*
- always executes the workerFunc, but if the result is equal to the previous result,
- return the previous result instead.
- */
- function memoizeOutput(workerFunc, equalityFunc) {
- var cachedRes = null;
- return function () {
- var newRes = workerFunc.apply(this, arguments);
- if (cachedRes === null || !(cachedRes === newRes || equalityFunc(cachedRes, newRes))) {
- cachedRes = newRes;
- }
- return cachedRes;
- };
- }
-
- var EXTENDED_SETTINGS_AND_SEVERITIES = {
- week: 3,
- separator: 0,
- omitZeroMinute: 0,
- meridiem: 0,
- omitCommas: 0
- };
- var STANDARD_DATE_PROP_SEVERITIES = {
- timeZoneName: 7,
- era: 6,
- year: 5,
- month: 4,
- day: 2,
- weekday: 2,
- hour: 1,
- minute: 1,
- second: 1
- };
- var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too
- var COMMA_RE = /,/g; // we need re for globalness
- var MULTI_SPACE_RE = /\s+/g;
- var LTR_RE = /\u200e/g; // control character
- var UTC_RE = /UTC|GMT/;
- var NativeFormatter = /** @class */ (function () {
- function NativeFormatter(formatSettings) {
- var standardDateProps = {};
- var extendedSettings = {};
- var severity = 0;
- for (var name_1 in formatSettings) {
- if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) {
- extendedSettings[name_1] = formatSettings[name_1];
- severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity);
- }
- else {
- standardDateProps[name_1] = formatSettings[name_1];
- if (name_1 in STANDARD_DATE_PROP_SEVERITIES) {
- severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity);
- }
- }
- }
- this.standardDateProps = standardDateProps;
- this.extendedSettings = extendedSettings;
- this.severity = severity;
- this.buildFormattingFunc = memoize(buildFormattingFunc);
- }
- NativeFormatter.prototype.format = function (date, context) {
- return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date);
- };
- NativeFormatter.prototype.formatRange = function (start, end, context) {
- var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings;
- var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem);
- if (!diffSeverity) {
- return this.format(start, context);
- }
- var biggestUnitForPartial = diffSeverity;
- if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time
- (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') &&
- (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') &&
- (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) {
- biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time
- }
- var full0 = this.format(start, context);
- var full1 = this.format(end, context);
- if (full0 === full1) {
- return full0;
- }
- var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial);
- var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context);
- var partial0 = partialFormattingFunc(start);
- var partial1 = partialFormattingFunc(end);
- var insertion = findCommonInsertion(full0, partial0, full1, partial1);
- var separator = extendedSettings.separator || '';
- if (insertion) {
- return insertion.before + partial0 + separator + partial1 + insertion.after;
- }
- return full0 + separator + full1;
- };
- NativeFormatter.prototype.getLargestUnit = function () {
- switch (this.severity) {
- case 7:
- case 6:
- case 5:
- return 'year';
- case 4:
- return 'month';
- case 3:
- return 'week';
- default:
- return 'day';
- }
- };
- return NativeFormatter;
- }());
- function buildFormattingFunc(standardDateProps, extendedSettings, context) {
- var standardDatePropCnt = Object.keys(standardDateProps).length;
- if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') {
- return function (date) {
- return formatTimeZoneOffset(date.timeZoneOffset);
- };
- }
- if (standardDatePropCnt === 0 && extendedSettings.week) {
- return function (date) {
- return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekLabel, context.locale, extendedSettings.week);
- };
- }
- return buildNativeFormattingFunc(standardDateProps, extendedSettings, context);
- }
- function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) {
- standardDateProps = __assign({}, standardDateProps); // copy
- extendedSettings = __assign({}, extendedSettings); // copy
- sanitizeSettings(standardDateProps, extendedSettings);
- standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers
- var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps);
- var zeroFormat; // needed?
- if (extendedSettings.omitZeroMinute) {
- var zeroProps = __assign({}, standardDateProps);
- delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings
- zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps);
- }
- return function (date) {
- var marker = date.marker;
- var format;
- if (zeroFormat && !marker.getUTCMinutes()) {
- format = zeroFormat;
- }
- else {
- format = normalFormat;
- }
- var s = format.format(marker);
- return postProcess(s, date, standardDateProps, extendedSettings, context);
- };
- }
- function sanitizeSettings(standardDateProps, extendedSettings) {
- // deal with a browser inconsistency where formatting the timezone
- // requires that the hour/minute be present.
- if (standardDateProps.timeZoneName) {
- if (!standardDateProps.hour) {
- standardDateProps.hour = '2-digit';
- }
- if (!standardDateProps.minute) {
- standardDateProps.minute = '2-digit';
- }
- }
- // only support short timezone names
- if (standardDateProps.timeZoneName === 'long') {
- standardDateProps.timeZoneName = 'short';
- }
- // if requesting to display seconds, MUST display minutes
- if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) {
- delete extendedSettings.omitZeroMinute;
- }
- }
- function postProcess(s, date, standardDateProps, extendedSettings, context) {
- s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes
- if (standardDateProps.timeZoneName === 'short') {
- s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ?
- 'UTC' : // important to normalize for IE, which does "GMT"
- formatTimeZoneOffset(date.timeZoneOffset));
- }
- if (extendedSettings.omitCommas) {
- s = s.replace(COMMA_RE, '').trim();
- }
- if (extendedSettings.omitZeroMinute) {
- s = s.replace(':00', ''); // zeroFormat doesn't always achieve this
- }
- // ^ do anything that might create adjacent spaces before this point,
- // because MERIDIEM_RE likes to eat up loading spaces
- if (extendedSettings.meridiem === false) {
- s = s.replace(MERIDIEM_RE, '').trim();
- }
- else if (extendedSettings.meridiem === 'narrow') { // a/p
- s = s.replace(MERIDIEM_RE, function (m0, m1) {
- return m1.toLocaleLowerCase();
- });
- }
- else if (extendedSettings.meridiem === 'short') { // am/pm
- s = s.replace(MERIDIEM_RE, function (m0, m1) {
- return m1.toLocaleLowerCase() + 'm';
- });
- }
- else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase
- s = s.replace(MERIDIEM_RE, function (m0) {
- return m0.toLocaleLowerCase();
- });
- }
- s = s.replace(MULTI_SPACE_RE, ' ');
- s = s.trim();
- return s;
- }
- function injectTzoStr(s, tzoStr) {
- var replaced = false;
- s = s.replace(UTC_RE, function () {
- replaced = true;
- return tzoStr;
- });
- // IE11 doesn't include UTC/GMT in the original string, so append to end
- if (!replaced) {
- s += ' ' + tzoStr;
- }
- return s;
- }
- function formatWeekNumber(num, weekLabel, locale, display) {
- var parts = [];
- if (display === 'narrow') {
- parts.push(weekLabel);
- }
- else if (display === 'short') {
- parts.push(weekLabel, ' ');
- }
- // otherwise, considered 'numeric'
- parts.push(locale.simpleNumberFormat.format(num));
- if (locale.options.isRtl) { // TODO: use control characters instead?
- parts.reverse();
- }
- return parts.join('');
- }
- // Range Formatting Utils
- // 0 = exactly the same
- // 1 = different by time
- // and bigger
- function computeMarkerDiffSeverity(d0, d1, ca) {
- if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) {
- return 5;
- }
- if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) {
- return 4;
- }
- if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) {
- return 2;
- }
- if (timeAsMs(d0) !== timeAsMs(d1)) {
- return 1;
- }
- return 0;
- }
- function computePartialFormattingOptions(options, biggestUnit) {
- var partialOptions = {};
- for (var name_2 in options) {
- if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone)
- STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) {
- partialOptions[name_2] = options[name_2];
- }
- }
- return partialOptions;
- }
- function findCommonInsertion(full0, partial0, full1, partial1) {
- var i0 = 0;
- while (i0 < full0.length) {
- var found0 = full0.indexOf(partial0, i0);
- if (found0 === -1) {
- break;
- }
- var before0 = full0.substr(0, found0);
- i0 = found0 + partial0.length;
- var after0 = full0.substr(i0);
- var i1 = 0;
- while (i1 < full1.length) {
- var found1 = full1.indexOf(partial1, i1);
- if (found1 === -1) {
- break;
- }
- var before1 = full1.substr(0, found1);
- i1 = found1 + partial1.length;
- var after1 = full1.substr(i1);
- if (before0 === before1 && after0 === after1) {
- return {
- before: before0,
- after: after0
- };
- }
- }
- }
- return null;
- }
-
- /*
- TODO: fix the terminology of "formatter" vs "formatting func"
- */
- /*
- At the time of instantiation, this object does not know which cmd-formatting system it will use.
- It receives this at the time of formatting, as a setting.
- */
- var CmdFormatter = /** @class */ (function () {
- function CmdFormatter(cmdStr, separator) {
- this.cmdStr = cmdStr;
- this.separator = separator;
- }
- CmdFormatter.prototype.format = function (date, context) {
- return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, this.separator));
- };
- CmdFormatter.prototype.formatRange = function (start, end, context) {
- return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, this.separator));
- };
- return CmdFormatter;
- }());
-
- var FuncFormatter = /** @class */ (function () {
- function FuncFormatter(func) {
- this.func = func;
- }
- FuncFormatter.prototype.format = function (date, context) {
- return this.func(createVerboseFormattingArg(date, null, context));
- };
- FuncFormatter.prototype.formatRange = function (start, end, context) {
- return this.func(createVerboseFormattingArg(start, end, context));
- };
- return FuncFormatter;
- }());
-
- // Formatter Object Creation
- function createFormatter(input, defaultSeparator) {
- if (typeof input === 'object' && input) { // non-null object
- if (typeof defaultSeparator === 'string') {
- input = __assign({ separator: defaultSeparator }, input);
- }
- return new NativeFormatter(input);
- }
- else if (typeof input === 'string') {
- return new CmdFormatter(input, defaultSeparator);
- }
- else if (typeof input === 'function') {
- return new FuncFormatter(input);
- }
- }
- // String Utils
- // timeZoneOffset is in minutes
- function buildIsoString(marker, timeZoneOffset, stripZeroTime) {
- if (stripZeroTime === void 0) { stripZeroTime = false; }
- var s = marker.toISOString();
- s = s.replace('.000', '');
- if (stripZeroTime) {
- s = s.replace('T00:00:00Z', '');
- }
- if (s.length > 10) { // time part wasn't stripped, can add timezone info
- if (timeZoneOffset == null) {
- s = s.replace('Z', '');
- }
- else if (timeZoneOffset !== 0) {
- s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true));
- }
- // otherwise, its UTC-0 and we want to keep the Z
- }
- return s;
- }
- function formatIsoTimeString(marker) {
- return padStart(marker.getUTCHours(), 2) + ':' +
- padStart(marker.getUTCMinutes(), 2) + ':' +
- padStart(marker.getUTCSeconds(), 2);
- }
- function formatTimeZoneOffset(minutes, doIso) {
- if (doIso === void 0) { doIso = false; }
- var sign = minutes < 0 ? '-' : '+';
- var abs = Math.abs(minutes);
- var hours = Math.floor(abs / 60);
- var mins = Math.round(abs % 60);
- if (doIso) {
- return sign + padStart(hours, 2) + ':' + padStart(mins, 2);
- }
- else {
- return 'GMT' + sign + hours + (mins ? ':' + padStart(mins, 2) : '');
- }
- }
- // Arg Utils
- function createVerboseFormattingArg(start, end, context, separator) {
- var startInfo = expandZonedMarker(start, context.calendarSystem);
- var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null;
- return {
- date: startInfo,
- start: startInfo,
- end: endInfo,
- timeZone: context.timeZone,
- localeCodes: context.locale.codes,
- separator: separator
- };
- }
- function expandZonedMarker(dateInfo, calendarSystem) {
- var a = calendarSystem.markerToArray(dateInfo.marker);
- return {
- marker: dateInfo.marker,
- timeZoneOffset: dateInfo.timeZoneOffset,
- array: a,
- year: a[0],
- month: a[1],
- day: a[2],
- hour: a[3],
- minute: a[4],
- second: a[5],
- millisecond: a[6]
- };
- }
-
- var EventSourceApi = /** @class */ (function () {
- function EventSourceApi(calendar, internalEventSource) {
- this.calendar = calendar;
- this.internalEventSource = internalEventSource;
- }
- EventSourceApi.prototype.remove = function () {
- this.calendar.dispatch({
- type: 'REMOVE_EVENT_SOURCE',
- sourceId: this.internalEventSource.sourceId
- });
- };
- EventSourceApi.prototype.refetch = function () {
- this.calendar.dispatch({
- type: 'FETCH_EVENT_SOURCES',
- sourceIds: [this.internalEventSource.sourceId]
- });
- };
- Object.defineProperty(EventSourceApi.prototype, "id", {
- get: function () {
- return this.internalEventSource.publicId;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventSourceApi.prototype, "url", {
- // only relevant to json-feed event sources
- get: function () {
- return this.internalEventSource.meta.url;
- },
- enumerable: true,
- configurable: true
- });
- return EventSourceApi;
- }());
-
- var EventApi = /** @class */ (function () {
- function EventApi(calendar, def, instance) {
- this._calendar = calendar;
- this._def = def;
- this._instance = instance || null;
- }
- /*
- TODO: make event struct more responsible for this
- */
- EventApi.prototype.setProp = function (name, val) {
- var _a, _b;
- if (name in DATE_PROPS) ;
- else if (name in NON_DATE_PROPS) {
- if (typeof NON_DATE_PROPS[name] === 'function') {
- val = NON_DATE_PROPS[name](val);
- }
- this.mutate({
- standardProps: (_a = {}, _a[name] = val, _a)
- });
- }
- else if (name in UNSCOPED_EVENT_UI_PROPS) {
- var ui = void 0;
- if (typeof UNSCOPED_EVENT_UI_PROPS[name] === 'function') {
- val = UNSCOPED_EVENT_UI_PROPS[name](val);
- }
- if (name === 'color') {
- ui = { backgroundColor: val, borderColor: val };
- }
- else if (name === 'editable') {
- ui = { startEditable: val, durationEditable: val };
- }
- else {
- ui = (_b = {}, _b[name] = val, _b);
- }
- this.mutate({
- standardProps: { ui: ui }
- });
- }
- };
- EventApi.prototype.setExtendedProp = function (name, val) {
- var _a;
- this.mutate({
- extendedProps: (_a = {}, _a[name] = val, _a)
- });
- };
- EventApi.prototype.setStart = function (startInput, options) {
- if (options === void 0) { options = {}; }
- var dateEnv = this._calendar.dateEnv;
- var start = dateEnv.createMarker(startInput);
- if (start && this._instance) { // TODO: warning if parsed bad
- var instanceRange = this._instance.range;
- var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!?
- if (options.maintainDuration) {
- this.mutate({ datesDelta: startDelta });
- }
- else {
- this.mutate({ startDelta: startDelta });
- }
- }
- };
- EventApi.prototype.setEnd = function (endInput, options) {
- if (options === void 0) { options = {}; }
- var dateEnv = this._calendar.dateEnv;
- var end;
- if (endInput != null) {
- end = dateEnv.createMarker(endInput);
- if (!end) {
- return; // TODO: warning if parsed bad
- }
- }
- if (this._instance) {
- if (end) {
- var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity);
- this.mutate({ endDelta: endDelta });
- }
- else {
- this.mutate({ standardProps: { hasEnd: false } });
- }
- }
- };
- EventApi.prototype.setDates = function (startInput, endInput, options) {
- if (options === void 0) { options = {}; }
- var dateEnv = this._calendar.dateEnv;
- var standardProps = { allDay: options.allDay };
- var start = dateEnv.createMarker(startInput);
- var end;
- if (!start) {
- return; // TODO: warning if parsed bad
- }
- if (endInput != null) {
- end = dateEnv.createMarker(endInput);
- if (!end) { // TODO: warning if parsed bad
- return;
- }
- }
- if (this._instance) {
- var instanceRange = this._instance.range;
- // when computing the diff for an event being converted to all-day,
- // compute diff off of the all-day values the way event-mutation does.
- if (options.allDay === true) {
- instanceRange = computeAlignedDayRange(instanceRange);
- }
- var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);
- if (end) {
- var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity);
- if (durationsEqual(startDelta, endDelta)) {
- this.mutate({ datesDelta: startDelta, standardProps: standardProps });
- }
- else {
- this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps });
- }
- }
- else { // means "clear the end"
- standardProps.hasEnd = false;
- this.mutate({ datesDelta: startDelta, standardProps: standardProps });
- }
- }
- };
- EventApi.prototype.moveStart = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // TODO: warning if parsed bad
- this.mutate({ startDelta: delta });
- }
- };
- EventApi.prototype.moveEnd = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // TODO: warning if parsed bad
- this.mutate({ endDelta: delta });
- }
- };
- EventApi.prototype.moveDates = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // TODO: warning if parsed bad
- this.mutate({ datesDelta: delta });
- }
- };
- EventApi.prototype.setAllDay = function (allDay, options) {
- if (options === void 0) { options = {}; }
- var standardProps = { allDay: allDay };
- var maintainDuration = options.maintainDuration;
- if (maintainDuration == null) {
- maintainDuration = this._calendar.opt('allDayMaintainDuration');
- }
- if (this._def.allDay !== allDay) {
- standardProps.hasEnd = maintainDuration;
- }
- this.mutate({ standardProps: standardProps });
- };
- EventApi.prototype.formatRange = function (formatInput) {
- var dateEnv = this._calendar.dateEnv;
- var instance = this._instance;
- var formatter = createFormatter(formatInput, this._calendar.opt('defaultRangeSeparator'));
- if (this._def.hasEnd) {
- return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, {
- forcedStartTzo: instance.forcedStartTzo,
- forcedEndTzo: instance.forcedEndTzo
- });
- }
- else {
- return dateEnv.format(instance.range.start, formatter, {
- forcedTzo: instance.forcedStartTzo
- });
- }
- };
- EventApi.prototype.mutate = function (mutation) {
- var def = this._def;
- var instance = this._instance;
- if (instance) {
- this._calendar.dispatch({
- type: 'MUTATE_EVENTS',
- instanceId: instance.instanceId,
- mutation: mutation,
- fromApi: true
- });
- var eventStore = this._calendar.state.eventStore;
- this._def = eventStore.defs[def.defId];
- this._instance = eventStore.instances[instance.instanceId];
- }
- };
- EventApi.prototype.remove = function () {
- this._calendar.dispatch({
- type: 'REMOVE_EVENT_DEF',
- defId: this._def.defId
- });
- };
- Object.defineProperty(EventApi.prototype, "source", {
- get: function () {
- var sourceId = this._def.sourceId;
- if (sourceId) {
- return new EventSourceApi(this._calendar, this._calendar.state.eventSources[sourceId]);
- }
- return null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "start", {
- get: function () {
- return this._instance ?
- this._calendar.dateEnv.toDate(this._instance.range.start) :
- null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "end", {
- get: function () {
- return (this._instance && this._def.hasEnd) ?
- this._calendar.dateEnv.toDate(this._instance.range.end) :
- null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "id", {
- // computable props that all access the def
- // TODO: find a TypeScript-compatible way to do this at scale
- get: function () { return this._def.publicId; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "groupId", {
- get: function () { return this._def.groupId; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "allDay", {
- get: function () { return this._def.allDay; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "title", {
- get: function () { return this._def.title; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "url", {
- get: function () { return this._def.url; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "rendering", {
- get: function () { return this._def.rendering; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "startEditable", {
- get: function () { return this._def.ui.startEditable; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "durationEditable", {
- get: function () { return this._def.ui.durationEditable; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "constraint", {
- get: function () { return this._def.ui.constraints[0] || null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "overlap", {
- get: function () { return this._def.ui.overlap; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "allow", {
- get: function () { return this._def.ui.allows[0] || null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "backgroundColor", {
- get: function () { return this._def.ui.backgroundColor; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "borderColor", {
- get: function () { return this._def.ui.borderColor; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "textColor", {
- get: function () { return this._def.ui.textColor; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "classNames", {
- // NOTE: user can't modify these because Object.freeze was called in event-def parsing
- get: function () { return this._def.ui.classNames; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "extendedProps", {
- get: function () { return this._def.extendedProps; },
- enumerable: true,
- configurable: true
- });
- return EventApi;
- }());
-
- /*
- Specifying nextDayThreshold signals that all-day ranges should be sliced.
- */
- function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) {
- var inverseBgByGroupId = {};
- var inverseBgByDefId = {};
- var defByGroupId = {};
- var bgRanges = [];
- var fgRanges = [];
- var eventUis = compileEventUis(eventStore.defs, eventUiBases);
- for (var defId in eventStore.defs) {
- var def = eventStore.defs[defId];
- if (def.rendering === 'inverse-background') {
- if (def.groupId) {
- inverseBgByGroupId[def.groupId] = [];
- if (!defByGroupId[def.groupId]) {
- defByGroupId[def.groupId] = def;
- }
- }
- else {
- inverseBgByDefId[defId] = [];
- }
- }
- }
- for (var instanceId in eventStore.instances) {
- var instance = eventStore.instances[instanceId];
- var def = eventStore.defs[instance.defId];
- var ui = eventUis[def.defId];
- var origRange = instance.range;
- var normalRange = (!def.allDay && nextDayThreshold) ?
- computeVisibleDayRange(origRange, nextDayThreshold) :
- origRange;
- var slicedRange = intersectRanges(normalRange, framingRange);
- if (slicedRange) {
- if (def.rendering === 'inverse-background') {
- if (def.groupId) {
- inverseBgByGroupId[def.groupId].push(slicedRange);
- }
- else {
- inverseBgByDefId[instance.defId].push(slicedRange);
- }
- }
- else {
- (def.rendering === 'background' ? bgRanges : fgRanges).push({
- def: def,
- ui: ui,
- instance: instance,
- range: slicedRange,
- isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(),
- isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf()
- });
- }
- }
- }
- for (var groupId in inverseBgByGroupId) { // BY GROUP
- var ranges = inverseBgByGroupId[groupId];
- var invertedRanges = invertRanges(ranges, framingRange);
- for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) {
- var invertedRange = invertedRanges_1[_i];
- var def = defByGroupId[groupId];
- var ui = eventUis[def.defId];
- bgRanges.push({
- def: def,
- ui: ui,
- instance: null,
- range: invertedRange,
- isStart: false,
- isEnd: false
- });
- }
- }
- for (var defId in inverseBgByDefId) {
- var ranges = inverseBgByDefId[defId];
- var invertedRanges = invertRanges(ranges, framingRange);
- for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) {
- var invertedRange = invertedRanges_2[_a];
- bgRanges.push({
- def: eventStore.defs[defId],
- ui: eventUis[defId],
- instance: null,
- range: invertedRange,
- isStart: false,
- isEnd: false
- });
- }
- }
- return { bg: bgRanges, fg: fgRanges };
- }
- function hasBgRendering(def) {
- return def.rendering === 'background' || def.rendering === 'inverse-background';
- }
- function filterSegsViaEls(context, segs, isMirror) {
- var calendar = context.calendar, view = context.view;
- if (calendar.hasPublicHandlers('eventRender')) {
- segs = segs.filter(function (seg) {
- var custom = calendar.publiclyTrigger('eventRender', [
- {
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- isMirror: isMirror,
- isStart: seg.isStart,
- isEnd: seg.isEnd,
- // TODO: include seg.range once all components consistently generate it
- el: seg.el,
- view: view
- }
- ]);
- if (custom === false) { // means don't render at all
- return false;
- }
- else if (custom && custom !== true) {
- seg.el = custom;
- }
- return true;
- });
- }
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
- var seg = segs_1[_i];
- setElSeg(seg.el, seg);
- }
- return segs;
- }
- function setElSeg(el, seg) {
- el.fcSeg = seg;
- }
- function getElSeg(el) {
- return el.fcSeg || null;
- }
- // event ui computation
- function compileEventUis(eventDefs, eventUiBases) {
- return mapHash(eventDefs, function (eventDef) {
- return compileEventUi(eventDef, eventUiBases);
- });
- }
- function compileEventUi(eventDef, eventUiBases) {
- var uis = [];
- if (eventUiBases['']) {
- uis.push(eventUiBases['']);
- }
- if (eventUiBases[eventDef.defId]) {
- uis.push(eventUiBases[eventDef.defId]);
- }
- uis.push(eventDef.ui);
- return combineEventUis(uis);
- }
- // triggers
- function triggerRenderedSegs(context, segs, isMirrors) {
- var calendar = context.calendar, view = context.view;
- if (calendar.hasPublicHandlers('eventPositioned')) {
- for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
- var seg = segs_2[_i];
- calendar.publiclyTriggerAfterSizing('eventPositioned', [
- {
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- isMirror: isMirrors,
- isStart: seg.isStart,
- isEnd: seg.isEnd,
- el: seg.el,
- view: view
- }
- ]);
- }
- }
- if (!calendar.state.eventSourceLoadingLevel) { // avoid initial empty state while pending
- calendar.afterSizingTriggers._eventsPositioned = [null]; // fire once
- }
- }
- function triggerWillRemoveSegs(context, segs, isMirrors) {
- var calendar = context.calendar, view = context.view;
- for (var _i = 0, segs_3 = segs; _i < segs_3.length; _i++) {
- var seg = segs_3[_i];
- calendar.trigger('eventElRemove', seg.el);
- }
- if (calendar.hasPublicHandlers('eventDestroy')) {
- for (var _a = 0, segs_4 = segs; _a < segs_4.length; _a++) {
- var seg = segs_4[_a];
- calendar.publiclyTrigger('eventDestroy', [
- {
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- isMirror: isMirrors,
- el: seg.el,
- view: view
- }
- ]);
- }
- }
- }
- // is-interactable
- function computeEventDraggable(context, eventDef, eventUi) {
- var calendar = context.calendar, view = context.view;
- var transformers = calendar.pluginSystem.hooks.isDraggableTransformers;
- var val = eventUi.startEditable;
- for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
- var transformer = transformers_1[_i];
- val = transformer(val, eventDef, eventUi, view);
- }
- return val;
- }
- function computeEventStartResizable(context, eventDef, eventUi) {
- return eventUi.durationEditable && context.options.eventResizableFromStart;
- }
- function computeEventEndResizable(context, eventDef, eventUi) {
- return eventUi.durationEditable;
- }
-
- // applies the mutation to ALL defs/instances within the event store
- function applyMutationToEventStore(eventStore, eventConfigBase, mutation, calendar) {
- var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase);
- var dest = createEmptyEventStore();
- for (var defId in eventStore.defs) {
- var def = eventStore.defs[defId];
- dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, calendar.pluginSystem.hooks.eventDefMutationAppliers, calendar);
- }
- for (var instanceId in eventStore.instances) {
- var instance = eventStore.instances[instanceId];
- var def = dest.defs[instance.defId]; // important to grab the newly modified def
- dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, calendar);
- }
- return dest;
- }
- function applyMutationToEventDef(eventDef, eventConfig, mutation, appliers, calendar) {
- var standardProps = mutation.standardProps || {};
- // if hasEnd has not been specified, guess a good value based on deltas.
- // if duration will change, there's no way the default duration will persist,
- // and thus, we need to mark the event as having a real end
- if (standardProps.hasEnd == null &&
- eventConfig.durationEditable &&
- (mutation.startDelta || mutation.endDelta)) {
- standardProps.hasEnd = true; // TODO: is this mutation okay?
- }
- var copy = __assign({}, eventDef, standardProps, { ui: __assign({}, eventDef.ui, standardProps.ui) });
- if (mutation.extendedProps) {
- copy.extendedProps = __assign({}, copy.extendedProps, mutation.extendedProps);
- }
- for (var _i = 0, appliers_1 = appliers; _i < appliers_1.length; _i++) {
- var applier = appliers_1[_i];
- applier(copy, mutation, calendar);
- }
- if (!copy.hasEnd && calendar.opt('forceEventDuration')) {
- copy.hasEnd = true;
- }
- return copy;
- }
- function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef
- eventConfig, mutation, calendar) {
- var dateEnv = calendar.dateEnv;
- var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true;
- var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false;
- var copy = __assign({}, eventInstance);
- if (forceAllDay) {
- copy.range = computeAlignedDayRange(copy.range);
- }
- if (mutation.datesDelta && eventConfig.startEditable) {
- copy.range = {
- start: dateEnv.add(copy.range.start, mutation.datesDelta),
- end: dateEnv.add(copy.range.end, mutation.datesDelta)
- };
- }
- if (mutation.startDelta && eventConfig.durationEditable) {
- copy.range = {
- start: dateEnv.add(copy.range.start, mutation.startDelta),
- end: copy.range.end
- };
- }
- if (mutation.endDelta && eventConfig.durationEditable) {
- copy.range = {
- start: copy.range.start,
- end: dateEnv.add(copy.range.end, mutation.endDelta)
- };
- }
- if (clearEnd) {
- copy.range = {
- start: copy.range.start,
- end: calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start)
- };
- }
- // in case event was all-day but the supplied deltas were not
- // better util for this?
- if (eventDef.allDay) {
- copy.range = {
- start: startOfDay(copy.range.start),
- end: startOfDay(copy.range.end)
- };
- }
- // handle invalid durations
- if (copy.range.end < copy.range.start) {
- copy.range.end = calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start);
- }
- return copy;
- }
-
- function reduceEventStore (eventStore, action, eventSources, dateProfile, calendar) {
- switch (action.type) {
- case 'RECEIVE_EVENTS': // raw
- return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, calendar);
- case 'ADD_EVENTS': // already parsed, but not expanded
- return addEvent(eventStore, action.eventStore, // new ones
- dateProfile ? dateProfile.activeRange : null, calendar);
- case 'MERGE_EVENTS': // already parsed and expanded
- return mergeEventStores(eventStore, action.eventStore);
- case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
- case 'NEXT':
- case 'SET_DATE':
- case 'SET_VIEW_TYPE':
- if (dateProfile) {
- return expandRecurring(eventStore, dateProfile.activeRange, calendar);
- }
- else {
- return eventStore;
- }
- case 'CHANGE_TIMEZONE':
- return rezoneDates(eventStore, action.oldDateEnv, calendar.dateEnv);
- case 'MUTATE_EVENTS':
- return applyMutationToRelated(eventStore, action.instanceId, action.mutation, action.fromApi, calendar);
- case 'REMOVE_EVENT_INSTANCES':
- return excludeInstances(eventStore, action.instances);
- case 'REMOVE_EVENT_DEF':
- return filterEventStoreDefs(eventStore, function (eventDef) {
- return eventDef.defId !== action.defId;
- });
- case 'REMOVE_EVENT_SOURCE':
- return excludeEventsBySourceId(eventStore, action.sourceId);
- case 'REMOVE_ALL_EVENT_SOURCES':
- return filterEventStoreDefs(eventStore, function (eventDef) {
- return !eventDef.sourceId; // only keep events with no source id
- });
- case 'REMOVE_ALL_EVENTS':
- return createEmptyEventStore();
- case 'RESET_EVENTS':
- return {
- defs: eventStore.defs,
- instances: eventStore.instances
- };
- default:
- return eventStore;
- }
- }
- function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, calendar) {
- if (eventSource && // not already removed
- fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
- ) {
- var subset = parseEvents(transformRawEvents(rawEvents, eventSource, calendar), eventSource.sourceId, calendar);
- if (fetchRange) {
- subset = expandRecurring(subset, fetchRange, calendar);
- }
- return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
- }
- return eventStore;
- }
- function addEvent(eventStore, subset, expandRange, calendar) {
- if (expandRange) {
- subset = expandRecurring(subset, expandRange, calendar);
- }
- return mergeEventStores(eventStore, subset);
- }
- function rezoneDates(eventStore, oldDateEnv, newDateEnv) {
- var defs = eventStore.defs;
- var instances = mapHash(eventStore.instances, function (instance) {
- var def = defs[instance.defId];
- if (def.allDay || def.recurringDef) {
- return instance; // isn't dependent on timezone
- }
- else {
- return __assign({}, instance, { range: {
- start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)),
- end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo))
- }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo });
- }
- });
- return { defs: defs, instances: instances };
- }
- function applyMutationToRelated(eventStore, instanceId, mutation, fromApi, calendar) {
- var relevant = getRelevantEvents(eventStore, instanceId);
- var eventConfigBase = fromApi ?
- { '': {
- startEditable: true,
- durationEditable: true,
- constraints: [],
- overlap: null,
- allows: [],
- backgroundColor: '',
- borderColor: '',
- textColor: '',
- classNames: []
- } } :
- calendar.eventUiBases;
- relevant = applyMutationToEventStore(relevant, eventConfigBase, mutation, calendar);
- return mergeEventStores(eventStore, relevant);
- }
- function excludeEventsBySourceId(eventStore, sourceId) {
- return filterEventStoreDefs(eventStore, function (eventDef) {
- return eventDef.sourceId !== sourceId;
- });
- }
- // QUESTION: why not just return instances? do a general object-property-exclusion util
- function excludeInstances(eventStore, removals) {
- return {
- defs: eventStore.defs,
- instances: filterHash(eventStore.instances, function (instance) {
- return !removals[instance.instanceId];
- })
- };
- }
-
- // high-level segmenting-aware tester functions
- // ------------------------------------------------------------------------------------------------------------------------
- function isInteractionValid(interaction, calendar) {
- return isNewPropsValid({ eventDrag: interaction }, calendar); // HACK: the eventDrag props is used for ALL interactions
- }
- function isDateSelectionValid(dateSelection, calendar) {
- return isNewPropsValid({ dateSelection: dateSelection }, calendar);
- }
- function isNewPropsValid(newProps, calendar) {
- var view = calendar.view;
- var props = __assign({ businessHours: view ? view.props.businessHours : createEmptyEventStore(), dateSelection: '', eventStore: calendar.state.eventStore, eventUiBases: calendar.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps);
- return (calendar.pluginSystem.hooks.isPropsValid || isPropsValid)(props, calendar);
- }
- function isPropsValid(state, calendar, dateSpanMeta, filterConfig) {
- if (dateSpanMeta === void 0) { dateSpanMeta = {}; }
- if (state.eventDrag && !isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
- return false;
- }
- if (state.dateSelection && !isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
- return false;
- }
- return true;
- }
- // Moving Event Validation
- // ------------------------------------------------------------------------------------------------------------------------
- function isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
- var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions
- var subjectEventStore = interaction.mutatedEvents;
- var subjectDefs = subjectEventStore.defs;
- var subjectInstances = subjectEventStore.instances;
- var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ?
- state.eventUiBases :
- { '': calendar.selectionConfig } // if not a real event, validate as a selection
- );
- if (filterConfig) {
- subjectConfigs = mapHash(subjectConfigs, filterConfig);
- }
- var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); // exclude the subject events. TODO: exclude defs too?
- var otherDefs = otherEventStore.defs;
- var otherInstances = otherEventStore.instances;
- var otherConfigs = compileEventUis(otherDefs, state.eventUiBases);
- for (var subjectInstanceId in subjectInstances) {
- var subjectInstance = subjectInstances[subjectInstanceId];
- var subjectRange = subjectInstance.range;
- var subjectConfig = subjectConfigs[subjectInstance.defId];
- var subjectDef = subjectDefs[subjectInstance.defId];
- // constraint
- if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, calendar)) {
- return false;
- }
- // overlap
- var overlapFunc = calendar.opt('eventOverlap');
- if (typeof overlapFunc !== 'function') {
- overlapFunc = null;
- }
- for (var otherInstanceId in otherInstances) {
- var otherInstance = otherInstances[otherInstanceId];
- // intersect! evaluate
- if (rangesIntersect(subjectRange, otherInstance.range)) {
- var otherOverlap = otherConfigs[otherInstance.defId].overlap;
- // consider the other event's overlap. only do this if the subject event is a "real" event
- if (otherOverlap === false && interaction.isEvent) {
- return false;
- }
- if (subjectConfig.overlap === false) {
- return false;
- }
- if (overlapFunc && !overlapFunc(new EventApi(calendar, otherDefs[otherInstance.defId], otherInstance), // still event
- new EventApi(calendar, subjectDef, subjectInstance) // moving event
- )) {
- return false;
- }
- }
- }
- // allow (a function)
- var calendarEventStore = calendar.state.eventStore; // need global-to-calendar, not local to component (splittable)state
- for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) {
- var subjectAllow = _a[_i];
- var subjectDateSpan = __assign({}, dateSpanMeta, { range: subjectInstance.range, allDay: subjectDef.allDay });
- var origDef = calendarEventStore.defs[subjectDef.defId];
- var origInstance = calendarEventStore.instances[subjectInstanceId];
- var eventApi = void 0;
- if (origDef) { // was previously in the calendar
- eventApi = new EventApi(calendar, origDef, origInstance);
- }
- else { // was an external event
- eventApi = new EventApi(calendar, subjectDef); // no instance, because had no dates
- }
- if (!subjectAllow(calendar.buildDateSpanApi(subjectDateSpan), eventApi)) {
- return false;
- }
- }
- }
- return true;
- }
- // Date Selection Validation
- // ------------------------------------------------------------------------------------------------------------------------
- function isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
- var relevantEventStore = state.eventStore;
- var relevantDefs = relevantEventStore.defs;
- var relevantInstances = relevantEventStore.instances;
- var selection = state.dateSelection;
- var selectionRange = selection.range;
- var selectionConfig = calendar.selectionConfig;
- if (filterConfig) {
- selectionConfig = filterConfig(selectionConfig);
- }
- // constraint
- if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, calendar)) {
- return false;
- }
- // overlap
- var overlapFunc = calendar.opt('selectOverlap');
- if (typeof overlapFunc !== 'function') {
- overlapFunc = null;
- }
- for (var relevantInstanceId in relevantInstances) {
- var relevantInstance = relevantInstances[relevantInstanceId];
- // intersect! evaluate
- if (rangesIntersect(selectionRange, relevantInstance.range)) {
- if (selectionConfig.overlap === false) {
- return false;
- }
- if (overlapFunc && !overlapFunc(new EventApi(calendar, relevantDefs[relevantInstance.defId], relevantInstance))) {
- return false;
- }
- }
- }
- // allow (a function)
- for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) {
- var selectionAllow = _a[_i];
- var fullDateSpan = __assign({}, dateSpanMeta, selection);
- if (!selectionAllow(calendar.buildDateSpanApi(fullDateSpan), null)) {
- return false;
- }
- }
- return true;
- }
- // Constraint Utils
- // ------------------------------------------------------------------------------------------------------------------------
- function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, calendar) {
- for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) {
- var constraint = constraints_1[_i];
- if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, calendar), subjectRange)) {
- return false;
- }
- }
- return true;
- }
- function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours
- otherEventStore, // for if constraint is an even group ID
- businessHoursUnexpanded, // for if constraint is 'businessHours'
- calendar // for expanding businesshours
- ) {
- if (constraint === 'businessHours') {
- return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, calendar));
- }
- else if (typeof constraint === 'string') { // an group ID
- return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) {
- return eventDef.groupId === constraint;
- }));
- }
- else if (typeof constraint === 'object' && constraint) { // non-null object
- return eventStoreToRanges(expandRecurring(constraint, subjectRange, calendar));
- }
- return []; // if it's false
- }
- // TODO: move to event-store file?
- function eventStoreToRanges(eventStore) {
- var instances = eventStore.instances;
- var ranges = [];
- for (var instanceId in instances) {
- ranges.push(instances[instanceId].range);
- }
- return ranges;
- }
- // TODO: move to geom file?
- function anyRangesContainRange(outerRanges, innerRange) {
- for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) {
- var outerRange = outerRanges_1[_i];
- if (rangeContainsRange(outerRange, innerRange)) {
- return true;
- }
- }
- return false;
- }
- // Parsing
- // ------------------------------------------------------------------------------------------------------------------------
- function normalizeConstraint(input, calendar) {
- if (Array.isArray(input)) {
- return parseEvents(input, '', calendar, true); // allowOpenRange=true
- }
- else if (typeof input === 'object' && input) { // non-null object
- return parseEvents([input], '', calendar, true); // allowOpenRange=true
- }
- else if (input != null) {
- return String(input);
- }
- else {
- return null;
- }
- }
-
- function htmlEscape(s) {
- return (s + '').replace(/&/g, '&amp;')
- .replace(/</g, '&lt;')
- .replace(/>/g, '&gt;')
- .replace(/'/g, '&#039;')
- .replace(/"/g, '&quot;')
- .replace(/\n/g, '<br />');
- }
- // Given a hash of CSS properties, returns a string of CSS.
- // Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.
- function cssToStr(cssProps) {
- var statements = [];
- for (var name_1 in cssProps) {
- var val = cssProps[name_1];
- if (val != null && val !== '') {
- statements.push(name_1 + ':' + val);
- }
- }
- return statements.join(';');
- }
- // Given an object hash of HTML attribute names to values,
- // generates a string that can be injected between < > in HTML
- function attrsToStr(attrs) {
- var parts = [];
- for (var name_2 in attrs) {
- var val = attrs[name_2];
- if (val != null) {
- parts.push(name_2 + '="' + htmlEscape(val) + '"');
- }
- }
- return parts.join(' ');
- }
- function parseClassName(raw) {
- if (Array.isArray(raw)) {
- return raw;
- }
- else if (typeof raw === 'string') {
- return raw.split(/\s+/);
- }
- else {
- return [];
- }
- }
-
- var UNSCOPED_EVENT_UI_PROPS = {
- editable: Boolean,
- startEditable: Boolean,
- durationEditable: Boolean,
- constraint: null,
- overlap: null,
- allow: null,
- className: parseClassName,
- classNames: parseClassName,
- color: String,
- backgroundColor: String,
- borderColor: String,
- textColor: String
- };
- function processUnscopedUiProps(rawProps, calendar, leftovers) {
- var props = refineProps(rawProps, UNSCOPED_EVENT_UI_PROPS, {}, leftovers);
- var constraint = normalizeConstraint(props.constraint, calendar);
- return {
- startEditable: props.startEditable != null ? props.startEditable : props.editable,
- durationEditable: props.durationEditable != null ? props.durationEditable : props.editable,
- constraints: constraint != null ? [constraint] : [],
- overlap: props.overlap,
- allows: props.allow != null ? [props.allow] : [],
- backgroundColor: props.backgroundColor || props.color,
- borderColor: props.borderColor || props.color,
- textColor: props.textColor,
- classNames: props.classNames.concat(props.className)
- };
- }
- function processScopedUiProps(prefix, rawScoped, calendar, leftovers) {
- var rawUnscoped = {};
- var wasFound = {};
- for (var key in UNSCOPED_EVENT_UI_PROPS) {
- var scopedKey = prefix + capitaliseFirstLetter(key);
- rawUnscoped[key] = rawScoped[scopedKey];
- wasFound[scopedKey] = true;
- }
- if (prefix === 'event') {
- rawUnscoped.editable = rawScoped.editable; // special case. there is no 'eventEditable', just 'editable'
- }
- if (leftovers) {
- for (var key in rawScoped) {
- if (!wasFound[key]) {
- leftovers[key] = rawScoped[key];
- }
- }
- }
- return processUnscopedUiProps(rawUnscoped, calendar);
- }
- var EMPTY_EVENT_UI = {
- startEditable: null,
- durationEditable: null,
- constraints: [],
- overlap: null,
- allows: [],
- backgroundColor: '',
- borderColor: '',
- textColor: '',
- classNames: []
- };
- // prevent against problems with <2 args!
- function combineEventUis(uis) {
- return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI);
- }
- function combineTwoEventUis(item0, item1) {
- return {
- startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable,
- durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable,
- constraints: item0.constraints.concat(item1.constraints),
- overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap,
- allows: item0.allows.concat(item1.allows),
- backgroundColor: item1.backgroundColor || item0.backgroundColor,
- borderColor: item1.borderColor || item0.borderColor,
- textColor: item1.textColor || item0.textColor,
- classNames: item0.classNames.concat(item1.classNames)
- };
- }
-
- var NON_DATE_PROPS = {
- id: String,
- groupId: String,
- title: String,
- url: String,
- rendering: String,
- extendedProps: null
- };
- var DATE_PROPS = {
- start: null,
- date: null,
- end: null,
- allDay: null
- };
- var uid = 0;
- function parseEvent(raw, sourceId, calendar, allowOpenRange) {
- var allDayDefault = computeIsAllDayDefault(sourceId, calendar);
- var leftovers0 = {};
- var recurringRes = parseRecurring(raw, // raw, but with single-event stuff stripped out
- allDayDefault, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes, leftovers0 // will populate with non-recurring props
- );
- if (recurringRes) {
- var def = parseEventDef(leftovers0, sourceId, recurringRes.allDay, Boolean(recurringRes.duration), calendar);
- def.recurringDef = {
- typeId: recurringRes.typeId,
- typeData: recurringRes.typeData,
- duration: recurringRes.duration
- };
- return { def: def, instance: null };
- }
- else {
- var leftovers1 = {};
- var singleRes = parseSingle(raw, allDayDefault, calendar, leftovers1, allowOpenRange);
- if (singleRes) {
- var def = parseEventDef(leftovers1, sourceId, singleRes.allDay, singleRes.hasEnd, calendar);
- var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo);
- return { def: def, instance: instance };
- }
- }
- return null;
- }
- /*
- Will NOT populate extendedProps with the leftover properties.
- Will NOT populate date-related props.
- The EventNonDateInput has been normalized (id => publicId, etc).
- */
- function parseEventDef(raw, sourceId, allDay, hasEnd, calendar) {
- var leftovers = {};
- var def = pluckNonDateProps(raw, calendar, leftovers);
- def.defId = String(uid++);
- def.sourceId = sourceId;
- def.allDay = allDay;
- def.hasEnd = hasEnd;
- for (var _i = 0, _a = calendar.pluginSystem.hooks.eventDefParsers; _i < _a.length; _i++) {
- var eventDefParser = _a[_i];
- var newLeftovers = {};
- eventDefParser(def, leftovers, newLeftovers);
- leftovers = newLeftovers;
- }
- def.extendedProps = __assign(leftovers, def.extendedProps || {});
- // help out EventApi from having user modify props
- Object.freeze(def.ui.classNames);
- Object.freeze(def.extendedProps);
- return def;
- }
- function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) {
- return {
- instanceId: String(uid++),
- defId: defId,
- range: range,
- forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo,
- forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo
- };
- }
- function parseSingle(raw, allDayDefault, calendar, leftovers, allowOpenRange) {
- var props = pluckDateProps(raw, leftovers);
- var allDay = props.allDay;
- var startMeta;
- var startMarker = null;
- var hasEnd = false;
- var endMeta;
- var endMarker = null;
- startMeta = calendar.dateEnv.createMarkerMeta(props.start);
- if (startMeta) {
- startMarker = startMeta.marker;
- }
- else if (!allowOpenRange) {
- return null;
- }
- if (props.end != null) {
- endMeta = calendar.dateEnv.createMarkerMeta(props.end);
- }
- if (allDay == null) {
- if (allDayDefault != null) {
- allDay = allDayDefault;
- }
- else {
- // fall back to the date props LAST
- allDay = (!startMeta || startMeta.isTimeUnspecified) &&
- (!endMeta || endMeta.isTimeUnspecified);
- }
- }
- if (allDay && startMarker) {
- startMarker = startOfDay(startMarker);
- }
- if (endMeta) {
- endMarker = endMeta.marker;
- if (allDay) {
- endMarker = startOfDay(endMarker);
- }
- if (startMarker && endMarker <= startMarker) {
- endMarker = null;
- }
- }
- if (endMarker) {
- hasEnd = true;
- }
- else if (!allowOpenRange) {
- hasEnd = calendar.opt('forceEventDuration') || false;
- endMarker = calendar.dateEnv.add(startMarker, allDay ?
- calendar.defaultAllDayEventDuration :
- calendar.defaultTimedEventDuration);
- }
- return {
- allDay: allDay,
- hasEnd: hasEnd,
- range: { start: startMarker, end: endMarker },
- forcedStartTzo: startMeta ? startMeta.forcedTzo : null,
- forcedEndTzo: endMeta ? endMeta.forcedTzo : null
- };
- }
- function pluckDateProps(raw, leftovers) {
- var props = refineProps(raw, DATE_PROPS, {}, leftovers);
- props.start = (props.start !== null) ? props.start : props.date;
- delete props.date;
- return props;
- }
- function pluckNonDateProps(raw, calendar, leftovers) {
- var preLeftovers = {};
- var props = refineProps(raw, NON_DATE_PROPS, {}, preLeftovers);
- var ui = processUnscopedUiProps(preLeftovers, calendar, leftovers);
- props.publicId = props.id;
- delete props.id;
- props.ui = ui;
- return props;
- }
- function computeIsAllDayDefault(sourceId, calendar) {
- var res = null;
- if (sourceId) {
- var source = calendar.state.eventSources[sourceId];
- res = source.allDayDefault;
- }
- if (res == null) {
- res = calendar.opt('allDayDefault');
- }
- return res;
- }
-
- var DEF_DEFAULTS = {
- startTime: '09:00',
- endTime: '17:00',
- daysOfWeek: [1, 2, 3, 4, 5],
- rendering: 'inverse-background',
- classNames: 'fc-nonbusiness',
- groupId: '_businessHours' // so multiple defs get grouped
- };
- /*
- TODO: pass around as EventDefHash!!!
- */
- function parseBusinessHours(input, calendar) {
- return parseEvents(refineInputs(input), '', calendar);
- }
- function refineInputs(input) {
- var rawDefs;
- if (input === true) {
- rawDefs = [{}]; // will get DEF_DEFAULTS verbatim
- }
- else if (Array.isArray(input)) {
- // if specifying an array, every sub-definition NEEDS a day-of-week
- rawDefs = input.filter(function (rawDef) {
- return rawDef.daysOfWeek;
- });
- }
- else if (typeof input === 'object' && input) { // non-null object
- rawDefs = [input];
- }
- else { // is probably false
- rawDefs = [];
- }
- rawDefs = rawDefs.map(function (rawDef) {
- return __assign({}, DEF_DEFAULTS, rawDef);
- });
- return rawDefs;
- }
-
- function memoizeRendering(renderFunc, unrenderFunc, dependencies) {
- if (dependencies === void 0) { dependencies = []; }
- var dependents = [];
- var thisContext;
- var prevArgs;
- function unrender() {
- if (prevArgs) {
- for (var _i = 0, dependents_1 = dependents; _i < dependents_1.length; _i++) {
- var dependent = dependents_1[_i];
- dependent.unrender();
- }
- if (unrenderFunc) {
- unrenderFunc.apply(thisContext, prevArgs);
- }
- prevArgs = null;
- }
- }
- function res() {
- if (!prevArgs || !isArraysEqual(prevArgs, arguments)) {
- unrender();
- thisContext = this;
- prevArgs = arguments;
- renderFunc.apply(this, arguments);
- }
- }
- res.dependents = dependents;
- res.unrender = unrender;
- for (var _i = 0, dependencies_1 = dependencies; _i < dependencies_1.length; _i++) {
- var dependency = dependencies_1[_i];
- dependency.dependents.push(res);
- }
- return res;
- }
-
- var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere
- var Splitter = /** @class */ (function () {
- function Splitter() {
- this.getKeysForEventDefs = memoize(this._getKeysForEventDefs);
- this.splitDateSelection = memoize(this._splitDateSpan);
- this.splitEventStore = memoize(this._splitEventStore);
- this.splitIndividualUi = memoize(this._splitIndividualUi);
- this.splitEventDrag = memoize(this._splitInteraction);
- this.splitEventResize = memoize(this._splitInteraction);
- this.eventUiBuilders = {}; // TODO: typescript protection
- }
- Splitter.prototype.splitProps = function (props) {
- var _this = this;
- var keyInfos = this.getKeyInfo(props);
- var defKeys = this.getKeysForEventDefs(props.eventStore);
- var dateSelections = this.splitDateSelection(props.dateSelection);
- var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases*
- var eventStores = this.splitEventStore(props.eventStore, defKeys);
- var eventDrags = this.splitEventDrag(props.eventDrag);
- var eventResizes = this.splitEventResize(props.eventResize);
- var splitProps = {};
- this.eventUiBuilders = mapHash(keyInfos, function (info, key) {
- return _this.eventUiBuilders[key] || memoize(buildEventUiForKey);
- });
- for (var key in keyInfos) {
- var keyInfo = keyInfos[key];
- var eventStore = eventStores[key] || EMPTY_EVENT_STORE;
- var buildEventUi = this.eventUiBuilders[key];
- splitProps[key] = {
- businessHours: keyInfo.businessHours || props.businessHours,
- dateSelection: dateSelections[key] || null,
- eventStore: eventStore,
- eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]),
- eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '',
- eventDrag: eventDrags[key] || null,
- eventResize: eventResizes[key] || null
- };
- }
- return splitProps;
- };
- Splitter.prototype._splitDateSpan = function (dateSpan) {
- var dateSpans = {};
- if (dateSpan) {
- var keys = this.getKeysForDateSpan(dateSpan);
- for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
- var key = keys_1[_i];
- dateSpans[key] = dateSpan;
- }
- }
- return dateSpans;
- };
- Splitter.prototype._getKeysForEventDefs = function (eventStore) {
- var _this = this;
- return mapHash(eventStore.defs, function (eventDef) {
- return _this.getKeysForEventDef(eventDef);
- });
- };
- Splitter.prototype._splitEventStore = function (eventStore, defKeys) {
- var defs = eventStore.defs, instances = eventStore.instances;
- var splitStores = {};
- for (var defId in defs) {
- for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
- var key = _a[_i];
- if (!splitStores[key]) {
- splitStores[key] = createEmptyEventStore();
- }
- splitStores[key].defs[defId] = defs[defId];
- }
- }
- for (var instanceId in instances) {
- var instance = instances[instanceId];
- for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) {
- var key = _c[_b];
- if (splitStores[key]) { // must have already been created
- splitStores[key].instances[instanceId] = instance;
- }
- }
- }
- return splitStores;
- };
- Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) {
- var splitHashes = {};
- for (var defId in eventUiBases) {
- if (defId) { // not the '' key
- for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
- var key = _a[_i];
- if (!splitHashes[key]) {
- splitHashes[key] = {};
- }
- splitHashes[key][defId] = eventUiBases[defId];
- }
- }
- }
- return splitHashes;
- };
- Splitter.prototype._splitInteraction = function (interaction) {
- var splitStates = {};
- if (interaction) {
- var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents) // can't use cached. might be events from other calendar
- );
- // can't rely on defKeys because event data is mutated
- var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents);
- var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId);
- var populate = function (key) {
- if (!splitStates[key]) {
- splitStates[key] = {
- affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE,
- mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE,
- isEvent: interaction.isEvent,
- origSeg: interaction.origSeg
- };
- }
- };
- for (var key in affectedStores_1) {
- populate(key);
- }
- for (var key in mutatedStores_1) {
- populate(key);
- }
- }
- return splitStates;
- };
- return Splitter;
- }());
- function buildEventUiForKey(allUi, eventUiForKey, individualUi) {
- var baseParts = [];
- if (allUi) {
- baseParts.push(allUi);
- }
- if (eventUiForKey) {
- baseParts.push(eventUiForKey);
- }
- var stuff = {
- '': combineEventUis(baseParts)
- };
- if (individualUi) {
- __assign(stuff, individualUi);
- }
- return stuff;
- }
-
- // Generates HTML for an anchor to another view into the calendar.
- // Will either generate an <a> tag or a non-clickable <span> tag, depending on enabled settings.
- // `gotoOptions` can either be a DateMarker, or an object with the form:
- // { date, type, forceOff }
- // `type` is a view-type like "day" or "week". default value is "day".
- // `attrs` and `innerHtml` are use to generate the rest of the HTML tag.
- function buildGotoAnchorHtml(allOptions, dateEnv, gotoOptions, attrs, innerHtml) {
- var date;
- var type;
- var forceOff;
- var finalOptions;
- if (gotoOptions instanceof Date) {
- date = gotoOptions; // a single date-like input
- }
- else {
- date = gotoOptions.date;
- type = gotoOptions.type;
- forceOff = gotoOptions.forceOff;
- }
- finalOptions = {
- date: dateEnv.formatIso(date, { omitTime: true }),
- type: type || 'day'
- };
- if (typeof attrs === 'string') {
- innerHtml = attrs;
- attrs = null;
- }
- attrs = attrs ? ' ' + attrsToStr(attrs) : ''; // will have a leading space
- innerHtml = innerHtml || '';
- if (!forceOff && allOptions.navLinks) {
- return '<a' + attrs +
- ' data-goto="' + htmlEscape(JSON.stringify(finalOptions)) + '">' +
- innerHtml +
- '</a>';
- }
- else {
- return '<span' + attrs + '>' +
- innerHtml +
- '</span>';
- }
- }
- function getAllDayHtml(allOptions) {
- return allOptions.allDayHtml || htmlEscape(allOptions.allDayText);
- }
- // Computes HTML classNames for a single-day element
- function getDayClasses(date, dateProfile, context, noThemeHighlight) {
- var calendar = context.calendar, options = context.options, theme = context.theme, dateEnv = context.dateEnv;
- var classes = [];
- var todayStart;
- var todayEnd;
- if (!rangeContainsMarker(dateProfile.activeRange, date)) {
- classes.push('fc-disabled-day');
- }
- else {
- classes.push('fc-' + DAY_IDS[date.getUTCDay()]);
- if (options.monthMode &&
- dateEnv.getMonth(date) !== dateEnv.getMonth(dateProfile.currentRange.start)) {
- classes.push('fc-other-month');
- }
- todayStart = startOfDay(calendar.getNow());
- todayEnd = addDays(todayStart, 1);
- if (date < todayStart) {
- classes.push('fc-past');
- }
- else if (date >= todayEnd) {
- classes.push('fc-future');
- }
- else {
- classes.push('fc-today');
- if (noThemeHighlight !== true) {
- classes.push(theme.getClass('today'));
- }
- }
- }
- return classes;
- }
-
- // given a function that resolves a result asynchronously.
- // the function can either call passed-in success and failure callbacks,
- // or it can return a promise.
- // if you need to pass additional params to func, bind them first.
- function unpromisify(func, success, failure) {
- // guard against success/failure callbacks being called more than once
- // and guard against a promise AND callback being used together.
- var isResolved = false;
- var wrappedSuccess = function () {
- if (!isResolved) {
- isResolved = true;
- success.apply(this, arguments);
- }
- };
- var wrappedFailure = function () {
- if (!isResolved) {
- isResolved = true;
- if (failure) {
- failure.apply(this, arguments);
- }
- }
- };
- var res = func(wrappedSuccess, wrappedFailure);
- if (res && typeof res.then === 'function') {
- res.then(wrappedSuccess, wrappedFailure);
- }
- }
-
- var Mixin = /** @class */ (function () {
- function Mixin() {
- }
- // mix into a CLASS
- Mixin.mixInto = function (destClass) {
- this.mixIntoObj(destClass.prototype);
- };
- // mix into ANY object
- Mixin.mixIntoObj = function (destObj) {
- var _this = this;
- Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
- if (!destObj[name]) { // if destination doesn't already define it
- destObj[name] = _this.prototype[name];
- }
- });
- };
- /*
- will override existing methods
- TODO: remove! not used anymore
- */
- Mixin.mixOver = function (destClass) {
- var _this = this;
- Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
- destClass.prototype[name] = _this.prototype[name];
- });
- };
- return Mixin;
- }());
-
- /*
- USAGE:
- import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'
- in class:
- on: EmitterInterface['on']
- one: EmitterInterface['one']
- off: EmitterInterface['off']
- trigger: EmitterInterface['trigger']
- triggerWith: EmitterInterface['triggerWith']
- hasHandlers: EmitterInterface['hasHandlers']
- after class:
- EmitterMixin.mixInto(TheClass)
- */
- var EmitterMixin = /** @class */ (function (_super) {
- __extends(EmitterMixin, _super);
- function EmitterMixin() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- EmitterMixin.prototype.on = function (type, handler) {
- addToHash(this._handlers || (this._handlers = {}), type, handler);
- return this; // for chaining
- };
- // todo: add comments
- EmitterMixin.prototype.one = function (type, handler) {
- addToHash(this._oneHandlers || (this._oneHandlers = {}), type, handler);
- return this; // for chaining
- };
- EmitterMixin.prototype.off = function (type, handler) {
- if (this._handlers) {
- removeFromHash(this._handlers, type, handler);
- }
- if (this._oneHandlers) {
- removeFromHash(this._oneHandlers, type, handler);
- }
- return this; // for chaining
- };
- EmitterMixin.prototype.trigger = function (type) {
- var args = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- args[_i - 1] = arguments[_i];
- }
- this.triggerWith(type, this, args);
- return this; // for chaining
- };
- EmitterMixin.prototype.triggerWith = function (type, context, args) {
- if (this._handlers) {
- applyAll(this._handlers[type], context, args);
- }
- if (this._oneHandlers) {
- applyAll(this._oneHandlers[type], context, args);
- delete this._oneHandlers[type]; // will never fire again
- }
- return this; // for chaining
- };
- EmitterMixin.prototype.hasHandlers = function (type) {
- return (this._handlers && this._handlers[type] && this._handlers[type].length) ||
- (this._oneHandlers && this._oneHandlers[type] && this._oneHandlers[type].length);
- };
- return EmitterMixin;
- }(Mixin));
- function addToHash(hash, type, handler) {
- (hash[type] || (hash[type] = []))
- .push(handler);
- }
- function removeFromHash(hash, type, handler) {
- if (handler) {
- if (hash[type]) {
- hash[type] = hash[type].filter(function (func) {
- return func !== handler;
- });
- }
- }
- else {
- delete hash[type]; // remove all handler funcs for this type
- }
- }
-
- /*
- Records offset information for a set of elements, relative to an origin element.
- Can record the left/right OR the top/bottom OR both.
- Provides methods for querying the cache by position.
- */
- var PositionCache = /** @class */ (function () {
- function PositionCache(originEl, els, isHorizontal, isVertical) {
- this.originEl = originEl;
- this.els = els;
- this.isHorizontal = isHorizontal;
- this.isVertical = isVertical;
- }
- // Queries the els for coordinates and stores them.
- // Call this method before using and of the get* methods below.
- PositionCache.prototype.build = function () {
- var originEl = this.originEl;
- var originClientRect = this.originClientRect =
- originEl.getBoundingClientRect(); // relative to viewport top-left
- if (this.isHorizontal) {
- this.buildElHorizontals(originClientRect.left);
- }
- if (this.isVertical) {
- this.buildElVerticals(originClientRect.top);
- }
- };
- // Populates the left/right internal coordinate arrays
- PositionCache.prototype.buildElHorizontals = function (originClientLeft) {
- var lefts = [];
- var rights = [];
- for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
- var el = _a[_i];
- var rect = el.getBoundingClientRect();
- lefts.push(rect.left - originClientLeft);
- rights.push(rect.right - originClientLeft);
- }
- this.lefts = lefts;
- this.rights = rights;
- };
- // Populates the top/bottom internal coordinate arrays
- PositionCache.prototype.buildElVerticals = function (originClientTop) {
- var tops = [];
- var bottoms = [];
- for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
- var el = _a[_i];
- var rect = el.getBoundingClientRect();
- tops.push(rect.top - originClientTop);
- bottoms.push(rect.bottom - originClientTop);
- }
- this.tops = tops;
- this.bottoms = bottoms;
- };
- // Given a left offset (from document left), returns the index of the el that it horizontally intersects.
- // If no intersection is made, returns undefined.
- PositionCache.prototype.leftToIndex = function (leftPosition) {
- var lefts = this.lefts;
- var rights = this.rights;
- var len = lefts.length;
- var i;
- for (i = 0; i < len; i++) {
- if (leftPosition >= lefts[i] && leftPosition < rights[i]) {
- return i;
- }
- }
- };
- // Given a top offset (from document top), returns the index of the el that it vertically intersects.
- // If no intersection is made, returns undefined.
- PositionCache.prototype.topToIndex = function (topPosition) {
- var tops = this.tops;
- var bottoms = this.bottoms;
- var len = tops.length;
- var i;
- for (i = 0; i < len; i++) {
- if (topPosition >= tops[i] && topPosition < bottoms[i]) {
- return i;
- }
- }
- };
- // Gets the width of the element at the given index
- PositionCache.prototype.getWidth = function (leftIndex) {
- return this.rights[leftIndex] - this.lefts[leftIndex];
- };
- // Gets the height of the element at the given index
- PositionCache.prototype.getHeight = function (topIndex) {
- return this.bottoms[topIndex] - this.tops[topIndex];
- };
- return PositionCache;
- }());
-
- /*
- An object for getting/setting scroll-related information for an element.
- Internally, this is done very differently for window versus DOM element,
- so this object serves as a common interface.
- */
- var ScrollController = /** @class */ (function () {
- function ScrollController() {
- }
- ScrollController.prototype.getMaxScrollTop = function () {
- return this.getScrollHeight() - this.getClientHeight();
- };
- ScrollController.prototype.getMaxScrollLeft = function () {
- return this.getScrollWidth() - this.getClientWidth();
- };
- ScrollController.prototype.canScrollVertically = function () {
- return this.getMaxScrollTop() > 0;
- };
- ScrollController.prototype.canScrollHorizontally = function () {
- return this.getMaxScrollLeft() > 0;
- };
- ScrollController.prototype.canScrollUp = function () {
- return this.getScrollTop() > 0;
- };
- ScrollController.prototype.canScrollDown = function () {
- return this.getScrollTop() < this.getMaxScrollTop();
- };
- ScrollController.prototype.canScrollLeft = function () {
- return this.getScrollLeft() > 0;
- };
- ScrollController.prototype.canScrollRight = function () {
- return this.getScrollLeft() < this.getMaxScrollLeft();
- };
- return ScrollController;
- }());
- var ElementScrollController = /** @class */ (function (_super) {
- __extends(ElementScrollController, _super);
- function ElementScrollController(el) {
- var _this = _super.call(this) || this;
- _this.el = el;
- return _this;
- }
- ElementScrollController.prototype.getScrollTop = function () {
- return this.el.scrollTop;
- };
- ElementScrollController.prototype.getScrollLeft = function () {
- return this.el.scrollLeft;
- };
- ElementScrollController.prototype.setScrollTop = function (top) {
- this.el.scrollTop = top;
- };
- ElementScrollController.prototype.setScrollLeft = function (left) {
- this.el.scrollLeft = left;
- };
- ElementScrollController.prototype.getScrollWidth = function () {
- return this.el.scrollWidth;
- };
- ElementScrollController.prototype.getScrollHeight = function () {
- return this.el.scrollHeight;
- };
- ElementScrollController.prototype.getClientHeight = function () {
- return this.el.clientHeight;
- };
- ElementScrollController.prototype.getClientWidth = function () {
- return this.el.clientWidth;
- };
- return ElementScrollController;
- }(ScrollController));
- var WindowScrollController = /** @class */ (function (_super) {
- __extends(WindowScrollController, _super);
- function WindowScrollController() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- WindowScrollController.prototype.getScrollTop = function () {
- return window.pageYOffset;
- };
- WindowScrollController.prototype.getScrollLeft = function () {
- return window.pageXOffset;
- };
- WindowScrollController.prototype.setScrollTop = function (n) {
- window.scroll(window.pageXOffset, n);
- };
- WindowScrollController.prototype.setScrollLeft = function (n) {
- window.scroll(n, window.pageYOffset);
- };
- WindowScrollController.prototype.getScrollWidth = function () {
- return document.documentElement.scrollWidth;
- };
- WindowScrollController.prototype.getScrollHeight = function () {
- return document.documentElement.scrollHeight;
- };
- WindowScrollController.prototype.getClientHeight = function () {
- return document.documentElement.clientHeight;
- };
- WindowScrollController.prototype.getClientWidth = function () {
- return document.documentElement.clientWidth;
- };
- return WindowScrollController;
- }(ScrollController));
-
- /*
- Embodies a div that has potential scrollbars
- */
- var ScrollComponent = /** @class */ (function (_super) {
- __extends(ScrollComponent, _super);
- function ScrollComponent(overflowX, overflowY) {
- var _this = _super.call(this, createElement('div', {
- className: 'fc-scroller'
- })) || this;
- _this.overflowX = overflowX;
- _this.overflowY = overflowY;
- _this.applyOverflow();
- return _this;
- }
- // sets to natural height, unlocks overflow
- ScrollComponent.prototype.clear = function () {
- this.setHeight('auto');
- this.applyOverflow();
- };
- ScrollComponent.prototype.destroy = function () {
- removeElement(this.el);
- };
- // Overflow
- // -----------------------------------------------------------------------------------------------------------------
- ScrollComponent.prototype.applyOverflow = function () {
- applyStyle(this.el, {
- overflowX: this.overflowX,
- overflowY: this.overflowY
- });
- };
- // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.
- // Useful for preserving scrollbar widths regardless of future resizes.
- // Can pass in scrollbarWidths for optimization.
- ScrollComponent.prototype.lockOverflow = function (scrollbarWidths) {
- var overflowX = this.overflowX;
- var overflowY = this.overflowY;
- scrollbarWidths = scrollbarWidths || this.getScrollbarWidths();
- if (overflowX === 'auto') {
- overflowX = (scrollbarWidths.bottom || // horizontal scrollbars?
- this.canScrollHorizontally() // OR scrolling pane with massless scrollbars?
- ) ? 'scroll' : 'hidden';
- }
- if (overflowY === 'auto') {
- overflowY = (scrollbarWidths.left || scrollbarWidths.right || // horizontal scrollbars?
- this.canScrollVertically() // OR scrolling pane with massless scrollbars?
- ) ? 'scroll' : 'hidden';
- }
- applyStyle(this.el, { overflowX: overflowX, overflowY: overflowY });
- };
- ScrollComponent.prototype.setHeight = function (height) {
- applyStyleProp(this.el, 'height', height);
- };
- ScrollComponent.prototype.getScrollbarWidths = function () {
- var edges = computeEdges(this.el);
- return {
- left: edges.scrollbarLeft,
- right: edges.scrollbarRight,
- bottom: edges.scrollbarBottom
- };
- };
- return ScrollComponent;
- }(ElementScrollController));
-
- var Theme = /** @class */ (function () {
- function Theme(calendarOptions) {
- this.calendarOptions = calendarOptions;
- this.processIconOverride();
- }
- Theme.prototype.processIconOverride = function () {
- if (this.iconOverrideOption) {
- this.setIconOverride(this.calendarOptions[this.iconOverrideOption]);
- }
- };
- Theme.prototype.setIconOverride = function (iconOverrideHash) {
- var iconClassesCopy;
- var buttonName;
- if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object
- iconClassesCopy = __assign({}, this.iconClasses);
- for (buttonName in iconOverrideHash) {
- iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);
- }
- this.iconClasses = iconClassesCopy;
- }
- else if (iconOverrideHash === false) {
- this.iconClasses = {};
- }
- };
- Theme.prototype.applyIconOverridePrefix = function (className) {
- var prefix = this.iconOverridePrefix;
- if (prefix && className.indexOf(prefix) !== 0) { // if not already present
- className = prefix + className;
- }
- return className;
- };
- Theme.prototype.getClass = function (key) {
- return this.classes[key] || '';
- };
- Theme.prototype.getIconClass = function (buttonName) {
- var className = this.iconClasses[buttonName];
- if (className) {
- return this.baseIconClass + ' ' + className;
- }
- return '';
- };
- Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {
- var className;
- if (this.iconOverrideCustomButtonOption) {
- className = customButtonProps[this.iconOverrideCustomButtonOption];
- if (className) {
- return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);
- }
- }
- return '';
- };
- return Theme;
- }());
- Theme.prototype.classes = {};
- Theme.prototype.iconClasses = {};
- Theme.prototype.baseIconClass = '';
- Theme.prototype.iconOverridePrefix = '';
-
- var guid = 0;
- var ComponentContext = /** @class */ (function () {
- function ComponentContext(calendar, theme, dateEnv, options, view) {
- this.calendar = calendar;
- this.theme = theme;
- this.dateEnv = dateEnv;
- this.options = options;
- this.view = view;
- this.isRtl = options.dir === 'rtl';
- this.eventOrderSpecs = parseFieldSpecs(options.eventOrder);
- this.nextDayThreshold = createDuration(options.nextDayThreshold);
- }
- ComponentContext.prototype.extend = function (options, view) {
- return new ComponentContext(this.calendar, this.theme, this.dateEnv, options || this.options, view || this.view);
- };
- return ComponentContext;
- }());
- var Component = /** @class */ (function () {
- function Component() {
- this.everRendered = false;
- this.uid = String(guid++);
- }
- Component.addEqualityFuncs = function (newFuncs) {
- this.prototype.equalityFuncs = __assign({}, this.prototype.equalityFuncs, newFuncs);
- };
- Component.prototype.receiveProps = function (props, context) {
- this.receiveContext(context);
- var _a = recycleProps(this.props || {}, props, this.equalityFuncs), anyChanges = _a.anyChanges, comboProps = _a.comboProps;
- this.props = comboProps;
- if (anyChanges) {
- if (this.everRendered) {
- this.beforeUpdate();
- }
- this.render(comboProps, context);
- if (this.everRendered) {
- this.afterUpdate();
- }
- }
- this.everRendered = true;
- };
- Component.prototype.receiveContext = function (context) {
- var oldContext = this.context;
- this.context = context;
- if (!oldContext) {
- this.firstContext(context);
- }
- };
- Component.prototype.render = function (props, context) {
- };
- Component.prototype.firstContext = function (context) {
- };
- Component.prototype.beforeUpdate = function () {
- };
- Component.prototype.afterUpdate = function () {
- };
- // after destroy is called, this component won't ever be used again
- Component.prototype.destroy = function () {
- };
- return Component;
- }());
- Component.prototype.equalityFuncs = {};
- /*
- Reuses old values when equal. If anything is unequal, returns newProps as-is.
- Great for PureComponent, but won't be feasible with React, so just eliminate and use React's DOM diffing.
- */
- function recycleProps(oldProps, newProps, equalityFuncs) {
- var comboProps = {}; // some old, some new
- var anyChanges = false;
- for (var key in newProps) {
- if (key in oldProps && (oldProps[key] === newProps[key] ||
- (equalityFuncs[key] && equalityFuncs[key](oldProps[key], newProps[key])))) {
- // equal to old? use old prop
- comboProps[key] = oldProps[key];
- }
- else {
- comboProps[key] = newProps[key];
- anyChanges = true;
- }
- }
- for (var key in oldProps) {
- if (!(key in newProps)) {
- anyChanges = true;
- break;
- }
- }
- return { anyChanges: anyChanges, comboProps: comboProps };
- }
-
- /*
- PURPOSES:
- - hook up to fg, fill, and mirror renderers
- - interface for dragging and hits
- */
- var DateComponent = /** @class */ (function (_super) {
- __extends(DateComponent, _super);
- function DateComponent(el) {
- var _this = _super.call(this) || this;
- _this.el = el;
- return _this;
- }
- DateComponent.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- removeElement(this.el);
- };
- // Hit System
- // -----------------------------------------------------------------------------------------------------------------
- DateComponent.prototype.buildPositionCaches = function () {
- };
- DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
- return null; // this should be abstract
- };
- // Validation
- // -----------------------------------------------------------------------------------------------------------------
- DateComponent.prototype.isInteractionValid = function (interaction) {
- var calendar = this.context.calendar;
- var dateProfile = this.props.dateProfile; // HACK
- var instances = interaction.mutatedEvents.instances;
- if (dateProfile) { // HACK for DayTile
- for (var instanceId in instances) {
- if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) {
- return false;
- }
- }
- }
- return isInteractionValid(interaction, calendar);
- };
- DateComponent.prototype.isDateSelectionValid = function (selection) {
- var calendar = this.context.calendar;
- var dateProfile = this.props.dateProfile; // HACK
- if (dateProfile && // HACK for DayTile
- !rangeContainsRange(dateProfile.validRange, selection.range)) {
- return false;
- }
- return isDateSelectionValid(selection, calendar);
- };
- // Pointer Interaction Utils
- // -----------------------------------------------------------------------------------------------------------------
- DateComponent.prototype.isValidSegDownEl = function (el) {
- return !this.props.eventDrag && // HACK
- !this.props.eventResize && // HACK
- !elementClosest(el, '.fc-mirror') &&
- (this.isPopover() || !this.isInPopover(el));
- // ^above line ensures we don't detect a seg interaction within a nested component.
- // it's a HACK because it only supports a popover as the nested component.
- };
- DateComponent.prototype.isValidDateDownEl = function (el) {
- var segEl = elementClosest(el, this.fgSegSelector);
- return (!segEl || segEl.classList.contains('fc-mirror')) &&
- !elementClosest(el, '.fc-more') && // a "more.." link
- !elementClosest(el, 'a[data-goto]') && // a clickable nav link
- !this.isInPopover(el);
- };
- DateComponent.prototype.isPopover = function () {
- return this.el.classList.contains('fc-popover');
- };
- DateComponent.prototype.isInPopover = function (el) {
- return Boolean(elementClosest(el, '.fc-popover'));
- };
- return DateComponent;
- }(Component));
- DateComponent.prototype.fgSegSelector = '.fc-event-container > *';
- DateComponent.prototype.bgSegSelector = '.fc-bgevent:not(.fc-nonbusiness)';
-
- var uid$1 = 0;
- function createPlugin(input) {
- return {
- id: String(uid$1++),
- deps: input.deps || [],
- reducers: input.reducers || [],
- eventDefParsers: input.eventDefParsers || [],
- isDraggableTransformers: input.isDraggableTransformers || [],
- eventDragMutationMassagers: input.eventDragMutationMassagers || [],
- eventDefMutationAppliers: input.eventDefMutationAppliers || [],
- dateSelectionTransformers: input.dateSelectionTransformers || [],
- datePointTransforms: input.datePointTransforms || [],
- dateSpanTransforms: input.dateSpanTransforms || [],
- views: input.views || {},
- viewPropsTransformers: input.viewPropsTransformers || [],
- isPropsValid: input.isPropsValid || null,
- externalDefTransforms: input.externalDefTransforms || [],
- eventResizeJoinTransforms: input.eventResizeJoinTransforms || [],
- viewContainerModifiers: input.viewContainerModifiers || [],
- eventDropTransformers: input.eventDropTransformers || [],
- componentInteractions: input.componentInteractions || [],
- calendarInteractions: input.calendarInteractions || [],
- themeClasses: input.themeClasses || {},
- eventSourceDefs: input.eventSourceDefs || [],
- cmdFormatter: input.cmdFormatter,
- recurringTypes: input.recurringTypes || [],
- namedTimeZonedImpl: input.namedTimeZonedImpl,
- defaultView: input.defaultView || '',
- elementDraggingImpl: input.elementDraggingImpl,
- optionChangeHandlers: input.optionChangeHandlers || {}
- };
- }
- var PluginSystem = /** @class */ (function () {
- function PluginSystem() {
- this.hooks = {
- reducers: [],
- eventDefParsers: [],
- isDraggableTransformers: [],
- eventDragMutationMassagers: [],
- eventDefMutationAppliers: [],
- dateSelectionTransformers: [],
- datePointTransforms: [],
- dateSpanTransforms: [],
- views: {},
- viewPropsTransformers: [],
- isPropsValid: null,
- externalDefTransforms: [],
- eventResizeJoinTransforms: [],
- viewContainerModifiers: [],
- eventDropTransformers: [],
- componentInteractions: [],
- calendarInteractions: [],
- themeClasses: {},
- eventSourceDefs: [],
- cmdFormatter: null,
- recurringTypes: [],
- namedTimeZonedImpl: null,
- defaultView: '',
- elementDraggingImpl: null,
- optionChangeHandlers: {}
- };
- this.addedHash = {};
- }
- PluginSystem.prototype.add = function (plugin) {
- if (!this.addedHash[plugin.id]) {
- this.addedHash[plugin.id] = true;
- for (var _i = 0, _a = plugin.deps; _i < _a.length; _i++) {
- var dep = _a[_i];
- this.add(dep);
- }
- this.hooks = combineHooks(this.hooks, plugin);
- }
- };
- return PluginSystem;
- }());
- function combineHooks(hooks0, hooks1) {
- return {
- reducers: hooks0.reducers.concat(hooks1.reducers),
- eventDefParsers: hooks0.eventDefParsers.concat(hooks1.eventDefParsers),
- isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
- eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
- eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
- dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
- datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
- dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
- views: __assign({}, hooks0.views, hooks1.views),
- viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
- isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
- externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
- eventResizeJoinTransforms: hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms),
- viewContainerModifiers: hooks0.viewContainerModifiers.concat(hooks1.viewContainerModifiers),
- eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
- calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
- componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
- themeClasses: __assign({}, hooks0.themeClasses, hooks1.themeClasses),
- eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
- cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
- recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
- namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
- defaultView: hooks0.defaultView || hooks1.defaultView,
- elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
- optionChangeHandlers: __assign({}, hooks0.optionChangeHandlers, hooks1.optionChangeHandlers)
- };
- }
-
- var eventSourceDef = {
- ignoreRange: true,
- parseMeta: function (raw) {
- if (Array.isArray(raw)) { // short form
- return raw;
- }
- else if (Array.isArray(raw.events)) {
- return raw.events;
- }
- return null;
- },
- fetch: function (arg, success) {
- success({
- rawEvents: arg.eventSource.meta
- });
- }
- };
- var ArrayEventSourcePlugin = createPlugin({
- eventSourceDefs: [eventSourceDef]
- });
-
- var eventSourceDef$1 = {
- parseMeta: function (raw) {
- if (typeof raw === 'function') { // short form
- return raw;
- }
- else if (typeof raw.events === 'function') {
- return raw.events;
- }
- return null;
- },
- fetch: function (arg, success, failure) {
- var dateEnv = arg.calendar.dateEnv;
- var func = arg.eventSource.meta;
- unpromisify(func.bind(null, {
- start: dateEnv.toDate(arg.range.start),
- end: dateEnv.toDate(arg.range.end),
- startStr: dateEnv.formatIso(arg.range.start),
- endStr: dateEnv.formatIso(arg.range.end),
- timeZone: dateEnv.timeZone
- }), function (rawEvents) {
- success({ rawEvents: rawEvents }); // needs an object response
- }, failure // send errorObj directly to failure callback
- );
- }
- };
- var FuncEventSourcePlugin = createPlugin({
- eventSourceDefs: [eventSourceDef$1]
- });
-
- function requestJson(method, url, params, successCallback, failureCallback) {
- method = method.toUpperCase();
- var body = null;
- if (method === 'GET') {
- url = injectQueryStringParams(url, params);
- }
- else {
- body = encodeParams(params);
- }
- var xhr = new XMLHttpRequest();
- xhr.open(method, url, true);
- if (method !== 'GET') {
- xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
- }
- xhr.onload = function () {
- if (xhr.status >= 200 && xhr.status < 400) {
- try {
- var res = JSON.parse(xhr.responseText);
- successCallback(res, xhr);
- }
- catch (err) {
- failureCallback('Failure parsing JSON', xhr);
- }
- }
- else {
- failureCallback('Request failed', xhr);
- }
- };
- xhr.onerror = function () {
- failureCallback('Request failed', xhr);
- };
- xhr.send(body);
- }
- function injectQueryStringParams(url, params) {
- return url +
- (url.indexOf('?') === -1 ? '?' : '&') +
- encodeParams(params);
- }
- function encodeParams(params) {
- var parts = [];
- for (var key in params) {
- parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));
- }
- return parts.join('&');
- }
-
- var eventSourceDef$2 = {
- parseMeta: function (raw) {
- if (typeof raw === 'string') { // short form
- raw = { url: raw };
- }
- else if (!raw || typeof raw !== 'object' || !raw.url) {
- return null;
- }
- return {
- url: raw.url,
- method: (raw.method || 'GET').toUpperCase(),
- extraParams: raw.extraParams,
- startParam: raw.startParam,
- endParam: raw.endParam,
- timeZoneParam: raw.timeZoneParam
- };
- },
- fetch: function (arg, success, failure) {
- var meta = arg.eventSource.meta;
- var requestParams = buildRequestParams(meta, arg.range, arg.calendar);
- requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) {
- success({ rawEvents: rawEvents, xhr: xhr });
- }, function (errorMessage, xhr) {
- failure({ message: errorMessage, xhr: xhr });
- });
- }
- };
- var JsonFeedEventSourcePlugin = createPlugin({
- eventSourceDefs: [eventSourceDef$2]
- });
- function buildRequestParams(meta, range, calendar) {
- var dateEnv = calendar.dateEnv;
- var startParam;
- var endParam;
- var timeZoneParam;
- var customRequestParams;
- var params = {};
- startParam = meta.startParam;
- if (startParam == null) {
- startParam = calendar.opt('startParam');
- }
- endParam = meta.endParam;
- if (endParam == null) {
- endParam = calendar.opt('endParam');
- }
- timeZoneParam = meta.timeZoneParam;
- if (timeZoneParam == null) {
- timeZoneParam = calendar.opt('timeZoneParam');
- }
- // retrieve any outbound GET/POST data from the options
- if (typeof meta.extraParams === 'function') {
- // supplied as a function that returns a key/value object
- customRequestParams = meta.extraParams();
- }
- else {
- // probably supplied as a straight key/value object
- customRequestParams = meta.extraParams || {};
- }
- __assign(params, customRequestParams);
- params[startParam] = dateEnv.formatIso(range.start);
- params[endParam] = dateEnv.formatIso(range.end);
- if (dateEnv.timeZone !== 'local') {
- params[timeZoneParam] = dateEnv.timeZone;
- }
- return params;
- }
-
- var recurring = {
- parse: function (rawEvent, leftoverProps, dateEnv) {
- var createMarker = dateEnv.createMarker.bind(dateEnv);
- var processors = {
- daysOfWeek: null,
- startTime: createDuration,
- endTime: createDuration,
- startRecur: createMarker,
- endRecur: createMarker
- };
- var props = refineProps(rawEvent, processors, {}, leftoverProps);
- var anyValid = false;
- for (var propName in props) {
- if (props[propName] != null) {
- anyValid = true;
- break;
- }
- }
- if (anyValid) {
- var duration = null;
- if ('duration' in leftoverProps) {
- duration = createDuration(leftoverProps.duration);
- delete leftoverProps.duration;
- }
- if (!duration && props.startTime && props.endTime) {
- duration = subtractDurations(props.endTime, props.startTime);
- }
- return {
- allDayGuess: Boolean(!props.startTime && !props.endTime),
- duration: duration,
- typeData: props // doesn't need endTime anymore but oh well
- };
- }
- return null;
- },
- expand: function (typeData, framingRange, dateEnv) {
- var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
- if (clippedFramingRange) {
- return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
- }
- else {
- return [];
- }
- }
- };
- var SimpleRecurrencePlugin = createPlugin({
- recurringTypes: [recurring]
- });
- function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
- var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
- var dayMarker = startOfDay(framingRange.start);
- var endMarker = framingRange.end;
- var instanceStarts = [];
- while (dayMarker < endMarker) {
- var instanceStart
- // if everyday, or this particular day-of-week
- = void 0;
- // if everyday, or this particular day-of-week
- if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
- if (startTime) {
- instanceStart = dateEnv.add(dayMarker, startTime);
- }
- else {
- instanceStart = dayMarker;
- }
- instanceStarts.push(instanceStart);
- }
- dayMarker = addDays(dayMarker, 1);
- }
- return instanceStarts;
- }
-
- var DefaultOptionChangeHandlers = createPlugin({
- optionChangeHandlers: {
- events: function (events, calendar, deepEqual) {
- handleEventSources([events], calendar, deepEqual);
- },
- eventSources: handleEventSources,
- plugins: handlePlugins
- }
- });
- function handleEventSources(inputs, calendar, deepEqual) {
- var unfoundSources = hashValuesToArray(calendar.state.eventSources);
- var newInputs = [];
- for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
- var input = inputs_1[_i];
- var inputFound = false;
- for (var i = 0; i < unfoundSources.length; i++) {
- if (deepEqual(unfoundSources[i]._raw, input)) {
- unfoundSources.splice(i, 1); // delete
- inputFound = true;
- break;
- }
- }
- if (!inputFound) {
- newInputs.push(input);
- }
- }
- for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) {
- var unfoundSource = unfoundSources_1[_a];
- calendar.dispatch({
- type: 'REMOVE_EVENT_SOURCE',
- sourceId: unfoundSource.sourceId
- });
- }
- for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) {
- var newInput = newInputs_1[_b];
- calendar.addEventSource(newInput);
- }
- }
- // shortcoming: won't remove plugins
- function handlePlugins(inputs, calendar) {
- calendar.addPluginInputs(inputs); // will gracefully handle duplicates
- }
-
- var config = {}; // TODO: make these options
- var globalDefaults = {
- defaultRangeSeparator: ' - ',
- titleRangeSeparator: ' \u2013 ',
- defaultTimedEventDuration: '01:00:00',
- defaultAllDayEventDuration: { day: 1 },
- forceEventDuration: false,
- nextDayThreshold: '00:00:00',
- // display
- columnHeader: true,
- defaultView: '',
- aspectRatio: 1.35,
- header: {
- left: 'title',
- center: '',
- right: 'today prev,next'
- },
- weekends: true,
- weekNumbers: false,
- weekNumberCalculation: 'local',
- editable: false,
- // nowIndicator: false,
- scrollTime: '06:00:00',
- minTime: '00:00:00',
- maxTime: '24:00:00',
- showNonCurrentDates: true,
- // event ajax
- lazyFetching: true,
- startParam: 'start',
- endParam: 'end',
- timeZoneParam: 'timeZone',
- timeZone: 'local',
- // allDayDefault: undefined,
- // locale
- locales: [],
- locale: '',
- // dir: will get this from the default locale
- // buttonIcons: null,
- // allows setting a min-height to the event segment to prevent short events overlapping each other
- timeGridEventMinHeight: 0,
- themeSystem: 'standard',
- // eventResizableFromStart: false,
- dragRevertDuration: 500,
- dragScroll: true,
- allDayMaintainDuration: false,
- // selectable: false,
- unselectAuto: true,
- // selectMinDistance: 0,
- dropAccept: '*',
- eventOrder: 'start,-duration,allDay,title',
- // ^ if start tie, longer events go before shorter. final tie-breaker is title text
- // rerenderDelay: null,
- eventLimit: false,
- eventLimitClick: 'popover',
- dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' },
- handleWindowResize: true,
- windowResizeDelay: 100,
- longPressDelay: 1000,
- eventDragMinDistance: 5 // only applies to mouse
- };
- var rtlDefaults = {
- header: {
- left: 'next,prev today',
- center: '',
- right: 'title'
- },
- buttonIcons: {
- // TODO: make RTL support the responibility of the theme
- prev: 'fc-icon-chevron-right',
- next: 'fc-icon-chevron-left',
- prevYear: 'fc-icon-chevrons-right',
- nextYear: 'fc-icon-chevrons-left'
- }
- };
- var complexOptions = [
- 'header',
- 'footer',
- 'buttonText',
- 'buttonIcons'
- ];
- // Merges an array of option objects into a single object
- function mergeOptions(optionObjs) {
- return mergeProps(optionObjs, complexOptions);
- }
- // TODO: move this stuff to a "plugin"-related file...
- var INTERNAL_PLUGINS = [
- ArrayEventSourcePlugin,
- FuncEventSourcePlugin,
- JsonFeedEventSourcePlugin,
- SimpleRecurrencePlugin,
- DefaultOptionChangeHandlers
- ];
- function refinePluginDefs(pluginInputs) {
- var plugins = [];
- for (var _i = 0, pluginInputs_1 = pluginInputs; _i < pluginInputs_1.length; _i++) {
- var pluginInput = pluginInputs_1[_i];
- if (typeof pluginInput === 'string') {
- var globalName = 'FullCalendar' + capitaliseFirstLetter(pluginInput);
- if (!window[globalName]) {
- console.warn('Plugin file not loaded for ' + pluginInput);
- }
- else {
- plugins.push(window[globalName].default); // is an ES6 module
- }
- }
- else {
- plugins.push(pluginInput);
- }
- }
- return INTERNAL_PLUGINS.concat(plugins);
- }
-
- var RAW_EN_LOCALE = {
- code: 'en',
- week: {
- dow: 0,
- doy: 4 // 4 days need to be within the year to be considered the first week
- },
- dir: 'ltr',
- buttonText: {
- prev: 'prev',
- next: 'next',
- prevYear: 'prev year',
- nextYear: 'next year',
- year: 'year',
- today: 'today',
- month: 'month',
- week: 'week',
- day: 'day',
- list: 'list'
- },
- weekLabel: 'W',
- allDayText: 'all-day',
- eventLimitText: 'more',
- noEventsMessage: 'No events to display'
- };
- function parseRawLocales(explicitRawLocales) {
- var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en';
- var globalArray = window['FullCalendarLocalesAll'] || []; // from locales-all.js
- var globalObject = window['FullCalendarLocales'] || {}; // from locales/*.js. keys are meaningless
- var allRawLocales = globalArray.concat(// globalArray is low prio
- hashValuesToArray(globalObject), // medium prio
- explicitRawLocales // highest prio
- );
- var rawLocaleMap = {
- en: RAW_EN_LOCALE // necessary?
- };
- for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) {
- var rawLocale = allRawLocales_1[_i];
- rawLocaleMap[rawLocale.code] = rawLocale;
- }
- return {
- map: rawLocaleMap,
- defaultCode: defaultCode
- };
- }
- function buildLocale(inputSingular, available) {
- if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) {
- return parseLocale(inputSingular.code, [inputSingular.code], inputSingular);
- }
- else {
- return queryLocale(inputSingular, available);
- }
- }
- function queryLocale(codeArg, available) {
- var codes = [].concat(codeArg || []); // will convert to array
- var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE;
- return parseLocale(codeArg, codes, raw);
- }
- function queryRawLocale(codes, available) {
- for (var i = 0; i < codes.length; i++) {
- var parts = codes[i].toLocaleLowerCase().split('-');
- for (var j = parts.length; j > 0; j--) {
- var simpleId = parts.slice(0, j).join('-');
- if (available[simpleId]) {
- return available[simpleId];
- }
- }
- }
- return null;
- }
- function parseLocale(codeArg, codes, raw) {
- var merged = mergeProps([RAW_EN_LOCALE, raw], ['buttonText']);
- delete merged.code; // don't want this part of the options
- var week = merged.week;
- delete merged.week;
- return {
- codeArg: codeArg,
- codes: codes,
- week: week,
- simpleNumberFormat: new Intl.NumberFormat(codeArg),
- options: merged
- };
- }
-
- var OptionsManager = /** @class */ (function () {
- function OptionsManager(overrides) {
- this.overrides = __assign({}, overrides); // make a copy
- this.dynamicOverrides = {};
- this.compute();
- }
- OptionsManager.prototype.mutate = function (updates, removals, isDynamic) {
- if (!Object.keys(updates).length && !removals.length) {
- return;
- }
- var overrideHash = isDynamic ? this.dynamicOverrides : this.overrides;
- __assign(overrideHash, updates);
- for (var _i = 0, removals_1 = removals; _i < removals_1.length; _i++) {
- var propName = removals_1[_i];
- delete overrideHash[propName];
- }
- this.compute();
- };
- // Computes the flattened options hash for the calendar and assigns to `this.options`.
- // Assumes this.overrides and this.dynamicOverrides have already been initialized.
- OptionsManager.prototype.compute = function () {
- // TODO: not a very efficient system
- var locales = firstDefined(// explicit locale option given?
- this.dynamicOverrides.locales, this.overrides.locales, globalDefaults.locales);
- var locale = firstDefined(// explicit locales option given?
- this.dynamicOverrides.locale, this.overrides.locale, globalDefaults.locale);
- var available = parseRawLocales(locales);
- var localeDefaults = buildLocale(locale || available.defaultCode, available.map).options;
- var dir = firstDefined(// based on options computed so far, is direction RTL?
- this.dynamicOverrides.dir, this.overrides.dir, localeDefaults.dir);
- var dirDefaults = dir === 'rtl' ? rtlDefaults : {};
- this.dirDefaults = dirDefaults;
- this.localeDefaults = localeDefaults;
- this.computed = mergeOptions([
- globalDefaults,
- dirDefaults,
- localeDefaults,
- this.overrides,
- this.dynamicOverrides
- ]);
- };
- return OptionsManager;
- }());
-
- var calendarSystemClassMap = {};
- function registerCalendarSystem(name, theClass) {
- calendarSystemClassMap[name] = theClass;
- }
- function createCalendarSystem(name) {
- return new calendarSystemClassMap[name]();
- }
- var GregorianCalendarSystem = /** @class */ (function () {
- function GregorianCalendarSystem() {
- }
- GregorianCalendarSystem.prototype.getMarkerYear = function (d) {
- return d.getUTCFullYear();
- };
- GregorianCalendarSystem.prototype.getMarkerMonth = function (d) {
- return d.getUTCMonth();
- };
- GregorianCalendarSystem.prototype.getMarkerDay = function (d) {
- return d.getUTCDate();
- };
- GregorianCalendarSystem.prototype.arrayToMarker = function (arr) {
- return arrayToUtcDate(arr);
- };
- GregorianCalendarSystem.prototype.markerToArray = function (marker) {
- return dateToUtcArray(marker);
- };
- return GregorianCalendarSystem;
- }());
- registerCalendarSystem('gregory', GregorianCalendarSystem);
-
- var ISO_RE = /^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;
- function parse(str) {
- var m = ISO_RE.exec(str);
- if (m) {
- var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number('0.' + m[12]) * 1000 : 0));
- if (isValidDate(marker)) {
- var timeZoneOffset = null;
- if (m[13]) {
- timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 +
- Number(m[18] || 0));
- }
- return {
- marker: marker,
- isTimeUnspecified: !m[6],
- timeZoneOffset: timeZoneOffset
- };
- }
- }
- return null;
- }
-
- var DateEnv = /** @class */ (function () {
- function DateEnv(settings) {
- var timeZone = this.timeZone = settings.timeZone;
- var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC';
- if (settings.namedTimeZoneImpl && isNamedTimeZone) {
- this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone);
- }
- this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl);
- this.calendarSystem = createCalendarSystem(settings.calendarSystem);
- this.locale = settings.locale;
- this.weekDow = settings.locale.week.dow;
- this.weekDoy = settings.locale.week.doy;
- if (settings.weekNumberCalculation === 'ISO') {
- this.weekDow = 1;
- this.weekDoy = 4;
- }
- if (typeof settings.firstDay === 'number') {
- this.weekDow = settings.firstDay;
- }
- if (typeof settings.weekNumberCalculation === 'function') {
- this.weekNumberFunc = settings.weekNumberCalculation;
- }
- this.weekLabel = settings.weekLabel != null ? settings.weekLabel : settings.locale.options.weekLabel;
- this.cmdFormatter = settings.cmdFormatter;
- }
- // Creating / Parsing
- DateEnv.prototype.createMarker = function (input) {
- var meta = this.createMarkerMeta(input);
- if (meta === null) {
- return null;
- }
- return meta.marker;
- };
- DateEnv.prototype.createNowMarker = function () {
- if (this.canComputeOffset) {
- return this.timestampToMarker(new Date().valueOf());
- }
- else {
- // if we can't compute the current date val for a timezone,
- // better to give the current local date vals than UTC
- return arrayToUtcDate(dateToLocalArray(new Date()));
- }
- };
- DateEnv.prototype.createMarkerMeta = function (input) {
- if (typeof input === 'string') {
- return this.parse(input);
- }
- var marker = null;
- if (typeof input === 'number') {
- marker = this.timestampToMarker(input);
- }
- else if (input instanceof Date) {
- input = input.valueOf();
- if (!isNaN(input)) {
- marker = this.timestampToMarker(input);
- }
- }
- else if (Array.isArray(input)) {
- marker = arrayToUtcDate(input);
- }
- if (marker === null || !isValidDate(marker)) {
- return null;
- }
- return { marker: marker, isTimeUnspecified: false, forcedTzo: null };
- };
- DateEnv.prototype.parse = function (s) {
- var parts = parse(s);
- if (parts === null) {
- return null;
- }
- var marker = parts.marker;
- var forcedTzo = null;
- if (parts.timeZoneOffset !== null) {
- if (this.canComputeOffset) {
- marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000);
- }
- else {
- forcedTzo = parts.timeZoneOffset;
- }
- }
- return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo };
- };
- // Accessors
- DateEnv.prototype.getYear = function (marker) {
- return this.calendarSystem.getMarkerYear(marker);
- };
- DateEnv.prototype.getMonth = function (marker) {
- return this.calendarSystem.getMarkerMonth(marker);
- };
- // Adding / Subtracting
- DateEnv.prototype.add = function (marker, dur) {
- var a = this.calendarSystem.markerToArray(marker);
- a[0] += dur.years;
- a[1] += dur.months;
- a[2] += dur.days;
- a[6] += dur.milliseconds;
- return this.calendarSystem.arrayToMarker(a);
- };
- DateEnv.prototype.subtract = function (marker, dur) {
- var a = this.calendarSystem.markerToArray(marker);
- a[0] -= dur.years;
- a[1] -= dur.months;
- a[2] -= dur.days;
- a[6] -= dur.milliseconds;
- return this.calendarSystem.arrayToMarker(a);
- };
- DateEnv.prototype.addYears = function (marker, n) {
- var a = this.calendarSystem.markerToArray(marker);
- a[0] += n;
- return this.calendarSystem.arrayToMarker(a);
- };
- DateEnv.prototype.addMonths = function (marker, n) {
- var a = this.calendarSystem.markerToArray(marker);
- a[1] += n;
- return this.calendarSystem.arrayToMarker(a);
- };
- // Diffing Whole Units
- DateEnv.prototype.diffWholeYears = function (m0, m1) {
- var calendarSystem = this.calendarSystem;
- if (timeAsMs(m0) === timeAsMs(m1) &&
- calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) &&
- calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) {
- return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0);
- }
- return null;
- };
- DateEnv.prototype.diffWholeMonths = function (m0, m1) {
- var calendarSystem = this.calendarSystem;
- if (timeAsMs(m0) === timeAsMs(m1) &&
- calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) {
- return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) +
- (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12;
- }
- return null;
- };
- // Range / Duration
- DateEnv.prototype.greatestWholeUnit = function (m0, m1) {
- var n = this.diffWholeYears(m0, m1);
- if (n !== null) {
- return { unit: 'year', value: n };
- }
- n = this.diffWholeMonths(m0, m1);
- if (n !== null) {
- return { unit: 'month', value: n };
- }
- n = diffWholeWeeks(m0, m1);
- if (n !== null) {
- return { unit: 'week', value: n };
- }
- n = diffWholeDays(m0, m1);
- if (n !== null) {
- return { unit: 'day', value: n };
- }
- n = diffHours(m0, m1);
- if (isInt(n)) {
- return { unit: 'hour', value: n };
- }
- n = diffMinutes(m0, m1);
- if (isInt(n)) {
- return { unit: 'minute', value: n };
- }
- n = diffSeconds(m0, m1);
- if (isInt(n)) {
- return { unit: 'second', value: n };
- }
- return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() };
- };
- DateEnv.prototype.countDurationsBetween = function (m0, m1, d) {
- // TODO: can use greatestWholeUnit
- var diff;
- if (d.years) {
- diff = this.diffWholeYears(m0, m1);
- if (diff !== null) {
- return diff / asRoughYears(d);
- }
- }
- if (d.months) {
- diff = this.diffWholeMonths(m0, m1);
- if (diff !== null) {
- return diff / asRoughMonths(d);
- }
- }
- if (d.days) {
- diff = diffWholeDays(m0, m1);
- if (diff !== null) {
- return diff / asRoughDays(d);
- }
- }
- return (m1.valueOf() - m0.valueOf()) / asRoughMs(d);
- };
- // Start-Of
- DateEnv.prototype.startOf = function (m, unit) {
- if (unit === 'year') {
- return this.startOfYear(m);
- }
- else if (unit === 'month') {
- return this.startOfMonth(m);
- }
- else if (unit === 'week') {
- return this.startOfWeek(m);
- }
- else if (unit === 'day') {
- return startOfDay(m);
- }
- else if (unit === 'hour') {
- return startOfHour(m);
- }
- else if (unit === 'minute') {
- return startOfMinute(m);
- }
- else if (unit === 'second') {
- return startOfSecond(m);
- }
- };
- DateEnv.prototype.startOfYear = function (m) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m)
- ]);
- };
- DateEnv.prototype.startOfMonth = function (m) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m),
- this.calendarSystem.getMarkerMonth(m)
- ]);
- };
- DateEnv.prototype.startOfWeek = function (m) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m),
- this.calendarSystem.getMarkerMonth(m),
- m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7)
- ]);
- };
- // Week Number
- DateEnv.prototype.computeWeekNumber = function (marker) {
- if (this.weekNumberFunc) {
- return this.weekNumberFunc(this.toDate(marker));
- }
- else {
- return weekOfYear(marker, this.weekDow, this.weekDoy);
- }
- };
- // TODO: choke on timeZoneName: long
- DateEnv.prototype.format = function (marker, formatter, dateOptions) {
- if (dateOptions === void 0) { dateOptions = {}; }
- return formatter.format({
- marker: marker,
- timeZoneOffset: dateOptions.forcedTzo != null ?
- dateOptions.forcedTzo :
- this.offsetForMarker(marker)
- }, this);
- };
- DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) {
- if (dateOptions === void 0) { dateOptions = {}; }
- if (dateOptions.isEndExclusive) {
- end = addMs(end, -1);
- }
- return formatter.formatRange({
- marker: start,
- timeZoneOffset: dateOptions.forcedStartTzo != null ?
- dateOptions.forcedStartTzo :
- this.offsetForMarker(start)
- }, {
- marker: end,
- timeZoneOffset: dateOptions.forcedEndTzo != null ?
- dateOptions.forcedEndTzo :
- this.offsetForMarker(end)
- }, this);
- };
- DateEnv.prototype.formatIso = function (marker, extraOptions) {
- if (extraOptions === void 0) { extraOptions = {}; }
- var timeZoneOffset = null;
- if (!extraOptions.omitTimeZoneOffset) {
- if (extraOptions.forcedTzo != null) {
- timeZoneOffset = extraOptions.forcedTzo;
- }
- else {
- timeZoneOffset = this.offsetForMarker(marker);
- }
- }
- return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime);
- };
- // TimeZone
- DateEnv.prototype.timestampToMarker = function (ms) {
- if (this.timeZone === 'local') {
- return arrayToUtcDate(dateToLocalArray(new Date(ms)));
- }
- else if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) {
- return new Date(ms);
- }
- else {
- return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));
- }
- };
- DateEnv.prototype.offsetForMarker = function (m) {
- if (this.timeZone === 'local') {
- return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset
- }
- else if (this.timeZone === 'UTC') {
- return 0;
- }
- else if (this.namedTimeZoneImpl) {
- return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m));
- }
- return null;
- };
- // Conversion
- DateEnv.prototype.toDate = function (m, forcedTzo) {
- if (this.timeZone === 'local') {
- return arrayToLocalDate(dateToUtcArray(m));
- }
- else if (this.timeZone === 'UTC') {
- return new Date(m.valueOf()); // make sure it's a copy
- }
- else if (!this.namedTimeZoneImpl) {
- return new Date(m.valueOf() - (forcedTzo || 0));
- }
- else {
- return new Date(m.valueOf() -
- this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60 // convert minutes -> ms
- );
- }
- };
- return DateEnv;
- }());
-
- var SIMPLE_SOURCE_PROPS = {
- id: String,
- allDayDefault: Boolean,
- eventDataTransform: Function,
- success: Function,
- failure: Function
- };
- var uid$2 = 0;
- function doesSourceNeedRange(eventSource, calendar) {
- var defs = calendar.pluginSystem.hooks.eventSourceDefs;
- return !defs[eventSource.sourceDefId].ignoreRange;
- }
- function parseEventSource(raw, calendar) {
- var defs = calendar.pluginSystem.hooks.eventSourceDefs;
- for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
- var def = defs[i];
- var meta = def.parseMeta(raw);
- if (meta) {
- var res = parseEventSourceProps(typeof raw === 'object' ? raw : {}, meta, i, calendar);
- res._raw = raw;
- return res;
- }
- }
- return null;
- }
- function parseEventSourceProps(raw, meta, sourceDefId, calendar) {
- var leftovers0 = {};
- var props = refineProps(raw, SIMPLE_SOURCE_PROPS, {}, leftovers0);
- var leftovers1 = {};
- var ui = processUnscopedUiProps(leftovers0, calendar, leftovers1);
- props.isFetching = false;
- props.latestFetchId = '';
- props.fetchRange = null;
- props.publicId = String(raw.id || '');
- props.sourceId = String(uid$2++);
- props.sourceDefId = sourceDefId;
- props.meta = meta;
- props.ui = ui;
- props.extendedProps = leftovers1;
- return props;
- }
-
- function reduceEventSources (eventSources, action, dateProfile, calendar) {
- switch (action.type) {
- case 'ADD_EVENT_SOURCES': // already parsed
- return addSources(eventSources, action.sources, dateProfile ? dateProfile.activeRange : null, calendar);
- case 'REMOVE_EVENT_SOURCE':
- return removeSource(eventSources, action.sourceId);
- case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
- case 'NEXT':
- case 'SET_DATE':
- case 'SET_VIEW_TYPE':
- if (dateProfile) {
- return fetchDirtySources(eventSources, dateProfile.activeRange, calendar);
- }
- else {
- return eventSources;
- }
- case 'FETCH_EVENT_SOURCES':
- case 'CHANGE_TIMEZONE':
- return fetchSourcesByIds(eventSources, action.sourceIds ?
- arrayToHash(action.sourceIds) :
- excludeStaticSources(eventSources, calendar), dateProfile ? dateProfile.activeRange : null, calendar);
- case 'RECEIVE_EVENTS':
- case 'RECEIVE_EVENT_ERROR':
- return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
- case 'REMOVE_ALL_EVENT_SOURCES':
- return {};
- default:
- return eventSources;
- }
- }
- var uid$3 = 0;
- function addSources(eventSourceHash, sources, fetchRange, calendar) {
- var hash = {};
- for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) {
- var source = sources_1[_i];
- hash[source.sourceId] = source;
- }
- if (fetchRange) {
- hash = fetchDirtySources(hash, fetchRange, calendar);
- }
- return __assign({}, eventSourceHash, hash);
- }
- function removeSource(eventSourceHash, sourceId) {
- return filterHash(eventSourceHash, function (eventSource) {
- return eventSource.sourceId !== sourceId;
- });
- }
- function fetchDirtySources(sourceHash, fetchRange, calendar) {
- return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) {
- return isSourceDirty(eventSource, fetchRange, calendar);
- }), fetchRange, calendar);
- }
- function isSourceDirty(eventSource, fetchRange, calendar) {
- if (!doesSourceNeedRange(eventSource, calendar)) {
- return !eventSource.latestFetchId;
- }
- else {
- return !calendar.opt('lazyFetching') ||
- !eventSource.fetchRange ||
- eventSource.isFetching || // always cancel outdated in-progress fetches
- fetchRange.start < eventSource.fetchRange.start ||
- fetchRange.end > eventSource.fetchRange.end;
- }
- }
- function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, calendar) {
- var nextSources = {};
- for (var sourceId in prevSources) {
- var source = prevSources[sourceId];
- if (sourceIdHash[sourceId]) {
- nextSources[sourceId] = fetchSource(source, fetchRange, calendar);
- }
- else {
- nextSources[sourceId] = source;
- }
- }
- return nextSources;
- }
- function fetchSource(eventSource, fetchRange, calendar) {
- var sourceDef = calendar.pluginSystem.hooks.eventSourceDefs[eventSource.sourceDefId];
- var fetchId = String(uid$3++);
- sourceDef.fetch({
- eventSource: eventSource,
- calendar: calendar,
- range: fetchRange
- }, function (res) {
- var rawEvents = res.rawEvents;
- var calSuccess = calendar.opt('eventSourceSuccess');
- var calSuccessRes;
- var sourceSuccessRes;
- if (eventSource.success) {
- sourceSuccessRes = eventSource.success(rawEvents, res.xhr);
- }
- if (calSuccess) {
- calSuccessRes = calSuccess(rawEvents, res.xhr);
- }
- rawEvents = sourceSuccessRes || calSuccessRes || rawEvents;
- calendar.dispatch({
- type: 'RECEIVE_EVENTS',
- sourceId: eventSource.sourceId,
- fetchId: fetchId,
- fetchRange: fetchRange,
- rawEvents: rawEvents
- });
- }, function (error) {
- var callFailure = calendar.opt('eventSourceFailure');
- console.warn(error.message, error);
- if (eventSource.failure) {
- eventSource.failure(error);
- }
- if (callFailure) {
- callFailure(error);
- }
- calendar.dispatch({
- type: 'RECEIVE_EVENT_ERROR',
- sourceId: eventSource.sourceId,
- fetchId: fetchId,
- fetchRange: fetchRange,
- error: error
- });
- });
- return __assign({}, eventSource, { isFetching: true, latestFetchId: fetchId });
- }
- function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
- var _a;
- var eventSource = sourceHash[sourceId];
- if (eventSource && // not already removed
- fetchId === eventSource.latestFetchId) {
- return __assign({}, sourceHash, (_a = {}, _a[sourceId] = __assign({}, eventSource, { isFetching: false, fetchRange: fetchRange // also serves as a marker that at least one fetch has completed
- }), _a));
- }
- return sourceHash;
- }
- function excludeStaticSources(eventSources, calendar) {
- return filterHash(eventSources, function (eventSource) {
- return doesSourceNeedRange(eventSource, calendar);
- });
- }
-
- var DateProfileGenerator = /** @class */ (function () {
- function DateProfileGenerator(viewSpec, calendar) {
- this.viewSpec = viewSpec;
- this.options = viewSpec.options;
- this.dateEnv = calendar.dateEnv;
- this.calendar = calendar;
- this.initHiddenDays();
- }
- /* Date Range Computation
- ------------------------------------------------------------------------------------------------------------------*/
- // Builds a structure with info about what the dates/ranges will be for the "prev" view.
- DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate) {
- var dateEnv = this.dateEnv;
- var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
- currentDateProfile.dateIncrement);
- return this.build(prevDate, -1);
- };
- // Builds a structure with info about what the dates/ranges will be for the "next" view.
- DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate) {
- var dateEnv = this.dateEnv;
- var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
- currentDateProfile.dateIncrement);
- return this.build(nextDate, 1);
- };
- // Builds a structure holding dates/ranges for rendering around the given date.
- // Optional direction param indicates whether the date is being incremented/decremented
- // from its previous value. decremented = -1, incremented = 1 (default).
- DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) {
- if (forceToValid === void 0) { forceToValid = false; }
- var validRange;
- var minTime = null;
- var maxTime = null;
- var currentInfo;
- var isRangeAllDay;
- var renderRange;
- var activeRange;
- var isValid;
- validRange = this.buildValidRange();
- validRange = this.trimHiddenDays(validRange);
- if (forceToValid) {
- currentDate = constrainMarkerToRange(currentDate, validRange);
- }
- currentInfo = this.buildCurrentRangeInfo(currentDate, direction);
- isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);
- renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay);
- renderRange = this.trimHiddenDays(renderRange);
- activeRange = renderRange;
- if (!this.options.showNonCurrentDates) {
- activeRange = intersectRanges(activeRange, currentInfo.range);
- }
- minTime = createDuration(this.options.minTime);
- maxTime = createDuration(this.options.maxTime);
- activeRange = this.adjustActiveRange(activeRange, minTime, maxTime);
- activeRange = intersectRanges(activeRange, validRange); // might return null
- // it's invalid if the originally requested date is not contained,
- // or if the range is completely outside of the valid range.
- isValid = rangesIntersect(currentInfo.range, validRange);
- return {
- // constraint for where prev/next operations can go and where events can be dragged/resized to.
- // an object with optional start and end properties.
- validRange: validRange,
- // range the view is formally responsible for.
- // for example, a month view might have 1st-31st, excluding padded dates
- currentRange: currentInfo.range,
- // name of largest unit being displayed, like "month" or "week"
- currentRangeUnit: currentInfo.unit,
- isRangeAllDay: isRangeAllDay,
- // dates that display events and accept drag-n-drop
- // will be `null` if no dates accept events
- activeRange: activeRange,
- // date range with a rendered skeleton
- // includes not-active days that need some sort of DOM
- renderRange: renderRange,
- // Duration object that denotes the first visible time of any given day
- minTime: minTime,
- // Duration object that denotes the exclusive visible end time of any given day
- maxTime: maxTime,
- isValid: isValid,
- // how far the current date will move for a prev/next operation
- dateIncrement: this.buildDateIncrement(currentInfo.duration)
- // pass a fallback (might be null) ^
- };
- };
- // Builds an object with optional start/end properties.
- // Indicates the minimum/maximum dates to display.
- // not responsible for trimming hidden days.
- DateProfileGenerator.prototype.buildValidRange = function () {
- return this.getRangeOption('validRange', this.calendar.getNow()) ||
- { start: null, end: null }; // completely open-ended
- };
- // Builds a structure with info about the "current" range, the range that is
- // highlighted as being the current month for example.
- // See build() for a description of `direction`.
- // Guaranteed to have `range` and `unit` properties. `duration` is optional.
- DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {
- var _a = this, viewSpec = _a.viewSpec, dateEnv = _a.dateEnv;
- var duration = null;
- var unit = null;
- var range = null;
- var dayCount;
- if (viewSpec.duration) {
- duration = viewSpec.duration;
- unit = viewSpec.durationUnit;
- range = this.buildRangeFromDuration(date, direction, duration, unit);
- }
- else if ((dayCount = this.options.dayCount)) {
- unit = 'day';
- range = this.buildRangeFromDayCount(date, direction, dayCount);
- }
- else if ((range = this.buildCustomVisibleRange(date))) {
- unit = dateEnv.greatestWholeUnit(range.start, range.end).unit;
- }
- else {
- duration = this.getFallbackDuration();
- unit = greatestDurationDenominator(duration).unit;
- range = this.buildRangeFromDuration(date, direction, duration, unit);
- }
- return { duration: duration, unit: unit, range: range };
- };
- DateProfileGenerator.prototype.getFallbackDuration = function () {
- return createDuration({ day: 1 });
- };
- // Returns a new activeRange to have time values (un-ambiguate)
- // minTime or maxTime causes the range to expand.
- DateProfileGenerator.prototype.adjustActiveRange = function (range, minTime, maxTime) {
- var dateEnv = this.dateEnv;
- var start = range.start;
- var end = range.end;
- if (this.viewSpec.class.prototype.usesMinMaxTime) {
- // expand active range if minTime is negative (why not when positive?)
- if (asRoughDays(minTime) < 0) {
- start = startOfDay(start); // necessary?
- start = dateEnv.add(start, minTime);
- }
- // expand active range if maxTime is beyond one day (why not when positive?)
- if (asRoughDays(maxTime) > 1) {
- end = startOfDay(end); // necessary?
- end = addDays(end, -1);
- end = dateEnv.add(end, maxTime);
- }
- }
- return { start: start, end: end };
- };
- // Builds the "current" range when it is specified as an explicit duration.
- // `unit` is the already-computed greatestDurationDenominator unit of duration.
- DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {
- var dateEnv = this.dateEnv;
- var alignment = this.options.dateAlignment;
- var dateIncrementInput;
- var dateIncrementDuration;
- var start;
- var end;
- var res;
- // compute what the alignment should be
- if (!alignment) {
- dateIncrementInput = this.options.dateIncrement;
- if (dateIncrementInput) {
- dateIncrementDuration = createDuration(dateIncrementInput);
- // use the smaller of the two units
- if (asRoughMs(dateIncrementDuration) < asRoughMs(duration)) {
- alignment = greatestDurationDenominator(dateIncrementDuration, !getWeeksFromInput(dateIncrementInput)).unit;
- }
- else {
- alignment = unit;
- }
- }
- else {
- alignment = unit;
- }
- }
- // if the view displays a single day or smaller
- if (asRoughDays(duration) <= 1) {
- if (this.isHiddenDay(start)) {
- start = this.skipHiddenDays(start, direction);
- start = startOfDay(start);
- }
- }
- function computeRes() {
- start = dateEnv.startOf(date, alignment);
- end = dateEnv.add(start, duration);
- res = { start: start, end: end };
- }
- computeRes();
- // if range is completely enveloped by hidden days, go past the hidden days
- if (!this.trimHiddenDays(res)) {
- date = this.skipHiddenDays(date, direction);
- computeRes();
- }
- return res;
- };
- // Builds the "current" range when a dayCount is specified.
- DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {
- var dateEnv = this.dateEnv;
- var customAlignment = this.options.dateAlignment;
- var runningCount = 0;
- var start = date;
- var end;
- if (customAlignment) {
- start = dateEnv.startOf(start, customAlignment);
- }
- start = startOfDay(start);
- start = this.skipHiddenDays(start, direction);
- end = start;
- do {
- end = addDays(end, 1);
- if (!this.isHiddenDay(end)) {
- runningCount++;
- }
- } while (runningCount < dayCount);
- return { start: start, end: end };
- };
- // Builds a normalized range object for the "visible" range,
- // which is a way to define the currentRange and activeRange at the same time.
- DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {
- var dateEnv = this.dateEnv;
- var visibleRange = this.getRangeOption('visibleRange', dateEnv.toDate(date));
- if (visibleRange && (visibleRange.start == null || visibleRange.end == null)) {
- return null;
- }
- return visibleRange;
- };
- // Computes the range that will represent the element/cells for *rendering*,
- // but which may have voided days/times.
- // not responsible for trimming hidden days.
- DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
- return currentRange;
- };
- // Compute the duration value that should be added/substracted to the current date
- // when a prev/next operation happens.
- DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {
- var dateIncrementInput = this.options.dateIncrement;
- var customAlignment;
- if (dateIncrementInput) {
- return createDuration(dateIncrementInput);
- }
- else if ((customAlignment = this.options.dateAlignment)) {
- return createDuration(1, customAlignment);
- }
- else if (fallback) {
- return fallback;
- }
- else {
- return createDuration({ days: 1 });
- }
- };
- // Arguments after name will be forwarded to a hypothetical function value
- // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.
- // Always clone your objects if you fear mutation.
- DateProfileGenerator.prototype.getRangeOption = function (name) {
- var otherArgs = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- otherArgs[_i - 1] = arguments[_i];
- }
- var val = this.options[name];
- if (typeof val === 'function') {
- val = val.apply(null, otherArgs);
- }
- if (val) {
- val = parseRange(val, this.dateEnv);
- }
- if (val) {
- val = computeVisibleDayRange(val);
- }
- return val;
- };
- /* Hidden Days
- ------------------------------------------------------------------------------------------------------------------*/
- // Initializes internal variables related to calculating hidden days-of-week
- DateProfileGenerator.prototype.initHiddenDays = function () {
- var hiddenDays = this.options.hiddenDays || []; // array of day-of-week indices that are hidden
- var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)
- var dayCnt = 0;
- var i;
- if (this.options.weekends === false) {
- hiddenDays.push(0, 6); // 0=sunday, 6=saturday
- }
- for (i = 0; i < 7; i++) {
- if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) {
- dayCnt++;
- }
- }
- if (!dayCnt) {
- throw new Error('invalid hiddenDays'); // all days were hidden? bad.
- }
- this.isHiddenDayHash = isHiddenDayHash;
- };
- // Remove days from the beginning and end of the range that are computed as hidden.
- // If the whole range is trimmed off, returns null
- DateProfileGenerator.prototype.trimHiddenDays = function (range) {
- var start = range.start;
- var end = range.end;
- if (start) {
- start = this.skipHiddenDays(start);
- }
- if (end) {
- end = this.skipHiddenDays(end, -1, true);
- }
- if (start == null || end == null || start < end) {
- return { start: start, end: end };
- }
- return null;
- };
- // Is the current day hidden?
- // `day` is a day-of-week index (0-6), or a Date (used for UTC)
- DateProfileGenerator.prototype.isHiddenDay = function (day) {
- if (day instanceof Date) {
- day = day.getUTCDay();
- }
- return this.isHiddenDayHash[day];
- };
- // Incrementing the current day until it is no longer a hidden day, returning a copy.
- // DOES NOT CONSIDER validRange!
- // If the initial value of `date` is not a hidden day, don't do anything.
- // Pass `isExclusive` as `true` if you are dealing with an end date.
- // `inc` defaults to `1` (increment one day forward each time)
- DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) {
- if (inc === void 0) { inc = 1; }
- if (isExclusive === void 0) { isExclusive = false; }
- while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) {
- date = addDays(date, inc);
- }
- return date;
- };
- return DateProfileGenerator;
- }());
- // TODO: find a way to avoid comparing DateProfiles. it's tedious
- function isDateProfilesEqual(p0, p1) {
- return rangesEqual(p0.validRange, p1.validRange) &&
- rangesEqual(p0.activeRange, p1.activeRange) &&
- rangesEqual(p0.renderRange, p1.renderRange) &&
- durationsEqual(p0.minTime, p1.minTime) &&
- durationsEqual(p0.maxTime, p1.maxTime);
- /*
- TODO: compare more?
- currentRange: DateRange
- currentRangeUnit: string
- isRangeAllDay: boolean
- isValid: boolean
- dateIncrement: Duration
- */
- }
-
- function reduce (state, action, calendar) {
- var viewType = reduceViewType(state.viewType, action);
- var dateProfile = reduceDateProfile(state.dateProfile, action, state.currentDate, viewType, calendar);
- var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendar);
- var nextState = __assign({}, state, { viewType: viewType,
- dateProfile: dateProfile, currentDate: reduceCurrentDate(state.currentDate, action, dateProfile), eventSources: eventSources, eventStore: reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendar), dateSelection: reduceDateSelection(state.dateSelection, action, calendar), eventSelection: reduceSelectedEvent(state.eventSelection, action), eventDrag: reduceEventDrag(state.eventDrag, action, eventSources, calendar), eventResize: reduceEventResize(state.eventResize, action, eventSources, calendar), eventSourceLoadingLevel: computeLoadingLevel(eventSources), loadingLevel: computeLoadingLevel(eventSources) });
- for (var _i = 0, _a = calendar.pluginSystem.hooks.reducers; _i < _a.length; _i++) {
- var reducerFunc = _a[_i];
- nextState = reducerFunc(nextState, action, calendar);
- }
- // console.log(action.type, nextState)
- return nextState;
- }
- function reduceViewType(currentViewType, action) {
- switch (action.type) {
- case 'SET_VIEW_TYPE':
- return action.viewType;
- default:
- return currentViewType;
- }
- }
- function reduceDateProfile(currentDateProfile, action, currentDate, viewType, calendar) {
- var newDateProfile;
- switch (action.type) {
- case 'PREV':
- newDateProfile = calendar.dateProfileGenerators[viewType].buildPrev(currentDateProfile, currentDate);
- break;
- case 'NEXT':
- newDateProfile = calendar.dateProfileGenerators[viewType].buildNext(currentDateProfile, currentDate);
- break;
- case 'SET_DATE':
- if (!currentDateProfile.activeRange ||
- !rangeContainsMarker(currentDateProfile.currentRange, action.dateMarker)) {
- newDateProfile = calendar.dateProfileGenerators[viewType].build(action.dateMarker, undefined, true // forceToValid
- );
- }
- break;
- case 'SET_VIEW_TYPE':
- var generator = calendar.dateProfileGenerators[viewType];
- if (!generator) {
- throw new Error(viewType ?
- 'The FullCalendar view "' + viewType + '" does not exist. Make sure your plugins are loaded correctly.' :
- 'No available FullCalendar view plugins.');
- }
- newDateProfile = generator.build(action.dateMarker || currentDate, undefined, true // forceToValid
- );
- break;
- }
- if (newDateProfile &&
- newDateProfile.isValid &&
- !(currentDateProfile && isDateProfilesEqual(currentDateProfile, newDateProfile))) {
- return newDateProfile;
- }
- else {
- return currentDateProfile;
- }
- }
- function reduceCurrentDate(currentDate, action, dateProfile) {
- switch (action.type) {
- case 'PREV':
- case 'NEXT':
- if (!rangeContainsMarker(dateProfile.currentRange, currentDate)) {
- return dateProfile.currentRange.start;
- }
- else {
- return currentDate;
- }
- case 'SET_DATE':
- case 'SET_VIEW_TYPE':
- var newDate = action.dateMarker || currentDate;
- if (dateProfile.activeRange && !rangeContainsMarker(dateProfile.activeRange, newDate)) {
- return dateProfile.currentRange.start;
- }
- else {
- return newDate;
- }
- default:
- return currentDate;
- }
- }
- function reduceDateSelection(currentSelection, action, calendar) {
- switch (action.type) {
- case 'SELECT_DATES':
- return action.selection;
- case 'UNSELECT_DATES':
- return null;
- default:
- return currentSelection;
- }
- }
- function reduceSelectedEvent(currentInstanceId, action) {
- switch (action.type) {
- case 'SELECT_EVENT':
- return action.eventInstanceId;
- case 'UNSELECT_EVENT':
- return '';
- default:
- return currentInstanceId;
- }
- }
- function reduceEventDrag(currentDrag, action, sources, calendar) {
- switch (action.type) {
- case 'SET_EVENT_DRAG':
- var newDrag = action.state;
- return {
- affectedEvents: newDrag.affectedEvents,
- mutatedEvents: newDrag.mutatedEvents,
- isEvent: newDrag.isEvent,
- origSeg: newDrag.origSeg
- };
- case 'UNSET_EVENT_DRAG':
- return null;
- default:
- return currentDrag;
- }
- }
- function reduceEventResize(currentResize, action, sources, calendar) {
- switch (action.type) {
- case 'SET_EVENT_RESIZE':
- var newResize = action.state;
- return {
- affectedEvents: newResize.affectedEvents,
- mutatedEvents: newResize.mutatedEvents,
- isEvent: newResize.isEvent,
- origSeg: newResize.origSeg
- };
- case 'UNSET_EVENT_RESIZE':
- return null;
- default:
- return currentResize;
- }
- }
- function computeLoadingLevel(eventSources) {
- var cnt = 0;
- for (var sourceId in eventSources) {
- if (eventSources[sourceId].isFetching) {
- cnt++;
- }
- }
- return cnt;
- }
-
- var STANDARD_PROPS = {
- start: null,
- end: null,
- allDay: Boolean
- };
- function parseDateSpan(raw, dateEnv, defaultDuration) {
- var span = parseOpenDateSpan(raw, dateEnv);
- var range = span.range;
- if (!range.start) {
- return null;
- }
- if (!range.end) {
- if (defaultDuration == null) {
- return null;
- }
- else {
- range.end = dateEnv.add(range.start, defaultDuration);
- }
- }
- return span;
- }
- /*
- TODO: somehow combine with parseRange?
- Will return null if the start/end props were present but parsed invalidly.
- */
- function parseOpenDateSpan(raw, dateEnv) {
- var leftovers = {};
- var standardProps = refineProps(raw, STANDARD_PROPS, {}, leftovers);
- var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null;
- var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null;
- var allDay = standardProps.allDay;
- if (allDay == null) {
- allDay = (startMeta && startMeta.isTimeUnspecified) &&
- (!endMeta || endMeta.isTimeUnspecified);
- }
- // use this leftover object as the selection object
- leftovers.range = {
- start: startMeta ? startMeta.marker : null,
- end: endMeta ? endMeta.marker : null
- };
- leftovers.allDay = allDay;
- return leftovers;
- }
- function isDateSpansEqual(span0, span1) {
- return rangesEqual(span0.range, span1.range) &&
- span0.allDay === span1.allDay &&
- isSpanPropsEqual(span0, span1);
- }
- // the NON-DATE-RELATED props
- function isSpanPropsEqual(span0, span1) {
- for (var propName in span1) {
- if (propName !== 'range' && propName !== 'allDay') {
- if (span0[propName] !== span1[propName]) {
- return false;
- }
- }
- }
- // are there any props that span0 has that span1 DOESN'T have?
- // both have range/allDay, so no need to special-case.
- for (var propName in span0) {
- if (!(propName in span1)) {
- return false;
- }
- }
- return true;
- }
- function buildDateSpanApi(span, dateEnv) {
- return {
- start: dateEnv.toDate(span.range.start),
- end: dateEnv.toDate(span.range.end),
- startStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
- endStr: dateEnv.formatIso(span.range.end, { omitTime: span.allDay }),
- allDay: span.allDay
- };
- }
- function buildDatePointApi(span, dateEnv) {
- return {
- date: dateEnv.toDate(span.range.start),
- dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
- allDay: span.allDay
- };
- }
- function fabricateEventRange(dateSpan, eventUiBases, calendar) {
- var def = parseEventDef({ editable: false }, '', // sourceId
- dateSpan.allDay, true, // hasEnd
- calendar);
- return {
- def: def,
- ui: compileEventUi(def, eventUiBases),
- instance: createEventInstance(def.defId, dateSpan.range),
- range: dateSpan.range,
- isStart: true,
- isEnd: true
- };
- }
-
- function compileViewDefs(defaultConfigs, overrideConfigs) {
- var hash = {};
- var viewType;
- for (viewType in defaultConfigs) {
- ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- }
- for (viewType in overrideConfigs) {
- ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- }
- return hash;
- }
- function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
- if (hash[viewType]) {
- return hash[viewType];
- }
- var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- if (viewDef) {
- hash[viewType] = viewDef;
- }
- return viewDef;
- }
- function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
- var defaultConfig = defaultConfigs[viewType];
- var overrideConfig = overrideConfigs[viewType];
- var queryProp = function (name) {
- return (defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :
- ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null);
- };
- var theClass = queryProp('class');
- var superType = queryProp('superType');
- if (!superType && theClass) {
- superType =
- findViewNameBySubclass(theClass, overrideConfigs) ||
- findViewNameBySubclass(theClass, defaultConfigs);
- }
- var superDef = null;
- if (superType) {
- if (superType === viewType) {
- throw new Error('Can\'t have a custom view type that references itself');
- }
- superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
- }
- if (!theClass && superDef) {
- theClass = superDef.class;
- }
- if (!theClass) {
- return null; // don't throw a warning, might be settings for a single-unit view
- }
- return {
- type: viewType,
- class: theClass,
- defaults: __assign({}, (superDef ? superDef.defaults : {}), (defaultConfig ? defaultConfig.options : {})),
- overrides: __assign({}, (superDef ? superDef.overrides : {}), (overrideConfig ? overrideConfig.options : {}))
- };
- }
- function findViewNameBySubclass(viewSubclass, configs) {
- var superProto = Object.getPrototypeOf(viewSubclass.prototype);
- for (var viewType in configs) {
- var parsed = configs[viewType];
- // need DIRECT subclass, so instanceof won't do it
- if (parsed.class && parsed.class.prototype === superProto) {
- return viewType;
- }
- }
- return '';
- }
-
- function parseViewConfigs(inputs) {
- return mapHash(inputs, parseViewConfig);
- }
- var VIEW_DEF_PROPS = {
- type: String,
- class: null
- };
- function parseViewConfig(input) {
- if (typeof input === 'function') {
- input = { class: input };
- }
- var options = {};
- var props = refineProps(input, VIEW_DEF_PROPS, {}, options);
- return {
- superType: props.type,
- class: props.class,
- options: options
- };
- }
-
- function buildViewSpecs(defaultInputs, optionsManager) {
- var defaultConfigs = parseViewConfigs(defaultInputs);
- var overrideConfigs = parseViewConfigs(optionsManager.overrides.views);
- var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs);
- return mapHash(viewDefs, function (viewDef) {
- return buildViewSpec(viewDef, overrideConfigs, optionsManager);
- });
- }
- function buildViewSpec(viewDef, overrideConfigs, optionsManager) {
- var durationInput = viewDef.overrides.duration ||
- viewDef.defaults.duration ||
- optionsManager.dynamicOverrides.duration ||
- optionsManager.overrides.duration;
- var duration = null;
- var durationUnit = '';
- var singleUnit = '';
- var singleUnitOverrides = {};
- if (durationInput) {
- duration = createDuration(durationInput);
- if (duration) { // valid?
- var denom = greatestDurationDenominator(duration, !getWeeksFromInput(durationInput));
- durationUnit = denom.unit;
- if (denom.value === 1) {
- singleUnit = durationUnit;
- singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].options : {};
- }
- }
- }
- var queryButtonText = function (options) {
- var buttonTextMap = options.buttonText || {};
- var buttonTextKey = viewDef.defaults.buttonTextKey;
- if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) {
- return buttonTextMap[buttonTextKey];
- }
- if (buttonTextMap[viewDef.type] != null) {
- return buttonTextMap[viewDef.type];
- }
- if (buttonTextMap[singleUnit] != null) {
- return buttonTextMap[singleUnit];
- }
- };
- return {
- type: viewDef.type,
- class: viewDef.class,
- duration: duration,
- durationUnit: durationUnit,
- singleUnit: singleUnit,
- options: __assign({}, globalDefaults, viewDef.defaults, optionsManager.dirDefaults, optionsManager.localeDefaults, optionsManager.overrides, singleUnitOverrides, viewDef.overrides, optionsManager.dynamicOverrides),
- buttonTextOverride: queryButtonText(optionsManager.dynamicOverrides) ||
- queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence
- viewDef.overrides.buttonText,
- buttonTextDefault: queryButtonText(optionsManager.localeDefaults) ||
- queryButtonText(optionsManager.dirDefaults) ||
- viewDef.defaults.buttonText ||
- queryButtonText(globalDefaults) ||
- viewDef.type // fall back to given view name
- };
- }
-
- var Toolbar = /** @class */ (function (_super) {
- __extends(Toolbar, _super);
- function Toolbar(extraClassName) {
- var _this = _super.call(this) || this;
- _this._renderLayout = memoizeRendering(_this.renderLayout, _this.unrenderLayout);
- _this._updateTitle = memoizeRendering(_this.updateTitle, null, [_this._renderLayout]);
- _this._updateActiveButton = memoizeRendering(_this.updateActiveButton, null, [_this._renderLayout]);
- _this._updateToday = memoizeRendering(_this.updateToday, null, [_this._renderLayout]);
- _this._updatePrev = memoizeRendering(_this.updatePrev, null, [_this._renderLayout]);
- _this._updateNext = memoizeRendering(_this.updateNext, null, [_this._renderLayout]);
- _this.el = createElement('div', { className: 'fc-toolbar ' + extraClassName });
- return _this;
- }
- Toolbar.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this._renderLayout.unrender(); // should unrender everything else
- removeElement(this.el);
- };
- Toolbar.prototype.render = function (props) {
- this._renderLayout(props.layout);
- this._updateTitle(props.title);
- this._updateActiveButton(props.activeButton);
- this._updateToday(props.isTodayEnabled);
- this._updatePrev(props.isPrevEnabled);
- this._updateNext(props.isNextEnabled);
- };
- Toolbar.prototype.renderLayout = function (layout) {
- var el = this.el;
- this.viewsWithButtons = [];
- appendToElement(el, this.renderSection('left', layout.left));
- appendToElement(el, this.renderSection('center', layout.center));
- appendToElement(el, this.renderSection('right', layout.right));
- };
- Toolbar.prototype.unrenderLayout = function () {
- this.el.innerHTML = '';
- };
- Toolbar.prototype.renderSection = function (position, buttonStr) {
- var _this = this;
- var _a = this.context, theme = _a.theme, calendar = _a.calendar;
- var optionsManager = calendar.optionsManager;
- var viewSpecs = calendar.viewSpecs;
- var sectionEl = createElement('div', { className: 'fc-' + position });
- var calendarCustomButtons = optionsManager.computed.customButtons || {};
- var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {};
- var calendarButtonText = optionsManager.computed.buttonText || {};
- if (buttonStr) {
- buttonStr.split(' ').forEach(function (buttonGroupStr, i) {
- var groupChildren = [];
- var isOnlyButtons = true;
- var groupEl;
- buttonGroupStr.split(',').forEach(function (buttonName, j) {
- var customButtonProps;
- var viewSpec;
- var buttonClick;
- var buttonIcon; // only one of these will be set
- var buttonText; // "
- var buttonInnerHtml;
- var buttonClasses;
- var buttonEl;
- var buttonAriaAttr;
- if (buttonName === 'title') {
- groupChildren.push(htmlToElement('<h2>&nbsp;</h2>')); // we always want it to take up height
- isOnlyButtons = false;
- }
- else {
- if ((customButtonProps = calendarCustomButtons[buttonName])) {
- buttonClick = function (ev) {
- if (customButtonProps.click) {
- customButtonProps.click.call(buttonEl, ev);
- }
- };
- (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||
- (buttonIcon = theme.getIconClass(buttonName)) ||
- (buttonText = customButtonProps.text);
- }
- else if ((viewSpec = viewSpecs[buttonName])) {
- _this.viewsWithButtons.push(buttonName);
- buttonClick = function () {
- calendar.changeView(buttonName);
- };
- (buttonText = viewSpec.buttonTextOverride) ||
- (buttonIcon = theme.getIconClass(buttonName)) ||
- (buttonText = viewSpec.buttonTextDefault);
- }
- else if (calendar[buttonName]) { // a calendar method
- buttonClick = function () {
- calendar[buttonName]();
- };
- (buttonText = calendarButtonTextOverrides[buttonName]) ||
- (buttonIcon = theme.getIconClass(buttonName)) ||
- (buttonText = calendarButtonText[buttonName]);
- // ^ everything else is considered default
- }
- if (buttonClick) {
- buttonClasses = [
- 'fc-' + buttonName + '-button',
- theme.getClass('button')
- ];
- if (buttonText) {
- buttonInnerHtml = htmlEscape(buttonText);
- buttonAriaAttr = '';
- }
- else if (buttonIcon) {
- buttonInnerHtml = "<span class='" + buttonIcon + "'></span>";
- buttonAriaAttr = ' aria-label="' + buttonName + '"';
- }
- buttonEl = htmlToElement(// type="button" so that it doesn't submit a form
- '<button type="button" class="' + buttonClasses.join(' ') + '"' +
- buttonAriaAttr +
- '>' + buttonInnerHtml + '</button>');
- buttonEl.addEventListener('click', buttonClick);
- groupChildren.push(buttonEl);
- }
- }
- });
- if (groupChildren.length > 1) {
- groupEl = document.createElement('div');
- var buttonGroupClassName = theme.getClass('buttonGroup');
- if (isOnlyButtons && buttonGroupClassName) {
- groupEl.classList.add(buttonGroupClassName);
- }
- appendToElement(groupEl, groupChildren);
- sectionEl.appendChild(groupEl);
- }
- else {
- appendToElement(sectionEl, groupChildren); // 1 or 0 children
- }
- });
- }
- return sectionEl;
- };
- Toolbar.prototype.updateToday = function (isTodayEnabled) {
- this.toggleButtonEnabled('today', isTodayEnabled);
- };
- Toolbar.prototype.updatePrev = function (isPrevEnabled) {
- this.toggleButtonEnabled('prev', isPrevEnabled);
- };
- Toolbar.prototype.updateNext = function (isNextEnabled) {
- this.toggleButtonEnabled('next', isNextEnabled);
- };
- Toolbar.prototype.updateTitle = function (text) {
- findElements(this.el, 'h2').forEach(function (titleEl) {
- titleEl.innerText = text;
- });
- };
- Toolbar.prototype.updateActiveButton = function (buttonName) {
- var theme = this.context.theme;
- var className = theme.getClass('buttonActive');
- findElements(this.el, 'button').forEach(function (buttonEl) {
- if (buttonName && buttonEl.classList.contains('fc-' + buttonName + '-button')) {
- buttonEl.classList.add(className);
- }
- else {
- buttonEl.classList.remove(className);
- }
- });
- };
- Toolbar.prototype.toggleButtonEnabled = function (buttonName, bool) {
- findElements(this.el, '.fc-' + buttonName + '-button').forEach(function (buttonEl) {
- buttonEl.disabled = !bool;
- });
- };
- return Toolbar;
- }(Component));
-
- var CalendarComponent = /** @class */ (function (_super) {
- __extends(CalendarComponent, _super);
- function CalendarComponent(el) {
- var _this = _super.call(this) || this;
- _this.elClassNames = [];
- _this.renderSkeleton = memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
- _this.renderToolbars = memoizeRendering(_this._renderToolbars, _this._unrenderToolbars, [_this.renderSkeleton]);
- _this.buildComponentContext = memoize(buildComponentContext);
- _this.buildViewPropTransformers = memoize(buildViewPropTransformers);
- _this.el = el;
- _this.computeTitle = memoize(computeTitle);
- _this.parseBusinessHours = memoize(function (input) {
- return parseBusinessHours(input, _this.context.calendar);
- });
- return _this;
- }
- CalendarComponent.prototype.render = function (props, context) {
- this.freezeHeight();
- var title = this.computeTitle(props.dateProfile, props.viewSpec.options);
- this.renderSkeleton(context);
- this.renderToolbars(props.viewSpec, props.dateProfile, props.currentDate, title);
- this.renderView(props, title);
- this.updateSize();
- this.thawHeight();
- };
- CalendarComponent.prototype.destroy = function () {
- if (this.header) {
- this.header.destroy();
- }
- if (this.footer) {
- this.footer.destroy();
- }
- this.renderSkeleton.unrender(); // will call destroyView
- _super.prototype.destroy.call(this);
- };
- CalendarComponent.prototype._renderSkeleton = function (context) {
- this.updateElClassNames(context);
- prependToElement(this.el, this.contentEl = createElement('div', { className: 'fc-view-container' }));
- var calendar = context.calendar;
- for (var _i = 0, _a = calendar.pluginSystem.hooks.viewContainerModifiers; _i < _a.length; _i++) {
- var modifyViewContainer = _a[_i];
- modifyViewContainer(this.contentEl, calendar);
- }
- };
- CalendarComponent.prototype._unrenderSkeleton = function () {
- // weird to have this here
- if (this.view) {
- this.savedScroll = this.view.queryScroll();
- this.view.destroy();
- this.view = null;
- }
- removeElement(this.contentEl);
- this.removeElClassNames();
- };
- CalendarComponent.prototype.removeElClassNames = function () {
- var classList = this.el.classList;
- for (var _i = 0, _a = this.elClassNames; _i < _a.length; _i++) {
- var className = _a[_i];
- classList.remove(className);
- }
- this.elClassNames = [];
- };
- CalendarComponent.prototype.updateElClassNames = function (context) {
- this.removeElClassNames();
- var theme = context.theme, options = context.options;
- this.elClassNames = [
- 'fc',
- 'fc-' + options.dir,
- theme.getClass('widget')
- ];
- var classList = this.el.classList;
- for (var _i = 0, _a = this.elClassNames; _i < _a.length; _i++) {
- var className = _a[_i];
- classList.add(className);
- }
- };
- CalendarComponent.prototype._renderToolbars = function (viewSpec, dateProfile, currentDate, title) {
- var _a = this, context = _a.context, header = _a.header, footer = _a.footer;
- var options = context.options, calendar = context.calendar;
- var headerLayout = options.header;
- var footerLayout = options.footer;
- var dateProfileGenerator = this.props.dateProfileGenerator;
- var now = calendar.getNow();
- var todayInfo = dateProfileGenerator.build(now);
- var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate);
- var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate);
- var toolbarProps = {
- title: title,
- activeButton: viewSpec.type,
- isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now),
- isPrevEnabled: prevInfo.isValid,
- isNextEnabled: nextInfo.isValid
- };
- if (headerLayout) {
- if (!header) {
- header = this.header = new Toolbar('fc-header-toolbar');
- prependToElement(this.el, header.el);
- }
- header.receiveProps(__assign({ layout: headerLayout }, toolbarProps), context);
- }
- else if (header) {
- header.destroy();
- header = this.header = null;
- }
- if (footerLayout) {
- if (!footer) {
- footer = this.footer = new Toolbar('fc-footer-toolbar');
- appendToElement(this.el, footer.el);
- }
- footer.receiveProps(__assign({ layout: footerLayout }, toolbarProps), context);
- }
- else if (footer) {
- footer.destroy();
- footer = this.footer = null;
- }
- };
- CalendarComponent.prototype._unrenderToolbars = function () {
- if (this.header) {
- this.header.destroy();
- this.header = null;
- }
- if (this.footer) {
- this.footer.destroy();
- this.footer = null;
- }
- };
- CalendarComponent.prototype.renderView = function (props, title) {
- var view = this.view;
- var _a = this.context, calendar = _a.calendar, options = _a.options;
- var viewSpec = props.viewSpec, dateProfileGenerator = props.dateProfileGenerator;
- if (!view || view.viewSpec !== viewSpec) {
- if (view) {
- view.destroy();
- }
- view = this.view = new viewSpec['class'](viewSpec, this.contentEl);
- if (this.savedScroll) {
- view.addScroll(this.savedScroll, true);
- this.savedScroll = null;
- }
- }
- view.title = title; // for the API
- var viewProps = {
- dateProfileGenerator: dateProfileGenerator,
- dateProfile: props.dateProfile,
- businessHours: this.parseBusinessHours(viewSpec.options.businessHours),
- eventStore: props.eventStore,
- eventUiBases: props.eventUiBases,
- dateSelection: props.dateSelection,
- eventSelection: props.eventSelection,
- eventDrag: props.eventDrag,
- eventResize: props.eventResize
- };
- var transformers = this.buildViewPropTransformers(calendar.pluginSystem.hooks.viewPropsTransformers);
- for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
- var transformer = transformers_1[_i];
- __assign(viewProps, transformer.transform(viewProps, viewSpec, props, options));
- }
- view.receiveProps(viewProps, this.buildComponentContext(this.context, viewSpec, view));
- };
- // Sizing
- // -----------------------------------------------------------------------------------------------------------------
- CalendarComponent.prototype.updateSize = function (isResize) {
- if (isResize === void 0) { isResize = false; }
- var view = this.view;
- if (!view) {
- return; // why?
- }
- if (isResize || this.isHeightAuto == null) {
- this.computeHeightVars();
- }
- view.updateSize(isResize, this.viewHeight, this.isHeightAuto);
- view.updateNowIndicator(); // we need to guarantee this will run after updateSize
- view.popScroll(isResize);
- };
- CalendarComponent.prototype.computeHeightVars = function () {
- var calendar = this.context.calendar; // yuck. need to handle dynamic options
- var heightInput = calendar.opt('height');
- var contentHeightInput = calendar.opt('contentHeight');
- this.isHeightAuto = heightInput === 'auto' || contentHeightInput === 'auto';
- if (typeof contentHeightInput === 'number') { // exists and not 'auto'
- this.viewHeight = contentHeightInput;
- }
- else if (typeof contentHeightInput === 'function') { // exists and is a function
- this.viewHeight = contentHeightInput();
- }
- else if (typeof heightInput === 'number') { // exists and not 'auto'
- this.viewHeight = heightInput - this.queryToolbarsHeight();
- }
- else if (typeof heightInput === 'function') { // exists and is a function
- this.viewHeight = heightInput() - this.queryToolbarsHeight();
- }
- else if (heightInput === 'parent') { // set to height of parent element
- var parentEl = this.el.parentNode;
- this.viewHeight = parentEl.getBoundingClientRect().height - this.queryToolbarsHeight();
- }
- else {
- this.viewHeight = Math.round(this.contentEl.getBoundingClientRect().width /
- Math.max(calendar.opt('aspectRatio'), .5));
- }
- };
- CalendarComponent.prototype.queryToolbarsHeight = function () {
- var height = 0;
- if (this.header) {
- height += computeHeightAndMargins(this.header.el);
- }
- if (this.footer) {
- height += computeHeightAndMargins(this.footer.el);
- }
- return height;
- };
- // Height "Freezing"
- // -----------------------------------------------------------------------------------------------------------------
- CalendarComponent.prototype.freezeHeight = function () {
- applyStyle(this.el, {
- height: this.el.getBoundingClientRect().height,
- overflow: 'hidden'
- });
- };
- CalendarComponent.prototype.thawHeight = function () {
- applyStyle(this.el, {
- height: '',
- overflow: ''
- });
- };
- return CalendarComponent;
- }(Component));
- // Title and Date Formatting
- // -----------------------------------------------------------------------------------------------------------------
- // Computes what the title at the top of the calendar should be for this view
- function computeTitle(dateProfile, viewOptions) {
- var range;
- // for views that span a large unit of time, show the proper interval, ignoring stray days before and after
- if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {
- range = dateProfile.currentRange;
- }
- else { // for day units or smaller, use the actual day range
- range = dateProfile.activeRange;
- }
- return this.context.dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || computeTitleFormat(dateProfile), viewOptions.titleRangeSeparator), { isEndExclusive: dateProfile.isRangeAllDay });
- }
- // Generates the format string that should be used to generate the title for the current date range.
- // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.
- function computeTitleFormat(dateProfile) {
- var currentRangeUnit = dateProfile.currentRangeUnit;
- if (currentRangeUnit === 'year') {
- return { year: 'numeric' };
- }
- else if (currentRangeUnit === 'month') {
- return { year: 'numeric', month: 'long' }; // like "September 2014"
- }
- else {
- var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end);
- if (days !== null && days > 1) {
- // multi-day range. shorter, like "Sep 9 - 10 2014"
- return { year: 'numeric', month: 'short', day: 'numeric' };
- }
- else {
- // one day. longer, like "September 9 2014"
- return { year: 'numeric', month: 'long', day: 'numeric' };
- }
- }
- }
- // build a context scoped to the view
- function buildComponentContext(context, viewSpec, view) {
- return context.extend(viewSpec.options, view);
- }
- // Plugin
- // -----------------------------------------------------------------------------------------------------------------
- function buildViewPropTransformers(theClasses) {
- return theClasses.map(function (theClass) {
- return new theClass();
- });
- }
-
- var Interaction = /** @class */ (function () {
- function Interaction(settings) {
- this.component = settings.component;
- }
- Interaction.prototype.destroy = function () {
- };
- return Interaction;
- }());
- function parseInteractionSettings(component, input) {
- return {
- component: component,
- el: input.el,
- useEventCenter: input.useEventCenter != null ? input.useEventCenter : true
- };
- }
- function interactionSettingsToStore(settings) {
- var _a;
- return _a = {},
- _a[settings.component.uid] = settings,
- _a;
- }
- // global state
- var interactionSettingsStore = {};
-
- /*
- Detects when the user clicks on an event within a DateComponent
- */
- var EventClicking = /** @class */ (function (_super) {
- __extends(EventClicking, _super);
- function EventClicking(settings) {
- var _this = _super.call(this, settings) || this;
- _this.handleSegClick = function (ev, segEl) {
- var component = _this.component;
- var _a = component.context, calendar = _a.calendar, view = _a.view;
- var seg = getElSeg(segEl);
- if (seg && // might be the <div> surrounding the more link
- component.isValidSegDownEl(ev.target)) {
- // our way to simulate a link click for elements that can't be <a> tags
- // grab before trigger fired in case trigger trashes DOM thru rerendering
- var hasUrlContainer = elementClosest(ev.target, '.fc-has-url');
- var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : '';
- calendar.publiclyTrigger('eventClick', [
- {
- el: segEl,
- event: new EventApi(component.context.calendar, seg.eventRange.def, seg.eventRange.instance),
- jsEvent: ev,
- view: view
- }
- ]);
- if (url && !ev.defaultPrevented) {
- window.location.href = url;
- }
- }
- };
- var component = settings.component;
- _this.destroy = listenBySelector(component.el, 'click', component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegClick);
- return _this;
- }
- return EventClicking;
- }(Interaction));
-
- /*
- Triggers events and adds/removes core classNames when the user's pointer
- enters/leaves event-elements of a component.
- */
- var EventHovering = /** @class */ (function (_super) {
- __extends(EventHovering, _super);
- function EventHovering(settings) {
- var _this = _super.call(this, settings) || this;
- // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it
- _this.handleEventElRemove = function (el) {
- if (el === _this.currentSegEl) {
- _this.handleSegLeave(null, _this.currentSegEl);
- }
- };
- _this.handleSegEnter = function (ev, segEl) {
- if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper
- segEl.classList.add('fc-allow-mouse-resize');
- _this.currentSegEl = segEl;
- _this.triggerEvent('eventMouseEnter', ev, segEl);
- }
- };
- _this.handleSegLeave = function (ev, segEl) {
- if (_this.currentSegEl) {
- segEl.classList.remove('fc-allow-mouse-resize');
- _this.currentSegEl = null;
- _this.triggerEvent('eventMouseLeave', ev, segEl);
- }
- };
- var component = settings.component;
- _this.removeHoverListeners = listenToHoverBySelector(component.el, component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegEnter, _this.handleSegLeave);
- // how to make sure component already has context?
- component.context.calendar.on('eventElRemove', _this.handleEventElRemove);
- return _this;
- }
- EventHovering.prototype.destroy = function () {
- this.removeHoverListeners();
- this.component.context.calendar.off('eventElRemove', this.handleEventElRemove);
- };
- EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) {
- var component = this.component;
- var _a = component.context, calendar = _a.calendar, view = _a.view;
- var seg = getElSeg(segEl);
- if (!ev || component.isValidSegDownEl(ev.target)) {
- calendar.publiclyTrigger(publicEvName, [
- {
- el: segEl,
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- jsEvent: ev,
- view: view
- }
- ]);
- }
- };
- return EventHovering;
- }(Interaction));
-
- var StandardTheme = /** @class */ (function (_super) {
- __extends(StandardTheme, _super);
- function StandardTheme() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- return StandardTheme;
- }(Theme));
- StandardTheme.prototype.classes = {
- widget: 'fc-unthemed',
- widgetHeader: 'fc-widget-header',
- widgetContent: 'fc-widget-content',
- buttonGroup: 'fc-button-group',
- button: 'fc-button fc-button-primary',
- buttonActive: 'fc-button-active',
- popoverHeader: 'fc-widget-header',
- popoverContent: 'fc-widget-content',
- // day grid
- headerRow: 'fc-widget-header',
- dayRow: 'fc-widget-content',
- // list view
- listView: 'fc-widget-content'
- };
- StandardTheme.prototype.baseIconClass = 'fc-icon';
- StandardTheme.prototype.iconClasses = {
- close: 'fc-icon-x',
- prev: 'fc-icon-chevron-left',
- next: 'fc-icon-chevron-right',
- prevYear: 'fc-icon-chevrons-left',
- nextYear: 'fc-icon-chevrons-right'
- };
- StandardTheme.prototype.iconOverrideOption = 'buttonIcons';
- StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
- StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
-
- var Calendar = /** @class */ (function () {
- function Calendar(el, overrides) {
- var _this = this;
- this.buildComponentContext = memoize(buildComponentContext$1);
- this.parseRawLocales = memoize(parseRawLocales);
- this.buildLocale = memoize(buildLocale);
- this.buildDateEnv = memoize(buildDateEnv);
- this.buildTheme = memoize(buildTheme);
- this.buildEventUiSingleBase = memoize(this._buildEventUiSingleBase);
- this.buildSelectionConfig = memoize(this._buildSelectionConfig);
- this.buildEventUiBySource = memoizeOutput(buildEventUiBySource, isPropsEqual);
- this.buildEventUiBases = memoize(buildEventUiBases);
- this.interactionsStore = {};
- this.actionQueue = [];
- this.isReducing = false;
- // isDisplaying: boolean = false // installed in DOM? accepting renders?
- this.needsRerender = false; // needs a render?
- this.isRendering = false; // currently in the executeRender function?
- this.renderingPauseDepth = 0;
- this.buildDelayedRerender = memoize(buildDelayedRerender);
- this.afterSizingTriggers = {};
- this.isViewUpdated = false;
- this.isDatesUpdated = false;
- this.isEventsUpdated = false;
- this.el = el;
- this.optionsManager = new OptionsManager(overrides || {});
- this.pluginSystem = new PluginSystem();
- // only do once. don't do in handleOptions. because can't remove plugins
- this.addPluginInputs(this.optionsManager.computed.plugins || []);
- this.handleOptions(this.optionsManager.computed);
- this.publiclyTrigger('_init'); // for tests
- this.hydrate();
- this.calendarInteractions = this.pluginSystem.hooks.calendarInteractions
- .map(function (calendarInteractionClass) {
- return new calendarInteractionClass(_this);
- });
- }
- Calendar.prototype.addPluginInputs = function (pluginInputs) {
- var pluginDefs = refinePluginDefs(pluginInputs);
- for (var _i = 0, pluginDefs_1 = pluginDefs; _i < pluginDefs_1.length; _i++) {
- var pluginDef = pluginDefs_1[_i];
- this.pluginSystem.add(pluginDef);
- }
- };
- Object.defineProperty(Calendar.prototype, "view", {
- // public API
- get: function () {
- return this.component ? this.component.view : null;
- },
- enumerable: true,
- configurable: true
- });
- // Public API for rendering
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.render = function () {
- if (!this.component) {
- this.component = new CalendarComponent(this.el);
- this.renderableEventStore = createEmptyEventStore();
- this.bindHandlers();
- this.executeRender();
- }
- else {
- this.requestRerender();
- }
- };
- Calendar.prototype.destroy = function () {
- if (this.component) {
- this.unbindHandlers();
- this.component.destroy(); // don't null-out. in case API needs access
- this.component = null; // umm ???
- for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) {
- var interaction = _a[_i];
- interaction.destroy();
- }
- this.publiclyTrigger('_destroyed');
- }
- };
- // Handlers
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.bindHandlers = function () {
- var _this = this;
- // event delegation for nav links
- this.removeNavLinkListener = listenBySelector(this.el, 'click', 'a[data-goto]', function (ev, anchorEl) {
- var gotoOptions = anchorEl.getAttribute('data-goto');
- gotoOptions = gotoOptions ? JSON.parse(gotoOptions) : {};
- var dateEnv = _this.dateEnv;
- var dateMarker = dateEnv.createMarker(gotoOptions.date);
- var viewType = gotoOptions.type;
- // property like "navLinkDayClick". might be a string or a function
- var customAction = _this.viewOpt('navLink' + capitaliseFirstLetter(viewType) + 'Click');
- if (typeof customAction === 'function') {
- customAction(dateEnv.toDate(dateMarker), ev);
- }
- else {
- if (typeof customAction === 'string') {
- viewType = customAction;
- }
- _this.zoomTo(dateMarker, viewType);
- }
- });
- if (this.opt('handleWindowResize')) {
- window.addEventListener('resize', this.windowResizeProxy = debounce(// prevents rapid calls
- this.windowResize.bind(this), this.opt('windowResizeDelay')));
- }
- };
- Calendar.prototype.unbindHandlers = function () {
- this.removeNavLinkListener();
- if (this.windowResizeProxy) {
- window.removeEventListener('resize', this.windowResizeProxy);
- this.windowResizeProxy = null;
- }
- };
- // Dispatcher
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.hydrate = function () {
- var _this = this;
- this.state = this.buildInitialState();
- var rawSources = this.opt('eventSources') || [];
- var singleRawSource = this.opt('events');
- var sources = []; // parsed
- if (singleRawSource) {
- rawSources.unshift(singleRawSource);
- }
- for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) {
- var rawSource = rawSources_1[_i];
- var source = parseEventSource(rawSource, this);
- if (source) {
- sources.push(source);
- }
- }
- this.batchRendering(function () {
- _this.dispatch({ type: 'INIT' }); // pass in sources here?
- _this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: sources });
- _this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: _this.opt('defaultView') || _this.pluginSystem.hooks.defaultView
- });
- });
- };
- Calendar.prototype.buildInitialState = function () {
- return {
- viewType: null,
- loadingLevel: 0,
- eventSourceLoadingLevel: 0,
- currentDate: this.getInitialDate(),
- dateProfile: null,
- eventSources: {},
- eventStore: createEmptyEventStore(),
- dateSelection: null,
- eventSelection: '',
- eventDrag: null,
- eventResize: null
- };
- };
- Calendar.prototype.dispatch = function (action) {
- this.actionQueue.push(action);
- if (!this.isReducing) {
- this.isReducing = true;
- var oldState = this.state;
- while (this.actionQueue.length) {
- this.state = this.reduce(this.state, this.actionQueue.shift(), this);
- }
- var newState = this.state;
- this.isReducing = false;
- if (!oldState.loadingLevel && newState.loadingLevel) {
- this.publiclyTrigger('loading', [true]);
- }
- else if (oldState.loadingLevel && !newState.loadingLevel) {
- this.publiclyTrigger('loading', [false]);
- }
- var view = this.component && this.component.view;
- if (oldState.eventStore !== newState.eventStore) {
- if (oldState.eventStore) {
- this.isEventsUpdated = true;
- }
- }
- if (oldState.dateProfile !== newState.dateProfile) {
- if (oldState.dateProfile && view) { // why would view be null!?
- this.publiclyTrigger('datesDestroy', [
- {
- view: view,
- el: view.el
- }
- ]);
- }
- this.isDatesUpdated = true;
- }
- if (oldState.viewType !== newState.viewType) {
- if (oldState.viewType && view) { // why would view be null!?
- this.publiclyTrigger('viewSkeletonDestroy', [
- {
- view: view,
- el: view.el
- }
- ]);
- }
- this.isViewUpdated = true;
- }
- this.requestRerender();
- }
- };
- Calendar.prototype.reduce = function (state, action, calendar) {
- return reduce(state, action, calendar);
- };
- // Render Queue
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.requestRerender = function () {
- this.needsRerender = true;
- this.delayedRerender(); // will call a debounced-version of tryRerender
- };
- Calendar.prototype.tryRerender = function () {
- if (this.component && // must be accepting renders
- this.needsRerender && // indicates that a rerender was requested
- !this.renderingPauseDepth && // not paused
- !this.isRendering // not currently in the render loop
- ) {
- this.executeRender();
- }
- };
- Calendar.prototype.batchRendering = function (func) {
- this.renderingPauseDepth++;
- func();
- this.renderingPauseDepth--;
- if (this.needsRerender) {
- this.requestRerender();
- }
- };
- // Rendering
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.executeRender = function () {
- // clear these BEFORE the render so that new values will accumulate during render
- this.needsRerender = false;
- this.isRendering = true;
- this.renderComponent();
- this.isRendering = false;
- // received a rerender request while rendering
- if (this.needsRerender) {
- this.delayedRerender();
- }
- };
- /*
- don't call this directly. use executeRender instead
- */
- Calendar.prototype.renderComponent = function () {
- var _a = this, state = _a.state, component = _a.component;
- var viewType = state.viewType;
- var viewSpec = this.viewSpecs[viewType];
- if (!viewSpec) {
- throw new Error("View type \"" + viewType + "\" is not valid");
- }
- // if event sources are still loading and progressive rendering hasn't been enabled,
- // keep rendering the last fully loaded set of events
- var renderableEventStore = this.renderableEventStore =
- (state.eventSourceLoadingLevel && !this.opt('progressiveEventRendering')) ?
- this.renderableEventStore :
- state.eventStore;
- var eventUiSingleBase = this.buildEventUiSingleBase(viewSpec.options);
- var eventUiBySource = this.buildEventUiBySource(state.eventSources);
- var eventUiBases = this.eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource);
- component.receiveProps(__assign({}, state, { viewSpec: viewSpec, dateProfileGenerator: this.dateProfileGenerators[viewType], dateProfile: state.dateProfile, eventStore: renderableEventStore, eventUiBases: eventUiBases, dateSelection: state.dateSelection, eventSelection: state.eventSelection, eventDrag: state.eventDrag, eventResize: state.eventResize }), this.buildComponentContext(this.theme, this.dateEnv, this.optionsManager.computed));
- if (this.isViewUpdated) {
- this.isViewUpdated = false;
- this.publiclyTrigger('viewSkeletonRender', [
- {
- view: component.view,
- el: component.view.el
- }
- ]);
- }
- if (this.isDatesUpdated) {
- this.isDatesUpdated = false;
- this.publiclyTrigger('datesRender', [
- {
- view: component.view,
- el: component.view.el
- }
- ]);
- }
- if (this.isEventsUpdated) {
- this.isEventsUpdated = false;
- }
- this.releaseAfterSizingTriggers();
- };
- // Options
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.setOption = function (name, val) {
- var _a;
- this.mutateOptions((_a = {}, _a[name] = val, _a), [], true);
- };
- Calendar.prototype.getOption = function (name) {
- return this.optionsManager.computed[name];
- };
- Calendar.prototype.opt = function (name) {
- return this.optionsManager.computed[name];
- };
- Calendar.prototype.viewOpt = function (name) {
- return this.viewOpts()[name];
- };
- Calendar.prototype.viewOpts = function () {
- return this.viewSpecs[this.state.viewType].options;
- };
- /*
- handles option changes (like a diff)
- */
- Calendar.prototype.mutateOptions = function (updates, removals, isDynamic, deepEqual) {
- var _this = this;
- var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers;
- var normalUpdates = {};
- var specialUpdates = {};
- var oldDateEnv = this.dateEnv; // do this before handleOptions
- var isTimeZoneDirty = false;
- var isSizeDirty = false;
- var anyDifficultOptions = Boolean(removals.length);
- for (var name_1 in updates) {
- if (changeHandlers[name_1]) {
- specialUpdates[name_1] = updates[name_1];
- }
- else {
- normalUpdates[name_1] = updates[name_1];
- }
- }
- for (var name_2 in normalUpdates) {
- if (/^(height|contentHeight|aspectRatio)$/.test(name_2)) {
- isSizeDirty = true;
- }
- else if (/^(defaultDate|defaultView)$/.test(name_2)) ;
- else {
- anyDifficultOptions = true;
- if (name_2 === 'timeZone') {
- isTimeZoneDirty = true;
- }
- }
- }
- this.optionsManager.mutate(normalUpdates, removals, isDynamic);
- if (anyDifficultOptions) {
- this.handleOptions(this.optionsManager.computed);
- }
- this.batchRendering(function () {
- if (anyDifficultOptions) {
- if (isTimeZoneDirty) {
- _this.dispatch({
- type: 'CHANGE_TIMEZONE',
- oldDateEnv: oldDateEnv
- });
- }
- /* HACK
- has the same effect as calling this.requestRerender()
- but recomputes the state's dateProfile
- */
- _this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: _this.state.viewType
- });
- }
- else if (isSizeDirty) {
- _this.updateSize();
- }
- // special updates
- if (deepEqual) {
- for (var name_3 in specialUpdates) {
- changeHandlers[name_3](specialUpdates[name_3], _this, deepEqual);
- }
- }
- });
- };
- /*
- rebuilds things based off of a complete set of refined options
- */
- Calendar.prototype.handleOptions = function (options) {
- var _this = this;
- var pluginHooks = this.pluginSystem.hooks;
- this.defaultAllDayEventDuration = createDuration(options.defaultAllDayEventDuration);
- this.defaultTimedEventDuration = createDuration(options.defaultTimedEventDuration);
- this.delayedRerender = this.buildDelayedRerender(options.rerenderDelay);
- this.theme = this.buildTheme(options);
- var available = this.parseRawLocales(options.locales);
- this.availableRawLocales = available.map;
- var locale = this.buildLocale(options.locale || available.defaultCode, available.map);
- this.dateEnv = this.buildDateEnv(locale, options.timeZone, pluginHooks.namedTimeZonedImpl, options.firstDay, options.weekNumberCalculation, options.weekLabel, pluginHooks.cmdFormatter);
- this.selectionConfig = this.buildSelectionConfig(options); // needs dateEnv. do after :(
- // ineffecient to do every time?
- this.viewSpecs = buildViewSpecs(pluginHooks.views, this.optionsManager);
- // ineffecient to do every time?
- this.dateProfileGenerators = mapHash(this.viewSpecs, function (viewSpec) {
- return new viewSpec.class.prototype.dateProfileGeneratorClass(viewSpec, _this);
- });
- };
- Calendar.prototype.getAvailableLocaleCodes = function () {
- return Object.keys(this.availableRawLocales);
- };
- Calendar.prototype._buildSelectionConfig = function (rawOpts) {
- return processScopedUiProps('select', rawOpts, this);
- };
- Calendar.prototype._buildEventUiSingleBase = function (rawOpts) {
- if (rawOpts.editable) { // so 'editable' affected events
- rawOpts = __assign({}, rawOpts, { eventEditable: true });
- }
- return processScopedUiProps('event', rawOpts, this);
- };
- // Trigger
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.hasPublicHandlers = function (name) {
- return this.hasHandlers(name) ||
- this.opt(name); // handler specified in options
- };
- Calendar.prototype.publiclyTrigger = function (name, args) {
- var optHandler = this.opt(name);
- this.triggerWith(name, this, args);
- if (optHandler) {
- return optHandler.apply(this, args);
- }
- };
- Calendar.prototype.publiclyTriggerAfterSizing = function (name, args) {
- var afterSizingTriggers = this.afterSizingTriggers;
- (afterSizingTriggers[name] || (afterSizingTriggers[name] = [])).push(args);
- };
- Calendar.prototype.releaseAfterSizingTriggers = function () {
- var afterSizingTriggers = this.afterSizingTriggers;
- for (var name_4 in afterSizingTriggers) {
- for (var _i = 0, _a = afterSizingTriggers[name_4]; _i < _a.length; _i++) {
- var args = _a[_i];
- this.publiclyTrigger(name_4, args);
- }
- }
- this.afterSizingTriggers = {};
- };
- // View
- // -----------------------------------------------------------------------------------------------------------------
- // Returns a boolean about whether the view is okay to instantiate at some point
- Calendar.prototype.isValidViewType = function (viewType) {
- return Boolean(this.viewSpecs[viewType]);
- };
- Calendar.prototype.changeView = function (viewType, dateOrRange) {
- var dateMarker = null;
- if (dateOrRange) {
- if (dateOrRange.start && dateOrRange.end) { // a range
- this.optionsManager.mutate({ visibleRange: dateOrRange }, []); // will not rerender
- this.handleOptions(this.optionsManager.computed); // ...but yuck
- }
- else { // a date
- dateMarker = this.dateEnv.createMarker(dateOrRange); // just like gotoDate
- }
- }
- this.unselect();
- this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: viewType,
- dateMarker: dateMarker
- });
- };
- // Forces navigation to a view for the given date.
- // `viewType` can be a specific view name or a generic one like "week" or "day".
- // needs to change
- Calendar.prototype.zoomTo = function (dateMarker, viewType) {
- var spec;
- viewType = viewType || 'day'; // day is default zoom
- spec = this.viewSpecs[viewType] ||
- this.getUnitViewSpec(viewType);
- this.unselect();
- if (spec) {
- this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: spec.type,
- dateMarker: dateMarker
- });
- }
- else {
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: dateMarker
- });
- }
- };
- // Given a duration singular unit, like "week" or "day", finds a matching view spec.
- // Preference is given to views that have corresponding buttons.
- Calendar.prototype.getUnitViewSpec = function (unit) {
- var component = this.component;
- var viewTypes = [];
- var i;
- var spec;
- // put views that have buttons first. there will be duplicates, but oh
- if (component.header) {
- viewTypes.push.apply(viewTypes, component.header.viewsWithButtons);
- }
- if (component.footer) {
- viewTypes.push.apply(viewTypes, component.footer.viewsWithButtons);
- }
- for (var viewType in this.viewSpecs) {
- viewTypes.push(viewType);
- }
- for (i = 0; i < viewTypes.length; i++) {
- spec = this.viewSpecs[viewTypes[i]];
- if (spec) {
- if (spec.singleUnit === unit) {
- return spec;
- }
- }
- }
- };
- // Current Date
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.getInitialDate = function () {
- var defaultDateInput = this.opt('defaultDate');
- // compute the initial ambig-timezone date
- if (defaultDateInput != null) {
- return this.dateEnv.createMarker(defaultDateInput);
- }
- else {
- return this.getNow(); // getNow already returns unzoned
- }
- };
- Calendar.prototype.prev = function () {
- this.unselect();
- this.dispatch({ type: 'PREV' });
- };
- Calendar.prototype.next = function () {
- this.unselect();
- this.dispatch({ type: 'NEXT' });
- };
- Calendar.prototype.prevYear = function () {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.addYears(this.state.currentDate, -1)
- });
- };
- Calendar.prototype.nextYear = function () {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.addYears(this.state.currentDate, 1)
- });
- };
- Calendar.prototype.today = function () {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.getNow()
- });
- };
- Calendar.prototype.gotoDate = function (zonedDateInput) {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.createMarker(zonedDateInput)
- });
- };
- Calendar.prototype.incrementDate = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // else, warn about invalid input?
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.add(this.state.currentDate, delta)
- });
- }
- };
- // for external API
- Calendar.prototype.getDate = function () {
- return this.dateEnv.toDate(this.state.currentDate);
- };
- // Date Formatting Utils
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.formatDate = function (d, formatter) {
- var dateEnv = this.dateEnv;
- return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter));
- };
- // `settings` is for formatter AND isEndExclusive
- Calendar.prototype.formatRange = function (d0, d1, settings) {
- var dateEnv = this.dateEnv;
- return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings, this.opt('defaultRangeSeparator')), settings);
- };
- Calendar.prototype.formatIso = function (d, omitTime) {
- var dateEnv = this.dateEnv;
- return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime });
- };
- // Sizing
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.windowResize = function (ev) {
- if (!this.isHandlingWindowResize &&
- this.component && // why?
- ev.target === window // not a jqui resize event
- ) {
- this.isHandlingWindowResize = true;
- this.updateSize();
- this.publiclyTrigger('windowResize', [this.view]);
- this.isHandlingWindowResize = false;
- }
- };
- Calendar.prototype.updateSize = function () {
- if (this.component) { // when?
- this.component.updateSize(true);
- }
- };
- // Component Registration
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.registerInteractiveComponent = function (component, settingsInput) {
- var settings = parseInteractionSettings(component, settingsInput);
- var DEFAULT_INTERACTIONS = [
- EventClicking,
- EventHovering
- ];
- var interactionClasses = DEFAULT_INTERACTIONS.concat(this.pluginSystem.hooks.componentInteractions);
- var interactions = interactionClasses.map(function (interactionClass) {
- return new interactionClass(settings);
- });
- this.interactionsStore[component.uid] = interactions;
- interactionSettingsStore[component.uid] = settings;
- };
- Calendar.prototype.unregisterInteractiveComponent = function (component) {
- for (var _i = 0, _a = this.interactionsStore[component.uid]; _i < _a.length; _i++) {
- var listener = _a[_i];
- listener.destroy();
- }
- delete this.interactionsStore[component.uid];
- delete interactionSettingsStore[component.uid];
- };
- // Date Selection / Event Selection / DayClick
- // -----------------------------------------------------------------------------------------------------------------
- // this public method receives start/end dates in any format, with any timezone
- // NOTE: args were changed from v3
- Calendar.prototype.select = function (dateOrObj, endDate) {
- var selectionInput;
- if (endDate == null) {
- if (dateOrObj.start != null) {
- selectionInput = dateOrObj;
- }
- else {
- selectionInput = {
- start: dateOrObj,
- end: null
- };
- }
- }
- else {
- selectionInput = {
- start: dateOrObj,
- end: endDate
- };
- }
- var selection = parseDateSpan(selectionInput, this.dateEnv, createDuration({ days: 1 }) // TODO: cache this?
- );
- if (selection) { // throw parse error otherwise?
- this.dispatch({ type: 'SELECT_DATES', selection: selection });
- this.triggerDateSelect(selection);
- }
- };
- // public method
- Calendar.prototype.unselect = function (pev) {
- if (this.state.dateSelection) {
- this.dispatch({ type: 'UNSELECT_DATES' });
- this.triggerDateUnselect(pev);
- }
- };
- Calendar.prototype.triggerDateSelect = function (selection, pev) {
- var arg = __assign({}, this.buildDateSpanApi(selection), { jsEvent: pev ? pev.origEvent : null, view: this.view });
- this.publiclyTrigger('select', [arg]);
- };
- Calendar.prototype.triggerDateUnselect = function (pev) {
- this.publiclyTrigger('unselect', [
- {
- jsEvent: pev ? pev.origEvent : null,
- view: this.view
- }
- ]);
- };
- // TODO: receive pev?
- Calendar.prototype.triggerDateClick = function (dateSpan, dayEl, view, ev) {
- var arg = __assign({}, this.buildDatePointApi(dateSpan), { dayEl: dayEl, jsEvent: ev, // Is this always a mouse event? See #4655
- view: view });
- this.publiclyTrigger('dateClick', [arg]);
- };
- Calendar.prototype.buildDatePointApi = function (dateSpan) {
- var props = {};
- for (var _i = 0, _a = this.pluginSystem.hooks.datePointTransforms; _i < _a.length; _i++) {
- var transform = _a[_i];
- __assign(props, transform(dateSpan, this));
- }
- __assign(props, buildDatePointApi(dateSpan, this.dateEnv));
- return props;
- };
- Calendar.prototype.buildDateSpanApi = function (dateSpan) {
- var props = {};
- for (var _i = 0, _a = this.pluginSystem.hooks.dateSpanTransforms; _i < _a.length; _i++) {
- var transform = _a[_i];
- __assign(props, transform(dateSpan, this));
- }
- __assign(props, buildDateSpanApi(dateSpan, this.dateEnv));
- return props;
- };
- // Date Utils
- // -----------------------------------------------------------------------------------------------------------------
- // Returns a DateMarker for the current date, as defined by the client's computer or from the `now` option
- Calendar.prototype.getNow = function () {
- var now = this.opt('now');
- if (typeof now === 'function') {
- now = now();
- }
- if (now == null) {
- return this.dateEnv.createNowMarker();
- }
- return this.dateEnv.createMarker(now);
- };
- // Event-Date Utilities
- // -----------------------------------------------------------------------------------------------------------------
- // Given an event's allDay status and start date, return what its fallback end date should be.
- // TODO: rename to computeDefaultEventEnd
- Calendar.prototype.getDefaultEventEnd = function (allDay, marker) {
- var end = marker;
- if (allDay) {
- end = startOfDay(end);
- end = this.dateEnv.add(end, this.defaultAllDayEventDuration);
- }
- else {
- end = this.dateEnv.add(end, this.defaultTimedEventDuration);
- }
- return end;
- };
- // Public Events API
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.addEvent = function (eventInput, sourceInput) {
- if (eventInput instanceof EventApi) {
- var def = eventInput._def;
- var instance = eventInput._instance;
- // not already present? don't want to add an old snapshot
- if (!this.state.eventStore.defs[def.defId]) {
- this.dispatch({
- type: 'ADD_EVENTS',
- eventStore: eventTupleToStore({ def: def, instance: instance }) // TODO: better util for two args?
- });
- }
- return eventInput;
- }
- var sourceId;
- if (sourceInput instanceof EventSourceApi) {
- sourceId = sourceInput.internalEventSource.sourceId;
- }
- else if (sourceInput != null) {
- var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function
- if (!sourceApi) {
- console.warn('Could not find an event source with ID "' + sourceInput + '"'); // TODO: test
- return null;
- }
- else {
- sourceId = sourceApi.internalEventSource.sourceId;
- }
- }
- var tuple = parseEvent(eventInput, sourceId, this);
- if (tuple) {
- this.dispatch({
- type: 'ADD_EVENTS',
- eventStore: eventTupleToStore(tuple)
- });
- return new EventApi(this, tuple.def, tuple.def.recurringDef ? null : tuple.instance);
- }
- return null;
- };
- // TODO: optimize
- Calendar.prototype.getEventById = function (id) {
- var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
- id = String(id);
- for (var defId in defs) {
- var def = defs[defId];
- if (def.publicId === id) {
- if (def.recurringDef) {
- return new EventApi(this, def, null);
- }
- else {
- for (var instanceId in instances) {
- var instance = instances[instanceId];
- if (instance.defId === def.defId) {
- return new EventApi(this, def, instance);
- }
- }
- }
- }
- }
- return null;
- };
- Calendar.prototype.getEvents = function () {
- var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
- var eventApis = [];
- for (var id in instances) {
- var instance = instances[id];
- var def = defs[instance.defId];
- eventApis.push(new EventApi(this, def, instance));
- }
- return eventApis;
- };
- Calendar.prototype.removeAllEvents = function () {
- this.dispatch({ type: 'REMOVE_ALL_EVENTS' });
- };
- Calendar.prototype.rerenderEvents = function () {
- this.dispatch({ type: 'RESET_EVENTS' });
- };
- // Public Event Sources API
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.getEventSources = function () {
- var sourceHash = this.state.eventSources;
- var sourceApis = [];
- for (var internalId in sourceHash) {
- sourceApis.push(new EventSourceApi(this, sourceHash[internalId]));
- }
- return sourceApis;
- };
- Calendar.prototype.getEventSourceById = function (id) {
- var sourceHash = this.state.eventSources;
- id = String(id);
- for (var sourceId in sourceHash) {
- if (sourceHash[sourceId].publicId === id) {
- return new EventSourceApi(this, sourceHash[sourceId]);
- }
- }
- return null;
- };
- Calendar.prototype.addEventSource = function (sourceInput) {
- if (sourceInput instanceof EventSourceApi) {
- // not already present? don't want to add an old snapshot
- if (!this.state.eventSources[sourceInput.internalEventSource.sourceId]) {
- this.dispatch({
- type: 'ADD_EVENT_SOURCES',
- sources: [sourceInput.internalEventSource]
- });
- }
- return sourceInput;
- }
- var eventSource = parseEventSource(sourceInput, this);
- if (eventSource) { // TODO: error otherwise?
- this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] });
- return new EventSourceApi(this, eventSource);
- }
- return null;
- };
- Calendar.prototype.removeAllEventSources = function () {
- this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' });
- };
- Calendar.prototype.refetchEvents = function () {
- this.dispatch({ type: 'FETCH_EVENT_SOURCES' });
- };
- // Scroll
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.scrollToTime = function (timeInput) {
- var duration = createDuration(timeInput);
- if (duration) {
- this.component.view.scrollToDuration(duration);
- }
- };
- return Calendar;
- }());
- EmitterMixin.mixInto(Calendar);
- // for memoizers
- // -----------------------------------------------------------------------------------------------------------------
- function buildComponentContext$1(theme, dateEnv, options) {
- return new ComponentContext(this, theme, dateEnv, options, null);
- }
- function buildDateEnv(locale, timeZone, namedTimeZoneImpl, firstDay, weekNumberCalculation, weekLabel, cmdFormatter) {
- return new DateEnv({
- calendarSystem: 'gregory',
- timeZone: timeZone,
- namedTimeZoneImpl: namedTimeZoneImpl,
- locale: locale,
- weekNumberCalculation: weekNumberCalculation,
- firstDay: firstDay,
- weekLabel: weekLabel,
- cmdFormatter: cmdFormatter
- });
- }
- function buildTheme(calendarOptions) {
- var themeClass = this.pluginSystem.hooks.themeClasses[calendarOptions.themeSystem] || StandardTheme;
- return new themeClass(calendarOptions);
- }
- function buildDelayedRerender(wait) {
- var func = this.tryRerender.bind(this);
- if (wait != null) {
- func = debounce(func, wait);
- }
- return func;
- }
- function buildEventUiBySource(eventSources) {
- return mapHash(eventSources, function (eventSource) {
- return eventSource.ui;
- });
- }
- function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) {
- var eventUiBases = { '': eventUiSingleBase };
- for (var defId in eventDefs) {
- var def = eventDefs[defId];
- if (def.sourceId && eventUiBySource[def.sourceId]) {
- eventUiBases[defId] = eventUiBySource[def.sourceId];
- }
- }
- return eventUiBases;
- }
-
- var View = /** @class */ (function (_super) {
- __extends(View, _super);
- function View(viewSpec, parentEl) {
- var _this = _super.call(this, createElement('div', { className: 'fc-view fc-' + viewSpec.type + '-view' })) || this;
- _this.renderDatesMem = memoizeRendering(_this.renderDatesWrap, _this.unrenderDatesWrap);
- _this.renderBusinessHoursMem = memoizeRendering(_this.renderBusinessHours, _this.unrenderBusinessHours, [_this.renderDatesMem]);
- _this.renderDateSelectionMem = memoizeRendering(_this.renderDateSelectionWrap, _this.unrenderDateSelectionWrap, [_this.renderDatesMem]);
- _this.renderEventsMem = memoizeRendering(_this.renderEvents, _this.unrenderEvents, [_this.renderDatesMem]);
- _this.renderEventSelectionMem = memoizeRendering(_this.renderEventSelectionWrap, _this.unrenderEventSelectionWrap, [_this.renderEventsMem]);
- _this.renderEventDragMem = memoizeRendering(_this.renderEventDragWrap, _this.unrenderEventDragWrap, [_this.renderDatesMem]);
- _this.renderEventResizeMem = memoizeRendering(_this.renderEventResizeWrap, _this.unrenderEventResizeWrap, [_this.renderDatesMem]);
- _this.viewSpec = viewSpec;
- _this.type = viewSpec.type;
- parentEl.appendChild(_this.el);
- _this.initialize();
- return _this;
- }
- View.prototype.initialize = function () {
- };
- Object.defineProperty(View.prototype, "activeStart", {
- // Date Setting/Unsetting
- // -----------------------------------------------------------------------------------------------------------------
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.activeRange.start);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(View.prototype, "activeEnd", {
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.activeRange.end);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(View.prototype, "currentStart", {
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.currentRange.start);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(View.prototype, "currentEnd", {
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.currentRange.end);
- },
- enumerable: true,
- configurable: true
- });
- // General Rendering
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.render = function (props, context) {
- this.renderDatesMem(props.dateProfile);
- this.renderBusinessHoursMem(props.businessHours);
- this.renderDateSelectionMem(props.dateSelection);
- this.renderEventsMem(props.eventStore);
- this.renderEventSelectionMem(props.eventSelection);
- this.renderEventDragMem(props.eventDrag);
- this.renderEventResizeMem(props.eventResize);
- };
- View.prototype.beforeUpdate = function () {
- this.addScroll(this.queryScroll());
- };
- View.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderDatesMem.unrender(); // should unrender everything else
- };
- // Sizing
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.updateSize = function (isResize, viewHeight, isAuto) {
- var calendar = this.context.calendar;
- if (isResize) {
- this.addScroll(this.queryScroll()); // NOTE: same code as in beforeUpdate
- }
- if (isResize || // HACKS...
- calendar.isViewUpdated ||
- calendar.isDatesUpdated ||
- calendar.isEventsUpdated) {
- // sort of the catch-all sizing
- // anything that might cause dimension changes
- this.updateBaseSize(isResize, viewHeight, isAuto);
- }
- // NOTE: popScroll is called by CalendarComponent
- };
- View.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
- };
- // Date Rendering
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderDatesWrap = function (dateProfile) {
- this.renderDates(dateProfile);
- this.addScroll({
- duration: createDuration(this.context.options.scrollTime)
- });
- };
- View.prototype.unrenderDatesWrap = function () {
- this.stopNowIndicator();
- this.unrenderDates();
- };
- View.prototype.renderDates = function (dateProfile) { };
- View.prototype.unrenderDates = function () { };
- // Business Hours
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderBusinessHours = function (businessHours) { };
- View.prototype.unrenderBusinessHours = function () { };
- // Date Selection
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderDateSelectionWrap = function (selection) {
- if (selection) {
- this.renderDateSelection(selection);
- }
- };
- View.prototype.unrenderDateSelectionWrap = function (selection) {
- if (selection) {
- this.unrenderDateSelection(selection);
- }
- };
- View.prototype.renderDateSelection = function (selection) { };
- View.prototype.unrenderDateSelection = function (selection) { };
- // Event Rendering
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEvents = function (eventStore) { };
- View.prototype.unrenderEvents = function () { };
- // util for subclasses
- View.prototype.sliceEvents = function (eventStore, allDay) {
- var props = this.props;
- return sliceEventStore(eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? this.context.nextDayThreshold : null).fg;
- };
- // Event Selection
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEventSelectionWrap = function (instanceId) {
- if (instanceId) {
- this.renderEventSelection(instanceId);
- }
- };
- View.prototype.unrenderEventSelectionWrap = function (instanceId) {
- if (instanceId) {
- this.unrenderEventSelection(instanceId);
- }
- };
- View.prototype.renderEventSelection = function (instanceId) { };
- View.prototype.unrenderEventSelection = function (instanceId) { };
- // Event Drag
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEventDragWrap = function (state) {
- if (state) {
- this.renderEventDrag(state);
- }
- };
- View.prototype.unrenderEventDragWrap = function (state) {
- if (state) {
- this.unrenderEventDrag(state);
- }
- };
- View.prototype.renderEventDrag = function (state) { };
- View.prototype.unrenderEventDrag = function (state) { };
- // Event Resize
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEventResizeWrap = function (state) {
- if (state) {
- this.renderEventResize(state);
- }
- };
- View.prototype.unrenderEventResizeWrap = function (state) {
- if (state) {
- this.unrenderEventResize(state);
- }
- };
- View.prototype.renderEventResize = function (state) { };
- View.prototype.unrenderEventResize = function (state) { };
- /* Now Indicator
- ------------------------------------------------------------------------------------------------------------------*/
- // Immediately render the current time indicator and begins re-rendering it at an interval,
- // which is defined by this.getNowIndicatorUnit().
- // TODO: somehow do this for the current whole day's background too
- // USAGE: must be called manually from subclasses' render methods! don't need to call stopNowIndicator tho
- View.prototype.startNowIndicator = function (dateProfile, dateProfileGenerator) {
- var _this = this;
- var _a = this.context, calendar = _a.calendar, dateEnv = _a.dateEnv, options = _a.options;
- var unit;
- var update;
- var delay; // ms wait value
- if (options.nowIndicator && !this.initialNowDate) {
- unit = this.getNowIndicatorUnit(dateProfile, dateProfileGenerator);
- if (unit) {
- update = this.updateNowIndicator.bind(this);
- this.initialNowDate = calendar.getNow();
- this.initialNowQueriedMs = new Date().valueOf();
- // wait until the beginning of the next interval
- delay = dateEnv.add(dateEnv.startOf(this.initialNowDate, unit), createDuration(1, unit)).valueOf() - this.initialNowDate.valueOf();
- // TODO: maybe always use setTimeout, waiting until start of next unit
- this.nowIndicatorTimeoutID = setTimeout(function () {
- _this.nowIndicatorTimeoutID = null;
- update();
- if (unit === 'second') {
- delay = 1000; // every second
- }
- else {
- delay = 1000 * 60; // otherwise, every minute
- }
- _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval
- }, delay);
- }
- // rendering will be initiated in updateSize
- }
- };
- // rerenders the now indicator, computing the new current time from the amount of time that has passed
- // since the initial getNow call.
- View.prototype.updateNowIndicator = function () {
- if (this.props.dateProfile && // a way to determine if dates were rendered yet
- this.initialNowDate // activated before?
- ) {
- this.unrenderNowIndicator(); // won't unrender if unnecessary
- this.renderNowIndicator(addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs));
- this.isNowIndicatorRendered = true;
- }
- };
- // Immediately unrenders the view's current time indicator and stops any re-rendering timers.
- // Won't cause side effects if indicator isn't rendered.
- View.prototype.stopNowIndicator = function () {
- if (this.nowIndicatorTimeoutID) {
- clearTimeout(this.nowIndicatorTimeoutID);
- this.nowIndicatorTimeoutID = null;
- }
- if (this.nowIndicatorIntervalID) {
- clearInterval(this.nowIndicatorIntervalID);
- this.nowIndicatorIntervalID = null;
- }
- if (this.isNowIndicatorRendered) {
- this.unrenderNowIndicator();
- this.isNowIndicatorRendered = false;
- }
- };
- View.prototype.getNowIndicatorUnit = function (dateProfile, dateProfileGenerator) {
- // subclasses should implement
- };
- // Renders a current time indicator at the given datetime
- View.prototype.renderNowIndicator = function (date) {
- // SUBCLASSES MUST PASS TO CHILDREN!
- };
- // Undoes the rendering actions from renderNowIndicator
- View.prototype.unrenderNowIndicator = function () {
- // SUBCLASSES MUST PASS TO CHILDREN!
- };
- /* Scroller
- ------------------------------------------------------------------------------------------------------------------*/
- View.prototype.addScroll = function (scroll, isForced) {
- if (isForced) {
- scroll.isForced = isForced;
- }
- __assign(this.queuedScroll || (this.queuedScroll = {}), scroll);
- };
- View.prototype.popScroll = function (isResize) {
- this.applyQueuedScroll(isResize);
- this.queuedScroll = null;
- };
- View.prototype.applyQueuedScroll = function (isResize) {
- if (this.queuedScroll) {
- this.applyScroll(this.queuedScroll, isResize);
- }
- };
- View.prototype.queryScroll = function () {
- var scroll = {};
- if (this.props.dateProfile) { // dates rendered yet?
- __assign(scroll, this.queryDateScroll());
- }
- return scroll;
- };
- View.prototype.applyScroll = function (scroll, isResize) {
- var duration = scroll.duration, isForced = scroll.isForced;
- if (duration != null && !isForced) {
- delete scroll.duration;
- if (this.props.dateProfile) { // dates rendered yet?
- __assign(scroll, this.computeDateScroll(duration));
- }
- }
- if (this.props.dateProfile) { // dates rendered yet?
- this.applyDateScroll(scroll);
- }
- };
- View.prototype.computeDateScroll = function (duration) {
- return {}; // subclasses must implement
- };
- View.prototype.queryDateScroll = function () {
- return {}; // subclasses must implement
- };
- View.prototype.applyDateScroll = function (scroll) {
- // subclasses must implement
- };
- // for API
- View.prototype.scrollToDuration = function (duration) {
- this.applyScroll({ duration: duration }, false);
- };
- return View;
- }(DateComponent));
- EmitterMixin.mixInto(View);
- View.prototype.usesMinMaxTime = false;
- View.prototype.dateProfileGeneratorClass = DateProfileGenerator;
-
- var FgEventRenderer = /** @class */ (function () {
- function FgEventRenderer() {
- this.segs = [];
- this.isSizeDirty = false;
- }
- FgEventRenderer.prototype.renderSegs = function (context, segs, mirrorInfo) {
- this.context = context;
- this.rangeUpdated(); // called too frequently :(
- // render an `.el` on each seg
- // returns a subset of the segs. segs that were actually rendered
- segs = this.renderSegEls(segs, mirrorInfo);
- this.segs = segs;
- this.attachSegs(segs, mirrorInfo);
- this.isSizeDirty = true;
- triggerRenderedSegs(this.context, this.segs, Boolean(mirrorInfo));
- };
- FgEventRenderer.prototype.unrender = function (context, _segs, mirrorInfo) {
- triggerWillRemoveSegs(this.context, this.segs, Boolean(mirrorInfo));
- this.detachSegs(this.segs);
- this.segs = [];
- };
- // Updates values that rely on options and also relate to range
- FgEventRenderer.prototype.rangeUpdated = function () {
- var options = this.context.options;
- var displayEventTime;
- var displayEventEnd;
- this.eventTimeFormat = createFormatter(options.eventTimeFormat || this.computeEventTimeFormat(), options.defaultRangeSeparator);
- displayEventTime = options.displayEventTime;
- if (displayEventTime == null) {
- displayEventTime = this.computeDisplayEventTime(); // might be based off of range
- }
- displayEventEnd = options.displayEventEnd;
- if (displayEventEnd == null) {
- displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range
- }
- this.displayEventTime = displayEventTime;
- this.displayEventEnd = displayEventEnd;
- };
- // Renders and assigns an `el` property for each foreground event segment.
- // Only returns segments that successfully rendered.
- FgEventRenderer.prototype.renderSegEls = function (segs, mirrorInfo) {
- var html = '';
- var i;
- if (segs.length) { // don't build an empty html string
- // build a large concatenation of event segment HTML
- for (i = 0; i < segs.length; i++) {
- html += this.renderSegHtml(segs[i], mirrorInfo);
- }
- // Grab individual elements from the combined HTML string. Use each as the default rendering.
- // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.
- htmlToElements(html).forEach(function (el, i) {
- var seg = segs[i];
- if (el) {
- seg.el = el;
- }
- });
- segs = filterSegsViaEls(this.context, segs, Boolean(mirrorInfo));
- }
- return segs;
- };
- // Generic utility for generating the HTML classNames for an event segment's element
- FgEventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable, mirrorInfo) {
- var classes = [
- 'fc-event',
- seg.isStart ? 'fc-start' : 'fc-not-start',
- seg.isEnd ? 'fc-end' : 'fc-not-end'
- ].concat(seg.eventRange.ui.classNames);
- if (isDraggable) {
- classes.push('fc-draggable');
- }
- if (isResizable) {
- classes.push('fc-resizable');
- }
- if (mirrorInfo) {
- classes.push('fc-mirror');
- if (mirrorInfo.isDragging) {
- classes.push('fc-dragging');
- }
- if (mirrorInfo.isResizing) {
- classes.push('fc-resizing');
- }
- }
- return classes;
- };
- // Compute the text that should be displayed on an event's element.
- // `range` can be the Event object itself, or something range-like, with at least a `start`.
- // If event times are disabled, or the event has no time, will return a blank string.
- // If not specified, formatter will default to the eventTimeFormat setting,
- // and displayEnd will default to the displayEventEnd setting.
- FgEventRenderer.prototype.getTimeText = function (eventRange, formatter, displayEnd) {
- var def = eventRange.def, instance = eventRange.instance;
- return this._getTimeText(instance.range.start, def.hasEnd ? instance.range.end : null, def.allDay, formatter, displayEnd, instance.forcedStartTzo, instance.forcedEndTzo);
- };
- FgEventRenderer.prototype._getTimeText = function (start, end, allDay, formatter, displayEnd, forcedStartTzo, forcedEndTzo) {
- var dateEnv = this.context.dateEnv;
- if (formatter == null) {
- formatter = this.eventTimeFormat;
- }
- if (displayEnd == null) {
- displayEnd = this.displayEventEnd;
- }
- if (this.displayEventTime && !allDay) {
- if (displayEnd && end) {
- return dateEnv.formatRange(start, end, formatter, {
- forcedStartTzo: forcedStartTzo,
- forcedEndTzo: forcedEndTzo
- });
- }
- else {
- return dateEnv.format(start, formatter, {
- forcedTzo: forcedStartTzo
- });
- }
- }
- return '';
- };
- FgEventRenderer.prototype.computeEventTimeFormat = function () {
- return {
- hour: 'numeric',
- minute: '2-digit',
- omitZeroMinute: true
- };
- };
- FgEventRenderer.prototype.computeDisplayEventTime = function () {
- return true;
- };
- FgEventRenderer.prototype.computeDisplayEventEnd = function () {
- return true;
- };
- // Utility for generating event skin-related CSS properties
- FgEventRenderer.prototype.getSkinCss = function (ui) {
- return {
- 'background-color': ui.backgroundColor,
- 'border-color': ui.borderColor,
- color: ui.textColor
- };
- };
- FgEventRenderer.prototype.sortEventSegs = function (segs) {
- var specs = this.context.eventOrderSpecs;
- var objs = segs.map(buildSegCompareObj);
- objs.sort(function (obj0, obj1) {
- return compareByFieldSpecs(obj0, obj1, specs);
- });
- return objs.map(function (c) {
- return c._seg;
- });
- };
- FgEventRenderer.prototype.computeSizes = function (force) {
- if (force || this.isSizeDirty) {
- this.computeSegSizes(this.segs);
- }
- };
- FgEventRenderer.prototype.assignSizes = function (force) {
- if (force || this.isSizeDirty) {
- this.assignSegSizes(this.segs);
- this.isSizeDirty = false;
- }
- };
- FgEventRenderer.prototype.computeSegSizes = function (segs) {
- };
- FgEventRenderer.prototype.assignSegSizes = function (segs) {
- };
- // Manipulation on rendered segs
- FgEventRenderer.prototype.hideByHash = function (hash) {
- if (hash) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- if (hash[seg.eventRange.instance.instanceId]) {
- seg.el.style.visibility = 'hidden';
- }
- }
- }
- };
- FgEventRenderer.prototype.showByHash = function (hash) {
- if (hash) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- if (hash[seg.eventRange.instance.instanceId]) {
- seg.el.style.visibility = '';
- }
- }
- }
- };
- FgEventRenderer.prototype.selectByInstanceId = function (instanceId) {
- if (instanceId) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- var eventInstance = seg.eventRange.instance;
- if (eventInstance && eventInstance.instanceId === instanceId &&
- seg.el // necessary?
- ) {
- seg.el.classList.add('fc-selected');
- }
- }
- }
- };
- FgEventRenderer.prototype.unselectByInstanceId = function (instanceId) {
- if (instanceId) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- if (seg.el) { // necessary?
- seg.el.classList.remove('fc-selected');
- }
- }
- }
- };
- return FgEventRenderer;
- }());
- // returns a object with all primitive props that can be compared
- function buildSegCompareObj(seg) {
- var eventDef = seg.eventRange.def;
- var range = seg.eventRange.instance.range;
- var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events
- var end = range.end ? range.end.valueOf() : 0; // "
- return __assign({}, eventDef.extendedProps, eventDef, { id: eventDef.publicId, start: start,
- end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg // for later retrieval
- });
- }
-
- /*
- TODO: when refactoring this class, make a new FillRenderer instance for each `type`
- */
- var FillRenderer = /** @class */ (function () {
- function FillRenderer() {
- this.fillSegTag = 'div';
- this.dirtySizeFlags = {};
- this.containerElsByType = {};
- this.segsByType = {};
- }
- FillRenderer.prototype.getSegsByType = function (type) {
- return this.segsByType[type] || [];
- };
- FillRenderer.prototype.renderSegs = function (type, context, segs) {
- var _a;
- this.context = context;
- var renderedSegs = this.renderSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs
- var containerEls = this.attachSegs(type, renderedSegs);
- if (containerEls) {
- (_a = (this.containerElsByType[type] || (this.containerElsByType[type] = []))).push.apply(_a, containerEls);
- }
- this.segsByType[type] = renderedSegs;
- if (type === 'bgEvent') {
- triggerRenderedSegs(context, renderedSegs, false); // isMirror=false
- }
- this.dirtySizeFlags[type] = true;
- };
- // Unrenders a specific type of fill that is currently rendered on the grid
- FillRenderer.prototype.unrender = function (type, context) {
- var segs = this.segsByType[type];
- if (segs) {
- if (type === 'bgEvent') {
- triggerWillRemoveSegs(context, segs, false); // isMirror=false
- }
- this.detachSegs(type, segs);
- }
- };
- // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.
- // Only returns segments that successfully rendered.
- FillRenderer.prototype.renderSegEls = function (type, segs) {
- var _this = this;
- var html = '';
- var i;
- if (segs.length) {
- // build a large concatenation of segment HTML
- for (i = 0; i < segs.length; i++) {
- html += this.renderSegHtml(type, segs[i]);
- }
- // Grab individual elements from the combined HTML string. Use each as the default rendering.
- // Then, compute the 'el' for each segment.
- htmlToElements(html).forEach(function (el, i) {
- var seg = segs[i];
- if (el) {
- seg.el = el;
- }
- });
- if (type === 'bgEvent') {
- segs = filterSegsViaEls(this.context, segs, false // isMirror. background events can never be mirror elements
- );
- }
- // correct element type? (would be bad if a non-TD were inserted into a table for example)
- segs = segs.filter(function (seg) {
- return elementMatches(seg.el, _this.fillSegTag);
- });
- }
- return segs;
- };
- // Builds the HTML needed for one fill segment. Generic enough to work with different types.
- FillRenderer.prototype.renderSegHtml = function (type, seg) {
- var css = null;
- var classNames = [];
- if (type !== 'highlight' && type !== 'businessHours') {
- css = {
- 'background-color': seg.eventRange.ui.backgroundColor
- };
- }
- if (type !== 'highlight') {
- classNames = classNames.concat(seg.eventRange.ui.classNames);
- }
- if (type === 'businessHours') {
- classNames.push('fc-bgevent');
- }
- else {
- classNames.push('fc-' + type.toLowerCase());
- }
- return '<' + this.fillSegTag +
- (classNames.length ? ' class="' + classNames.join(' ') + '"' : '') +
- (css ? ' style="' + cssToStr(css) + '"' : '') +
- '></' + this.fillSegTag + '>';
- };
- FillRenderer.prototype.detachSegs = function (type, segs) {
- var containerEls = this.containerElsByType[type];
- if (containerEls) {
- containerEls.forEach(removeElement);
- delete this.containerElsByType[type];
- }
- };
- FillRenderer.prototype.computeSizes = function (force) {
- for (var type in this.segsByType) {
- if (force || this.dirtySizeFlags[type]) {
- this.computeSegSizes(this.segsByType[type]);
- }
- }
- };
- FillRenderer.prototype.assignSizes = function (force) {
- for (var type in this.segsByType) {
- if (force || this.dirtySizeFlags[type]) {
- this.assignSegSizes(this.segsByType[type]);
- }
- }
- this.dirtySizeFlags = {};
- };
- FillRenderer.prototype.computeSegSizes = function (segs) {
- };
- FillRenderer.prototype.assignSegSizes = function (segs) {
- };
- return FillRenderer;
- }());
-
- var NamedTimeZoneImpl = /** @class */ (function () {
- function NamedTimeZoneImpl(timeZoneName) {
- this.timeZoneName = timeZoneName;
- }
- return NamedTimeZoneImpl;
- }());
-
- /*
- An abstraction for a dragging interaction originating on an event.
- Does higher-level things than PointerDragger, such as possibly:
- - a "mirror" that moves with the pointer
- - a minimum number of pixels or other criteria for a true drag to begin
-
- subclasses must emit:
- - pointerdown
- - dragstart
- - dragmove
- - pointerup
- - dragend
- */
- var ElementDragging = /** @class */ (function () {
- function ElementDragging(el) {
- this.emitter = new EmitterMixin();
- }
- ElementDragging.prototype.destroy = function () {
- };
- ElementDragging.prototype.setMirrorIsVisible = function (bool) {
- // optional if subclass doesn't want to support a mirror
- };
- ElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
- // optional if subclass doesn't want to support a mirror
- };
- ElementDragging.prototype.setAutoScrollEnabled = function (bool) {
- // optional
- };
- return ElementDragging;
- }());
-
- function formatDate(dateInput, settings) {
- if (settings === void 0) { settings = {}; }
- var dateEnv = buildDateEnv$1(settings);
- var formatter = createFormatter(settings);
- var dateMeta = dateEnv.createMarkerMeta(dateInput);
- if (!dateMeta) { // TODO: warning?
- return '';
- }
- return dateEnv.format(dateMeta.marker, formatter, {
- forcedTzo: dateMeta.forcedTzo
- });
- }
- function formatRange(startInput, endInput, settings // mixture of env and formatter settings
- ) {
- var dateEnv = buildDateEnv$1(typeof settings === 'object' && settings ? settings : {}); // pass in if non-null object
- var formatter = createFormatter(settings, globalDefaults.defaultRangeSeparator);
- var startMeta = dateEnv.createMarkerMeta(startInput);
- var endMeta = dateEnv.createMarkerMeta(endInput);
- if (!startMeta || !endMeta) { // TODO: warning?
- return '';
- }
- return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, {
- forcedStartTzo: startMeta.forcedTzo,
- forcedEndTzo: endMeta.forcedTzo,
- isEndExclusive: settings.isEndExclusive
- });
- }
- // TODO: more DRY and optimized
- function buildDateEnv$1(settings) {
- var locale = buildLocale(settings.locale || 'en', parseRawLocales([]).map); // TODO: don't hardcode 'en' everywhere
- // ensure required settings
- settings = __assign({ timeZone: globalDefaults.timeZone, calendarSystem: 'gregory' }, settings, { locale: locale });
- return new DateEnv(settings);
- }
-
- var DRAG_META_PROPS = {
- startTime: createDuration,
- duration: createDuration,
- create: Boolean,
- sourceId: String
- };
- var DRAG_META_DEFAULTS = {
- create: true
- };
- function parseDragMeta(raw) {
- var leftoverProps = {};
- var refined = refineProps(raw, DRAG_META_PROPS, DRAG_META_DEFAULTS, leftoverProps);
- refined.leftoverProps = leftoverProps;
- return refined;
- }
-
- // Computes a default column header formatting string if `colFormat` is not explicitly defined
- function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) {
- // if more than one week row, or if there are a lot of columns with not much space,
- // put just the day numbers will be in each cell
- if (!datesRepDistinctDays || dayCnt > 10) {
- return { weekday: 'short' }; // "Sat"
- }
- else if (dayCnt > 1) {
- return { weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }; // "Sat 11/12"
- }
- else {
- return { weekday: 'long' }; // "Saturday"
- }
- }
- function renderDateCell(dateMarker, dateProfile, datesRepDistinctDays, colCnt, colHeadFormat, context, colspan, otherAttrs) {
- var dateEnv = context.dateEnv, theme = context.theme, options = context.options;
- var isDateValid = rangeContainsMarker(dateProfile.activeRange, dateMarker); // TODO: called too frequently. cache somehow.
- var classNames = [
- 'fc-day-header',
- theme.getClass('widgetHeader')
- ];
- var innerHtml;
- if (typeof options.columnHeaderHtml === 'function') {
- innerHtml = options.columnHeaderHtml(dateEnv.toDate(dateMarker));
- }
- else if (typeof options.columnHeaderText === 'function') {
- innerHtml = htmlEscape(options.columnHeaderText(dateEnv.toDate(dateMarker)));
- }
- else {
- innerHtml = htmlEscape(dateEnv.format(dateMarker, colHeadFormat));
- }
- // if only one row of days, the classNames on the header can represent the specific days beneath
- if (datesRepDistinctDays) {
- classNames = classNames.concat(
- // includes the day-of-week class
- // noThemeHighlight=true (don't highlight the header)
- getDayClasses(dateMarker, dateProfile, context, true));
- }
- else {
- classNames.push('fc-' + DAY_IDS[dateMarker.getUTCDay()]); // only add the day-of-week class
- }
- return '' +
- '<th class="' + classNames.join(' ') + '"' +
- ((isDateValid && datesRepDistinctDays) ?
- ' data-date="' + dateEnv.formatIso(dateMarker, { omitTime: true }) + '"' :
- '') +
- (colspan > 1 ?
- ' colspan="' + colspan + '"' :
- '') +
- (otherAttrs ?
- ' ' + otherAttrs :
- '') +
- '>' +
- (isDateValid ?
- // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)
- buildGotoAnchorHtml(options, dateEnv, { date: dateMarker, forceOff: !datesRepDistinctDays || colCnt === 1 }, innerHtml) :
- // if not valid, display text, but no link
- innerHtml) +
- '</th>';
- }
-
- var DayHeader = /** @class */ (function (_super) {
- __extends(DayHeader, _super);
- function DayHeader(parentEl) {
- var _this = _super.call(this) || this;
- _this.renderSkeleton = memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
- _this.parentEl = parentEl;
- return _this;
- }
- DayHeader.prototype.render = function (props, context) {
- var dates = props.dates, datesRepDistinctDays = props.datesRepDistinctDays;
- var parts = [];
- this.renderSkeleton(context);
- if (props.renderIntroHtml) {
- parts.push(props.renderIntroHtml());
- }
- var colHeadFormat = createFormatter(context.options.columnHeaderFormat ||
- computeFallbackHeaderFormat(datesRepDistinctDays, dates.length));
- for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
- var date = dates_1[_i];
- parts.push(renderDateCell(date, props.dateProfile, datesRepDistinctDays, dates.length, colHeadFormat, context));
- }
- if (context.isRtl) {
- parts.reverse();
- }
- this.thead.innerHTML = '<tr>' + parts.join('') + '</tr>';
- };
- DayHeader.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderSkeleton.unrender();
- };
- DayHeader.prototype._renderSkeleton = function (context) {
- var theme = context.theme;
- var parentEl = this.parentEl;
- parentEl.innerHTML = ''; // because might be nbsp
- parentEl.appendChild(this.el = htmlToElement('<div class="fc-row ' + theme.getClass('headerRow') + '">' +
- '<table class="' + theme.getClass('tableGrid') + '">' +
- '<thead></thead>' +
- '</table>' +
- '</div>'));
- this.thead = this.el.querySelector('thead');
- };
- DayHeader.prototype._unrenderSkeleton = function () {
- removeElement(this.el);
- };
- return DayHeader;
- }(Component));
-
- var DaySeries = /** @class */ (function () {
- function DaySeries(range, dateProfileGenerator) {
- var date = range.start;
- var end = range.end;
- var indices = [];
- var dates = [];
- var dayIndex = -1;
- while (date < end) { // loop each day from start to end
- if (dateProfileGenerator.isHiddenDay(date)) {
- indices.push(dayIndex + 0.5); // mark that it's between indices
- }
- else {
- dayIndex++;
- indices.push(dayIndex);
- dates.push(date);
- }
- date = addDays(date, 1);
- }
- this.dates = dates;
- this.indices = indices;
- this.cnt = dates.length;
- }
- DaySeries.prototype.sliceRange = function (range) {
- var firstIndex = this.getDateDayIndex(range.start); // inclusive first index
- var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index
- var clippedFirstIndex = Math.max(0, firstIndex);
- var clippedLastIndex = Math.min(this.cnt - 1, lastIndex);
- // deal with in-between indices
- clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell
- clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell
- if (clippedFirstIndex <= clippedLastIndex) {
- return {
- firstIndex: clippedFirstIndex,
- lastIndex: clippedLastIndex,
- isStart: firstIndex === clippedFirstIndex,
- isEnd: lastIndex === clippedLastIndex
- };
- }
- else {
- return null;
- }
- };
- // Given a date, returns its chronolocial cell-index from the first cell of the grid.
- // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.
- // If before the first offset, returns a negative number.
- // If after the last offset, returns an offset past the last cell offset.
- // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.
- DaySeries.prototype.getDateDayIndex = function (date) {
- var indices = this.indices;
- var dayOffset = Math.floor(diffDays(this.dates[0], date));
- if (dayOffset < 0) {
- return indices[0] - 1;
- }
- else if (dayOffset >= indices.length) {
- return indices[indices.length - 1] + 1;
- }
- else {
- return indices[dayOffset];
- }
- };
- return DaySeries;
- }());
-
- var DayTable = /** @class */ (function () {
- function DayTable(daySeries, breakOnWeeks) {
- var dates = daySeries.dates;
- var daysPerRow;
- var firstDay;
- var rowCnt;
- if (breakOnWeeks) {
- // count columns until the day-of-week repeats
- firstDay = dates[0].getUTCDay();
- for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow++) {
- if (dates[daysPerRow].getUTCDay() === firstDay) {
- break;
- }
- }
- rowCnt = Math.ceil(dates.length / daysPerRow);
- }
- else {
- rowCnt = 1;
- daysPerRow = dates.length;
- }
- this.rowCnt = rowCnt;
- this.colCnt = daysPerRow;
- this.daySeries = daySeries;
- this.cells = this.buildCells();
- this.headerDates = this.buildHeaderDates();
- }
- DayTable.prototype.buildCells = function () {
- var rows = [];
- for (var row = 0; row < this.rowCnt; row++) {
- var cells = [];
- for (var col = 0; col < this.colCnt; col++) {
- cells.push(this.buildCell(row, col));
- }
- rows.push(cells);
- }
- return rows;
- };
- DayTable.prototype.buildCell = function (row, col) {
- return {
- date: this.daySeries.dates[row * this.colCnt + col]
- };
- };
- DayTable.prototype.buildHeaderDates = function () {
- var dates = [];
- for (var col = 0; col < this.colCnt; col++) {
- dates.push(this.cells[0][col].date);
- }
- return dates;
- };
- DayTable.prototype.sliceRange = function (range) {
- var colCnt = this.colCnt;
- var seriesSeg = this.daySeries.sliceRange(range);
- var segs = [];
- if (seriesSeg) {
- var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex;
- var index = firstIndex;
- while (index <= lastIndex) {
- var row = Math.floor(index / colCnt);
- var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1);
- segs.push({
- row: row,
- firstCol: index % colCnt,
- lastCol: (nextIndex - 1) % colCnt,
- isStart: seriesSeg.isStart && index === firstIndex,
- isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex
- });
- index = nextIndex;
- }
- }
- return segs;
- };
- return DayTable;
- }());
-
- var Slicer = /** @class */ (function () {
- function Slicer() {
- this.sliceBusinessHours = memoize(this._sliceBusinessHours);
- this.sliceDateSelection = memoize(this._sliceDateSpan);
- this.sliceEventStore = memoize(this._sliceEventStore);
- this.sliceEventDrag = memoize(this._sliceInteraction);
- this.sliceEventResize = memoize(this._sliceInteraction);
- }
- Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, calendar, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- var eventUiBases = props.eventUiBases;
- var eventSegs = this.sliceEventStore.apply(this, [props.eventStore, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs));
- return {
- dateSelectionSegs: this.sliceDateSelection.apply(this, [props.dateSelection, eventUiBases, component].concat(extraArgs)),
- businessHourSegs: this.sliceBusinessHours.apply(this, [props.businessHours, dateProfile, nextDayThreshold, calendar, component].concat(extraArgs)),
- fgEventSegs: eventSegs.fg,
- bgEventSegs: eventSegs.bg,
- eventDrag: this.sliceEventDrag.apply(this, [props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
- eventResize: this.sliceEventResize.apply(this, [props.eventResize, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
- eventSelection: props.eventSelection
- }; // TODO: give interactionSegs?
- };
- Slicer.prototype.sliceNowDate = function (// does not memoize
- date, component) {
- var extraArgs = [];
- for (var _i = 2; _i < arguments.length; _i++) {
- extraArgs[_i - 2] = arguments[_i];
- }
- return this._sliceDateSpan.apply(this, [{ range: { start: date, end: addMs(date, 1) }, allDay: false },
- {},
- component].concat(extraArgs));
- };
- Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, calendar, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- if (!businessHours) {
- return [];
- }
- return this._sliceEventStore.apply(this, [expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), calendar),
- {},
- dateProfile,
- nextDayThreshold,
- component].concat(extraArgs)).bg;
- };
- Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- if (eventStore) {
- var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
- return {
- bg: this.sliceEventRanges(rangeRes.bg, component, extraArgs),
- fg: this.sliceEventRanges(rangeRes.fg, component, extraArgs)
- };
- }
- else {
- return { bg: [], fg: [] };
- }
- };
- Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- if (!interaction) {
- return null;
- }
- var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
- return {
- segs: this.sliceEventRanges(rangeRes.fg, component, extraArgs),
- affectedInstances: interaction.affectedEvents.instances,
- isEvent: interaction.isEvent,
- sourceSeg: interaction.origSeg
- };
- };
- Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, component) {
- var extraArgs = [];
- for (var _i = 3; _i < arguments.length; _i++) {
- extraArgs[_i - 3] = arguments[_i];
- }
- if (!dateSpan) {
- return [];
- }
- var eventRange = fabricateEventRange(dateSpan, eventUiBases, component.context.calendar);
- var segs = this.sliceRange.apply(this, [dateSpan.range].concat(extraArgs));
- for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) {
- var seg = segs_1[_a];
- seg.component = component;
- seg.eventRange = eventRange;
- }
- return segs;
- };
- /*
- "complete" seg means it has component and eventRange
- */
- Slicer.prototype.sliceEventRanges = function (eventRanges, component, // TODO: kill
- extraArgs) {
- var segs = [];
- for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
- var eventRange = eventRanges_1[_i];
- segs.push.apply(segs, this.sliceEventRange(eventRange, component, extraArgs));
- }
- return segs;
- };
- /*
- "complete" seg means it has component and eventRange
- */
- Slicer.prototype.sliceEventRange = function (eventRange, component, // TODO: kill
- extraArgs) {
- var segs = this.sliceRange.apply(this, [eventRange.range].concat(extraArgs));
- for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
- var seg = segs_2[_i];
- seg.component = component;
- seg.eventRange = eventRange;
- seg.isStart = eventRange.isStart && seg.isStart;
- seg.isEnd = eventRange.isEnd && seg.isEnd;
- }
- return segs;
- };
- return Slicer;
- }());
- /*
- for incorporating minTime/maxTime if appropriate
- TODO: should be part of DateProfile!
- TimelineDateProfile already does this btw
- */
- function computeActiveRange(dateProfile, isComponentAllDay) {
- var range = dateProfile.activeRange;
- if (isComponentAllDay) {
- return range;
- }
- return {
- start: addMs(range.start, dateProfile.minTime.milliseconds),
- end: addMs(range.end, dateProfile.maxTime.milliseconds - 864e5) // 864e5 = ms in a day
- };
- }
-
- // exports
- // --------------------------------------------------------------------------------------------------
- var version = '4.4.2';
-
- exports.Calendar = Calendar;
- exports.Component = Component;
- exports.ComponentContext = ComponentContext;
- exports.DateComponent = DateComponent;
- exports.DateEnv = DateEnv;
- exports.DateProfileGenerator = DateProfileGenerator;
- exports.DayHeader = DayHeader;
- exports.DaySeries = DaySeries;
- exports.DayTable = DayTable;
- exports.ElementDragging = ElementDragging;
- exports.ElementScrollController = ElementScrollController;
- exports.EmitterMixin = EmitterMixin;
- exports.EventApi = EventApi;
- exports.FgEventRenderer = FgEventRenderer;
- exports.FillRenderer = FillRenderer;
- exports.Interaction = Interaction;
- exports.Mixin = Mixin;
- exports.NamedTimeZoneImpl = NamedTimeZoneImpl;
- exports.PositionCache = PositionCache;
- exports.ScrollComponent = ScrollComponent;
- exports.ScrollController = ScrollController;
- exports.Slicer = Slicer;
- exports.Splitter = Splitter;
- exports.Theme = Theme;
- exports.View = View;
- exports.WindowScrollController = WindowScrollController;
- exports.addDays = addDays;
- exports.addDurations = addDurations;
- exports.addMs = addMs;
- exports.addWeeks = addWeeks;
- exports.allowContextMenu = allowContextMenu;
- exports.allowSelection = allowSelection;
- exports.appendToElement = appendToElement;
- exports.applyAll = applyAll;
- exports.applyMutationToEventStore = applyMutationToEventStore;
- exports.applyStyle = applyStyle;
- exports.applyStyleProp = applyStyleProp;
- exports.asRoughMinutes = asRoughMinutes;
- exports.asRoughMs = asRoughMs;
- exports.asRoughSeconds = asRoughSeconds;
- exports.buildGotoAnchorHtml = buildGotoAnchorHtml;
- exports.buildSegCompareObj = buildSegCompareObj;
- exports.capitaliseFirstLetter = capitaliseFirstLetter;
- exports.combineEventUis = combineEventUis;
- exports.compareByFieldSpec = compareByFieldSpec;
- exports.compareByFieldSpecs = compareByFieldSpecs;
- exports.compareNumbers = compareNumbers;
- exports.compensateScroll = compensateScroll;
- exports.computeClippingRect = computeClippingRect;
- exports.computeEdges = computeEdges;
- exports.computeEventDraggable = computeEventDraggable;
- exports.computeEventEndResizable = computeEventEndResizable;
- exports.computeEventStartResizable = computeEventStartResizable;
- exports.computeFallbackHeaderFormat = computeFallbackHeaderFormat;
- exports.computeHeightAndMargins = computeHeightAndMargins;
- exports.computeInnerRect = computeInnerRect;
- exports.computeRect = computeRect;
- exports.computeVisibleDayRange = computeVisibleDayRange;
- exports.config = config;
- exports.constrainPoint = constrainPoint;
- exports.createDuration = createDuration;
- exports.createElement = createElement;
- exports.createEmptyEventStore = createEmptyEventStore;
- exports.createEventInstance = createEventInstance;
- exports.createFormatter = createFormatter;
- exports.createPlugin = createPlugin;
- exports.cssToStr = cssToStr;
- exports.debounce = debounce;
- exports.diffDates = diffDates;
- exports.diffDayAndTime = diffDayAndTime;
- exports.diffDays = diffDays;
- exports.diffPoints = diffPoints;
- exports.diffWeeks = diffWeeks;
- exports.diffWholeDays = diffWholeDays;
- exports.diffWholeWeeks = diffWholeWeeks;
- exports.disableCursor = disableCursor;
- exports.distributeHeight = distributeHeight;
- exports.elementClosest = elementClosest;
- exports.elementMatches = elementMatches;
- exports.enableCursor = enableCursor;
- exports.eventTupleToStore = eventTupleToStore;
- exports.filterEventStoreDefs = filterEventStoreDefs;
- exports.filterHash = filterHash;
- exports.findChildren = findChildren;
- exports.findElements = findElements;
- exports.flexibleCompare = flexibleCompare;
- exports.forceClassName = forceClassName;
- exports.formatDate = formatDate;
- exports.formatIsoTimeString = formatIsoTimeString;
- exports.formatRange = formatRange;
- exports.getAllDayHtml = getAllDayHtml;
- exports.getClippingParents = getClippingParents;
- exports.getDayClasses = getDayClasses;
- exports.getElSeg = getElSeg;
- exports.getRectCenter = getRectCenter;
- exports.getRelevantEvents = getRelevantEvents;
- exports.globalDefaults = globalDefaults;
- exports.greatestDurationDenominator = greatestDurationDenominator;
- exports.hasBgRendering = hasBgRendering;
- exports.htmlEscape = htmlEscape;
- exports.htmlToElement = htmlToElement;
- exports.insertAfterElement = insertAfterElement;
- exports.interactionSettingsStore = interactionSettingsStore;
- exports.interactionSettingsToStore = interactionSettingsToStore;
- exports.intersectRanges = intersectRanges;
- exports.intersectRects = intersectRects;
- exports.isArraysEqual = isArraysEqual;
- exports.isDateSpansEqual = isDateSpansEqual;
- exports.isInt = isInt;
- exports.isInteractionValid = isInteractionValid;
- exports.isMultiDayRange = isMultiDayRange;
- exports.isPropsEqual = isPropsEqual;
- exports.isPropsValid = isPropsValid;
- exports.isSingleDay = isSingleDay;
- exports.isValidDate = isValidDate;
- exports.listenBySelector = listenBySelector;
- exports.mapHash = mapHash;
- exports.matchCellWidths = matchCellWidths;
- exports.memoize = memoize;
- exports.memoizeOutput = memoizeOutput;
- exports.memoizeRendering = memoizeRendering;
- exports.mergeEventStores = mergeEventStores;
- exports.multiplyDuration = multiplyDuration;
- exports.padStart = padStart;
- exports.parseBusinessHours = parseBusinessHours;
- exports.parseDragMeta = parseDragMeta;
- exports.parseEventDef = parseEventDef;
- exports.parseFieldSpecs = parseFieldSpecs;
- exports.parseMarker = parse;
- exports.pointInsideRect = pointInsideRect;
- exports.prependToElement = prependToElement;
- exports.preventContextMenu = preventContextMenu;
- exports.preventDefault = preventDefault;
- exports.preventSelection = preventSelection;
- exports.processScopedUiProps = processScopedUiProps;
- exports.rangeContainsMarker = rangeContainsMarker;
- exports.rangeContainsRange = rangeContainsRange;
- exports.rangesEqual = rangesEqual;
- exports.rangesIntersect = rangesIntersect;
- exports.refineProps = refineProps;
- exports.removeElement = removeElement;
- exports.removeExact = removeExact;
- exports.renderDateCell = renderDateCell;
- exports.requestJson = requestJson;
- exports.sliceEventStore = sliceEventStore;
- exports.startOfDay = startOfDay;
- exports.subtractInnerElHeight = subtractInnerElHeight;
- exports.translateRect = translateRect;
- exports.uncompensateScroll = uncompensateScroll;
- exports.undistributeHeight = undistributeHeight;
- exports.unpromisify = unpromisify;
- exports.version = version;
- exports.whenTransitionDone = whenTransitionDone;
- exports.wholeDivideDurations = wholeDivideDurations;
-
- Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/library/fullcalendar/packages/core/main.min.css b/library/fullcalendar/packages/core/main.min.css
deleted file mode 100644
index 8948b534b..000000000
--- a/library/fullcalendar/packages/core/main.min.css
+++ /dev/null
@@ -1 +0,0 @@
-@charset "UTF-8";.fc-button:not(:disabled),.fc-event.fc-draggable,.fc-event[href],.fc-popover .fc-header .fc-close,a.fc-more,a[data-goto]{cursor:pointer}.fc-bg,.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-highlight{background:#bce8f1;opacity:.3}.fc-bgevent{background:#8fdf82;opacity:.3}.fc-nonbusiness{background:#d7d7d7}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:2px 4px}.fc-rtl .fc-popover .fc-header{flex-direction:row-reverse}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{opacity:.65;font-size:1.1em}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-bg table,.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-bg,.fc-bgevent-skeleton,.fc-highlight-skeleton,.fc-mirror-skeleton{position:absolute;top:0;left:0;right:0}.fc table{width:100%;box-sizing:border-box;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}a[data-goto]:hover{text-decoration:underline}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-mirror-skeleton{z-index:5}.fc .fc-row .fc-content-skeleton table,.fc .fc-row .fc-content-skeleton td,.fc .fc-row .fc-mirror-skeleton td{background:0 0;border-color:transparent}.fc-row .fc-content-skeleton td,.fc-row .fc-mirror-skeleton td{border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-mirror-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.4;border-radius:3px;border:1px solid #3788d8}.fc-event,.fc-event-dot{background-color:#3788d8}.fc-event,.fc-event:hover{color:#fff;text-decoration:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4;display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25}.fc-event.fc-dragging.fc-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event.fc-dragging:not(.fc-selected){opacity:.75}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}tr:first-child>td>.fc-day-grid-event{margin-top:2px}.fc-mirror-skeleton tr:first-child>td>.fc-day-grid-event{margin-top:0}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-button,.fc-icon{display:inline-block;font-weight:400;text-align:center}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed td.fc-today{background:#fcf8e3}.fc-unthemed .fc-disabled-day{background:#d7d7d7;opacity:.3}@font-face{font-family:fcicons;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");font-weight:400;font-style:normal}.fc-icon{font-family:fcicons!important;speak:none;font-style:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:1em;height:1em}.fc-icon-chevron-left:before{content:""}.fc-icon-chevron-right:before{content:""}.fc-icon-chevrons-left:before{content:""}.fc-icon-chevrons-right:before{content:""}.fc-icon-minus-square:before{content:""}.fc-icon-plus-square:before{content:""}.fc-icon-x:before{content:""}.fc-button{overflow:visible;text-transform:none;margin:0;font-family:inherit}.fc-button::-moz-focus-inner{padding:0;border-style:none}.fc-button{-webkit-appearance:button;color:#212529;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc-button:hover{color:#212529;text-decoration:none}.fc-button:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(44,62,80,.25);box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc-button:disabled{opacity:.65}.fc-button-primary{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.fc-button-primary:hover{color:#fff;background-color:#1e2b37;border-color:#1a252f}.fc-button-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button-primary:disabled{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.fc-button-primary:not(:disabled).fc-button-active,.fc-button-primary:not(:disabled):active{color:#fff;background-color:#1a252f;border-color:#151e27}.fc-button-primary:not(:disabled).fc-button-active:focus,.fc-button-primary:not(:disabled):active:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button .fc-icon{vertical-align:middle;font-size:1.5em}.fc-button-group{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.fc-button-group>.fc-button{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.fc-button-group>.fc-button.fc-button-active,.fc-button-group>.fc-button:active,.fc-button-group>.fc-button:focus,.fc-button-group>.fc-button:hover{z-index:1}.fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-list-item:hover td{background-color:#f5f5f5}.fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-toolbar h2{font-size:1.75em;margin:0}.fc-view-container{position:relative}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}@media print{.fc-bg,.fc-bgevent-container,.fc-bgevent-skeleton,.fc-business-container,.fc-event .fc-resizer,.fc-highlight-container,.fc-highlight-skeleton,.fc-mirror-container,.fc-mirror-skeleton{display:none}.fc tbody .fc-row,.fc-time-grid{min-height:0!important}.fc-time-grid .fc-event.fc-not-end:after,.fc-time-grid .fc-event.fc-not-start:before{content:"..."}.fc{max-width:100%!important}.fc-event{background:#fff!important;color:#000!important;page-break-inside:avoid}.fc hr,.fc tbody,.fc td,.fc th,.fc thead,.fc-row{border-color:#ccc!important;background:#fff!important}.fc tbody .fc-row{height:auto!important}.fc tbody .fc-row .fc-content-skeleton{position:static;padding-bottom:0!important}.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td{padding-bottom:1em}.fc tbody .fc-row .fc-content-skeleton table{height:1em}.fc-more,.fc-more-cell{display:none!important}.fc tr.fc-limited{display:table-row!important}.fc td.fc-limited{display:table-cell!important}.fc-popover,.fc-timeGrid-view .fc-axis{display:none}.fc-slats,.fc-time-grid hr{display:none!important}.fc button,.fc-button-group,.fc-time-grid .fc-event .fc-time span{display:none}.fc-time-grid .fc-content-skeleton{position:static}.fc-time-grid .fc-content-skeleton table{height:4em}.fc-time-grid .fc-event-container{margin:0!important}.fc-time-grid .fc-event{position:static!important;margin:3px 2px!important}.fc-time-grid .fc-event.fc-not-end{border-bottom-width:1px!important}.fc-time-grid .fc-event.fc-not-start{border-top-width:1px!important}.fc-time-grid .fc-event .fc-time{white-space:normal!important}.fc-time-grid .fc-event .fc-time:after{content:attr(data-full)}.fc-day-grid-container,.fc-scroller,.fc-time-grid-container{overflow:visible!important;height:auto!important}.fc-row{border:0!important;margin:0!important}} \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/main.min.js b/library/fullcalendar/packages/core/main.min.js
deleted file mode 100644
index 8745717dd..000000000
--- a/library/fullcalendar/packages/core/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Core Package v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).FullCalendar={})}(this,(function(e){"use strict";var t={className:!0,colSpan:!0,rowSpan:!0},n={"<tr":"tbody","<td":"tr"};function r(e,n,r){var i=document.createElement(e);if(n)for(var o in n)"style"===o?y(i,n[o]):t[o]?i[o]=n[o]:i.setAttribute(o,n[o]);return"string"==typeof r?i.innerHTML=r:null!=r&&s(i,r),i}function i(e){e=e.trim();var t=document.createElement(a(e));return t.innerHTML=e,t.firstChild}function o(e){return Array.prototype.slice.call(function(e){e=e.trim();var t=document.createElement(a(e));return t.innerHTML=e,t.childNodes}(e))}function a(e){return n[e.substr(0,3)]||"div"}function s(e,t){for(var n=l(t),r=0;r<n.length;r++)e.appendChild(n[r])}function u(e,t){for(var n=l(t),r=e.firstChild||null,i=0;i<n.length;i++)e.insertBefore(n[i],r)}function l(e){return"string"==typeof e?o(e):e instanceof Node?[e]:Array.prototype.slice.call(e)}function c(e){e.parentNode&&e.parentNode.removeChild(e)}var d=Element.prototype.matches||Element.prototype.matchesSelector||Element.prototype.msMatchesSelector,f=Element.prototype.closest||function(e){var t=this;if(!document.documentElement.contains(t))return null;do{if(h(t,e))return t;t=t.parentElement||t.parentNode}while(null!==t&&1===t.nodeType);return null};function p(e,t){return f.call(e,t)}function h(e,t){return d.call(e,t)}function v(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],i=0;i<n.length;i++)for(var o=n[i].querySelectorAll(t),a=0;a<o.length;a++)r.push(o[a]);return r}var g=/(top|left|right|bottom|width|height)$/i;function y(e,t){for(var n in t)m(e,n,t[n])}function m(e,t,n){null==n?e.style[t]="":"number"==typeof n&&g.test(t)?e.style[t]=n+"px":e.style[t]=n}function E(e,t){var n={left:Math.max(e.left,t.left),right:Math.min(e.right,t.right),top:Math.max(e.top,t.top),bottom:Math.min(e.bottom,t.bottom)};return n.left<n.right&&n.top<n.bottom&&n}var S=null;function b(){return null===S&&(S=function(){var e=r("div",{style:{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}},"<div></div>");document.body.appendChild(e);var t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return c(e),t}()),S}function D(e){return e=Math.max(0,e),e=Math.round(e)}function T(e,t){void 0===t&&(t=!1);var n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,i=parseInt(n.borderRightWidth,10)||0,o=parseInt(n.borderTopWidth,10)||0,a=parseInt(n.borderBottomWidth,10)||0,s=D(e.offsetWidth-e.clientWidth-r-i),u={borderLeft:r,borderRight:i,borderTop:o,borderBottom:a,scrollbarBottom:D(e.offsetHeight-e.clientHeight-o-a),scrollbarLeft:0,scrollbarRight:0};return b()&&"rtl"===n.direction?u.scrollbarLeft=s:u.scrollbarRight=s,t&&(u.paddingLeft=parseInt(n.paddingLeft,10)||0,u.paddingRight=parseInt(n.paddingRight,10)||0,u.paddingTop=parseInt(n.paddingTop,10)||0,u.paddingBottom=parseInt(n.paddingBottom,10)||0),u}function w(e,t){void 0===t&&(t=!1);var n=R(e),r=T(e,t),i={left:n.left+r.borderLeft+r.scrollbarLeft,right:n.right-r.borderRight-r.scrollbarRight,top:n.top+r.borderTop,bottom:n.bottom-r.borderBottom-r.scrollbarBottom};return t&&(i.left+=r.paddingLeft,i.right-=r.paddingRight,i.top+=r.paddingTop,i.bottom-=r.paddingBottom),i}function R(e){var t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function C(e){return e.getBoundingClientRect().height+I(e)}function I(e){var t=window.getComputedStyle(e);return parseInt(t.marginTop,10)+parseInt(t.marginBottom,10)}function M(e){for(var t=[];e instanceof HTMLElement;){var n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function k(e){e.preventDefault()}function _(e,t,n,r){function i(e){var t=p(e.target,n);t&&r.call(t,e,t)}return e.addEventListener(t,i),function(){e.removeEventListener(t,i)}}var O=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];var P=["sun","mon","tue","wed","thu","fri","sat"];function x(e,t){var n=Z(e);return n[2]+=t,j(n)}function N(e,t){var n=Z(e);return n[6]+=t,j(n)}function H(e,t){return(t.valueOf()-e.valueOf())/864e5}function U(e,t){var n=B(e),r=B(t);return{years:0,months:0,days:Math.round(H(n,r)),milliseconds:t.valueOf()-r.valueOf()-(e.valueOf()-n.valueOf())}}function z(e,t){var n=L(e,t);return null!==n&&n%7==0?n/7:null}function L(e,t){return q(e)===q(t)?Math.round(H(e,t)):null}function B(e){return j([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()])}function V(e,t,n,r){var i=j([t,0,1+A(t,n,r)]),o=B(e),a=Math.round(H(i,o));return Math.floor(a/7)+1}function A(e,t,n){var r=7+t-n;return-((7+j([e,0,r]).getUTCDay()-t)%7)+r-1}function F(e){return[e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()]}function W(e){return new Date(e[0],e[1]||0,null==e[2]?1:e[2],e[3]||0,e[4]||0,e[5]||0)}function Z(e){return[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()]}function j(e){return 1===e.length&&(e=e.concat([0])),new Date(Date.UTC.apply(Date,e))}function Y(e){return!isNaN(e.valueOf())}function q(e){return 1e3*e.getUTCHours()*60*60+1e3*e.getUTCMinutes()*60+1e3*e.getUTCSeconds()+e.getUTCMilliseconds()}var G=["years","months","days","milliseconds"],X=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function J(e,t){var n;return"string"==typeof e?function(e){var t=X.exec(e);if(t){var n=t[1]?-1:1;return{years:0,months:0,days:n*(t[2]?parseInt(t[2],10):0),milliseconds:n*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?K(e):"number"==typeof e?K(((n={})[t||"milliseconds"]=e,n)):null}function K(e){return{years:e.years||e.year||0,months:e.months||e.month||0,days:(e.days||e.day||0)+7*Q(e),milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)}}function Q(e){return e.weeks||e.week||0}function $(e,t){return e.years===t.years&&e.months===t.months&&e.days===t.days&&e.milliseconds===t.milliseconds}function ee(e){return te(e)/864e5}function te(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function ne(e,t){var n=e.milliseconds;if(n){if(n%1e3!=0)return{unit:"millisecond",value:n};if(n%6e4!=0)return{unit:"second",value:n/1e3};if(n%36e5!=0)return{unit:"minute",value:n/6e4};if(n)return{unit:"hour",value:n/36e5}}return e.days?t||e.days%7!=0?{unit:"day",value:e.days}:{unit:"week",value:e.days/7}:e.months?{unit:"month",value:e.months}:e.years?{unit:"year",value:e.years}:{unit:"millisecond",value:0}}function re(e){e.forEach((function(e){e.style.height=""}))}function ie(e){var t,n,r=[],i=[];for("string"==typeof e?i=e.split(/\s*,\s*/):"function"==typeof e?i=[e]:Array.isArray(e)&&(i=e),t=0;t<i.length;t++)"string"==typeof(n=i[t])?r.push("-"===n.charAt(0)?{field:n.substring(1),order:-1}:{field:n,order:1}):"function"==typeof n&&r.push({func:n});return r}function oe(e,t,n){var r,i;for(r=0;r<n.length;r++)if(i=ae(e,t,n[r]))return i;return 0}function ae(e,t,n){return n.func?n.func(e,t):se(e[n.field],t[n.field])*(n.order||1)}function se(e,t){return e||t?null==t?-1:null==e?1:"string"==typeof e||"string"==typeof t?String(e).localeCompare(String(t)):e-t:0}function ue(e){return e.charAt(0).toUpperCase()+e.slice(1)}function le(e,t){var n=String(e);return"000".substr(0,t-n.length)+n}function ce(e){return e%1==0}function de(e,t,n){if("function"==typeof e&&(e=[e]),e){var r=void 0,i=void 0;for(r=0;r<e.length;r++)i=e[r].apply(t,n)||i;return i}}function fe(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var n=0;n<e.length;n++)if(void 0!==e[n])return e[n]}function pe(e,t){var n,r,i,o,a,s=function(){var u=(new Date).valueOf()-o;u<t?n=setTimeout(s,t-u):(n=null,a=e.apply(i,r),i=r=null)};return function(){return i=this,r=arguments,o=(new Date).valueOf(),n||(n=setTimeout(s,t)),a}}function he(e,t,n,r){void 0===n&&(n={});var i={};for(var o in t){var a=t[o];void 0!==e[o]?i[o]=a===Function?"function"==typeof e[o]?e[o]:null:a?a(e[o]):e[o]:void 0!==n[o]?i[o]=n[o]:a===String?i[o]="":a&&a!==Number&&a!==Boolean&&a!==Function?i[o]=a(null):i[o]=null}if(r)for(var o in e)void 0===t[o]&&(r[o]=e[o]);return i}function ve(e){var t=Math.floor(H(e.start,e.end))||1,n=B(e.start);return{start:n,end:x(n,t)}}function ge(e,t){void 0===t&&(t=J(0));var n=null,r=null;if(e.end){r=B(e.end);var i=e.end.valueOf()-r.valueOf();i&&i>=te(t)&&(r=x(r,1))}return e.start&&(n=B(e.start),r&&r<=n&&(r=x(n,1))),{start:n,end:r}}function ye(e,t,n,r){return"year"===r?J(n.diffWholeYears(e,t),"year"):"month"===r?J(n.diffWholeMonths(e,t),"month"):U(e,t)}var me=function(e,t){return(me=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function Ee(e,t){function n(){this.constructor=e}me(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var Se=function(){return(Se=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};function be(e,t,n,r,i){var o=i[e.recurringDef.typeId].expand(e.recurringDef.typeData,{start:r.subtract(n.start,t),end:n.end},r);return e.allDay&&(o=o.map(B)),o}var De=Object.prototype.hasOwnProperty;function Te(e,t){var n,r,i,o,a,s,u={};if(t)for(n=0;n<t.length;n++){for(r=t[n],i=[],o=e.length-1;o>=0;o--)if("object"==typeof(a=e[o][r])&&a)i.unshift(a);else if(void 0!==a){u[r]=a;break}i.length&&(u[r]=Te(i))}for(n=e.length-1;n>=0;n--)for(r in s=e[n])r in u||(u[r]=s[r]);return u}function we(e,t){var n={};for(var r in e)t(e[r],r)&&(n[r]=e[r]);return n}function Re(e,t){var n={};for(var r in e)n[r]=t(e[r],r);return n}function Ce(e){for(var t={},n=0,r=e;n<r.length;n++){t[r[n]]=!0}return t}function Ie(e){var t=[];for(var n in e)t.push(e[n]);return t}function Me(e,t){for(var n in e)if(De.call(e,n)&&!(n in t))return!1;for(var n in t)if(De.call(t,n)&&e[n]!==t[n])return!1;return!0}function ke(e,t,n,r){for(var i={defs:{},instances:{}},o=0,a=e;o<a.length;o++){var s=Zt(a[o],t,n,r);s&&_e(s,i)}return i}function _e(e,t){return void 0===t&&(t={defs:{},instances:{}}),t.defs[e.def.defId]=e.def,e.instance&&(t.instances[e.instance.instanceId]=e.instance),t}function Oe(e,t,n){var r=n.dateEnv,i=e.defs,o=e.instances;for(var a in o=we(o,(function(e){return!i[e.defId].recurringDef})),i){var s=i[a];if(s.recurringDef){var u=s.recurringDef.duration;u||(u=s.allDay?n.defaultAllDayEventDuration:n.defaultTimedEventDuration);for(var l=0,c=be(s,u,t,n.dateEnv,n.pluginSystem.hooks.recurringTypes);l<c.length;l++){var d=c[l],f=Yt(a,{start:d,end:r.add(d,u)});o[f.instanceId]=f}}}return{defs:i,instances:o}}function Pe(e,t){var n=e.instances[t];if(n){var r=e.defs[n.defId],i=Ue(e,(function(e){return t=r,n=e,Boolean(t.groupId&&t.groupId===n.groupId);var t,n}));return i.defs[r.defId]=r,i.instances[n.instanceId]=n,i}return{defs:{},instances:{}}}function xe(e,t){var n;if(t){n=[];for(var r=0,i=e;r<i.length;r++){var o=i[r],a=t(o);a?n.push(a):null==a&&n.push(o)}}else n=e;return n}function Ne(){return{defs:{},instances:{}}}function He(e,t){return{defs:Se({},e.defs,t.defs),instances:Se({},e.instances,t.instances)}}function Ue(e,t){var n=we(e.defs,t),r=we(e.instances,(function(e){return n[e.defId]}));return{defs:n,instances:r}}function ze(e,t){var n=null,r=null;return e.start&&(n=t.createMarker(e.start)),e.end&&(r=t.createMarker(e.end)),n||r?n&&r&&r<n?null:{start:n,end:r}:null}function Le(e,t){var n,r,i=[],o=t.start;for(e.sort(Be),n=0;n<e.length;n++)(r=e[n]).start>o&&i.push({start:o,end:r.start}),r.end>o&&(o=r.end);return o<t.end&&i.push({start:o,end:t.end}),i}function Be(e,t){return e.start.valueOf()-t.start.valueOf()}function Ve(e,t){var n=e.start,r=e.end,i=null;return null!==t.start&&(n=null===n?t.start:new Date(Math.max(n.valueOf(),t.start.valueOf()))),null!=t.end&&(r=null===r?t.end:new Date(Math.min(r.valueOf(),t.end.valueOf()))),(null===n||null===r||n<r)&&(i={start:n,end:r}),i}function Ae(e,t){return(null===e.start?null:e.start.valueOf())===(null===t.start?null:t.start.valueOf())&&(null===e.end?null:e.end.valueOf())===(null===t.end?null:t.end.valueOf())}function Fe(e,t){return(null===e.end||null===t.start||e.end>t.start)&&(null===e.start||null===t.end||e.start<t.end)}function We(e,t){return(null===e.start||null!==t.start&&t.start>=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function Ze(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t<e.end)}function je(e,t){var n,r=e.length;if(r!==t.length)return!1;for(n=0;n<r;n++)if(e[n]!==t[n])return!1;return!0}function Ye(e){var t,n;return function(){return t&&je(t,arguments)||(t=arguments,n=e.apply(this,arguments)),n}}function qe(e,t){var n=null;return function(){var r=e.apply(this,arguments);return(null===n||n!==r&&!t(n,r))&&(n=r),n}}var Ge={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0},Xe={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1},Je=/\s*([ap])\.?m\.?/i,Ke=/,/g,Qe=/\s+/g,$e=/\u200e/g,et=/UTC|GMT/,tt=function(){function e(e){var t={},n={},r=0;for(var i in e)i in Ge?(n[i]=e[i],r=Math.max(Ge[i],r)):(t[i]=e[i],i in Xe&&(r=Math.max(Xe[i],r)));this.standardDateProps=t,this.extendedSettings=n,this.severity=r,this.buildFormattingFunc=Ye(nt)}return e.prototype.format=function(e,t){return this.buildFormattingFunc(this.standardDateProps,this.extendedSettings,t)(e)},e.prototype.formatRange=function(e,t,n){var r=this.standardDateProps,i=this.extendedSettings,o=function(e,t,n){if(n.getMarkerYear(e)!==n.getMarkerYear(t))return 5;if(n.getMarkerMonth(e)!==n.getMarkerMonth(t))return 4;if(n.getMarkerDay(e)!==n.getMarkerDay(t))return 2;if(q(e)!==q(t))return 1;return 0}(e.marker,t.marker,n.calendarSystem);if(!o)return this.format(e,n);var a=o;!(a>1)||"numeric"!==r.year&&"2-digit"!==r.year||"numeric"!==r.month&&"2-digit"!==r.month||"numeric"!==r.day&&"2-digit"!==r.day||(a=1);var s=this.format(e,n),u=this.format(t,n);if(s===u)return s;var l=nt(function(e,t){var n={};for(var r in e)(!(r in Xe)||Xe[r]<=t)&&(n[r]=e[r]);return n}(r,a),i,n),c=l(e),d=l(t),f=function(e,t,n,r){var i=0;for(;i<e.length;){var o=e.indexOf(t,i);if(-1===o)break;var a=e.substr(0,o);i=o+t.length;for(var s=e.substr(i),u=0;u<n.length;){var l=n.indexOf(r,u);if(-1===l)break;var c=n.substr(0,l);u=l+r.length;var d=n.substr(u);if(a===c&&s===d)return{before:a,after:s}}}return null}(s,c,u,d),p=i.separator||"";return f?f.before+c+p+d+f.after:s+p+u},e.prototype.getLargestUnit=function(){switch(this.severity){case 7:case 6:case 5:return"year";case 4:return"month";case 3:return"week";default:return"day"}},e}();function nt(e,t,n){var r=Object.keys(e).length;return 1===r&&"short"===e.timeZoneName?function(e){return at(e.timeZoneOffset)}:0===r&&t.week?function(e){return function(e,t,n,r){var i=[];"narrow"===r?i.push(t):"short"===r&&i.push(t," ");i.push(n.simpleNumberFormat.format(e)),n.options.isRtl&&i.reverse();return i.join("")}(n.computeWeekNumber(e.marker),n.weekLabel,n.locale,t.week)}:function(e,t,n){e=Se({},e),t=Se({},t),function(e,t){e.timeZoneName&&(e.hour||(e.hour="2-digit"),e.minute||(e.minute="2-digit"));"long"===e.timeZoneName&&(e.timeZoneName="short");t.omitZeroMinute&&(e.second||e.millisecond)&&delete t.omitZeroMinute}(e,t),e.timeZone="UTC";var r,i=new Intl.DateTimeFormat(n.locale.codes,e);if(t.omitZeroMinute){var o=Se({},e);delete o.minute,r=new Intl.DateTimeFormat(n.locale.codes,o)}return function(o){var a=o.marker;return function(e,t,n,r,i){e=e.replace($e,""),"short"===n.timeZoneName&&(e=function(e,t){var n=!1;e=e.replace(et,(function(){return n=!0,t})),n||(e+=" "+t);return e}(e,"UTC"===i.timeZone||null==t.timeZoneOffset?"UTC":at(t.timeZoneOffset)));r.omitCommas&&(e=e.replace(Ke,"").trim());r.omitZeroMinute&&(e=e.replace(":00",""));!1===r.meridiem?e=e.replace(Je,"").trim():"narrow"===r.meridiem?e=e.replace(Je,(function(e,t){return t.toLocaleLowerCase()})):"short"===r.meridiem?e=e.replace(Je,(function(e,t){return t.toLocaleLowerCase()+"m"})):"lowercase"===r.meridiem&&(e=e.replace(Je,(function(e){return e.toLocaleLowerCase()})));return e=(e=e.replace(Qe," ")).trim()}((r&&!a.getUTCMinutes()?r:i).format(a),o,e,t,n)}}(e,t,n)}var rt=function(){function e(e,t){this.cmdStr=e,this.separator=t}return e.prototype.format=function(e,t){return t.cmdFormatter(this.cmdStr,st(e,null,t,this.separator))},e.prototype.formatRange=function(e,t,n){return n.cmdFormatter(this.cmdStr,st(e,t,n,this.separator))},e}(),it=function(){function e(e){this.func=e}return e.prototype.format=function(e,t){return this.func(st(e,null,t))},e.prototype.formatRange=function(e,t,n){return this.func(st(e,t,n))},e}();function ot(e,t){return"object"==typeof e&&e?("string"==typeof t&&(e=Se({separator:t},e)),new tt(e)):"string"==typeof e?new rt(e,t):"function"==typeof e?new it(e):void 0}function at(e,t){void 0===t&&(t=!1);var n=e<0?"-":"+",r=Math.abs(e),i=Math.floor(r/60),o=Math.round(r%60);return t?n+le(i,2)+":"+le(o,2):"GMT"+n+i+(o?":"+le(o,2):"")}function st(e,t,n,r){var i=ut(e,n.calendarSystem);return{date:i,start:i,end:t?ut(t,n.calendarSystem):null,timeZone:n.timeZone,localeCodes:n.locale.codes,separator:r}}function ut(e,t){var n=t.markerToArray(e.marker);return{marker:e.marker,timeZoneOffset:e.timeZoneOffset,array:n,year:n[0],month:n[1],day:n[2],hour:n[3],minute:n[4],second:n[5],millisecond:n[6]}}var lt=function(){function e(e,t){this.calendar=e,this.internalEventSource=t}return e.prototype.remove=function(){this.calendar.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:this.internalEventSource.sourceId})},e.prototype.refetch=function(){this.calendar.dispatch({type:"FETCH_EVENT_SOURCES",sourceIds:[this.internalEventSource.sourceId]})},Object.defineProperty(e.prototype,"id",{get:function(){return this.internalEventSource.publicId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this.internalEventSource.meta.url},enumerable:!0,configurable:!0}),e}(),ct=function(){function e(e,t,n){this._calendar=e,this._def=t,this._instance=n||null}return e.prototype.setProp=function(e,t){var n,r;if(e in Ft);else if(e in At)"function"==typeof At[e]&&(t=At[e](t)),this.mutate({standardProps:(n={},n[e]=t,n)});else if(e in Ht){var i=void 0;"function"==typeof Ht[e]&&(t=Ht[e](t)),"color"===e?i={backgroundColor:t,borderColor:t}:"editable"===e?i={startEditable:t,durationEditable:t}:((r={})[e]=t,i=r),this.mutate({standardProps:{ui:i}})}},e.prototype.setExtendedProp=function(e,t){var n;this.mutate({extendedProps:(n={},n[e]=t,n)})},e.prototype.setStart=function(e,t){void 0===t&&(t={});var n=this._calendar.dateEnv,r=n.createMarker(e);if(r&&this._instance){var i=ye(this._instance.range.start,r,n,t.granularity);t.maintainDuration?this.mutate({datesDelta:i}):this.mutate({startDelta:i})}},e.prototype.setEnd=function(e,t){void 0===t&&(t={});var n,r=this._calendar.dateEnv;if((null==e||(n=r.createMarker(e)))&&this._instance)if(n){var i=ye(this._instance.range.end,n,r,t.granularity);this.mutate({endDelta:i})}else this.mutate({standardProps:{hasEnd:!1}})},e.prototype.setDates=function(e,t,n){void 0===n&&(n={});var r,i=this._calendar.dateEnv,o={allDay:n.allDay},a=i.createMarker(e);if(a&&(null==t||(r=i.createMarker(t)))&&this._instance){var s=this._instance.range;!0===n.allDay&&(s=ve(s));var u=ye(s.start,a,i,n.granularity);if(r){var l=ye(s.end,r,i,n.granularity);$(u,l)?this.mutate({datesDelta:u,standardProps:o}):this.mutate({startDelta:u,endDelta:l,standardProps:o})}else o.hasEnd=!1,this.mutate({datesDelta:u,standardProps:o})}},e.prototype.moveStart=function(e){var t=J(e);t&&this.mutate({startDelta:t})},e.prototype.moveEnd=function(e){var t=J(e);t&&this.mutate({endDelta:t})},e.prototype.moveDates=function(e){var t=J(e);t&&this.mutate({datesDelta:t})},e.prototype.setAllDay=function(e,t){void 0===t&&(t={});var n={allDay:e},r=t.maintainDuration;null==r&&(r=this._calendar.opt("allDayMaintainDuration")),this._def.allDay!==e&&(n.hasEnd=r),this.mutate({standardProps:n})},e.prototype.formatRange=function(e){var t=this._calendar.dateEnv,n=this._instance,r=ot(e,this._calendar.opt("defaultRangeSeparator"));return this._def.hasEnd?t.formatRange(n.range.start,n.range.end,r,{forcedStartTzo:n.forcedStartTzo,forcedEndTzo:n.forcedEndTzo}):t.format(n.range.start,r,{forcedTzo:n.forcedStartTzo})},e.prototype.mutate=function(e){var t=this._def,n=this._instance;if(n){this._calendar.dispatch({type:"MUTATE_EVENTS",instanceId:n.instanceId,mutation:e,fromApi:!0});var r=this._calendar.state.eventStore;this._def=r.defs[t.defId],this._instance=r.instances[n.instanceId]}},e.prototype.remove=function(){this._calendar.dispatch({type:"REMOVE_EVENT_DEF",defId:this._def.defId})},Object.defineProperty(e.prototype,"source",{get:function(){var e=this._def.sourceId;return e?new lt(this._calendar,this._calendar.state.eventSources[e]):null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"start",{get:function(){return this._instance?this._calendar.dateEnv.toDate(this._instance.range.start):null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"end",{get:function(){return this._instance&&this._def.hasEnd?this._calendar.dateEnv.toDate(this._instance.range.end):null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._def.publicId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"groupId",{get:function(){return this._def.groupId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"allDay",{get:function(){return this._def.allDay},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"title",{get:function(){return this._def.title},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._def.url},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"rendering",{get:function(){return this._def.rendering},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"startEditable",{get:function(){return this._def.ui.startEditable},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"durationEditable",{get:function(){return this._def.ui.durationEditable},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"constraint",{get:function(){return this._def.ui.constraints[0]||null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"overlap",{get:function(){return this._def.ui.overlap},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"allow",{get:function(){return this._def.ui.allows[0]||null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"backgroundColor",{get:function(){return this._def.ui.backgroundColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"borderColor",{get:function(){return this._def.ui.borderColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"textColor",{get:function(){return this._def.ui.textColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"classNames",{get:function(){return this._def.ui.classNames},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extendedProps",{get:function(){return this._def.extendedProps},enumerable:!0,configurable:!0}),e}();function dt(e,t,n,r){var i={},o={},a={},s=[],u=[],l=vt(e.defs,t);for(var c in e.defs){"inverse-background"===(S=e.defs[c]).rendering&&(S.groupId?(i[S.groupId]=[],a[S.groupId]||(a[S.groupId]=S)):o[c]=[])}for(var d in e.instances){var f=e.instances[d],p=l[(S=e.defs[f.defId]).defId],h=f.range,v=!S.allDay&&r?ge(h,r):h,g=Ve(v,n);g&&("inverse-background"===S.rendering?S.groupId?i[S.groupId].push(g):o[f.defId].push(g):("background"===S.rendering?s:u).push({def:S,ui:p,instance:f,range:g,isStart:v.start&&v.start.valueOf()===g.start.valueOf(),isEnd:v.end&&v.end.valueOf()===g.end.valueOf()}))}for(var y in i)for(var m=0,E=Le(i[y],n);m<E.length;m++){var S,b=E[m];p=l[(S=a[y]).defId];s.push({def:S,ui:p,instance:null,range:b,isStart:!1,isEnd:!1})}for(var c in o)for(var D=0,T=Le(o[c],n);D<T.length;D++){b=T[D];s.push({def:e.defs[c],ui:l[c],instance:null,range:b,isStart:!1,isEnd:!1})}return{bg:s,fg:u}}function ft(e,t,n){var r=e.calendar,i=e.view;r.hasPublicHandlers("eventRender")&&(t=t.filter((function(e){var t=r.publiclyTrigger("eventRender",[{event:new ct(r,e.eventRange.def,e.eventRange.instance),isMirror:n,isStart:e.isStart,isEnd:e.isEnd,el:e.el,view:i}]);return!1!==t&&(t&&!0!==t&&(e.el=t),!0)})));for(var o=0,a=t;o<a.length;o++){var s=a[o];pt(s.el,s)}return t}function pt(e,t){e.fcSeg=t}function ht(e){return e.fcSeg||null}function vt(e,t){return Re(e,(function(e){return gt(e,t)}))}function gt(e,t){var n=[];return t[""]&&n.push(t[""]),t[e.defId]&&n.push(t[e.defId]),n.push(e.ui),Bt(n)}function yt(e,t,n){var r=e.calendar,i=e.view;if(r.hasPublicHandlers("eventPositioned"))for(var o=0,a=t;o<a.length;o++){var s=a[o];r.publiclyTriggerAfterSizing("eventPositioned",[{event:new ct(r,s.eventRange.def,s.eventRange.instance),isMirror:n,isStart:s.isStart,isEnd:s.isEnd,el:s.el,view:i}])}r.state.eventSourceLoadingLevel||(r.afterSizingTriggers._eventsPositioned=[null])}function mt(e,t,n){for(var r=e.calendar,i=e.view,o=0,a=t;o<a.length;o++){var s=a[o];r.trigger("eventElRemove",s.el)}if(r.hasPublicHandlers("eventDestroy"))for(var u=0,l=t;u<l.length;u++){s=l[u];r.publiclyTrigger("eventDestroy",[{event:new ct(r,s.eventRange.def,s.eventRange.instance),isMirror:n,el:s.el,view:i}])}}function Et(e,t,n,r){var i=vt(e.defs,t),o={defs:{},instances:{}};for(var a in e.defs){var s=e.defs[a];o.defs[a]=St(s,i[a],n,r.pluginSystem.hooks.eventDefMutationAppliers,r)}for(var u in e.instances){var l=e.instances[u];s=o.defs[l.defId];o.instances[u]=bt(l,s,i[l.defId],n,r)}return o}function St(e,t,n,r,i){var o=n.standardProps||{};null==o.hasEnd&&t.durationEditable&&(n.startDelta||n.endDelta)&&(o.hasEnd=!0);var a=Se({},e,o,{ui:Se({},e.ui,o.ui)});n.extendedProps&&(a.extendedProps=Se({},a.extendedProps,n.extendedProps));for(var s=0,u=r;s<u.length;s++){(0,u[s])(a,n,i)}return!a.hasEnd&&i.opt("forceEventDuration")&&(a.hasEnd=!0),a}function bt(e,t,n,r,i){var o=i.dateEnv,a=r.standardProps&&!0===r.standardProps.allDay,s=r.standardProps&&!1===r.standardProps.hasEnd,u=Se({},e);return a&&(u.range=ve(u.range)),r.datesDelta&&n.startEditable&&(u.range={start:o.add(u.range.start,r.datesDelta),end:o.add(u.range.end,r.datesDelta)}),r.startDelta&&n.durationEditable&&(u.range={start:o.add(u.range.start,r.startDelta),end:u.range.end}),r.endDelta&&n.durationEditable&&(u.range={start:u.range.start,end:o.add(u.range.end,r.endDelta)}),s&&(u.range={start:u.range.start,end:i.getDefaultEventEnd(t.allDay,u.range.start)}),t.allDay&&(u.range={start:B(u.range.start),end:B(u.range.end)}),u.range.end<u.range.start&&(u.range.end=i.getDefaultEventEnd(t.allDay,u.range.start)),u}function Dt(e,t,n,r,i){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,i,o){if(t&&n===t.latestFetchId){var a=ke(function(e,t,n){var r=n.opt("eventDataTransform"),i=t?t.eventDataTransform:null;return i&&(e=xe(e,i)),r&&(e=xe(e,r)),e}(i,t,o),t.sourceId,o);return r&&(a=Oe(a,r,o)),He(Tt(e,t.sourceId),a)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,i);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=Oe(t,n,r));return He(e,t)}(e,t.eventStore,r?r.activeRange:null,i);case"MERGE_EVENTS":return He(e,t.eventStore);case"PREV":case"NEXT":case"SET_DATE":case"SET_VIEW_TYPE":return r?Oe(e,r.activeRange,i):e;case"CHANGE_TIMEZONE":return function(e,t,n){var r=e.defs,i=Re(e.instances,(function(e){var i=r[e.defId];return i.allDay||i.recurringDef?e:Se({},e,{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo})}));return{defs:r,instances:i}}(e,t.oldDateEnv,i.dateEnv);case"MUTATE_EVENTS":return function(e,t,n,r,i){var o=Pe(e,t),a=r?{"":{startEditable:!0,durationEditable:!0,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]}}:i.eventUiBases;return o=Et(o,a,n,i),He(e,o)}(e,t.instanceId,t.mutation,t.fromApi,i);case"REMOVE_EVENT_INSTANCES":return wt(e,t.instances);case"REMOVE_EVENT_DEF":return Ue(e,(function(e){return e.defId!==t.defId}));case"REMOVE_EVENT_SOURCE":return Tt(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return Ue(e,(function(e){return!e.sourceId}));case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};case"RESET_EVENTS":return{defs:e.defs,instances:e.instances};default:return e}}function Tt(e,t){return Ue(e,(function(e){return e.sourceId!==t}))}function wt(e,t){return{defs:e.defs,instances:we(e.instances,(function(e){return!t[e.instanceId]}))}}function Rt(e,t){return Ct({eventDrag:e},t)}function Ct(e,t){var n=t.view,r=Se({businessHours:n?n.props.businessHours:{defs:{},instances:{}},dateSelection:"",eventStore:t.state.eventStore,eventUiBases:t.eventUiBases,eventSelection:"",eventDrag:null,eventResize:null},e);return(t.pluginSystem.hooks.isPropsValid||It)(r,t)}function It(e,t,n,r){return void 0===n&&(n={}),!(e.eventDrag&&!function(e,t,n,r){var i=e.eventDrag,o=i.mutatedEvents,a=o.defs,s=o.instances,u=vt(a,i.isEvent?e.eventUiBases:{"":t.selectionConfig});r&&(u=Re(u,r));var l=wt(e.eventStore,i.affectedEvents.instances),c=l.defs,d=l.instances,f=vt(c,e.eventUiBases);for(var p in s){var h=s[p],v=h.range,g=u[h.defId],y=a[h.defId];if(!Mt(g.constraints,v,l,e.businessHours,t))return!1;var m=t.opt("eventOverlap");for(var E in"function"!=typeof m&&(m=null),d){var S=d[E];if(Fe(v,S.range)){if(!1===f[S.defId].overlap&&i.isEvent)return!1;if(!1===g.overlap)return!1;if(m&&!m(new ct(t,c[S.defId],S),new ct(t,y,h)))return!1}}for(var b=t.state.eventStore,D=0,T=g.allows;D<T.length;D++){var w=T[D],R=Se({},n,{range:h.range,allDay:y.allDay}),C=b.defs[y.defId],I=b.instances[p],M=void 0;if(M=C?new ct(t,C,I):new ct(t,y),!w(t.buildDateSpanApi(R),M))return!1}}return!0}(e,t,n,r))&&!(e.dateSelection&&!function(e,t,n,r){var i=e.eventStore,o=i.defs,a=i.instances,s=e.dateSelection,u=s.range,l=t.selectionConfig;r&&(l=r(l));if(!Mt(l.constraints,u,i,e.businessHours,t))return!1;var c=t.opt("selectOverlap");"function"!=typeof c&&(c=null);for(var d in a){var f=a[d];if(Fe(u,f.range)){if(!1===l.overlap)return!1;if(c&&!c(new ct(t,o[f.defId],f)))return!1}}for(var p=0,h=l.allows;p<h.length;p++){var v=h[p],g=Se({},n,s);if(!v(t.buildDateSpanApi(g),null))return!1}return!0}(e,t,n,r))}function Mt(e,t,n,r,i){for(var o=0,a=e;o<a.length;o++){if(!Ot(kt(a[o],t,n,r,i),t))return!1}return!0}function kt(e,t,n,r,i){return"businessHours"===e?_t(Oe(r,t,i)):"string"==typeof e?_t(Ue(n,(function(t){return t.groupId===e}))):"object"==typeof e&&e?_t(Oe(e,t,i)):[]}function _t(e){var t=e.instances,n=[];for(var r in t)n.push(t[r].range);return n}function Ot(e,t){for(var n=0,r=e;n<r.length;n++){if(We(r[n],t))return!0}return!1}function Pt(e){return(e+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function xt(e){var t=[];for(var n in e){var r=e[n];null!=r&&""!==r&&t.push(n+":"+r)}return t.join(";")}function Nt(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}var Ht={editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:null,overlap:null,allow:null,className:Nt,classNames:Nt,color:String,backgroundColor:String,borderColor:String,textColor:String};function Ut(e,t,n){var r=he(e,Ht,{},n),i=function(e,t){return Array.isArray(e)?ke(e,"",t,!0):"object"==typeof e&&e?ke([e],"",t,!0):null!=e?String(e):null}(r.constraint,t);return{startEditable:null!=r.startEditable?r.startEditable:r.editable,durationEditable:null!=r.durationEditable?r.durationEditable:r.editable,constraints:null!=i?[i]:[],overlap:r.overlap,allows:null!=r.allow?[r.allow]:[],backgroundColor:r.backgroundColor||r.color,borderColor:r.borderColor||r.color,textColor:r.textColor,classNames:r.classNames.concat(r.className)}}function zt(e,t,n,r){var i={},o={};for(var a in Ht){var s=e+ue(a);i[a]=t[s],o[s]=!0}if("event"===e&&(i.editable=t.editable),r)for(var a in t)o[a]||(r[a]=t[a]);return Ut(i,n)}var Lt={startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};function Bt(e){return e.reduce(Vt,Lt)}function Vt(e,t){return{startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}var At={id:String,groupId:String,title:String,url:String,rendering:String,extendedProps:null},Ft={start:null,date:null,end:null,allDay:null},Wt=0;function Zt(e,t,n,r){var i=function(e,t){var n=null;if(e){var r=t.state.eventSources[e];n=r.allDayDefault}null==n&&(n=t.opt("allDayDefault"));return n}(t,n),o={},a=function(e,t,n,r,i){for(var o=0;o<r.length;o++){var a={},s=r[o].parse(e,a,n);if(s){var u=a.allDay;return delete a.allDay,null==u&&null==(u=t)&&null==(u=s.allDayGuess)&&(u=!1),Se(i,a),{allDay:u,duration:s.duration,typeData:s.typeData,typeId:o}}}return null}(e,i,n.dateEnv,n.pluginSystem.hooks.recurringTypes,o);if(a)return(s=jt(o,t,a.allDay,Boolean(a.duration),n)).recurringDef={typeId:a.typeId,typeData:a.typeData,duration:a.duration},{def:s,instance:null};var s,u={},l=function(e,t,n,r,i){var o,a,s=function(e,t){var n=he(e,Ft,{},t);return n.start=null!==n.start?n.start:n.date,delete n.date,n}(e,r),u=s.allDay,l=null,c=!1,d=null;if(o=n.dateEnv.createMarkerMeta(s.start))l=o.marker;else if(!i)return null;null!=s.end&&(a=n.dateEnv.createMarkerMeta(s.end));null==u&&(u=null!=t?t:(!o||o.isTimeUnspecified)&&(!a||a.isTimeUnspecified));u&&l&&(l=B(l));a&&(d=a.marker,u&&(d=B(d)),l&&d<=l&&(d=null));d?c=!0:i||(c=n.opt("forceEventDuration")||!1,d=n.dateEnv.add(l,u?n.defaultAllDayEventDuration:n.defaultTimedEventDuration));return{allDay:u,hasEnd:c,range:{start:l,end:d},forcedStartTzo:o?o.forcedTzo:null,forcedEndTzo:a?a.forcedTzo:null}}(e,i,n,u,r);return l?{def:s=jt(u,t,l.allDay,l.hasEnd,n),instance:Yt(s.defId,l.range,l.forcedStartTzo,l.forcedEndTzo)}:null}function jt(e,t,n,r,i){var o={},a=function(e,t,n){var r={},i=he(e,At,{},r),o=Ut(r,t,n);return i.publicId=i.id,delete i.id,i.ui=o,i}(e,i,o);a.defId=String(Wt++),a.sourceId=t,a.allDay=n,a.hasEnd=r;for(var s=0,u=i.pluginSystem.hooks.eventDefParsers;s<u.length;s++){var l={};(0,u[s])(a,o,l),o=l}return a.extendedProps=Se(o,a.extendedProps||{}),Object.freeze(a.ui.classNames),Object.freeze(a.extendedProps),a}function Yt(e,t,n,r){return{instanceId:String(Wt++),defId:e,range:t,forcedStartTzo:null==n?null:n,forcedEndTzo:null==r?null:r}}var qt={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],rendering:"inverse-background",classNames:"fc-nonbusiness",groupId:"_businessHours"};function Gt(e,t){return ke(function(e){var t;t=!0===e?[{}]:Array.isArray(e)?e.filter((function(e){return e.daysOfWeek})):"object"==typeof e&&e?[e]:[];return t=t.map((function(e){return Se({},qt,e)}))}(e),"",t)}function Xt(e,t,n){void 0===n&&(n=[]);var r,i,o=[];function a(){if(i){for(var e=0,n=o;e<n.length;e++){n[e].unrender()}t&&t.apply(r,i),i=null}}function s(){i&&je(i,arguments)||(a(),r=this,i=arguments,e.apply(this,arguments))}s.dependents=o,s.unrender=a;for(var u=0,l=n;u<l.length;u++){l[u].dependents.push(s)}return s}var Jt={defs:{},instances:{}},Kt=function(){function e(){this.getKeysForEventDefs=Ye(this._getKeysForEventDefs),this.splitDateSelection=Ye(this._splitDateSpan),this.splitEventStore=Ye(this._splitEventStore),this.splitIndividualUi=Ye(this._splitIndividualUi),this.splitEventDrag=Ye(this._splitInteraction),this.splitEventResize=Ye(this._splitInteraction),this.eventUiBuilders={}}return e.prototype.splitProps=function(e){var t=this,n=this.getKeyInfo(e),r=this.getKeysForEventDefs(e.eventStore),i=this.splitDateSelection(e.dateSelection),o=this.splitIndividualUi(e.eventUiBases,r),a=this.splitEventStore(e.eventStore,r),s=this.splitEventDrag(e.eventDrag),u=this.splitEventResize(e.eventResize),l={};for(var c in this.eventUiBuilders=Re(n,(function(e,n){return t.eventUiBuilders[n]||Ye(Qt)})),n){var d=n[c],f=a[c]||Jt,p=this.eventUiBuilders[c];l[c]={businessHours:d.businessHours||e.businessHours,dateSelection:i[c]||null,eventStore:f,eventUiBases:p(e.eventUiBases[""],d.ui,o[c]),eventSelection:f.instances[e.eventSelection]?e.eventSelection:"",eventDrag:s[c]||null,eventResize:u[c]||null}}return l},e.prototype._splitDateSpan=function(e){var t={};if(e)for(var n=0,r=this.getKeysForDateSpan(e);n<r.length;n++){t[r[n]]=e}return t},e.prototype._getKeysForEventDefs=function(e){var t=this;return Re(e.defs,(function(e){return t.getKeysForEventDef(e)}))},e.prototype._splitEventStore=function(e,t){var n=e.defs,r=e.instances,i={};for(var o in n)for(var a=0,s=t[o];a<s.length;a++){i[f=s[a]]||(i[f]={defs:{},instances:{}}),i[f].defs[o]=n[o]}for(var u in r)for(var l=r[u],c=0,d=t[l.defId];c<d.length;c++){var f;i[f=d[c]]&&(i[f].instances[u]=l)}return i},e.prototype._splitIndividualUi=function(e,t){var n={};for(var r in e)if(r)for(var i=0,o=t[r];i<o.length;i++){var a=o[i];n[a]||(n[a]={}),n[a][r]=e[r]}return n},e.prototype._splitInteraction=function(e){var t={};if(e){var n=this._splitEventStore(e.affectedEvents,this._getKeysForEventDefs(e.affectedEvents)),r=this._getKeysForEventDefs(e.mutatedEvents),i=this._splitEventStore(e.mutatedEvents,r),o=function(r){t[r]||(t[r]={affectedEvents:n[r]||Jt,mutatedEvents:i[r]||Jt,isEvent:e.isEvent,origSeg:e.origSeg})};for(var a in n)o(a);for(var a in i)o(a)}return t},e}();function Qt(e,t,n){var r=[];e&&r.push(e),t&&r.push(t);var i={"":Bt(r)};return n&&Se(i,n),i}function $t(e,t,n,r,i){var o,a,s,u;return n instanceof Date?o=n:(o=n.date,a=n.type,s=n.forceOff),u={date:t.formatIso(o,{omitTime:!0}),type:a||"day"},"string"==typeof r&&(i=r,r=null),r=r?" "+function(e){var t=[];for(var n in e){var r=e[n];null!=r&&t.push(n+'="'+Pt(r)+'"')}return t.join(" ")}(r):"",i=i||"",!s&&e.navLinks?"<a"+r+' data-goto="'+Pt(JSON.stringify(u))+'">'+i+"</a>":"<span"+r+">"+i+"</span>"}function en(e,t,n,r){var i,o,a=n.calendar,s=n.options,u=n.theme,l=n.dateEnv,c=[];return Ze(t.activeRange,e)?(c.push("fc-"+P[e.getUTCDay()]),s.monthMode&&l.getMonth(e)!==l.getMonth(t.currentRange.start)&&c.push("fc-other-month"),o=x(i=B(a.getNow()),1),e<i?c.push("fc-past"):e>=o?c.push("fc-future"):(c.push("fc-today"),!0!==r&&c.push(u.getClass("today")))):c.push("fc-disabled-day"),c}function tn(e,t,n){var r=!1,i=function(){r||(r=!0,t.apply(this,arguments))},o=function(){r||(r=!0,n&&n.apply(this,arguments))},a=e(i,o);a&&"function"==typeof a.then&&a.then(i,o)}var nn=function(){function e(){}return e.mixInto=function(e){this.mixIntoObj(e.prototype)},e.mixIntoObj=function(e){var t=this;Object.getOwnPropertyNames(this.prototype).forEach((function(n){e[n]||(e[n]=t.prototype[n])}))},e.mixOver=function(e){var t=this;Object.getOwnPropertyNames(this.prototype).forEach((function(n){e.prototype[n]=t.prototype[n]}))},e}(),rn=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Ee(t,e),t.prototype.on=function(e,t){return on(this._handlers||(this._handlers={}),e,t),this},t.prototype.one=function(e,t){return on(this._oneHandlers||(this._oneHandlers={}),e,t),this},t.prototype.off=function(e,t){return this._handlers&&an(this._handlers,e,t),this._oneHandlers&&an(this._oneHandlers,e,t),this},t.prototype.trigger=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return this.triggerWith(e,this,t),this},t.prototype.triggerWith=function(e,t,n){return this._handlers&&de(this._handlers[e],t,n),this._oneHandlers&&(de(this._oneHandlers[e],t,n),delete this._oneHandlers[e]),this},t.prototype.hasHandlers=function(e){return this._handlers&&this._handlers[e]&&this._handlers[e].length||this._oneHandlers&&this._oneHandlers[e]&&this._oneHandlers[e].length},t}(nn);function on(e,t,n){(e[t]||(e[t]=[])).push(n)}function an(e,t,n){n?e[t]&&(e[t]=e[t].filter((function(e){return e!==n}))):delete e[t]}var sn=function(){function e(e,t,n,r){this.originEl=e,this.els=t,this.isHorizontal=n,this.isVertical=r}return e.prototype.build=function(){var e=this.originEl,t=this.originClientRect=e.getBoundingClientRect();this.isHorizontal&&this.buildElHorizontals(t.left),this.isVertical&&this.buildElVerticals(t.top)},e.prototype.buildElHorizontals=function(e){for(var t=[],n=[],r=0,i=this.els;r<i.length;r++){var o=i[r].getBoundingClientRect();t.push(o.left-e),n.push(o.right-e)}this.lefts=t,this.rights=n},e.prototype.buildElVerticals=function(e){for(var t=[],n=[],r=0,i=this.els;r<i.length;r++){var o=i[r].getBoundingClientRect();t.push(o.top-e),n.push(o.bottom-e)}this.tops=t,this.bottoms=n},e.prototype.leftToIndex=function(e){var t,n=this.lefts,r=this.rights,i=n.length;for(t=0;t<i;t++)if(e>=n[t]&&e<r[t])return t},e.prototype.topToIndex=function(e){var t,n=this.tops,r=this.bottoms,i=n.length;for(t=0;t<i;t++)if(e>=n[t]&&e<r[t])return t},e.prototype.getWidth=function(e){return this.rights[e]-this.lefts[e]},e.prototype.getHeight=function(e){return this.bottoms[e]-this.tops[e]},e}(),un=function(){function e(){}return e.prototype.getMaxScrollTop=function(){return this.getScrollHeight()-this.getClientHeight()},e.prototype.getMaxScrollLeft=function(){return this.getScrollWidth()-this.getClientWidth()},e.prototype.canScrollVertically=function(){return this.getMaxScrollTop()>0},e.prototype.canScrollHorizontally=function(){return this.getMaxScrollLeft()>0},e.prototype.canScrollUp=function(){return this.getScrollTop()>0},e.prototype.canScrollDown=function(){return this.getScrollTop()<this.getMaxScrollTop()},e.prototype.canScrollLeft=function(){return this.getScrollLeft()>0},e.prototype.canScrollRight=function(){return this.getScrollLeft()<this.getMaxScrollLeft()},e}(),ln=function(e){function t(t){var n=e.call(this)||this;return n.el=t,n}return Ee(t,e),t.prototype.getScrollTop=function(){return this.el.scrollTop},t.prototype.getScrollLeft=function(){return this.el.scrollLeft},t.prototype.setScrollTop=function(e){this.el.scrollTop=e},t.prototype.setScrollLeft=function(e){this.el.scrollLeft=e},t.prototype.getScrollWidth=function(){return this.el.scrollWidth},t.prototype.getScrollHeight=function(){return this.el.scrollHeight},t.prototype.getClientHeight=function(){return this.el.clientHeight},t.prototype.getClientWidth=function(){return this.el.clientWidth},t}(un),cn=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Ee(t,e),t.prototype.getScrollTop=function(){return window.pageYOffset},t.prototype.getScrollLeft=function(){return window.pageXOffset},t.prototype.setScrollTop=function(e){window.scroll(window.pageXOffset,e)},t.prototype.setScrollLeft=function(e){window.scroll(e,window.pageYOffset)},t.prototype.getScrollWidth=function(){return document.documentElement.scrollWidth},t.prototype.getScrollHeight=function(){return document.documentElement.scrollHeight},t.prototype.getClientHeight=function(){return document.documentElement.clientHeight},t.prototype.getClientWidth=function(){return document.documentElement.clientWidth},t}(un),dn=function(e){function t(t,n){var i=e.call(this,r("div",{className:"fc-scroller"}))||this;return i.overflowX=t,i.overflowY=n,i.applyOverflow(),i}return Ee(t,e),t.prototype.clear=function(){this.setHeight("auto"),this.applyOverflow()},t.prototype.destroy=function(){c(this.el)},t.prototype.applyOverflow=function(){y(this.el,{overflowX:this.overflowX,overflowY:this.overflowY})},t.prototype.lockOverflow=function(e){var t=this.overflowX,n=this.overflowY;e=e||this.getScrollbarWidths(),"auto"===t&&(t=e.bottom||this.canScrollHorizontally()?"scroll":"hidden"),"auto"===n&&(n=e.left||e.right||this.canScrollVertically()?"scroll":"hidden"),y(this.el,{overflowX:t,overflowY:n})},t.prototype.setHeight=function(e){m(this.el,"height",e)},t.prototype.getScrollbarWidths=function(){var e=T(this.el);return{left:e.scrollbarLeft,right:e.scrollbarRight,bottom:e.scrollbarBottom}},t}(ln),fn=function(){function e(e){this.calendarOptions=e,this.processIconOverride()}return e.prototype.processIconOverride=function(){this.iconOverrideOption&&this.setIconOverride(this.calendarOptions[this.iconOverrideOption])},e.prototype.setIconOverride=function(e){var t,n;if("object"==typeof e&&e){for(n in t=Se({},this.iconClasses),e)t[n]=this.applyIconOverridePrefix(e[n]);this.iconClasses=t}else!1===e&&(this.iconClasses={})},e.prototype.applyIconOverridePrefix=function(e){var t=this.iconOverridePrefix;return t&&0!==e.indexOf(t)&&(e=t+e),e},e.prototype.getClass=function(e){return this.classes[e]||""},e.prototype.getIconClass=function(e){var t=this.iconClasses[e];return t?this.baseIconClass+" "+t:""},e.prototype.getCustomButtonIconClass=function(e){var t;return this.iconOverrideCustomButtonOption&&(t=e[this.iconOverrideCustomButtonOption])?this.baseIconClass+" "+this.applyIconOverridePrefix(t):""},e}();fn.prototype.classes={},fn.prototype.iconClasses={},fn.prototype.baseIconClass="",fn.prototype.iconOverridePrefix="";var pn=0,hn=function(){function e(e,t,n,r,i){this.calendar=e,this.theme=t,this.dateEnv=n,this.options=r,this.view=i,this.isRtl="rtl"===r.dir,this.eventOrderSpecs=ie(r.eventOrder),this.nextDayThreshold=J(r.nextDayThreshold)}return e.prototype.extend=function(t,n){return new e(this.calendar,this.theme,this.dateEnv,t||this.options,n||this.view)},e}(),vn=function(){function e(){this.everRendered=!1,this.uid=String(pn++)}return e.addEqualityFuncs=function(e){this.prototype.equalityFuncs=Se({},this.prototype.equalityFuncs,e)},e.prototype.receiveProps=function(e,t){this.receiveContext(t);var n=function(e,t,n){var r={},i=!1;for(var o in t)o in e&&(e[o]===t[o]||n[o]&&n[o](e[o],t[o]))?r[o]=e[o]:(r[o]=t[o],i=!0);for(var o in e)if(!(o in t)){i=!0;break}return{anyChanges:i,comboProps:r}}(this.props||{},e,this.equalityFuncs),r=n.anyChanges,i=n.comboProps;this.props=i,r&&(this.everRendered&&this.beforeUpdate(),this.render(i,t),this.everRendered&&this.afterUpdate()),this.everRendered=!0},e.prototype.receiveContext=function(e){var t=this.context;this.context=e,t||this.firstContext(e)},e.prototype.render=function(e,t){},e.prototype.firstContext=function(e){},e.prototype.beforeUpdate=function(){},e.prototype.afterUpdate=function(){},e.prototype.destroy=function(){},e}();vn.prototype.equalityFuncs={};var gn=function(e){function t(t){var n=e.call(this)||this;return n.el=t,n}return Ee(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this),c(this.el)},t.prototype.buildPositionCaches=function(){},t.prototype.queryHit=function(e,t,n,r){return null},t.prototype.isInteractionValid=function(e){var t=this.context.calendar,n=this.props.dateProfile,r=e.mutatedEvents.instances;if(n)for(var i in r)if(!We(n.validRange,r[i].range))return!1;return Rt(e,t)},t.prototype.isDateSelectionValid=function(e){var t=this.context.calendar,n=this.props.dateProfile;return!(n&&!We(n.validRange,e.range))&&function(e,t){return Ct({dateSelection:e},t)}(e,t)},t.prototype.isValidSegDownEl=function(e){return!this.props.eventDrag&&!this.props.eventResize&&!p(e,".fc-mirror")&&(this.isPopover()||!this.isInPopover(e))},t.prototype.isValidDateDownEl=function(e){var t=p(e,this.fgSegSelector);return(!t||t.classList.contains("fc-mirror"))&&!p(e,".fc-more")&&!p(e,"a[data-goto]")&&!this.isInPopover(e)},t.prototype.isPopover=function(){return this.el.classList.contains("fc-popover")},t.prototype.isInPopover=function(e){return Boolean(p(e,".fc-popover"))},t}(vn);gn.prototype.fgSegSelector=".fc-event-container > *",gn.prototype.bgSegSelector=".fc-bgevent:not(.fc-nonbusiness)";var yn=0;function mn(e){return{id:String(yn++),deps:e.deps||[],reducers:e.reducers||[],eventDefParsers:e.eventDefParsers||[],isDraggableTransformers:e.isDraggableTransformers||[],eventDragMutationMassagers:e.eventDragMutationMassagers||[],eventDefMutationAppliers:e.eventDefMutationAppliers||[],dateSelectionTransformers:e.dateSelectionTransformers||[],datePointTransforms:e.datePointTransforms||[],dateSpanTransforms:e.dateSpanTransforms||[],views:e.views||{},viewPropsTransformers:e.viewPropsTransformers||[],isPropsValid:e.isPropsValid||null,externalDefTransforms:e.externalDefTransforms||[],eventResizeJoinTransforms:e.eventResizeJoinTransforms||[],viewContainerModifiers:e.viewContainerModifiers||[],eventDropTransformers:e.eventDropTransformers||[],componentInteractions:e.componentInteractions||[],calendarInteractions:e.calendarInteractions||[],themeClasses:e.themeClasses||{},eventSourceDefs:e.eventSourceDefs||[],cmdFormatter:e.cmdFormatter,recurringTypes:e.recurringTypes||[],namedTimeZonedImpl:e.namedTimeZonedImpl,defaultView:e.defaultView||"",elementDraggingImpl:e.elementDraggingImpl,optionChangeHandlers:e.optionChangeHandlers||{}}}var En=function(){function e(){this.hooks={reducers:[],eventDefParsers:[],isDraggableTransformers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],eventResizeJoinTransforms:[],viewContainerModifiers:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,defaultView:"",elementDraggingImpl:null,optionChangeHandlers:{}},this.addedHash={}}return e.prototype.add=function(e){if(!this.addedHash[e.id]){this.addedHash[e.id]=!0;for(var t=0,n=e.deps;t<n.length;t++){var r=n[t];this.add(r)}this.hooks=(i=this.hooks,o=e,{reducers:i.reducers.concat(o.reducers),eventDefParsers:i.eventDefParsers.concat(o.eventDefParsers),isDraggableTransformers:i.isDraggableTransformers.concat(o.isDraggableTransformers),eventDragMutationMassagers:i.eventDragMutationMassagers.concat(o.eventDragMutationMassagers),eventDefMutationAppliers:i.eventDefMutationAppliers.concat(o.eventDefMutationAppliers),dateSelectionTransformers:i.dateSelectionTransformers.concat(o.dateSelectionTransformers),datePointTransforms:i.datePointTransforms.concat(o.datePointTransforms),dateSpanTransforms:i.dateSpanTransforms.concat(o.dateSpanTransforms),views:Se({},i.views,o.views),viewPropsTransformers:i.viewPropsTransformers.concat(o.viewPropsTransformers),isPropsValid:o.isPropsValid||i.isPropsValid,externalDefTransforms:i.externalDefTransforms.concat(o.externalDefTransforms),eventResizeJoinTransforms:i.eventResizeJoinTransforms.concat(o.eventResizeJoinTransforms),viewContainerModifiers:i.viewContainerModifiers.concat(o.viewContainerModifiers),eventDropTransformers:i.eventDropTransformers.concat(o.eventDropTransformers),calendarInteractions:i.calendarInteractions.concat(o.calendarInteractions),componentInteractions:i.componentInteractions.concat(o.componentInteractions),themeClasses:Se({},i.themeClasses,o.themeClasses),eventSourceDefs:i.eventSourceDefs.concat(o.eventSourceDefs),cmdFormatter:o.cmdFormatter||i.cmdFormatter,recurringTypes:i.recurringTypes.concat(o.recurringTypes),namedTimeZonedImpl:o.namedTimeZonedImpl||i.namedTimeZonedImpl,defaultView:i.defaultView||o.defaultView,elementDraggingImpl:i.elementDraggingImpl||o.elementDraggingImpl,optionChangeHandlers:Se({},i.optionChangeHandlers,o.optionChangeHandlers)})}var i,o},e}();var Sn=mn({eventSourceDefs:[{ignoreRange:!0,parseMeta:function(e){return Array.isArray(e)?e:Array.isArray(e.events)?e.events:null},fetch:function(e,t){t({rawEvents:e.eventSource.meta})}}]}),bn=mn({eventSourceDefs:[{parseMeta:function(e){return"function"==typeof e?e:"function"==typeof e.events?e.events:null},fetch:function(e,t,n){var r=e.calendar.dateEnv;tn(e.eventSource.meta.bind(null,{start:r.toDate(e.range.start),end:r.toDate(e.range.end),startStr:r.formatIso(e.range.start),endStr:r.formatIso(e.range.end),timeZone:r.timeZone}),(function(e){t({rawEvents:e})}),n)}}]});function Dn(e,t,n,r,i){var o=null;"GET"===(e=e.toUpperCase())?t=function(e,t){return e+(-1===e.indexOf("?")?"?":"&")+Tn(t)}(t,n):o=Tn(n);var a=new XMLHttpRequest;a.open(e,t,!0),"GET"!==e&&a.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),a.onload=function(){if(a.status>=200&&a.status<400)try{var e=JSON.parse(a.responseText);r(e,a)}catch(e){i("Failure parsing JSON",a)}else i("Request failed",a)},a.onerror=function(){i("Request failed",a)},a.send(o)}function Tn(e){var t=[];for(var n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")}var wn=mn({eventSourceDefs:[{parseMeta:function(e){if("string"==typeof e)e={url:e};else if(!e||"object"!=typeof e||!e.url)return null;return{url:e.url,method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam}},fetch:function(e,t,n){var r=e.eventSource.meta,i=function(e,t,n){var r,i,o,a,s=n.dateEnv,u={};null==(r=e.startParam)&&(r=n.opt("startParam"));null==(i=e.endParam)&&(i=n.opt("endParam"));null==(o=e.timeZoneParam)&&(o=n.opt("timeZoneParam"));a="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};Se(u,a),u[r]=s.formatIso(t.start),u[i]=s.formatIso(t.end),"local"!==s.timeZone&&(u[o]=s.timeZone);return u}(r,e.range,e.calendar);Dn(r.method,r.url,i,(function(e,n){t({rawEvents:e,xhr:n})}),(function(e,t){n({message:e,xhr:t})}))}}]});var Rn=mn({recurringTypes:[{parse:function(e,t,n){var r,i,o=n.createMarker.bind(n),a=he(e,{daysOfWeek:null,startTime:J,endTime:J,startRecur:o,endRecur:o},{},t),s=!1;for(var u in a)if(null!=a[u]){s=!0;break}if(s){var l=null;return"duration"in t&&(l=J(t.duration),delete t.duration),!l&&a.startTime&&a.endTime&&(r=a.endTime,i=a.startTime,l={years:r.years-i.years,months:r.months-i.months,days:r.days-i.days,milliseconds:r.milliseconds-i.milliseconds}),{allDayGuess:Boolean(!a.startTime&&!a.endTime),duration:l,typeData:a}}return null},expand:function(e,t,n){var r=Ve(t,{start:e.startRecur,end:e.endRecur});return r?function(e,t,n,r){var i=e?Ce(e):null,o=B(n.start),a=n.end,s=[];for(;o<a;){var u=void 0;i&&!i[o.getUTCDay()]||(u=t?r.add(o,t):o,s.push(u)),o=x(o,1)}return s}(e.daysOfWeek,e.startTime,r,n):[]}}]});var Cn=mn({optionChangeHandlers:{events:function(e,t,n){In([e],t,n)},eventSources:In,plugins:function(e,t){t.addPluginInputs(e)}}});function In(e,t,n){for(var r=Ie(t.state.eventSources),i=[],o=0,a=e;o<a.length;o++){for(var s=a[o],u=!1,l=0;l<r.length;l++)if(n(r[l]._raw,s)){r.splice(l,1),u=!0;break}u||i.push(s)}for(var c=0,d=r;c<d.length;c++){var f=d[c];t.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:f.sourceId})}for(var p=0,h=i;p<h.length;p++){var v=h[p];t.addEventSource(v)}}var Mn={defaultRangeSeparator:" - ",titleRangeSeparator:" – ",defaultTimedEventDuration:"01:00:00",defaultAllDayEventDuration:{day:1},forceEventDuration:!1,nextDayThreshold:"00:00:00",columnHeader:!0,defaultView:"",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"local",editable:!1,scrollTime:"06:00:00",minTime:"00:00:00",maxTime:"24:00:00",showNonCurrentDates:!0,lazyFetching:!0,startParam:"start",endParam:"end",timeZoneParam:"timeZone",timeZone:"local",locales:[],locale:"",timeGridEventMinHeight:0,themeSystem:"standard",dragRevertDuration:500,dragScroll:!0,allDayMaintainDuration:!1,unselectAuto:!0,dropAccept:"*",eventOrder:"start,-duration,allDay,title",eventLimit:!1,eventLimitClick:"popover",dayPopoverFormat:{month:"long",day:"numeric",year:"numeric"},handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3,eventDragMinDistance:5},kn={header:{left:"next,prev today",center:"",right:"title"},buttonIcons:{prev:"fc-icon-chevron-right",next:"fc-icon-chevron-left",prevYear:"fc-icon-chevrons-right",nextYear:"fc-icon-chevrons-left"}},_n=["header","footer","buttonText","buttonIcons"];var On=[Sn,bn,wn,Rn,Cn];var Pn={code:"en",week:{dow:0,doy:4},dir:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekLabel:"W",allDayText:"all-day",eventLimitText:"more",noEventsMessage:"No events to display"};function xn(e){for(var t=e.length>0?e[0].code:"en",n=window.FullCalendarLocalesAll||[],r=window.FullCalendarLocales||{},i=n.concat(Ie(r),e),o={en:Pn},a=0,s=i;a<s.length;a++){var u=s[a];o[u.code]=u}return{map:o,defaultCode:t}}function Nn(e,t){return"object"!=typeof e||Array.isArray(e)?function(e,t){var n=[].concat(e||[]),r=function(e,t){for(var n=0;n<e.length;n++)for(var r=e[n].toLocaleLowerCase().split("-"),i=r.length;i>0;i--){var o=r.slice(0,i).join("-");if(t[o])return t[o]}return null}(n,t)||Pn;return Hn(e,n,r)}(e,t):Hn(e.code,[e.code],e)}function Hn(e,t,n){var r=Te([Pn,n],["buttonText"]);delete r.code;var i=r.week;return delete r.week,{codeArg:e,codes:t,week:i,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}var Un=function(){function e(e){this.overrides=Se({},e),this.dynamicOverrides={},this.compute()}return e.prototype.mutate=function(e,t,n){if(Object.keys(e).length||t.length){var r=n?this.dynamicOverrides:this.overrides;Se(r,e);for(var i=0,o=t;i<o.length;i++){delete r[o[i]]}this.compute()}},e.prototype.compute=function(){var e=fe(this.dynamicOverrides.locales,this.overrides.locales,Mn.locales),t=fe(this.dynamicOverrides.locale,this.overrides.locale,Mn.locale),n=xn(e),r=Nn(t||n.defaultCode,n.map).options,i="rtl"===fe(this.dynamicOverrides.dir,this.overrides.dir,r.dir)?kn:{};this.dirDefaults=i,this.localeDefaults=r,this.computed=Te([Mn,i,r,this.overrides,this.dynamicOverrides],_n)},e}(),zn={};var Ln,Bn=function(){function e(){}return e.prototype.getMarkerYear=function(e){return e.getUTCFullYear()},e.prototype.getMarkerMonth=function(e){return e.getUTCMonth()},e.prototype.getMarkerDay=function(e){return e.getUTCDate()},e.prototype.arrayToMarker=function(e){return j(e)},e.prototype.markerToArray=function(e){return Z(e)},e}();Ln=Bn,zn["gregory"]=Ln;var Vn=/^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;function An(e){var t=Vn.exec(e);if(t){var n=new Date(Date.UTC(Number(t[1]),t[3]?Number(t[3])-1:0,Number(t[5]||1),Number(t[7]||0),Number(t[8]||0),Number(t[10]||0),t[12]?1e3*Number("0."+t[12]):0));if(Y(n)){var r=null;return t[13]&&(r=("-"===t[15]?-1:1)*(60*Number(t[16]||0)+Number(t[18]||0))),{marker:n,isTimeUnspecified:!t[6],timeZoneOffset:r}}}return null}var Fn=function(){function e(e){var t=this.timeZone=e.timeZone,n="local"!==t&&"UTC"!==t;e.namedTimeZoneImpl&&n&&(this.namedTimeZoneImpl=new e.namedTimeZoneImpl(t)),this.canComputeOffset=Boolean(!n||this.namedTimeZoneImpl),this.calendarSystem=function(e){return new zn[e]}(e.calendarSystem),this.locale=e.locale,this.weekDow=e.locale.week.dow,this.weekDoy=e.locale.week.doy,"ISO"===e.weekNumberCalculation&&(this.weekDow=1,this.weekDoy=4),"number"==typeof e.firstDay&&(this.weekDow=e.firstDay),"function"==typeof e.weekNumberCalculation&&(this.weekNumberFunc=e.weekNumberCalculation),this.weekLabel=null!=e.weekLabel?e.weekLabel:e.locale.options.weekLabel,this.cmdFormatter=e.cmdFormatter}return e.prototype.createMarker=function(e){var t=this.createMarkerMeta(e);return null===t?null:t.marker},e.prototype.createNowMarker=function(){return this.canComputeOffset?this.timestampToMarker((new Date).valueOf()):j(F(new Date))},e.prototype.createMarkerMeta=function(e){if("string"==typeof e)return this.parse(e);var t=null;return"number"==typeof e?t=this.timestampToMarker(e):e instanceof Date?(e=e.valueOf(),isNaN(e)||(t=this.timestampToMarker(e))):Array.isArray(e)&&(t=j(e)),null!==t&&Y(t)?{marker:t,isTimeUnspecified:!1,forcedTzo:null}:null},e.prototype.parse=function(e){var t=An(e);if(null===t)return null;var n=t.marker,r=null;return null!==t.timeZoneOffset&&(this.canComputeOffset?n=this.timestampToMarker(n.valueOf()-60*t.timeZoneOffset*1e3):r=t.timeZoneOffset),{marker:n,isTimeUnspecified:t.isTimeUnspecified,forcedTzo:r}},e.prototype.getYear=function(e){return this.calendarSystem.getMarkerYear(e)},e.prototype.getMonth=function(e){return this.calendarSystem.getMarkerMonth(e)},e.prototype.add=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]+=t.years,n[1]+=t.months,n[2]+=t.days,n[6]+=t.milliseconds,this.calendarSystem.arrayToMarker(n)},e.prototype.subtract=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]-=t.years,n[1]-=t.months,n[2]-=t.days,n[6]-=t.milliseconds,this.calendarSystem.arrayToMarker(n)},e.prototype.addYears=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]+=t,this.calendarSystem.arrayToMarker(n)},e.prototype.addMonths=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[1]+=t,this.calendarSystem.arrayToMarker(n)},e.prototype.diffWholeYears=function(e,t){var n=this.calendarSystem;return q(e)===q(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)&&n.getMarkerMonth(e)===n.getMarkerMonth(t)?n.getMarkerYear(t)-n.getMarkerYear(e):null},e.prototype.diffWholeMonths=function(e,t){var n=this.calendarSystem;return q(e)===q(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)?n.getMarkerMonth(t)-n.getMarkerMonth(e)+12*(n.getMarkerYear(t)-n.getMarkerYear(e)):null},e.prototype.greatestWholeUnit=function(e,t){var n=this.diffWholeYears(e,t);return null!==n?{unit:"year",value:n}:null!==(n=this.diffWholeMonths(e,t))?{unit:"month",value:n}:null!==(n=z(e,t))?{unit:"week",value:n}:null!==(n=L(e,t))?{unit:"day",value:n}:ce(n=function(e,t){return(t.valueOf()-e.valueOf())/36e5}(e,t))?{unit:"hour",value:n}:ce(n=function(e,t){return(t.valueOf()-e.valueOf())/6e4}(e,t))?{unit:"minute",value:n}:ce(n=function(e,t){return(t.valueOf()-e.valueOf())/1e3}(e,t))?{unit:"second",value:n}:{unit:"millisecond",value:t.valueOf()-e.valueOf()}},e.prototype.countDurationsBetween=function(e,t,n){var r;return n.years&&null!==(r=this.diffWholeYears(e,t))?r/(ee(n)/365):n.months&&null!==(r=this.diffWholeMonths(e,t))?r/function(e){return ee(e)/30}(n):n.days&&null!==(r=L(e,t))?r/ee(n):(t.valueOf()-e.valueOf())/te(n)},e.prototype.startOf=function(e,t){return"year"===t?this.startOfYear(e):"month"===t?this.startOfMonth(e):"week"===t?this.startOfWeek(e):"day"===t?B(e):"hour"===t?function(e){return j([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours()])}(e):"minute"===t?function(e){return j([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes()])}(e):"second"===t?function(e){return j([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds()])}(e):void 0},e.prototype.startOfYear=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e)])},e.prototype.startOfMonth=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e)])},e.prototype.startOfWeek=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e),e.getUTCDate()-(e.getUTCDay()-this.weekDow+7)%7])},e.prototype.computeWeekNumber=function(e){return this.weekNumberFunc?this.weekNumberFunc(this.toDate(e)):function(e,t,n){var r=e.getUTCFullYear(),i=V(e,r,t,n);if(i<1)return V(e,r-1,t,n);var o=V(e,r+1,t,n);return o>=1?Math.min(i,o):i}(e,this.weekDow,this.weekDoy)},e.prototype.format=function(e,t,n){return void 0===n&&(n={}),t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)},e.prototype.formatRange=function(e,t,n,r){return void 0===r&&(r={}),r.isEndExclusive&&(t=N(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this)},e.prototype.formatIso=function(e,t){void 0===t&&(t={});var n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),function(e,t,n){void 0===n&&(n=!1);var r=e.toISOString();return r=r.replace(".000",""),n&&(r=r.replace("T00:00:00Z","")),r.length>10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",at(t,!0)))),r}(e,n,t.omitTime)},e.prototype.timestampToMarker=function(e){return"local"===this.timeZone?j(F(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?j(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)},e.prototype.offsetForMarker=function(e){return"local"===this.timeZone?-W(Z(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(Z(e)):null},e.prototype.toDate=function(e,t){return"local"===this.timeZone?W(Z(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(Z(e))*60):new Date(e.valueOf()-(t||0))},e}(),Wn={id:String,allDayDefault:Boolean,eventDataTransform:Function,success:Function,failure:Function},Zn=0;function jn(e,t){return!t.pluginSystem.hooks.eventSourceDefs[e.sourceDefId].ignoreRange}function Yn(e,t){for(var n=t.pluginSystem.hooks.eventSourceDefs,r=n.length-1;r>=0;r--){var i=n[r].parseMeta(e);if(i){var o=qn("object"==typeof e?e:{},i,r,t);return o._raw=e,o}}return null}function qn(e,t,n,r){var i={},o=he(e,Wn,{},i),a={},s=Ut(i,r,a);return o.isFetching=!1,o.latestFetchId="",o.fetchRange=null,o.publicId=String(e.id||""),o.sourceId=String(Zn++),o.sourceDefId=n,o.meta=t,o.ui=s,o.extendedProps=a,o}function Gn(e,t,n,r){switch(t.type){case"ADD_EVENT_SOURCES":return function(e,t,n,r){for(var i={},o=0,a=t;o<a.length;o++){var s=a[o];i[s.sourceId]=s}n&&(i=Jn(i,n,r));return Se({},e,i)}(e,t.sources,n?n.activeRange:null,r);case"REMOVE_EVENT_SOURCE":return i=e,o=t.sourceId,we(i,(function(e){return e.sourceId!==o}));case"PREV":case"NEXT":case"SET_DATE":case"SET_VIEW_TYPE":return n?Jn(e,n.activeRange,r):e;case"FETCH_EVENT_SOURCES":case"CHANGE_TIMEZONE":return Kn(e,t.sourceIds?Ce(t.sourceIds):function(e,t){return we(e,(function(e){return jn(e,t)}))}(e,r),n?n.activeRange:null,r);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return function(e,t,n,r){var i,o=e[t];if(o&&n===o.latestFetchId)return Se({},e,((i={})[t]=Se({},o,{isFetching:!1,fetchRange:r}),i));return e}(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}var i,o}var Xn=0;function Jn(e,t,n){return Kn(e,we(e,(function(e){return function(e,t,n){return jn(e,n)?!n.opt("lazyFetching")||!e.fetchRange||e.isFetching||t.start<e.fetchRange.start||t.end>e.fetchRange.end:!e.latestFetchId}(e,t,n)})),t,n)}function Kn(e,t,n,r){var i={};for(var o in e){var a=e[o];t[o]?i[o]=Qn(a,n,r):i[o]=a}return i}function Qn(e,t,n){var r=n.pluginSystem.hooks.eventSourceDefs[e.sourceDefId],i=String(Xn++);return r.fetch({eventSource:e,calendar:n,range:t},(function(r){var o,a,s=r.rawEvents,u=n.opt("eventSourceSuccess");e.success&&(a=e.success(s,r.xhr)),u&&(o=u(s,r.xhr)),s=a||o||s,n.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:i,fetchRange:t,rawEvents:s})}),(function(r){var o=n.opt("eventSourceFailure");console.warn(r.message,r),e.failure&&e.failure(r),o&&o(r),n.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:i,fetchRange:t,error:r})})),Se({},e,{isFetching:!0,latestFetchId:i})}var $n=function(){function e(e,t){this.viewSpec=e,this.options=e.options,this.dateEnv=t.dateEnv,this.calendar=t,this.initHiddenDays()}return e.prototype.buildPrev=function(e,t){var n=this.dateEnv,r=n.subtract(n.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(r,-1)},e.prototype.buildNext=function(e,t){var n=this.dateEnv,r=n.add(n.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(r,1)},e.prototype.build=function(e,t,n){var r;void 0===n&&(n=!1);var i,o,a,s,u,l,c,d,f;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(d=e,e=null!=(f=r).start&&d<f.start?f.start:null!=f.end&&d>=f.end?new Date(f.end.valueOf()-1):d),a=this.buildCurrentRangeInfo(e,t),s=/^(year|month|week|day)$/.test(a.unit),u=this.buildRenderRange(this.trimHiddenDays(a.range),a.unit,s),l=u=this.trimHiddenDays(u),this.options.showNonCurrentDates||(l=Ve(l,a.range)),i=J(this.options.minTime),o=J(this.options.maxTime),l=Ve(l=this.adjustActiveRange(l,i,o),r),c=Fe(a.range,r),{validRange:r,currentRange:a.range,currentRangeUnit:a.unit,isRangeAllDay:s,activeRange:l,renderRange:u,minTime:i,maxTime:o,isValid:c,dateIncrement:this.buildDateIncrement(a.duration)}},e.prototype.buildValidRange=function(){return this.getRangeOption("validRange",this.calendar.getNow())||{start:null,end:null}},e.prototype.buildCurrentRangeInfo=function(e,t){var n,r=this.viewSpec,i=this.dateEnv,o=null,a=null,s=null;return r.duration?(o=r.duration,a=r.durationUnit,s=this.buildRangeFromDuration(e,t,o,a)):(n=this.options.dayCount)?(a="day",s=this.buildRangeFromDayCount(e,t,n)):(s=this.buildCustomVisibleRange(e))?a=i.greatestWholeUnit(s.start,s.end).unit:(a=ne(o=this.getFallbackDuration()).unit,s=this.buildRangeFromDuration(e,t,o,a)),{duration:o,unit:a,range:s}},e.prototype.getFallbackDuration=function(){return J({day:1})},e.prototype.adjustActiveRange=function(e,t,n){var r=this.dateEnv,i=e.start,o=e.end;return this.viewSpec.class.prototype.usesMinMaxTime&&(ee(t)<0&&(i=B(i),i=r.add(i,t)),ee(n)>1&&(o=x(o=B(o),-1),o=r.add(o,n))),{start:i,end:o}},e.prototype.buildRangeFromDuration=function(e,t,n,r){var i,o,a,s,u,l=this.dateEnv,c=this.options.dateAlignment;function d(){a=l.startOf(e,c),s=l.add(a,n),u={start:a,end:s}}return c||((i=this.options.dateIncrement)?(o=J(i),c=te(o)<te(n)?ne(o,!Q(i)).unit:r):c=r),ee(n)<=1&&this.isHiddenDay(a)&&(a=B(a=this.skipHiddenDays(a,t))),d(),this.trimHiddenDays(u)||(e=this.skipHiddenDays(e,t),d()),u},e.prototype.buildRangeFromDayCount=function(e,t,n){var r,i=this.dateEnv,o=this.options.dateAlignment,a=0,s=e;o&&(s=i.startOf(s,o)),s=B(s),r=s=this.skipHiddenDays(s,t);do{r=x(r,1),this.isHiddenDay(r)||a++}while(a<n);return{start:s,end:r}},e.prototype.buildCustomVisibleRange=function(e){var t=this.dateEnv,n=this.getRangeOption("visibleRange",t.toDate(e));return!n||null!=n.start&&null!=n.end?n:null},e.prototype.buildRenderRange=function(e,t,n){return e},e.prototype.buildDateIncrement=function(e){var t,n=this.options.dateIncrement;return n?J(n):(t=this.options.dateAlignment)?J(1,t):e||J({days:1})},e.prototype.getRangeOption=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=this.options[e];return"function"==typeof r&&(r=r.apply(null,t)),r&&(r=ze(r,this.dateEnv)),r&&(r=ge(r)),r},e.prototype.initHiddenDays=function(){var e,t=this.options.hiddenDays||[],n=[],r=0;for(!1===this.options.weekends&&t.push(0,6),e=0;e<7;e++)(n[e]=-1!==t.indexOf(e))||r++;if(!r)throw new Error("invalid hiddenDays");this.isHiddenDayHash=n},e.prototype.trimHiddenDays=function(e){var t=e.start,n=e.end;return t&&(t=this.skipHiddenDays(t)),n&&(n=this.skipHiddenDays(n,-1,!0)),null==t||null==n||t<n?{start:t,end:n}:null},e.prototype.isHiddenDay=function(e){return e instanceof Date&&(e=e.getUTCDay()),this.isHiddenDayHash[e]},e.prototype.skipHiddenDays=function(e,t,n){for(void 0===t&&(t=1),void 0===n&&(n=!1);this.isHiddenDayHash[(e.getUTCDay()+(n?t:0)+7)%7];)e=x(e,t);return e},e}();function er(e,t,n){for(var r=function(e,t){switch(t.type){case"SET_VIEW_TYPE":return t.viewType;default:return e}}(e.viewType,t),i=function(e,t,n,r,i){var o;switch(t.type){case"PREV":o=i.dateProfileGenerators[r].buildPrev(e,n);break;case"NEXT":o=i.dateProfileGenerators[r].buildNext(e,n);break;case"SET_DATE":e.activeRange&&Ze(e.currentRange,t.dateMarker)||(o=i.dateProfileGenerators[r].build(t.dateMarker,void 0,!0));break;case"SET_VIEW_TYPE":var a=i.dateProfileGenerators[r];if(!a)throw new Error(r?'The FullCalendar view "'+r+'" does not exist. Make sure your plugins are loaded correctly.':"No available FullCalendar view plugins.");o=a.build(t.dateMarker||n,void 0,!0)}return!o||!o.isValid||e&&(s=e,u=o,Ae(s.validRange,u.validRange)&&Ae(s.activeRange,u.activeRange)&&Ae(s.renderRange,u.renderRange)&&$(s.minTime,u.minTime)&&$(s.maxTime,u.maxTime))?e:o;var s,u}(e.dateProfile,t,e.currentDate,r,n),o=Gn(e.eventSources,t,i,n),a=Se({},e,{viewType:r,dateProfile:i,currentDate:tr(e.currentDate,t,i),eventSources:o,eventStore:Dt(e.eventStore,t,o,i,n),dateSelection:nr(e.dateSelection,t,n),eventSelection:rr(e.eventSelection,t),eventDrag:ir(e.eventDrag,t,o,n),eventResize:or(e.eventResize,t,o,n),eventSourceLoadingLevel:ar(o),loadingLevel:ar(o)}),s=0,u=n.pluginSystem.hooks.reducers;s<u.length;s++){a=(0,u[s])(a,t,n)}return a}function tr(e,t,n){switch(t.type){case"PREV":case"NEXT":return Ze(n.currentRange,e)?e:n.currentRange.start;case"SET_DATE":case"SET_VIEW_TYPE":var r=t.dateMarker||e;return n.activeRange&&!Ze(n.activeRange,r)?n.currentRange.start:r;default:return e}}function nr(e,t,n){switch(t.type){case"SELECT_DATES":return t.selection;case"UNSELECT_DATES":return null;default:return e}}function rr(e,t){switch(t.type){case"SELECT_EVENT":return t.eventInstanceId;case"UNSELECT_EVENT":return"";default:return e}}function ir(e,t,n,r){switch(t.type){case"SET_EVENT_DRAG":var i=t.state;return{affectedEvents:i.affectedEvents,mutatedEvents:i.mutatedEvents,isEvent:i.isEvent,origSeg:i.origSeg};case"UNSET_EVENT_DRAG":return null;default:return e}}function or(e,t,n,r){switch(t.type){case"SET_EVENT_RESIZE":var i=t.state;return{affectedEvents:i.affectedEvents,mutatedEvents:i.mutatedEvents,isEvent:i.isEvent,origSeg:i.origSeg};case"UNSET_EVENT_RESIZE":return null;default:return e}}function ar(e){var t=0;for(var n in e)e[n].isFetching&&t++;return t}var sr={start:null,end:null,allDay:Boolean};function ur(e,t,n){var r=function(e,t){var n={},r=he(e,sr,{},n),i=r.start?t.createMarkerMeta(r.start):null,o=r.end?t.createMarkerMeta(r.end):null,a=r.allDay;null==a&&(a=i&&i.isTimeUnspecified&&(!o||o.isTimeUnspecified));return n.range={start:i?i.marker:null,end:o?o.marker:null},n.allDay=a,n}(e,t),i=r.range;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return r}function lr(e,t,n){var r=jt({editable:!1},"",e.allDay,!0,n);return{def:r,ui:gt(r,t),instance:Yt(r.defId,e.range),range:e.range,isStart:!0,isEnd:!0}}function cr(e,t,n,r){if(t[e])return t[e];var i=function(e,t,n,r){var i=n[e],o=r[e],a=function(e){return i&&null!==i[e]?i[e]:o&&null!==o[e]?o[e]:null},s=a("class"),u=a("superType");!u&&s&&(u=dr(s,r)||dr(s,n));var l=null;if(u){if(u===e)throw new Error("Can't have a custom view type that references itself");l=cr(u,t,n,r)}!s&&l&&(s=l.class);if(!s)return null;return{type:e,class:s,defaults:Se({},l?l.defaults:{},i?i.options:{}),overrides:Se({},l?l.overrides:{},o?o.options:{})}}(e,t,n,r);return i&&(t[e]=i),i}function dr(e,t){var n=Object.getPrototypeOf(e.prototype);for(var r in t){var i=t[r];if(i.class&&i.class.prototype===n)return r}return""}function fr(e){return Re(e,hr)}var pr={type:String,class:null};function hr(e){"function"==typeof e&&(e={class:e});var t={},n=he(e,pr,{},t);return{superType:n.type,class:n.class,options:t}}function vr(e,t){var n=fr(e),r=fr(t.overrides.views);return Re(function(e,t){var n,r={};for(n in e)cr(n,r,e,t);for(n in t)cr(n,r,e,t);return r}(n,r),(function(e){return function(e,t,n){var r=e.overrides.duration||e.defaults.duration||n.dynamicOverrides.duration||n.overrides.duration,i=null,o="",a="",s={};if(r&&(i=J(r))){var u=ne(i,!Q(r));o=u.unit,1===u.value&&(a=o,s=t[o]?t[o].options:{})}var l=function(t){var n=t.buttonText||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[a]?n[a]:void 0};return{type:e.type,class:e.class,duration:i,durationUnit:o,singleUnit:a,options:Se({},Mn,e.defaults,n.dirDefaults,n.localeDefaults,n.overrides,s,e.overrides,n.dynamicOverrides),buttonTextOverride:l(n.dynamicOverrides)||l(n.overrides)||e.overrides.buttonText,buttonTextDefault:l(n.localeDefaults)||l(n.dirDefaults)||e.defaults.buttonText||l(Mn)||e.type}}(e,r,t)}))}var gr=function(e){function t(t){var n=e.call(this)||this;return n._renderLayout=Xt(n.renderLayout,n.unrenderLayout),n._updateTitle=Xt(n.updateTitle,null,[n._renderLayout]),n._updateActiveButton=Xt(n.updateActiveButton,null,[n._renderLayout]),n._updateToday=Xt(n.updateToday,null,[n._renderLayout]),n._updatePrev=Xt(n.updatePrev,null,[n._renderLayout]),n._updateNext=Xt(n.updateNext,null,[n._renderLayout]),n.el=r("div",{className:"fc-toolbar "+t}),n}return Ee(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this),this._renderLayout.unrender(),c(this.el)},t.prototype.render=function(e){this._renderLayout(e.layout),this._updateTitle(e.title),this._updateActiveButton(e.activeButton),this._updateToday(e.isTodayEnabled),this._updatePrev(e.isPrevEnabled),this._updateNext(e.isNextEnabled)},t.prototype.renderLayout=function(e){var t=this.el;this.viewsWithButtons=[],s(t,this.renderSection("left",e.left)),s(t,this.renderSection("center",e.center)),s(t,this.renderSection("right",e.right))},t.prototype.unrenderLayout=function(){this.el.innerHTML=""},t.prototype.renderSection=function(e,t){var n=this,o=this.context,a=o.theme,u=o.calendar,l=u.optionsManager,c=u.viewSpecs,d=r("div",{className:"fc-"+e}),f=l.computed.customButtons||{},p=l.overrides.buttonText||{},h=l.computed.buttonText||{};return t&&t.split(" ").forEach((function(e,t){var r,o=[],l=!0;if(e.split(",").forEach((function(e,t){var r,s,d,v,g,y,m,E,S;"title"===e?(o.push(i("<h2>&nbsp;</h2>")),l=!1):((r=f[e])?(d=function(e){r.click&&r.click.call(E,e)},(v=a.getCustomButtonIconClass(r))||(v=a.getIconClass(e))||(g=r.text)):(s=c[e])?(n.viewsWithButtons.push(e),d=function(){u.changeView(e)},(g=s.buttonTextOverride)||(v=a.getIconClass(e))||(g=s.buttonTextDefault)):u[e]&&(d=function(){u[e]()},(g=p[e])||(v=a.getIconClass(e))||(g=h[e])),d&&(m=["fc-"+e+"-button",a.getClass("button")],g?(y=Pt(g),S=""):v&&(y="<span class='"+v+"'></span>",S=' aria-label="'+e+'"'),(E=i('<button type="button" class="'+m.join(" ")+'"'+S+">"+y+"</button>")).addEventListener("click",d),o.push(E)))})),o.length>1){r=document.createElement("div");var v=a.getClass("buttonGroup");l&&v&&r.classList.add(v),s(r,o),d.appendChild(r)}else s(d,o)})),d},t.prototype.updateToday=function(e){this.toggleButtonEnabled("today",e)},t.prototype.updatePrev=function(e){this.toggleButtonEnabled("prev",e)},t.prototype.updateNext=function(e){this.toggleButtonEnabled("next",e)},t.prototype.updateTitle=function(e){v(this.el,"h2").forEach((function(t){t.innerText=e}))},t.prototype.updateActiveButton=function(e){var t=this.context.theme.getClass("buttonActive");v(this.el,"button").forEach((function(n){e&&n.classList.contains("fc-"+e+"-button")?n.classList.add(t):n.classList.remove(t)}))},t.prototype.toggleButtonEnabled=function(e,t){v(this.el,".fc-"+e+"-button").forEach((function(e){e.disabled=!t}))},t}(vn),yr=function(e){function t(t){var n=e.call(this)||this;return n.elClassNames=[],n.renderSkeleton=Xt(n._renderSkeleton,n._unrenderSkeleton),n.renderToolbars=Xt(n._renderToolbars,n._unrenderToolbars,[n.renderSkeleton]),n.buildComponentContext=Ye(Er),n.buildViewPropTransformers=Ye(Sr),n.el=t,n.computeTitle=Ye(mr),n.parseBusinessHours=Ye((function(e){return Gt(e,n.context.calendar)})),n}return Ee(t,e),t.prototype.render=function(e,t){this.freezeHeight();var n=this.computeTitle(e.dateProfile,e.viewSpec.options);this.renderSkeleton(t),this.renderToolbars(e.viewSpec,e.dateProfile,e.currentDate,n),this.renderView(e,n),this.updateSize(),this.thawHeight()},t.prototype.destroy=function(){this.header&&this.header.destroy(),this.footer&&this.footer.destroy(),this.renderSkeleton.unrender(),e.prototype.destroy.call(this)},t.prototype._renderSkeleton=function(e){this.updateElClassNames(e),u(this.el,this.contentEl=r("div",{className:"fc-view-container"}));for(var t=e.calendar,n=0,i=t.pluginSystem.hooks.viewContainerModifiers;n<i.length;n++){(0,i[n])(this.contentEl,t)}},t.prototype._unrenderSkeleton=function(){this.view&&(this.savedScroll=this.view.queryScroll(),this.view.destroy(),this.view=null),c(this.contentEl),this.removeElClassNames()},t.prototype.removeElClassNames=function(){for(var e=this.el.classList,t=0,n=this.elClassNames;t<n.length;t++){var r=n[t];e.remove(r)}this.elClassNames=[]},t.prototype.updateElClassNames=function(e){this.removeElClassNames();var t=e.theme,n=e.options;this.elClassNames=["fc","fc-"+n.dir,t.getClass("widget")];for(var r=this.el.classList,i=0,o=this.elClassNames;i<o.length;i++){var a=o[i];r.add(a)}},t.prototype._renderToolbars=function(e,t,n,r){var i=this.context,o=this.header,a=this.footer,l=i.options,c=i.calendar,d=l.header,f=l.footer,p=this.props.dateProfileGenerator,h=c.getNow(),v=p.build(h),g=p.buildPrev(t,n),y=p.buildNext(t,n),m={title:r,activeButton:e.type,isTodayEnabled:v.isValid&&!Ze(t.currentRange,h),isPrevEnabled:g.isValid,isNextEnabled:y.isValid};d?(o||(o=this.header=new gr("fc-header-toolbar"),u(this.el,o.el)),o.receiveProps(Se({layout:d},m),i)):o&&(o.destroy(),o=this.header=null),f?(a||(a=this.footer=new gr("fc-footer-toolbar"),s(this.el,a.el)),a.receiveProps(Se({layout:f},m),i)):a&&(a.destroy(),a=this.footer=null)},t.prototype._unrenderToolbars=function(){this.header&&(this.header.destroy(),this.header=null),this.footer&&(this.footer.destroy(),this.footer=null)},t.prototype.renderView=function(e,t){var n=this.view,r=this.context,i=r.calendar,o=r.options,a=e.viewSpec,s=e.dateProfileGenerator;n&&n.viewSpec===a||(n&&n.destroy(),n=this.view=new a.class(a,this.contentEl),this.savedScroll&&(n.addScroll(this.savedScroll,!0),this.savedScroll=null)),n.title=t;for(var u={dateProfileGenerator:s,dateProfile:e.dateProfile,businessHours:this.parseBusinessHours(a.options.businessHours),eventStore:e.eventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize},l=0,c=this.buildViewPropTransformers(i.pluginSystem.hooks.viewPropsTransformers);l<c.length;l++){var d=c[l];Se(u,d.transform(u,a,e,o))}n.receiveProps(u,this.buildComponentContext(this.context,a,n))},t.prototype.updateSize=function(e){void 0===e&&(e=!1);var t=this.view;t&&((e||null==this.isHeightAuto)&&this.computeHeightVars(),t.updateSize(e,this.viewHeight,this.isHeightAuto),t.updateNowIndicator(),t.popScroll(e))},t.prototype.computeHeightVars=function(){var e=this.context.calendar,t=e.opt("height"),n=e.opt("contentHeight");if(this.isHeightAuto="auto"===t||"auto"===n,"number"==typeof n)this.viewHeight=n;else if("function"==typeof n)this.viewHeight=n();else if("number"==typeof t)this.viewHeight=t-this.queryToolbarsHeight();else if("function"==typeof t)this.viewHeight=t()-this.queryToolbarsHeight();else if("parent"===t){var r=this.el.parentNode;this.viewHeight=r.getBoundingClientRect().height-this.queryToolbarsHeight()}else this.viewHeight=Math.round(this.contentEl.getBoundingClientRect().width/Math.max(e.opt("aspectRatio"),.5))},t.prototype.queryToolbarsHeight=function(){var e=0;return this.header&&(e+=C(this.header.el)),this.footer&&(e+=C(this.footer.el)),e},t.prototype.freezeHeight=function(){y(this.el,{height:this.el.getBoundingClientRect().height,overflow:"hidden"})},t.prototype.thawHeight=function(){y(this.el,{height:"",overflow:""})},t}(vn);function mr(e,t){var n;return n=/^(year|month)$/.test(e.currentRangeUnit)?e.currentRange:e.activeRange,this.context.dateEnv.formatRange(n.start,n.end,ot(t.titleFormat||function(e){var t=e.currentRangeUnit;if("year"===t)return{year:"numeric"};if("month"===t)return{year:"numeric",month:"long"};var n=L(e.currentRange.start,e.currentRange.end);return null!==n&&n>1?{year:"numeric",month:"short",day:"numeric"}:{year:"numeric",month:"long",day:"numeric"}}(e),t.titleRangeSeparator),{isEndExclusive:e.isRangeAllDay})}function Er(e,t,n){return e.extend(t.options,n)}function Sr(e){return e.map((function(e){return new e}))}var br=function(){function e(e){this.component=e.component}return e.prototype.destroy=function(){},e}();var Dr={},Tr=function(e){function t(t){var n=e.call(this,t)||this;n.handleSegClick=function(e,t){var r=n.component,i=r.context,o=i.calendar,a=i.view,s=ht(t);if(s&&r.isValidSegDownEl(e.target)){var u=p(e.target,".fc-has-url"),l=u?u.querySelector("a[href]").href:"";o.publiclyTrigger("eventClick",[{el:t,event:new ct(r.context.calendar,s.eventRange.def,s.eventRange.instance),jsEvent:e,view:a}]),l&&!e.defaultPrevented&&(window.location.href=l)}};var r=t.component;return n.destroy=_(r.el,"click",r.fgSegSelector+","+r.bgSegSelector,n.handleSegClick),n}return Ee(t,e),t}(br),wr=function(e){function t(t){var n=e.call(this,t)||this;n.handleEventElRemove=function(e){e===n.currentSegEl&&n.handleSegLeave(null,n.currentSegEl)},n.handleSegEnter=function(e,t){ht(t)&&(t.classList.add("fc-allow-mouse-resize"),n.currentSegEl=t,n.triggerEvent("eventMouseEnter",e,t))},n.handleSegLeave=function(e,t){n.currentSegEl&&(t.classList.remove("fc-allow-mouse-resize"),n.currentSegEl=null,n.triggerEvent("eventMouseLeave",e,t))};var r,i,o,a,s,u=t.component;return n.removeHoverListeners=(r=u.el,i=u.fgSegSelector+","+u.bgSegSelector,o=n.handleSegEnter,a=n.handleSegLeave,_(r,"mouseover",i,(function(e,t){if(t!==s){s=t,o(e,t);var n=function(e){s=null,a(e,t),t.removeEventListener("mouseleave",n)};t.addEventListener("mouseleave",n)}}))),u.context.calendar.on("eventElRemove",n.handleEventElRemove),n}return Ee(t,e),t.prototype.destroy=function(){this.removeHoverListeners(),this.component.context.calendar.off("eventElRemove",this.handleEventElRemove)},t.prototype.triggerEvent=function(e,t,n){var r=this.component,i=r.context,o=i.calendar,a=i.view,s=ht(n);t&&!r.isValidSegDownEl(t.target)||o.publiclyTrigger(e,[{el:n,event:new ct(o,s.eventRange.def,s.eventRange.instance),jsEvent:t,view:a}])},t}(br),Rr=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Ee(t,e),t}(fn);Rr.prototype.classes={widget:"fc-unthemed",widgetHeader:"fc-widget-header",widgetContent:"fc-widget-content",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active",popoverHeader:"fc-widget-header",popoverContent:"fc-widget-content",headerRow:"fc-widget-header",dayRow:"fc-widget-content",listView:"fc-widget-content"},Rr.prototype.baseIconClass="fc-icon",Rr.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},Rr.prototype.iconOverrideOption="buttonIcons",Rr.prototype.iconOverrideCustomButtonOption="icon",Rr.prototype.iconOverridePrefix="fc-icon-";var Cr=function(){function e(e,t){var n=this;this.buildComponentContext=Ye(Ir),this.parseRawLocales=Ye(xn),this.buildLocale=Ye(Nn),this.buildDateEnv=Ye(Mr),this.buildTheme=Ye(kr),this.buildEventUiSingleBase=Ye(this._buildEventUiSingleBase),this.buildSelectionConfig=Ye(this._buildSelectionConfig),this.buildEventUiBySource=qe(Or,Me),this.buildEventUiBases=Ye(Pr),this.interactionsStore={},this.actionQueue=[],this.isReducing=!1,this.needsRerender=!1,this.isRendering=!1,this.renderingPauseDepth=0,this.buildDelayedRerender=Ye(_r),this.afterSizingTriggers={},this.isViewUpdated=!1,this.isDatesUpdated=!1,this.isEventsUpdated=!1,this.el=e,this.optionsManager=new Un(t||{}),this.pluginSystem=new En,this.addPluginInputs(this.optionsManager.computed.plugins||[]),this.handleOptions(this.optionsManager.computed),this.publiclyTrigger("_init"),this.hydrate(),this.calendarInteractions=this.pluginSystem.hooks.calendarInteractions.map((function(e){return new e(n)}))}return e.prototype.addPluginInputs=function(e){for(var t=function(e){for(var t=[],n=0,r=e;n<r.length;n++){var i=r[n];if("string"==typeof i){var o="FullCalendar"+ue(i);window[o]?t.push(window[o].default):console.warn("Plugin file not loaded for "+i)}else t.push(i)}return On.concat(t)}(e),n=0,r=t;n<r.length;n++){var i=r[n];this.pluginSystem.add(i)}},Object.defineProperty(e.prototype,"view",{get:function(){return this.component?this.component.view:null},enumerable:!0,configurable:!0}),e.prototype.render=function(){this.component?this.requestRerender():(this.component=new yr(this.el),this.renderableEventStore={defs:{},instances:{}},this.bindHandlers(),this.executeRender())},e.prototype.destroy=function(){if(this.component){this.unbindHandlers(),this.component.destroy(),this.component=null;for(var e=0,t=this.calendarInteractions;e<t.length;e++){t[e].destroy()}this.publiclyTrigger("_destroyed")}},e.prototype.bindHandlers=function(){var e=this;this.removeNavLinkListener=_(this.el,"click","a[data-goto]",(function(t,n){var r=n.getAttribute("data-goto");r=r?JSON.parse(r):{};var i=e.dateEnv,o=i.createMarker(r.date),a=r.type,s=e.viewOpt("navLink"+ue(a)+"Click");"function"==typeof s?s(i.toDate(o),t):("string"==typeof s&&(a=s),e.zoomTo(o,a))})),this.opt("handleWindowResize")&&window.addEventListener("resize",this.windowResizeProxy=pe(this.windowResize.bind(this),this.opt("windowResizeDelay")))},e.prototype.unbindHandlers=function(){this.removeNavLinkListener(),this.windowResizeProxy&&(window.removeEventListener("resize",this.windowResizeProxy),this.windowResizeProxy=null)},e.prototype.hydrate=function(){var e=this;this.state=this.buildInitialState();var t=this.opt("eventSources")||[],n=this.opt("events"),r=[];n&&t.unshift(n);for(var i=0,o=t;i<o.length;i++){var a=Yn(o[i],this);a&&r.push(a)}this.batchRendering((function(){e.dispatch({type:"INIT"}),e.dispatch({type:"ADD_EVENT_SOURCES",sources:r}),e.dispatch({type:"SET_VIEW_TYPE",viewType:e.opt("defaultView")||e.pluginSystem.hooks.defaultView})}))},e.prototype.buildInitialState=function(){return{viewType:null,loadingLevel:0,eventSourceLoadingLevel:0,currentDate:this.getInitialDate(),dateProfile:null,eventSources:{},eventStore:{defs:{},instances:{}},dateSelection:null,eventSelection:"",eventDrag:null,eventResize:null}},e.prototype.dispatch=function(e){if(this.actionQueue.push(e),!this.isReducing){this.isReducing=!0;for(var t=this.state;this.actionQueue.length;)this.state=this.reduce(this.state,this.actionQueue.shift(),this);var n=this.state;this.isReducing=!1,!t.loadingLevel&&n.loadingLevel?this.publiclyTrigger("loading",[!0]):t.loadingLevel&&!n.loadingLevel&&this.publiclyTrigger("loading",[!1]);var r=this.component&&this.component.view;t.eventStore!==n.eventStore&&t.eventStore&&(this.isEventsUpdated=!0),t.dateProfile!==n.dateProfile&&(t.dateProfile&&r&&this.publiclyTrigger("datesDestroy",[{view:r,el:r.el}]),this.isDatesUpdated=!0),t.viewType!==n.viewType&&(t.viewType&&r&&this.publiclyTrigger("viewSkeletonDestroy",[{view:r,el:r.el}]),this.isViewUpdated=!0),this.requestRerender()}},e.prototype.reduce=function(e,t,n){return er(e,t,n)},e.prototype.requestRerender=function(){this.needsRerender=!0,this.delayedRerender()},e.prototype.tryRerender=function(){this.component&&this.needsRerender&&!this.renderingPauseDepth&&!this.isRendering&&this.executeRender()},e.prototype.batchRendering=function(e){this.renderingPauseDepth++,e(),this.renderingPauseDepth--,this.needsRerender&&this.requestRerender()},e.prototype.executeRender=function(){this.needsRerender=!1,this.isRendering=!0,this.renderComponent(),this.isRendering=!1,this.needsRerender&&this.delayedRerender()},e.prototype.renderComponent=function(){var e=this.state,t=this.component,n=e.viewType,r=this.viewSpecs[n];if(!r)throw new Error('View type "'+n+'" is not valid');var i=this.renderableEventStore=e.eventSourceLoadingLevel&&!this.opt("progressiveEventRendering")?this.renderableEventStore:e.eventStore,o=this.buildEventUiSingleBase(r.options),a=this.buildEventUiBySource(e.eventSources),s=this.eventUiBases=this.buildEventUiBases(i.defs,o,a);t.receiveProps(Se({},e,{viewSpec:r,dateProfileGenerator:this.dateProfileGenerators[n],dateProfile:e.dateProfile,eventStore:i,eventUiBases:s,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize}),this.buildComponentContext(this.theme,this.dateEnv,this.optionsManager.computed)),this.isViewUpdated&&(this.isViewUpdated=!1,this.publiclyTrigger("viewSkeletonRender",[{view:t.view,el:t.view.el}])),this.isDatesUpdated&&(this.isDatesUpdated=!1,this.publiclyTrigger("datesRender",[{view:t.view,el:t.view.el}])),this.isEventsUpdated&&(this.isEventsUpdated=!1),this.releaseAfterSizingTriggers()},e.prototype.setOption=function(e,t){var n;this.mutateOptions(((n={})[e]=t,n),[],!0)},e.prototype.getOption=function(e){return this.optionsManager.computed[e]},e.prototype.opt=function(e){return this.optionsManager.computed[e]},e.prototype.viewOpt=function(e){return this.viewOpts()[e]},e.prototype.viewOpts=function(){return this.viewSpecs[this.state.viewType].options},e.prototype.mutateOptions=function(e,t,n,r){var i=this,o=this.pluginSystem.hooks.optionChangeHandlers,a={},s={},u=this.dateEnv,l=!1,c=!1,d=Boolean(t.length);for(var f in e)o[f]?s[f]=e[f]:a[f]=e[f];for(var p in a)/^(height|contentHeight|aspectRatio)$/.test(p)?c=!0:/^(defaultDate|defaultView)$/.test(p)||(d=!0,"timeZone"===p&&(l=!0));this.optionsManager.mutate(a,t,n),d&&this.handleOptions(this.optionsManager.computed),this.batchRendering((function(){if(d?(l&&i.dispatch({type:"CHANGE_TIMEZONE",oldDateEnv:u}),i.dispatch({type:"SET_VIEW_TYPE",viewType:i.state.viewType})):c&&i.updateSize(),r)for(var e in s)o[e](s[e],i,r)}))},e.prototype.handleOptions=function(e){var t=this,n=this.pluginSystem.hooks;this.defaultAllDayEventDuration=J(e.defaultAllDayEventDuration),this.defaultTimedEventDuration=J(e.defaultTimedEventDuration),this.delayedRerender=this.buildDelayedRerender(e.rerenderDelay),this.theme=this.buildTheme(e);var r=this.parseRawLocales(e.locales);this.availableRawLocales=r.map;var i=this.buildLocale(e.locale||r.defaultCode,r.map);this.dateEnv=this.buildDateEnv(i,e.timeZone,n.namedTimeZonedImpl,e.firstDay,e.weekNumberCalculation,e.weekLabel,n.cmdFormatter),this.selectionConfig=this.buildSelectionConfig(e),this.viewSpecs=vr(n.views,this.optionsManager),this.dateProfileGenerators=Re(this.viewSpecs,(function(e){return new e.class.prototype.dateProfileGeneratorClass(e,t)}))},e.prototype.getAvailableLocaleCodes=function(){return Object.keys(this.availableRawLocales)},e.prototype._buildSelectionConfig=function(e){return zt("select",e,this)},e.prototype._buildEventUiSingleBase=function(e){return e.editable&&(e=Se({},e,{eventEditable:!0})),zt("event",e,this)},e.prototype.hasPublicHandlers=function(e){return this.hasHandlers(e)||this.opt(e)},e.prototype.publiclyTrigger=function(e,t){var n=this.opt(e);if(this.triggerWith(e,this,t),n)return n.apply(this,t)},e.prototype.publiclyTriggerAfterSizing=function(e,t){var n=this.afterSizingTriggers;(n[e]||(n[e]=[])).push(t)},e.prototype.releaseAfterSizingTriggers=function(){var e=this.afterSizingTriggers;for(var t in e)for(var n=0,r=e[t];n<r.length;n++){var i=r[n];this.publiclyTrigger(t,i)}this.afterSizingTriggers={}},e.prototype.isValidViewType=function(e){return Boolean(this.viewSpecs[e])},e.prototype.changeView=function(e,t){var n=null;t&&(t.start&&t.end?(this.optionsManager.mutate({visibleRange:t},[]),this.handleOptions(this.optionsManager.computed)):n=this.dateEnv.createMarker(t)),this.unselect(),this.dispatch({type:"SET_VIEW_TYPE",viewType:e,dateMarker:n})},e.prototype.zoomTo=function(e,t){var n;t=t||"day",n=this.viewSpecs[t]||this.getUnitViewSpec(t),this.unselect(),n?this.dispatch({type:"SET_VIEW_TYPE",viewType:n.type,dateMarker:e}):this.dispatch({type:"SET_DATE",dateMarker:e})},e.prototype.getUnitViewSpec=function(e){var t,n,r=this.component,i=[];for(var o in r.header&&i.push.apply(i,r.header.viewsWithButtons),r.footer&&i.push.apply(i,r.footer.viewsWithButtons),this.viewSpecs)i.push(o);for(t=0;t<i.length;t++)if((n=this.viewSpecs[i[t]])&&n.singleUnit===e)return n},e.prototype.getInitialDate=function(){var e=this.opt("defaultDate");return null!=e?this.dateEnv.createMarker(e):this.getNow()},e.prototype.prev=function(){this.unselect(),this.dispatch({type:"PREV"})},e.prototype.next=function(){this.unselect(),this.dispatch({type:"NEXT"})},e.prototype.prevYear=function(){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.addYears(this.state.currentDate,-1)})},e.prototype.nextYear=function(){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.addYears(this.state.currentDate,1)})},e.prototype.today=function(){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.getNow()})},e.prototype.gotoDate=function(e){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.createMarker(e)})},e.prototype.incrementDate=function(e){var t=J(e);t&&(this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.add(this.state.currentDate,t)}))},e.prototype.getDate=function(){return this.dateEnv.toDate(this.state.currentDate)},e.prototype.formatDate=function(e,t){var n=this.dateEnv;return n.format(n.createMarker(e),ot(t))},e.prototype.formatRange=function(e,t,n){var r=this.dateEnv;return r.formatRange(r.createMarker(e),r.createMarker(t),ot(n,this.opt("defaultRangeSeparator")),n)},e.prototype.formatIso=function(e,t){var n=this.dateEnv;return n.formatIso(n.createMarker(e),{omitTime:t})},e.prototype.windowResize=function(e){!this.isHandlingWindowResize&&this.component&&e.target===window&&(this.isHandlingWindowResize=!0,this.updateSize(),this.publiclyTrigger("windowResize",[this.view]),this.isHandlingWindowResize=!1)},e.prototype.updateSize=function(){this.component&&this.component.updateSize(!0)},e.prototype.registerInteractiveComponent=function(e,t){var n=function(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter}}(e,t),r=[Tr,wr].concat(this.pluginSystem.hooks.componentInteractions).map((function(e){return new e(n)}));this.interactionsStore[e.uid]=r,Dr[e.uid]=n},e.prototype.unregisterInteractiveComponent=function(e){for(var t=0,n=this.interactionsStore[e.uid];t<n.length;t++){n[t].destroy()}delete this.interactionsStore[e.uid],delete Dr[e.uid]},e.prototype.select=function(e,t){var n=ur(null==t?null!=e.start?e:{start:e,end:null}:{start:e,end:t},this.dateEnv,J({days:1}));n&&(this.dispatch({type:"SELECT_DATES",selection:n}),this.triggerDateSelect(n))},e.prototype.unselect=function(e){this.state.dateSelection&&(this.dispatch({type:"UNSELECT_DATES"}),this.triggerDateUnselect(e))},e.prototype.triggerDateSelect=function(e,t){var n=Se({},this.buildDateSpanApi(e),{jsEvent:t?t.origEvent:null,view:this.view});this.publiclyTrigger("select",[n])},e.prototype.triggerDateUnselect=function(e){this.publiclyTrigger("unselect",[{jsEvent:e?e.origEvent:null,view:this.view}])},e.prototype.triggerDateClick=function(e,t,n,r){var i=Se({},this.buildDatePointApi(e),{dayEl:t,jsEvent:r,view:n});this.publiclyTrigger("dateClick",[i])},e.prototype.buildDatePointApi=function(e){for(var t,n,r={},i=0,o=this.pluginSystem.hooks.datePointTransforms;i<o.length;i++){var a=o[i];Se(r,a(e,this))}return Se(r,(t=e,{date:(n=this.dateEnv).toDate(t.range.start),dateStr:n.formatIso(t.range.start,{omitTime:t.allDay}),allDay:t.allDay})),r},e.prototype.buildDateSpanApi=function(e){for(var t,n,r={},i=0,o=this.pluginSystem.hooks.dateSpanTransforms;i<o.length;i++){var a=o[i];Se(r,a(e,this))}return Se(r,(t=e,{start:(n=this.dateEnv).toDate(t.range.start),end:n.toDate(t.range.end),startStr:n.formatIso(t.range.start,{omitTime:t.allDay}),endStr:n.formatIso(t.range.end,{omitTime:t.allDay}),allDay:t.allDay})),r},e.prototype.getNow=function(){var e=this.opt("now");return"function"==typeof e&&(e=e()),null==e?this.dateEnv.createNowMarker():this.dateEnv.createMarker(e)},e.prototype.getDefaultEventEnd=function(e,t){var n=t;return e?(n=B(n),n=this.dateEnv.add(n,this.defaultAllDayEventDuration)):n=this.dateEnv.add(n,this.defaultTimedEventDuration),n},e.prototype.addEvent=function(e,t){if(e instanceof ct){var n=e._def,r=e._instance;return this.state.eventStore.defs[n.defId]||this.dispatch({type:"ADD_EVENTS",eventStore:_e({def:n,instance:r})}),e}var i;if(t instanceof lt)i=t.internalEventSource.sourceId;else if(null!=t){var o=this.getEventSourceById(t);if(!o)return console.warn('Could not find an event source with ID "'+t+'"'),null;i=o.internalEventSource.sourceId}var a=Zt(e,i,this);return a?(this.dispatch({type:"ADD_EVENTS",eventStore:_e(a)}),new ct(this,a.def,a.def.recurringDef?null:a.instance)):null},e.prototype.getEventById=function(e){var t=this.state.eventStore,n=t.defs,r=t.instances;for(var i in e=String(e),n){var o=n[i];if(o.publicId===e){if(o.recurringDef)return new ct(this,o,null);for(var a in r){var s=r[a];if(s.defId===o.defId)return new ct(this,o,s)}}}return null},e.prototype.getEvents=function(){var e=this.state.eventStore,t=e.defs,n=e.instances,r=[];for(var i in n){var o=n[i],a=t[o.defId];r.push(new ct(this,a,o))}return r},e.prototype.removeAllEvents=function(){this.dispatch({type:"REMOVE_ALL_EVENTS"})},e.prototype.rerenderEvents=function(){this.dispatch({type:"RESET_EVENTS"})},e.prototype.getEventSources=function(){var e=this.state.eventSources,t=[];for(var n in e)t.push(new lt(this,e[n]));return t},e.prototype.getEventSourceById=function(e){var t=this.state.eventSources;for(var n in e=String(e),t)if(t[n].publicId===e)return new lt(this,t[n]);return null},e.prototype.addEventSource=function(e){if(e instanceof lt)return this.state.eventSources[e.internalEventSource.sourceId]||this.dispatch({type:"ADD_EVENT_SOURCES",sources:[e.internalEventSource]}),e;var t=Yn(e,this);return t?(this.dispatch({type:"ADD_EVENT_SOURCES",sources:[t]}),new lt(this,t)):null},e.prototype.removeAllEventSources=function(){this.dispatch({type:"REMOVE_ALL_EVENT_SOURCES"})},e.prototype.refetchEvents=function(){this.dispatch({type:"FETCH_EVENT_SOURCES"})},e.prototype.scrollToTime=function(e){var t=J(e);t&&this.component.view.scrollToDuration(t)},e}();function Ir(e,t,n){return new hn(this,e,t,n,null)}function Mr(e,t,n,r,i,o,a){return new Fn({calendarSystem:"gregory",timeZone:t,namedTimeZoneImpl:n,locale:e,weekNumberCalculation:i,firstDay:r,weekLabel:o,cmdFormatter:a})}function kr(e){return new(this.pluginSystem.hooks.themeClasses[e.themeSystem]||Rr)(e)}function _r(e){var t=this.tryRerender.bind(this);return null!=e&&(t=pe(t,e)),t}function Or(e){return Re(e,(function(e){return e.ui}))}function Pr(e,t,n){var r={"":t};for(var i in e){var o=e[i];o.sourceId&&n[o.sourceId]&&(r[i]=n[o.sourceId])}return r}rn.mixInto(Cr);var xr=function(e){function t(t,n){var i=e.call(this,r("div",{className:"fc-view fc-"+t.type+"-view"}))||this;return i.renderDatesMem=Xt(i.renderDatesWrap,i.unrenderDatesWrap),i.renderBusinessHoursMem=Xt(i.renderBusinessHours,i.unrenderBusinessHours,[i.renderDatesMem]),i.renderDateSelectionMem=Xt(i.renderDateSelectionWrap,i.unrenderDateSelectionWrap,[i.renderDatesMem]),i.renderEventsMem=Xt(i.renderEvents,i.unrenderEvents,[i.renderDatesMem]),i.renderEventSelectionMem=Xt(i.renderEventSelectionWrap,i.unrenderEventSelectionWrap,[i.renderEventsMem]),i.renderEventDragMem=Xt(i.renderEventDragWrap,i.unrenderEventDragWrap,[i.renderDatesMem]),i.renderEventResizeMem=Xt(i.renderEventResizeWrap,i.unrenderEventResizeWrap,[i.renderDatesMem]),i.viewSpec=t,i.type=t.type,n.appendChild(i.el),i.initialize(),i}return Ee(t,e),t.prototype.initialize=function(){},Object.defineProperty(t.prototype,"activeStart",{get:function(){return this.context.dateEnv.toDate(this.props.dateProfile.activeRange.start)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeEnd",{get:function(){return this.context.dateEnv.toDate(this.props.dateProfile.activeRange.end)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"currentStart",{get:function(){return this.context.dateEnv.toDate(this.props.dateProfile.currentRange.start)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"currentEnd",{get:function(){return this.context.dateEnv.toDate(this.props.dateProfile.currentRange.end)},enumerable:!0,configurable:!0}),t.prototype.render=function(e,t){this.renderDatesMem(e.dateProfile),this.renderBusinessHoursMem(e.businessHours),this.renderDateSelectionMem(e.dateSelection),this.renderEventsMem(e.eventStore),this.renderEventSelectionMem(e.eventSelection),this.renderEventDragMem(e.eventDrag),this.renderEventResizeMem(e.eventResize)},t.prototype.beforeUpdate=function(){this.addScroll(this.queryScroll())},t.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderDatesMem.unrender()},t.prototype.updateSize=function(e,t,n){var r=this.context.calendar;e&&this.addScroll(this.queryScroll()),(e||r.isViewUpdated||r.isDatesUpdated||r.isEventsUpdated)&&this.updateBaseSize(e,t,n)},t.prototype.updateBaseSize=function(e,t,n){},t.prototype.renderDatesWrap=function(e){this.renderDates(e),this.addScroll({duration:J(this.context.options.scrollTime)})},t.prototype.unrenderDatesWrap=function(){this.stopNowIndicator(),this.unrenderDates()},t.prototype.renderDates=function(e){},t.prototype.unrenderDates=function(){},t.prototype.renderBusinessHours=function(e){},t.prototype.unrenderBusinessHours=function(){},t.prototype.renderDateSelectionWrap=function(e){e&&this.renderDateSelection(e)},t.prototype.unrenderDateSelectionWrap=function(e){e&&this.unrenderDateSelection(e)},t.prototype.renderDateSelection=function(e){},t.prototype.unrenderDateSelection=function(e){},t.prototype.renderEvents=function(e){},t.prototype.unrenderEvents=function(){},t.prototype.sliceEvents=function(e,t){var n=this.props;return dt(e,n.eventUiBases,n.dateProfile.activeRange,t?this.context.nextDayThreshold:null).fg},t.prototype.renderEventSelectionWrap=function(e){e&&this.renderEventSelection(e)},t.prototype.unrenderEventSelectionWrap=function(e){e&&this.unrenderEventSelection(e)},t.prototype.renderEventSelection=function(e){},t.prototype.unrenderEventSelection=function(e){},t.prototype.renderEventDragWrap=function(e){e&&this.renderEventDrag(e)},t.prototype.unrenderEventDragWrap=function(e){e&&this.unrenderEventDrag(e)},t.prototype.renderEventDrag=function(e){},t.prototype.unrenderEventDrag=function(e){},t.prototype.renderEventResizeWrap=function(e){e&&this.renderEventResize(e)},t.prototype.unrenderEventResizeWrap=function(e){e&&this.unrenderEventResize(e)},t.prototype.renderEventResize=function(e){},t.prototype.unrenderEventResize=function(e){},t.prototype.startNowIndicator=function(e,t){var n,r,i,o=this,a=this.context,s=a.calendar,u=a.dateEnv;a.options.nowIndicator&&!this.initialNowDate&&(n=this.getNowIndicatorUnit(e,t))&&(r=this.updateNowIndicator.bind(this),this.initialNowDate=s.getNow(),this.initialNowQueriedMs=(new Date).valueOf(),i=u.add(u.startOf(this.initialNowDate,n),J(1,n)).valueOf()-this.initialNowDate.valueOf(),this.nowIndicatorTimeoutID=setTimeout((function(){o.nowIndicatorTimeoutID=null,r(),i="second"===n?1e3:6e4,o.nowIndicatorIntervalID=setInterval(r,i)}),i))},t.prototype.updateNowIndicator=function(){this.props.dateProfile&&this.initialNowDate&&(this.unrenderNowIndicator(),this.renderNowIndicator(N(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs)),this.isNowIndicatorRendered=!0)},t.prototype.stopNowIndicator=function(){this.nowIndicatorTimeoutID&&(clearTimeout(this.nowIndicatorTimeoutID),this.nowIndicatorTimeoutID=null),this.nowIndicatorIntervalID&&(clearInterval(this.nowIndicatorIntervalID),this.nowIndicatorIntervalID=null),this.isNowIndicatorRendered&&(this.unrenderNowIndicator(),this.isNowIndicatorRendered=!1)},t.prototype.getNowIndicatorUnit=function(e,t){},t.prototype.renderNowIndicator=function(e){},t.prototype.unrenderNowIndicator=function(){},t.prototype.addScroll=function(e,t){t&&(e.isForced=t),Se(this.queuedScroll||(this.queuedScroll={}),e)},t.prototype.popScroll=function(e){this.applyQueuedScroll(e),this.queuedScroll=null},t.prototype.applyQueuedScroll=function(e){this.queuedScroll&&this.applyScroll(this.queuedScroll,e)},t.prototype.queryScroll=function(){var e={};return this.props.dateProfile&&Se(e,this.queryDateScroll()),e},t.prototype.applyScroll=function(e,t){var n=e.duration,r=e.isForced;null==n||r||(delete e.duration,this.props.dateProfile&&Se(e,this.computeDateScroll(n))),this.props.dateProfile&&this.applyDateScroll(e)},t.prototype.computeDateScroll=function(e){return{}},t.prototype.queryDateScroll=function(){return{}},t.prototype.applyDateScroll=function(e){},t.prototype.scrollToDuration=function(e){this.applyScroll({duration:e},!1)},t}(gn);rn.mixInto(xr),xr.prototype.usesMinMaxTime=!1,xr.prototype.dateProfileGeneratorClass=$n;var Nr=function(){function e(){this.segs=[],this.isSizeDirty=!1}return e.prototype.renderSegs=function(e,t,n){this.context=e,this.rangeUpdated(),t=this.renderSegEls(t,n),this.segs=t,this.attachSegs(t,n),this.isSizeDirty=!0,yt(this.context,this.segs,Boolean(n))},e.prototype.unrender=function(e,t,n){mt(this.context,this.segs,Boolean(n)),this.detachSegs(this.segs),this.segs=[]},e.prototype.rangeUpdated=function(){var e,t,n=this.context.options;this.eventTimeFormat=ot(n.eventTimeFormat||this.computeEventTimeFormat(),n.defaultRangeSeparator),null==(e=n.displayEventTime)&&(e=this.computeDisplayEventTime()),null==(t=n.displayEventEnd)&&(t=this.computeDisplayEventEnd()),this.displayEventTime=e,this.displayEventEnd=t},e.prototype.renderSegEls=function(e,t){var n,r="";if(e.length){for(n=0;n<e.length;n++)r+=this.renderSegHtml(e[n],t);o(r).forEach((function(t,n){var r=e[n];t&&(r.el=t)})),e=ft(this.context,e,Boolean(t))}return e},e.prototype.getSegClasses=function(e,t,n,r){var i=["fc-event",e.isStart?"fc-start":"fc-not-start",e.isEnd?"fc-end":"fc-not-end"].concat(e.eventRange.ui.classNames);return t&&i.push("fc-draggable"),n&&i.push("fc-resizable"),r&&(i.push("fc-mirror"),r.isDragging&&i.push("fc-dragging"),r.isResizing&&i.push("fc-resizing")),i},e.prototype.getTimeText=function(e,t,n){var r=e.def,i=e.instance;return this._getTimeText(i.range.start,r.hasEnd?i.range.end:null,r.allDay,t,n,i.forcedStartTzo,i.forcedEndTzo)},e.prototype._getTimeText=function(e,t,n,r,i,o,a){var s=this.context.dateEnv;return null==r&&(r=this.eventTimeFormat),null==i&&(i=this.displayEventEnd),this.displayEventTime&&!n?i&&t?s.formatRange(e,t,r,{forcedStartTzo:o,forcedEndTzo:a}):s.format(e,r,{forcedTzo:o}):""},e.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",omitZeroMinute:!0}},e.prototype.computeDisplayEventTime=function(){return!0},e.prototype.computeDisplayEventEnd=function(){return!0},e.prototype.getSkinCss=function(e){return{"background-color":e.backgroundColor,"border-color":e.borderColor,color:e.textColor}},e.prototype.sortEventSegs=function(e){var t=this.context.eventOrderSpecs,n=e.map(Hr);return n.sort((function(e,n){return oe(e,n,t)})),n.map((function(e){return e._seg}))},e.prototype.computeSizes=function(e){(e||this.isSizeDirty)&&this.computeSegSizes(this.segs)},e.prototype.assignSizes=function(e){(e||this.isSizeDirty)&&(this.assignSegSizes(this.segs),this.isSizeDirty=!1)},e.prototype.computeSegSizes=function(e){},e.prototype.assignSegSizes=function(e){},e.prototype.hideByHash=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t];e[r.eventRange.instance.instanceId]&&(r.el.style.visibility="hidden")}},e.prototype.showByHash=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t];e[r.eventRange.instance.instanceId]&&(r.el.style.visibility="")}},e.prototype.selectByInstanceId=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t],i=r.eventRange.instance;i&&i.instanceId===e&&r.el&&r.el.classList.add("fc-selected")}},e.prototype.unselectByInstanceId=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t];r.el&&r.el.classList.remove("fc-selected")}},e}();function Hr(e){var t=e.eventRange.def,n=e.eventRange.instance.range,r=n.start?n.start.valueOf():0,i=n.end?n.end.valueOf():0;return Se({},t.extendedProps,t,{id:t.publicId,start:r,end:i,duration:i-r,allDay:Number(t.allDay),_seg:e})}var Ur=function(){function e(){this.fillSegTag="div",this.dirtySizeFlags={},this.containerElsByType={},this.segsByType={}}return e.prototype.getSegsByType=function(e){return this.segsByType[e]||[]},e.prototype.renderSegs=function(e,t,n){var r;this.context=t;var i=this.renderSegEls(e,n),o=this.attachSegs(e,i);o&&(r=this.containerElsByType[e]||(this.containerElsByType[e]=[])).push.apply(r,o),this.segsByType[e]=i,"bgEvent"===e&&yt(t,i,!1),this.dirtySizeFlags[e]=!0},e.prototype.unrender=function(e,t){var n=this.segsByType[e];n&&("bgEvent"===e&&mt(t,n,!1),this.detachSegs(e,n))},e.prototype.renderSegEls=function(e,t){var n,r=this,i="";if(t.length){for(n=0;n<t.length;n++)i+=this.renderSegHtml(e,t[n]);o(i).forEach((function(e,n){var r=t[n];e&&(r.el=e)})),"bgEvent"===e&&(t=ft(this.context,t,!1)),t=t.filter((function(e){return h(e.el,r.fillSegTag)}))}return t},e.prototype.renderSegHtml=function(e,t){var n=null,r=[];return"highlight"!==e&&"businessHours"!==e&&(n={"background-color":t.eventRange.ui.backgroundColor}),"highlight"!==e&&(r=r.concat(t.eventRange.ui.classNames)),"businessHours"===e?r.push("fc-bgevent"):r.push("fc-"+e.toLowerCase()),"<"+this.fillSegTag+(r.length?' class="'+r.join(" ")+'"':"")+(n?' style="'+xt(n)+'"':"")+"></"+this.fillSegTag+">"},e.prototype.detachSegs=function(e,t){var n=this.containerElsByType[e];n&&(n.forEach(c),delete this.containerElsByType[e])},e.prototype.computeSizes=function(e){for(var t in this.segsByType)(e||this.dirtySizeFlags[t])&&this.computeSegSizes(this.segsByType[t])},e.prototype.assignSizes=function(e){for(var t in this.segsByType)(e||this.dirtySizeFlags[t])&&this.assignSegSizes(this.segsByType[t]);this.dirtySizeFlags={}},e.prototype.computeSegSizes=function(e){},e.prototype.assignSegSizes=function(e){},e}(),zr=function(e){this.timeZoneName=e},Lr=function(){function e(e){this.emitter=new rn}return e.prototype.destroy=function(){},e.prototype.setMirrorIsVisible=function(e){},e.prototype.setMirrorNeedsRevert=function(e){},e.prototype.setAutoScrollEnabled=function(e){},e}();function Br(e){var t=Nn(e.locale||"en",xn([]).map);return e=Se({timeZone:Mn.timeZone,calendarSystem:"gregory"},e,{locale:t}),new Fn(e)}var Vr={startTime:J,duration:J,create:Boolean,sourceId:String},Ar={create:!0};function Fr(e,t){return!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"}}function Wr(e,t,n,r,i,o,a,s){var u,l=o.dateEnv,c=o.theme,d=o.options,f=Ze(t.activeRange,e),p=["fc-day-header",c.getClass("widgetHeader")];return u="function"==typeof d.columnHeaderHtml?d.columnHeaderHtml(l.toDate(e)):"function"==typeof d.columnHeaderText?Pt(d.columnHeaderText(l.toDate(e))):Pt(l.format(e,i)),n?p=p.concat(en(e,t,o,!0)):p.push("fc-"+P[e.getUTCDay()]),'<th class="'+p.join(" ")+'"'+(f&&n?' data-date="'+l.formatIso(e,{omitTime:!0})+'"':"")+(a>1?' colspan="'+a+'"':"")+(s?" "+s:"")+">"+(f?$t(d,l,{date:e,forceOff:!n||1===r},u):u)+"</th>"}var Zr=function(e){function t(t){var n=e.call(this)||this;return n.renderSkeleton=Xt(n._renderSkeleton,n._unrenderSkeleton),n.parentEl=t,n}return Ee(t,e),t.prototype.render=function(e,t){var n=e.dates,r=e.datesRepDistinctDays,i=[];this.renderSkeleton(t),e.renderIntroHtml&&i.push(e.renderIntroHtml());for(var o=ot(t.options.columnHeaderFormat||Fr(r,n.length)),a=0,s=n;a<s.length;a++){var u=s[a];i.push(Wr(u,e.dateProfile,r,n.length,o,t))}t.isRtl&&i.reverse(),this.thead.innerHTML="<tr>"+i.join("")+"</tr>"},t.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderSkeleton.unrender()},t.prototype._renderSkeleton=function(e){var t=e.theme,n=this.parentEl;n.innerHTML="",n.appendChild(this.el=i('<div class="fc-row '+t.getClass("headerRow")+'"><table class="'+t.getClass("tableGrid")+'"><thead></thead></table></div>')),this.thead=this.el.querySelector("thead")},t.prototype._unrenderSkeleton=function(){c(this.el)},t}(vn),jr=function(){function e(e,t){for(var n=e.start,r=e.end,i=[],o=[],a=-1;n<r;)t.isHiddenDay(n)?i.push(a+.5):(a++,i.push(a),o.push(n)),n=x(n,1);this.dates=o,this.indices=i,this.cnt=o.length}return e.prototype.sliceRange=function(e){var t=this.getDateDayIndex(e.start),n=this.getDateDayIndex(x(e.end,-1)),r=Math.max(0,t),i=Math.min(this.cnt-1,n);return(r=Math.ceil(r))<=(i=Math.floor(i))?{firstIndex:r,lastIndex:i,isStart:t===r,isEnd:n===i}:null},e.prototype.getDateDayIndex=function(e){var t=this.indices,n=Math.floor(H(this.dates[0],e));return n<0?t[0]-1:n>=t.length?t[t.length-1]+1:t[n]},e}(),Yr=function(){function e(e,t){var n,r,i,o=e.dates;if(t){for(r=o[0].getUTCDay(),n=1;n<o.length&&o[n].getUTCDay()!==r;n++);i=Math.ceil(o.length/n)}else i=1,n=o.length;this.rowCnt=i,this.colCnt=n,this.daySeries=e,this.cells=this.buildCells(),this.headerDates=this.buildHeaderDates()}return e.prototype.buildCells=function(){for(var e=[],t=0;t<this.rowCnt;t++){for(var n=[],r=0;r<this.colCnt;r++)n.push(this.buildCell(t,r));e.push(n)}return e},e.prototype.buildCell=function(e,t){return{date:this.daySeries.dates[e*this.colCnt+t]}},e.prototype.buildHeaderDates=function(){for(var e=[],t=0;t<this.colCnt;t++)e.push(this.cells[0][t].date);return e},e.prototype.sliceRange=function(e){var t=this.colCnt,n=this.daySeries.sliceRange(e),r=[];if(n)for(var i=n.firstIndex,o=n.lastIndex,a=i;a<=o;){var s=Math.floor(a/t),u=Math.min((s+1)*t,o+1);r.push({row:s,firstCol:a%t,lastCol:(u-1)%t,isStart:n.isStart&&a===i,isEnd:n.isEnd&&u-1===o}),a=u}return r},e}(),qr=function(){function e(){this.sliceBusinessHours=Ye(this._sliceBusinessHours),this.sliceDateSelection=Ye(this._sliceDateSpan),this.sliceEventStore=Ye(this._sliceEventStore),this.sliceEventDrag=Ye(this._sliceInteraction),this.sliceEventResize=Ye(this._sliceInteraction)}return e.prototype.sliceProps=function(e,t,n,r,i){for(var o=[],a=5;a<arguments.length;a++)o[a-5]=arguments[a];var s=e.eventUiBases,u=this.sliceEventStore.apply(this,[e.eventStore,s,t,n,i].concat(o));return{dateSelectionSegs:this.sliceDateSelection.apply(this,[e.dateSelection,s,i].concat(o)),businessHourSegs:this.sliceBusinessHours.apply(this,[e.businessHours,t,n,r,i].concat(o)),fgEventSegs:u.fg,bgEventSegs:u.bg,eventDrag:this.sliceEventDrag.apply(this,[e.eventDrag,s,t,n,i].concat(o)),eventResize:this.sliceEventResize.apply(this,[e.eventResize,s,t,n,i].concat(o)),eventSelection:e.eventSelection}},e.prototype.sliceNowDate=function(e,t){for(var n=[],r=2;r<arguments.length;r++)n[r-2]=arguments[r];return this._sliceDateSpan.apply(this,[{range:{start:e,end:N(e,1)},allDay:!1},{},t].concat(n))},e.prototype._sliceBusinessHours=function(e,t,n,r,i){for(var o=[],a=5;a<arguments.length;a++)o[a-5]=arguments[a];return e?this._sliceEventStore.apply(this,[Oe(e,Gr(t,Boolean(n)),r),{},t,n,i].concat(o)).bg:[]},e.prototype._sliceEventStore=function(e,t,n,r,i){for(var o=[],a=5;a<arguments.length;a++)o[a-5]=arguments[a];if(e){var s=dt(e,t,Gr(n,Boolean(r)),r);return{bg:this.sliceEventRanges(s.bg,i,o),fg:this.sliceEventRanges(s.fg,i,o)}}return{bg:[],fg:[]}},e.prototype._sliceInteraction=function(e,t,n,r,i){for(var o=[],a=5;a<arguments.length;a++)o[a-5]=arguments[a];if(!e)return null;var s=dt(e.mutatedEvents,t,Gr(n,Boolean(r)),r);return{segs:this.sliceEventRanges(s.fg,i,o),affectedInstances:e.affectedEvents.instances,isEvent:e.isEvent,sourceSeg:e.origSeg}},e.prototype._sliceDateSpan=function(e,t,n){for(var r=[],i=3;i<arguments.length;i++)r[i-3]=arguments[i];if(!e)return[];for(var o=lr(e,t,n.context.calendar),a=this.sliceRange.apply(this,[e.range].concat(r)),s=0,u=a;s<u.length;s++){var l=u[s];l.component=n,l.eventRange=o}return a},e.prototype.sliceEventRanges=function(e,t,n){for(var r=[],i=0,o=e;i<o.length;i++){var a=o[i];r.push.apply(r,this.sliceEventRange(a,t,n))}return r},e.prototype.sliceEventRange=function(e,t,n){for(var r=this.sliceRange.apply(this,[e.range].concat(n)),i=0,o=r;i<o.length;i++){var a=o[i];a.component=t,a.eventRange=e,a.isStart=e.isStart&&a.isStart,a.isEnd=e.isEnd&&a.isEnd}return r},e}();function Gr(e,t){var n=e.activeRange;return t?n:{start:N(n.start,e.minTime.milliseconds),end:N(n.end,e.maxTime.milliseconds-864e5)}}e.Calendar=Cr,e.Component=vn,e.ComponentContext=hn,e.DateComponent=gn,e.DateEnv=Fn,e.DateProfileGenerator=$n,e.DayHeader=Zr,e.DaySeries=jr,e.DayTable=Yr,e.ElementDragging=Lr,e.ElementScrollController=ln,e.EmitterMixin=rn,e.EventApi=ct,e.FgEventRenderer=Nr,e.FillRenderer=Ur,e.Interaction=br,e.Mixin=nn,e.NamedTimeZoneImpl=zr,e.PositionCache=sn,e.ScrollComponent=dn,e.ScrollController=un,e.Slicer=qr,e.Splitter=Kt,e.Theme=fn,e.View=xr,e.WindowScrollController=cn,e.addDays=x,e.addDurations=function(e,t){return{years:e.years+t.years,months:e.months+t.months,days:e.days+t.days,milliseconds:e.milliseconds+t.milliseconds}},e.addMs=N,e.addWeeks=function(e,t){var n=Z(e);return n[2]+=7*t,j(n)},e.allowContextMenu=function(e){e.removeEventListener("contextmenu",k)},e.allowSelection=function(e){e.classList.remove("fc-unselectable"),e.removeEventListener("selectstart",k)},e.appendToElement=s,e.applyAll=de,e.applyMutationToEventStore=Et,e.applyStyle=y,e.applyStyleProp=m,e.asRoughMinutes=function(e){return te(e)/6e4},e.asRoughMs=te,e.asRoughSeconds=function(e){return te(e)/1e3},e.buildGotoAnchorHtml=$t,e.buildSegCompareObj=Hr,e.capitaliseFirstLetter=ue,e.combineEventUis=Bt,e.compareByFieldSpec=ae,e.compareByFieldSpecs=oe,e.compareNumbers=function(e,t){return e-t},e.compensateScroll=function(e,t){t.left&&y(e,{borderLeftWidth:1,marginLeft:t.left-1}),t.right&&y(e,{borderRightWidth:1,marginRight:t.right-1})},e.computeClippingRect=function(e){return M(e).map((function(e){return w(e)})).concat({left:window.pageXOffset,right:window.pageXOffset+document.documentElement.clientWidth,top:window.pageYOffset,bottom:window.pageYOffset+document.documentElement.clientHeight}).reduce((function(e,t){return E(e,t)||t}))},e.computeEdges=T,e.computeEventDraggable=function(e,t,n){for(var r=e.calendar,i=e.view,o=r.pluginSystem.hooks.isDraggableTransformers,a=n.startEditable,s=0,u=o;s<u.length;s++){a=(0,u[s])(a,t,n,i)}return a},e.computeEventEndResizable=function(e,t,n){return n.durationEditable},e.computeEventStartResizable=function(e,t,n){return n.durationEditable&&e.options.eventResizableFromStart},e.computeFallbackHeaderFormat=Fr,e.computeHeightAndMargins=C,e.computeInnerRect=w,e.computeRect=R,e.computeVisibleDayRange=ge,e.config={},e.constrainPoint=function(e,t){return{left:Math.min(Math.max(e.left,t.left),t.right),top:Math.min(Math.max(e.top,t.top),t.bottom)}},e.createDuration=J,e.createElement=r,e.createEmptyEventStore=Ne,e.createEventInstance=Yt,e.createFormatter=ot,e.createPlugin=mn,e.cssToStr=xt,e.debounce=pe,e.diffDates=ye,e.diffDayAndTime=U,e.diffDays=H,e.diffPoints=function(e,t){return{left:e.left-t.left,top:e.top-t.top}},e.diffWeeks=function(e,t){return H(e,t)/7},e.diffWholeDays=L,e.diffWholeWeeks=z,e.disableCursor=function(){document.body.classList.add("fc-not-allowed")},e.distributeHeight=function(e,t,n){var r=Math.floor(t/e.length),i=Math.floor(t-r*(e.length-1)),o=[],a=[],s=[],u=0;re(e),e.forEach((function(t,n){var l=n===e.length-1?i:r,c=t.getBoundingClientRect().height,d=c+I(t);d<l?(o.push(t),a.push(d),s.push(c)):u+=d})),n&&(t-=u,r=Math.floor(t/o.length),i=Math.floor(t-r*(o.length-1))),o.forEach((function(e,t){var n=t===o.length-1?i:r,u=a[t],l=n-(u-s[t]);u<n&&(e.style.height=l+"px")}))},e.elementClosest=p,e.elementMatches=h,e.enableCursor=function(){document.body.classList.remove("fc-not-allowed")},e.eventTupleToStore=_e,e.filterEventStoreDefs=Ue,e.filterHash=we,e.findChildren=function(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],i=0;i<n.length;i++)for(var o=n[i].children,a=0;a<o.length;a++){var s=o[a];t&&!h(s,t)||r.push(s)}return r},e.findElements=v,e.flexibleCompare=se,e.forceClassName=function(e,t,n){n?e.classList.add(t):e.classList.remove(t)},e.formatDate=function(e,t){void 0===t&&(t={});var n=Br(t),r=ot(t),i=n.createMarkerMeta(e);return i?n.format(i.marker,r,{forcedTzo:i.forcedTzo}):""},e.formatIsoTimeString=function(e){return le(e.getUTCHours(),2)+":"+le(e.getUTCMinutes(),2)+":"+le(e.getUTCSeconds(),2)},e.formatRange=function(e,t,n){var r=Br("object"==typeof n&&n?n:{}),i=ot(n,Mn.defaultRangeSeparator),o=r.createMarkerMeta(e),a=r.createMarkerMeta(t);return o&&a?r.formatRange(o.marker,a.marker,i,{forcedStartTzo:o.forcedTzo,forcedEndTzo:a.forcedTzo,isEndExclusive:n.isEndExclusive}):""},e.getAllDayHtml=function(e){return e.allDayHtml||Pt(e.allDayText)},e.getClippingParents=M,e.getDayClasses=en,e.getElSeg=ht,e.getRectCenter=function(e){return{left:(e.left+e.right)/2,top:(e.top+e.bottom)/2}},e.getRelevantEvents=Pe,e.globalDefaults=Mn,e.greatestDurationDenominator=ne,e.hasBgRendering=function(e){return"background"===e.rendering||"inverse-background"===e.rendering},e.htmlEscape=Pt,e.htmlToElement=i,e.insertAfterElement=function(e,t){for(var n=l(t),r=e.nextSibling||null,i=0;i<n.length;i++)e.parentNode.insertBefore(n[i],r)},e.interactionSettingsStore=Dr,e.interactionSettingsToStore=function(e){var t;return(t={})[e.component.uid]=e,t},e.intersectRanges=Ve,e.intersectRects=E,e.isArraysEqual=je,e.isDateSpansEqual=function(e,t){return Ae(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(var n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(var n in e)if(!(n in t))return!1;return!0}(e,t)},e.isInt=ce,e.isInteractionValid=Rt,e.isMultiDayRange=function(e){var t=ge(e);return H(t.start,t.end)>1},e.isPropsEqual=Me,e.isPropsValid=It,e.isSingleDay=function(e){return 0===e.years&&0===e.months&&1===e.days&&0===e.milliseconds},e.isValidDate=Y,e.listenBySelector=_,e.mapHash=Re,e.matchCellWidths=function(e){var t=0;return e.forEach((function(e){var n=e.firstChild;if(n instanceof HTMLElement){var r=n.getBoundingClientRect().width;r>t&&(t=r)}})),t++,e.forEach((function(e){e.style.width=t+"px"})),t},e.memoize=Ye,e.memoizeOutput=qe,e.memoizeRendering=Xt,e.mergeEventStores=He,e.multiplyDuration=function(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}},e.padStart=le,e.parseBusinessHours=Gt,e.parseDragMeta=function(e){var t={},n=he(e,Vr,Ar,t);return n.leftoverProps=t,n},e.parseEventDef=jt,e.parseFieldSpecs=ie,e.parseMarker=An,e.pointInsideRect=function(e,t){return e.left>=t.left&&e.left<t.right&&e.top>=t.top&&e.top<t.bottom},e.prependToElement=u,e.preventContextMenu=function(e){e.addEventListener("contextmenu",k)},e.preventDefault=k,e.preventSelection=function(e){e.classList.add("fc-unselectable"),e.addEventListener("selectstart",k)},e.processScopedUiProps=zt,e.rangeContainsMarker=Ze,e.rangeContainsRange=We,e.rangesEqual=Ae,e.rangesIntersect=Fe,e.refineProps=he,e.removeElement=c,e.removeExact=function(e,t){for(var n=0,r=0;r<e.length;)e[r]===t?(e.splice(r,1),n++):r++;return n},e.renderDateCell=Wr,e.requestJson=Dn,e.sliceEventStore=dt,e.startOfDay=B,e.subtractInnerElHeight=function(e,t){var n={position:"relative",left:-1};y(e,n),y(t,n);var r=e.getBoundingClientRect().height-t.getBoundingClientRect().height,i={position:"",left:""};return y(e,i),y(t,i),r},e.translateRect=function(e,t,n){return{left:e.left+t,right:e.right+t,top:e.top+n,bottom:e.bottom+n}},e.uncompensateScroll=function(e){y(e,{marginLeft:"",marginRight:"",borderLeftWidth:"",borderRightWidth:""})},e.undistributeHeight=re,e.unpromisify=tn,e.version="4.4.2",e.whenTransitionDone=function(e,t){var n=function(r){t(r),O.forEach((function(t){e.removeEventListener(t,n)}))};O.forEach((function(t){e.addEventListener(t,n)}))},e.wholeDivideDurations=function(e,t){for(var n=null,r=0;r<G.length;r++){var i=G[r];if(t[i]){var o=e[i]/t[i];if(!ce(o)||null!==n&&n!==o)return null;n=o}else if(e[i])return null}return n},Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/package.json b/library/fullcalendar/packages/core/package.json
deleted file mode 100644
index 5040089ad..000000000
--- a/library/fullcalendar/packages/core/package.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "name": "@fullcalendar/core",
- "version": "4.4.2",
- "title": "FullCalendar Core Package",
- "description": "Provides core functionality, including the Calendar class",
- "keywords": [
- "calendar",
- "event",
- "full-sized"
- ],
- "homepage": "https://fullcalendar.io/",
- "docs": "https://fullcalendar.io/docs/initialize-es6",
- "bugs": "https://fullcalendar.io/reporting-bugs",
- "repository": {
- "type": "git",
- "url": "https://github.com/fullcalendar/fullcalendar.git",
- "homepage": "https://github.com/fullcalendar/fullcalendar"
- },
- "license": "MIT",
- "author": {
- "name": "Adam Shaw",
- "email": "arshaw@arshaw.com",
- "url": "http://arshaw.com/"
- },
- "copyright": "2019 Adam Shaw",
- "main": "main.js",
- "module": "main.esm.js",
- "unpkg": "main.min.js",
- "types": "main.d.ts"
-}