[REF] calendar,web: update to FullCalendar v4

This commit updates the FullCalendar library from v3 to v4.

The purpose of this update for us is to add a proper support of the
drag-and-drop of events on mobile.

But also to fix scrolling issues present mainly on smaller screens. In
those configurations multi/inner-scrolls were present resulting into
either the inability to properly scroll the desired content or even
blocking alltogether the scroll.

As a nice-to-have feature, the version 4 removes its dependency on the
jQuery library, allowing a faster loading of a bigger set of events.

Last but not least, this version also reduces its dependency on the
Moment.js library (but still keeps a binding to it for compatibility
purpose).

This commit focus only on the update of the library itself and the
adaptation of the related code to keep it working. Further
enhancements/fixes will be done later on.

To do so it modifies the following points:
* Update the library in itself (js, css...).
* Convert all FullCalendar's method calls to the new syntax (e.g.
  `$calendar.fullCalendar('destroy')` becomes `calendar.destroy()`).
* Add a utility method to convert v4 events into the old v3 event
  structure to ease the transition from one version to the other.
* Wrap all event's custom fields into a new event's
  `extendedProps` object (as its the new way of storing them instead of
  directly as a prop. of the event).
* Adapt `slotLabelFormat` and `weekNumberCalculation`.
* Use the view's new names:
** `agendaDay`  -> `timeGridDay`
** `agendaWeek` -> `timeGridWeek`
** `month`      -> `dayGridMonth`
* Use the option's new names:
** `viewRender`      -> `datesRender`
** `eventMouseover`  -> `eventMouseEnter`
** `eventMouseout`   -> `eventMouseLeave`
** `isRTL`           -> `dir`
** `selectHelper`    -> `selectMirror`
** `weekNumberTitle` -> `weekLabel`

Ref:
https://fullcalendar.io/docs/upgrading-from-v3

Task ID: 2092550
This commit is contained in:
Romeo Fragomeli
2020-03-31 15:06:11 +00:00
committed by Pierre Paridans
parent d2851b2039
commit ebce7719b6
97 changed files with 20298 additions and 15236 deletions
@@ -25,7 +25,7 @@ var AttendeeCalendarPopover = CalendarPopover.extend({
_.each(this.fields.attendee_status.selection, function (selection) {
self.statusInfo[selection[0]] = {text: selection[1], color: self.statusColors[selection[0]]};
});
this.selectedStatusInfo = this.statusInfo[this.event.record.attendee_status];
this.selectedStatusInfo = this.statusInfo[this.event.extendedProps.record.attendee_status];
}
},
@@ -37,7 +37,7 @@ var AttendeeCalendarPopover = CalendarPopover.extend({
* @return {boolean}
*/
isCurrentPartnerAttendee() {
return this.event.record.partner_ids.includes(session.partner_id);
return this.event.extendedProps.record.partner_ids.includes(session.partner_id);
},
/**
* @override
@@ -70,7 +70,7 @@ var AttendeeCalendarPopover = CalendarPopover.extend({
* @return {boolean}
*/
_isEventPrivate() {
return this.event.record.privacy === 'private';
return this.event.extendedProps.record.privacy === 'private';
},
//--------------------------------------------------------------------------
@@ -90,7 +90,7 @@ var AttendeeCalendarPopover = CalendarPopover.extend({
method: 'change_attendee_status',
args: [this.event.id, selectedStatus],
}).then(function () {
self.event.record.attendee_status = selectedStatus; // FIXEME: Maybe we have to reload view
self.event.extendedProps.record.attendee_status = selectedStatus; // FIXEME: Maybe we have to reload view
self.$('.o-calendar-attendee-status-text').text(self.statusInfo[selectedStatus].text);
self.$('.o-calendar-attendee-status-icon').removeClass(_.values(self.statusColors).join(' ')).addClass(self.statusInfo[selectedStatus].color);
});
@@ -1,4 +1,4 @@
Copyright (c) 2015 Adam Shaw
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
@@ -0,0 +1,36 @@
.fc.fc-bootstrap a {
text-decoration: none;
}
.fc.fc-bootstrap a[data-goto]:hover {
text-decoration: underline;
}
.fc-bootstrap hr.fc-divider {
border-color: inherit;
}
.fc-bootstrap .fc-today.alert {
border-radius: 0;
}
.fc-bootstrap a.fc-event:not([href]):not([tabindex]) {
color: #fff;
}
.fc-bootstrap .fc-popover.card {
position: absolute;
}
/* Popover
--------------------------------------------------------------------------------------------------*/
.fc-bootstrap .fc-popover .card-body {
padding: 0;
}
/* TimeGrid Slats (lines that run horizontally)
--------------------------------------------------------------------------------------------------*/
.fc-bootstrap .fc-time-grid .fc-slats table {
/* some themes have background color. see through to slats */
background: none;
}
@@ -0,0 +1,91 @@
/*!
FullCalendar Bootstrap Plugin v4.4.0
Docs & License: https://fullcalendar.io/
(c) 2019 Adam Shaw
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
(global = global || self, factory(global.FullCalendarBootstrap = {}, global.FullCalendar));
}(this, function (exports, core) { 'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* 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 BootstrapTheme = /** @class */ (function (_super) {
__extends(BootstrapTheme, _super);
function BootstrapTheme() {
return _super !== null && _super.apply(this, arguments) || this;
}
return BootstrapTheme;
}(core.Theme));
BootstrapTheme.prototype.classes = {
widget: 'fc-bootstrap',
tableGrid: 'table-bordered',
tableList: 'table',
tableListHeading: 'table-active',
buttonGroup: 'btn-group',
button: 'btn btn-primary',
buttonActive: 'active',
today: 'alert alert-info',
popover: 'card card-primary',
popoverHeader: 'card-header',
popoverContent: 'card-body',
// day grid
// for left/right border color when border is inset from edges (all-day in timeGrid view)
// avoid `table` class b/c don't want margins/padding/structure. only border color.
headerRow: 'table-bordered',
dayRow: 'table-bordered',
// list view
listView: 'card card-primary'
};
BootstrapTheme.prototype.baseIconClass = 'fa';
BootstrapTheme.prototype.iconClasses = {
close: 'fa-times',
prev: 'fa-chevron-left',
next: 'fa-chevron-right',
prevYear: 'fa-angle-double-left',
nextYear: 'fa-angle-double-right'
};
BootstrapTheme.prototype.iconOverrideOption = 'bootstrapFontAwesome';
BootstrapTheme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome';
BootstrapTheme.prototype.iconOverridePrefix = 'fa-';
var main = core.createPlugin({
themeClasses: {
bootstrap: BootstrapTheme
}
});
exports.BootstrapTheme = BootstrapTheme;
exports.default = main;
Object.defineProperty(exports, '__esModule', { value: true });
}));
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,31 @@
(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;
}));
@@ -0,0 +1,31 @@
(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;
}));
@@ -0,0 +1,31 @@
(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;
}));
@@ -0,0 +1,31 @@
(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;
}));
@@ -0,0 +1,31 @@
(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;
}));
@@ -0,0 +1,31 @@
(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;
}));
@@ -0,0 +1,31 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,31 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,33 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,17 @@
(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;
}));
@@ -0,0 +1,17 @@
(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;
}));
@@ -0,0 +1,17 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,33 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,27 @@
(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;
}));
@@ -0,0 +1,31 @@
(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;
}));
@@ -0,0 +1,31 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,27 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,28 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,26 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,28 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,28 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,33 @@
(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;
}));
@@ -0,0 +1,30 @@
(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;
}));
@@ -0,0 +1,20 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,24 @@
(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;
}));
@@ -0,0 +1,32 @@
(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;
}));
@@ -0,0 +1,33 @@
(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;
}));
@@ -0,0 +1,26 @@
(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;
}));
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,78 @@
/* DayGridView
--------------------------------------------------------------------------------------------------*/
/* day row structure */
.fc-dayGridWeek-view .fc-content-skeleton,
.fc-dayGridDay-view .fc-content-skeleton {
/* there may be week numbers in these views, so no padding-top */
padding-bottom: 1em;
/* ensure a space at bottom of cell for user selecting/clicking */
}
.fc-dayGrid-view .fc-body .fc-row {
min-height: 4em;
/* ensure that all rows are at least this tall */
}
/* a "rigid" row will take up a constant amount of height because content-skeleton is absolute */
.fc-row.fc-rigid {
overflow: hidden;
}
.fc-row.fc-rigid .fc-content-skeleton {
position: absolute;
top: 0;
left: 0;
right: 0;
}
/* week and day number styling */
.fc-day-top.fc-other-month {
opacity: 0.3;
}
.fc-dayGrid-view .fc-week-number,
.fc-dayGrid-view .fc-day-number {
padding: 2px;
}
.fc-dayGrid-view th.fc-week-number,
.fc-dayGrid-view th.fc-day-number {
padding: 0 2px;
/* column headers can't have as much v space */
}
.fc-ltr .fc-dayGrid-view .fc-day-top .fc-day-number {
float: right;
}
.fc-rtl .fc-dayGrid-view .fc-day-top .fc-day-number {
float: left;
}
.fc-ltr .fc-dayGrid-view .fc-day-top .fc-week-number {
float: left;
border-radius: 0 0 3px 0;
}
.fc-rtl .fc-dayGrid-view .fc-day-top .fc-week-number {
float: right;
border-radius: 0 0 0 3px;
}
.fc-dayGrid-view .fc-day-top .fc-week-number {
min-width: 1.5em;
text-align: center;
background-color: #f2f2f2;
color: #808080;
}
/* when week/day number have own column */
.fc-dayGrid-view td.fc-week-number {
text-align: center;
}
.fc-dayGrid-view td.fc-week-number > * {
/* work around the way we do column resizing and ensure a minimum width */
display: inline-block;
min-width: 1.25em;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,175 @@
/*!
FullCalendar Google Calendar Plugin v4.4.0
Docs & License: https://fullcalendar.io/
(c) 2019 Adam Shaw
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
(global = global || self, factory(global.FullCalendarGoogleCalendar = {}, global.FullCalendar));
}(this, function (exports, core) { 'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
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);
};
// TODO: expose somehow
var API_BASE = 'https://www.googleapis.com/calendar/v3/calendars';
var STANDARD_PROPS = {
url: String,
googleCalendarApiKey: String,
googleCalendarId: String,
googleCalendarApiBase: String,
data: null
};
var eventSourceDef = {
parseMeta: function (raw) {
if (typeof raw === 'string') {
raw = { url: raw };
}
if (typeof raw === 'object') {
var standardProps = core.refineProps(raw, STANDARD_PROPS);
if (!standardProps.googleCalendarId && standardProps.url) {
standardProps.googleCalendarId = parseGoogleCalendarId(standardProps.url);
}
delete standardProps.url;
if (standardProps.googleCalendarId) {
return standardProps;
}
}
return null;
},
fetch: function (arg, onSuccess, onFailure) {
var calendar = arg.calendar;
var meta = arg.eventSource.meta;
var apiKey = meta.googleCalendarApiKey || calendar.opt('googleCalendarApiKey');
if (!apiKey) {
onFailure({
message: 'Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/'
});
}
else {
var url = buildUrl(meta);
var requestParams_1 = buildRequestParams(arg.range, apiKey, meta.data, calendar.dateEnv);
core.requestJson('GET', url, requestParams_1, function (body, xhr) {
if (body.error) {
onFailure({
message: 'Google Calendar API: ' + body.error.message,
errors: body.error.errors,
xhr: xhr
});
}
else {
onSuccess({
rawEvents: gcalItemsToRawEventDefs(body.items, requestParams_1.timeZone),
xhr: xhr
});
}
}, function (message, xhr) {
onFailure({ message: message, xhr: xhr });
});
}
}
};
function parseGoogleCalendarId(url) {
var match;
// detect if the ID was specified as a single string.
// will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars.
if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) {
return url;
}
else if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) ||
(match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url))) {
return decodeURIComponent(match[1]);
}
}
function buildUrl(meta) {
var apiBase = meta.googleCalendarApiBase;
if (!apiBase) {
apiBase = API_BASE;
}
return apiBase + '/' + encodeURIComponent(meta.googleCalendarId) + '/events';
}
function buildRequestParams(range, apiKey, extraParams, dateEnv) {
var params;
var startStr;
var endStr;
if (dateEnv.canComputeOffset) {
// strings will naturally have offsets, which GCal needs
startStr = dateEnv.formatIso(range.start);
endStr = dateEnv.formatIso(range.end);
}
else {
// when timezone isn't known, we don't know what the UTC offset should be, so ask for +/- 1 day
// from the UTC day-start to guarantee we're getting all the events
// (start/end will be UTC-coerced dates, so toISOString is okay)
startStr = core.addDays(range.start, -1).toISOString();
endStr = core.addDays(range.end, 1).toISOString();
}
params = __assign({}, (extraParams || {}), { key: apiKey, timeMin: startStr, timeMax: endStr, singleEvents: true, maxResults: 9999 });
if (dateEnv.timeZone !== 'local') {
params.timeZone = dateEnv.timeZone;
}
return params;
}
function gcalItemsToRawEventDefs(items, gcalTimezone) {
return items.map(function (item) {
return gcalItemToRawEventDef(item, gcalTimezone);
});
}
function gcalItemToRawEventDef(item, gcalTimezone) {
var url = item.htmlLink || null;
// make the URLs for each event show times in the correct timezone
if (url && gcalTimezone) {
url = injectQsComponent(url, 'ctz=' + gcalTimezone);
}
return {
id: item.id,
title: item.summary,
start: item.start.dateTime || item.start.date,
end: item.end.dateTime || item.end.date,
url: url,
location: item.location,
description: item.description
};
}
// Injects a string like "arg=value" into the querystring of a URL
// TODO: move to a general util file?
function injectQsComponent(url, component) {
// inject it after the querystring but before the fragment
return url.replace(/(\?.*?)?(#|$)/, function (whole, qs, hash) {
return (qs ? qs + '&' : '?') + component + hash;
});
}
var main = core.createPlugin({
eventSourceDefs: [eventSourceDef]
});
exports.default = main;
Object.defineProperty(exports, '__esModule', { value: true });
}));
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,180 +0,0 @@
/*!
* FullCalendar v3.0.1 Google Calendar Plugin
* Docs & License: http://fullcalendar.io/
* (c) 2016 Adam Shaw
*/
(function(factory) {
if (typeof define === 'function' && define.amd) {
define([ 'jquery' ], factory);
}
else if (typeof exports === 'object') { // Node/CommonJS
module.exports = factory(require('jquery'));
}
else {
factory(jQuery);
}
})(function($) {
var API_BASE = 'https://www.googleapis.com/calendar/v3/calendars';
var FC = $.fullCalendar;
var applyAll = FC.applyAll;
FC.sourceNormalizers.push(function(sourceOptions) {
var googleCalendarId = sourceOptions.googleCalendarId;
var url = sourceOptions.url;
var match;
// if the Google Calendar ID hasn't been explicitly defined
if (!googleCalendarId && url) {
// detect if the ID was specified as a single string.
// will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars.
if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) {
googleCalendarId = url;
}
// try to scrape it out of a V1 or V3 API feed URL
else if (
(match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) ||
(match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url))
) {
googleCalendarId = decodeURIComponent(match[1]);
}
if (googleCalendarId) {
sourceOptions.googleCalendarId = googleCalendarId;
}
}
if (googleCalendarId) { // is this a Google Calendar?
// make each Google Calendar source uneditable by default
if (sourceOptions.editable == null) {
sourceOptions.editable = false;
}
// We want removeEventSource to work, but it won't know about the googleCalendarId primitive.
// Shoehorn it into the url, which will function as the unique primitive. Won't cause side effects.
// This hack is obsolete since 2.2.3, but keep it so this plugin file is compatible with old versions.
sourceOptions.url = googleCalendarId;
}
});
FC.sourceFetchers.push(function(sourceOptions, start, end, timezone) {
if (sourceOptions.googleCalendarId) {
return transformOptions(sourceOptions, start, end, timezone, this); // `this` is the calendar
}
});
function transformOptions(sourceOptions, start, end, timezone, calendar) {
var url = API_BASE + '/' + encodeURIComponent(sourceOptions.googleCalendarId) + '/events?callback=?'; // jsonp
var apiKey = sourceOptions.googleCalendarApiKey || calendar.options.googleCalendarApiKey;
var success = sourceOptions.success;
var data;
var timezoneArg; // populated when a specific timezone. escaped to Google's liking
function reportError(message, apiErrorObjs) {
var errorObjs = apiErrorObjs || [ { message: message } ]; // to be passed into error handlers
// call error handlers
(sourceOptions.googleCalendarError || $.noop).apply(calendar, errorObjs);
(calendar.options.googleCalendarError || $.noop).apply(calendar, errorObjs);
// print error to debug console
FC.warn.apply(null, [ message ].concat(apiErrorObjs || []));
}
if (!apiKey) {
reportError("Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/");
return {}; // an empty source to use instead. won't fetch anything.
}
// The API expects an ISO8601 datetime with a time and timezone part.
// Since the calendar's timezone offset isn't always known, request the date in UTC and pad it by a day on each
// side, guaranteeing we will receive all events in the desired range, albeit a superset.
// .utc() will set a zone and give it a 00:00:00 time.
if (!start.hasZone()) {
start = start.clone().utc().add(-1, 'day');
}
if (!end.hasZone()) {
end = end.clone().utc().add(1, 'day');
}
// when sending timezone names to Google, only accepts underscores, not spaces
if (timezone && timezone != 'local') {
timezoneArg = timezone.replace(' ', '_');
}
data = $.extend({}, sourceOptions.data || {}, {
key: apiKey,
timeMin: start.format(),
timeMax: end.format(),
timeZone: timezoneArg,
singleEvents: true,
maxResults: 9999
});
return $.extend({}, sourceOptions, {
googleCalendarId: null, // prevents source-normalizing from happening again
url: url,
data: data,
startParam: false, // `false` omits this parameter. we already included it above
endParam: false, // same
timezoneParam: false, // same
success: function(data) {
var events = [];
var successArgs;
var successRes;
if (data.error) {
reportError('Google Calendar API: ' + data.error.message, data.error.errors);
}
else if (data.items) {
$.each(data.items, function(i, entry) {
var url = entry.htmlLink || null;
// make the URLs for each event show times in the correct timezone
if (timezoneArg && url !== null) {
url = injectQsComponent(url, 'ctz=' + timezoneArg);
}
events.push({
id: entry.id,
title: entry.summary,
start: entry.start.dateTime || entry.start.date, // try timed. will fall back to all-day
end: entry.end.dateTime || entry.end.date, // same
url: url,
location: entry.location,
description: entry.description
});
});
// call the success handler(s) and allow it to return a new events array
successArgs = [ events ].concat(Array.prototype.slice.call(arguments, 1)); // forward other jq args
successRes = applyAll(success, this, successArgs);
if ($.isArray(successRes)) {
return successRes;
}
}
return events;
}
});
}
// Injects a string like "arg=value" into the querystring of a URL
function injectQsComponent(url, component) {
// inject it after the querystring but before the fragment
return url.replace(/(\?.*?)?(#|$)/, function(whole, qs, hash) {
return (qs ? qs + '&' : '?') + component + hash;
});
}
});
@@ -0,0 +1,118 @@
/* List View
--------------------------------------------------------------------------------------------------*/
/* possibly reusable */
.fc-event-dot {
display: inline-block;
width: 10px;
height: 10px;
border-radius: 5px;
}
/* view wrapper */
.fc-rtl .fc-list-view {
direction: rtl;
/* unlike core views, leverage browser RTL */
}
.fc-list-view {
border-width: 1px;
border-style: solid;
}
/* table resets */
.fc .fc-list-table {
table-layout: auto;
/* for shrinkwrapping cell content */
}
.fc-list-table td {
border-width: 1px 0 0;
padding: 8px 14px;
}
.fc-list-table tr:first-child td {
border-top-width: 0;
}
/* day headings with the list */
.fc-list-heading {
border-bottom-width: 1px;
}
.fc-list-heading td {
font-weight: bold;
}
.fc-ltr .fc-list-heading-main {
float: left;
}
.fc-ltr .fc-list-heading-alt {
float: right;
}
.fc-rtl .fc-list-heading-main {
float: right;
}
.fc-rtl .fc-list-heading-alt {
float: left;
}
/* event list items */
.fc-list-item.fc-has-url {
cursor: pointer;
/* whole row will be clickable */
}
.fc-list-item-marker,
.fc-list-item-time {
white-space: nowrap;
width: 1px;
}
/* make the dot closer to the event title */
.fc-ltr .fc-list-item-marker {
padding-right: 0;
}
.fc-rtl .fc-list-item-marker {
padding-left: 0;
}
.fc-list-item-title a {
/* every event title cell has an <a> tag */
text-decoration: none;
color: inherit;
}
.fc-list-item-title a[href]:hover {
/* hover effect only on titles with hrefs */
text-decoration: underline;
}
/* message when no events */
.fc-list-empty-wrap2 {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.fc-list-empty-wrap1 {
width: 100%;
height: 100%;
display: table;
}
.fc-list-empty {
display: table-cell;
vertical-align: middle;
text-align: center;
}
.fc-unthemed .fc-list-empty {
/* theme will provide own background */
background-color: #eee;
}
@@ -0,0 +1,356 @@
/*!
FullCalendar List View Plugin v4.4.0
Docs & License: https://fullcalendar.io/
(c) 2019 Adam Shaw
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
(global = global || self, factory(global.FullCalendarList = {}, global.FullCalendar));
}(this, function (exports, core) { 'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* 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 ListEventRenderer = /** @class */ (function (_super) {
__extends(ListEventRenderer, _super);
function ListEventRenderer(listView) {
var _this = _super.call(this) || this;
_this.listView = listView;
return _this;
}
ListEventRenderer.prototype.attachSegs = function (segs) {
if (!segs.length) {
this.listView.renderEmptyMessage();
}
else {
this.listView.renderSegList(segs);
}
};
ListEventRenderer.prototype.detachSegs = function () {
};
// generates the HTML for a single event row
ListEventRenderer.prototype.renderSegHtml = function (seg) {
var _a = this.context, theme = _a.theme, options = _a.options;
var eventRange = seg.eventRange;
var eventDef = eventRange.def;
var eventInstance = eventRange.instance;
var eventUi = eventRange.ui;
var url = eventDef.url;
var classes = ['fc-list-item'].concat(eventUi.classNames);
var bgColor = eventUi.backgroundColor;
var timeHtml;
if (eventDef.allDay) {
timeHtml = core.getAllDayHtml(options);
}
else if (core.isMultiDayRange(eventRange.range)) {
if (seg.isStart) {
timeHtml = core.htmlEscape(this._getTimeText(eventInstance.range.start, seg.end, false // allDay
));
}
else if (seg.isEnd) {
timeHtml = core.htmlEscape(this._getTimeText(seg.start, eventInstance.range.end, false // allDay
));
}
else { // inner segment that lasts the whole day
timeHtml = core.getAllDayHtml(options);
}
}
else {
// Display the normal time text for the *event's* times
timeHtml = core.htmlEscape(this.getTimeText(eventRange));
}
if (url) {
classes.push('fc-has-url');
}
return '<tr class="' + classes.join(' ') + '">' +
(this.displayEventTime ?
'<td class="fc-list-item-time ' + theme.getClass('widgetContent') + '">' +
(timeHtml || '') +
'</td>' :
'') +
'<td class="fc-list-item-marker ' + theme.getClass('widgetContent') + '">' +
'<span class="fc-event-dot"' +
(bgColor ?
' style="background-color:' + bgColor + '"' :
'') +
'></span>' +
'</td>' +
'<td class="fc-list-item-title ' + theme.getClass('widgetContent') + '">' +
'<a' + (url ? ' href="' + core.htmlEscape(url) + '"' : '') + '>' +
core.htmlEscape(eventDef.title || '') +
'</a>' +
'</td>' +
'</tr>';
};
// like "4:00am"
ListEventRenderer.prototype.computeEventTimeFormat = function () {
return {
hour: 'numeric',
minute: '2-digit',
meridiem: 'short'
};
};
return ListEventRenderer;
}(core.FgEventRenderer));
/*
Responsible for the scroller, and forwarding event-related actions into the "grid".
*/
var ListView = /** @class */ (function (_super) {
__extends(ListView, _super);
function ListView(viewSpec, parentEl) {
var _this = _super.call(this, viewSpec, parentEl) || this;
_this.computeDateVars = core.memoize(computeDateVars);
_this.eventStoreToSegs = core.memoize(_this._eventStoreToSegs);
_this.renderSkeleton = core.memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
var eventRenderer = _this.eventRenderer = new ListEventRenderer(_this);
_this.renderContent = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [_this.renderSkeleton]);
return _this;
}
ListView.prototype.firstContext = function (context) {
context.calendar.registerInteractiveComponent(this, {
el: this.el
// TODO: make aware that it doesn't do Hits
});
};
ListView.prototype.render = function (props, context) {
_super.prototype.render.call(this, props, context);
var _a = this.computeDateVars(props.dateProfile), dayDates = _a.dayDates, dayRanges = _a.dayRanges;
this.dayDates = dayDates;
this.renderSkeleton(context);
this.renderContent(context, this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges));
};
ListView.prototype.destroy = function () {
_super.prototype.destroy.call(this);
this.renderSkeleton.unrender();
this.renderContent.unrender();
this.context.calendar.unregisterInteractiveComponent(this);
};
ListView.prototype._renderSkeleton = function (context) {
var theme = context.theme;
this.el.classList.add('fc-list-view');
var listViewClassNames = (theme.getClass('listView') || '').split(' '); // wish we didn't have to do this
for (var _i = 0, listViewClassNames_1 = listViewClassNames; _i < listViewClassNames_1.length; _i++) {
var listViewClassName = listViewClassNames_1[_i];
if (listViewClassName) { // in case input was empty string
this.el.classList.add(listViewClassName);
}
}
this.scroller = new core.ScrollComponent('hidden', // overflow x
'auto' // overflow y
);
this.el.appendChild(this.scroller.el);
this.contentEl = this.scroller.el; // shortcut
};
ListView.prototype._unrenderSkeleton = function () {
// TODO: remove classNames
this.scroller.destroy(); // will remove the Grid too
};
ListView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
_super.prototype.updateSize.call(this, isResize, viewHeight, isAuto);
this.eventRenderer.computeSizes(isResize);
this.eventRenderer.assignSizes(isResize);
this.scroller.clear(); // sets height to 'auto' and clears overflow
if (!isAuto) {
this.scroller.setHeight(this.computeScrollerHeight(viewHeight));
}
};
ListView.prototype.computeScrollerHeight = function (viewHeight) {
return viewHeight -
core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
};
ListView.prototype._eventStoreToSegs = function (eventStore, eventUiBases, dayRanges) {
return this.eventRangesToSegs(core.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.nextDayThreshold).fg, dayRanges);
};
ListView.prototype.eventRangesToSegs = function (eventRanges, dayRanges) {
var segs = [];
for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
var eventRange = eventRanges_1[_i];
segs.push.apply(segs, this.eventRangeToSegs(eventRange, dayRanges));
}
return segs;
};
ListView.prototype.eventRangeToSegs = function (eventRange, dayRanges) {
var _a = this.context, dateEnv = _a.dateEnv, nextDayThreshold = _a.nextDayThreshold;
var range = eventRange.range;
var allDay = eventRange.def.allDay;
var dayIndex;
var segRange;
var seg;
var segs = [];
for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) {
segRange = core.intersectRanges(range, dayRanges[dayIndex]);
if (segRange) {
seg = {
component: this,
eventRange: eventRange,
start: segRange.start,
end: segRange.end,
isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(),
isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(),
dayIndex: dayIndex
};
segs.push(seg);
// detect when range won't go fully into the next day,
// and mutate the latest seg to the be the end.
if (!seg.isEnd && !allDay &&
dayIndex + 1 < dayRanges.length &&
range.end <
dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) {
seg.end = range.end;
seg.isEnd = true;
break;
}
}
}
return segs;
};
ListView.prototype.renderEmptyMessage = function () {
this.contentEl.innerHTML =
'<div class="fc-list-empty-wrap2">' + // TODO: try less wraps
'<div class="fc-list-empty-wrap1">' +
'<div class="fc-list-empty">' +
core.htmlEscape(this.context.options.noEventsMessage) +
'</div>' +
'</div>' +
'</div>';
};
// called by ListEventRenderer
ListView.prototype.renderSegList = function (allSegs) {
var theme = this.context.theme;
var segsByDay = this.groupSegsByDay(allSegs); // sparse array
var dayIndex;
var daySegs;
var i;
var tableEl = core.htmlToElement('<table class="fc-list-table ' + theme.getClass('tableList') + '"><tbody></tbody></table>');
var tbodyEl = tableEl.querySelector('tbody');
for (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) {
daySegs = segsByDay[dayIndex];
if (daySegs) { // sparse array, so might be undefined
// append a day header
tbodyEl.appendChild(this.buildDayHeaderRow(this.dayDates[dayIndex]));
daySegs = this.eventRenderer.sortEventSegs(daySegs);
for (i = 0; i < daySegs.length; i++) {
tbodyEl.appendChild(daySegs[i].el); // append event row
}
}
}
this.contentEl.innerHTML = '';
this.contentEl.appendChild(tableEl);
};
// Returns a sparse array of arrays, segs grouped by their dayIndex
ListView.prototype.groupSegsByDay = function (segs) {
var segsByDay = []; // sparse array
var i;
var seg;
for (i = 0; i < segs.length; i++) {
seg = segs[i];
(segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
.push(seg);
}
return segsByDay;
};
// generates the HTML for the day headers that live amongst the event rows
ListView.prototype.buildDayHeaderRow = function (dayDate) {
var _a = this.context, theme = _a.theme, dateEnv = _a.dateEnv, options = _a.options;
var mainFormat = core.createFormatter(options.listDayFormat); // TODO: cache
var altFormat = core.createFormatter(options.listDayAltFormat); // TODO: cache
return core.createElement('tr', {
className: 'fc-list-heading',
'data-date': dateEnv.formatIso(dayDate, { omitTime: true })
}, '<td class="' + (theme.getClass('tableListHeading') ||
theme.getClass('widgetHeader')) + '" colspan="3">' +
(mainFormat ?
core.buildGotoAnchorHtml(options, dateEnv, dayDate, { 'class': 'fc-list-heading-main' }, core.htmlEscape(dateEnv.format(dayDate, mainFormat)) // inner HTML
) :
'') +
(altFormat ?
core.buildGotoAnchorHtml(options, dateEnv, dayDate, { 'class': 'fc-list-heading-alt' }, core.htmlEscape(dateEnv.format(dayDate, altFormat)) // inner HTML
) :
'') +
'</td>');
};
return ListView;
}(core.View));
ListView.prototype.fgSegSelector = '.fc-list-item'; // which elements accept event actions
function computeDateVars(dateProfile) {
var dayStart = core.startOfDay(dateProfile.renderRange.start);
var viewEnd = dateProfile.renderRange.end;
var dayDates = [];
var dayRanges = [];
while (dayStart < viewEnd) {
dayDates.push(dayStart);
dayRanges.push({
start: dayStart,
end: core.addDays(dayStart, 1)
});
dayStart = core.addDays(dayStart, 1);
}
return { dayDates: dayDates, dayRanges: dayRanges };
}
var main = core.createPlugin({
views: {
list: {
class: ListView,
buttonTextKey: 'list',
listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' } // like "January 1, 2016"
},
listDay: {
type: 'list',
duration: { days: 1 },
listDayFormat: { weekday: 'long' } // day-of-week is all we need. full date is probably in header
},
listWeek: {
type: 'list',
duration: { weeks: 1 },
listDayFormat: { weekday: 'long' },
listDayAltFormat: { month: 'long', day: 'numeric', year: 'numeric' }
},
listMonth: {
type: 'list',
duration: { month: 1 },
listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have
},
listYear: {
type: 'list',
duration: { year: 1 },
listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have
}
}
});
exports.ListView = ListView;
exports.default = main;
Object.defineProperty(exports, '__esModule', { value: true });
}));
@@ -0,0 +1,170 @@
/*!
FullCalendar Luxon Plugin v4.4.0
Docs & License: https://fullcalendar.io/
(c) 2019 Adam Shaw
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('luxon'), require('@fullcalendar/core')) :
typeof define === 'function' && define.amd ? define(['exports', 'luxon', '@fullcalendar/core'], factory) :
(global = global || self, factory(global.FullCalendarLuxon = {}, global.luxon, global.FullCalendar));
}(this, function (exports, luxon, core) { 'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* 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 toDateTime(date, calendar) {
if (!(calendar instanceof core.Calendar)) {
throw new Error('must supply a Calendar instance');
}
return luxon.DateTime.fromJSDate(date, {
zone: calendar.dateEnv.timeZone,
locale: calendar.dateEnv.locale.codes[0]
});
}
function toDuration(duration, calendar) {
if (!(calendar instanceof core.Calendar)) {
throw new Error('must supply a Calendar instance');
}
return luxon.Duration.fromObject(__assign({}, duration, { locale: calendar.dateEnv.locale.codes[0] }));
}
var LuxonNamedTimeZone = /** @class */ (function (_super) {
__extends(LuxonNamedTimeZone, _super);
function LuxonNamedTimeZone() {
return _super !== null && _super.apply(this, arguments) || this;
}
LuxonNamedTimeZone.prototype.offsetForArray = function (a) {
return arrayToLuxon(a, this.timeZoneName).offset;
};
LuxonNamedTimeZone.prototype.timestampToArray = function (ms) {
return luxonToArray(luxon.DateTime.fromMillis(ms, {
zone: this.timeZoneName
}));
};
return LuxonNamedTimeZone;
}(core.NamedTimeZoneImpl));
function formatWithCmdStr(cmdStr, arg) {
var cmd = parseCmdStr(cmdStr);
if (arg.end) {
var start = arrayToLuxon(arg.start.array, arg.timeZone, arg.localeCodes[0]);
var end = arrayToLuxon(arg.end.array, arg.timeZone, arg.localeCodes[0]);
return formatRange(cmd, start.toFormat.bind(start), end.toFormat.bind(end), arg.separator);
}
return arrayToLuxon(arg.date.array, arg.timeZone, arg.localeCodes[0]).toFormat(cmd.whole);
}
var main = core.createPlugin({
cmdFormatter: formatWithCmdStr,
namedTimeZonedImpl: LuxonNamedTimeZone
});
function luxonToArray(datetime) {
return [
datetime.year,
datetime.month - 1,
datetime.day,
datetime.hour,
datetime.minute,
datetime.second,
datetime.millisecond
];
}
function arrayToLuxon(arr, timeZone, locale) {
return luxon.DateTime.fromObject({
zone: timeZone,
locale: locale,
year: arr[0],
month: arr[1] + 1,
day: arr[2],
hour: arr[3],
minute: arr[4],
second: arr[5],
millisecond: arr[6]
});
}
function parseCmdStr(cmdStr) {
var parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
if (parts) {
var middle = parseCmdStr(parts[2]);
return {
head: parts[1],
middle: middle,
tail: parts[3],
whole: parts[1] + middle.whole + parts[3]
};
}
else {
return {
head: null,
middle: null,
tail: null,
whole: cmdStr
};
}
}
function formatRange(cmd, formatStart, formatEnd, separator) {
if (cmd.middle) {
var startHead = formatStart(cmd.head);
var startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
var startTail = formatStart(cmd.tail);
var endHead = formatEnd(cmd.head);
var endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
var endTail = formatEnd(cmd.tail);
if (startHead === endHead && startTail === endTail) {
return startHead +
(startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
startTail;
}
}
var startWhole = formatStart(cmd.whole);
var endWhole = formatEnd(cmd.whole);
if (startWhole === endWhole) {
return startWhole;
}
else {
return startWhole + separator + endWhole;
}
}
exports.default = main;
exports.toDateTime = toDateTime;
exports.toDuration = toDuration;
Object.defineProperty(exports, '__esModule', { value: true });
}));
@@ -0,0 +1,64 @@
/*!
FullCalendar Moment Timezone Plugin v4.4.0
Docs & License: https://fullcalendar.io/
(c) 2019 Adam Shaw
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('moment'), require('moment-timezone/builds/moment-timezone-with-data'), require('@fullcalendar/core')) :
typeof define === 'function' && define.amd ? define(['exports', 'moment', 'moment-timezone/builds/moment-timezone-with-data', '@fullcalendar/core'], factory) :
(global = global || self, factory(global.FullCalendarMomentTimezone = {}, global.moment, global.moment, global.FullCalendar));
}(this, function (exports, momentNs, momentTimezoneWithData, core) { 'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* 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 moment = momentNs; // the directly callable function
var MomentNamedTimeZone = /** @class */ (function (_super) {
__extends(MomentNamedTimeZone, _super);
function MomentNamedTimeZone() {
return _super !== null && _super.apply(this, arguments) || this;
}
MomentNamedTimeZone.prototype.offsetForArray = function (a) {
return moment.tz(a, this.timeZoneName).utcOffset();
};
MomentNamedTimeZone.prototype.timestampToArray = function (ms) {
return moment.tz(ms, this.timeZoneName).toArray();
};
return MomentNamedTimeZone;
}(core.NamedTimeZoneImpl));
var main = core.createPlugin({
namedTimeZonedImpl: MomentNamedTimeZone
});
exports.default = main;
Object.defineProperty(exports, '__esModule', { value: true });
}));
@@ -0,0 +1,110 @@
/*!
FullCalendar Moment Plugin v4.4.0
Docs & License: https://fullcalendar.io/
(c) 2019 Adam Shaw
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('moment'), require('@fullcalendar/core')) :
typeof define === 'function' && define.amd ? define(['exports', 'moment', '@fullcalendar/core'], factory) :
(global = global || self, factory(global.FullCalendarMoment = {}, global.moment, global.FullCalendar));
}(this, function (exports, momentNs, core) { 'use strict';
var moment = momentNs; // the directly callable function
function toMoment(date, calendar) {
if (!(calendar instanceof core.Calendar)) {
throw new Error('must supply a Calendar instance');
}
return convertToMoment(date, calendar.dateEnv.timeZone, null, calendar.dateEnv.locale.codes[0]);
}
function toDuration(fcDuration) {
return moment.duration(fcDuration); // moment accepts all the props that fc.Duration already has!
}
function formatWithCmdStr(cmdStr, arg) {
var cmd = parseCmdStr(cmdStr);
if (arg.end) {
var startMom = convertToMoment(arg.start.array, arg.timeZone, arg.start.timeZoneOffset, arg.localeCodes[0]);
var endMom = convertToMoment(arg.end.array, arg.timeZone, arg.end.timeZoneOffset, arg.localeCodes[0]);
return formatRange(cmd, createMomentFormatFunc(startMom), createMomentFormatFunc(endMom), arg.separator);
}
return convertToMoment(arg.date.array, arg.timeZone, arg.date.timeZoneOffset, arg.localeCodes[0]).format(cmd.whole); // TODO: test for this
}
var main = core.createPlugin({
cmdFormatter: formatWithCmdStr
});
function createMomentFormatFunc(mom) {
return function (cmdStr) {
return cmdStr ? mom.format(cmdStr) : ''; // because calling with blank string results in ISO8601 :(
};
}
function convertToMoment(input, timeZone, timeZoneOffset, locale) {
var mom;
if (timeZone === 'local') {
mom = moment(input);
}
else if (timeZone === 'UTC') {
mom = moment.utc(input);
}
else if (moment.tz) {
mom = moment.tz(input, timeZone);
}
else {
mom = moment.utc(input);
if (timeZoneOffset != null) {
mom.utcOffset(timeZoneOffset);
}
}
mom.locale(locale);
return mom;
}
function parseCmdStr(cmdStr) {
var parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
if (parts) {
var middle = parseCmdStr(parts[2]);
return {
head: parts[1],
middle: middle,
tail: parts[3],
whole: parts[1] + middle.whole + parts[3]
};
}
else {
return {
head: null,
middle: null,
tail: null,
whole: cmdStr
};
}
}
function formatRange(cmd, formatStart, formatEnd, separator) {
if (cmd.middle) {
var startHead = formatStart(cmd.head);
var startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
var startTail = formatStart(cmd.tail);
var endHead = formatEnd(cmd.head);
var endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
var endTail = formatEnd(cmd.tail);
if (startHead === endHead && startTail === endTail) {
return startHead +
(startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
startTail;
}
}
var startWhole = formatStart(cmd.whole);
var endWhole = formatEnd(cmd.whole);
if (startWhole === endWhole) {
return startWhole;
}
else {
return startWhole + separator + endWhole;
}
}
exports.default = main;
exports.toDuration = toDuration;
exports.toMoment = toMoment;
Object.defineProperty(exports, '__esModule', { value: true });
}));
@@ -0,0 +1,128 @@
/*!
FullCalendar RRule Plugin v4.4.0
Docs & License: https://fullcalendar.io/
(c) 2019 Adam Shaw
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rrule'), require('@fullcalendar/core')) :
typeof define === 'function' && define.amd ? define(['exports', 'rrule', '@fullcalendar/core'], factory) :
(global = global || self, factory(global.FullCalendarRrule = {}, global.rrule, global.FullCalendar));
}(this, function (exports, rrule, core) { 'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
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);
};
var EVENT_DEF_PROPS = {
rrule: null,
duration: core.createDuration
};
var recurring = {
parse: function (rawEvent, leftoverProps, dateEnv) {
if (rawEvent.rrule != null) {
var props = core.refineProps(rawEvent, EVENT_DEF_PROPS, {}, leftoverProps);
var parsed = parseRRule(props.rrule, dateEnv);
if (parsed) {
return {
typeData: parsed.rrule,
allDayGuess: parsed.allDayGuess,
duration: props.duration
};
}
}
return null;
},
expand: function (rrule, framingRange) {
// we WANT an inclusive start and in exclusive end, but the js rrule lib will only do either BOTH
// inclusive or BOTH exclusive, which is stupid: https://github.com/jakubroztocil/rrule/issues/84
// Workaround: make inclusive, which will generate extra occurences, and then trim.
return rrule.between(framingRange.start, framingRange.end, true)
.filter(function (date) {
return date.valueOf() < framingRange.end.valueOf();
});
}
};
var main = core.createPlugin({
recurringTypes: [recurring]
});
function parseRRule(input, dateEnv) {
var allDayGuess = null;
var rrule$1;
if (typeof input === 'string') {
rrule$1 = rrule.rrulestr(input);
}
else if (typeof input === 'object' && input) { // non-null object
var refined = __assign({}, input); // copy
if (typeof refined.dtstart === 'string') {
var dtstartMeta = dateEnv.createMarkerMeta(refined.dtstart);
if (dtstartMeta) {
refined.dtstart = dtstartMeta.marker;
allDayGuess = dtstartMeta.isTimeUnspecified;
}
else {
delete refined.dtstart;
}
}
if (typeof refined.until === 'string') {
refined.until = dateEnv.createMarker(refined.until);
}
if (refined.freq != null) {
refined.freq = convertConstant(refined.freq);
}
if (refined.wkst != null) {
refined.wkst = convertConstant(refined.wkst);
}
else {
refined.wkst = (dateEnv.weekDow - 1 + 7) % 7; // convert Sunday-first to Monday-first
}
if (refined.byweekday != null) {
refined.byweekday = convertConstants(refined.byweekday); // the plural version
}
rrule$1 = new rrule.RRule(refined);
}
if (rrule$1) {
return { rrule: rrule$1, allDayGuess: allDayGuess };
}
return null;
}
function convertConstants(input) {
if (Array.isArray(input)) {
return input.map(convertConstant);
}
return convertConstant(input);
}
function convertConstant(input) {
if (typeof input === 'string') {
return rrule.RRule[input.toUpperCase()];
}
return input;
}
exports.default = main;
Object.defineProperty(exports, '__esModule', { value: true });
}));
@@ -0,0 +1,309 @@
@charset "UTF-8";
/* TimeGridView all-day area
--------------------------------------------------------------------------------------------------*/
.fc-timeGrid-view .fc-day-grid {
position: relative;
z-index: 2;
/* so the "more.." popover will be over the time grid */
}
.fc-timeGrid-view .fc-day-grid .fc-row {
min-height: 3em;
/* all-day section will never get shorter than this */
}
.fc-timeGrid-view .fc-day-grid .fc-row .fc-content-skeleton {
padding-bottom: 1em;
/* give space underneath events for clicking/selecting days */
}
/* TimeGrid axis running down the side (for both the all-day area and the slot area)
--------------------------------------------------------------------------------------------------*/
.fc .fc-axis {
/* .fc to overcome default cell styles */
vertical-align: middle;
padding: 0 4px;
white-space: nowrap;
}
.fc-ltr .fc-axis {
text-align: right;
}
.fc-rtl .fc-axis {
text-align: left;
}
/* TimeGrid Structure
--------------------------------------------------------------------------------------------------*/
.fc-time-grid-container,
.fc-time-grid {
/* so slats/bg/content/etc positions get scoped within here */
position: relative;
z-index: 1;
}
.fc-time-grid {
min-height: 100%;
/* so if height setting is 'auto', .fc-bg stretches to fill height */
}
.fc-time-grid table {
/* don't put outer borders on slats/bg/content/etc */
border: 0 hidden transparent;
}
.fc-time-grid > .fc-bg {
z-index: 1;
}
.fc-time-grid .fc-slats,
.fc-time-grid > hr {
/* the <hr> TimeGridView injects when grid is shorter than scroller */
position: relative;
z-index: 2;
}
.fc-time-grid .fc-content-col {
position: relative;
/* because now-indicator lives directly inside */
}
.fc-time-grid .fc-content-skeleton {
position: absolute;
z-index: 3;
top: 0;
left: 0;
right: 0;
}
/* divs within a cell within the fc-content-skeleton */
.fc-time-grid .fc-business-container {
position: relative;
z-index: 1;
}
.fc-time-grid .fc-bgevent-container {
position: relative;
z-index: 2;
}
.fc-time-grid .fc-highlight-container {
position: relative;
z-index: 3;
}
.fc-time-grid .fc-event-container {
position: relative;
z-index: 4;
}
.fc-time-grid .fc-now-indicator-line {
z-index: 5;
}
.fc-time-grid .fc-mirror-container {
/* also is fc-event-container */
position: relative;
z-index: 6;
}
/* TimeGrid Slats (lines that run horizontally)
--------------------------------------------------------------------------------------------------*/
.fc-time-grid .fc-slats td {
height: 1.5em;
border-bottom: 0;
/* each cell is responsible for its top border */
}
.fc-time-grid .fc-slats .fc-minor td {
border-top-style: dotted;
}
/* TimeGrid Highlighting Slots
--------------------------------------------------------------------------------------------------*/
.fc-time-grid .fc-highlight-container {
/* a div within a cell within the fc-highlight-skeleton */
position: relative;
/* scopes the left/right of the fc-highlight to be in the column */
}
.fc-time-grid .fc-highlight {
position: absolute;
left: 0;
right: 0;
/* top and bottom will be in by JS */
}
/* TimeGrid Event Containment
--------------------------------------------------------------------------------------------------*/
.fc-ltr .fc-time-grid .fc-event-container {
/* space on the sides of events for LTR (default) */
margin: 0 2.5% 0 2px;
}
.fc-rtl .fc-time-grid .fc-event-container {
/* space on the sides of events for RTL */
margin: 0 2px 0 2.5%;
}
.fc-time-grid .fc-event,
.fc-time-grid .fc-bgevent {
position: absolute;
z-index: 1;
/* scope inner z-index's */
}
.fc-time-grid .fc-bgevent {
/* background events always span full width */
left: 0;
right: 0;
}
/* TimeGrid Event Styling
----------------------------------------------------------------------------------------------------
We use the full "fc-time-grid-event" class instead of using descendants because the event won't
be a descendant of the grid when it is being dragged.
*/
.fc-time-grid-event {
margin-bottom: 1px;
}
.fc-time-grid-event-inset {
-webkit-box-shadow: 0px 0px 0px 1px #fff;
box-shadow: 0px 0px 0px 1px #fff;
}
.fc-time-grid-event.fc-not-start {
/* events that are continuing from another day */
/* replace space made by the top border with padding */
border-top-width: 0;
padding-top: 1px;
/* remove top rounded corners */
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.fc-time-grid-event.fc-not-end {
/* replace space made by the top border with padding */
border-bottom-width: 0;
padding-bottom: 1px;
/* remove bottom rounded corners */
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.fc-time-grid-event .fc-content {
overflow: hidden;
max-height: 100%;
}
.fc-time-grid-event .fc-time,
.fc-time-grid-event .fc-title {
padding: 0 1px;
}
.fc-time-grid-event .fc-time {
font-size: 0.85em;
white-space: nowrap;
}
/* short mode, where time and title are on the same line */
.fc-time-grid-event.fc-short .fc-content {
/* don't wrap to second line (now that contents will be inline) */
white-space: nowrap;
}
.fc-time-grid-event.fc-short .fc-time,
.fc-time-grid-event.fc-short .fc-title {
/* put the time and title on the same line */
display: inline-block;
vertical-align: top;
}
.fc-time-grid-event.fc-short .fc-time span {
display: none;
/* don't display the full time text... */
}
.fc-time-grid-event.fc-short .fc-time:before {
content: attr(data-start);
/* ...instead, display only the start time */
}
.fc-time-grid-event.fc-short .fc-time:after {
content: " - ";
/* seperate with a dash, wrapped in nbsp's */
}
.fc-time-grid-event.fc-short .fc-title {
font-size: 0.85em;
/* make the title text the same size as the time */
padding: 0;
/* undo padding from above */
}
/* resizer (cursor device) */
.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer {
left: 0;
right: 0;
bottom: 0;
height: 8px;
overflow: hidden;
line-height: 8px;
font-size: 11px;
font-family: monospace;
text-align: center;
cursor: s-resize;
}
.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after {
content: "=";
}
/* resizer (touch device) */
.fc-time-grid-event.fc-selected .fc-resizer {
/* 10x10 dot */
border-radius: 5px;
border-width: 1px;
width: 8px;
height: 8px;
border-style: solid;
border-color: inherit;
background: #fff;
/* horizontally center */
left: 50%;
margin-left: -5px;
/* center on the bottom edge */
bottom: -5px;
}
/* Now Indicator
--------------------------------------------------------------------------------------------------*/
.fc-time-grid .fc-now-indicator-line {
border-top-width: 1px;
left: 0;
right: 0;
}
/* arrow on axis */
.fc-time-grid .fc-now-indicator-arrow {
margin-top: -5px;
/* vertically center on top coordinate */
}
.fc-ltr .fc-time-grid .fc-now-indicator-arrow {
left: 0;
/* triangle pointing right... */
border-width: 5px 0 5px 6px;
border-top-color: transparent;
border-bottom-color: transparent;
}
.fc-rtl .fc-time-grid .fc-now-indicator-arrow {
right: 0;
/* triangle pointing left... */
border-width: 5px 6px 5px 0;
border-top-color: transparent;
border-bottom-color: transparent;
}
File diff suppressed because it is too large Load Diff
@@ -356,7 +356,7 @@ return AbstractModel.extend({
return this._rpc({
model: this.modelName,
method: 'write',
args: [[record.id], data],
args: [[parseInt(record.id, 10)], data],
context: context
});
},
@@ -419,11 +419,22 @@ return AbstractModel.extend({
* @returns {Object}
*/
_getFullCalendarOptions: function () {
var format12Hour = {
hour: 'numeric',
minute: '2-digit',
omitZeroMinute: true,
meridiem: 'short'
};
var format24Hour = {
hour: 'numeric',
minute: '2-digit',
hour12: false,
};
return {
defaultView: (this.mode === "month")? "month" : ((this.mode === "week")? "agendaWeek" : ((this.mode === "day")? "agendaDay" : "agendaWeek")),
defaultView: (this.mode === "month")? "dayGridMonth" : ((this.mode === "week")? "timeGridWeek" : ((this.mode === "day")? "timeGridDay" : "timeGridWeek")),
header: false,
selectable: this.creatable && this.create_right,
selectHelper: true,
selectMirror: true,
editable: this.editable,
droppable: true,
navLinks: false,
@@ -434,14 +445,18 @@ return AbstractModel.extend({
nowIndicator: true,
weekNumbers: true,
weekNumbersWithinDays: true,
weekNumberTitle: _t("Week") + " ",
weekNumberCalculation: function (date) {
// Since FullCalendar v4 ISO 8601 week date is preferred so we force the old system
return moment(date).week();
},
weekLabel: _t("Week"),
allDayText: _t("All day"),
monthNames: moment.months(),
monthNamesShort: moment.monthsShort(),
dayNames: moment.weekdays(),
dayNamesShort: moment.weekdaysShort(),
firstDay: this.week_start,
slotLabelFormat: _t.database.parameters.time_format.search("%H") != -1 ? 'H:mm': 'h(:mm)a',
slotLabelFormat: _t.database.parameters.time_format.search("%H") !== -1 ? format24Hour : format12Hour,
};
},
/**
@@ -733,10 +748,10 @@ return AbstractModel.extend({
}
var r = {
'record': evt,
'start': date_start,
'end': date_stop,
'r_start': date_start.clone(),
'r_end': date_stop.clone(),
'start': date_start.local(true).toDate(),
'end': date_stop.local(true).toDate(),
'r_start': date_start.clone().local(true).toDate(),
'r_end': date_stop.clone().local(true).toDate(),
'title': the_title,
'allDay': all_day,
'id': evt.id,
@@ -754,8 +769,8 @@ return AbstractModel.extend({
// allow to resize in month mode
r.reset_allday = r.allDay;
r.allDay = true;
r.start = date_start.format('YYYY-MM-DD');
r.end = date_stop.startOf('day').format('YYYY-MM-DD');
r.start = date_start.toDate();
r.end = date_stop.startOf('day').toDate();
r.showTime = true;
}
@@ -112,7 +112,7 @@ var CalendarPopover = Widget.extend(WidgetAdapterMixin, StandaloneFieldManagerMi
var field = {
name: fieldName,
string: displayFieldInfo.attrs.string || fieldInfo.string,
value: self.event.record[fieldName],
value: self.event.extendedProps.record[fieldName],
type: fieldInfo.type,
};
if (field.type === 'selection') {
@@ -199,7 +199,7 @@ var CalendarPopover = Widget.extend(WidgetAdapterMixin, StandaloneFieldManagerMi
ev.preventDefault();
this.trigger_up('edit_event', {
id: this.event.id,
title: this.event.record.display_name,
title: this.event.extendedProps.record.display_name,
});
},
/**
@@ -16,9 +16,9 @@ var _t = core._t;
var qweb = core.qweb;
var scales = {
day: 'agendaDay',
week: 'agendaWeek',
month: 'month'
day: 'timeGridDay',
week: 'timeGridWeek',
month: 'dayGridMonth'
};
var SidebarFilterM2O = relational_fields.FieldMany2One.extend({
@@ -78,6 +78,7 @@ var SidebarFilter = Widget.extend(FieldManagerMixin, {
{
mode: 'edit',
attrs: {
string: _t(self.fields[self.fieldName].string),
placeholder: "+ " + _.str.sprintf(_t("Add %s"), self.title),
can_create: false
},
@@ -192,6 +193,7 @@ return AbstractRenderer.extend({
this.hideDate = params.hideDate;
this.hideTime = params.hideTime;
this.canDelete = params.canDelete;
this._isInDOM = false;
},
/**
* @override
@@ -209,22 +211,29 @@ return AbstractRenderer.extend({
* @override
*/
on_attach_callback: function () {
this._super(...arguments);
this._isInDOM = true;
if (config.device.isMobile) {
this.$el.height($(window).height() - this.$el.offset().top);
}
var scrollTop = this.$calendar.find('.fc-scroller').scrollTop();
if (scrollTop) {
this.$calendar.fullCalendar('reinitView');
} else {
this.$calendar.fullCalendar('render');
}
// BUG Test ????
// this.$el.height($(window).height() - this.$el.offset().top);
this.calendar.render();
this._renderCalendar();
},
/**
* Called when the field is detached from the DOM.
*/
on_detach_callback: function () {
this._super(...arguments);
this._isInDOM = false;
},
/**
* @override
*/
destroy: function () {
if (this.$calendar) {
this.$calendar.fullCalendar('destroy');
if (this.calendar) {
this.calendar.destroy();
}
if (this.$small_calendar) {
this.$small_calendar.datepicker('destroy');
@@ -296,9 +305,9 @@ return AbstractRenderer.extend({
* @override
*/
getLocalState: function () {
var $fcScroller = this.$calendar.find('.fc-scroller');
var fcScroller = this.calendarElement.querySelector('.fc-scroller');
return {
scrollPosition: $fcScroller.scrollTop(),
scrollPosition: fcScroller.scrollTop,
};
},
/**
@@ -306,8 +315,8 @@ return AbstractRenderer.extend({
*/
setLocalState: function (localState) {
if (localState.scrollPosition) {
var $fcScroller = this.$calendar.find('.fc-scroller');
$fcScroller.scrollTop(localState.scrollPosition);
var fcScroller = this.calendarElement.querySelector('.fc-scroller');
fcScroller.scrollTop = localState.scrollPosition;
}
},
@@ -325,14 +334,15 @@ return AbstractRenderer.extend({
var self = this;
var touchStartX;
var touchEndX;
this.$calendar.on('touchstart', function (event) {
touchStartX = event.originalEvent.touches[0].pageX;
this.calendarElement.addEventListener('touchstart', function (event) {
self.isSwipeEnabled = true;
touchStartX = event.touches[0].pageX;
});
this.$calendar.on('touchend', function (event) {
touchEndX = event.originalEvent.changedTouches[0].pageX;
this.calendarElement.addEventListener('touchend', function (event) {
if (!self.isSwipeEnabled) {
return;
}
touchEndX = event.changedTouches[0].pageX;
if (touchStartX - touchEndX > 100) {
self.trigger_up('next');
} else if (touchStartX - touchEndX < -100) {
@@ -340,6 +350,35 @@ return AbstractRenderer.extend({
}
});
},
/**
* Convert the new format of Event from FullCalendar V4 to a Event FullCalendar V3
* @param fc4Event
* @return {Object} FullCalendar V3 Object Event
* @private
*/
_convertEventToFC3Event: function (fc4Event) {
var event = fc4Event;
if (!moment.isMoment(fc4Event.start)) {
event = {
id: fc4Event.id,
title: fc4Event.title,
start: moment(fc4Event.start).utcOffset(0, true),
end: fc4Event.end && moment(fc4Event.end).utcOffset(0, true),
allDay: fc4Event.allDay,
color: fc4Event.color,
};
if (fc4Event.extendedProps) {
event = Object.assign({}, event, {
r_start: fc4Event.extendedProps.r_start && moment(fc4Event.extendedProps.r_start).utcOffset(0, true),
r_end: fc4Event.extendedProps.r_end && moment(fc4Event.extendedProps.r_end).utcOffset(0, true),
reset_allday: fc4Event.extendedProps.reset_allday,
record: fc4Event.extendedProps.record,
attendees: fc4Event.extendedProps.attendees,
});
}
}
return event;
},
/**
* @param {any} event
* @returns {string} the html for the rendered event
@@ -347,8 +386,8 @@ return AbstractRenderer.extend({
_eventRender: function (event) {
var qweb_context = {
event: event,
record: event.record,
color: this.getColor(event.color_index),
record: event.extendedProps.record,
color: this.getColor(event.extendedProps.color_index),
};
this.qweb_context = qweb_context;
if (_.isEmpty(qweb_context.record)) {
@@ -379,43 +418,50 @@ return AbstractRenderer.extend({
_initCalendar: function () {
var self = this;
this.$calendar = this.$(".o_calendar_widget");
// This seems like a workaround but apparently passing the locale
// in the options is not enough. We should initialize it beforehand
this.calendarElement = this.$(".o_calendar_widget")[0];
var locale = moment.locale();
$.fullCalendar.locale(locale);
//Documentation here : http://arshaw.com/fullcalendar/docs/
var fc_options = $.extend({}, this.state.fc_options, {
eventDrop: function (event) {
plugins: [
'moment',
'interaction',
'dayGrid',
'timeGrid'
],
eventDrop: function (eventDropInfo) {
var event = self._convertEventToFC3Event(eventDropInfo.event);
self.trigger_up('dropRecord', event);
},
eventResize: function (event) {
eventResize: function (eventResizeInfo) {
self.isSwipeEnabled = false;
self._unselectEvent();
var event = self._convertEventToFC3Event(eventResizeInfo.event);
self.trigger_up('updateRecord', event);
},
eventClick: function (eventData, ev) {
eventClick: function (eventClickInfo) {
var eventData = eventClickInfo.event;
self._unselectEvent();
self.$calendar.find(_.str.sprintf('[data-event-id=%s]', eventData.id)).addClass('o_cw_custom_highlight');
self._renderEventPopover(eventData, $(ev.currentTarget));
$(self.calendarElement).find(_.str.sprintf('[data-event-id=%s]', eventData.id)).addClass('o_cw_custom_highlight');
self._renderEventPopover(eventData, $(eventClickInfo.el));
},
select: function (startDate, endDate) {
self.isSwipeEnabled = false;
select: function (selectionInfo) {
// Clicking on the view, dispose any visible popover. Otherwise create a new event.
if (self.$('.o_cw_popover').length) {
self._unselectEvent();
} else {
var data = {start: startDate, end: endDate};
var data = {start: selectionInfo.start, end: selectionInfo.end};
if (self.state.context.default_name) {
data.title = self.state.context.default_name;
}
self.trigger_up('openCreate', data);
self.trigger_up('openCreate', self._convertEventToFC3Event(data));
}
self.$calendar.fullCalendar('unselect');
self.calendar.unselect();
},
eventRender: function (event, element, view) {
eventRender: function (info) {
self.isSwipeEnabled = false;
var event = info.event;
var element = $(info.el);
var view = info.view;
var $render = $(self._eventRender(event));
element.find('.fc-content').html($render.html());
element.addClass($render.attr('class'));
@@ -426,17 +472,17 @@ return AbstractRenderer.extend({
element.find('.fc-content').after($('<div/>', {class: 'fc-bg'}));
}
if (view.name === 'month' && event.record) {
var start = event.r_start || event.start;
var end = event.r_end || event.end;
if (view.type === 'dayGridMonth' && event.extendedProps.record) {
var start = event.extendedProps.r_start || event.start;
var end = event.extendedProps.r_end || event.end;
// Detect if the event occurs in just one day
// note: add & remove 1 min to avoid issues with 00:00
var isSameDayEvent = start.clone().add(1, 'minute').isSame(end.clone().subtract(1, 'minute'), 'day');
if (!event.record.allday && isSameDayEvent) {
var isSameDayEvent = moment(start).clone().add(1, 'minute').isSame(moment(end).clone().subtract(1, 'minute'), 'day');
if (!event.extendedProps.record.allday && isSameDayEvent) {
// For month view: do not show background for non allday, single day events
element.addClass('o_cw_nobg');
if (event.showTime && !self.hideTime) {
const displayTime = start.format(self._getDbTimeFormat());
if (event.extendedProps.showTime && !self.hideTime) {
const displayTime = moment(start).clone().format(self._getDbTimeFormat());
element.find('.fc-content .fc-time').text(displayTime);
}
}
@@ -447,32 +493,36 @@ return AbstractRenderer.extend({
self.trigger_up('edit_event', {id: event.id});
});
},
eventAfterAllRender: function () {
self.isSwipeEnabled = true;
eventPositioned: function (){
self.isSwipeEnabled = false;
},
viewRender: function (view) {
// compute mode from view.name which is either 'month', 'agendaWeek' or 'agendaDay'
var mode = view.name === 'month' ? 'month' : (view.name === 'agendaWeek' ? 'week' : 'day');
datesRender: function (info) {
// compute mode from view.type which is either 'dayGridMonth', 'timeGridWeek' or 'timeGridDay'
var mode = info.view.type === 'dayGridMonth' ? 'month' : (info.view.type === 'timeGridWeek' ? 'week' : 'day');
self.trigger_up('viewUpdated', {
mode: mode,
title: view.title,
title: info.view.title,
});
},
// Add/Remove a class on hover to style multiple days events.
// The css ":hover" selector can't be used because these events
// are rendered using multiple elements.
eventMouseover: function (eventData) {
self.$calendar.find(_.str.sprintf('[data-event-id=%s]', eventData.id)).addClass('o_cw_custom_hover');
eventMouseEnter: function (mouseEnterInfo) {
$(self.calendarElement).find(_.str.sprintf('[data-event-id=%s]', mouseEnterInfo.event.id)).addClass('o_cw_custom_hover');
},
eventMouseout: function (eventData) {
self.$calendar.find(_.str.sprintf('[data-event-id=%s]', eventData.id)).removeClass('o_cw_custom_hover');
eventMouseLeave: function (mouseLeaveInfo) {
if (!mouseLeaveInfo.event.id) {
return;
}
$(self.calendarElement).find(_.str.sprintf('[data-event-id=%s]', mouseLeaveInfo.event.id)).removeClass('o_cw_custom_hover');
},
eventDragStart: function (eventData) {
self.$calendar.find(_.str.sprintf('[data-event-id=%s]', eventData.id)).addClass('o_cw_custom_hover');
eventDragStart: function (mouseDragInfo) {
$(self.calendarElement).find(_.str.sprintf('[data-event-id=%s]', mouseDragInfo.event.id)).addClass('o_cw_custom_hover');
self._unselectEvent();
},
eventResizeStart: function (eventData) {
self.$calendar.find(_.str.sprintf('[data-event-id=%s]', eventData.id)).addClass('o_cw_custom_hover');
eventResizeStart: function (mouseResizeInfo) {
self.isSwipeEnabled = false;
$(self.calendarElement).find(_.str.sprintf('[data-event-id=%s]', mouseResizeInfo.event.id)).addClass('o_cw_custom_hover');
self._unselectEvent();
},
eventLimitClick: function () {
@@ -483,23 +533,23 @@ return AbstractRenderer.extend({
self._render();
},
views: {
day: {
columnFormat: 'LL'
timeGridDay: {
columnHeaderFormat: 'LL'
},
week: {
columnFormat: 'ddd D'
timeGridWeek: {
columnHeaderFormat: 'ddd D'
},
month: {
columnFormat: config.device.isMobile ? 'ddd' : 'dddd'
dayGridMonth: {
columnHeaderFormat: config.device.isMobile ? 'ddd' : 'dddd'
}
},
height: 'parent',
unselectAuto: false,
isRTL: _t.database.parameters.direction === "rtl",
locale: locale, // reset locale when fullcalendar has already been instanciated before now
dir: _t.database.parameters.direction,
locale: locale,
});
this.$calendar.fullCalendar(fc_options);
this.calendar = new FullCalendar.Calendar(this.calendarElement, fcOptions);
},
/**
* Initialize the mini calendar in the sidebar
@@ -551,22 +601,10 @@ return AbstractRenderer.extend({
* @returns {Promise}
*/
_render: function () {
var $calendar = this.$calendar;
var $fc_view = $calendar.find('.fc-view');
var scrollPosition = $fc_view.scrollLeft();
$fc_view.scrollLeft(0);
$calendar.fullCalendar('unselect');
if (scales[this.state.scale] !== $calendar.data('fullCalendar').getView().type) {
$calendar.fullCalendar('changeView', scales[this.state.scale]);
this.$('.o_calendar_view')[0].prepend(this.calendarElement);
if (this._isInDOM) {
this._renderCalendar();
}
if (this.target_date !== this.state.target_date.toString()) {
$calendar.fullCalendar('gotoDate', moment(this.state.target_date));
this.target_date = this.state.target_date.toString();
}
this.$small_calendar.datepicker("setDate", this.state.highlight_date.toDate())
.find('.o_selected_range')
.removeClass('o_color o_selected_range');
@@ -581,23 +619,41 @@ return AbstractRenderer.extend({
$a.not('.ui-state-active').addClass('o_color');
});
$fc_view.scrollLeft(scrollPosition);
this._unselectEvent();
var filterProm = this._renderFilters();
this._renderEvents();
this.$calendar.prependTo(this.$('.o_calendar_view'));
return Promise.all([filterProm, this._super.apply(this, arguments)]);
},
/**
* Render the specific code for the FullCalendar when it's in the DOM
*
* @private
*/
_renderCalendar() {
this.calendar.unselect();
if (scales[this.state.scale] !== this.calendar.view.type) {
this.calendar.changeView(scales[this.state.scale]);
}
if (this.target_date !== this.state.target_date.toString()) {
this.calendar.gotoDate(moment(this.state.target_date).toDate());
this.target_date = this.state.target_date.toString();
}
this._unselectEvent();
this._renderEvents();
// this._scrollToScrollTime();
},
/**
* Render all events
*
* @private
*/
_renderEvents: function () {
this.$calendar.fullCalendar('removeEvents');
this.$calendar.fullCalendar('addEventSource', this.state.data);
this.calendar.getEvents().forEach(function(event) {
event.remove();
});
this.calendar.addEventSource(this.state.data);
},
/**
* Render all filters
@@ -612,7 +668,7 @@ return AbstractRenderer.extend({
filter.destroy();
});
if (this.state.fullWidth) {
return;
return Promise.resolve();
}
return this._renderFiltersOneByOne();
},
@@ -699,12 +755,12 @@ return AbstractRenderer.extend({
canDelete: this.canDelete,
};
var start = moment(eventData.r_start || eventData.start);
var end = moment(eventData.r_end || eventData.end);
var start = moment((eventData.extendedProps && eventData.extendedProps.r_start) || eventData.start);
var end = moment((eventData.extendedProps && eventData.extendedProps.r_end) || eventData.end);
var isSameDayEvent = start.clone().add(1, 'minute').isSame(end.clone().subtract(1, 'minute'), 'day');
// Do not display timing if the event occur across multiple days. Otherwise use user's timing preferences
if (!this.hideTime && !eventData.record.allday && isSameDayEvent) {
if (!this.hideTime && !eventData.extendedProps.record.allday && isSameDayEvent) {
var dbTimeFormat = this._getDbTimeFormat();
context.eventTime.time = start.clone().format(dbTimeFormat) + ' - ' + end.clone().format(dbTimeFormat);
@@ -729,9 +785,9 @@ return AbstractRenderer.extend({
context.eventDate.date = isSameDayEvent ? start.clone().format('dddd, LL') : start.clone().format('LL') + ' - ' + end.clone().format('LL');
}
if (eventData.record.allday && isSameDayEvent) {
if (eventData.extendedProps.record.allday && isSameDayEvent) {
context.eventDate.duration = _t("All day");
} else if (eventData.record.allday && !isSameDayEvent) {
} else if (eventData.extendedProps.record.allday && !isSameDayEvent) {
var daysLocaleData = moment.localeData();
var days = moment.duration(end.diff(start)).days();
context.eventDate.duration = daysLocaleData.relativeTime(days, true, 'dd');
@@ -756,8 +812,8 @@ return AbstractRenderer.extend({
},
trigger: 'manual',
html: true,
title: eventData.record.display_name,
template: qweb.render('CalendarView.event.popover.placeholder', {color: this.getColor(eventData.color_index)}),
title: eventData.extendedProps.record.display_name,
template: qweb.render('CalendarView.event.popover.placeholder', {color: this.getColor(eventData.extendedProps.color_index)}),
container: eventData.allDay ? '.fc-view' : '.fc-scroller',
}
},
@@ -781,6 +837,14 @@ return AbstractRenderer.extend({
}).popover('show');
});
},
/**
* Scroll to the time set in the FullCalendar parameter
* @private
*/
_scrollToScrollTime: function () {
var scrollTime = this.calendar.getOption('scrollTime');
this.calendar.scrollToTime(scrollTime);
},
//--------------------------------------------------------------------------
// Handlers
@@ -812,7 +876,7 @@ return AbstractRenderer.extend({
*/
_onDeleteEvent: function (event) {
this._unselectEvent();
this.trigger_up('deleteRecord', {id: event.data.id});
this.trigger_up('deleteRecord', {id: parseInt(event.data.id, 10)});
},
});
@@ -22,8 +22,20 @@ var fieldsToGather = [
var CalendarView = AbstractView.extend({
display_name: _lt('Calendar'),
icon: 'fa-calendar',
jsLibs: ['/web/static/lib/fullcalendar/js/fullcalendar.js'],
cssLibs: ['/web/static/lib/fullcalendar/css/fullcalendar.css'],
jsLibs: [
'/web/static/lib/fullcalendar/core/main.js',
'/web/static/lib/fullcalendar/interaction/main.js',
'/web/static/lib/fullcalendar/moment/main.js',
'/web/static/lib/fullcalendar/daygrid/main.js',
'/web/static/lib/fullcalendar/timegrid/main.js',
'/web/static/lib/fullcalendar/list/main.js'
],
cssLibs: [
'/web/static/lib/fullcalendar/core/main.css',
'/web/static/lib/fullcalendar/daygrid/main.css',
'/web/static/lib/fullcalendar/timegrid/main.css',
'/web/static/lib/fullcalendar/list/main.css'
],
config: _.extend({}, AbstractView.prototype.config, {
Model: CalendarModel,
Controller: CalendarController,
+10 -10
View File
@@ -90,7 +90,7 @@ $o-cw-filter-avatar-size: 20px;
background: gray('400');
}
.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton {
.fc-timeGrid-view .fc-day-grid .fc-row .fc-content-skeleton {
padding: .5em;
}
@@ -107,7 +107,7 @@ $o-cw-filter-avatar-size: 20px;
// ====================================
// ====== Both Day and Week agenda
.fc-agendaDay-view, .fc-agendaWeek-view {
.fc-timeGridDay-view, .fc-timeGridWeek-view {
.fc-axis {
padding-left: $o-horizontal-padding;
}
@@ -167,7 +167,7 @@ $o-cw-filter-avatar-size: 20px;
box-shadow: inset 0 1px 0 gray('400');
}
.fc-day.fc-widget-content.fc-today.fc-state-highlight {
.fc-day.fc-widget-content.fc-today {
border-left-color: rgba($o-cw-color-today, 0.3);
border-right-color: rgba($o-cw-color-today, 0.3);
background: rgba($o-cw-color-today, 0.05 );
@@ -177,7 +177,7 @@ $o-cw-filter-avatar-size: 20px;
// Prevent events with similar color to visually overlap each other
box-shadow: 0 0 0 1px white;
&.fc-v-event {
&.fc-event:not(.fc-h-event) {
border-width: 3px 0 0;
&.fc-not-start {
@@ -197,7 +197,7 @@ $o-cw-filter-avatar-size: 20px;
}
// ====== Day only
.fc-agendaDay-view .fc-event {
.fc-timeGridDay-view .fc-event {
padding: 10px;
font-size: 14px;
@@ -208,13 +208,13 @@ $o-cw-filter-avatar-size: 20px;
}
// ====== Week only
.fc-agendaWeek-view {
.fc-timeGridWeek-view {
.fc-now-indicator {
left: $o-horizontal-padding;
}
// Expand tiny events on hover/select
.fc-v-event.o_cw_custom_highlight, .fc-v-event.o_cw_custom_hover {
.fc-event:not(.fc-h-event).o_cw_custom_highlight, .fc-event:not(.fc-h-event).o_cw_custom_hover {
transition: margin .1s .3s, left .1s .3s, right .1s .3s;
margin: 0!important;
right: 1px!important;
@@ -223,7 +223,7 @@ $o-cw-filter-avatar-size: 20px;
}
// ====== Month only
.fc-month-view {
.fc-dayGridMonth-view {
padding-left: $o-horizontal-padding;
.fc-widget-header {
@@ -319,11 +319,11 @@ $o-cw-filter-avatar-size: 20px;
}
// ====== RTL layout(s)
&.fc-rtl {
.fc-agendaWeek-view .fc-event {
.fc-timeGrid-view .fc-event {
border-width: 0 3px 0 0;
}
.fc-month-view .fc-event {
.fc-dayGridMonth-view .fc-event {
border-width: 0 3px 0 0;
&.fc-not-start {
@@ -106,7 +106,12 @@ odoo.define('web.test_utils_create', function (require) {
return calendar;
}
const viewElements = [...document.getElementById('qunit-fixture').children];
// prepend reset the scrollTop to zero so we restore it manually
let fcScroller = document.querySelector('.fc-scroller');
const scrollPosition = fcScroller.scrollTop;
viewElements.forEach(el => document.body.prepend(el));
fcScroller = document.querySelector('.fc-scroller');
fcScroller.scrollTop = scrollPosition;
const destroy = calendar.destroy;
calendar.destroy = () => {
+14 -14
View File
@@ -351,7 +351,7 @@ QUnit.module('Views', {
},
});
assert.ok(calendar.$('.fc-month-view').length, "should display in month mode");
assert.ok(calendar.$('.fc-dayGridMonth-view').length, "should display in month mode");
// click on an existing event to open the formViewDialog
@@ -654,7 +654,7 @@ QUnit.module('Views', {
assert.strictEqual($newevent.find('.o_event_title').text(), "new event",
"should display the new event with title");
assert.deepEqual($newevent.data('fcSeg').event.record,
assert.deepEqual($newevent[0].fcSeg.eventRange.def.extendedProps.record,
{
display_name: "new event",
start: fieldUtils.parse.datetime("2016-12-13 06:00:00", this.data.event.fields.start, {isUTC: true}),
@@ -972,7 +972,7 @@ QUnit.module('Views', {
assert.strictEqual($newevent.find('.o_event_title').text(), "new event",
"should display the new event with title");
assert.deepEqual($newevent.data('fcSeg').event.record,
assert.deepEqual($newevent[0].fcSeg.eventRange.def.extendedProps.record,
{
display_name: "new event",
start: fieldUtils.parse.datetime("2016-12-13 06:00:00", this.data.event.fields.start, {isUTC: true}),
@@ -1083,7 +1083,7 @@ QUnit.module('Views', {
assert.strictEqual($newevent.find('.o_event_title').text(), "new event",
"should display the new event with title");
assert.deepEqual($newevent.data('fcSeg').event.record,
assert.deepEqual($newevent[0].fcSeg.eventRange.def.extendedProps.record,
{
display_name: "new event",
start: fieldUtils.parse.datetime("2016-12-13 06:00:00", this.data.event.fields.start, {isUTC: true}),
@@ -1256,7 +1256,7 @@ QUnit.module('Views', {
assert.strictEqual($newevent.find('.o_event_title').text(), "new event",
"should display the new event with title");
assert.deepEqual($newevent.data('fcSeg').event.record,
assert.deepEqual($newevent[0].fcSeg.eventRange.def.extendedProps.record,
{
display_name: "new event",
start: fieldUtils.parse.datetime("2016-12-13 06:00:00", this.data.event.fields.start, {isUTC: true}),
@@ -1373,7 +1373,7 @@ QUnit.module('Views', {
assert.hasAttrValue($newevent.parent(), 'colspan', "2",
"should appear over two days.");
assert.deepEqual($newevent.data('fcSeg').event.record,
assert.deepEqual($newevent[0].fcSeg.eventRange.def.extendedProps.record,
{
display_name: "new event",
start: fieldUtils.parse.datetime("2016-12-14 00:00:00", this.data.event.fields.start, {isUTC: true}),
@@ -1552,7 +1552,7 @@ QUnit.module('Views', {
assert.hasAttrValue($newevent.parent(), 'colspan', "2",
"should appear over two days.");
assert.deepEqual($newevent.data('fcSeg').event.record, {
assert.deepEqual($newevent[0].fcSeg.eventRange.def.extendedProps.record, {
display_name: "new event",
start: fieldUtils.parse.datetime("2016-12-14 05:00:00", this.data.event.fields.start, {isUTC: true}),
stop: fieldUtils.parse.datetime("2016-12-15 17:00:00", this.data.event.fields.stop, {isUTC: true}),
@@ -1588,25 +1588,25 @@ QUnit.module('Views', {
},
});
assert.containsOnce(calendar, '.fc-agendaWeek-view', "should be in week mode");
assert.containsOnce(calendar, '.fc-timeGridWeek-view', "should be in week mode");
assert.containsN(calendar, '.fc-event', 9, "should display 9 events on the week (4 event + 5 days event)");
await testUtils.dom.click(calendar.$('.o_calendar_mini a:contains(19)'));
// Clicking on a day in another week should switch to the other week view
assert.containsOnce(calendar, '.fc-agendaWeek-view', "should be in week mode");
assert.containsOnce(calendar, '.fc-timeGridWeek-view', "should be in week mode");
assert.containsN(calendar, '.fc-event', 4, "should display 4 events on the week (1 event + 3 days event)");
// Clicking on a day in the same week should switch to that particular day view
await testUtils.dom.click(calendar.$('.o_calendar_mini a:contains(18)'));
assert.containsOnce(calendar, '.fc-agendaDay-view', "should be in day mode");
assert.containsOnce(calendar, '.fc-timeGridDay-view', "should be in day mode");
assert.containsN(calendar, '.fc-event', 2, "should display 2 events on the day");
// Clicking on the same day should toggle between day, month and week views
await testUtils.dom.click(calendar.$('.o_calendar_mini a:contains(18)'));
assert.containsOnce(calendar, '.fc-month-view', "should be in month mode");
assert.containsOnce(calendar, '.fc-dayGridMonth-view', "should be in month mode");
assert.containsN(calendar, '.fc-event', 7, "should display 7 events on the month (event 5 is on multiple weeks and generates to .fc-event)");
await testUtils.dom.click(calendar.$('.o_calendar_mini a:contains(18)'));
assert.containsOnce(calendar, '.fc-agendaWeek-view', "should be in week mode");
assert.containsOnce(calendar, '.fc-timeGridWeek-view', "should be in week mode");
assert.containsN(calendar, '.fc-event', 4, "should display 4 events on the week (1 event + 3 days event)");
await testUtils.dom.click(calendar.$('.o_calendar_mini a:contains(18)'));
assert.containsOnce(calendar, '.fc-agendaDay-view', "should be in day mode");
assert.containsOnce(calendar, '.fc-timeGridDay-view', "should be in day mode");
assert.containsN(calendar, '.fc-event', 2, "should display 2 events on the day");
calendar.destroy();
@@ -2459,7 +2459,7 @@ QUnit.module('Views', {
});
assert.containsOnce(calendar, '.fc-day-grid .fc-event-container',
"should be one event in the all day row");
assert.strictEqual(calendar.model.data.data[0].r_start.date(), 14,
assert.strictEqual(moment(calendar.model.data.data[0].r_start).date(), 14,
"the date should be 14");
calendar.destroy();
});
+11 -2
View File
@@ -607,8 +607,17 @@
<script type="text/javascript" src="/web/static/tests/helpers/qunit_asserts.js"></script>
<!-- add lazy-loaded libs to make tests synchronous -->
<link rel="stylesheet" href="/web/static/lib/fullcalendar/css/fullcalendar.css"/>
<script type="text/javascript" src="/web/static/lib/fullcalendar/js/fullcalendar.js"></script>
<link rel="stylesheet" href="/web/static/lib/fullcalendar/core/main.css"/>
<link rel="stylesheet" href="/web/static/lib/fullcalendar/daygrid/main.css"/>
<link rel="stylesheet" href="/web/static/lib/fullcalendar/timegrid/main.css"/>
<link rel="stylesheet" href="/web/static/lib/fullcalendar/list/main.css"/>
<script type="text/javascript" src="/web/static/lib/fullcalendar/core/main.js"></script>
<script type="text/javascript" src="/web/static/lib/fullcalendar/moment/main.js"></script>
<script type="text/javascript" src="/web/static/lib/fullcalendar/interaction/main.js"></script>
<script type="text/javascript" src="/web/static/lib/fullcalendar/daygrid/main.js"></script>
<script type="text/javascript" src="/web/static/lib/fullcalendar/timegrid/main.js"></script>
<script type="text/javascript" src="/web/static/lib/fullcalendar/list/main.js"></script>
<script type="text/javascript" src="/web/static/lib/ace/ace.js"></script>
<script type="text/javascript" src="/web/static/lib/ace/javascript_highlight_rules.js"></script>
<script type="text/javascript" src="/web/static/lib/ace/mode-python.js"></script>